• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Pętla while/do..while się nie zapętla?

Object Storage Arubacloud
0 głosów
576 wizyt
pytanie zadane 4 października 2018 w C i C++ przez jarekmarek Nowicjusz (120 p.)

Cześć, spróbowałem napisać zapętlony w nieskończoność quiz z wszystkimi dotychczas mi znanymi metodami (a nie znam ich wiele narazie)  i było to najwyraźniej zbyt ambitne, gdyż patrząc na kod wszystko według mnie powinno działać, a pętla do...while, którą użyłem w pętli while(true) nie zapętla mi się i od razu przeskakuje dalej. Coś jakby pętla while(true) nie pozwalała na żadną inną pętlę w środku.

Moje pytanie brzmi: Czy jest to jakiś mały błąd z mojej strony, który da się naprawić bez większego zmieniania, czy po prostu nie mogę użyć pętli wewnątrz pętli i muszę zapisać ten quiz inaczej? Dodam, iż napisałem już drugi quiz trochę mądrzej i po prostu zapisałem więcej w pliku tekstowym, ale nadal mi ten problem nie daje spokoju.

 

    while(true)
    {
        cout << "------------------------------------------------------------------------------------------------------------------------"
             << "                                                  QUIZ"                                                              << endl;
        cout << "------------------------------------------------------------------------------------------------------------------------" << endl << endl;
        cout << "1. START \n2. EXIT\n";
        wybor=getch();
        switch(wybor)
        {
        case '1':
            {

                do
                {
                    cout << pytanie[nr_pytania] << "\n";
                    switch(nr_pytania)
                    {
                        case 0:
                            {
                                cout << "a. OdpowiedzA. \nb. OdpowiedzB. \nc. OdpowiedzC.\n";
                            }
                            break;
                        case 1:
                            {
                                cout << "a. OdpowiedzA. \nb. OdpowiedzB. \nc. OdpowiedzC.\n";
                            }
                            break;
                        case 2:
                            {
                            cout << "a. OdpowiedzA. \nb. OdpowiedzB. \nc. OdpowiedzC.\n";
                            }
                            break;
                        default: cout << "Brak pytan???"; break;
                    }

                        cin >> odpowiedz_xo[nr_pytania];
                        if(odpowiedz[nr_pytania]==odpowiedz_xo[nr_pytania])
                        {
                            nr_pytania++;
                            cout << "Dobrze!";
                            if(nr_pytania<3)
                            {
                                cout << " Nacisnij aby wyswietlic nastepne pytanie...";
                                getch();
                            }
                            else if(nr_pytania==3)
                            {
                                cout << "\nWygrales!!!!";
                                getch();
                            }
                        }
                } while(nr_pytania<3 && odpowiedz[nr_pytania]==odpowiedz_xo[nr_pytania]);
            if (odpowiedz[nr_pytania]!=odpowiedz_xo[nr_pytania])
                {
                    cout << "Zle! Nacisnij aby rozpoczac od poczatku.";
                    getch();
                    system("cls");
                }

            }
        break;
        case '2': exit(1); break;
        default:
            {
                cout << "Nie ma takiej opcji. Nacisnij cokolwiek aby moc znow wybrac opcje.\n";
                getch();
                system("cls");
            }
        break;
        }
    }


    return 0;
}

Wiem, ze jest to troche przekombinowane, ale nie chcialo mi sie pisac wszystkiego w pliku tekstowym i tego czytac, bo to w sumie tylko 3 pytania. 

2 odpowiedzi

0 głosów
odpowiedź 4 października 2018 przez draghan VIP (106,230 p.)
Jeśli masz return w pętli, to strumień wykonania programu zakończy pracę z bieżącą funkcją i zwróci wynik do funkcji nadrzędnej.
komentarz 4 października 2018 przez jarekmarek Nowicjusz (120 p.)
Ale przecież nie mam return w pętli (chyba??). Nie znam się to dziwnie się czuję w jakikolwiek sposób tutaj dyskutować, ale return mam poza pętlą.
1
komentarz 4 października 2018 przez draghan VIP (106,230 p.)
Masz rację. Zmyliło mnie Twoje formatowanie - nie uważasz że lepiej jest mieć ładnie sformatowany kod? ;)

Ale ale - teraz zamiast 'return' używasz w pętli 'exit', co ma bardziej drastyczny skutek. Nie tylko kończy aktualną funkcję, lecz zamyka cały program.
komentarz 4 października 2018 przez jarekmarek Nowicjusz (120 p.)
Chciałbym potrafić ładnie sformatować kod, ale niestety nie potrafię :D exit(1) jest potrzebne, gdyż cały quiz jest zapętlony, tzn. gdy ktoś np. przegra to ma powrócić do głównego menu i gdy w menu naciśnie 2 to wtedy ma użyć exit(1), żeby wyjść z programu.

Pętla do...while jest zamknięta w case 1, więc exit użyje tylko w momencie gdy użytkownik naciśnie 2 menu. Problem jest w tym, że program wykonuje raz pętlę i później po prostu z niej ucieka dopóki znowu jej nie napotka po drodze (cały program jest zapętlony).

 

Co do formatowania to gdy już się nauczę c++ na tyle dobrze by móc cokolwiek zacząć to zacznę podpatrywać inne kody źródłowe i uczyć się ich ładnego stylu, a przynajmniej takie mam plany.
komentarz 4 października 2018 przez draghan VIP (106,230 p.)
Okej, widzę że "na szybko" to żadna analiza. Przepraszam, zerknę tutaj dokładnie, jak wrócę z pracy.
1
komentarz 4 października 2018 przez draghan VIP (106,230 p.)

Co ma oznaczać ten warunek?

while(nr_pytania < 3 && odpowiedz[nr_pytania] == odpowiedz_xo[nr_pytania]);

Że pętla ma się wykonywać, dopóki... odpowiedź jest poprawna i numer pytania nie przekroczy wartości 2? Czy nie można pozbyć się drugiej części warunku? W ciele pętli i tak nie zwiększysz wartości nr_pytania, jeśli odpowiedź nie będzie się zgadzała.

Odpowiadając na drugą część pytania: nie ma żadnych przeciwwskazań do używania pętli w pętli, o ile oczywiście ich warunki wyjścia są logicznie uzasadnione, a nie że np. jedna inkrementuje licznik, a druga ten sam licznik dekrementuje, czy coś. :)

komentarz 4 października 2018 przez jarekmarek Nowicjusz (120 p.)
Dziękuję za poprawkę :D

Odpaliłem nowy projekt i zauważyłem, że jeśli w while'u mam switcha, w switchu natomiast while a w tym while'u kolejnego switcha to się to po prostu buguje, a przynajmniej w codeblocksie, dlatego po prostu zostawiam ten problem, ale dziękuję jeszcze raz za poprawkę.
1
komentarz 4 października 2018 przez draghan VIP (106,230 p.)

zauważyłem, że jeśli w while'u mam switcha, w switchu natomiast while a w tym while'u kolejnego switcha to się to po prostu buguje

Tutaj nie chodzi o samo to, że masz jakąś pętlę w jakimś switchu, tylko chodzi o samą logikę wyjścia. Coś w warunkach masz nie tak, jak trzeba. Najlepiej odpal sobie debugger i prześledź, jak zmieniają się wartości zmiennych w trybie krokowym. :)

Natomiast jeśli gracz wygra i w ten sposób dojdzie do pytania 3, którego nie ma to wtedy pętla by się znowu wykonała, a chcę by w takim wypadku pętla została opuszczona

Nie do końca rozumiem, jak gracz może dojść do pytania, którego nie ma, ale jeśli będziesz mieć taką pętlę:

int nr_pytania = 0;
do
{
    std::cout << nr_pytania << '\n';
    // pomijam tutaj jakąkolwiek inną logikę dla uproszczenia
    ++nr_pytania;
} while(nr_pytania < 3);

to wykona się ona trzy razy - dla wartości kolejno 0, 1 i 2. Dla trójki już się nie wykona - warunek sprawdzany jest na końcu pętli.

komentarz 5 października 2018 przez jarekmarek Nowicjusz (120 p.)
Niestety nie potrafie/nie wiem jak prześledzić wartości zmiennych. Napisałem całość na nowo w uproszczony sposób i zostawiam ten temat na razie haha.

Dziękuję mimo to za pomoc, dałem plusa gdzie tylko mogłem  (o ile to w ogóle coś daje na tym forum :))
0 głosów
odpowiedź 4 października 2018 przez PanRik Gaduła (4,510 p.)

Możesz spróbować kompilować z flagą 

-O0

Czasami kompilator jest za mądry :)

Podobne pytania

0 głosów
3 odpowiedzi 244 wizyt
pytanie zadane 24 listopada 2018 w Java przez Dudek Początkujący (370 p.)
0 głosów
1 odpowiedź 659 wizyt
pytanie zadane 6 stycznia 2019 w C i C++ przez Kacper Lasota Początkujący (250 p.)
0 głosów
1 odpowiedź 310 wizyt

92,540 zapytań

141,383 odpowiedzi

319,482 komentarzy

61,928 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...