Telefonliste mit Bubble-Sort ordnen
-
Hi! An folgender Aufgabe habe ich mich versucht:
Schreiben Sie ein Programm zur Verwaltung einer Telefonliste. Dabei soll ein Eintrag in der Telefonliste (also ein Datensatz) aus Vorname, Nachname und Telefonnummer (jeweils als String dargestellt) bestehen. Das Programm soll bis zu 5 Telefonlisteneinträge einlesen, diese mittels des Bubble-Sort-Algorithmus sortieren und die sortierte Liste anschließend ausgeben. Sortiert werden soll nach dem Nachnamen und anschließend nach dem Vornamen, d.h. bei gleichem Nachnamen entscheidet der Vorname über die Sortierreihenfolge. Beachten Sie, dass „theiss“ lexikalisch aufsteigend sortiert nach „theis“ folgt.
Nun habe ich ein Programm geschrieben. Allerdings habe ich immer noch Probleme mit Zeigern und Funktionen und weiß nicht mehr so richtig weiter. An die Bubble-Sort-Funktion werden auch noch gar keine Parameter übertragen.
Weiß hier jemand weiter?
#define EINTRAEGE 5 /*5 Einträge sollen eingelesen werden */ struct list{ /* Definiere einen struct mit Einträgen*/ char[30] firstname; char[30] secname; char[30] number; }l1,l2,l3,l4,l5; void main(){ int i; for(i=0; i<=EINTRAEGE;i++){ /*Erstelle Ausgaben und lese Daten ein*/ printf("Bitte geben Sie den Vornamen ein: \n"); scanf("%c",&l[i].firstname); printf("Bitte geben Sie den Nachnamen ein: \n"); scanf("%c", &l[i].secname); printf("Bitte Geben Sie die Telefonnumer ein: \n"); scanf("%c", &l[i].number); bubble_sort; /*Wende Bubble-Sort an*/ } } void bubble_sort(char p[],int l, int r){ /*Bubble-Sort der Telefoneinträge*/ char m,j; for(m = l; m < r; m++){ for(j = r;j > m;j--){ if(p[j-1] > p[j]) exchange(p[j-1],A[j]); } return m,j; } char exchange(char *k, char *j){ /*Tauschfunktion*/ char temp; temp = *k; *k = *j; *j = temp; return k,j }
-
Wenn du Variablen hast, die fortlaufend durchnummeriert sind, ist das ein ZEichen dafür ,das du ein Array nehmen solltest.
Ja, es geht auch Arrays von structs.Wenn du structs sortieren willst, solltest du auch (Zeiger auf) structs an deine Funktionen übergeben und nicht irgendetwas mit char.
Bei scanf ist %c zum einlesen von einem einzelnen char da.
Du möchtest aber eine Zeichenfplge einlesen, die dann auch noch nulltermniert wird (einen String) dafür ist ein anderer Formatspecifier da.
Und guck mal, da benutzt du ja das Array von der struct (das du aber gar nicht definiert hast).if(p[j-1] > p[j]) exchange(p[j-1],A[j]);
p[j-1] und p[j] sind Elemente von dem Array. exchange erwartet aber Zeiger auf solche Elemente.
-
Als kleine Starthilfe:
#include <stdio.h> #define NOF_ENTRIES 2 #define NAME_LEN 30 struct TelephoneList { char firstname[NAME_LEN]; char lastname[NAME_LEN]; }; void bubble_sort(struct TelephoneList list[], int len) { /* Hier bubble sort implementieren. */ } int main() { int i; struct TelephoneList list[NOF_ENTRIES]; for ( i = 0; i < NOF_ENTRIES; ++i ) { printf("Bitte geben Sie den Vornamen ein: "); scanf("%s", list[i].firstname); printf("Bitte geben Sie den Nachnamen ein: "); scanf("%s", list[i].lastname); } bubble_sort(list, NOF_ENTRIES); return 0; }
-
#include <stdio.h> #include <stdlib.h> #define EINTRAEGE 5 /*5 Einträge sollen eingelesen werden */ struct phonebook{ /* Definiere einen struct mit Einträgen*/ char firstname[30] ; char secname[30] ; char number[30] ; }list; int main(){ list A[5]; /* Liste A mit 5 Einträgen*/ input(A); output(A); printf("Nach Anwendung des Bubble-Sort: \n"); bubble_sort(A,0,4); output(A); getchar(); return 0; } void input(list *B){ int i; for(i=0; i<=EINTRAEGE;i++){ /*Lese Daten ein*/ scanf("%s", B[i].firstname); scanf("%s", B[i].secname); scanf("%s", B[i].number); /*Wende Bubble-Sort an*/ } } void output(list *C) { /*Ausgabe*/ int i; for (i=0; i<5; i++) { printf("%s\t%s\t\t%s\n", B[i].firstname, B[i].secname, B[i].number); } } int compare(char* links, char* rechts) { /*Vergleiche Strings miteinander*/ while (*links!= '\0') { /*Solange String nicht zuende*/ if (*rechts == '\0') /*Gebe 1 zurück, falls rechts vorher 0*/ return 1 if (*links < *rechts) /*Gebe -1 zurück, falls links kleiner als rechts*/ return -1; if (*links > *rechts) /*Gebe 1 zurück, falls links größer als rechts 0*/ return 1; links++; rechts++; } if (*rechts != '\0') /*Gebe -1 zurück, falls rechts nicht 0*/ return -1; return 0; } void bubblesort(list D[], int l, int r) { /* Bubble-Sort aus Skript abgeschrieben und Vergleichsfunktion eingesetzt*/ int i, j; for (i=l; i<r; i++) { for (j=r; j>i; j--) { if (compare(D[j-1].secname, D[j].secname)==1) { exchange(&D[j-1], &D[j]); } if (compare(D[j-1].secname, D[j].secname)==0) { if (compare(D[j-1].firstname, D[j].firstname)==1) { exchange(&D[j-1], &D[j]); } } } } } char exchange(char *K, char *J){ /*Tauschfunktion*/ char temp; temp = *K; *K = *J; *J = temp; return K,J }
Läuft leider immer noch nicht.
-
Krachi schrieb:
Läuft leider immer noch nicht.
Gehst du auch zum Arzt "Herr Doktor, ich bin krank! Hilfe!"?
Wir sind keine Hellseher*. Siehe:
http://www.c-plusplus.net/forum/200753
http://www.c-plusplus.net/forum/136013
http://www.tty1.net/smart-questions_de.html*: Ok, in diesem Fall kann ich schon sehen, dass da eine ganze Menge falsch ist an dem Code, weil mir beispielsweise gleich die fehlerhafte Definition des structs in Zeile 8 ff. auffiel und die völlig falsche Behandlung der Zeichenketten. Das liegt da dran, dass ich so etwas auch in einem 100 Zeilen Code sofort schon beim Querlesen sehe und dazu nicht Hellsehen brauche. Und du brauchst nicht einmal mich, das meiste sagt doch schon dein Compiler. Beispielsweise Ausgabe von GCC:
est.c: In function ‘main’: test.c:16:5: warning: statement with no effect [-Wunused-value] list A[5]; /* Liste A mit 5 Einträgen*/ ^ test.c:16:10: error: expected ‘;’ before ‘A’ list A[5]; /* Liste A mit 5 Einträgen*/ ^ test.c:17:5: warning: implicit declaration of function ‘input’ [-Wimplicit-function-declaration] input(A); ^ test.c:17:11: error: ‘A’ undeclared (first use in this function) input(A); ^ test.c:17:11: note: each undeclared identifier is reported only once for each function it appears in input(A); ^ test.c:18:5: warning: implicit declaration of function ‘output’ [-Wimplicit-function-declaration] output(A); ^ test.c:20:5: warning: implicit declaration of function ‘bubble_sort’ [-Wimplicit-function-declaration] bubble_sort(A,0,4); ^ test.c: At top level: test.c:27:12: error: expected declaration specifiers or ‘...’ before ‘list’ void input(list *B){ ^ test.c:37:13: error: expected declaration specifiers or ‘...’ before ‘list’ void output(list *C) { /*Ausgabe*/ ^ test.c: In function ‘compare’: test.c:49:9: error: expected ‘;’ before ‘if’ if (*links < *rechts) /*Gebe -1 zurück, falls links kleiner als rechts*/ ^ test.c: At top level: test.c:62:17: error: expected declaration specifiers or ‘...’ before ‘list’ void bubblesort(list D[], int l, int r) { /* Bubble-Sort aus Skript abgeschrieben und Vergleichsfunktion eingesetzt*/ ^ test.c: In function ‘exchange’: test.c:84:13: warning: left-hand operand of comma expression has no effect [-Wunused-value] return K,J ^ test.c:84:5: warning: return makes integer from pointer without a cast [enabled by default] return K,J ^ test.c:85:1: error: expected ‘;’ before ‘}’ token } ^
Korrigiere ich die Definition des structs:
typedef struct { /* Definiere einen struct mit Einträgen*/ char firstname[30] ; char secname[30] ; char number[30] ; }list;
So kommen die anderen Fehler deutlicher zum Vorschein:
test.c: In function ‘main’: test.c:17:5: warning: implicit declaration of function ‘input’ [-Wimplicit-function-declaration] input(A); ^ test.c:18:5: warning: implicit declaration of function ‘output’ [-Wimplicit-function-declaration] output(A); ^ test.c:20:5: warning: implicit declaration of function ‘bubble_sort’ [-Wimplicit-function-declaration] bubble_sort(A,0,4); ^ test.c: At top level: test.c:27:6: warning: conflicting types for ‘input’ [enabled by default] void input(list *B){ ^ test.c:17:5: note: previous implicit declaration of ‘input’ was here input(A); ^ test.c:37:6: warning: conflicting types for ‘output’ [enabled by default] void output(list *C) { /*Ausgabe*/ ^ test.c:18:5: note: previous implicit declaration of ‘output’ was here output(A); ^ test.c: In function ‘output’: test.c:40:34: error: ‘B’ undeclared (first use in this function) printf("%s\t%s\t\t%s\n", B[i].firstname, B[i].secname, ^ test.c:40:34: note: each undeclared identifier is reported only once for each function it appears in printf("%s\t%s\t\t%s\n", B[i].firstname, B[i].secname, ^ test.c:37:19: warning: unused parameter ‘C’ [-Wunused-parameter] void output(list *C) { /*Ausgabe*/ ^ test.c: In function ‘compare’: test.c:49:9: error: expected ‘;’ before ‘if’ if (*links < *rechts) /*Gebe -1 zurück, falls links kleiner als rechts*/ ^ test.c: In function ‘bubblesort’: test.c:67:17: warning: implicit declaration of function ‘exchange’ [-Wimplicit-function-declaration] exchange(&D[j-1], &D[j]); ^ test.c: At top level: test.c:79:6: error: conflicting types for ‘exchange’ char exchange(char *K, char *J){ /*Tauschfunktion*/ ^ test.c:67:17: note: previous implicit declaration of ‘exchange’ was here exchange(&D[j-1], &D[j]); ^ test.c: In function ‘exchange’: test.c:84:13: warning: left-hand operand of comma expression has no effect [-Wunused-value] return K,J ^ test.c:84:5: warning: return makes integer from pointer without a cast [enabled by default] return K,J ^ test.c:85:1: error: expected ‘;’ before ‘}’ token } ^
Auch wenn "nur" warning dran steht, sind das sämtlich schwerwiegende Fehler, die du korrigieren musst, bevor du auch nur da dran denken kannst, die Funktion zu prüfen (es wird übrigens nicht funktionieren, so wie du die Zeichenketten tauschen möchtest. Was überdies noch vollkommen unnötig ist, denn du könntest ganz einfach die gesamten Einträge tauschen).
-
Du solltest schon komplette structs vertauschen und nicht einzelne Buchstaben (in den Elementen der struct).
Undstrcmp
ist eine Standardfunktion: http://www.cplusplus.com/reference/cstring/strcmp/Und überall wo 5 steht, kannst du die durch EINTRAEGE ersetzen.
Und bei input ist es auch nur < EINTRAEGEUnd mach mal die
main
ans Ende von deinem Programm (wenn du keine Prototypen benutzt)