C: Aufgabe: Studentenverzeichnis anlegen

momo1986

Grünschnabel
Moin moin

ich bin neu hier.. =) wollt mal ganz lieb fragen ob sich jemand bereit erklären würde, mir bei ner kleinen Aufgabe für mein Studium zu helfen...


Die Aufgabe lautet wie folgt:

Erstellen Sie ein Programm stud zur - zugegebenermaßen sehr einfachen - Verwaltung von Studierenden. Das Programm soll folgenden Funktionsumfang besitzen:

  • Neu anlegen von Studierenden 5-stellige Matrikelnummer, Nachname, Vorname, Studienrichtungskürzel (2 Großbuchstaben), automatischer Vorschlag einer freien Matrikelnummer, keine Leerstrings
  • Bearbeiten/Ändern von Studierendendaten (Ändern von Matrikelnummer nicht möglich)
  • Löschen von erfassten Studierendendaten
  • Anzeigen aller erfassten Studierendendaten als Liste (Sortiert nach Matrikelnummer, zusätzliche Sortierkriterien: Name-Vorname-Matrikelnummer und Studienrichtung-Matrikelnummer)
Benutzungsoberfläche: Konsole mit Menüsteuerung (vgl. prototypische Implementierung im Anhang)

Wichtig:

• Übersetzbarkeit und Ausführbarkeit
• Robustheit
• Strukturierung des Codings
• Funktionalität
• Ergonometrie (Bedienbarkeit, benutzerfreundliche Menüführung etc.)

hab schonmal angfangen n bissel was zu machen.. das neun Anlegen und Anzeigen klappt immerhin schon :)

für Unterstützung übers Forum, ICQ oder MSN wär ich sehr sehr dankbar...

hier mal mein erster Ansatz:


C:
#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){ 
     int i;
 printf("MatrikelNr\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(" Es sind noch %d von %d Plaetze verfuegbar \n ", x=MAXSTUD-x, MAXSTUD);
} 

int bearbeiten(){
printf("bearbeiten\n");
}


int anlegen(stud sarr[], int x){
    
    int i = x;
    
char line[LINELEN +1];
printf("Bitte geben Sie die 5-Stellige Matrikelnummer ein:");
fgets(line,LINELEN, stdin);
sscanf(line, "%d", &sarr[i].matrikelnummer);
printf("Bitte geben Sie den Nachnamen ein:");
fgets(line,LINELEN, stdin);
sscanf(line, "%s", &sarr[i].nachname);
printf("Bitte geben Sie den Vornamen ein:");
fgets(line,LINELEN, stdin);
sscanf(line, "%s", &sarr[i].vorname);
printf("Bitte geben Sie das Studienfach ein:");
fgets(line,LINELEN, stdin);
sscanf(line, "%s", &sarr[i].studienfach);
i++;
return i;
} 


int loeschen(){
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\nStudierendenverwaltung (Vers. 1.1)\n"); 

 while( !ende ){ 
   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(" --> Azahl der Studenten: %d <-- \n", x);
   printf("Eingabe: "); 
   
   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' : ende=1; break; 
    default : printf("\nFalsche Eingabe!\n\n"); 
   } 

 } 

  printf("Programm beendet.\n"); 
return 0; 
}
]

bisschen was war vorgegeben.. den rest hab ich mir gemeinsam mit nem Kollegen erarbeitet...

Vielen Dank schonmal :)
 
Zuletzt bearbeitet:
ja und zwar der Punkt "Bearbeiten" und der Punkt "löschen"

ich krieg das irgendwie nich hin..

außerdem möchte ich bei der eingabe der Matrikelnummer das Feld auf 5 zeichen begrenzen..

wie mach ich das? =/
 
Also eigentlich hast du mit Anlegen und Ausgeben schon die grundlegenden Funktionen erstellt, die anderen beiden Funktionen wie Bearbeiten und Löschen kann man daraus indirekt ableiten.
Wählt der User "Bearbeiten" oder "Löschen" so würde ich die Funktion Anzeigen aufrufen, die du noch so modifizieren solltest das davor die Indizes des Arrays ausgegeben wird, damit der User nach der Ausgabe der Daten eine Nummer wählen kann die man bearbeiten oder löschen möchte.
Wählt der User also Bearbeiten und die zu bearbeitende Nummer (Indizes des Studenten) wurde eingegeben so rufst du nun anlegen(stud sarr[], int nummer) auf.
Somit wird der Eintrag überschrieben, du kannst natürlich optional sofern man nicht alles eingeben möchte sondern nur etwas noch ein Untermenü einbauen (so ähnlich wie dein Hauptmenü).
Beim Löschen dann den Eintrag mit 0 bzw leer lassen und optional das Array sortieren.
Aber mach erstmal so einfach wie möglich und waage dich dann an die Details heran.

Wenn die Matrikelnummer auf z.B. 5 Zeichen begrenzt sein soll so musst du es in der betreffenden Zeile angeben.

C:
printf("Bitte geben Sie die 5-Stellige Matrikelnummer ein:");
fgets(line,5, stdin);
fgets()

mfg;-)
 
na ich hab das jetzt mit einer do while schleife gelöst =)


und es schein zu klappen.. nur.. wie krieg ich da jetzt so ne kleine Fehlermeldung rein.. ich mein er akzeptiert jetzt nur noch 5 Stellige Zahlen aber ich will das da so ne Meldung kommt wie "Matrikelnummer muss 5 Stellig sein".. außerdem hab ich das Problem dass jede Matrikelnummer nur 1 mal vorkommen darf.. also brach ich einen Hinweis, das die Matrikelnummer schon vorhanden ist und am besten einen Vorschlag für eine noch nicht vorhandene Matrikelnummer :D


hier mal mein aktueller code:

C:
#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){ 
     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(){
printf("bearbeiten\n");
}


int anlegen(stud sarr[], int x){
    
    int i = x;
   

char line[LINELEN +1]; 
int matrikelnr; 

do { 

printf("\n\nBitte geben Sie die 5-Stellige Matrikelnummer ein:");
   gets(line); 
   matrikelnr = atoi(line); 
} while( matrikelnr < 10000 || matrikelnr > 99999); 
sarr[x].matrikelnummer = matrikelnr;
printf("\nBitte geben Sie den Nachnamen ein:");
fgets(line,LINELEN, stdin);
line[strlen(line)-1] = 0;
strcpy(sarr[i].nachname, line);
printf("\nBitte geben Sie den Vornamen ein:");
fgets(line,LINELEN, stdin);
line[strlen(line)-1] = 0;
strcpy(sarr[i].vorname, line);
printf("\nBitte geben Sie das Studienfach ein:");
fgets(line,LINELEN, stdin);
sscanf(line, "%s", &sarr[i].studienfach);
i++;
return i;
} 


int loeschen(){
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; 
}
 
so Leute.. ich bín schon n gutes Stück weiter gekommen :)

bin echt stolz auf mich :D

also das Problem ob die Matrikelnummer schon vorhanden ist, hab ich hinbekommen, jedoch die "Vorschlagsfunktion" noch nicht.. hat jemand nen tipp?

außerdem müssten díe angelgten Daten nach Matrikelnummer, sowie nach Name-Vorname-Matrikelnummer und Studienrichtung-Matrikelnummer sortiert werden..

irgendwelche Tipps? =/

C:
#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;



int 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(stud sarr[],int *x){                                                     //Bearbeiten

int matrikelnummer=0; 
     
char line[LINELEN+1];
int index=0;
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;
            }
            
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);


}    
    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){                                                     //Löschen                                                                  
int matrikelnummer=0; 
     
char line[LINELEN+1];
int index=0;
int anzahl = *x;
int j=0;
int i=0;
char del=0;
char ende=0;
char val;
char exit=0;

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;
            }

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': break; 
        case 'N': break; 
        case 'j': ende = 1; 
                  break; 
        case 'J': ende = 1; 
                  break;
        default: printf("\n *** Falsche Eingabe ***\n"); 
                          } 

   {
          for(i= index; i<MAXSTUD; i++)
          sarr[i]=sarr[i+1];
          (*x)--;
          }
          
printf("\nDer Eintrag mit der Matrikelnummer %5d wurde erfolgreich geloescht!", matrikelnummer);    
}
    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("** 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(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; 
}
 
Zurück