Problem mit Do-While Schleife C++ 

Status
Für weitere Antworten geschlossen.

Ajur

Registered +
Registriert
Feb. 2008
Beiträge
46
Hallo allerseits, ich möchte eine Do-While-Schleife machen, die solange abfragt ob jemand progrmam beenden oder weiter machen möchte bis der benutzer "ja" oder "nein" eingibt. Allerdings scheint das wohl ziemlich schwer zu sein (sitz da jetz shcon ne stunde drann) oder aber ich blicks einfach nicht :/

Hier der Code:
PHP:
#include 
#include 

char fortfahren[3];

int main()
{
cout  trennlinie();

/* Solange Abfragen bis User "yes" oder "no" eingegeben hat.
Danach wird dann geprüft was von beiden er eingegeben hat
und das Programm forgesetzt oder beendet.
*/

do 
{
cout  cin >> fortfahren;
}
while(fortfahren=="yes") && fortfahren=="no");
if(fortfahren=="no")
{
cout  }
else
{

Hauptprogrammteil

}

return 0;
}

Die Schleife wird ja solang ausgeführt, bis die Bedingung "false" liefert.

fortfahren!="yes" --> liefert immer true, wenn KEIN yes eingegeben wird.
fortfahren!="no" --> liefert immer true, wenn KEIN no eingegeben wird.

wenn man also nichts von beiden eingibt (also kein yes oder no) so müsste gesammt ausdruck "true" ergeben und somit läuft die schleife weiter.

gibt man aber yes ODER no ein, so ist einer der beiden Ausdrücke "true". somit ist dann true && false = false bzw. false && true = false und die Schleife solte abbrechen.

Das funzt bei mir aber nicht :( Egal was ich eingebe, die Schleife wird beendet. Und die if Abfrage danach wird auch gar nicht aufgerufen, es geht gleich in den hauptteil (also den else Teil) weiter.

Hat jemand ne Idee was ich falsch mache ???
Grüße Ajur
 
hi,

bin nicht so der c++ fan. aber soweit ich weiss kann man mit dem vergleichoperator keine Zeichenketten vergleichen. man benoetigt hierfuer geeignete funktionen bzw. in oop genannt methoden.

die methode strcmp() gibt -1/1 zurueck, wenn beide Zeichenketten ungleich (zwischen den beiden gibt es auch noch einen unterschied) sind und gibt 0 zurueck, wenn beide gleich sind. sollte die funktion vom deinen compiler als undefiniert gehandhabt werden dann bin ich mir sicher, dass das an einer fehlenden headerdatei liegt. einfach mal nach googln (meine vermutung ist #include ).

hier mein vorschlag:

#include
#include

char fortfahren[3];

int main()
{
cout trennlinie();

/* Solange Abfragen bis User "yes" oder "no" eingegeben hat.
Danach wird dann geprüft was von beiden er eingegeben hat
und das Programm forgesetzt oder beendet.
*/

do
{
cout cin >> fortfahren;
}
while(strcmp(fortfahren,"yes") == 0);
if(strcmp(fortfahren,"no") == 0)
{
cout }
else
{

Hauptprogrammteil

}

return 0;
}

gruss tuney
 
solte das im while teil nicht eher || statt && sein? es geht doch darum ob es ja oder nein ist ein und dieselbe variable zu vergleichen wird immer false liefern da sie nur einen wert annehmen kann
 
@peter9876: Nein es MUSS && sein! Das zeigt die die Wahrheitstabelle von der UND bzuw ODER verknüpfung ganz schön. ich will als ergebis ein FALSE haben und kein TRUE. würde ich TRUE haben wolen müsste ich natürlich ODER nehmen!

lol da seh ich doch gade das problem: ich kriege auch einen false wenn beides falsch ist! daran liegt es glaube ich das es nicht funktioniert :(

@tuney: interessante sache! werd ich mir dann später mal angucken im programm (bin grad am windows rechner). das würde acuh erklären wieso ich wenn ich eine zahl "vergleichen" lasse anstatt einen char er sich beschwert das man einen zeiger nicht mit einer int vergleichen kann...

C++ nervt mich schon ein wenig :( wasn gefaxe um sone billige ja/nein abfrage zu machen :D hab überlegt ob ichs mit switch case mache ... nur da is wieder das problem wie ich die wiederholung reinkrieg...
 
Also du musst einfach Abfragen bis die Variable "ungleich" yes und no ist und net bis sie gleich ist, da liegt meiner Meinung nach das Prob

Also die Schleife müsste so aussehen:


do
{
cout cin >> fortfahren;
}
while(fortfahren!="yes" && fortfahren!="no");
 
Sasquatch: das funktioniert nicht, habe ich auch schon versucht gehabt.

tuney: du bist mein held :) es funktioniert! und zwar so:

PHP:
do
{
cout cin >> fortfahren;
}
while(strcmp(fortfahren,"yes") != 0 && strcmp(fortfahren,"no")!=0);
if(strcmp(fortfahren,"no") == 0)
{
cout }
else
{ 
....
}

musste auch nicht includen.
das proggi macht jetzt genaudas was ich will:
gebe ich irgendwas ein (nicht yes/no) dann wird die schleife wiederholt.
gebe ich yes ein, komme ich zum hauptteil, gebe ich no ein wird das programm geschlossen mit "Programm closed" d.h. die if abfrage danach funktioniert. super :) vielen dank für den tip!
 
hi,

ich moechte das dann nochmal erklaeren, anscheinend gibt es etwas verwirrung und missverstaendnisse.

Code:
do 
{
cout  cin >> fortfahren;
} while(fortfahren=="yes") && fortfahren=="no");

bei dem code gibt es zum einen syntax fehler und zum anderen ist die programmlogik fuer die schleife strikt falsch. ich gehe jetzt davon aus, das zum ersten der benutzer "yes" eingeben muss, wenn er noch eine weitere eingabe taetigen will und er "no" eingeben muss, wenn er das programm beenden will, sprich die while-schleife soll beendet werden.

laut dem o.g. code snippets (wir nehmen an das die syntax richtig sei!) wuerde folgendes passieren:

fall 1: frage wird angezeigt und eingabe ist "yes"

ausdruck fortfahren=="yes" && fortfahren=="no" wird ausgewertet zu true && false ==> false = schleife wird abgebrochen

fall 2: fragen wird angezeigt und eingabe ist "no"

ausdruck fortfahren=="yes" && fortfahren=="no" wird ausgewertet zu false && true ==> false = schleife wird abgebrochen

fall 3: fragen wird angezeigt und eingabe ist weder "yes" noch "no"

ausdruck fortfahren=="yes" && fortfahren=="no" wird ausgewertet zu false && false ==> false = schleife wird abgebrochen

wie man sehen kann wird die schleife abgebrochen, egal welche situation herrscht. nun kommen wir zu meinem vorschlag. ich habe auch gleich die richtigen methoden verwendet, weil man nicht mit dem operator == zeichenketten vergleichen kann!!!

Code:
int c_var = 0;
do 
{
cout  cin >> fortfahren;

if(strcmp(fortfahren,"yes") == 0) {
c_var = 1;
cout  } else if(strcmp(fortfahren,"no") == 0) {
c_var = 0;
cout  } else {
cout  c_var = 1;
}
}
while(c_var);

die interpretation der while schleife lautet alles was goesser als 0 ist gilt als true, der rest als false.

@Sasquatch

diese lsg. erfuellt leider auch nicht unseren zweck:
Code:
do
{
cout cin >> fortfahren;
}
while(fortfahren!="yes" && fortfahren!="no");

fall 1: frage wird angezeigt und eingabe ist "yes"

ausdruck fortfahren!="yes" && fortfahren!="no" wird ausgewertet zu false && true ==> false = schleife wird abgebrochen

fall 2: fragen wird angezeigt und eingabe ist "no"

ausdruck fortfahren!="yes" && fortfahren!="no" wird ausgewertet zu true && false ==> false = schleife wird abgebrochen

fall 3: fragen wird angezeigt und eingabe ist weder "yes" noch "no"

ausdruck fortfahren!="yes" && fortfahren!="no" wird ausgewertet zu true && true ==> true = schleife wird fortgesetzt


@Ajur

leider kann ich dir nicht mehr informationen zu c++ geben, weil ich damit nicht programmiere, aber die programmlogik sollte in jeder programmiersprache starke aehnlichkeiten aufweisen.

EDIT: ok wir haben anscheinend gleichzeitig gepostet! freut mich

aber wenn du nun "5" eingeben wuerdest dann wuerde er den programmcode auch wiederholen oder?

gruss tuney
 
Finde ich ja schön das du das so zusammengefasst hast, nur versteh ich grad nicht ganz was du mit

diese lsg. erfuellt leider auch nicht unseren zweck:

meinst. bezieht sich das auf den darauffolgenden code ? falls ja wäre das komisch, da dieser genau den zweck erfüllt für den der programmschnipsel gedacht war :) unter dem code hast du es ja richtig erklärt...

und zu deiner frage: klar wird bei der eingabe von "5" oder sonstigem zeugs die schleifer wiederholt, es wird ja eine "true" als gesamtausdruck zurückggegeben.

das was es an dem thread deutlich herauszuheben gilt ist:

man kann mit dem == operator keine zeichenketten vergleichen

dank dir weiß ich jetzt das es mit strcmp(); geht...

das mit der logik ist shcon richtig, deshalb war es auch "klar" das der versucht von mir oben nicht gehen konnte (auch wenn man mit == operator zeichenketten hätte vergleichen können, da so wie oben schon beschrieben war trotzdem ein false rauskäme, auch wenn man nichts von beiden eingibt)

alles in allem danke schön für die mühe und super das es jetzt funktioniert ^^

ich sehe hier leider keine möglichkeit den thread als "geschlossen" anzugeben .. falls wer weiß wie das hier in der untersection funzt imemr raus damit ;) ansonsten euch allen noch einen schönen abend.

grüße Ajur
 
Bevor der Thread nun geschlossen wird, würd mich echt noch interessieren wieso meine Lösung nicht den Zweck erfüllen würde?

Das was daran falsch ist, ist halt das man so keine Strings vergleichen kann, soviel weiß ich jetzt auch schon ;D aber ich glaub das hast nicht damit gemeint oder @ tuney

mfg Sasquatch
 
deine lösung erfüllt den zweck!

nur das du anstatt

PHP:
while(fortfahren!="yes" && fortfahren!="no");

eben

PHP:
while(strcmp(fortfahren,"yes") != 0 && strcmp(fortfahren,"no")!=0);

schreiben musst.


oder ?! :D
 
hi,

und zu deiner frage: klar wird bei der eingabe von "5" oder sonstigem zeugs die schleifer wiederholt, es wird ja eine "true" als gesamtausdruck zurueckggegeben.

achso, das war also von dir so gewollt? ich dachte es soll nur wiederholt werden , wenn er "yes" eingibt.

Bevor der Thread nun geschlossen wird, wuerd mich echt noch interessieren wieso meine Lösung nicht den Zweck erfuellen wuerde?

ich habe das ganz unter c nach programmiert, damit ich hier auch keinen vom schwarzen schaf und dem woelfelein erzaehle. natuerlich kann man sich bei solchen sachen immer irren, das ich ganz normal und deswegen sollte man sich bei solchen logischen ausdruecken immer eine wahrheitstabelle anfertigen. ich bin das ganze nochmal durchgegangen und denke das meine wahrheitstabelle korrekt ist. hier nun der code:

Code:
#include 


int main(void) {

char input[30];

do {


printf("do u want to show this message again? type yes or no\n");

scanf("%s",input);

printf("u r input: %s",input);


} while((strcmp(input,"yes") != 0) && (strcmp(input,"no") != 0));


return 0;
}

meine ergebnisse nach den eingaben yes, no und andere eingaben die nicht no oder yes entsprechen:

Code:
tuney@neptun:~$ ./test
do u want to show this message again? type yes or no
yes
u r input: yes

tuney@neptun:~$ ./test
do u want to show this message again? type yes or no
no
u r input: no

tuney@neptun:~$ ./test
do u want to show this message again? type yes or no
ha
u r input: ha

do u want to show this message again? type yes or no
la
u r input: la

do u want to show this message again? type yes or no

wie man sehen kann wird die schleife nach den eingaben yes und no beendet. wird eine eingabe ungleich yes und no getaetigt wird die schleife wiederholt. viel. kann es sein das ich dein programm noch nicht richtig verstanden habe, aber sollte er nicht wiederholen, wenn ich yes eingeben und beenden wenn ich no eingebe?

hier nochmal meine wahrheitstabelle:

eingabe "yes" => Ausdruck wird zu false (schleife wiederholt nicht)
eingabe "no" => Ausdruck wird zu false (schleife wiederholt nicht)
eingabe "5" => Ausdruck wird zu true (schleife wiederholt)

ich wuerde mich sehr freuen, wenn mir jemand meine annahmen bestaetigen oder wiederlegen kann!

gruss tuney
 
also nochmal :)

die Idee war:

Abfrage: "Möchtest du das Programm beenden oder doch weiter fortfahren"

Möglichkeiten:

Ja -> Programm geht einfach weiter
Nein -> Programm wird beendet
Sonst -> Abfrage wird wiederholt

Zu deiner Wahrheitstabelle:
Die ist vollkommen in Ordnung. Die Schleife läuft solange wie die Bedingung ein TRUE liefert. Erhält man ein False (indem Yes bzw. No eingegebn wird) wird die Schleife beendet, da ja eins der beiden gewünschten Worte eingegeben wurde. Danach prüfe ich dann mit dem if / else was von beiden eingegeben wurde und je nachdem ob yes oder now wird der if bzw else teil ausgeführt und das programmläuft weiter bzw. wird beendet.

ich hoffe das ist jetzt klar :)

Grüße und gn8 Ajur

ps: Finds toll das du/ihr euch so Gedanken macht :)
 
hi,

ich bin so ein :depp:. ich dachte mit "yes", dass das programm einfach weiter gehen soll also, dass sich die schleife nochmal wiederholen soll!!! naja wer lesen kann is klar im vorteil.

@Sasquatch
Bevor der Thread nun geschlossen wird, wuerd mich echt noch interessieren wieso meine Lösung nicht den Zweck erfuellen wuerde?

ich habe mich absolut geirrt. dein lsg ist vollkommen richtig! tut mir leid.


gruss tuney
 
Klar kann man Strings mit == vergleichen... ihr müsst nur die richtigen Datentypen verwenden...

Code:
#include 
#include 
using namespace std;

int main() {
string test="";

cout
do {
cout cin>>test;
}while(test!="yes" && test!="no");

if(test=="yes")
{
cout }
else
{
cout }

return 0;
}

char[] ist C, C++ biete strings als Datentyp an.... und Variablen oben über main zu deklarieren ist böse :devil: (weil die sind dann global)

C++-Programmierung: Strings - Wikibooks

PS:
Code:
g++ --version
g++ (GCC) 4.2.3 (Ubuntu 4.2.3-2ubuntu7)
 
hi,

wie gesagt hab mit c++ nich viel zu tun, weil es in meinen augen nur ein billiger aufsatz auf c ist. aber jetzt sind wir ja alle schlauer.

gruss tuney
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben Unten