Bei Schleifenausführung Problem
-
Hallo!
Ich bin zur Zeit damit beschäftigt eine Aufgabe zu bearbeiten. Da ich immer nur Teile fertig stelle, muss ich diese immer überprüfen. Bei dieser Aufgabe soll man private und dienstliche Kontakte erstellen können und zu diesen wiederum Termine. Nun habe ich die Punkte fertig gestellt, dass man neue Kontakte erstellen kann und zu diesen Kontakten Termine. Ich habe dafür ein Feld erstellt, welches die Nummer
des Kontaktes speichert und bei jedem Durchlauf den Wert in dem Feld erhöht. Nun hab ich aber das Problem, dass ich die Kontakte mit Terminen nicht korrekt ausdrucken kann. Wenn ich zunächst nur Kontakte erstelle, funktioniert es wunderbar, wenn ich aber einen Kontakt erstelle und dann zu diesem Termine und anschliessend einen neuen Kontakt erstelle, es dann ausdrucken lassen will, wird der erste Kontakt durch den zweiten ersetzt, die Termine passen von ihrer Reihenfolge. Ich kann mir nicht erklären woher dass kommt. Wäre echt nett, wenn mir jemand helfen könnte, ich wäre auch sehr dankbar. Falls jemand noch irgendwelche Angaben braucht, einfach hier rein schreiben. Danke
Gruß
Patrick
P.S. Ich darf noch keine Zeiger Referenzen oder ähnliches benutzencase 7: for (i=0; i<=pt;i++) { cout << "\nPrivater Kontakt " << i+1 << ":" << endl; cout << "\n" << i << endl; cout << "Name: " << PriKontakt[i].Name_lesen() << endl; cout << "Anschrift: " << PriKontakt[i].Strasse_lesen() << " " << PriKontakt[i].Hausnummer_lesen() << endl; cout << " " << PriKontakt[i].PLZ_lesen() << " " << PriKontakt[i].Ort_lesen() << endl; cout << "Telefonnummer: " << PriKontakt[i].Telnummer_lesen() << endl; cout << "Email: " << PriKontakt[i].Email_lesen() << endl; cout << "Vorlieben: " << PriKontakt[i].Vorlieben_lesen() << endl; cout << "Geb.-Datum: " << PriKontakt[i].Gebdatum_lesen() << endl; if (PriKontakt[i].Maennlich_lesen() == true) cout << "maennlich" << endl; else cout << "weiblich" << endl; if (termine[i] = 0) cout << "\nKein Termin eingetragen!!!" << endl; else { for (j=0;j<=termine[i];j++) { cout << "Termin " << j+1 << ":" << endl; cout << "Uhrzeit: " << PNr[i][j].lese_Stunde() << " : " << PNr[i][j].lese_Minute(); cout << "\nDatum: " << PNr[i][j].lese_Tag() << " . " << PNr[i][j].lese_Monat() << " . " << PNr[i][j].lese_Jahr() << "\n"; cout << "Anlass: " << PNr[i][j].lese_Anlass() << endl << endl; } } } break;
-
ich glaube nicht, dass Dein Problem in bzw. an der Schleife liegt, die Du uns gepostet hast. Nach Deiner Fehlerbeschreibung ist zu vermuten, dass Du Dich bei der Verwaltung der Kontakte vertust.
Ein Tipp zur Strukturierung des Programms. Es ist wärmstens zu enpfehlen, für den Typ von 'PriKontakt' einen operator<< zu schreiben, oder wenn Dir das noch zu fremd ist eine Ausgabe-Funktion -
void print( const CPriKontakt& PriKontakt ) // void print( CPriKontakt PriKontakt ) wäre auch möglich { cout << "Name: " << PriKontakt.Name_lesen() << endl; cout << "Anschrift: " << PriKontakt.Strasse_lesen() << " " << PriKontakt.Hausnummer_lesen() << endl; // usw.Das gleiche gilt für die Termine.
Auch solltest Du die Anzahl der Termine als Member des Typs von 'PriKontakt' halten und nicht außerhalb führen.Ich bin sicher, dass so Dein Code einfacher und lesbarer wird. Wenn Du bei der Verwaltung ähnlich vorgehst, so läßt sich vielleicht auch Dein Problem schnell lösen.
Poste mal die Stelle, an der ein neuer Kontakt eingetragen wird, nachdem (!) bereits ein oder mehrere Termine eingetragen wurden.
Gruß
Werner
-
Also dasganze ist in einer do while Schleife, also wird ja immer wieder dasselbe aufgerufen. Ich poste mal bei der switch Anweisung neuen Kontakt anlegen
case 1: cout << "\nVorname: "; cin >> Nvorname; cout << "Nachname: "; cin >> Nnachname; cout << "Strasse: "; cin >> Nstrasse; cout << "Hausnummer: "; cin >> Nhausnummer; cout << "Postleitzahl: "; cin >> Npostleitzahl; cout << "Ort: "; cin >> Nort; cout << "Telefonnummer: "; cin >> Ntelefonnummer; cout << "E-mail Adresse: "; cin >> Nemail; cout << "Ist der Kontakt 1)Privat oder 2)Dienstlich? "; cin >> Wert; if (Wert == 1) { PriKontakt[p].Name_setzen(Nvorname,Nnachname); PriKontakt[p].Strasse_setzen(Nstrasse); PriKontakt[p].Hausnummer_setzen(Nhausnummer); PriKontakt[p].PLZ_setzen(Npostleitzahl); PriKontakt[p].Ort_setzen(Nort); PriKontakt[p].Telnummer_setzen(Ntelefonnummer); PriKontakt[p].Email_setzen(Nemail); cout << "Vorlieben des Kontaktes: "; cin >> Nvorlieben; PriKontakt[p].Vorlieben_setzen(Nvorlieben); cout << "Geburtstag: "; cin >> Ngeburtstag; PriKontakt[p].Gebdatum_setzen(Ngeburtstag); cout << "Ist der Kontakt 1)Maennlich oder 2)Weiblich? "; cin >> Nmaennlich; if (Nmaennlich == 1) {PriKontakt[p].Maennlich_setzen(true);} else {PriKontakt[p].Maennlich_setzen(false);} pt=p; p++; }und neuen Termin anlegen
cout << "\n1)Privater oder 2)Dienstlicher Kontakt?"; cin >> ArtKontakt; if (ArtKontakt == 1) { cout << "\nZu welchem Kontakt soll ein Termin erstellt werden? "; cin >> u; p=u-1; cout << "\n\nStunde: "; cin >> Nstunde; cout << "Minute: "; cin >> Nminute; cout << "Tag: "; cin >> Ntag; cout << "Monat: "; cin >> Nmonat; cout << "Jahr: "; cin >> Njahr; cout << "Anlass: "; cin >> Nanlass; PNr[p][k].setze_Uhrzeit(Nstunde, Nminute); PNr[p][k].setze_Datum(Ntag, Nmonat, Njahr); PNr[p][k].setze_Anlass(Nanlass); termine[p]=++termine[p]; cout << "\n Termin Zaehler " << p << " ist auf " << termine[p] << endl; k = termine[p]; cout << "\n" << k << endl; }Vielen Dank für deine Mühe
Gruß
Patrick
-
termine[p]=++termine[p];erzeugt undefiniertes Verhalten (du hast zwei Nebeneffekte auf die selbe Variable und kannst nicht sicher sein, in welcher Reihenfolge die ausgeführt werden) - was soll denn diese Anweisung bewirken?
-
Hallo Patrick,
Ich vermute, dass es an der Variablen 'p' liegt. Du benutzt sie zum einen zum Erfassen des aktuell einzugebenen Kontakts und veränderst sie, sobald ein Termin eingegeben wird. Zudem ist sie wahrscheinlich global oder zumindest in einem sehr großen Scope.
Nochmal die wärmste Empfehlung: Strukturiere Dein Programm! Da kann man nicht früh genug mit anfangen. Dann passieren solche Sachen erst gar nicht.
Gruß
Werner
-
Hallo!
Also die Anweisungtermine[p]=++termine[p];
soll bewirken, dass nachdem ein Termin eingegeben wurde, zu dem Kontakt p, derWert, der in termine[p] gespeichert ist um eins erhöht wird, damit bei jedem Kontakt klar ist, wieviele Termine vorhanden ist. Ich hatte es davor schon anders ohne Feld,aber
dann hat er mir bei jedem Kontakt soviele Termine ausgegeben, wie bei dem Kontakt mit den meisten Terminen, gibt es dafür vielleicht eine elegantere Lösung?
Vielen Dank für die bisherigen Antworten und für die Mühe im voraus...
MfG
Patrick
-
pat112 schrieb:
gibt es dafür vielleicht eine elegantere Lösung?
ja

++termine[p];oder
termine[p]+=1;oder
termine[p]=termine[p] + 1;Ist alles eleganter
Kurt
-
Du hast
termine[p]++;vergessen.

-
pat112 schrieb:
Hallo!
Also die Anweisungtermine[p]=++termine[p];
soll bewirken, dass nachdem ein Termin eingegeben wurde, zu dem Kontakt p, derWert, der in termine[p] gespeichert ist um eins erhöht wird, damit bei jedem Kontakt klar ist, wieviele Termine vorhanden ist.
Dazu reicht das "++termine[p];" ohne die Zuweisung schon völlig aus.