Pokaż wyniki od 1 do 7 z 7
Like Tree1Likes
  • 1 Post By Kcurek
Problem z funkcją switch
  1. #1
    Świeżak Awatar ghostwriter
    Dołączył
    09.02.2012
    Mieszka w
    Krakowie
    Posty
    7
    Wątków
    1
    Siła reputacji
    1

    Domyślnie Problem z funkcją switch

    Witam!
    Mam problem otóż robie sobie kalkulator przy użyciu funkcji switch:


    #include<iostream>
    #include<cmath>
    #include<cstdlib>
    using namespace std;
    main()
    {
    float a,b,r,h,wynik;
    int funkcja,pole,exit;
    do
    {cout<<"Kalkulator"<<endl;
    cout<<" 1: dodawanie/n 2: odejmowanie/n 3: mnozenie/n 4: dzielenie/n 5: pola figur/n";
    cin>>funkcja;
    switch(funkcja)
    case 1:
    {cout<<"podaj liczby"<<endl;
    cin>>a>>b;
    wynik=a+b;
    cout<<"wynik to: "<<wynik<<"."<<endl;
    break;}
    case 2:
    {cout<<"podaj liczby"<<endl;
    cin>>a>>b;
    wynik=a-b;
    cout<<"wynik to: "<<wynik<<"."<<endl;
    break;}
    case 3:
    {cout<<"podaj liczby"<<endl;
    cin>>a>>b;
    wynik=a*b;
    cout<<"wynik to: "<<wynik<<"."<<endl;
    break;}
    case 4:
    {cout<<"podaj liczby"<<endl;
    cin>>a>>b;
    wynik=a/b;
    cout<<"wynik to: "<<wynik<<"."<<endl;
    break;}
    case 5:
    { system("cls");
    cout<<"Pole jakiej figury chcesz obliczyc?"<<endl;
    cout<<" 1: kwadrat/n 2: prostokat/n 3: trojkat/n 4: trapez/n 5: rownoleglobok/n 6: romb/n";
    cin>>pole;
    switch(pole)
    case 1:
    {cout<<"podaj dlugosc boku"<<endl;
    cin>>a;
    wynik=a*a;
    cout<<"wynik to: "<<wynik<<"."<<endl;
    break;}
    case 2:
    {cout<<"podaj dlugosci bokow"<<endl;
    cin>>a>>b;
    wynik=a*b;
    cout<<"wynik to: "<<wynik<<"."<<endl;
    break;}
    case 3:
    {cout<<"podaj dlugosci boku i wysokosci"<<endl;
    cin>>a>>h;
    wynik=(a*h)/2;
    cout<<"wynik to: "<<wynik<<"."<<endl;
    break;}
    case 4:
    {cout<<"podaj dlugosci podstaw i wysokosci"<<endl;
    cin>>a>>b>>h;
    wynik=(a+b)*h/2;
    cout<<"wynik to: "<<wynik<<"."<<endl;
    break;}
    case 5:
    {cout<<"podaj dlugosci boku i wysokosci"<<endl;
    cin>>a>>h;
    wynik=a*h;
    cout<<"wynik to: "<<wynik<<"."<<endl;
    break;}
    case 6:
    {cout<<"podaj dlugosc promienia"<<endl;
    cin>>r;
    wynik=M_PI*r*r;
    cout<<"wynik to: "<<wynik<<"."<<endl;
    break;}
    default :
    cout<<"brak odpowiednika";break;}
    break;}
    default :
    cout<<"brak odpowiednika";;break;}
    cout<<"jeszcze raz?(1-tak 0-nie)"<<endl;
    cin>>exit;
    system("cls");}
    while(exit==1);
    cin.sync();}


    i gdy kompiluję wyskakuje mi że:

    20 5 C:\Users\...\Informatyka\kalkulator.cpp [Error] case label '2' not within a switch statement
    26 4 C:\Users\...\Informatyka\kalkulator.cpp [Error] case label '3' not within a switch statement
    32 5 C:\Users\...\Informatyka\kalkulator.cpp [Error] case label '4' not within a switch statement
    38 5 C:\Users\...\Informatyka\kalkulator.cpp [Error] case label '5' not within a switch statement
    50 9 C:\Users\...\Informatyka\kalkulator.cpp [Error] case label '2' not within a switch statement
    56 9 C:\Users\...\Informatyka\kalkulator.cpp [Error] case label '3' not within a switch statement
    62 9 C:\Users\...\Informatyka\kalkulator.cpp [Error] case label '4' not within a switch statement
    68 9 C:\Users\...\Informatyka\kalkulator.cpp [Error] case label '5' not within a switch statement
    74 9 C:\Users\...\Informatyka\kalkulator.cpp [Error] case label '6' not within a switch statement
    80 7 C:\Users\...\Informatyka\kalkulator.cpp [Error] case label not within a switch statement
    83 12 C:\Users\...\Informatyka\kalkulator.cpp [Error] expected 'while' before ':' token
    83 12 C:\Users\...\Informatyka\kalkulator.cpp [Error] expected '(' before ':' token
    83 12 C:\Users\...\Informatyka\kalkulator.cpp [Error] expected primary-expression before ':' token
    83 12 C:\Users\...\Informatyka\kalkulator.cpp [Error] expected ')' before ':' token
    83 12 C:\Users\...\Informatyka\kalkulator.cpp [Error] expected ';' before ':' token
    83 12 C:\Users\...\Informatyka\kalkulator.cpp [Error] expected primary-expression before ':' token
    83 12 C:\Users\...\kalkulator.cpp [Error] expected ';' before ':' token
    84 33 C:\Users\...\Informatyka\kalkulator.cpp [Error] break statement not within loop or switch
    C:\Users\...\Informatyka\kalkulator.cpp: C:\Users\...\Informatyka\kalkulator.cpp: At global scope:
    85 2 C:\Users\...\Informatyka\kalkulator.cpp [Error] 'cout' does not name a type
    86 2 C:\Users\...\Informatyka\kalkulator.cpp [Error] 'cin' does not name a type
    87 8 C:\Users\...\Informatyka\kalkulator.cpp [Error] expected constructor, destructor, or type conversion before '(' token
    87 16 C:\Users\...\Informatyka\kalkulator.cpp [Error] expected declaration before '}' token

    dużo tych błędów ale to się jakoś naprawi najważniejsze jest pierwsze dziesięć linijek bo pojęcia nie mam o co kaman?
    Proszę o pomoc
    Uwaga: To jest stary temat
    Ta dyskusja jest starsza niż 90 dni. Informacje w niej zawarte mogą już nie być aktualne

  2. #2
    Wielki pomocnik :) Awatar Kcurek
    Dołączył
    23.07.2008
    Mieszka w
    Poznań
    Posty
    2,910
    Wątków
    1599
    Siła reputacji
    37

    Domyślnie Odp: Problem z funkcją switch

    Witam.
    Trudno się dziwić, to nie miało prawa działać. Namieszałeś z klamerkami. Poza tym nie formatujesz kodu, przez co dobre 10 minut zmarnowałem na domyślenie się, co tu jest czym (i Ty pewnie też masz problem z czytaniem tego kodu). Ponadto na forum umieszczaj kod w znacznikach [code][/code].
    Teraz do rzeczy, jakie konkretnie były błędy:
    1)
    Kod:
    switch(zmienna){
    case 1:
    ins1; ins2; ... insN; break;
    case2:
    ins1; ins2; ... insN; break;
    ... case N:
    ins1; ins2; ... insN;
    default:
    ins1; ins2; ... insN; break;
    }
    Instrukcja switch obejmuje klamrami całość instrukcji następujących po case jako jeden blok, a po case'ach nie umieszczasz klamer, nawet, jeśli dla danego case masz więcej niż jedną instrukcję.
    2)
    Kod:
    cout<<" 1: dodawanie\n 2: odejmowanie\n 3: mnozenie\n 4: dzielenie\n 5: pola figur\n";
    Znaki specjalne wstawiasz z backslash'em (\), a nie slash'em (/).
    3)
    Kod:
    default :
    cout<<"brak odpowiednika";
    break;
    Odnoszę wrażenie, że to bez sensu. Przepisałbym to na pętlę do-while, która będzie działać do momentu otrzymania liczby z żądanego zakresu.
    4)
    Kod:
    int main()
    Zaleca się podawanie typu przy funkcji main.
    W punktach 1), 2) i 4) w poście podałem poprawną składnię, nie taką, jaka była w Twoim programie.
    Plik .cpp z poprawionymi punktami 1) i 2) znajdziesz tu:
    Kod:
    http://www.przeklej.pl/plik/calctest-cpp-0043373hq8qp2j6
    Pozdrawiam
    ghostwriter lubi ten post.



    Sig by melu


    Zanim zaczniesz pisać, koniecznie zapoznaj się ze wszystkimi zasadami obowiązującymi na forum i przestrzegaj ich. W przeciwnym wypadku Twoje posty zostaną usunięte.

    Wszelkie pytania, wątpliwości i problemy wyjaśniam poprzez PM, więc w razie potrzeby śmiało pisz

  3. #3
    Aktywny Użytkownik Awatar matek3005
    Dołączył
    19.10.2008
    Posty
    363
    Wątków
    3
    Siła reputacji
    11

    Domyślnie Odp: Problem z funkcją switch

    Cytat Zamieszczone przez ghostwrighter Zobacz posta
    przy użyciu funkcji switch:
    switch to nie jest funkcja ale rzeczywiście powinieneś użyć tutaj funkcji, to kod zmalałby ze 100 linijek (strzelam) do 30.

  4. #4
    Wielki pomocnik :) Awatar Kcurek
    Dołączył
    23.07.2008
    Mieszka w
    Poznań
    Posty
    2,910
    Wątków
    1599
    Siła reputacji
    37

    Domyślnie Odp: Problem z funkcją switch

    Matek, a jakbyś to zrobił? Sam zastanawiałem się, co można wpakować w funkcję, ale jakoś nic takiego nie wymyśliłem...



    Sig by melu


    Zanim zaczniesz pisać, koniecznie zapoznaj się ze wszystkimi zasadami obowiązującymi na forum i przestrzegaj ich. W przeciwnym wypadku Twoje posty zostaną usunięte.

    Wszelkie pytania, wątpliwości i problemy wyjaśniam poprzez PM, więc w razie potrzeby śmiało pisz

  5. #5
    Świeżak
    Założyciel Tematu
    Awatar ghostwriter
    Dołączył
    09.02.2012
    Mieszka w
    Krakowie
    Posty
    7
    Wątków
    1
    Siła reputacji
    1

    Domyślnie Odp: Problem z funkcją switch

    dzięki wielkie! działa... będę musiał nad pętlą pomyśleć jeszcze. a i matek też interesuje mnie jak do tych 30 to spakujesz
    P.S. na przyszłość będę pamiętał o tym żeby do kodu to wpakować

  6. #6
    Aktywny Użytkownik Awatar matek3005
    Dołączył
    19.10.2008
    Posty
    363
    Wątków
    3
    Siła reputacji
    11

    Domyślnie Odp: Problem z funkcją switch

    Cytat Zamieszczone przez ghostwrighter Zobacz posta
    matek też interesuje mnie jak do tych 30 to spakujesz
    nie spakuję tego do 30 linijek tak samo jak twój program nie ma tych 100 linijek (swoją drogą poprawnie sformatowany miałby ich ponad 100). To był sarkazm, który miał ci tylko uświadomić, że kod, który tutaj wrzuciłeś jest bardzo brzydki i w ogóle nieczytelny i z tego właśnie powodu masz taki problem bo gubisz się we własnym bałaganie. Co do funkcji nie są one tutaj niezbędne ale mogą pomóc zwiększyć czytelność i warto jest zastosować np przy polach figur. W zasadzie ilość linii kodu nie jest za bardzo dobrym wyznacznikiem. Ten kod mógłby i mieć ze 140 linijek ale ważne żeby był czytelny i zrozumiały. Nawet swoją wersję mógłbyś spokojnie zmniejszyć o kilka linii pozbywając się pewnych powtórzeń. Jeśli pewna część kodu powtarza się często to jest to przesłanka do tego by zastanowić się czy nie umieścić tego fragmentu w osobnej funkcji albo przynajmniej nie spróbować napisać programu tak aby usunąć te powtórzenia. Przykład ?

    Kod:
    cout<<"podaj liczby"<<endl;
    cin>>a>>b;
    cout<<"wynik to: "<<wynik<<"."<<endl;
    po co to ciągle powtarzasz i zaciemniasz? A gdybyś chciał zmienić nazwę zmiennej wynik edytowałbyś to w każdym case osobno? Wprowadzić liczby możesz przed switchem ponieważ działania, które wykonujesz zawsze opierają się na tych dwóch liczbach (wtedy osobno musisz rozpatrzyć przypadek dla pól), a wynik możesz wyświetlać przed samym końcem obrotu pętli.
    Ostatnio edytowane przez matek3005 ; 09.02.2012 o 22:45

  7. #7
    Świeżak
    Założyciel Tematu
    Awatar ghostwriter
    Dołączył
    09.02.2012
    Mieszka w
    Krakowie
    Posty
    7
    Wątków
    1
    Siła reputacji
    1

    Domyślnie Odp: Problem z funkcją switch

    Też racja... zmienię to i pokażę jak mi wyszło


    A o to mój kalkulator
    Kod:
    #include<iostream>
    #include<cmath>
    #include<cstdlib>
    using namespace std;
    int main()
    {
    float a,b,r,h,wynik;
    float suma=0;
    float srednia=0;
    float liczba;
    int n=0;
    int funkcja,pole,exit;
    do
    {	do
    	{cout<<"Kalkulator by klimek\n ===================="<<endl;
    	cout<<" || 1: dodawanie   ||\n || 2: odejmowanie ||\n || 3: mnozenie    ||"<<endl;
    	cout<<" || 4: dzielenie   ||\n || 5: pola figur  ||\n || 6: srednia     ||"<<endl;
    	cout<<" || 0: wyjscie     ||"<<endl;
    	cout<<" ===================="<<endl;
    	cin>>funkcja;
    	
    	switch(funkcja)
    	{case 1:
    		cout<<"podaj liczby"<<endl;
    		cin>>a>>b;
    		wynik=a+b;
    		cout<<"wynik to: "<<wynik<<"."<<endl;
    		break;
    	case 2:
    		cout<<"podaj liczby"<<endl;
    		cin>>a>>b;
    		wynik=a-b;
    		cout<<"wynik to: "<<wynik<<"."<<endl;
    		break;
    	case 3:
    		cout<<"podaj liczby"<<endl;
    		cin>>a>>b;
    		wynik=a*b;
    		cout<<"wynik to: "<<wynik<<"."<<endl;
    		break;
    	case 4:
    		cout<<"podaj liczby"<<endl;
    		cin>>a>>b;
    		wynik=a/b;
    		cout<<"wynik to: "<<wynik<<"."<<endl;
    		break;
    	case 5:
    		do
    		{system("cls");
    		cout<<"Pole jakiej figury chcesz obliczyc?"<<endl;
    		cout<<" ======================"<<endl;
    		cout<<" || 1: kwadrat       ||\n || 2: prostokat     ||\n || 3: trojkat       ||\n";
    		cout<<" || 4: trapez        ||\n || 5: rownoleglobok ||\n || 6: romb          ||\n";
    		cout<<" || 0: wyjscie       ||"<<endl;
    		cout<<" ======================"<<endl;
    		cin>>pole;
    		
    		switch(pole)
    				{case 1:
    					cout<<"podaj dlugosc boku"<<endl;
    					cin>>a;
    					wynik=a*a;
    					cout<<"wynik to: "<<wynik<<"."<<endl;
    					break;
    				case 2:
    					cout<<"podaj dlugosci bokow"<<endl;
    					cin>>a>>b;
    					wynik=a*b;
    					cout<<"wynik to: "<<wynik<<"."<<endl;
    					break;
    				case 3:
    					cout<<"podaj dlugosci boku i wysokosci"<<endl;
    					cin>>a>>h;
    					wynik=(a*h)/2;
    					cout<<"wynik to: "<<wynik<<"."<<endl;
    					break;
    				case 4:
    					cout<<"podaj dlugosci podstaw i wysokosci"<<endl;
    					cin>>a>>b>>h;
    					wynik=(a+b)*h/2;
    					cout<<"wynik to: "<<wynik<<"."<<endl;
    					break;
    				case 5:
    					cout<<"podaj dlugosci boku i wysokosci"<<endl;
    					cin>>a>>h;
    					wynik=a*h;
    					cout<<"wynik to: "<<wynik<<"."<<endl;
    					break;
    				case 6:
    					cout<<"podaj dlugosc promienia"<<endl;
    					cin>>r;
    					wynik=M_PI*r*r;
    					cout<<"wynik to: "<<wynik<<"."<<endl;
    					break;
    				case 0:
    					return 0;
    				default :
    					cout<<"wybierz odpwiednia liczbe"<<endl;break;}}
    		while(pole>6);
    		break;
    	case 6:
    		suma=0;
    	   	cout<<"Z ilu liczb chcesz wyciagnac srednia?"<<endl;
    	   	cin>>n;
    	   	cout<<"Podawaj liczby"<<endl;
    				do
    				{cin>>liczba;
    				suma=suma+liczba;}
    				while(liczba!=0);
    		srednia=suma/n;
    		cout<<"Twoja srednia to:"<<srednia<<endl;
    		break;
    	case 0:
    		return 0;
    	default :
    		cout<<"wybierz odpowiednia liczbe"<<endl;
    		cin.get();
    		system("cls");
    		break;}}
    		while(funkcja>6);
    		cout<<"jeszcze raz?(1-tak 0-nie)"<<endl;
    		cin>>exit;
    		system("cls");}
    while(exit==1);
    cin.sync();}
    Matek nie skorzystałem z Twojej rady bo nie do końca wiedziałem jak to zrobić. jak byś mógł wytłumaczyć to byłbym wdzięczny
    Ostatnio edytowane przez ghostwriter ; 11.02.2012 o 18:16