Problem ze switch() i sekcja default

0

Stwierdziłem, że zamienie instrukcję warunkową w swoim programie na switch'e bo zrobił się straszny bałagan i pojawił się kolejne problemy. Pierwszy z nich, to że program jak już jest w case '1' i przy wprowadzeniu błędnych wartości nie wraca do "bet=getchar();" lecz do początku nieskończonej pętli - w tym przypadku wyświetla menu. Kolejnym błędem jest wchodzenie w default, po pierwszym wykonaniu całej pętli i wybraniu po raz kolejny case '1'

cout << "Co chcesz zrobic?\n";
cout << "1. Grac.\n";
cout << "2. Sprawdzic balans.\n";
cout << "3. Zasady.\n";
cout << "4. Zakonczyc gre.\n";
x = getch();
switch (x) {
case '1': {
    system("cls");
    cout << "Co chcesz obstawic? [L/X/H]\n";
    bet = getchar();
    switch (bet) {
    case 'l':
    case 'L':
    case 'H':
    case 'h':
    case 'x':
    case 'X': {
    } break;

    default: {
        system("cls");
        cout << "Zla opcja! Jedyne mozliwe to: L/X/H\n";
        cout << "Co chcesz obstawic? [L/X/H]\n";
        cout << endl;
    }
    }
} break;
0

Gdy wejdzie Ci w default, to od razu z niego wychodzi do głównej pętli. Bo dlaczego ma nie wychodzić, skoro nie ma tam niczego innego do roboty? W głównej pętli pewnie czeka na wciśnięcie '1' albo ma coś jeszcze w buforze... ciężko powiedzieć. Generalnie powinieneś to rozwalić na funkcje/metody, żeby nie robić takich zagnieżdżonych struktur. Wtedy wszystko jest dużo prostsze i bardziej czytelne. W tym momencie powinieneś JAKOŚ po default wejść do bet=getchar(). Bez użycia goto nie jest to możliwe w tym przypadku, a więc wszystko jest źle.

Musisz to rozwalić na mniejsze funkcje.
Jedna - ma wyświetlić menu

  • druga - pobrać wejście i odpalić odpowiednią kolejną funkcję.
3

Switch nie jest pętlą. W przedstawionym kodzie nie ma żadnej pętli.

0

Okej czyli jeden błąd wyjaśniony. Teraz tylko pytanie dlaczego program wchodzi w default. @Juhas endl na końcu nie powinien czyścić bufora? Jeżeli to ma znaczenie to kiedy w „bet=getchar()” wpisze kilka znaków np 4444, wtedy muszę 4 razy wcisnąć „jedynkę” zanim program wejdzie w case’1’

0

No tak, bo czytasz tylko jeden znak, a w buforze masz 4.

1

Wyprintuj sobie zawartość bet:

cout << +bet << '\n';

Zapewne będzie to 10, czyli znak nowej linii (\n), bo wczytujesz znak po znaku.

1 użytkowników online, w tym zalogowanych: 0, gości: 1