Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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.
Geschrieben

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

Geschrieben

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.

Geschrieben
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.

Geschrieben
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?
Geschrieben

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?

Geschrieben
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.
Geschrieben

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?

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...