• 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?

VPS Starter Arubacloud
0 głosów
719 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 278 wizyt
pytanie zadane 24 listopada 2018 w Java przez Dudek Początkujący (370 p.)
0 głosów
1 odpowiedź 898 wizyt
pytanie zadane 6 stycznia 2019 w C i C++ przez Kacper Lasota Początkujący (250 p.)
0 głosów
1 odpowiedź 331 wizyt

93,030 zapytań

141,992 odpowiedzi

321,294 komentarzy

62,377 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

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...