Aufgabe: Studentenverzeichnis anlegen
-
Hm, kannste nicht mal bitte deinen Code in [cpp]-Tags anstatt in [quote]-Tags einschließen? Ich hab irgendwie keine Lust so eine unfarbige, linksbündige Textwüste zu durchkämmen
-
done
-
Also: In deiner anlegen Funktion liest du einen string ein und vergleichst anschließend die Adresse von line mit den 2 Integer Konstanten. Das ist gewiss nicht das, was du eigentlich machen willst.
Stattdessen könntest du z.B. so einen Code benutzen:
char line[LINELEN +1]; int matrikelnr; do { gets(line); matrikelnr = atoi(line); } while( matrikelnr < 10000 || matrikelnr > 99999); sarr[x].matrikelnummer = matrikelnr;
Du liest den string line von stdin und wandelst mit atoi (ascii to integer) den string in eine Ganzzahl um. Das machst du so lange, bis der Benutzer eine gültige Zahl eingegeben hat.
Noch ne Anmerkung zu der Art wie du Strings einliest: So wie du es momentan machst, wirst du immer nur die Zeichen bis zum 1. Leerzeichen abspeichern.
fgets() liest bis zum Enter und aus dem String line liest du dann mit scanf den String bis zum 1. Leerzeichen. Wenn jemand "Maria Lara" eingibt, wirst du in der Struktur also nur "Maria" abspeichern.
Wenn das nicht gewollt ist, könnte man sowas machen (ungetestet):printf("Bitte geben Sie den Nachnamen ein:"); fgets(line,LINELEN, stdin); line[strlen(line)-1] = 0; strcpy(sarr[0].nachname, line);
Die vorletzte Zeile dient nur dazu das LF (LineFeed, "Enter") mit dem String Terminierer 0 zu überschreiben, da fgets das am Ende vom String mit abspeichert.
-
wow vielen vielen Dank!!
das hätte ich jetzt nicht gemerkt..
hab jetzt noch ein bisschen was gemacht.. nur viel weiter bin ich nicht gekommen.
#include <stdio.h> #define LINELEN 256 #define NAMELEN 25 #define MAXSTUD 1000 struct studenten { int matrikelnummer; char nachname[NAMELEN]; char vorname[NAMELEN]; char studienfach[3]; }; typedef struct studenten stud; void anzeigen(stud sarr [], int x){ //Anzeigen int i; printf("\n\nMatrikelNr\t\tName\t\tVorname\t\tStudienfach\n"); printf("-------------------------------------------------------------------\n"); for(i=0; i <x; i++){ printf(" %8d %17s %18s %15s\n", sarr[i].matrikelnummer, sarr[i].nachname, sarr[i].vorname, sarr[i].studienfach); } printf("\n\nEs sind noch %d von %d Plaetze verfuegbar \n \n ", x=MAXSTUD-x, MAXSTUD); } int bearbeiten(){ //Bearbeiten printf("bearbeiten\n"); } int anlegen(stud sarr[], int x){ //Anlegen int i = x; int j; char line[LINELEN +1]; do { printf("\n\nBitte geben Sie die 5-Stellige Matrikelnummer ein:"); //Eingabe Matrikelnummer fgets(line, LINELEN, stdin); sscanf(line, "%d", &sarr[x].matrikelnummer); if (sarr[x].matrikelnummer < 10000 || sarr[x].matrikelnummer > 99999){ printf("Fehler: Matrikelnummer muss 5-Stellig sein!\n"); } for(j = 0; j<= x; j++){ if(sarr[x].matrikelnummer == sarr[j-1].matrikelnummer){ printf("Matrikelnummer schon vorhanden!!\n"); sarr[x].matrikelnummer=1; } } } while(sarr[x].matrikelnummer < 10000 || sarr[x].matrikelnummer > 99999); printf("\nBitte geben Sie den Nachnamen ein:"); //Eingabe Nachname fgets(line,LINELEN, stdin); line[strlen(line)-1] = 0; strcpy(sarr[i].nachname, line); printf("\nBitte geben Sie den Vornamen ein:"); //Eingabe Vorname fgets(line,LINELEN, stdin); line[strlen(line)-1] = 0; strcpy(sarr[i].vorname, line); printf("\nBitte geben Sie das Studienfach ein:"); //Eingabe Studienfach fgets(line,LINELEN, stdin); sscanf(line, "%s", &sarr[i].studienfach); i++; return i; } int loeschen(){ //Löschen printf("bearbeiten\n"); } int main(){ char val='\0'; char line[ LINELEN+1 ]; int ende=0; stud sarr[MAXSTUD]; int n=0; int x = 0; printf("\n\n\nStudierendenverwaltung (Vers. 1.1)\n"); while( !ende ){ printf("\n\n-----------------------\n"); printf(" 1 (Anzeigen)\n"); printf(" 2 (Bearbeiten)\n"); printf(" 3 (Neu anlegen)\n"); printf(" 4 (Loeschen)\n"); printf(" 5 (Programm beenden)\n"); printf("-----------------------\n"); printf(" --> Azahl der Studenten: %d <-- \n", x); printf("\nEingabe: "); if( fgets( line, LINELEN, stdin ) == NULL ){ printf("Fehler in fgets()\n"); return -1; } if( sscanf( line, "%c", &val ) != 1 ){ printf("Fehler in sscanf()\n"); return -1; } switch ( val ){ case '1' : anzeigen(sarr, x); break; case '2' : bearbeiten(); break; case '3' : x = anlegen(sarr, x); break; case '4' : loeschen(); break; case '5' : //printf("\nWollen Sie wirklich beenden? j/n \n"); ende=1; break; default : printf("\nFalsche Eingabe!\n\n"); } } printf("Programm beendet.\n"); return 0; }
wie man ganz unten sieht, will ich beim beenden des Programms nochmal fragen ob wirklich beendet werden soll.. und dann mit j/n bestätigen. wie mach ich das genau? *g*
später will ich das ganze dann auch noch nach Mat.nr, Vorname, Nachname oder Studienfach sortieren lassen.. aber eins nach dem anderen
-
Hi momo
Konnte leider nicht eher antworten, mein I-Net ging nicht.
Was für ein Projekt? Keine Ahnung. Aber ich denk mal, du als Anfänger
(bzw. ich auch) könntest ein bisschen Übung brauchen. Kann ja nicht schaden.
Darfst dir ein Thema aussuchen. Aber nicht unbedingt ein Spiel.
Sowas ist nichts für Anfänger, habs schon probiert *graus*Zum Programm:
Du könntest folgendes schreiben:char exit = 'n'; // ... case 5: { printf("\nWollen Sie wirklich beenden? j/n \n"); printf("Wahl: "); scanf ("%1c", &exit); // bzw. die methode zum einlesen, die du willst switch(exit) // geht auch mit if-else statt switch { case 'j': break; case 'n': ende = 1; break; default: printf("\n *** Falsche Eingabe ***\n"); } break; } // ...
Das wäre evtl eine Lösung.
-
Hey Woolve
vielen Dank.. bin dir echt voll dankbar für deine Hilfe
bin heut auch mal ein bisschen weiter gekommen.. mitlerweile läuft die Lösch- und Bearbeitenfunktion..
Jetzt fehlt mir quasi "nur" noch die Vorschlagsfunktion, also das mir eine freie Matrikelnummer vorgeschlagen wird und zu guter letzt das Sortieren der Daten nach Matrikelnummer, sowie nach Name-Vorname-Matrikelnummer und Studienrichtung-Matrikelnummerder rest schaut eigentlich ganz gut aus
Hier mein aktueller Code
siehe unten ^^
wird immer länger
über ein paar Tipps zur "Vorschlagfunktion" sowie zu nem guten Sortieralgorythmus wäre ich sehr dankbar!
-
So nach langen rumprobieren hab ich mich nun für Bubblesort entschieden... implementiert hab ich das ganze, nur irgendwas stimmt noch nicht.. es wird zwar sortiert, aber die erste Zeile stimmt nie...irgendwo hat sich ein fehler eingeschlichen aber ich weiß nicht wo
wenn ich das sortieren will, kommt sowas bei raus.
10001
10000
10001
10002
10003
10004
10005
uswdie erste Zeile is = der 3. sonst stimmt alles
dieses Problem gelöst! siehe unten! :)
ich such immernoch ne Funktion, mit der ich mir ne Matrikelnummer vorschlagen lassen kann
-
so nach einer langen nacht hab ich nun ein paar Probleme weniger
aber ich hab immmernoch keine "Vorschlagsfunktion"
ich möchte beim Anlegen eines Studentens eine Matrikelnummer vorgeschlagen bekommen.. das ganze sollte bei 10000 beginnen und immer um 1 steigen..
weiß nur nicht genau wie ich das umsetzen soll..
das hier is meine Angelegenfunktion
int anlegen(stud sarr[], int x){ //Anlegen int i = x; int j; char line[LINELEN +1]; do { printf("\n\nBitte geben Sie die 5-Stellige Matrikelnummer ein: "); //Eingabe Matrikelnummer fgets(line, LINELEN, stdin); sscanf(line, "%d", &sarr[x].matrikelnummer); if (sarr[x].matrikelnummer < 10000 || sarr[x].matrikelnummer > 99999){ printf("Fehler: Matrikelnummer muss 5-Stellig sein!\n"); } for(j = 0; j< x; j++){ if(sarr[x].matrikelnummer == sarr[j].matrikelnummer){ printf("Matrikelnummer schon vorhanden!!\n"); sarr[x].matrikelnummer=1; } } } while(sarr[x].matrikelnummer < 10000 || sarr[x].matrikelnummer > 99999); printf("\nBitte geben Sie den Nachnamen ein: "); //Eingabe Nachname fgets(line,LINELEN, stdin); line[strlen(line)-1] = 0; strcpy(sarr[i].nachname, line); printf("\nBitte geben Sie den Vornamen ein: "); //Eingabe Vorname fgets(line,LINELEN, stdin); line[strlen(line)-1] = 0; strcpy(sarr[i].vorname, line); printf("\nBitte geben Sie das Studienfach ein: "); //Eingabe Studienfach fgets(line,LINELEN, stdin); sscanf(line, "%s", &sarr[i].studienfach); i++; return i; }
und vor der Eingabe der Martikelnummer hätte ich gern sowas wie:
Vorschlag für Matriekelnummer: 10000
Einverstanden? j/n
wenn ja gehts weiter mit dem Nachnamen, wenn nein gehts zur manuellen Eingabe der Matrikelnummer..hier mein Kompletter code:
#include <stdio.h> #define LINELEN 256 #define NAMELEN 25 #define MAXSTUD 100 struct studenten { int matrikelnummer; char nachname[NAMELEN]; char vorname[NAMELEN]; char studienfach[3]; }; typedef struct studenten stud; void bubblesort(stud sarr[], int x, int z) { //Sortieren sarr[z+1].matrikelnummer = sarr[x].matrikelnummer; sarr[x].matrikelnummer = sarr[x+1].matrikelnummer; sarr[x+1].matrikelnummer = sarr[z+1].matrikelnummer; strcpy(sarr[z+1].nachname,sarr[x].nachname); strcpy(sarr[x].nachname,sarr[x+1].nachname); strcpy(sarr[x+1].nachname,sarr[z+1].nachname); strcpy(sarr[z+1].vorname,sarr[x].vorname); strcpy(sarr[x].vorname,sarr[x+1].vorname); strcpy(sarr[x+1].vorname,sarr[z+1].vorname); strcpy(sarr[z+1].studienfach,sarr[x].studienfach); strcpy(sarr[x].studienfach,sarr[x+1].studienfach); strcpy(sarr[x+1].studienfach,sarr[z+1].studienfach); } int anzeigen(stud sarr [], int x){ //Anzeigen int i; int j; for (i = 0; i <= x - 2; i++) { for (j = 0; j <= x - 2; j++) { if (sarr[j].matrikelnummer > sarr[j+1].matrikelnummer) { bubblesort(sarr,j, x); } } } printf("\n\nMatrikelNr\t\tName\t\tVorname\t\tStudienfach\n"); printf("-------------------------------------------------------------------\n"); for(i=0; i <x; i++){ printf(" %8d %17s %18s %15s\n", sarr[i].matrikelnummer, sarr[i].nachname, sarr[i].vorname, sarr[i].studienfach); } printf("\n\nEs sind noch %d von %d Plaetze verfuegbar \n \n ", x=MAXSTUD-x, MAXSTUD); } int bearbeiten(stud sarr[],int *x){ //Bearbeiten int matrikelnummer=0; char line[LINELEN+1]; int index=-1; int anzahl = *x; int j=0; int i=0; char ende=0; char val; char exit=0; anzeigen(sarr, anzahl); while( !ende ){ printf("\n\n----------------------------\n"); printf("---------BEARBEITEN---------\n"); printf("----------------------------\n"); printf(" 1 (Eintrag Bearbeiten)\n"); printf(" 2 (Zurueck ins Hauptmenue)\n"); printf("----------------------------\n"); printf("\nEingabe: "); if( fgets( line, LINELEN, stdin ) == NULL ){ printf("Fehler in fgets()\n"); return -1; } if( sscanf( line, "%c", &val ) != 1 ){ printf("Fehler in sscanf()\n"); return -1; } switch ( val ){ case '1' : { printf("Welchen Eintrag moechten Sie bearbeiten?\n"); printf("Matrikelnummer: "); fgets(line, LINELEN, stdin); sscanf(line, "%d", &matrikelnummer); for(i=0; i<=anzahl; i++){ if (matrikelnummer==sarr[i].matrikelnummer){ index = i; } } if(index < 0) printf("\nMatrikelnummer nicht vorhanden!!\n"); if(index >=0){ printf("\nBitte geben Sie den Nachnamen ein: "); //Eingabe Nachname fgets(line,LINELEN, stdin); line[strlen(line)-1] = 0; strcpy(sarr[index].nachname, line); printf("\nBitte geben Sie den Vornamen ein: "); //Eingabe Vorname fgets(line,LINELEN, stdin); line[strlen(line)-1] = 0; strcpy(sarr[index].vorname, line); printf("\nBitte geben Sie das Studienfach ein: "); //Eingabe Studienfach fgets(line,LINELEN, stdin); sscanf(line, "%s", &sarr[index].studienfach); printf("\n\nDer Eintrag mit der Matrikelnummer %5d wurde erfolgreich bearbeitet!", matrikelnummer); } } break; case '2' : { printf("\n\nWollen Sie ins Hauptmenue zurueck? j/n \n"); printf("Wahl: "); fgets(line, LINELEN, stdin); sscanf (line, "%c", &exit); switch(exit) { case 'n': break; case 'N': break; case 'j': ende = 1; break; case 'J': ende = 1; break; default: printf("\n *** Falsche Eingabe ***\n"); } break; } default : printf("\nFalsche Eingabe!\n\n"); } } return 0; } int anlegen(stud sarr[], int x){ //Anlegen int i = x; int j; char line[LINELEN +1]; do { printf("\n\nBitte geben Sie die 5-Stellige Matrikelnummer ein: "); //Eingabe Matrikelnummer fgets(line, LINELEN, stdin); sscanf(line, "%d", &sarr[x].matrikelnummer); if (sarr[x].matrikelnummer < 10000 || sarr[x].matrikelnummer > 99999){ printf("Fehler: Matrikelnummer muss 5-Stellig sein!\n"); } for(j = 0; j< x; j++){ if(sarr[x].matrikelnummer == sarr[j].matrikelnummer){ printf("Matrikelnummer schon vorhanden!!\n"); sarr[x].matrikelnummer=1; } } } while(sarr[x].matrikelnummer < 10000 || sarr[x].matrikelnummer > 99999); printf("\nBitte geben Sie den Nachnamen ein: "); //Eingabe Nachname fgets(line,LINELEN, stdin); line[strlen(line)-1] = 0; strcpy(sarr[i].nachname, line); printf("\nBitte geben Sie den Vornamen ein: "); //Eingabe Vorname fgets(line,LINELEN, stdin); line[strlen(line)-1] = 0; strcpy(sarr[i].vorname, line); printf("\nBitte geben Sie das Studienfach ein: "); //Eingabe Studienfach fgets(line,LINELEN, stdin); sscanf(line, "%s", &sarr[i].studienfach); i++; return i; } int loeschen(stud sarr[], int *x){ //Loeschen int matrikelnummer=0; char line[LINELEN+1]; int index=-1; int anzahl = *x; int j=0; int i=0; char del=0; char ende=0; char val; char exit=0; int eingabe; anzeigen(sarr, anzahl); while( !ende ){ printf("\n\n----------------------------\n"); printf("----------LOESCHEN----------\n"); printf("----------------------------\n"); printf(" 1 (Eintrag loeschen)\n"); printf(" 2 (Zurueck ins Hauptmenue)\n"); printf("----------------------------\n"); printf("\nEingabe: "); if( fgets( line, LINELEN, stdin ) == NULL ){ printf("Fehler in fgets()\n"); return -1; } if( sscanf( line, "%c", &val ) != 1 ){ printf("Fehler in sscanf()\n"); return -1; } switch ( val ){ case '1' : { printf("\n\nWelchen Eintrag moechten Sie loeschen?\n"); printf("Matrikelnummer: "); fgets(line, LINELEN, stdin); sscanf(line, "%d", &matrikelnummer); for(i=0; i<=anzahl; i++){ if (matrikelnummer==sarr[i].matrikelnummer) index = i; } if(index < 0) printf("\nMatrikelnummer nicht vorhanden!!\n"); if(index >=0){ printf("\n\nWollen Sie den Eintrag wirklich loeschen? j/n \n"); printf("Wahl: "); fgets(line, LINELEN, stdin); sscanf(line, "%c", &del); switch(del) { case 'n': printf("Eintrag wurde nicht geloescht\n"); break; case 'N': printf("Eintrag wurde nicht geloescht\n"); break; case 'j': for(i= index; i<MAXSTUD; i++) sarr[i]=sarr[i+1]; (*x)--; printf("\nDer Eintrag mit der Matrikelnummer %5d wurde erfolgreich geloescht!", matrikelnummer); ende = 1; break; case 'J': for(i= index; i<MAXSTUD; i++) sarr[i]=sarr[i+1]; (*x)--; printf("\nDer Eintrag mit der Matrikelnummer %5d wurde erfolgreich geloescht!", matrikelnummer); ende = 1; break; default: printf("\n *** Falsche Eingabe ***\n"); } } } break; case '2' : { printf("\n\nWollen Sie ins Hauptmenue zurueck? j/n \n"); printf("Wahl: "); fgets(line, LINELEN, stdin); sscanf (line, "%c", &exit); switch(exit) { case 'n': break; case 'N': break; case 'j': ende = 1; break; case 'J': ende = 1; break; default: printf("\n *** Falsche Eingabe ***\n"); } break; } default : printf("\nFalsche Eingabe!\n\n"); } } return 0; } int main(){ //Mainfunktion char val='\0'; char line[ LINELEN+1 ]; int ende=0; char exit=0; int i = 0; int x = 0; stud sarr[MAXSTUD]; for(i=0; i<MAXSTUD; i++) sarr[i].matrikelnummer = 0; printf("\n\n\nStudierendenverwaltung (Vers. 1.1)\n"); while( !ende ){ printf("\n\n----------------------------\n"); printf("---------HAUPTMENUE---------\n"); printf("----------------------------\n"); printf(" 1 (Anzeigen)\n"); printf(" 2 (Bearbeiten)\n"); printf(" 3 (Neu anlegen)\n"); printf(" 4 (Loeschen)\n"); printf(" 5 (Programm beenden)\n"); printf("----------------------------\n"); printf("* Anzahl der Studenten: %d *\n", x); printf("\nEingabe: "); if( fgets( line, LINELEN, stdin ) == NULL ){ printf("Fehler in fgets()\n"); return -1; } if( sscanf( line, "%c", &val ) != 1 ){ printf("Fehler in sscanf()\n"); return -1; } switch ( val ){ case '1' : anzeigen(sarr, x); break; case '2' : bearbeiten(sarr, &x); break; case '3' : x = anlegen(sarr, x); break; case '4' : loeschen(sarr, &x); break; case '5' : { printf("\nWollen Sie wirklich beenden? j/n \n"); printf("Wahl: "); fgets(line, LINELEN, stdin); sscanf (line, "%c", &exit); switch(exit) { case 'n': break; case 'N': break; case 'j': ende = 1; break; case 'J': ende = 1; break; default: printf("\n *** Falsche Eingabe ***\n"); } break; } default : printf("\nFalsche Eingabe!\n\n"); } } printf("Programm beendet.\n"); return 0; }
-
Deine Codeformatierung ist echt hässlich. Deswegen antwortet dir hier auch (niemand) mehr. Es macht einfach keinen Spaß deinen Code zu lesen...
Inkonsequente Einrückung, etc.
Du musst folgendes machen:
Führe für alle bisher schon vergebenen Martikelnummern, egal ob durch das Programm oder manuell, eine Liste. Lege eine globale Variable an, initalisiere diese mit 1000. Erhöhe diese nun bei jedem nicht manuell angelegten Studierenden. Um eine Martikelnummer vorzuschlagen läufst du durch deine Liste und übeprüfst, ob diese Nummer schon vergeben ist. Wenn ja: Weiter ehöhen. Ansonsten: Vorschlagen.int Nummer = 1000;
anlegen(...) {
Solange Nummer noch nicht in Liste vorhanden ist {
Nummer++;
}Vorschlagen... etc...
}
So schwer sollte das nicht sein. Deine Liste könntest du als Array implentieren.
Viel Erfolg,
Blubbbb
-
Nice site!
-
int iMatrikel; scanf("%5i",&iMatrikel);
geht sowas nich?? kein plan kam mir in den sinn