Problem bei einer Aufgabe: Schülerverwaltung



  • Wunderschönen guten Tag!

    Dank meinem werten Professor muss ich ein "Schülerverwaltungsprogramm" schreiben. Nunja.. es klappt nicht so ganz.

    Das Programm sollte können:

    1. Schüler eingeben
    2. Alle Schüler ausgeben
    3. Schüler bearbeiten
    4. Schüler löschen
    5. Einen Schüler ausgeben
    6. Speicher (Binär mit fwrite())
    7. Laden

    Nunja.. wenn ich einen Schüler eingeben.. und danach ausgeben will sind i-wie meine ganzen anderen Elemente von der Schüler Struktur mit i-welchen Zeugs voll.. das Speicher klappt schon garnicht.. und ja.. Ich würde es gut heissen wenn mir jemand helfen könnte 😃 .

    /**********************************************************/
    /* Beschreibung:Verwaltungsprogramm						  */
    /**********************************************************/
    
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    //////////////////////////////////////////
    //			Strukturdefinitionen		//
    //////////////////////////////////////////
    
    //Struktur für die Noten
    struct Benotung
    {
    	char fach[5];
    	int note;
    };
    
    //Struktur für die Schülerdaten
    struct daten
    {
    	char vorname[20];
    	char nachname[20];
    	char klasse[20];
    	int tag;
    	int monat;
    	int jahr;
    	struct Benotung noten[20];
    
    };
    
    //////////////////////////////////////////
    //				Prototypen				//
    //////////////////////////////////////////
    
    //Gibt einzelne Schüler ein
    void eingabe(struct daten schueler[]);
    
    //Gibt alle Schüler aus
    void ausgabe(struct daten schueler[]);
    
    //Ändert die Daten eines Schülers
    void change(struct daten schueler[]);
    
    //Löscht einen Schüler
    void loeschen(struct daten schueler[]);
    
    //Gibt einen Schüler aus
    void ausgabe2(struct daten schueler[]);
    
    //////////////////////////////////////////
    //					Main				//
    //////////////////////////////////////////
    
    int main()
    {
    
    	struct daten schueler[1000];	//Strukturvariable
    
    	char menu;					//Menüvariable
    
    	while(1) //Endlosschleife, das Menü wird immer wieder aufgerufen
    	{
    		printf("Bitte waehlen sie! \n");
    		printf("\n \n Eingabe <1> \n Ausgabe <2> \n Bearbeiten <3> \n Loeschen <4> \n Ein Element ausgeben <5> \n Speicher <6> \n Laden <7> \n Ende <8> \n \n");
    
    		fflush(stdin);
    
    		scanf("%c", &menu); //Eingabe, was man im Menü aufrufen will
    
    		//Switch für das Menü
    		switch(menu)
    		{
    		case '1': eingabe(schueler); break;
    			break; 
    		case '2': ausgabe(schueler); break;
    			break; 
    		case '3': change(schueler); break;
    			break; 
    		case '4': loeschen(schueler); break;
    			break;
    		case '5': ausgabe2(schueler); break;
    
    		case '6': break;
    
    		case '7': break;
    
    		case '8': return 0;
    
    		}
    	}
    }
    //////////////////////////////////////////
    //				Eingabe					//
    //////////////////////////////////////////
    
    void eingabe(struct daten schueler[])
    {
    	char name[20]; //wird für den vergleich benötigt | Variable zum kopieren
    	int note;	   //Note für die Notenausgabe
    	char fach[5];  //Fach für die Fächerausgabe
    	int i=0;	   //Index
    	int i2=0;	   //Index 2
    
    	//Nachnamen eingeben
    	printf("Bitte geben Sie den Nachnamen ein: ");
    
    	fflush(stdin);
    
    	scanf("%s",name);
    
    	fflush(stdin);
    
    	while(strcmp( schueler[i].nachname,"" ) !=0) i++; //Vergleicht ob schueler[i].nachname "" ist
    	strcpy( schueler[i].nachname,name );		  //falls nein, wird der Index um 1 erhöht.
    
    	fflush(stdin);
    
    	//Vornamen eingeben
    	printf("Bitte geben Sie den Vornamen ein: ");
    	fflush(stdin);
    	scanf("%s",name);
    	fflush(stdin);
    	strcpy( schueler[i].vorname,name );
    
    	//Klasse eingeben
    	printf("Bitte geben Sie die Klasse ein: ");
    	scanf("%s",name);
    	fflush(stdin);
    	strcpy( schueler [i].klasse,name );
    
    	//Geburtsdatum eingeben
    	printf("Bitte geben Sie das Geburtsdatum ein: \n");
    	scanf("%d.%d.%d", &schueler[i].tag, &schueler[i].monat, &schueler[i].jahr);
    	fflush(stdin);
    
    	//Noteneingabe
    	printf("\n \n Geben Sie maximal 10 Faecher ein! Abbruch mit <e> \n");
    
    	while ((fach[0]!='e')&&(i2<10)) //Solange fach[0] nicht "e" und i2 kleiner 10 werden 
    	{								//Fächer eingegeben
    		printf("\nFach: ");
    		scanf("%s",fach);
    		if (fach[0]!='e')
    		{
    			printf("Note: ");
    			scanf("%d",&note);
    
    			strcpy(schueler[i].noten[i2].fach,fach);
    			schueler[i].noten[i2].note=note;
    
    		}
    		i2++;
    	}
    	if (i2>=10) printf("\nAlle Noten eingegeben!\n");
    
    	printf("\n \nSchueler wurde angelegt! \n \n");
    
    }
    
    //////////////////////////////////////////
    //				Ausgabe					//
    //////////////////////////////////////////
    
    void ausgabe(struct daten schueler[])
    {
    
    	for(int i=0; i<1000; i++) //Solange i < 1000 werden Schüler ausgegeben
    	{
    
    		if ( strcmp( schueler[i].nachname, "") !=0 ) //Schüler die gelöscht worden sind nicht ausgeben
    		{
    			printf("Nachname %s",schueler[i].nachname);
    			printf("Vorname %s",schueler[i].vorname);
    			printf("Klasse %s",schueler[i].klasse);
    			printf("Geburtsdatum %d.%d.%d",schueler[i].tag, schueler[i].monat, schueler[i].jahr);
    
    			for(int i2=0;i2<10;i2++)	//Gibt alle Noten aus, solange i2 < 10
    			{	
    				if (strcmp(schueler[i].noten[i2].fach,"")!=0) //Vergleicht ob die aktuelle Note
    				{											  // 0 ist
    					printf("Fach: %s ",schueler[i].noten[i2].fach);
    					printf("\tNote: %d\n",schueler[i].noten[i2].note);
    				}
    			}
    
    		}
    	}
    	printf("\n \n Alle Schueler wurden ausgegeben!\n \n");
    }
    
    //////////////////////////////////////////
    //				Change					//
    //////////////////////////////////////////
    
    void change(struct daten schueler[])
    {
    	char name[20]; //wird für den vergleich benötigt
    	int i = 0; //Index
    	int i2=0;	   //Index 2
    	int note;	   //Note für die Notenausgabe
    	char fach[5];  //Fach für die Fächerausgabe
    
    	printf("Welchen Schueler wollen Sie bearbeiten? \n");
    				printf("Nachname: ");
    				scanf("%s",name);
    
    				while(strcmp(schueler[i].nachname, name)!=0) //Solange schueler.[i].nachname nicht name ist
    					i++;									 //wird der Index um 1 erhöht
    
    				printf("Neuer Nachname: ");
    				scanf("%s",name);
    				strcpy( schueler[i].nachname,name );
    
    				printf("Neuer Vorname: ");
    				scanf("%s",name);
    				strcpy( schueler[i].vorname,name );
    
    				printf("Neue Klasse: ");
    				scanf("%s",name);
    				strcpy( schueler[i].klasse,name );
    
    				printf("Neues Geburtsdatum: ");
    				scanf("%d.%d.%d",schueler[i].tag, schueler[i].monat, schueler[i].jahr);
    
    				//Noteneingabe
    				printf("\n \n Geben Sie maximal 10 Faecher ein! Abbruch mit <e> \n");
    
    				while ((fach[0]!='e')&&(i2<10)) //Solange fach[0] nicht "e" und i2 kleiner 10 werden 
    				{								//Fächer eingegeben
    					printf("\nFach: ");
    					scanf("%s",fach);
    					if (fach[0]!='e')
    					{
    						printf("Note: ");
    						scanf("%d",&note);
    
    						strcpy(schueler[i].noten[i2].fach,fach);
    						schueler[i].noten[i2].note=note;
    
    					}
    					i2++;
    				}
    				if (i2>=10) printf("\nAlle Noten eingegeben!\n"); //Falls i2 größer gleich 10 printf("");
    
    				printf("\n \nSchueler wurde bearbeitet! \n \n");
    
    }
    
    //////////////////////////////////////////
    //				Löschen					//
    //////////////////////////////////////////
    
    void loeschen(struct daten schueler[])
    {
    	char name[20]; //wird für den vergleich benötigt
    	int i = 0; //Index & Zähler
    
    	printf("Bitte geben Sie den Nachnamen ein: ");
    	scanf("%s",name);
    
    	while((strcmp(schueler[i].nachname,name)!=0)&&(i<1000)) i++;	//Solange schueler[i].nachname
    	if (i<1000)														//und name nicht gleich sind
    	{																//und i<1000 wird i um 1 erhöht
    		strcpy(schueler[i].nachname,"");
    		printf("Schueler wurde aus geloescht!\n");
    	}
    	else printf("Schueler nicht vorhanden!\n");
    }
    
    //////////////////////////////////////////
    //				Ausgabe2				//
    //////////////////////////////////////////
    
    void ausgabe2(struct daten schueler[])
    {
    	char name[20]; //wird für den vergleich benötigt
    	int i = 0; //Index
    
    	printf("Bitte geben Sie den Nachnamen ein: ");
    	scanf("%s",name);
    
    	while(strcmp(schueler[i].nachname,name)!=0)
    		i++;
    
    	printf("Nachname %s",schueler[i].nachname);
    	printf("Vorname %s",schueler[i].vorname);
    	printf("Klasse %s",schueler[i].klasse);
    	printf("Geburtsdatum %d.%d.%d",schueler[i].tag, schueler[i].monat, schueler[i].jahr);
    
    	for(int i2=0;i2<10;i2++)	//Gibt alle Noten aus, solange i2 < 10
    	{	
    		if (strcmp(schueler[i].noten[i2].fach,"")!=0) //Vergleicht ob die aktuelle Note
    		{											    // 0 ist
    			printf("Fach: %s ",schueler[i].noten[i2].fach);
    			printf("\tNote: %d\n",schueler[i].noten[i2].note);
    		}
    	}
    	printf("\n \nSchueler ausgegeben! \n\n");
    
    }
    


  • Bau dir eine Testfunktion die ein paar Funktionen testet. Einfach mal eingabe(schueler) aufrufen und nachsehen ob was wo gespeichert wurde, mit printf("%s\n", schueler[0].vorname) zum Beispiel kann man nachsehen ob der Vorname ordentlich gespeichert wurde. So gehst du stückweise durch bis du den Fehler gefunden hast und behebst ihn. Es hat bestimmt niemand Lust das für dich zu tun.

    Du solltest auch deine Kommentierung überdenken. Zum Beispiel

    while ((fach[0]!='e')&&(i2<10)) //Solange fach[0] nicht "e" und i2 kleiner 10 werden
    

    "Solange fach[0] nicht "e" und i2 kleiner 10 werden" weiß ich selber, das steht dort, dafür brauche ich keinen Kommentar. Stattdessen solltest du kommentieren was "e" und i2 sind. "e" ist wahrscheinlich die Kodierung für "Es existiert kein fach". i2 sind wohl die Noten. Ein besserer Kommentar wäre "Solange das Fach existiert und dafür Noten vergeben wurden".

    Außerdem benutze bitte [cpp][/cpp]-Tags. Bunt ließt es sich etwas leichter.



  • Werd ich machen, danke!

    hier nochmal in Farbe:

    /**********************************************************/
    /* Beschreibung:Verwaltungsprogramm                          */
    /**********************************************************/
    
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    //////////////////////////////////////////
    //            Strukturdefinitionen        //
    //////////////////////////////////////////
    
    //Struktur für die Noten
    struct Benotung
    {
        char fach[5];
        int note;
    };
    
    //Struktur für die Schülerdaten
    struct daten
    {
        char vorname[20];
        char nachname[20];
        char klasse[20];
        int tag;
        int monat;
        int jahr;
        struct Benotung noten[20];
    
    };
    
    //////////////////////////////////////////
    //                Prototypen                //
    //////////////////////////////////////////
    
    //Gibt einzelne Schüler ein
    void eingabe(struct daten schueler[]);
    
    //Gibt alle Schüler aus
    void ausgabe(struct daten schueler[]);
    
    //Ändert die Daten eines Schülers
    void change(struct daten schueler[]);
    
    //Löscht einen Schüler
    void loeschen(struct daten schueler[]);
    
    //Gibt einen Schüler aus
    void ausgabe2(struct daten schueler[]);
    
    //////////////////////////////////////////
    //                    Main                //
    //////////////////////////////////////////
    
    int main()
    {
    
        struct daten schueler[1000];    //Strukturvariable
    
        char menu;                    //Menüvariable
    
        while(1) //Endlosschleife, das Menü wird immer wieder aufgerufen
        {
            printf("Bitte waehlen sie! \n");
            printf("\n \n Eingabe <1> \n Ausgabe <2> \n Bearbeiten <3> \n Loeschen <4> \n Ein Element ausgeben <5> \n Speicher <6> \n Laden <7> \n Ende <8> \n \n");
    
            fflush(stdin);
    
            scanf("%c", &menu); //Eingabe, was man im Menü aufrufen will
    
            //Switch für das Menü
            switch(menu)
            {
            case '1': eingabe(schueler); break;
                break; 
            case '2': ausgabe(schueler); break;
                break; 
            case '3': change(schueler); break;
                break; 
            case '4': loeschen(schueler); break;
                break;
            case '5': ausgabe2(schueler); break;
    
            case '6': break;
    
            case '7': break;
    
            case '8': return 0;
    
            }
        }
    }
    //////////////////////////////////////////
    //                Eingabe                    //
    //////////////////////////////////////////
    
    void eingabe(struct daten schueler[])
    {
        char name[20]; //wird für den vergleich benötigt | Variable zum kopieren
        int note;       //Note für die Notenausgabe
        char fach[5];  //Fach für die Fächerausgabe
        int i=0;       //Index
        int i2=0;       //Index 2
    
        //Nachnamen eingeben
        printf("Bitte geben Sie den Nachnamen ein: ");
    
        fflush(stdin);
    
        scanf("%s",name);
    
        fflush(stdin);
    
        while(strcmp( schueler[i].nachname,"" ) !=0) i++; //Vergleicht ob schueler[i].nachname "" ist
        strcpy( schueler[i].nachname,name );          //falls nein, wird der Index um 1 erhöht.
    
        fflush(stdin);
    
        //Vornamen eingeben
        printf("Bitte geben Sie den Vornamen ein: ");
        fflush(stdin);
        scanf("%s",name);
        fflush(stdin);
        strcpy( schueler[i].vorname,name );
    
        //Klasse eingeben
        printf("Bitte geben Sie die Klasse ein: ");
        scanf("%s",name);
        fflush(stdin);
        strcpy( schueler [i].klasse,name );
    
        //Geburtsdatum eingeben
        printf("Bitte geben Sie das Geburtsdatum ein: \n");
        scanf("%d.%d.%d", &schueler[i].tag, &schueler[i].monat, &schueler[i].jahr);
        fflush(stdin);
    
        //Noteneingabe
        printf("\n \n Geben Sie maximal 10 Faecher ein! Abbruch mit <e> \n");
    
        while ((fach[0]!='e')&&(i2<10)) //Solange fach[0] nicht "e" und i2 kleiner 10 werden 
        {                                //Fächer eingegeben
            printf("\nFach: ");
            scanf("%s",fach);
            if (fach[0]!='e')
            {
                printf("Note: ");
                scanf("%d",&note);
    
                strcpy(schueler[i].noten[i2].fach,fach);
                schueler[i].noten[i2].note=note;
    
            }
            i2++;
        }
        if (i2>=10) printf("\nAlle Noten eingegeben!\n");
    
        printf("\n \nSchueler wurde angelegt! \n \n");
    
    }
    
    //////////////////////////////////////////
    //                Ausgabe                    //
    //////////////////////////////////////////
    
    void ausgabe(struct daten schueler[])
    {
    
        for(int i=0; i<1000; i++) //Solange i < 1000 werden Schüler ausgegeben
        {
    
            if ( strcmp( schueler[i].nachname, "") !=0 ) //Schüler die gelöscht worden sind nicht ausgeben
            {
                printf("Nachname %s \n",schueler[i].nachname);
                printf("Vorname %s \n",schueler[i].vorname);
                printf("Klasse %s \n",schueler[i].klasse);
                printf("Geburtsdatum %d.%d.%d",schueler[i].tag, schueler[i].monat, schueler[i].jahr);
    
                for(int i2=0;i2<10;i2++)    //Gibt alle Noten aus, solange i2 < 10
                {    
                    if (strcmp(schueler[i].noten[i2].fach,"")!=0) //Vergleicht ob die aktuelle Note
                    {                                              // 0 ist
                        printf("Fach: %s ",schueler[i].noten[i2].fach);
                        printf("\tNote: %d\n",schueler[i].noten[i2].note);
                    }
                }
    
            }
        }
        printf("\n \n Alle Schueler wurden ausgegeben!\n \n");
    }
    
    //////////////////////////////////////////
    //                Change                    //
    //////////////////////////////////////////
    
    void change(struct daten schueler[])
    {
        char name[20]; //wird für den vergleich benötigt
        int i = 0; //Index
        int i2=0;       //Index 2
        int note;       //Note für die Notenausgabe
        char fach[5];  //Fach für die Fächerausgabe
    
        printf("Welchen Schueler wollen Sie bearbeiten? \n");
                    printf("Nachname: ");
                    scanf("%s",name);
    
                    while(strcmp(schueler[i].nachname, name)!=0) //Solange schueler.[i].nachname nicht name ist
                        i++;                                     //wird der Index um 1 erhöht
    
                    printf("Neuer Nachname: ");
                    scanf("%s",name);
                    strcpy( schueler[i].nachname,name );
    
                    printf("Neuer Vorname: ");
                    scanf("%s",name);
                    strcpy( schueler[i].vorname,name );
    
                    printf("Neue Klasse: ");
                    scanf("%s",name);
                    strcpy( schueler[i].klasse,name );
    
                    printf("Neues Geburtsdatum: ");
                    scanf("%d.%d.%d",schueler[i].tag, schueler[i].monat, schueler[i].jahr);
    
                    //Noteneingabe
                    printf("\n \n Geben Sie maximal 10 Faecher ein! Abbruch mit <e> \n");
    
                    while ((fach[0]!='e')&&(i2<10)) //Solange fach[0] nicht "e" und i2 kleiner 10 werden 
                    {                                //Fächer eingegeben
                        printf("\nFach: ");
                        scanf("%s",fach);
                        if (fach[0]!='e')
                        {
                            printf("Note: ");
                            scanf("%d",&note);
    
                            strcpy(schueler[i].noten[i2].fach,fach);
                            schueler[i].noten[i2].note=note;
    
                        }
                        i2++;
                    }
                    if (i2>=10) printf("\nAlle Noten eingegeben!\n"); //Falls i2 größer gleich 10 printf("");
    
                    printf("\n \nSchueler wurde bearbeitet! \n \n");
    
    }
    
    //////////////////////////////////////////
    //                Löschen                    //
    //////////////////////////////////////////
    
    void loeschen(struct daten schueler[])
    {
        char name[20]; //wird für den vergleich benötigt
        int i = 0; //Index & Zähler
    
        printf("Bitte geben Sie den Nachnamen ein: ");
        scanf("%s",name);
    
        while((strcmp(schueler[i].nachname,name)!=0)&&(i<1000)) i++;    //Solange schueler[i].nachname
        if (i<1000)                                                        //und name nicht gleich sind
        {                                                                //und i<1000 wird i um 1 erhöht
            strcpy(schueler[i].nachname,"");
            printf("Schueler wurde aus geloescht!\n");
        }
        else printf("Schueler nicht vorhanden!\n");
    }
    
    //////////////////////////////////////////
    //                Ausgabe2                //
    //////////////////////////////////////////
    
    void ausgabe2(struct daten schueler[])
    {
        char name[20]; //wird für den vergleich benötigt
        int i = 0; //Index
    
        printf("Bitte geben Sie den Nachnamen ein: ");
        scanf("%s",name);
    
        while(strcmp(schueler[i].nachname,name)!=0)
            i++;
    
        printf("Nachname %s \n",schueler[i].nachname);
        printf("Vorname %s \n",schueler[i].vorname);
        printf("Klasse %s \n",schueler[i].klasse);
        printf("Geburtsdatum %d.%d.%d \n",schueler[i].tag, schueler[i].monat, schueler[i].jahr);
    
        for(int i2=0;i2<10;i2++)    //Gibt alle Noten aus, solange i2 < 10
        {    
            if (strcmp(schueler[i].noten[i2].fach,"")!=0) //Vergleicht ob die aktuelle Note
            {                                                // 0 ist
                printf("Fach: %s ",schueler[i].noten[i2].fach);
                printf("\tNote: %d\n",schueler[i].noten[i2].note);
            }
        }
        printf("\n \nSchueler ausgegeben! \n\n");
    
    }
    


  • Hi,
    warum befolgst du nicht den Tip von nwp2 ?
    Teste und Überprüfe die Funktionen einzeln. Wenn dann noch etwas unklar ist, machst du die Funktion hier bekannt. Dann wird dir vermutlich auch schnell geholfen.
    Die wenigsten dürften Lust haben den ganzen Kram, auch wenns jetzt schön bunt ist, auf einmal durchzugucken.

    Gruß,
    B.B.



  • Big Brother schrieb:

    Hi,
    warum befolgst du nicht den Tip von nwp2 ?
    Teste und Überprüfe die Funktionen einzeln. Wenn dann noch etwas unklar ist, machst du die Funktion hier bekannt. Dann wird dir vermutlich auch schnell geholfen.
    Die wenigsten dürften Lust haben den ganzen Kram, auch wenns jetzt schön bunt ist, auf einmal durchzugucken.

    Gruß,
    B.B.

    ich sage doch bereits "ja danke, werde ich machen" 😕



  • PsychoStyle schrieb:

    ich sage doch bereits "ja danke, werde ich machen" 😕

    Jepp. Gefolgt von deinem bunten Monsterposting.


Anmelden zum Antworten