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

Problem z Switch

Object Storage Arubacloud
0 głosów
574 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,930 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,930 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,930 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,930 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,930 p.)
Looz.  

Zaraz wstawie kod.
komentarz 8 października 2016 przez Szahid Pasjonat (20,930 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,930 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,930 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,930 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,930 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 223 wizyt
pytanie zadane 30 marca 2019 w C i C++ przez Marcinek69 Początkujący (450 p.)
0 głosów
1 odpowiedź 550 wizyt
pytanie zadane 30 maja 2018 w C i C++ przez Virius Początkujący (490 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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!

...