Struct als Liste



  • 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]; //fr 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("\nSchler %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



  • @IceFire

    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 😉


Anmelden zum Antworten