Problem mit Do-While Schleife

  • C++

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Problem mit Do-While Schleife

    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-Quellcode

    1. #include <iostream>
    2. #include <fstream>
    3. char fortfahren[3];
    4. int main()
    5. {
    6. cout << "Welcome!" << endl;
    7. trennlinie();
    8. /* Solange Abfragen bis User "yes" oder "no" eingegeben hat.
    9. Danach wird dann geprüft was von beiden er eingegeben hat
    10. und das Programm forgesetzt oder beendet.
    11. */
    12. do
    13. {
    14. cout << "If you want to continue type \"yes\" (type \"no\" to exit the programm)" << endl;
    15. cin >> fortfahren;
    16. }
    17. while(fortfahren=="yes") && fortfahren=="no");
    18. if(fortfahren=="no")
    19. {
    20. cout << "Programm closed" << endl;
    21. }
    22. else
    23. {
    24. Hauptprogrammteil
    25. }
    26. return 0;
    27. }
    Alles anzeigen


    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 <cstring>).

    hier mein vorschlag:


    #include <iostream>
    #include <fstream>

    char fortfahren[3];

    int main()
    {
    cout << "Welcome!" << endl;
    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 << "If you want to continue type \"yes\" (type \"no\" to exit the programm)" << endl;
    cin >> fortfahren;
    }
    while(strcmp(fortfahren,"yes") == 0);
    if(strcmp(fortfahren,"no") == 0)
    {
    cout << "Programm closed" << endl;
    }
    else
    {

    Hauptprogrammteil

    }

    return 0;
    }


    gruss tuney
    [FONT="Arial Black"]
    os:[SIZE="1"]linux slackware 10.0[/SIZE]
    machine:[SIZE="1"]intel core dual 3.6GHz[/SIZE]
    [/FONT]
  • 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
    Wenn du zum weibe gehst nimm die Peitsche mit (Nietzsche)
  • @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 << "If you want to continue type \"yes\" (type \"no\" to exit the programm)" << endl;
    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-Quellcode

    1. do
    2. {
    3. cout << "If you want to continue type \"yes\" (type \"no\" to exit the programm)" << endl;
    4. cin >> fortfahren;
    5. }
    6. while(strcmp(fortfahren,"yes") != 0 && strcmp(fortfahren,"no")!=0);
    7. if(strcmp(fortfahren,"no") == 0)
    8. {
    9. cout << "Programm closed" << endl;
    10. }
    11. else
    12. {
    13. ....
    14. }
    Alles anzeigen


    musste <cstring> 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.

    Quellcode

    1. do
    2. {
    3. cout << "If you want to continue type \"yes\" (type \"no\" to exit the programm)" << endl;
    4. cin >> fortfahren;
    5. } 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!!!

    Quellcode

    1. int c_var = 0;
    2. do
    3. {
    4. cout << "If you want to continue type \"yes\" (type \"no\" to exit the programm)" << endl;
    5. cin >> fortfahren;
    6. if(strcmp(fortfahren,"yes") == 0) {
    7. c_var = 1;
    8. cout << "yes eingeben, schleife wird fortgefuehrt" << endl;
    9. } else if(strcmp(fortfahren,"no") == 0) {
    10. c_var = 0;
    11. cout << "no eingeben, schleife wird abgebrochen" << endl;
    12. } else {
    13. cout << "weder no noch yes eingeben, schleife wird fortgefuehrt" << endl;
    14. c_var = 1;
    15. }
    16. }
    17. while(c_var);
    Alles anzeigen


    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:

    Quellcode

    1. do
    2. {
    3. cout << "If you want to continue type \"yes\" (type \"no\" to exit the programm)" << endl;
    4. cin >> fortfahren;
    5. }
    6. 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
    [FONT="Arial Black"]
    os:[SIZE="1"]linux slackware 10.0[/SIZE]
    machine:[SIZE="1"]intel core dual 3.6GHz[/SIZE]
    [/FONT]
  • 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-Quellcode

    1. while(fortfahren!="yes" && fortfahren!="no");


    eben

    PHP-Quellcode

    1. 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:

    Quellcode

    1. #include <stdio.h>
    2. int main(void) {
    3. char input[30];
    4. do {
    5. printf("do u want to show this message again? type yes or no\n");
    6. scanf("%s",input);
    7. printf("u r input: %s",input);
    8. } while((strcmp(input,"yes") != 0) && (strcmp(input,"no") != 0));
    9. return 0;
    10. }
    Alles anzeigen


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

    Quellcode

    1. [email protected]:~$ ./test
    2. do u want to show this message again? type yes or no
    3. yes
    4. u r input: yes
    5. [email protected]:~$ ./test
    6. do u want to show this message again? type yes or no
    7. no
    8. u r input: no
    9. [email protected]:~$ ./test
    10. do u want to show this message again? type yes or no
    11. ha
    12. u r input: ha
    13. do u want to show this message again? type yes or no
    14. la
    15. u r input: la
    16. do u want to show this message again? type yes or no
    Alles anzeigen


    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
    [FONT="Arial Black"]
    os:[SIZE="1"]linux slackware 10.0[/SIZE]
    machine:[SIZE="1"]intel core dual 3.6GHz[/SIZE]
    [/FONT]
  • 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
    [FONT="Arial Black"]
    os:[SIZE="1"]linux slackware 10.0[/SIZE]
    machine:[SIZE="1"]intel core dual 3.6GHz[/SIZE]
    [/FONT]
  • Klar kann man Strings mit == vergleichen... ihr müsst nur die richtigen Datentypen verwenden...

    C-Quellcode

    1. #include <iostream>
    2. #include <string>
    3. using namespace std;
    4. int main() {
    5. string test="";
    6. cout<<"Willkommen"<<endl;
    7. do {
    8. cout<<" yes für Hauptprogramm, no für Beenden"<<endl;
    9. cin>>test;
    10. }while(test!="yes" && test!="no");
    11. if(test=="yes")
    12. {
    13. cout<<"Ich bin das Hauptprogramm."<<endl;
    14. }
    15. else
    16. {
    17. cout<<"Ich bin das Ende."<<endl;
    18. }
    19. return 0;
    20. }
    Alles anzeigen


    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:

    Quellcode

    1. g++ --version
    2. g++ (GCC) 4.2.3 (Ubuntu 4.2.3-2ubuntu7)
    [SIZE=1]
    Was ist der Unterschied zwischen einem U-Boot und MS Windows?
    Keiner, sobald man ein Fenster aufmacht, fangen die Probleme an
    Alle Tips von mir ohne Gewähr und auf eigenes Risiko !!
    UP1 UP2 UP3[/SIZE][SIZE=1]
    [/SIZE]
  • 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
    [FONT="Arial Black"]
    os:[SIZE="1"]linux slackware 10.0[/SIZE]
    machine:[SIZE="1"]intel core dual 3.6GHz[/SIZE]
    [/FONT]