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++:
- verwende std::string, nicht char-Arrays.
- 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,....
-
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. Deinstruct 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 sollpersonal
sein? Es sieht aus wie ein Telefonbuch, heißt aber nicht so. Es gibt eine Variabletelefonbuch
, 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
-
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:
- die benötigten Daten von der Tastatur aus einlesen
- auf diesen die C++-Funktion „hashing“ anwenden
- die sich ergebende Zahl als Zeilenindex der „Telefonmatrix“ interpretieren
- wenn in der betreffenden Zeile noch mindestens ein Eintrag frei ist: Werte dorthin zu kopieren, sonst geschieht nichts
- 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
- die Telefonnummer ist immer noch int
- 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 kopierenDas 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;
}
-
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
-
@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.