Aufgabe: Studentenverzeichnis anlegen
-
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:
#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]; //do{ printf("Bitte geben Sie die 5-Stellige Matrikelnummer ein:"); fgets(line,LINELEN, stdin); //}while(line <10000 || line>99999); 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
-
Hi momo1986!
Inwiefern erwartest du denn Unterstützung wenn die Frage gestattet ist?
Brauchst du nur Tipps oder eher praktische Hilfe?
Wo genau liegt das Problem denn?
-
wie wärs mit beidem? *g*
z.b. ne erste Frage wäre:
Die Matrikelnummer soll aus 5 Ziffern bestehen... wie begrenze ich die Eingabe auf diese 5 Stellige Zahl... theoretisch ja größer 10000 und kleiner 99999hab das mal mit ner While schleife probiert aber die hab ich wieder auskommentiert..
-
momo1986 schrieb:
Die Matrikelnummer soll aus 5 Ziffern bestehen... wie begrenze ich die Eingabe auf diese 5 Stellige Zahl... theoretisch ja größer 10000 und kleiner 99999
Du könntest dafür sorgen, dass Werte außerhalb des gültigen Bereichs abgelehnt werden. Theoretisch könntest du zur Speicherung auch ein char Array der Länge 5 (oder 6) nehmen.
PS: Mit den C/C++ Tags würde dein Code viel schöner formatiert werden.
-
Aber gerne doch ! *grins back*
Die Schleife stimmt ja eigentlich soweit ich sehen kann...
Was geht da nicht?
-
Achja doch!
Hab den Bug!
[code] [b]char[/b] line[LINELEN +1]; // ... }while(line < [b]10000[/b] || line > [b]99999[/b]); [/code]
Du kannst eine char-Variable schlecht auf Zahlwerte prüfen!
Sowas geht ganz ganz schlecht!
Änder das doch mal.
-
naja wenn ich das Prog so ausführe mit der do-While Schleife,
dann werd ich egal was ich als Matrikelnummer eingebe immerwieder nach der Matrikelnummer gefragt..
meine nächsten probleme wären die Punkte Bearbeiten und Löschen
edit:
wie änder ich das denn am besten
-
Ich glaub, das wird ne langwierige Sache.
Aber ich gucks mir mal an und morgen schau ich, dass ichs wieder reinposte.
-
wow das wär super nett
es eilt ja nicht.. lass dir ruhig zeit
-
Was er damit sagen wollte: Du vergleichst in der Bedigung der Schleife line (Typ char*) mit ints - quasi ein Vergleich von Äpfeln mit Birnen.
Sowas würde man eher so machen:
char foo[100]; int bar; do { gets(foo); bar = atoi(foo); } while(bar < 10000 || bar > 99999); printf(">>%s\n", foo);
-
hmm ich kriegs grad echt nich hin
ich muss dazu sagen das ich noch n echter C bzw Programmier n00b bin xD
-
Macht doch nix.
Ich programmier C auch erst seit ungefähr einem Jahr.
Niemand erwartet, dass du als Anfänger Wunder vollbringst.Also mach dir nix draus.
Aber merk dir eins: Programmieren lernt man nur, indem man Programm schreibt.P.S.: Hast mal Lust auf ein gemeinsames Projekt?
-
würd mich grad voll reitzen ja aber hab in 3 Wochen Klausuren und komm grad nich vor 4-5 nach hause und muss mich noch auf meine Klausuren vorbereiten..
zur Zeit hab ich echt Zeitnot.. aber nach den 3 Wochen könnten wir das ganze vllt angehen.. wie hast du dir das vorgestellt?
-
Na da wittere ich doch schon die nächste MMORPG Ankündigung im Projekte Forum.
-
na ich wär eigentlich erstmal voll zufrieden wenn ich DAS Projekt fertig stellen könnte
char foo[100]; int bar; do { gets(foo); bar = atoi(foo); } while(bar < 10000 || bar > 99999); printf(">>%s\n", foo);
wie soll ich denn das jetzt in die Codierung einbinden?
wenn ich das so mach wie ich mir das vorgestellt hatte klappts nich... ich krieg immerwieder die gleiche Frage
-
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!