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

Problem z Switch

Konkurs Mistrz Programowania
0 głosów
1,708 wizyt
pytanie zadane 8 października 2016 w C i C++ przez dewe Gaduła (4,300 p.)

Witam, jak dodac tutaj aby przy "default" wracalo mnie do "Twoj wybor:" i tak sie robilo az nie wpisze poprawnej wartosci czyli 1 lub 2? :) Probowalem petlami i tak dalej, ale nie wiem jak po prostu do tamtego momentu wrocic.

Probowalem return main(); ale to nie przynioslo niczego dobrego :D

 

#include <iostream>
#include <windows.h>
#include <cstdlib>

using namespace std;

int wybor;
string nickGracza;

void menu()
{
    cout << "Wybierz jedna z opcji:" << endl;
    cout << "-------------------------------------------" << endl;
    cout << "1. Graj" << endl;
    cout << "2. Pomoc" << endl;
    cout << "-------------------------------------------" << endl;
}

int main()
{
    cout << "Witaj - poczatek";
    menu();
    cout << "Twoj wybor: ";
    cin >> wybor;
    switch (wybor)
    {
        case 1:
            {
                cout << "funkcja gry";
            }
        break;
        case 2:
            {
                cout << "pomoc";
            }
        break;
        default:
            {
                cout << "zle wpisales gamoniu";
            }
    }

    return 0;
}

 

komentarz 8 października 2016 przez Kodeman Gaduła (4,480 p.)

Gdybyś zamiast tworzyć switcha w main, wstawił całość do osobnej funkcji, to w razie innego wyboru mógłbyś ponownie wywołać tę funkcję, tak jak chciałeś zrobić return main. Polecam (przynajmniej ja tak się nauczyłem) zamiast cin, używać funkcji getch():

wybor = getch();
switch (wybor)
{
     case '1': 
     case '2': 
...

 Dzięki temu wpisanie litery nie wysypie programu, a samego wyboru nie trzeba potwierdzać enterem.

4 odpowiedzi

+2 głosów
odpowiedź 8 października 2016 przez Szahid Pasjonat (20,970 p.)
wybrane 8 października 2016 przez dewe
 
Najlepsza
Witaj.

Proponuje dodać jeszcze 3 opcje Wyjdź

Wtedy Twój problem będzie można rozwiązać stosując  np to rozwiązanie

Weź kod programu do nieskończonej pętli i dodaj jeszcze jedną opcje w switchu w ktrrej ciele będzie funkcja exit(0); która zakończy jej działanie jeżeli użytkownik będzie chciał przestać korzystać z aplikacji.

Żeby rozwiązać problem z daniem szasy na wpisanie dobrych danych do switcha w instrukcji deafault wpisz continue co wywoła ponowne powtórzenie pętli.

 

Przykładowy kod podam w komentarzu.

 

Edit.

Stosowanie goto to zła praktyka. Postaraj się to zrobić na normalnych pętlach.
komentarz 8 października 2016 przez Szahid Pasjonat (20,970 p.)
edycja 8 października 2016 przez Szahid

Kod

#include <iostream>
#include <windows.h>
#include <cstdlib>

using namespace std;

int wybor;
string nickGracza;

void menu()
{
    cout << "Wybierz jedna z opcji:" << endl;
    cout << "-------------------------------------------" << endl;
    cout << "1. Graj" << endl;
    cout << "2. Pomoc" << endl;
    cout<<"3. Wyjscie"<<endl; //dodatkowa opcja
    cout << "-------------------------------------------" << endl;
}

int main()
{
     // wyrzuciłem etykiete od goto
        cout << "Witaj - poczatek";
        menu();
        for(;;)  //rownie dobrze moze byc petla while

        {


        cout << "Twoj wybor: ";
        cin >> wybor;
         if ( !cin.good())  //opis w komentarzu do posta 
        {
            cout <<"Nie podano liczy"<<endl;
            cin.clear();  //naprawia flago bledu
            cin.sync(); // czysci strumien wejsciowy 
            continue;
        }
        switch (wybor)
        {
            case 1:
                {
                    cout << "funkcja gry";
                }
            break;
            case 2:
                {
                    cout << "pomoc";
                }
            break;
            case 3:
                {
                    exit(0); // wyjście z programu
                }
                break;
            default:
                {
                    cout << "zle wpisales gamoniu";
                    Sleep(1000);
                    system("cls");
                    continue; //     dodalem continue zeby petla for wykonala sie jeszcze raz
                }
        }

        }
    return 0;
}

 

komentarz 8 października 2016 przez Szahid Pasjonat (20,970 p.)
PS

Metoda cin.good(); sprawdza czy flagi obie flagi błędu mają dobre wartości
komentarz 8 października 2016 przez dewe Gaduła (4,300 p.)
Nie rozumiem zbytnio ale w praktyce to pocwicze i zobacze jak to dziala, natomiast jezeli teraz wpisze poprawna wartosc czyli "1" lub "2" to i tak znowu mi kaze wpisac co wybieram, wiec funkcja nieskonczona to chyba nie jest dobry pomysl, lub trzeba dac jej jakis warunek, nie wiem, masz moze pomysl? :)

 

PS : Bardzo dziekuje za pomoc i poswiecony czas ;)
komentarz 8 października 2016 przez Szahid Pasjonat (20,970 p.)
Nie dokońca rozumiem co chcesz osiągnąć. Może napisze w punktach jak ja to rozumiem.

 

1 Program ma mieć 3 opcje ( Gry , Pomocy  i naturalnie opcje wyjścia)

2 Ma ograniczyć urzytkownikawi wpisanie niepoprawnych danych ( wydawało mi się że o to chodzi w pytaniu)

 

Co jeszcze ma robić?  Jak ma działać ?
komentarz 8 października 2016 przez dewe Gaduła (4,300 p.)
Jezeli wpiszesz "1" ze chcesz grac to kaze ponownie wybrac jedna z opcji, a powinno sie wyswietlic jedynie "funkcja gry" po wpisaniu "1" :)

tak samo z "2", wyskakuje ponowna opcja wyboru, a powinno tylko wyskoczyc "pomoc"
komentarz 8 października 2016 przez Szahid Pasjonat (20,970 p.)
Looz.  

Zaraz wstawie kod.
komentarz 8 października 2016 przez Szahid Pasjonat (20,970 p.)
#include <iostream>
#include <windows.h>
#include <cstdlib>

using namespace std;

int wybor;
string nickGracza;

void menu()
{
    cout << "Wybierz jedna z opcji:" << endl;
    cout << "-------------------------------------------" << endl;
    cout << "1. Graj" << endl;
    cout << "2. Pomoc" << endl;
    cout<<"3. Wyjscie"<<endl; //dodatkowa opcja
    cout << "-------------------------------------------" << endl;
}

int main()
{
     // wyrzuciłem etykiete od goto
        cout << "Witaj - poczatek";
        menu();
        bool kontrolka =1; // tworze zmienna pomocnicza i nadaje jej wartosc 1
        while (kontrolka ) //zmienilem na pentle while

        {


        cout << "Twoj wybor: ";
        cin >> wybor;

        if ( !cin.good())
        {
            cout <<"Nie podano liczby"<<endl;
            cin.clear();  //naprawia flago bledu
            cin.sync(); // czysci strumien wejsciowy
            continue;
        }
        switch (wybor)
        {
            case 1:
                {
                    cout << "funkcja gry";
                    kontrolka=0;
                }
            break;
            case 2:
                {
                    cout << "pomoc";
                    kontrolka=0;
                }
            break;
            case 3:
                {
                    exit(0); // wyjście z programu
                }
                break;
            default:
                {
                    cout << "zle wpisales gamoniu";
                    Sleep(1000);
                    system("cls");
                    continue; //     dodalem continue zeby petla for wykonala sie jeszcze raz
                }
        }

        }
    return 0;
}

 

komentarz 8 października 2016 przez dewe Gaduła (4,300 p.)
wszystko dziala jak nalezy, bardzo dziekuje! :)
komentarz 8 października 2016 przez Szahid Pasjonat (20,970 p.)
Nie ma problemu :)
+1 głos
odpowiedź 8 października 2016 przez gosu93 Początkujący (340 p.)
#include <iostream>
#include <windows.h>
#include <cstdlib>

using namespace std;

int wybor;
string nickGracza;

void menu()
{
    cout << "Wybierz jedna z opcji:" << endl;
    cout << "-------------------------------------------" << endl;
    cout << "1. Graj" << endl;
    cout << "2. Pomoc" << endl;
    cout << "-------------------------------------------" << endl;
}

int main()
{
    cout << "Witaj - poczatek";
    do{
        menu();
        cout << "Twoj wybor: ";
        cin >> wybor;
        switch (wybor)
        {
            case 1:
                {
                    cout << "funkcja gry" << endl;
                }break;
            case 2:
                {
                    cout << "pomoc" << endl;
                }break;
            default:
                {
                    cout << "zle wpisales gamoniu\n" << endl;
                }break;
        }
    }while(wybor < 1 || wybor > 2);
    return 0;
}

 

komentarz 8 października 2016 przez gosu93 Początkujący (340 p.)

Jeszcze lepszym rozwiązaniem jest:

#include <iostream>
#include <windows.h>
#include <cstdlib>

using namespace std;

int wybor;
string nickGracza;

void menu();

bool main_menu ()
{
        menu();
        cout << "Twoj wybor: ";
        cin >> wybor;
        switch (wybor)
        {
            case 1:
                {
                    cout << "funkcja gry" << endl;
                }   return false;
            case 2:
                {
                    cout << "pomoc" << endl;
                    return false;
                }
            default:
                {
                    cout << "zle wpisales gamoniu\n" << endl;
                }   return true;
        }
}

int main()
{
    cout << "Witaj - poczatek";
    while(main_menu());
    return 0;
}

void menu()
{
    cout << "Wybierz jedna z opcji:" << endl;
    cout << "-------------------------------------------" << endl;
    cout << "1. Graj" << endl;
    cout << "2. Pomoc" << endl;
    cout << "-------------------------------------------" << endl;
}

 

komentarz 8 października 2016 przez dewe Gaduła (4,300 p.)
nie do końca bo przy kompilowaniu mam errory :P pracuje na win 7

 

"error: stray '\240' in program"
komentarz 8 października 2016 przez gosu93 Początkujący (340 p.)
która linia?
0 głosów
odpowiedź 8 października 2016 przez niezalogowany

Chyba wystarczy objąć całego maina (ewentualnie część) niekończącą się pętlą while o w taki sposób:

#include <iostream>
#include <windows.h>
#include <cstdlib>

using namespace std;

int wybor;
string nickGracza;

void menu()
{
    cout << "Wybierz jedna z opcji:" << endl;
    cout << "-------------------------------------------" << endl;
    cout << "1. Graj" << endl;
    cout << "2. Pomoc" << endl;
    cout << "-------------------------------------------" << endl;
}

int main()
{
    while(true)
    {
        cout << "Witaj - poczatek";
        menu();
        cout << "Twoj wybor: ";
        cin >> wybor;
        switch (wybor)
        {
            case 1:
                {
                    cout << "funkcja gry";
                }
            break;
            case 2:
                {
                    cout << "pomoc";
                }
            break;
            default:
                {
                    cout << "zle wpisales gamoniu";
                    Sleep(1000); // odczekanie sekundy
                    system("cls"); // wyczyszczenie konsoli
                }
        }
    }

    return 0;
}

 

komentarz 8 października 2016 przez Szahid Pasjonat (20,970 p.)
po wczytaniu danych możesz sprawdzić czy dane pasują do formatu za pomocą funkcji cin.good  

jeżeli nie będą pasowały to wyczyść strumień popraw flagi błędów i zastosuj continue jak na przykładnie jaki podałem niżej
komentarz 8 października 2016 przez dewe Gaduła (4,300 p.)
zbytnio nie rozumiem :/ poczytalem troche o cin.good ale nie rozumiem jak to dziala takze chyba poszukam innego rozwiazania
komentarz 8 października 2016 przez Szahid Pasjonat (20,970 p.)
Twoja decyzja. Jednak jeśli zamirzasz uczyć się cpp to Cie to nie ominie bo to podstawa.

Jak chcesz moge dopisać fragment kodu o którym gadamy i z grubsza opowiedzieć co się dzieje w komentarzach
komentarz 8 października 2016 przez dewe Gaduła (4,300 p.)
Jezeli moglbys to by bylo fajnie :)
komentarz 8 października 2016 przez Szahid Pasjonat (20,970 p.)
(Zakładam że pracujesz pod windowsem. Na linukcie sprawa jest podobne z różnicą w 1 detalu  )

 

Za wprowadzanie danych odpowiedzialny jest obiekt cin. Posiada od 2 flagi błędu ( dwie zmienne bool które są ustawione na 0 przy tworzeniu obiektu cin). Jeżeli wprowadzanie danych się niepowiedzie z powodu złych danych wprowadzonych przez  urzytkownika to pierwsza z nich zmienia swoją wartość co jest sygnałem dla programisty że coś jest nie tak)

Jeśli chcesz dalej wprowadzać dane to musisz naprawić obiekt cin. Robisz to za pomocą dwuch metod

cin.clear(); //ustawia flagi błędu na wartości początkowe

cin.sync();// czyści buffor tzn usuwa ze strumienia wszyszystko ( co jest przydatne kiedy urzytkownik do zmiennej int chce zapisać "hwergyw")

 

przykład zastosowanie tych metod podam w kodzie programu który wstawiłem ( zedytuje go)
–3 głosów
odpowiedź 8 października 2016 przez JanuszSTW Początkujący (480 p.)
komentarz 8 października 2016 przez unknown Nałogowiec (39,560 p.)
Co za głupi pomysł.

Podobne pytania

0 głosów
2 odpowiedzi 479 wizyt
pytanie zadane 30 marca 2019 w C i C++ przez Marcinek69 Początkujący (450 p.)
0 głosów
1 odpowiedź 690 wizyt
pytanie zadane 30 maja 2018 w C i C++ przez Virius Początkujący (490 p.)

93,656 zapytań

142,577 odpowiedzi

323,100 komentarzy

63,174 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

Kursy INF.02 i INF.03
...