Sortieren durch Einfügen Programm

  • geschlossen
  • C

  • kunks
  • 2387 Aufrufe 14 Antworten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Sortieren durch Einfügen Programm

    Hey Leute,

    habe ein problem mit obigen programm. Und zwar habe ich die Aufgabe bekommen so ein Programm zu schreiben..

    Hab den Algorithmus soweit fertig, müsste glaub ich auch so passen. Nur habe ich n problem mit meiner main().
    Bin mir auch nicht sicher ob man mit fgets() in ein Integer Array lesen kann?!
    Hab alternativ mal mit ner FOR Schleife versucht, die eingabe zu realiesieren....(das auskommentierte)
    Steh grad echt aufm Schlauch, und mit C eigentlich eh auf Kreigsfuss :flag: C

    C-Quellcode

    1. #include <stdio.h>
    2. #include <string.h>
    3. #include <stdlib.h>
    4. #define ITEMS 8000
    5. void sort(int numbers[], int size){
    6. int index, i, j;
    7. for (i=1; i<size; i++){
    8. index = numbers[i];
    9. j = i-1;
    10. while ( (index < numbers[j]) && (j >= 0)){
    11. numbers[j+1] = numbers[j];
    12. j--;
    13. }
    14. numbers[j+1] = index;
    15. }
    16. }
    17. main(){
    18. int i;
    19. int numbers[ITEMS]={0};
    20. /*for(i=0;i<ITEMS;i++){
    21. while(eingabe != " "){
    22. printf("\nPlease tip in a number: ");
    23. scanf("%d", numbers[i]);
    24. return i;
    25. }
    26. }*/
    27. printf("\nBitte Zahlenkette eingeben: ");
    28. fgets(numbers,ITEMS,stdin);
    29. printf("%d", &numbers[i]);
    30. //sort(int eingabe[n], int n);
    31. //printf("%i", &eingabe);
    32. }
    Alles anzeigen


    Fehlercode bei der Schleife ist Core dumped. Bei dem Versuch mit fgets kommen halt ganz andere Werte raus, wie die die ich eingetippt habe ;(
    Wär euch sehr dankbar, wenn ihr mir n Tip geben könntet ;)
    Weiß grad echt nicht wie ich über die tastatur eine beliebige Zeichenkette in mein Integer-Array bekomme :(

    MfG kunks
  • Moin moin.

    Sinnvoll wäre es, denn kompletten Code sowie die genaue Fehlermeldung zu posten. Macht das Helfen sicher leichter ;)

    Gruß,
    Commander Keen
    Ich habe das Wort "Europa" immer im Munde derjenigen Politiker
    gefunden, die von anderen Mächten etwas verlangten, was sie im
    eigenen Namen nicht zu fordern wagten. [SIZE="1"](Nov. 1876)[/SIZE]
    [SIZE="1"]Otto von Bismarck[/SIZE]
  • so, habs jetzt mal ohne eingabe gemacht und mit clock() funktion.

    Bei der clock() Funktion kommt aber immer die gemessene Zeit 0,00 raus. Hab ich da was falsch gemacht??

    Wie kann ich das Programm so verändern, dass ich die Zeichenkette nicht direkt in den Coder schreiben muss, sondern von der Tastatur einlesen lassen kann (fgets???)?

    Hier noch der aktuelle Code:

    C-Quellcode

    1. #include <stdio.h>
    2. #include <string.h>
    3. #include <time.h>
    4. #define ITEMS 8000
    5. void sort(int numbers[], int size){
    6. int index, i, j;
    7. for (i=1; i<size; i++){
    8. index = numbers[i];
    9. j = i-1;
    10. while ( (index < numbers[j]) && (j >= 0)){
    11. numbers[j+1] = numbers[j];
    12. j--;
    13. }
    14. numbers[j+1] = index;
    15. }
    16. }
    17. int main(){
    18. int i;
    19. int test_array[]={5,2,9,6,1,8,3,7,4,19,11,18,12,17,13,16,14,15};
    20. int N = sizeof(test_array)/sizeof(int);
    21. clock_t prgstart, prgende;
    22. prgstart=clock();
    23. sort(test_array, N-1);
    24. for(i=0; i<N ; i++){
    25. printf("%d", test_array[i]);
    26. }
    27. prgende=clock();
    28. printf("\n\nDie Programmlaufzeit betrug %.2f Sekunden\n",(float)(prgende-prgstart) / CLOCKS_PER_SEC);
    29. printf("\n");
    30. return 0;
    31. }
    Alles anzeigen


    MfG kunks
  • Es kann gut sein das 0,00 rauskommt, da du ja nicht 100000 Zahlen sortieren lässt oder? ^^
    Der Rechner macht ja so und so viele Rechenschritte pro Sekunde ;)
    Deine frage mit fgets() verseth ich nicht ganz O.o
    Und wo ist der Fehler? WElcher Fehler wird angezeigt und was für ein Compiler nutzt du?
    Judenverfolgung, Inquisitionen, Kreuzigungen,
    Hexenverbrennung, wir wissen wie man feiert
    - Ihre Kirche †
    Blacklist
  • Ich hab irgendwie nicht ganz verstanden was dein Programm machen soll...

    naja, wie auch immer... für die Eingabe von integer werten ist scanf() dein Freund... (du solltest davor noch fflush(stdin); aufrufen sonst kann es vorkommen das scanf die eingabe vom vorherigen schleifendurchlauf übernimmt)
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • genau, das Programm soll die Zeichenkette (Zahlen) sortieren, also in die richtige reihenfolge bringen.

    Also das Prog in meinem ersten Post spuckt fehler aus, das zweite läuft soweit ganz gut. Ich denke das erste kann eh vergessen werden, versuche jetzt lieber das zweite zu erweitern ;)

    Als Compiler benutz ich den GCC Compiler unter Ubuntu..

    gut dann setz ich mich später nochmal an das Programm und bau ne scanf funktion mit ein.

    Danke erstmal für eure antworten, wenn ich nochmal ne frage habe, melde ich mich nochmal..

    MfG kunks

    Edit:
    So hab nun schon wieder ein Problem. Habe nun ne scanf mit eingebaut, wenn ich nun aber zum Beispiel als Testgröße 9 eintippe und dann die Zahlen 987654321 dann passiert weiter nichts. Muss dann immer mit Strg C abbrechen. Habe ich schon wieder was falsch gemacht? Bin am verzweifeln..

    Hier der Code:

    C-Quellcode

    1. #include <stdio.h>
    2. #include <string.h>
    3. #include <time.h>
    4. void sort(int numbers[], int size){
    5. int index, i, j;
    6. for (i=1; i<size; i++){
    7. index = numbers[i];
    8. j = i-1;
    9. while ( (index < numbers[j]) && (j >= 0)){
    10. numbers[j+1] = numbers[j];
    11. j--;
    12. }
    13. numbers[j+1] = index;
    14. }
    15. }
    16. int main(){
    17. int i;
    18. int n = 0;
    19. int test_array[n];
    20. int N = sizeof(test_array)/sizeof(int);
    21. clock_t prgstart, prgende;
    22. printf("\nBitte geben Sie die Anzahl zu testender Zahlen ein: ");
    23. scanf("%i", &n);
    24. printf("\nBitte tippen Sie eine Zahlenkette mit %i Zahlen ein: ", n);
    25. for (i = 0; i < n; i++){
    26. scanf("%i", &test_array[i]);
    27. }
    28. prgstart=clock();
    29. sort(test_array, N-1);
    30. for(i=0; i<N ; i++){
    31. printf("%d", test_array[i]);
    32. }
    33. prgende=clock();
    34. printf("\n\nDie Programmlaufzeit betrug %.2f Sekunden\n",(float)(prgende-prgstart) / CLOCKS_PER_SEC);
    35. printf("\n");
    36. return 0;
    37. }
    Alles anzeigen


    Hier noch n screenshot
  • Hey leute. Bin fast am verzweifeln. Nun habe ich zum dritten mal neu angefangen und mich nochmal an das Programm gesetzt. Und war auch richtig glücklich, weil es endlich funktioniert ;)

    Aber...nun habe ich in meiner Aufgabenübersicht gelesen, dass ich die Zeit nach dem BestCase Prinzip (Array ist schon sortiert), dem WorstCase(Array is falsch herum sortiert) und dem zufallsprinzip (zufällig sortierrtes array) messen muss.
    Problem nun: Ich habe die rand() Funktion in C benutzt und einen Zufallszahlengenerator (, da die eingabe von 250000 Testwerten einfach zu umfangreich wäre :rolleyes:

    Blöderweise kann ich jetzt halt nur Zufallswerte und keine sortierten bzw. rückwarts sortierten Werte testen. Gibts da vllt. eine Funktion oder einen Generator etc. der mir ein bereits sortiertes bzw. rückwärts sortiertes array ausspuckt???

    Hier nochmals der nun dritte und hoffentlich letzte "Grund"Code.

    C-Quellcode

    1. #include <stdlib.h>
    2. #include <stdio.h>
    3. #include <time.h>
    4. #define NUM_ITEMS 150000
    5. void insertionSort(int numbers[], int array_size);
    6. int numbers[NUM_ITEMS];
    7. int main()
    8. {
    9. int i;
    10. clock_t prgstart, prgende;
    11. srand(getpid()); //srand = seed random number generator
    12. for (i = 0; i < NUM_ITEMS; i++) //array wird mit zufallswerten gefüllt
    13. numbers[i] = rand();
    14. prgstart=clock(); //Zeitmessung started
    15. insertionSort(numbers, NUM_ITEMS); //Algorithmus arbeitet
    16. prgende=clock(); //Zeitmessung stoppt
    17. printf("Sortiert!\n");
    18. for (i = 0; i < NUM_ITEMS; i++) //sortiertes array wird gedruckt
    19. printf("%i\n", numbers[i]);
    20. printf("\n\nDie Programmlaufzeit betrug %.2f Sekunden\n",(float)(prgende-prgstart) / CLOCKS_PER_SEC);
    21. printf("\n");
    22. }
    23. void insertionSort(int numbers[], int array_size) //sortieralgorithmus
    24. {
    25. int i, j, index;
    26. for (i=1; i < array_size; i++)
    27. {
    28. index = numbers[i];
    29. j = i;
    30. while ((j > 0) && (numbers[j-1] > index))
    31. {
    32. numbers[j] = numbers[j-1];
    33. j = j - 1;
    34. }
    35. numbers[j] = index;
    36. }
    37. }
    Alles anzeigen


    MfG kunks
  • Ich glaub echt ich bin blöd :(

    Bekomm nicht mal mehr ne vernünftige For Schleife hin, die aufsteigend sortierte Integer werte in ein Int-Array schreiben kann :depp:

    Bin jetzt mal soweit:

    Quellcode

    1. #include <stdio.h>
    2. #define NUM_ITEMS 1000
    3. main(){
    4. int numbers[NUM_ITEMS];
    5. int i;
    6. int j=2;
    7. for(i=0; i<NUM_ITEMS; i++){
    8. j++;
    9. numbers[i] = j;
    10. }
    11. printf("%i", numbers[i]);
    12. }
    Alles anzeigen


    Dieser Code führt aber nur dazu, dass dann 1000 im array steht :o

    Oh je, bin halt Programmiertechnisch wenig begabt ..

    Wie muss ich den denn verändern, dass die for schleife das macht was ich gern hätte ?
    MfG kunks
  • Quellcode

    1. #include <stdio.h>
    2. #define NUM_ITEMS 1000
    3. main(){
    4. int numbers[NUM_ITEMS];
    5. int i;
    6. for(i=0; i<NUM_ITEMS; i++)
    7. numbers[i] = i;
    8. }
    Alles anzeigen

    So speicherst du werte von 0-999 in dem array.

    kunks schrieb:

    Dieser Code führt aber nur dazu, dass dann 1000 im array steht :o

    Ja das war auch richtig... du gibst doch mit deinem code nur den wert mit dem index aus was in dem fall der Index 999 ist (weil i nach der for schleife den wert 999 hat). So wie du es gemacht hast initialisierst du dein array mit aufsteigenden werten...
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • Erstmal Danke zerd für deine Hilfe,

    hab jetzt alles soweit fertig bis auf das array, das sozusagen invers, also mit Werten von n,..,..,......,0.
    Konkretes Beispiel wäre zb. array[0]=10, array[1]=9, array[2]=8,....,array[10]=0.

    Ich wollte das so lösen:

    Quellcode

    1. for(i = 10; i >= 0; i --)
    2. array[i] = i;


    Wenn ich das aber so implmentiere, kommen bei der Ausgabe total falsche Werte raus, die so aussehen, als wäre nichts ins array geschrieben worden (z.B. -1507896, dann mal wieder ne 0 usw.)

    Muss ich das anders lösen?
    Habe eigentlich nicht vor mit einem tmp[] array zu arbeiten etc.
    Möchte das mit nur einem array lösen..

    MfG kunks
  • Der typische Fehler ;)

    wenn du ein array mit der Größe 10 definierst:

    Quellcode

    1. int zahlen[10];


    Darfst du auch nur 10 Zahlen darin speichern, was bedeutet vom index 0 bis index 9 (nicht 10)

    Also so:

    Quellcode

    1. for(int i = 9; i >=0; i--)
    2. zahl[i] = i;


    Das wäre allerdings wieder aufsteigend von 0 - 9

    wenn du von 9 - 0 haben willst brauchst du nen zweiten zähler:

    Quellcode

    1. for(int i=0, j=9; i < 10; i++, j--)
    2. zahlen[i] = j;


    Greetz Zerd

    P.S. der code da oben ist ungetestet, sollte aber gehen ;)
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]