przekazanie argumentu do switch - nie dziala

0

Witam wszystkich kolegów,
Dopiero zaczynam przygodę z C++ i od paru dni ćwiczę. Postanowiłem napisać prosty kalkulator z menu wyświetlane poprzez wywołanie funkcji. Funkcja poprawnie przekazuje parametr ale tylko raz. Po wykonaniu jakichkolwiek obliczeń przy pomocy kalkulatora chcćc wybrać ponowne obliczenia, program zachowuje się tak ze wywołuje kolejno całego switcha az kończy prace.

Nie wiem czy jasno to opisałem ale przy pierwszym uruchomieniu switch działa po czym przy probie następnych obliczeń parametr juz nie jest do niego przekazywany.

Nie chce rozwiązania na tacy tylko malej podpowiedzi wolałbym sam dojść do rozwiązania.

Poniżej kod:

#include <iostream>

using namespace std;

int menu(int wybor1){
    std::cout <<"[1] Dodawanie"<<endl;
    std::cout <<"[2] Odejmowanie"<<endl;
    std::cout <<"[3] Mnozenie"<<endl;
    std::cout <<"[4] Dzielenie"<<endl;
    std::cout <<"[5] Koniec"<<endl;
    std::cin >>wybor1;
    return wybor1;
    }

int main()
{
    int wybor, a, b, wynik;
    wybor = menu(wybor);
    switch(wybor){
        case 1:
        std::cout <<"Wybrales dodawanie"<<endl;
        std::cout <<"Wpisz a:"<<endl;
        std::cin>>a;
        std::cin.good();
        if( cin.good() == false){
                std::cout<<"Wprowadziles niepoprawne dane. Sprobuj jeszcze raz"<<endl;
                menu(wybor);
        }
        else {
        std::cout <<"Wpisz b:"<<endl;
        std::cin>>b;
        wynik = a + b;
        std:cout <<"Wynik dodawania to: "<< wynik<<endl;
        menu(wybor);
        }

        case 2:
        std::cout<<"Wybrales odejmowanie"<<endl;
        std::cout<<"Wpisz a:"<<endl;
        std::cin>>a;
        std::cin.good();
            if ( cin.good() == false ){
                std::cout<<"Wprowadziles niepoprawne dane. Sprobuj jeszcze raz"<<endl;
                menu(wybor);
            }
            else{
                std::cout<<"Wpisz b:"<<endl;
                std::cin>>b;
                wynik = a-b;
                std::cout<<"Wynik odejmowania to: "<<wynik<<endl;
                menu(wybor);
            }

        case 3:
        std::cout<<"Wybrales mnozenie"<<endl;
        std::cout<<"Podaj a:"<<endl;
        std::cin>>a;
        std::cin.good();
            if( cin.good() == false){
                std::cout<<"Wprowadziles niepoprawne dane. Sprobuj jeszcze raz"<<endl;
                menu(wybor);
            }
            else{
                std::cout<<"Podaj b:"<<endl;
                std::cin>>b;
                wynik = a*b;
                std::cout<<"Wynik mnozenia to: "<<wynik<<endl;
                menu(wybor);
            }

        case 4:
        std::cout<<"Wybrales dzielenie"<<endl;
        std::cout<<"Podaj a:"<<endl;
        std::cin>>a;
        std::cin.good();
        if( cin.good() == false){
            std::cout<<"Wprowadziles niepoprawne dane. Sprobuj jeszcze raz"<<endl;
            menu(wybor);
        }
        else{
            std::cout<<"Podaj b:"<<endl;
            std::cin>>b;
            wynik = a/b;
            std::cout<<"Wynik dzielenia to: "<<wynik<<endl;
            menu(wybor);
        }

        case 5:
        std::cout<<"Koniec dzialania programu";
        break;
    }

    return 0;
}
0

wydaje sie że powinna byc tam nieskonczona petla ale nie jestem pewien bo źle zformatowane i nie starałem się wczytać w problem.

0

1) Tak przy okazji - użycie przestrzeni nazw std pozwala na niepisanie std za każdym razem. Zamiast np. std::cout wystarczy samo cout.
2) Switch zazwyczaj nie pogardzi klauzulą domyślną i break po każdym przypadku.
switch (coś tam) {
case 1:
instrukcje;
break;
case 2:
instrukcje;
break;
...
default:
jakaś domyślna instrukcja;
break;
}

3) Wczytywanie liczb można zastąpić oddzielnymi funkcjami (lub jedną, jeśli program nie będzie za każdym razem prosił "podaj a, podaj b")

4) Przy dzieleniu wypadałoby albo podać ewentualną resztę (np. 10/3 = 3, reszta 1), albo zmienić typ wyniku na zmiennoprzecinkowy, tak by np. 8 / 5 dawało 1.6, a nie 1.

5) Zmienna wynik jest niekonieczna.

Mały tip - można np. wpisać wykonywanie wyświetlania menu (btw może być typu void) w pętlę do while. Wykonywała by się ona dopóki wybór byłby inny niż 5.

PS. Nie chcesz gotowca, co się chwali, ale małym "wycinkiem" przykładowego chyba nie pogardzisz:

#include <iostream>

using namespace std; // eliminuje potrzebę używania std:: w dalszej części kodu

void menu(){
Wyświetlamy menu
    }

double liczba()  {
Tu wczytujemy liczbę. 
}

int main()
{
    int wybor;
    do {
    menu();
    cin>>wybor;
    switch(wybor){
       wszystkie przypadki od 1 do 5 plus domyślny, np:.
        case 1:
        cout <<"Wybrales dodawanie"<<endl;
        cout <<"Wynik dodawania to: "<<liczba() + liczba() <<endl; // użycie funkcji liczba() skraca pisanie kodu, zmienna wynik została wywalona.
        break;
       (. ..)
        default:
            cout<<"Niepoprawny wybor opcji, sprobuj ponownie";
    }
    } while (wybor != 5);
    return 0;
}
0

dzięki za podpowiedzi program ukończony teraz dalszy ciąg nauki:)

0

Witam ponownie,
Nie chce zakładać nowego tematu. Ostatni kod z kalkulatorem ukończyłem z sukcesem. Rozwiązuje po kolei lekcje z kursu. Teraz stoję przed zadaniem w którym program ma czytać 5 liczb zapisać je do tablicy następnie wylosować z tablicy 2, wypisać je sprawdzając przy tym czy się nie powtarzają. Wszystko w oparciu o funkcje.

Stworzyłem poniższy kod i za cholerę nie mogę sprawdzić warunku w funkcji bool.. Czy ktoś mógłby nakierować mnie na rozwiązanie problemu? Tak jak wcześniej nie chce gotowca.

#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

int wczytaj(int tab[]){
    int i, j;
    cout<<"Podaj 5 liczb: "<<endl;;
    for(i=0;i<5;i++){
        cin>>j;
        tab[i] = j;
    }
}

int losuj(){
    return (rand()%4)+1;
}

bool sprawdz(int Tab[], int wylosowana){
    if (Tab[wylosowana] == wylosowana){
        return true;}
        else{
            return false;}
}

int main()
{
    for(;;){
    srand(time(NULL));
    int wczytane[5], licznik, indeks;
    wczytaj(wczytane);
    cout <<"======================"<<endl<<endl;
    licznik = 0;
        do{
                indeks = losuj();
                cout <<"Wylosowany indeks to: "<<indeks<<endl;
                cout <<"Losowa to: "<<wczytane[indeks]<<endl;
                if(sprawdz(wczytane, indeks) == true){
                    indeks++;
                    cout <<"Nowy indeks to: "<<indeks<<endl;}
                licznik++;
        }
        while (licznik<2);
    }
    return 0;
}
0

Jeśli chcesz sprawdzić czy dwie liczby się nie powtarzają, musisz najpierw je znać(wylosować) a następnie dokonać sprawdzenia, np. poza pętlą. Funkcja sprawdź w obecnej postaci sprawdza czy element tablicy jest równy numerowi indeksu tego elementu.

0
   return (rand()%4)+1;

powyzsza funkcja zwroci Ci losową liczbę z przedziału 1 - 5
A przy utworzonej tablicy z 5 elementami prawidlowy przedział to 0 - 4.
zeby losowało Ci z prawidłowego zakresu wystarczy ze zrobisz takie losowanie:

   return rand()%5;
0
Wielki Rycerz napisał(a):

Jeśli chcesz sprawdzić czy dwie liczby się nie powtarzają, musisz najpierw je znać(wylosować) a następnie dokonać sprawdzenia, np. poza pętlą. Funkcja sprawdź w obecnej postaci sprawdza czy element tablicy jest równy numerowi indeksu tego elementu.

No tak. Liczby te najpierw są podawane przez użytkownika później zapisywane do tablicy i w niej są losowane. Funkcja ma logiczny sens bo jeśli pojawia się dwie takie same liczby to musza odnosić się do takiego samego indeksu i to właśnie w takiej sytuacji funkcja sprawdzająca ma zwrócić logiczną prawdę i tym samym uruchomić "if" w którym wylosuje nowy indeks i wypisze zawartość tablicy o tym indeksie. Reasumując jeśli logicznie myślę to funkcje sprawdzającą mam dobrą. Testuje zwracanie logicznego prawda / fałsz dlatego zależy mi na funkcji z bool.

0
Hagefid napisał(a):
   return (rand()%4)+1;

powyzsza funkcja zwroci Ci losową liczbę z przedziału 1 - 5
A przy utworzonej tablicy z 5 elementami prawidlowy przedział to 0 - 4.
zeby losowało Ci z prawidłowego zakresu wystarczy ze zrobisz takie losowanie:

   return rand()%5;

Dzięki z uwagę małe przeoczenie faktycznie muszę to zmienić bo nigdy element zerowy nie byłby brany pod uwagę a piątego nie ma:)

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