telbuch c++



  • Re: Hilfe Telefonbuch
    hallo zusammen ,
    ich habe diese Aufgabe: Eine Matrix soll ein Telefonbuch repräsentieren. Die Elemente der Matrix sind Datensätze bestehend aus dem Familiennamen, Vornamen und einer Telefonnummer. Jede Matrixzeile enthält 5 solcher Einträge.
    wie kann ich die Einträge einlessen und dann in der matrix speichern ?
    struct Eintrag
    {
    char familienname[30];
    char vorname[30];
    int telfonnummer;
    };
    Eintrag personal[30];
    int anzahl=0; Eintrag telbuch[i][j];
    for(int i=0; i<anzahl;i++)
    {
    for (int j=0;j<5;j++)
    {
    telbuch[i][j]=personal[i][j].familienname ,personal[i][j].vorname ,personal[i][j].telefonnummer; // hier finde ich die schwerigkeit
    cin>>telbuch[i][j];
    }
    }



  • @laroj sagte in telbuch c++:

    Eine Matrix

    ???

    struct Eintrag
    {
    char familienname[30];
    char vorname[30];
    int telfonnummer;
    };
    Eintrag personal[30];
    

    Bis auf die falschen Datentypen in Eintarg sieht das doch nach einem Telefonbuch aus.

    Versuch mal, 0171... als Telefonnummer zu speichen und wieder zu lesen.

    C++:

    1. verwende std::string, nicht char-Arrays.
    2. verwende std::vector statt C-Array


  • @manni66
    hallo manni66,
    danke für ihre tipp
    und was soll ich hier noch ändern
    telbuch [i][j]=personal[i][j].familienname,....


  • Mod

    Im Prinzip statt:

    telbuch[i][j]=personal[i][j].familienname ,personal[i][j].vorname ,personal[i][j].telefonnummer; // hier finde ich die schwerigkeit
    cin>>telbuch[i][j];
    

    so etwas wie

    cin >> personal[i][j].familienname >> personal[i][j].vorname >> personal[i][j].telefonnummer;
    

    Bloß, dass das wieder nicht zu der Definition von personal passt. Denn das eigentliche Problem ist, dass nichts in deinem Programm zueinander passt. Da ich gerade sehe, dass manni66 schon eine genauere Erklärung als Antwort gegeben hat, spare ich mir diese.

    Ratschlag:
    Wichtig ist erst einmal ein korrektes Datenmodell. Dein struct Eintrag hat die richtige Idee, aber ist technisch falsch umgesetzt, siehe manni66s Antwort. Darüber hinaus ist halt unklar, was in deinem Programm was sein soll. Was soll personal sein? Es sieht aus wie ein Telefonbuch, heißt aber nicht so. Es gibt eine Variable telefonbuch, aber die wird nirgends definiert. Was soll überhaupt an einem Telefonbuch eine Matrix sein? Also: Erst einmal aufräumen!



  • @SeppJ
    hallo seppJ,
    eigentlich die Aufgabe ist noch lang:
    Eine Matrix soll ein Telefonbuch repräsentieren. Die Elemente der Matrix sind Datensätze bestehend aus dem Familiennamen, Vornamen und einer Telefonnummer. Jede Matrixzeile enthält 5 solcher Einträge.

    Realisieren Sie menügesteuert folgende Funktionalitäten:

    Einfügen eines neuen Telefonbucheintrages. Dabei sollen die benötigten Daten von der Tastatur aus eingelesen werden. Danach soll der eingegebene Nachname mit Hilfe einer C++-Funktion „hashing“, die die oben beschriebene Wirkungsweise realisiert, auf die Menge von 26 Zahlen (0...25) abgebildet werden. Die sich ergebende Zahl soll als Zeilenindex der „Telefonmatrix“ interpretiert werden. Wenn in der betreffenden Zeile noch mindestens ein Eintrag frei ist, so sind die eingegebenen Werte dorthin zu kopieren, anderenfalls geschieht nichts. Der Nutzer ist über den Erfolg des Eintragens zu informieren.

    Suchen eines Telefonbucheintrages. Dabei soll ein Nachname von der Tastatur eingelesen werden. Auf diesen ist wiederum die C++-Funktion „hashing“ anzuwenden, im resultierenden Zeilenindex ist nach dem Namen zu suchen. Der Nutzer erhält als Antwort auf die Suchanfrage alle gespeicherten Werte bezüglich des eingegebenen Nachnamens oder aber die Nachricht, dass ein solcher Name nicht gespeichert ist.

    Das Menü soll mindestens 10 mal aufgerufen werden



  • @laroj

    Dus sollst also eine Hashtabelle machen. Das bedeutet insbesondere, dass du die Einträge nicht mit ineiander verschachtleten for-Schleifen einlesen sollst.

    Eintrag telefonbuch[26][5];
    

    Einfügen eines neuen Telefonbucheintrages:

    1. die benötigten Daten von der Tastatur aus einlesen
    2. auf diesen die C++-Funktion „hashing“ anwenden
    3. die sich ergebende Zahl als Zeilenindex der „Telefonmatrix“ interpretieren
    4. wenn in der betreffenden Zeile noch mindestens ein Eintrag frei ist: Werte dorthin zu kopieren, sonst geschieht nichts
    5. Nutzer über den Erfolg des Eintragens informieren


  • @manni66
    gutentag
    ich habe das programm geschrieben und Ihre Anweisung befolgt ,aber immer noch nicht das gewünschte Ergebnis erzielt😕 .
    können Sie mie weiterhelfen
    #include<iostream
    #include<string>>
    using namespace std;
    struct Eintrag // Eintrag für eine person mit nachname und vorname und tel.nummer
    {
    string familienname;
    string vorname;
    int telefonnummer;
    };
    int hashing(string familienname) //hashfunktion bezugnehmend auf familienname, welcher einen bestimmten wert zuruekgibt
    {
    int hashwert=(familienname[0]*100 +familienname[1]*10 +familienname[2])%26;
    return hashwert;
    }
    int main()
    {

    Eintrag telbuch[26][5];
    int i,j;
    int r=0;
    char eingabe ='0';
    while (r<10) // das menü soll midesten 10 mal aufgerufen werden
    {
    cout<<"1:telefonbuch inistailisieren"<<endl;
    cout<<"2:einfügen einen neuen telbucheintrag"<<endl;
    cout<<"3:nach einen eintag in telbuch suchen"<<endl;
    cin>>eingabe;
    switch(eingabe)
    {
    case '1':
    {
    for(int i=0;i<26;i++)
    {
    for(int j=0;j<5;j++)
    {
    telbuch[i][j].familienname =" ";
    telbuch[i][j].vorname=" ";
    telbuch[i][j].telefonnummer=0;
    }

            }
            break;
        }
        case '2':
        {
            string nfamilienname;
            string nvorname;
            int ntelefonnummer;
            for(int i=0;i<26;i++)
            {
                for(int j=0;j<5;j++)
                {
            if (nfamilienname.length()>=3) //prüfen ob die familienname mindesten 3 zeichen eingegeben wurde
            {
            cin>>nfamilienname>>nvorname>>ntelefonnummer;
            i=hashing(nfamilienname);
            
            while(telbuch[i][j].familienname==" " & telbuch[i][j].vorname==" " & telbuch[i][j].telefonnummer==0)
            {
                telbuch[i][j].familienname = nfamilienname;
                telbuch[i][j].vorname= nvorname;
                telbuch[i][j].telefonnummer=ntelefonnummer;
            }
            }
            else 
            cout<<"familinname ist kurz"<<endl;
                }
            }
            
            cout<<"eingabe korrekt"<<endl;
            
            break;
        }
        case '3': //nach Einträger im telefonbuch suchen
        {
            string suchname;
            cout<<"geben sie die suchname :";
            cin>>suchname;
            int suchname_index=-1;
            int fach =hashing(suchname);
            for(int i=0;i<26;i++)
            for(int j=0;j<5;j++)
            {
                if(hashing(telbuch[i][j].familienname)==hashing(suchname))
                suchname_index=i;
                if (suchname_index != -1)
                {
                    if(suchname_index<i-1)
                    {
                        cout<<"Eintrag gefunden:"<<endl;
                        cout<<"familienname: "<<telbuch[suchname_index][j].familienname<<endl;
                        cout<<"vorname: "<<telbuch[suchname_index][j].vorname<<endl;
                        cout<<"telefonnummer: "<<telbuch[suchname_index][j].telefonnummer<<endl;
                        
                    }
                    i--;
                }
                else
                cout<<"keine eintrag mit diesem name gefunden"<<endl;
            }
        }
        break;
        default:
        cout<<"fehlereingabe! bitte auswahl wiederholen "<<endl;
    }
    r++;
    

    }

    return 0;
    

    }



  • @laroj sagte in telbuch c++:

    Anweisung befolgt

    Nein

    1. die Telefonnummer ist immer noch int
    2. beim Einfügen werden immer noch die zwei ineinander geschachtelten for-Schleifen verwendet, die jetzt auch noch eine zusätzliche while-Schleife beinhalten

    Es ist sinnlos die Eingabelänge zu prüfen, bevor etwas eingegeben wurde.

    nicht das gewünschte Ergebnis erzielt ist keine Fehlerbeschreibung.

    Benutze einen Debugger und schau dir an, was das Programm macht.



  • @manni66
    meinen Sie das telefonnummer muss string sein ,
    und muss ich zu erst eine matrix bilden und dann die einträge einlessen,
    Und dann einen neuen eintrag hinzufügen
    Und dann prüfen ob einen Platz in matrix noch frei ist dann diese eintrag dort kopieren



  • @laroj sagte in telbuch c++:

    meinen Sie das telefonnummer muss string sein ,

    Ja

    und muss ich zu erst eine matrix bilden und dann die einträge einlessen,
    Und dann einen neuen eintrag hinzufügen
    Und dann prüfen ob einen Platz in matrix noch frei ist dann diese eintrag dort kopieren

    Das verstehe ich nicht. Was zu tun ist habe ich oben aufgelistet. Die „Matrix“ muss nicht initialisiert werden.



  • @manni66
    hallo ich hab den programm nochmal geschrieben
    können Sie mir zeigengen was soll machen in case 2,
    also wie kann ich prüfen ob in der betreffende zeile mindestens ein eintrag frei ist
    und dort die gegebene werte dort speichern
    #include<iostream>
    #include<string>
    using namespace std;
    struct Eintrag // Eintrag für eine person mit nachname und vorname und tel.nummer
    {
    string familienname;
    string vorname;
    string telefonnummer;
    };
    int hashing(string familienname) //hashfunktion bezugnehmend auf familienname, welcher einen bestimmten wert zuruekgibt
    {
    int hashwert=(familienname[0]*100 +familienname[1]*10 +familienname[2])%26;
    return hashwert;
    }
    int main()
    {
    int anzahl =0;
    Eintrag telbuch[26][5];
    int i,j;
    int r=0;
    char eingabe ='0';
    while (r<10) // das menü soll midesten 10 mal aufgerufen werden
    {
    cout<<"1:telefonbuch anzeigen"<<endl;
    cout<<"2:einfügen einen neuen telbucheintrag"<<endl;
    cout<<"3:nach einen eintag in telbuch suchen"<<endl;
    cin>>eingabe;
    switch(eingabe)
    {
    case '1':
    {
    cout<<"geben Sie die familienname & vorname &telefonnummer ein"<<endl;
    for(int i=0;i<26;i++)
    {
    for(int j=0;j<5;j++)
    {
    cin>>telbuch[i][j].familienname>>telbuch[i][j].vorname>>telbuch[i][j].telefonnummer;
    }

            }
            if(telbuch[i][j].familienname.length()>=3)
            {
                for (int i=0; i<26; i++)
                for (int j=0; j<5; j++)
                {
                    i=hashing (telbuch[i][j].familienname);
                    cout << telbuch[i][j]; // und hier gebt es etwas falsch ,kannst Du mir beibringen
                }
            }
            else
            cout<<"familienname ist kurz"<<endl;
            break;
        }
        case '2':
        {
            cout<<" geben Sie die neuen telefonbucheintrag"<<endl;
            for (int i=0; i<26; i++)
            for (int j=0; j<5; j++)
            {
                cin>>telbuch[i][j].familienname>>telbuch[i][j].vorname>>telbuch[i][j].telefonnummer;
                
            }
            for (int i=0; i<26; i++)
            for (int j=0; j<5 ; j++)
            {
                i= hashing (telbuch[i][j].familienname);
            if(anzahl<130) // und hier bitte 
              {
                telbuch[i][j]=telbuch[i][j].familienname;
                telbuch[i][j]=telbuch[i][j].vorname;
                telbuch[i][j]=telbuch[i][j].telefonnummer;
              }
            
            cout<<"eingabe korrekt"<<endl;
            
            else 
            cout<< "es geschieht nicht"<<endl;
            }
            break;
        }
        case '3': //nach Einträger im telefonbuch suchen
        {
            string suchname;
            cout<<"geben sie die suchname :";
            cin>>suchname;
            int suchname_index=-1;
            int fach =hashing(suchname);
            for(int i=0;i<26;i++)
            for(int j=0;j<5;j++)
            {
                if(hashing(telbuch[i][j].familienname)==hashing(suchname))
                suchname_index=i;
                if (suchname_index != -1)
                {
                    if(suchname_index<i-1)
                    {
                        cout<<"Eintrag gefunden:"<<endl;
                        cout<<"familienname: "<<telbuch[suchname_index][j].familienname<<endl;
                        cout<<"vorname: "<<telbuch[suchname_index][j].vorname<<endl;
                        cout<<"telefonnummer: "<<telbuch[suchname_index][j].telefonnummer<<endl;
                        
                    }
                    i--;
                }
                else
                cout<<"keine eintrag mit diesem name gefunden"<<endl;
            }
        }
        break;
        default:
        cout<<"fehlereingabe! bitte auswahl wiederholen "<<endl;
    }
    r++;
    

    }

    return 0;
    

    }



  • @laroj sagte in telbuch c++:

        for (int i=0; i<26; i++)
        for (int j=0; j<5; j++)
        {
            cin>>telbuch[i][j].familienname>>telbuch[i][j].vorname>>telbuch[i][j].telefonnummer;
            
        }
    

    Warum sind dort 2 for-Schleifen? Du willst genau einen neuen Eintarg:

    Eintrag neu;
    cin >> neu.familienname >> neu.vorname ...
    

    @laroj sagte in telbuch c++:

        for (int i=0; i<26; i++)
        for (int j=0; j<5 ; j++)
        {
            i= hashing (telbuch[i][j].familienname);
    

    Warum sind dort 2 for-Schleifen? Hier muss die Zeilennummer aus dem neuen Eintrag ermittelt und in dieser Zeile ein freier Platz ermittelt werden.



  • @laroj: Und bitte formatiere deinen Code hier bei deinen Beiträgen (mittels des "C++"- Buttons).
    Auch nachträglich möglich über das Menü mit den 3 Punkten -> "Bearbeiten".



  • @manni66 hallo
    der erste Punkt ,über den Sie gesprochen haben; habe ich verstanden.
    was den zweiten Punkt betrifft,habe ich mit dem Professor darüber gesprochen .
    Er hat mir folgende Ratschläge gegeben:( Ich würde ein Feld mit 26 elementen (int) anlegen ,mit 0 initialisieren und das Feldelment , welches dem Ergebnis der Hashfunktion entspricht, inkrementieren .
    wenn in einem Feldelement der Wert 5 steht, können keine weiteren werte gespeichert werden).
    ich habe das Programm darauf basierend geändert, aber die Ausgabe ist nicht wie erwartet.
    und Es siet gar nicht wie Matrix aus. ```cpp
    #include <iostream>
    #include<string>
    using namespace std;
    struct Eintrag // Eintrag für eine person mit nachname und vorname und tel.nummer
    {
    string familienname;
    string vorname;
    string telefonnummer;
    };
    int hashing(string familienname) //hashfunktion bezugnehmend auf familienname, welcher einen bestimmten wert zuruekgibt
    {
    int hashwert=(familienname[0]*100 +familienname[1]*10 +familienname[2])%26;
    return hashwert;
    }
    int main()
    {

    Eintrag telbuch[26][5];
    int i,j;
    int r=0;
    char eingabe ='0';
    while (r<10) // das menü soll midesten 10 mal aufgerufen werden
    {
    cout<<"1:telefonbuch anzeigen"<<endl;
    cout<<"2:einfügen einen neuen telbucheintrag"<<endl;
    cout<<"3:nach einen eintag in telbuch suchen"<<endl;
    cin>>eingabe;
    switch(eingabe)
    {
    case '1':
    {
    cout<<"geben Sie die familienname , die vorname und die telefonnummer ein :"<<endl;
    for(int i=0;i<26;i++)
    for(int j=0;j<5;j++)
    {
    cin>>telbuch[i][j].familienname>>telbuch[i][j].vorname>>telbuch[i][j].telefonnummer;

                }
                
                    i=hashing(telbuch[i][j].familienname);
                    for(int i=0; i<26; i++)
                    for( int j=0; j<5; j++)
                    
                    {
                        if(telbuch[i][j].familienname.length()>=3)
                        {
                    
                    cout<<telbuch[i][j].familienname<<"" <<telbuch[i][j].vorname<<""<<telbuch[i][j].telefonnummer;
                        }
                    
                    
                
                     else
                      cout<<"die familienname ist kurz"<<endl;
                    } 
        }    
            break;
        
        case '2':
        {
            Eintrag neu;
            int Feld [26]={0};
            cout<< "geben Sie die neue Eintrag ein"<<endl;
            cin >>neu.familienname>>neu.vorname>>neu.telefonnummer;
            int hwert=hashing(neu.familienname);
            
                for(int i=0;i<26; i++)
                {
                    if(Feld [i]==hwert)
                    Feld[i]++;
                    
                }
                if(Feld[i]!=5)
                cout<<neu.familienname<<""<<neu.vorname<<""<<neu.telefonnummer;
                else 
                cout<< "keine weitere werte gespeichert werden"<<endl;
        }
        
        case '3': //nach Einträger im telefonbuch suchen
        {
            string suchname;
            cout<<"geben sie die suchname :";
            cin>>suchname;
            int suchname_index=-1;
            int fach =hashing(suchname);
            for(int i=26;i>0;i--)
            for(int j=5;j>0;j--)
            {
                if(hashing(telbuch[i][j].familienname)==hashing(suchname))
                suchname_index=i;
                if (suchname_index != -1)
                {
                    if(suchname_index<i-1)
                    {
                        cout<<"Eintrag gefunden:"<<endl;
                        cout<<"familienname: "<<telbuch[suchname_index][j].familienname<<endl;
                        cout<<"vorname: "<<telbuch[suchname_index][j].vorname<<endl;
                        cout<<"telefonnummer: "<<telbuch[suchname_index][j].telefonnummer<<endl;
                        
                    }
                }
                else
                cout<<"keine eintrag mit diesem name gefunden"<<endl;
            }
        }
        break;
        default:
        cout<<"fehlereingabe! bitte auswahl wiederholen "<<endl;
    }
    r++;
    

    }

    return 0;
    

    }


  • Mod

    Dieser Beitrag wurde gelöscht!


  • @Th69 hallo
    ich habe mein code informatiert wie Du gesagt hast ,
    aber hat es nicht funktioniert .
    kannst Du mir weiter eklären welche Buttons meinst Du
    danke im voraus



  • Das ist schlimmster 'ich möchte gerne C++ programmieren habe aber keine Ahnung davon und frickele irgendwas mit C und C++ Rudimenten zusammen' Unsinn, was dein Prof dir da erzählt.
    Entweder du machst C oder du machst C++; beides zusammenzufrickeln zeugt von totaler Ahnungslosigkeit deines Lehers (und der meisten Onlinetutorials,Bücher und Profs)



  • @laroj sagte in telbuch c++:

    ich habe das Programm darauf basierend geändert, aber die Ausgabe ist nicht wie erwartet.

    Du hast irgendetwas gemacht, aber nichts darauf basierend.

    Solange du nicht verstehst, wie eine Hashtabelle funktioniert, wirst du nicht weiter kommen.



  • @manni66 Sie haben das Recht, ich bin eine traditionelle Frau, weit entfernt von Programmierung und Technologie, aber ich habe dieses Kapitel Informatik1 und ich möchte die Prüfung bestehen, bitte Können Sie mir weiterhelfen, diese Aufgabe zu lösen



  • @laroj sagte in telbuch c++:

    @manni66 Sie haben das Recht, ich bin eine traditionelle Frau, weit entfernt von Programmierung und Technologie, aber ich habe dieses Kapitel Informatik1 und ich möchte die Prüfung bestehen, bitte Können Sie mir weiterhelfen, diese Aufgabe zu lösen

    https://de.wikipedia.org/wiki/Hashtabelle



  • @laroj sagte in telbuch c++:

    @manni66 Sie haben das Recht, ich bin eine traditionelle Frau, weit entfernt von Programmierung und Technologie, aber ich habe dieses Kapitel Informatik1 und ich möchte die Prüfung bestehen, bitte Können Sie mir weiterhelfen, diese Aufgabe zu lösen

    Ja ne, bau' Dir eine Datenstruktur für einen Eintrag. Könnte so aussehen:

    class entry_t {
        std::string name;
        std::string surname;
        std::string telephone_number;
    public:
        entry_t(std::string name, std::string surname, std::string telephone_number)
        : name     { std::move(name) },
          surname  { std::move(surname) },
          telephone_number { std:::move(telephone_number) }
        {}
    };
    

    Dann einen std::vector<> davon und Du hast Dein Telephonbuch.