Aufgabe: Studentenverzeichnis anlegen
-
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