Telefonbuch programmieren, brauche dringend Hilfe!



  • 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!



  • Nein ... Ich hab ein paar edits reingehauen ... ihr müßt jeweils über Anzahl testen, ob die Operationen erlaubt sind.

    EDIT: die bessere Version http://pastie.org/389991



  • vielen Dank.. das läuft einwandfrei



  • Seid ihr alle 3 Leute die gleiche Person?! Ihr solltet das Programm vllt jeder ein wenig anders machen, da das sonst schon arg auffällt.

    Nur noch zur Info. Nur die verbesserte Version auf pastie löst die Aufgabe so wie sie gestellt wurde. Es wurde verlangt, daß die Anzahl der Einträge in den einzelnen Funktionen geändert wird und nicht in der main. Die erste Version macht das nicht. Nur die verbesserte Version testet und erfüllt die Aufgabe so wie sie gestellt wurde.



  • Das spielt keine Rolle. Hauptsache das Programm laeuft und wir können erklären, wie was funktioniert.


Anmelden zum Antworten