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. LadenNunja.. 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",¬e); 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",¬e); 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",¬e); 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",¬e); 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.