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-Matrikelnummer

    der 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
    usw

    die 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


Anmelden zum Antworten