Telefonbuch programmieren, brauche dringend Hilfe!



  • Schau dir das Openbook C von A bis Z an. Das ist meiner Meinung nach eines der besten deutschsprachigen Tuts / Howtos oder wie auch immer.

    Der Abschnitt über Strukturen wäre dann wohl interessant für dich.

    Ansonsten natürlich der Standardspruch: google benutzen 🙂 (vielleicht kannst du dir auch bei Google Codesearch etwas "Inspiration" holen)



  • Habe bisher fogendes geschrieben, bin mir nicht sicher ob es korrekt ist. Wie kann ich nun die abgefragten Werte mit der Adressstruktur verbinden?

    #include <stdio.h>
    #include <stdlib.h>
    #define TBSIZE 100
    
    typedef struct
    {
    int PLZ, Telnummer, Vorwahl;
    char Name, Vorname;
    int Tag, Monat, Jahr;
    }TEL[TBSIZE];
    
    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", &Nachname);
                 printf("Bitte geben Sie den Vornamen ein!\n");
                 scanf("s", %Vorname);
                 printf("Bitte geben Sie die PLZ ein!\n");
                 scanf("i", &PLZ);
                 printf("Bitte geben Sie die Telefonnummer ein!\n");
                 scanf("i", &Telnummer);
                 printf("Bitte geben Sie den Tag des Geburtstags ein\n");
                 scanf("i", &Tag);
                 printf("Bitte geben Sie den Monat des Geburtstags als Zahl ein!\n");
                 scanf("i", &Monat);
                 printf("Bitte geb Sie das Geburtsjahr ein!\n");
                 scanf("i", &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;
    }
    }
    }
    }
    


  • du kannst direkt in die struktur-variablen einlesen



  • marcels87 schrieb:

    Habe bisher fogendes geschrieben, bin mir nicht sicher ob es korrekt ist. Wie kann ich nun die abgefragten Werte mit der Adressstruktur verbinden?

    #include <stdio.h>
    #include <stdlib.h>
    #define TBSIZE 100
    
    typedef struct
    {
    int PLZ, Telnummer, Vorwahl;
    char Name, Vorname;
    int Tag, Monat, Jahr;
    }TEL[TBSIZE];
    
    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", &Nachname);
                 printf("Bitte geben Sie den Vornamen ein!\n");
                 scanf("s", %Vorname);
                 printf("Bitte geben Sie die PLZ ein!\n");
                 scanf("i", &PLZ);
                 printf("Bitte geben Sie die Telefonnummer ein!\n");
                 scanf("i", &Telnummer);
                 printf("Bitte geben Sie den Tag des Geburtstags ein\n");
                 scanf("i", &Tag);
                 printf("Bitte geben Sie den Monat des Geburtstags als Zahl ein!\n");
                 scanf("i", &Monat);
                 printf("Bitte geb Sie das Geburtsjahr ein!\n");
                 scanf("i", &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;
    }
    }
    }
    }
    

    hast du das schon kompiliert? läuft gut, ja?



  • char Name, Vorname;
    

    Das hier sind Variablen vom Typ char (einzelnes Zeichen), nicht vom Typ char* (String). Du willst ja sicher die Namen nicht auf ein einzelnes Zeichen beschränken, ne? 😉 Das kannst du z.B. so machen:

    char Name[50], Vorname[50];  //es werden arrays of char (ein char-Array ist ein String) mit 50 Elementen angelegt
    
    scanf("d",Aktion);
    

    1. Wo bitteschön ist Aktion definiert?? Die Variable gibts nicht in deinem Code.
    2. Schau dir die Doku von scanf nochmal (bzw. überhaupt mal) an. Der Platzhalter, den du suchst, lautet "%d", nicht "d". Alle Platzhalter fangen mit einem Prozentzeichen an. So kommt da bestenfalls Müll raus. Ist dir das nicht aufgefallen? Es macht den Eindruch, als hättest du den Code selbst noch nicht ausprobiert.

    Es ist nicht gut, hier unvollständigen Code zu zeigen. Du machst ein if auf, dessen Ende zeigst du aber nicht. Wie soll man da vernünfig deinen Code analysieren, wenn du die Hälfte weglässt? Irrelenvanten Code wegkürzen ist gut, aber so zerstückelst du ja alles.

    Und arbeite an deiner Einrückung. Die Bubblesort-Funktion ist ja gar nicht eingerückt! Stell dir vor, du machst das bei Programmen, die ein wenig größer sind. Meinst du du hast dann noch den Überblick? Ich denke nicht... 😉



  • Danke für die Antworten!
    Da sieht man, dass ich wenig Ahnung von der Materie habe.
    Der abgebildete Code ist alles, eas ich bisher habe. Eie funktionierrt denn das direkte Einlesen in die Struktur?

    Viele Grüße

    Marcel



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


Anmelden zum Antworten