![]() |
Anzeige:
|
|
|||||||
| C/C++, Visual C++, Visual C++.NET Fragen und Antworten zu C/C++, Visual C++ und Visual C++.NET |
|
![]() |
|
|
LinkBack | Themen-Optionen | Ansicht |
|
|
#1 (Direktlink) |
|
Gast
Beiträge: n/a
|
Ich probiere gerade ein Telefonbuch mit c++ zu programieren
es soll 100 einträge speichern eingeben anzeigen und löschen können. Ich bin echt am verzweifeln ich bin mir sicher das das system richtig ist. Aber irgendwie habe ich kleine Fehler eingebaut und ich weiss nicht wie ich die rauskriegen soll. Wäre nett wenn mal einer drüberschaut und mir sagt ob ich total falsch an die sache rangehe oder ob ich einfach was übersehen habe. Danke schonmal im Voraus! #include<iostream.h> int nummer; int vorname; int nachname; int telefonnummer; struct person{ char nachname[80]; char vorname[80]; int telefonnummer; }; person telefonbuch[100]; void initialisierung(){ person telefonbuch[100]; int i; for(int i=0;i<=100;i++); if (telefonbuch[i].nachname>0)i++; else; telefonbuch[i].nachname=nachname; telefonbuch[i].vorname=vorname; telefonbuch[i].telefonnummer=telefonnummer; }; void eingabe(){ cout<<"Geben Sie den Nachnamen ein:"<<endl; cin>>nachname; cout<<"Geben Sie den Vornamen ein:"<<endl; cin>>vorname; cout<<"Geben Sie die Telefonnummer ein:"<<endl; cin>>telefonnummer; } void anzeige(){ person telefonbuch[100]; int i; for(int i=0;i<=100;i++) cout<<"Geben Sie den Namen ein den Sie suchen:"<<endl; cin>>nachname; if (telefonbuch[i].nachname!=nachname)i++; else; cout<<telefonbuch[i].nachname<<endl; cout<<telefonbuch[i].vorname<<endl; cout<<telefonbuch[i].telefonnummer<<endl; } void loeschen(){ person telefonbuch[100]; int i; cout<<"Geben Sie den Namen ein den Sie loeschen wollen:"<<endl; cin>>nachname; if (telefonbuch[i].nachname!=nachname)i++; else; telefonbuch[i].nachname=0; telefonbuch[i].vorname=0; telefonbuch[i].telefonnummer=0; } void nummereingabe(){ int i; do{ cout<<"Geben Sie die Nummer für die Funktion ein"<<endl; cout<<"Sie haben folgende möglichkeiten"<<endl; cout<<"Eingabe = 0, Anzeigen = 1, Loeschen = 2"<<endl; cin>>i; if (i>2) cout <<"Sie haben eine Falsche Zahl eingegeben"<<endl; cout <<"Ihre Zahl war:"<<i <<endl; cout <<"Versuchen Sie es nocheinmal"; else; nummer=i; }while (i>2); void main(){ initialisierung(); char nummer; nummerneingabe(); switch(nummer){ case '0': eingabe(); break; case '1': anzeige(); break; case '2': loeschen(); break; char p[50]; cin.getline(p,50); cin.getline(p,50); } |
|
|
|
|
#2 (Direktlink) |
|
Dauergast
![]() Registriert seit: 06.05.2004
Ort: Düsseldorf
Beiträge: 1.672
|
*hüstel*
hmmmhh da ist so wie es aussieht ein Grundlegender Denkfehler drin.... Code:
int a; //Das ist eine globale Variabel.
void MeineErsteFunktion()
{
int a;//Das ist eine lokale Variabel, diese hat nichts mit der globalen Variabel zu tun
a=10;//Die lokale Variabel wird geändert, aber nicht die globale
}
void MeineZweiteFunktion()
{
cout<<a; //tja welcher Wert wird da angezeigt? wenn es 10 ist, ist das reiner Zufall
}
Die Funktion Eingabe kann so nicht funktionieren, du musst schon irgendwo angeben welches telefonbuch Element gemeint ist. Die Funktion anzeige ist irgendwie ziemlich falsch, erstens ist int i doppelt, telefonbuch[i].nachname!=nachname kann so nicht funktionieren Zeichenketten müssen mit srtcmp o.ä. verglichen werden und irgendwie fehlt da eine { }, aber irgendwie stimmt diese ganze for Schleife so nicht. Bei der löschen funktion irgendwie das selbe. und bei else; ist das ; falsch. Peter |
|
|
|
|
|
#3 (Direktlink) |
|
Gast
Beiträge: n/a
|
erstmal danke für die schnelle Antwort
Mein gröstes Problem ist wie bekomme ich die eingabe dazu mir die einzelnen daten in die structur einzulesen ohne irgendwas zu überschreiben das versuche ich mit der initialisierung und dazu benutze ich ja die funktion mit dem i++ da hänge ich aber total und weiss nicht ob das so wirklich richtig ist ! |
|
|
|
#4 (Direktlink) |
|
Dauergast
![]() Registriert seit: 06.05.2004
Ort: Düsseldorf
Beiträge: 1.672
|
Hier mal eine Beispiellösung, ob die so stimmt, tja da fehlen ein paar angaben zu...
Code:
#include<iostream.h>
struct person{
char nachname[80];
char vorname[80];
int telefonnummer;
};
//Beide nachfolgenden Variabeln sind überflüssig, das könnte man auch besser machen!
person telefonbuch[100];
int Eingabenummer;
//Ich weiis nicht was die ursprüngliche Version machen sollte, diese hier setzt das Feld auf Null
void initialisierung()
{
Eingabenummer=-1;
for(int i=0;i<100;i++)
{
telefonbuch[i].nachname='\0';
telefonbuch[i].vorname='\0';
telefonbuch[i].telefonnummer=0;
}
}
void eingabe()
{
/* entweder
for(int i=0;i<100;i++)
{
cout<<"Geben Sie den Nachnamen ein:"<<endl;
cin>>telefonbuch[i].nachname;
cout<<"Geben Sie den Vornamen ein:"<<endl;
cin>>telefonbuch[i].vorname;
cout<<"Geben Sie die Telefonnummer ein:"<<endl;
cin>>telefonbuch[i].telefonnummer;
}
*/
/*oder
int index;
for(;;)
{
cout<<"Geben Sie eine indexnummer von 0-99 ein";
cin>>index;
if(index<0 || index >99)
break;
cout<<"Geben Sie den Nachnamen ein:"<<endl;
cin>>telefonbuch[index].nachname;
cout<<"Geben Sie den Vornamen ein:"<<endl;
cin>>telefonbuch[index].vorname;
cout<<"Geben Sie die Telefonnummer ein:"<<endl;
cin>>telefonbuch[index].telefonnummer;
}
*/
}
//bei folgenden 2 Funktionen ging ich davon aus das die indexnummer eingegeben werden soll, nicht der Name
void anzeige()
{
int index;
cout<<"Geben Sie den Indexnummer (0-99) ein den Sie suchen:"<<endl;
cin>>index;
if(index>-1 && index<100)
{
if(telefonbuch[index].nachname=='\0')
{
cout<<"Kein Namenseintrag an dieser Indexnummer"<<endl;
}
else
{
cout<<telefonbuch[index].nachname<<endl;
cout<<telefonbuch[index].vorname<<endl;
cout<<telefonbuch[index].telefonnummer<<endl;
}
}
}
void loeschen()
{
int index;
cout<<"Geben Sie die Indexnummer (0-99) an ein den Sie loeschen wollen:"<<endl;
cin>>index;
if(index>-1 && index<100)
{
telefonbuch[i].nachname='\0';
telefonbuch[i].vorname='\0';
telefonbuch[i].telefonnummer=0;
}
}
void nummereingabe()
{
cout<<"Geben Sie die Nummer für die Funktion ein"<<endl;
cout<<"Sie haben folgende Möglichkeiten"<<endl;
cout<<"Eingabe = 0, Anzeigen = 1, Loeschen = 2"<<endl;
cin>>Eingabenummer;
cout <<"Ihre Zahl war:"<<Eingabenummer <<endl;
cout <<"Versuchen Sie es nocheinmal";
if(Eingabenummer<0 || Eingabenummer>2)
cout>>"Ihre Eingabe war ungültig,Programm wird beendet!";
}
void main()
{
initialisierung();
do
{
nummerneingabe();
switch(Eingabenummer)
{
case '0':
eingabe();
break;
case '1':
anzeige();
break;
case '2':
loeschen();
break;
}
}while(Eingabenummer>-1 && Eingabenummer<3)
/* folgende Zeilen sind unklar deshalb auskommentiert
char p[50];
cin.getline(p,50);
cin.getline(p,50);
*/
}
|
|
|
|
|
|
#5 (Direktlink) |
|
Gast
Beiträge: n/a
|
ui das war schonmal sehr hilfreich habe das programm jetzt schon stark verändert und denke das ich jetzt langsam auf dem richtigen weg bin.
aber dieses mit dem for(int i=0;i<100;i++) verstehe ich irgendwie nicht ganz ich möchte ja mit der initalisierung abfragen ob der platz noch frei ist und dann etwas eintragen also einen leeren string benutzen! genauso möchte ich auch mit for(int i=0;i<100;i++) einen namen abfragen der in der strucktur gespeichert ist. da komme ich durcheinander . mehr angaben kann ich dir gerne geben! Punkt 1 Telefonbuch mit 100 Einträgen Punkt 2 Funktion initialisierung für die zuweisung auf einen leeren String Punkt 3 Ich möchte Eingeben Anzeigen und Löschen mit den Funktionen eingabe(); anzeige(); loeschen(); Punkt 3 Funktion nummereingabe() was ich für die abfrage benutze was gemacht werden soll eingeben anzeigen löschen Punkt 4 meine main()-Funktion mit der ich die Aktionen auswähle dies mache ich mit switch case. |
|
|
|
|
#6 (Direktlink) | |
|
Dauergast
![]() Registriert seit: 06.05.2004
Ort: Düsseldorf
Beiträge: 1.672
|
Zitat:
Das widerspricht sich.... Nein ich glaube wohl eher das initialisieren Funktion, das Feld auf einen bestimmten Wert setzen soll in dem es ALLE einträge auf Null setzt. Du kannst die Funktion ja mal nicht aufrufen, dir wird auffallen das du ein Feld mit 100 zufälligen einträgen hast. Wenn du sttat der Indexnummer bei Anzeig enach einem namen suchen willst: Code:
#include<iostream.h>
#include<string.h> //für strcmp
void anzeige()
{
char suchname[80];
cout<<"Geben Sie einen Namen ein:"<<endl;
cin>>suchname;
for(int i=0;i<100;i++)
{
if(strcmp(suchname,telefonbuch[index].nachname)==0)
{
cout<<telefonbuch[index].nachname<<endl;
cout<<telefonbuch[index].vorname<<endl;
cout<<telefonbuch[index].telefonnummer<<endl;
break;
}
else
{
cout<<"Name wurde nicht gefunden"<<endl;
break;
}
}
}
|
|
|
|
|
|
|
#7 (Direktlink) |
|
Gast
Beiträge: n/a
|
So habe mir alles mal durch den Kopf gehen lassen und das programm mit meinen Kentnissen und deinen Hilfestellungen jetzt so zusammengestellt.
Ich finde es sieht gut aus aber Borland meint bei diesen Stellen Code:
telefonbuch[i].nachname='\0'; telefonbuch[i].vorname='\0'; oder kann das was mit den cin.getline Befehlen zu tun haben ? Und nochmal danke für deine nette Unterstützung! Code:
#include<iostream.h>
#include<string.h>
struct person{
char nachname[80];
char vorname[80];
int telefonnummer;
};
person telefonbuch[100];
int Eingabenummer;
void initialisierung()
{ Eingabenummer =-1;
for(int i=0;i<100;i++)
{
telefonbuch[i].nachname='\0';
telefonbuch[i].vorname='\0';
telefonbuch[i].telefonnummer=0;
}}
void eingabe()
{
for(int i=0;i<100;i++)
{
cout<<"Geben Sie den Nachnamen ein:"<<endl;
cin>>telefonbuch[i].nachname;
cout<<"Geben Sie den Vornamen ein:"<<endl;
cin>>telefonbuch[i].vorname;
cout<<"Geben Sie die Telefonnummer ein:"<<endl;
cin>>telefonbuch[i].telefonnummer;
} }
void anzeige()
{
char suchname[80];
cout<<"Geben Sie einen Namen ein:"<<endl;
cin>>suchname;
for(int i=0;i<100;i++)
{
if(strcmp(suchname,telefonbuch[i].nachname)==0)
{
cout<<telefonbuch[i].nachname<<endl;
cout<<telefonbuch[i].vorname<<endl;
cout<<telefonbuch[i].telefonnummer<<endl;
break;
}
else
{
cout<<"Name wurde nicht gefunden"<<endl;
break;
}
}
}
void loeschen()
{
char suchname[80];
cout<<"Geben Sie einen Namen ein:"<<endl;
cin>>suchname;
for(int i=0;i<100;i++)
{
if(strcmp(suchname,telefonbuch[i].nachname)==0)
{
telefonbuch[i].nachname='\0';
telefonbuch[i].vorname='\0';
telefonbuch[i].telefonnummer=0;
break;
}
else
{
cout<<"Name wurde nicht gefunden"<<endl;
break;
}
}
}
void nummereingabe()
{
cout<<"Geben Sie die Nummer für die Funktion ein"<<endl;
cout<<"Sie haben folgende Möglichkeiten"<<endl;
cout<<"Eingabe = 0, Anzeigen = 1, Loeschen = 2"<<endl;
cin>>Eingabenummer;
cout <<"Ihre Zahl war:"<<Eingabenummer <<endl;
cout <<"Versuchen Sie es nocheinmal";
if(Eingabenummer<0 || Eingabenummer>2)
cout<<"Ihre Eingabe war ungültig,Programm wird beendet!";
}
void main()
{
initialisierung();
do
{
nummereingabe();
switch(Eingabenummer)
{
case '0':
eingabe();
break;
case '1':
anzeige();
break;
case '2':
loeschen();
break;
}
}while(Eingabenummer>-1 && Eingabenummer<3);
char p[50];
cin.getline(p,50);
cin.getline(p,50);
}
|
|
|
|
#8 (Direktlink) |
|
Dauergast
![]() Registriert seit: 06.05.2004
Ort: Düsseldorf
Beiträge: 1.672
|
in jeder Zeiel wo telefonbuch[i] vorkommt oder nur in der mit '\0' ?
|
|
|
|
|
|
#9 (Direktlink) |
|
Gast
Beiträge: n/a
|
nur die mit '\0'
|
|
|
|
#10 (Direktlink) |
|
Dauergast
![]() Registriert seit: 06.05.2004
Ort: Düsseldorf
Beiträge: 1.672
|
OK dann probier mal telefonbuch[i].nachname[0]='\0';
|
|
|
|
|
|
|
#11 (Direktlink) |
|
Gast
Beiträge: n/a
|
telefonbuch[i].nachname='\0';
Warum machste nicht einfach; telefonbuch[i].nachname="" ; ? Es soll ja ein leerer STRING zugewiesen werden und der wird mit Anführungszeichen, nicht mit Abostroph zugewiesen . Das \0 wird ja automatisch angehängt. |
|
|
|
#12 (Direktlink) |
|
Gast
Beiträge: n/a
|
Uii hab ich da nen Müll geschrieben, bitte vergessen , kann ja nicht klappen
|
|
|
|
#13 (Direktlink) |
|
Dauergast
![]() Registriert seit: 06.05.2004
Ort: Düsseldorf
Beiträge: 1.672
|
Hallo...
wenn überhaupt strcpy(Zeichenkette,""); Zeichenkette="Hallo", neeee das klappt in Basic vielleicht, bei der initialisierung, oder wenn man die Klasse String /CString verwendet, später nicht mehr. "" ist eine Zeichenkette , '' ein einzelnes Zeichen. so und Zeichenkette[0] und Zeichenkette verweisen beide auf die Adresse des ersten ZEICHENS bzw. auf den Beginn der Zeichenkette... UUUPPPPSSSSS ja da haben wir ja den Fehler Habt ihr schon Zeiger behandelt ? Wenn Nein nimm Strcpy() |
|
|
|
|
|
#14 (Direktlink) |
|
Gast
Beiträge: n/a
|
Also ich würds so schreiben:
void initialisierung () { int i; for (i=0; i<100; i++) { strcpy(telefonbuch[i].vorname,""); strcpy(telefonbuch[i].nachname,""); } } |
|
|
|
#15 (Direktlink) |
|
Dauergast
![]() Registriert seit: 06.05.2004
Ort: Düsseldorf
Beiträge: 1.672
|
Also nochmals zusammengefasst,
folgende Initialisierungen sind möglich: char Zeichenkette[]="Hallo"; strcpy(Zeichenkette,""); //oder auch andere Stringfunktionen char Zeichenkette[100]; Zeichenkette[0]='\0'; //Apostroph keine Anführungszeichen !!!,oder auch=0 char Zeichenkette[100]; char *ptr, ptr=Zeichenkette; *ptr='\0'; // oder auch gleich Null (Wenn du das letzte nicht verstehst, das sind Zeiger. Solche Konstruktionen sind ziemlich häufog zu finden.) |
|
|
|
|
![]() |
|
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
|
|