telbuch c++



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



  • @Swordfish das ist keine Lösung der Aufgabe


  • Mod

    @Swordfish sagte in telbuch c++:

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

    Ironischerweise gleicher Fehler wie OP. Es reicht halt nicht die Aufgabe kurz zu überfliegen und sich zu denken, was wohl gemeint ist.



  • @SeppJ ganz ehrlich? ich hab's nichtmal gelesen 😉

    // edit: ok, ich hab's gelesen und soooo furchtbar weit ist es nicht weg.


  • Mod

    @Swordfish sagte in telbuch c++:

    // edit: ok, ich hab's gelesen und soooo furchtbar weit ist es nicht weg.

    Nur so weit wie ein Vector von einem unordered_set. Praktisch das selbe 🙂