IltisvdT Geschrieben 2. Dezember 2010 Geschrieben 2. Dezember 2010 Hi, wir haben die Aufgabe gekriegt ein Programm zu schreiben, das der Mitgliedsverwaltung dient. In der Aufgabe steht: Es sollen immer nu Pointer auf den jeweiligen Eintrag übergeben werden. Wir haben bisher das: #include <stdio.h> struct { char Vorname[40]; char Nachname[40]; int Nummer; int Telefon; }mitglied; void ausgabe() { printf("%s",mitglied.Vorname); } void eingabe() { printf("Geben Sie den Vornamen ein"); gets(mitglied.Vorname); } int main() { int a; while(a!=0) { printf("Willkommen im Mitgliedsverzeichnis\n"); printf(":----------------------------------------\n"); printf("Aus Gruenden des Datenschutzes werden\n"); printf("keine Eintraege dauerhaft gespeichert.\n"); printf(":----------------------------------------\n\n"); printf("1. Ausgabe eines vorhandenen Eintrages\n"); printf("2. Anlegen eines neuen Eintrages\n"); printf("0. Beenden\n"); printf("Eingabe:"); scanf("%d",&a); switch(a) { case 0: { return(0); break; } case 1: { ausgabe(); break; } case 2: { eingabe(); break; } } } } Wir haben erstmal das nur mit Vorname gemacht um die Funktionsweise zu probieren. Und natürlich geht es nciht. Wenn man die 2 wählt, um einen Eintrag zu erstellen schreibt er zwar, dass man den Vornamen eingeben soll, printet dann aber sofort wieder das "Hauptmenü". Scheinbar klappt die Eingabe schon und das ausgeben lassen, er macht nur zu oft dieses Menü. Zweites Problem: Wo soll man da denn Zeiger einbauen? Vielen vielen Dank schonmal Zitieren
Klotzkopp Geschrieben 2. Dezember 2010 Geschrieben 2. Dezember 2010 Wir haben erstmal das nur mit Vorname gemacht um die Funktionsweise zu probieren. Und natürlich geht es nciht. Wenn man die 2 wählt, um einen Eintrag zu erstellen schreibt er zwar, dass man den Vornamen eingeben soll, printet dann aber sofort wieder das "Hauptmenü".Das liegt daran, dass gets zuerst den Zeilenumbruch aus dem Eingabepuffer holt, den scanf dort liegengelassen hat. gets solltest du übrigens nicht verwenden. Diese Funktion ist unsicher. Nimm fgets. Zweites Problem: Wo soll man da denn Zeiger einbauen?Das sollte sich von selbst ergeben, sobald du von deinem einzigen globalen Eintragsobjekt wegkommst. Erstens sollst du mit Sicherheit keine globalen Variabeln verwenden, und zweitens kann man mit einem einzelnen Strukturobjekt nicht viel verwalten. Zitieren
IltisvdT Geschrieben 4. Dezember 2010 Autor Geschrieben 4. Dezember 2010 es hat sich noch nciht viel verändert, aber es sieht mittlerweile so aus: #include <stdio.h> struct { char Vorname[40]; char Nachname[40]; char Nummer[40]; char Telefon[40]; }mitglied; void ausgabe() { printf("%s",mitglied.Vorname); printf("%s",mitglied.Nachname); printf("%s",mitglied.Nummer); printf("%s",mitglied.Telefon); } void eingabe() { printf("Geben Sie den Vornamen ein\n"); fgets(mitglied.Vorname, 40, stdin); printf("Geben Sie den Nachnamen ein\n"); fgets(mitglied.Nachname, 40, stdin); printf("Geben Sie die Mitgliedsnummer ein\n"); fgets(mitglied.Nummer,40,stdin); printf("Geben Sie die Telefonnummer ein\n"); fgets(mitglied.Telefon,40,stdin); } int main() { int a; while(a!=0) { printf("Willkommen im Mitgliedsverzeichnis\n"); printf(":----------------------------------------\n"); printf("Aus Gruenden des Datenschutzes werden\n"); printf("keine Eintraege dauerhaft gespeichert.\n"); printf(":----------------------------------------\n\n"); printf("1. Ausgabe eines vorhandenen Eintrages\n"); printf("2. Anlegen eines neuen Eintrages\n"); printf("0. Beenden\n"); printf("Eingabe:"); scanf("%d",&a); switch(a) { case 0: { return(0); break; } case 1: { ausgabe(); break; } case 2: { eingabe(); break; } } } } Leider habe ich keine Idee, wie ich diesen Zeilenumbruch vom scanf wegkriegen soll. Habe schon einiges durchprobiert, aber da diese Auswahl mit 1,2 und 0 vorgegeben ist, schränkt das für mich das ziemlich ein. Zu den Pointern. Es kann vllt sein, dass ich noch nciht so ganz gerafft habe, wozu die gut sind. Aber ich habe mich auch schon gefragt, wie ich denn bei meinem Programm mehrere Einträge speichern soll, und das geht wahrscheinlich damit, richtig? Könnte das jemand vllt in kurze Worte fassen? Habe Wikipedia und so gelesne, aber das is mir etwas zu abstrakt. Es fällt mir sicher leichter zu verstehen, wenn ich das auf (m)ein Beispiel bezogen erklärt kriege. Vielen Dank schonmal Zitieren
Gkar Geschrieben 4. Dezember 2010 Geschrieben 4. Dezember 2010 Leider habe ich keine Idee, wie ich diesen Zeilenumbruch vom scanf wegkriegen soll. Versuch es mal mit einem fflush (stdin) nach dem scanf() ... das sollte dir eigentlich den Puffer leeren und damit auch den verbliebenen Zeilenumbruch entfernen. Zitieren
Klotzkopp Geschrieben 4. Dezember 2010 Geschrieben 4. Dezember 2010 Versuch es mal mit einem fflush (stdin)Das ist nicht portabel und funktioniert nur mit einigen Windows-Compilern. Besser ist es, in einer Schleife solange getchar aufzurufen, bis es den Zeilenumbruch zurückliefert. Zitieren
Klotzkopp Geschrieben 4. Dezember 2010 Geschrieben 4. Dezember 2010 Aber ich habe mich auch schon gefragt, wie ich denn bei meinem Programm mehrere Einträge speichern soll, und das geht wahrscheinlich damit, richtig?Es gibt mehrere Möglichkeiten, das zu tun. Du brauchst eine passende Datenstruktur, z.B. ein Array oder eine Liste. Offenbar sollst du für diese Aufgabe bereits in der Lage sein, so etwas zu benutzen. Sagt dir malloc etwas? Zitieren
IltisvdT Geschrieben 5. Dezember 2010 Autor Geschrieben 5. Dezember 2010 Die schleife mit dem getchar ist gut. Das hast du mir ja schonmal geraten. Das werd ich auf jeden Flal nun ncihtmehr fragen. Habe jetzt grade nochmal ne 3/4 Stunde mich über Pointer informiert. Jetzt weiß ich was die machen. Aber dann versteh ich die Aufgabe nicht zum einen und verstehe nicht, wo die Sinn machen würden. Und malloc hatten wir noch nicht. Du sagst, ich brauche dafür ein Array oder eine Liste. So, dass dann jeder Mitgliedseintrag ein Eintrag in einer Liste ist, oder wie kann ich mir das vorstellen? Zitieren
Klotzkopp Geschrieben 5. Dezember 2010 Geschrieben 5. Dezember 2010 Und malloc hatten wir noch nicht. Du sagst, ich brauche dafür ein Array oder eine Liste. So, dass dann jeder Mitgliedseintrag ein Eintrag in einer Liste ist, oder wie kann ich mir das vorstellen?Genau. Ohne malloc hast du aber nicht die Möglichkeit, solche Datenstrukturen dynamisch zu verwalten. Ohne malloc bleibt dir nur die Möglichkeit, ein Array mit vorher festgelegter Größe anzulegen, und dieses nach und nach zu füllen. Zitieren
IltisvdT Geschrieben 5. Dezember 2010 Autor Geschrieben 5. Dezember 2010 Ich überlege grade, ob man das überhaupt muss. Würdest du die Aufgabe so verstehen? Erstellen Sie ein Programm, welches die Mitglieder eines Vereins verwaltet. Definieren Sie für die Mitgliedseinträge eine geeignete Struktur (bestehend aus Vorname, Nachname, Mitgliedsnummer und Telefonnummer). Schreiben Sie dann eine Funktion mit der Aufgabe, per Dialog einen Mitgliedseintrag auszufüllen und eine andere Funktion, die für die Ausgabe eines einzelnen Eintrags zuständig ist. Hier sollen selbstverständlich immer nur Pointer auf den jeweiligen Eintrag übergeben werden. Im Hauptprogramm gibt es ein Menü, in dem man die jeweiligen Funktionalitäten und Einträge auswählen kann. Kann man so verstehen, muss man aber nciht, oder? Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.