Telefonbuch programmieren, brauche dringend Hilfe!



  • marcels87 schrieb:

    Wie funktionierrt denn das direkte Einlesen in die Struktur?

    Statt scanf("s", &Nachname) schreibst du scanf("s", &a.Nachname), so hast du ja auch ein mal selbst zugewiesen. Und wenns ein Array ist, dann eben &a[0].Nachname, wobei du 0 durch den jeweiligen gebrauchten Array-Index (Die Zeile, wenn du so willst) ersetzt.



  • Hmm, ich benutze scanf sogut wie gar nicht mehr in meinen Programmen. Wenn ich mich aber nicht irre sollte es

    scanf("%s", &a.nachname)
    //     ^
    

    heißen. Also eine Formatanweisung wie bei printf.
    Auch haben die Vorredner recht, daß du erstmal ein Tutorial oder Buch über C durcharbeiten solltest. Dein Code sieht noch nach recht unkoordinierten Sprachkenntnissen aus. Direkt danach solltest du dich dann mit "linked lists" befassen.



  • DAnke für die Antworten, das Problem ist aber, dass ich nicht die Zeit dafür habe, da ich das Programm morgen am laufen haben muss! Deswegen kann ich nicht ein kompletes Buch von vorne bis hinten durcharbeiten!

    Grüße

    Marcel



  • marcels87 schrieb:

    DAnke für die Antworten, das Problem ist aber, dass ich nicht die Zeit dafür habe, da ich das Programm morgen am laufen haben muss! Deswegen kann ich nicht ein kompletes Buch von vorne bis hinten durcharbeiten!

    Ist eine Hausaufgabe, ja? Ich schlage vor du postest noch einmal den akutellen Stand deines Programms und wir schauen dann mal drüber und helfen dir beim verbessern. Ich fahr jetzt zwar kurz weg, aber spätestens heute abend haste dann dein Programm beisammen.



  • Es ist ja nun einige Zeit vergangen seit dem du deinen Code hier
    vorgestellt hast. Hast du schon versucht was dein Compiler dazu
    sagt? Hast du Fehlermeldungen? Wenn ja konntest du welche abstellen?

    Willst du das Programm für jede Aktion neu starten oder willst
    du das noch in eine Schleife packen.

    Wenn du das bis morgen in den Griff kriegen willst, solltest du in
    die Tasten hauen. Keine 14h bis morgen um 8 😉



  • Also, bisher sieht mein Code folgendermassen aus!
    [/cpp]#include <stdio.h>
    #include <stdlib.h>
    #define TBSIZE 100

    typedef struct
    {
    int PLZ, Telnummer, Vorwahl;
    char Name[50], Vorname[50];
    int Tag, Monat, Jahr;
    }TEL[TBSIZE];

    int Aktion;

    TEL a;

    a.Name = Mustermann;
    a.Vorname = Max
    a.PLZ = 12345;
    a.Telnummer = 0;
    a.Tag = 19;
    a.Monat = 02;
    a.Jahr = 1987;

    int main(){

    printf("Dies ist ein Telefonbuch, bitte wählen Sie eine Aktion:\n");
    printf("1.Adresse hinzufügen\n");
    printf("2.Ausgabe der Adressen\n");
    printf("3.Löschen einer Adresse\n");
    printf("4.Löschen aller Adressen\n");

    scanf("d",Aktion);

    if(d==1){
    printf("Bitte geben Sie den Nachnamen ein!\n");
    scanf("s", &a.Nachname);
    printf("Bitte geben Sie den Vornamen ein!\n");
    scanf("s", &a.Vorname);
    printf("Bitte geben Sie die PLZ ein!\n");
    scanf("i", &a.PLZ);
    printf("Bitte geben Sie die Telefonnummer ein!\n");
    scanf("i", &a.Telnummer);
    printf("Bitte geben Sie den Tag des Geburtstags ein\n");
    scanf("i", &a.Tag);
    printf("Bitte geben Sie den Monat des Geburtstags als Zahl ein!\n");
    scanf("i", &a.Monat);
    printf("Bitte geb Sie das Geburtsjahr ein!\n");
    scanf("i",&a.Jahr);
    }

    void bubblesort(int *array, int length)
    {
    int i, j;
    for (i = 0; i < length; ++i) {
    for (j = 0; j < length - i - 1; ++j) {
    if (array[j] > array[j + 1]) {
    int tmp = array[j];
    array[j] = array[j + 1];
    array[j + 1] = tmp;
    }
    }
    }
    }

    Mehr habe ich leider nicht hinbekommen.
    Die Aufgabe selbst sieht so aus:

    Schreiben sie eine Telefonbuch Verwaltung, das Telefonbuch soll als Array der größe 100 erstellt
    werden. Hierbei sollen sie den neu erzeugten Datentyp TEL verwenden:
    Typedef struct
    {
    Int PLZ, Telnummer, Vorwahl;
    String Name, Vorname;
    Int Tag, Monat, Jahr
    }TEL;
    TEL a
    a.PLZ = 5;
    a.Telnummer = 0;
    a.Tag = 9;
    a.Monat = 11;
    a.Jahr = 1983;
    Im weiteren ermöglichen sie Folgendes Verwaltungsmöglichkeiten:
    · Einfügen
    · Ausgaben
    · Sortierten*
    · Löschen ein Element
    · Löschen alles
    Diese Möglichen Anwendungen sollen über jeweils eine eigene Funktion verfügen, das heiste sie
    stehen nicht alle in der Main Funktion. Dieses mal ist es nicht gestatte Globalevariable zu benutzen.
    Im Programm soll eine Variablen für die Anzahl vorhanden sein, die bei Einfüge- oder Löschoperation
    innerhalb der zuständigen Funktion verändert wird und anschliessend in die Main-Funktion zurück
    gegeben wird. Sie soll auch aus diese in die einzelnen Funktionen über geben werden.
    * Die Sortier Funtkion soll ein Bubblesort sein, der Sortieralgorithmus soll nach dem Namen sortieren

    Vielen Dank

    Marcel



  • Wie hast du dieses Forum gefunden?

    Auf die ( wahrscheinlich ) gleiche Art such mal nach

    scanf("d",Aktion);
    

    Damit wir schon mal da die Fehler heraus kriegen.
    Liest du denn immer noch nicht die Fehlermeldungen deines Compilers?

    Und, wenn du die geschweiften Klammer nach einem System setzen
    würdest, sähest du auch noch einige andere Ungereimtheiten.

    Mein Compiler sagt zu Zeile 56:

    c:56: warning: ISO C forbids nested functions
    

    Was denkst du will er dir damit sagen?

    Hau rein noch etwa 13h bis 8



  • Hi,
    also bis hier hin bin ich gekommen, Marcel,das könnte dir vllt etwas weiter helfen! Bis auf die Löschgeschichte funktioniert dort alles!

    Ich hoffe, dass hier im Forum uns geholfen wird. Ich bedanke mich schonmal im Vorraus!

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    static int x;
    
    typedef struct{
       char vname[30], nname[30], ort[30], geb[10];
       int PLZ,vwahl, tnummer;
    }  TEL;
    
    TEL liste[100];
    
    void Eingabe(int nr, TEL *neu)
    {
       printf("Vorname : ");
       fgets(neu[nr].vname, 30, stdin);
       printf("Nachname : ");
       fgets(neu[nr].nname, 30, stdin);
       printf("Postleitzahl: ");
       do
       {
         scanf("%d",&neu[nr].PLZ);
       } while(getchar()!= '\n');
       printf("Wohnort : ");
       fgets(neu[nr].ort, 30, stdin);
       printf("Geburtsdatum tt/mm/jjjj: ");
       do
       {
         scanf("%c",&neu[nr].geb);
       } while(getchar()!= '\n'); 
       printf("Vorwahl:");
       do
       {
         scanf("%d",&neu[nr].vwahl);
       } while(getchar()!= '\n');
       printf("Telefonnummer:");
       do
       {
         scanf("%d",&neu[nr].tnummer);
       } while(getchar()!= '\n');
    }
    
    void Ausgabe(TEL *all, int nr)
    {
       int i;
    
       for(i = 0; i < nr; i++)
       {
          printf("Vorname..................:%s",all[i].vname);
          printf("Nachname.................:%s",all[i].nname);
          printf("Postleitzahl.............:%d\n",all[i].PLZ);
          printf("Ort......................:%s\n",all[i].ort);
          printf("Geburtsjahr..tt.mm.jjjj..:%s\n",all[i].geb);
          printf("Vorwahl/Telnummer........:%d/%d,\n\n",all[i].vwahl,all[i].tnummer);
          printf("\n\tWeiter mit <Enter>\n\n");
          getchar();
       }
    }
    
    void Bubblesort(TEL *sort,int nr)
    {
       TEL *temp;
       int i,j;
    
       temp = (TEL *)malloc(sizeof(TEL *));
       if(NULL == temp)
       {
          printf("Konnte keinen Speicher reservieren ...\n");
          return;
       }
       for(i = 0; i < nr; i++)
       {
          for(j=i+1;j<nr;j++)
          {
             if(strcmp(sort[i].nname, sort[j].nname)>0)
             {
                *temp=sort[j];
                sort[j]=sort[i];
                sort[i]=*temp;
             }
          }
       }
       printf("... sortiert!!\n");
       printf("\n\tWeiter mit <Enter>\n\n");
       getchar();
    }
    
    void Loeschen(TEL *all,int nr)
    {
         int auswahl;
         printf("\n\n----------Loeschoptionen-----------\n\n");
         printf("Loeschen von einem Eintrag = 0\n");
         printf("Loeschen der gesamten Datenbank = 1\n");
         scanf("%d",&auswahl);
         switch(auswahl)
         {
    /*        case 1 : ???? ;    break;
              case 2 : ???? ;    break;*/ 
              default: break;
         }        
    }
    
    void Menue()
    {
       int auswahl;
       char c;
    
       do
       {
          printf("-1- Neuer Eintrag\n");
          printf("-2- Inhalte Loeschen\n");
          printf("-3- Alle Eintraege ausgeben\n");
          printf("-4- Eintraege sortieren\n");
          printf("-5- Programm beenden\n");
          printf("\nIhre Auswahl : ");
          scanf("%d",&auswahl);
          getchar();
          switch(auswahl)
          {
             case 1 : Eingabe(x++,liste);        break;
             case 2 : Loeschen(liste,x);         break;
             case 3 : Ausgabe(liste,x);          break;
             case 4 : Bubblesort(liste,x);       break;
             default: break;
          }
       } while(auswahl < 5);
    }
    
    int main(void)
    {
        Menue();
        return EXIT_SUCCESS;
    }
    


  • Danke für den Tipp!!!
    Okay, habe es jetzt in scanf("%d",Aktion); umgeändert, das muss ich dann also auch bei den nachfolgenden scans ändern stimmts?
    Bin mir aber nicht sicher, wie ich das Problem in Teile 59 lösen soll, ich habe den bubblesort-Befehl so vorgegeben bekommen!

    Grüße Marcel



  • marcels87 schrieb:

    Also, bisher sieht mein Code folgendermassen aus!
    [/cpp]#include <stdio.h>
    #include <stdlib.h>
    #define TBSIZE 100

    typedef struct
    {
    int PLZ, Telnummer, Vorwahl;
    char Name[50], Vorname[50];
    int Tag, Monat, Jahr;
    }TEL[TBSIZE];

    int Aktion;

    TEL a;

    a.Name = Mustermann;
    a.Vorname = Max
    a.PLZ = 12345;
    a.Telnummer = 0;
    a.Tag = 19;
    a.Monat = 02;
    a.Jahr = 1987;

    int main(){

    printf("Dies ist ein Telefonbuch, bitte wählen Sie eine Aktion:\n");
    printf("1.Adresse hinzufügen\n");
    printf("2.Ausgabe der Adressen\n");
    printf("3.Löschen einer Adresse\n");
    printf("4.Löschen aller Adressen\n");

    scanf("d",Aktion);

    if(d==1){
    printf("Bitte geben Sie den Nachnamen ein!\n");
    scanf("s", &a.Nachname);
    printf("Bitte geben Sie den Vornamen ein!\n");
    scanf("s", &a.Vorname);
    printf("Bitte geben Sie die PLZ ein!\n");
    scanf("i", &a.PLZ);
    printf("Bitte geben Sie die Telefonnummer ein!\n");
    scanf("i", &a.Telnummer);
    printf("Bitte geben Sie den Tag des Geburtstags ein\n");
    scanf("i", &a.Tag);
    printf("Bitte geben Sie den Monat des Geburtstags als Zahl ein!\n");
    scanf("i", &a.Monat);
    printf("Bitte geb Sie das Geburtsjahr ein!\n");
    scanf("i",&a.Jahr);
    }

    void bubblesort(int *array, int length)
    {
    int i, j;
    for (i = 0; i < length; ++i) {
    for (j = 0; j < length - i - 1; ++j) {
    if (array[j] > array[j + 1]) {
    int tmp = array[j];
    array[j] = array[j + 1];
    array[j + 1] = tmp;
    }
    }
    }
    }

    Mehr habe ich leider nicht hinbekommen.
    Die Aufgabe selbst sieht so aus:

    Schreiben sie eine Telefonbuch Verwaltung, das Telefonbuch soll als Array der größe 100 erstellt
    werden. Hierbei sollen sie den neu erzeugten Datentyp TEL verwenden:
    Typedef struct
    {
    Int PLZ, Telnummer, Vorwahl;
    String Name, Vorname;
    Int Tag, Monat, Jahr
    }TEL;
    TEL a
    a.PLZ = 5;
    a.Telnummer = 0;
    a.Tag = 9;
    a.Monat = 11;
    a.Jahr = 1983;
    Im weiteren ermöglichen sie Folgendes Verwaltungsmöglichkeiten:
    · Einfügen
    · Ausgaben
    · Sortierten*
    · Löschen ein Element
    · Löschen alles
    Diese Möglichen Anwendungen sollen über jeweils eine eigene Funktion verfügen, das heiste sie
    stehen nicht alle in der Main Funktion. Dieses mal ist es nicht gestatte Globalevariable zu benutzen.
    Im Programm soll eine Variablen für die Anzahl vorhanden sein, die bei Einfüge- oder Löschoperation
    innerhalb der zuständigen Funktion verändert wird und anschliessend in die Main-Funktion zurück
    gegeben wird. Sie soll auch aus diese in die einzelnen Funktionen über geben werden.
    * Die Sortier Funtkion soll ein Bubblesort sein, der Sortieralgorithmus soll nach dem Namen sortieren

    Vielen Dank

    Marcel

    <trollsuspicious activity detected at Sunday 15.02.09>



  • Yakup
    wenn du das laufen hast, prüfe
    das mit Postleitzahlen größer 33000
    und Telefonnummern größer 70000

    Ob da Fehler auftreten ist abhängig davon wie euer Compiler
    int umsetzt 😉



  • Hmm, das ist eigentlich nicht unser Problem^^... Es geht darum, wenn wir ein paar Daten eingegeben haben, diese wieder zu löschen. Einzeln und alles zusammen!



  • Hab C nie in der Schule gehabt 😉

    Das mit dem Löschen hört sich nach Speicherreservierung,
    Stichwort malloc ... an.

    MfG f.-th.



  • Du hast Recht...
    Naja mal überlegen, wo man nun Malloc einsetzt 🙂
    C haben wir seid 3 Monaten als nebenfach mit 2SWS ist nicht gerade viel...



  • Um alles zu löschen müssen wir das ganze Array löschen, habe dazu folgende Grundfunktion gefunden:

    void loeschen (int a[], int *anzahl, int index)
    {
      int anz = (*anzahl);
      int i;
      if (index < anz)
        {
          for (i = index + 1; i < anz; i++)
            a[i-1] = a[i];
          (*anzahl)--;
        }
    }
    


  • Das habe ich auch gefunden...
    Soweit ich das verstanden habe, ging es da darum, dass du z.B. 20 Arrays hast und du bei A[14] was löschst und die anderen Arrays ab A[14] wieder runterrutschen.
    Also das wäre um einzelne Arrays zu löschen, denke ich...



  • Yakup schrieb:

    Also das wäre um einzelne Arrays zu löschen, denke ich...

    Die Bestandteile eines Arrays nennen sich Elemente. Das Array ist die Sammlung dieser Elemente.



  • Danke für die Info. Aber zu unserem richtigen Problem kannst du nichts sagen oder?



  • So hier meine Version nehmt euch was ihr braucht. Ich hoffe ich hab nix vergessen und keine groben Fehler drin.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define TBSIZE      100     // Max Anzahl an Einträgen
    
    typedef struct
    {
        char Name[50];          // Name
        char Vorname[50];       // Vorname
        int PLZ;                // Postleitzahl
        int Telnummer;          // Telefonnummer
        int Vorwahl;            // Vorwahl
        int Tag;                // GeburtsTag
        int Monat;              // GeburtsMonat
        int Jahr;               // GeburtsJahr
    } TEL;
    
    void EintragHinzufuegen(TEL NeuerEintrag, TEL Telefonbuch[], int Anzahl)
    {
        strcpy(Telefonbuch[Anzahl].Name, NeuerEintrag.Name);
        strcpy(Telefonbuch[Anzahl].Vorname, NeuerEintrag.Vorname);
        Telefonbuch[Anzahl].PLZ = NeuerEintrag.PLZ;
        Telefonbuch[Anzahl].Telnummer = NeuerEintrag.Telnummer;
        Telefonbuch[Anzahl].Vorwahl = NeuerEintrag.Vorwahl;
        Telefonbuch[Anzahl].Tag = NeuerEintrag.Tag;
        Telefonbuch[Anzahl].Monat = NeuerEintrag.Monat;
        Telefonbuch[Anzahl].Jahr = NeuerEintrag.Jahr;
    }
    
    void EintragEingeben(TEL Telefonbuch[], int Anzahl)
    {
        TEL a;
    
        system("cls");
        printf("+===================================+\n");
        printf("|        Eintrag hinzufuegen        |\n");
        printf("+===================================+\n");
        printf("Name      : "); scanf("%s", &a.Name);
        printf("Vorname   : "); scanf("%s", &a.Vorname);
        printf("PLZ       : "); scanf("%d", &a.PLZ);
        printf("Telnummer : "); scanf("%d", &a.Telnummer);
        printf("Vorwahl   : "); scanf("%d", &a.Vorwahl);
        printf("Tag       : "); scanf("%d", &a.Tag);
        printf("Monat     : "); scanf("%d", &a.Monat);
        printf("Jahr      : "); scanf("%d", &a.Jahr);
    
        EintragHinzufuegen(a, Telefonbuch, Anzahl);
    }
    
    void ZeigeEintrag(TEL Eintrag)
    {
        printf("Name      : %s\n", Eintrag.Name);
        printf("Vorname   : %s\n", Eintrag.Vorname);
        printf("PLZ       : %d\n", Eintrag.PLZ);
        printf("Telnummer : %d\n", Eintrag.Telnummer);
        printf("Vorwahl   : %d\n", Eintrag.Vorwahl);
        printf("Tag       : %d\n", Eintrag.Tag);
        printf("Monat     : %d\n", Eintrag.Monat);
        printf("Jahr      : %d\n", Eintrag.Jahr);
    }
    
    void ZeigeTelefonbuch(TEL Telefonbuch[], int Anzahl)
    {
        int i;
    
        system("cls");
        printf("+===================================+\n");
        printf("|        Eintraege anzeigen         |\n");
        printf("+===================================+\n");
        if(Anzahl == 0)
        {
            printf("\nKeine Eintraege vorhanden!\n");
        }
        else
        {
            for(i = 0; i < Anzahl; i++)
            {
                printf("\nEintrag-Nummer: %d\n", i + 1);
                ZeigeEintrag(Telefonbuch[i]);
            }
        }
    
        getch();
    }
    
    void VertauscheEintraege(TEL *a, TEL *b)
    {
        TEL temp;
    
        memcpy(&temp, a, sizeof(TEL));
        memcpy(a, b, sizeof(TEL));
        memcpy(b, &temp, sizeof(TEL));
    }
    
    void SortiereTelefonbuch(TEL Telefonbuch[], int Anzahl)
    {
        int i, j;
    
        for(i = 0; i < Anzahl; i++)
        {
            for(j = 0; j < Anzahl - i - 1; j++)
            {
                if(strcmp(Telefonbuch[j].Name, Telefonbuch[j+1].Name) > 0)
                {
                    VertauscheEintraege(&Telefonbuch[j], &Telefonbuch[j+1]);
                }
            }
        }
    }
    
    void EintragLoeschen(TEL Telefonbuch[], int Anzahl)
    {
        char Name[50];
        int i, j;
    
        system("cls");
        printf("+===================================+\n");
        printf("|        Eintrag loeschen           |\n");
        printf("+===================================+\n");
        printf("Name: ");
        scanf("%s", &Name);
    
        for(i = 0; i < Anzahl; i++)
        {
            if(strcmp(Telefonbuch[i].Name, Name) == 0)
            {
                printf("\nEintrag gefunden:\n\n");
                ZeigeEintrag(Telefonbuch[i]);
                for(j = i; j < Anzahl; j++)
                {
                    VertauscheEintraege(&Telefonbuch[j], &Telefonbuch[j+1]);
                }
                printf("\nEintrag geloescht!");
    
                getch();
                return;
            }
        }
        printf("\nEintrag nicht gefunden!");
        getch();
    }
    
    int main()
    {
        TEL Telefonbuch[100];
        int Anzahl = 0;
        int Aktion = 0;
        int Laeuft = 1;
    
        // Fügt Max Mustermann dem Telefonbuch hinzu
        TEL a = {"Mustermann", "Max", 12345, 0, 0, 19, 02, 1987};
        EintragHinzufuegen(a, Telefonbuch, Anzahl);
        Anzahl++;
    
        while(Laeuft)
        {
            system("cls");
            printf("+===================================+\n");
            printf("|            Telefonbuch            |\n");
            printf("+===================================+\n");
            printf("|   [1]   Eintrag hinzufuegen       |\n");
            printf("|   [2]   Telefonbuch anzeigen      |\n");
            printf("|   [3]   Eintraege sortieren       |\n");
            printf("|   [4]   Eintrag loeschen          |\n");
            printf("|   [5]   Alle Eintraege loeschen   |\n");
            printf("|   [6]   Programm beenden          |\n");
            printf("+-----------------------------------+\n\n");
            Aktion = 0;
            while(Aktion < 1 || Aktion > 6)
            {
                printf("Bitte waehlen Sie eine Aktion (1-6): ");
                scanf("%d", &Aktion);
            }
    
            switch(Aktion)
            {
                case 1:
                    // EDIT: TODO testen ob ANzahl < MAXEINTRAEGE - 1  ist
                    EintragEingeben(Telefonbuch, Anzahl);
                    Anzahl++;
                    break;
                case 2:
                    ZeigeTelefonbuch(Telefonbuch, Anzahl);
                    break;
                case 3:
                    SortiereTelefonbuch(Telefonbuch, Anzahl);
                    break;
                case 4:
                    // EDIT: TODO testen ob ANzahl > 0 ist
                    //       TODO EintragLoeschen muß wert zurück geben ob ein
                    //            Eintrag geloescht wurde! und erst dann anzahl--
                    EintragLoeschen(Telefonbuch, Anzahl);
                    anzahl--;
                    break;
                case 5:
                    // EDIT: TODO testen ob ANzahl > 0 ist
                    Anzahl = 0;
                    break;
                case 6:
                    Laeuft = 0;
                    break;
            }
    
        }
        return 0;
    }
    


  • Wow, das sieht sogar sehr schön aus 🙂 Vielen Dank! Ich habs gerade getestet... es ist Fehlerfrei!


Anmelden zum Antworten