Struct als Liste
-
hallö
wir ham jetz vor kurzen mit den structs (records eben) angefangen so halb hab ich das ja verstanden aber hab jetz ein prob.
Wir sollen ein Programm machen das eine Liste von Freunden einliest mit
Namen, Geburtsdatum im Struct 1 (Name: Daten)
CD-Anzahl, Lieblingsband, Playstation(j/n) im Struct 2 (Name: Eigenschaften)anschließend sollen wir nach CD-Anzahl sortieren
ich hab mal so ANGEFANGEN (also wundert euch nicht wegen der unfertigen schleife) aber irgendwie funkt das nicht, 100000 errors
struct Daten { char name; int gday; int gmonth; int gyear; }; struct Eigenschaften { int cdanz; char lieblingsb; char plays; }; Daten persd[99]; Eigenschaften perse[99]; clrscr(); do { printf("Freund %d:\n\nName:", i); fgets(persd.name[i]); printf("\nGeburstag: "); scanf("%d.%d.%d", &persd.gday[i], &persd[i].gmonth[i], &persd[i].gyear[i]); printf("CD-Anzahl: ); scanf("%d", &persd.[i]); printf("Lieblingsband i++; } while(i!=anz);
also wie mach ich das jetz das man in ein strukt mehr als nur eine person einlesen kann?????
-
Wenn du in C (nicht C++) Strukturvariablen erstellst, musst du das Schlüsselwort 'struct' explizit davorschreiben.
So auch bei Funktionsdeklarationen.struct Daten persd[99]; struct Eigenschaften perse[99];
PS:
Übrigens besteht der Name in der Struktur bei dir nur aus einem einzigen Buchstaben. Du willst sicher etwas wiechar name[20];
-
oh ok thanks vorerst
-
ok funkt jetz schonmal alles super mit dem einlesen jetz aber zum wirklichen problem: die gesamte liste nach der cd-anzahl sortieren.
wiwenn ich das mit qsort mach dan sortiert er ja nur die cd-anzahl und es passt nicht mehr mit der liste zusammen oder?
struct Daten { char name[20]; //name int gday; //Geburtstag int gmonth; //Geburtsmonat int gyear; //Geburtsjahr }; struct Eigenschaften { int cdanz; //CD Anzahl char lieblingsb[50]; //Lieblingsband char plays; //Playstation }; struct Daten persd[99]; struct Eigenschaften perse[99]; clrscr(); do { fflush(stdin); printf("Freund %d:\n\nName:", i); gets(persd[i].name); fflush(stdin); printf("Geburstag: "); scanf("%d.%d.%d", &persd[i].gday, &persd[i].gmonth, &persd[i].gyear); fflush(stdin); printf("CD-Anzahl: "); scanf("%d", &perse[i].cdanz); fflush(stdin); printf("Lieblingsband: "); gets(perse[i].lieblingsb); fflush(stdin); printf("Plajstation[j/n]: "); scanf("%c", &perse[i].plays); fflush(stdin); clrscr(); i++; } while(i!=anz);
-
kann mir den niemand helfen
-
Wieso packst du deine beiden Strukturen nicht einfach in eine Oberstruktur, und erstellst dir von der ein Array?
struct Person { struct Daten persd; struct Eigenschaften perse; }; ... struct Person a_Personen[99];
Nun kannst du mit Quicksort deine Personen sortieren lassen und die Ordnung bleibt erhalten.
-
sorry ich kommm mit der quicksot funktion nicht zurecht, ich habs versucht aber es funktionier einfach nicht, hab das alte programm gelassen (müssen)
hab jetz wieder das selbe problem, hab jetzt aber nur eine Struktur die wir nach dem Geburtsdatum sortieren sollen, hmmmm , tja
#include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h> int sort_function( const void *a, const void *b); void main() { clrscr(); //Struct struct eigenschaften{ char name[99]; char vorname[99]; int katalog; char birthday[9]; }; struct eigenschaften struk[5]; //definiert struk struct eigenschaften struk2[5]; //fr die kopie int i=0, x; //einlesen do { fflush(stdin); //Name printf("\n\nSchueler %d:\n",i); gets(struk[i].name); strcpy(struk2[i].name,struk[i].name); //copy //Vorname printf("Vorname: "); gets(struk[i].vorname); strcpy(struk2[i].vorname,struk[i].vorname); //copy //Geburtstag printf("Geburtsdatum[JJJJMMTT]: "); gets(struk[i].birthday); strcpy(struk2[i].birthday,struk[i].birthday); //copy i++; } while(i!=5); i=0; getch(); clrscr(); //qsort((void *)a_Person.eigenschaften.birthday, 5, sizeof(a_Person.eigenschafen.birthday[0]), sort_function); //gibt alle Namen aus do { printf("\nSchler %d\n", i); puts(struk2[i].birthday); puts(struk2[i].vorname); i++; } while(i!=5); getch(); } //Sortier Funktion int sort_function( const void *a, const void *b) { return( strcmp((char *)a,(char *)b) ); }
Ich würde nur mehr die Sortierung benötigen, die Sortierung soll auf dem strukt "struk2" also der kopie von dem eingelesen strukt ausgeführt werden, bitte wenn mir jemand bei der quicksort funktion helfen könnte
danke schonmal
wNg Ice
-
Tjo,
also die Funktion, die du QSort übergibst soll entscheiden, welcher der beiden Parameter größer/kleiner ist.Also kopierst du erst dein Struktur-Array 1:1 nach struc2
An QSort übergibst du dann nur den Anfang dieses Arrays (struc2).
qsort((void *)struk2, 5, sizeof(eigenschaften), sort_function);
Nun werden deiner Sort-Funktion immer zwei Personen übergeben und deine Funktion muss selbst entscheiden, nach welchem Kriterium sie sortiert.
Also etwa so:int sort_function( const void *a, const void *b) { const struct eigenschaften *Person_a = (const struct eigenschaften*) a; const struct eigenschaften *Person_b = (const struct eigenschaften*) b; //Jetzt kannst du mit diesen Strukts arbeiten (sie vergleichen) if (Person_a->birthday) < (Person_b->birthday) .. return ... else return ... //wenn a größer b else return ... // wenn gleich groß // Anm: Den Vergleich "<" willst du dann sicher wieder mit "strcmp" machen. }
PS: Die Struktur muss natürlich global definiert werden, damit die Vergleichfunktion um deren Aufbau weíß.
-
puh, also durchblicken tu ich eigentlich noch immer nicht wirklich
ich versteh eigentlich noch immer nicht wie das in qsort eigentlich genau funkt.der vergleich mit strcmp? oje
was is dan eigentlich der return wert? (...)
und wenn ich immer nur zwei werte übergebe, muss ich die qsort dan nicht öfter als nur einmal aufrufen?würde es dir was ausmachen mir die ganze funktion zu schreiben
ich weiss der Lerneffekt ist dan nicht wirklich da, aber ich brauch das Progg schon ziemlich bald (so schnell als möglich)sorry aber ich glaub ich steh da total auf der leitung...
thanks und
wNg Ice
-
IceFire schrieb:
würde es dir was ausmachen mir die ganze funktion zu schreiben
Na die paar Zahlen wirst du ja wohl noch selber einsetzen können. Die sort_function von SeppSchrott ist schon fast komplett. Es fehlen eben nur noch die richtigen Rückgabewerte.
-
ja danke
ich schreib hier ja auch nur beiträge obwohl ich mich auskenne, will nur mal ein paar leuten unnötige arbeit machen
-
Was ist jetzt bitte schön daran so schwer diese Funktion zu vervollständigen??
SeppSchrot schrieb:
int sort_function( const void *a, const void *b) { const struct eigenschaften *Person_a = (const struct eigenschaften*) a; const struct eigenschaften *Person_b = (const struct eigenschaften*) b; //Jetzt kannst du mit diesen Strukts arbeiten (sie vergleichen) if (Person_a->birthday) < (Person_b->birthday) .. return ... else return ... //wenn a größer b else return ... // wenn gleich groß // Anm: Den Vergleich "<" willst du dann sicher wieder mit "strcmp" machen. }
Das einige was du noch tun musst, ist nach return die richtige Zahl hinzuschreiben und nach else noch eine Abfrage einzubauen, die eh schon mit dem Kommentar beschrieben ist. Mehr ist es nicht.
-
nagut
habs jetz endlich hinbekommen
thanks.
wNg Ice
edit:
PS sorry für mein vorhergehendes kommentar, war da etwas genervt