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

Pętla i switch

Object Storage Arubacloud
0 głosów
472 wizyt
pytanie zadane 26 stycznia 2017 w C i C++ przez Śwież4k Bywalec (2,570 p.)

Chciałbym, aby w przypadku "default" program się powtórzył. Niestety pętla nie chce zadziałać.

#include <iostream>
#include <string>

using namespace std;

void graj ()
{
cout << "gra" << endl;
}
void wczytaj ()
{

}
void multiplayer ()
{

}
int main ()
{
    int wybor;
 while (wybor != "1" && wybor != "2" && wybor != "3" && wybor != "4")
        {

    cout << "1. Graj"<< endl;
    cout << "2. Wczytaj stan gry"<< endl;
    cout << "3. Tryb Multiplayer"<< endl;
    cout << "4. Koniec"<< endl;
    cout << "Wybierz: ";
    cin >> wybor;
    switch (wybor):

    {
    case 1:
        graj();
        break;
    case 2:
        wczytaj();
        break;
    case 3:
        multiplayer();
        break;
    case 4:
        cout << "Dziekuje za gre!"<< endl;
        break;
    default:
        cout << "Niepoprawny wybor."<< endl;
        break;


    }
}


}

 

2 odpowiedzi

+2 głosów
odpowiedź 26 stycznia 2017 przez niezalogowany
edycja 26 stycznia 2017
#include <iostream>
#include <string>

using namespace std;

void graj()
{
    cout << "gra" << endl;
}

void wczytaj()
{
    cout << "wczytaj" << endl;
}

void multiplayer()
{
    cout << "multiplayer" << endl;
}

int main ()
{
    int wybor;
    while(true)
    {

        cout << "1. Graj"<< endl;
        cout << "2. Wczytaj stan gry"<< endl;
        cout << "3. Tryb Multiplayer"<< endl;
        cout << "4. Koniec"<< endl;
        cout << "Wybierz: ";
        if(cin >> wybor)
        {
            switch (wybor)
            {
            case 1:
                graj();
                break;
            case 2:
                wczytaj();
                break;
            case 3:
                multiplayer();
                break;
            case 4:
                cout << "Dziekuje za gre!"<< endl;
                break;
            default:
                cout << "Niepoprawny wybor."<< endl;
                break;
            }
        }
        else cout<<"Podales litere :C"<<endl;
    }
}

Tak może być?

komentarz 26 stycznia 2017 przez Alex.Ironside Stary wyjadacz (14,900 p.)
"brak nawiasu klamrowego kończącego switch"

Możesz powiedzieć który? Jak tam widzę 3 otwarte i 3 zamknięte
komentarz 26 stycznia 2017 przez Śwież4k Bywalec (2,570 p.)
Dzięki ^^
komentarz 26 stycznia 2017 przez niezalogowany
Źle skopiowałem kod ;)
komentarz 26 stycznia 2017 przez niezalogowany
Śwież4k - troszkę zmieniłem kod, by spełniał to co chcesz osiągnąć.
komentarz 26 stycznia 2017 przez Śwież4k Bywalec (2,570 p.)

Zauważyłem, dzięki. Mógłbyś mi jeszcze wytłuamczyć czemu w pętli

while (wybor != "1" && wybor != "2" && wybor != "3" && wybor != "4")

Nie może być cudzysłowów, bo nie chcę popełniać tego ewentualnego błędu w przyszłości.

Napisałeś to uprzednio, ale przy edycji kodu najwyraźniej usunąłeś to wyjaśnienie

komentarz 26 stycznia 2017 przez niezalogowany

Zmienna wybór jest typem liczbowym. Liczby nie można przyrównać do ciągu znaków w C++ (czyli np "ala ma kota"). Czyli taki kod byłby dobrze tak:

while (wybor != 1 && wybor != 2 && wybor != 3 && wybor != 4)

Ewentualnie mógłbyś zmienić typ zmiennej wybór na string i by działało na poprzedniej zasadzie ;) 

komentarz 26 stycznia 2017 przez niezalogowany

To też można tłumaczyć kodem tak:

int liczba = 5; // po prostu liczba
string napis = "ala ma kota"; // napis musi miec swój początek i koniec
// definiują je cudzysłowia
char znak = 'a'; // znak nie musi mieć zaznaczone gdzie się kończy a 
// gdzie zaczyna, ale inaczej kompilator nie wiedziałby czy chodzi o // litere a czy o jakąś zmienną, która wcześniej została taka nazwana np

char a = 'd';
char znak = a; // byloby tak bez sensu :)

// no i analogicznie tutaj powinno być:
if(liczba == 5) // ...
if(napis == "5") // ...
if(znak == '5') // ...

 

+1 głos
odpowiedź 26 stycznia 2017 przez Molester Bywalec (2,920 p.)
#include <iostream>
#include <string>

using namespace std;

void graj()
{
    cout << "gra" << endl;
}
void wczytaj()
{

}
void multiplayer()
{

}


int main ()
{

    int wybor;

    cout << "1. Graj"<< endl;
    cout << "2. Wczytaj stan gry"<< endl;
    cout << "3. Tryb Multiplayer"<< endl;
    cout << "4. Koniec"<< endl;
    cout << "Wybierz: ";

    cin>> wybor;

    while (wybor!= 1 && wybor!=2 &&wybor!=3 &&wybor!=4)
    {
        cout << "Niepoprawny wybor" << endl;
        cin.clear();
        cin.sync();
        cin>>wybor;
    }

    switch (wybor)
    {
    case 1:
        graj();
        break;
    case 2:
        wczytaj();
        break;
    case 3:
        multiplayer();
        break;
    case 4:
        cout << "Dziekuje za gre!"<< endl;
        break;
    }
}

//Ja to zrobiłem tak, bez defaulta.

 

komentarz 26 stycznia 2017 przez Molester Bywalec (2,920 p.)
cin.clear() czyści flagi błędu, spowodowane przez wpisanie np tekstu zamiast liczby.

http://cpp0x.pl/kursy/Kurs-C++/Poziom-4/Wczytywanie-zawartosci-pliku-a-kontrola-bledow/485     (------ tutaj co nieco o flagach.

cin.sync() czyści bufor strumienia.

Tutaj trochę konkretniej wytłumaczone (z przykładami)

http://cpp0x.pl/kursy/Kurs-C++/Poziom-1/Obsluga-strumienia-wejsciowego/12
1
komentarz 26 stycznia 2017 przez Molester Bywalec (2,920 p.)
Swoją drogą co prawda w takim małym (jak na razie) programie może to wydać się niepotrzebne , ale bardzo zachęcam do nazywania zmiennych i funkcji po angielsku - to bardzo dobry nawyk i fajnie go pielęgnować.

Podobne pytania

0 głosów
1 odpowiedź 270 wizyt
pytanie zadane 3 kwietnia 2018 w C i C++ przez xLooks Początkujący (250 p.)
0 głosów
1 odpowiedź 605 wizyt
0 głosów
2 odpowiedzi 812 wizyt

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

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

...