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

[CR] C++ (#6): Instrukcja switch case. Menu główne. Kontrola błędów wejścia

+2 głosów
1,476 wizyt
pytanie zadane 7 kwietnia 2016 w Nasze poradniki przez Mirosław Zelent Nałogowiec (28,430 p.)

CR = Code Review. O co chodzi? Zajrzyj tutaj
Pełna lista wszystkich Code Review? Zajrzyj tutaj

https://www.youtube.com/watch?v=ib7LXBNfZ7g

Kod z odcinka - kalkulator if:

#include <iostream>

using namespace std;

float x,y;
int wybor;

int main()
{
    cout << "Podaj 1 liczbe: ";
    cin >> x;
    cout << "Podaj 2 liczbe: ";
    cin >> y;

    cout<<endl;
    cout << "MENU GLOWNE" << endl;
    cout << "-----------------" << endl;
    cout << "1. Dodawanie" << endl;
    cout << "2. Odejmowanie" << endl;
    cout << "3. Mnozenie" << endl;
    cout << "4. Dzielenie" << endl;

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

    if (wybor==1)

            cout<<"Suma = "<<x+y;

    else if (wybor==2)

            cout<<"Roznica = "<<x-y;

    else if (wybor==3)

            cout<<"Iloczyn = "<<x*y;

    else if (wybor==4)

            if (y==0) cout << "Nie dzielimy przez zero!";
            else cout<<"Iloraz = "<<x/y;

    else  cout<<"Nie ma takiej opcji w menu!";

    return 0;
}

Kod z odcinka - kalkulator switch:

#include <iostream>
#include <stdio.h>
#include <cstdlib>
#include <conio.h>
using namespace std;

float x,y;
char wybor;

int main()
{

for(;;)
{

    cout << "Podaj 1 liczbe: ";
    cin >> x;
    cout << "Podaj 2 liczbe: ";
    cin >> y;

    cout<<endl;
    cout << "MENU GLOWNE" << endl;
    cout << "-----------------" << endl;
    cout << "1. Dodawanie" << endl;
    cout << "2. Odejmowanie" << endl;
    cout << "3. Mnozenie" << endl;
    cout << "4. Dzielenie" << endl;
    cout << "5. Koniec programu" << endl;


    cout << endl;
    wybor=getch();

    switch(wybor)
    {
    case '1':
            cout<<"Suma = "<<x+y;
    break;

    case '2':
            cout<<"Roznica = "<<x-y;
    break;

    case '3':
            cout<<"Iloczyn = "<<x*y;
    break;

    case '4':
            if (y==0) cout << "Nie dzielimy przez zero!";
            else cout<<"Iloraz = "<<x/y;
    break;

    case '5':
            exit(0);
    break;

    default: cout<<"Nie ma takiej opcji w menu!";
    }
    getchar();getchar();
    system("cls");
}
    return 0;
}

Kod z odcinka - miesiące if: 

#include <iostream>

using namespace std;

int nr_miesiaca;

int main()
{
    cout << "Podaj numer miesiaca: ";
    cin >> nr_miesiaca;

    if ((nr_miesiaca==1)||(nr_miesiaca==3)||(nr_miesiaca==5)||
        (nr_miesiaca==7)||(nr_miesiaca==8)||(nr_miesiaca==10)||
        (nr_miesiaca==12))

            cout<<"Ten miesiac ma 31 dni!";

    else if ((nr_miesiaca==4)||(nr_miesiaca==6)||(nr_miesiaca==9)||
        (nr_miesiaca==11))
            cout<<"Ten miesiac ma 30 dni!";

    else if (nr_miesiaca==2)
    {
                int rok;
                cout<<"Podaj rok: ";
                cin >> rok;

if (((rok%4 == 0) && (rok%100 != 0)) || (rok%400 == 0))
    cout<<"Ten miesiac ma 29 dni!";
else cout<<"Ten miesiac ma 28 dni!";

    }
    else cout<<"Niepoprawna opcja w menu";


    return 0;
}

Kod z odcinka - miesiące switch:

#include <iostream>
#include <cstdlib>

using namespace std;
int nr_miesiaca;

int main()
{
    cout << "Podaj numer miesiaca: ";

    if (!(cin >> nr_miesiaca))
    {
        cerr<<"To nie jest liczba!";
        exit(0);
    }

    switch(nr_miesiaca)
    {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            cout<<"Ten miesiac ma 31 dni!";
        break;

        case 4:
        case 6:
        case 9:
        case 11:
            cout<<"Ten miesiac ma 30 dni!";
        break;

        case 2:
            {
                int rok;
                cout<<"Podaj rok: ";
                cin >> rok;

if (((rok%4 == 0) && (rok%100 != 0)) || (rok%400 == 0))
    cout<<"Ten miesiac ma 29 dni!";
else cout<<"Ten miesiac ma 28 dni!";

            }
        break;

        default: cout<<"Niepoprawny numer miesiaca!";

    }

    return 0;
}

Paczka z odcinka: POBIERZ​

2 odpowiedzi

+1 głos
odpowiedź 10 kwietnia 2016 przez adrian17 VIP (108,820 p.)

exit(0);

  • w C++ie powinien być unikany jak ogień, bo omija destruktory,
  • nie było powodu by go wprowadzać, skoro już znany jest (i poprawny) return. To nie tylko komplikowanie dla komplikowania, ale też przeczy Twojej idei nie zalewania uczącej się osoby dużą ilością rzeczy.

Więc... czemu?

komentarz 10 kwietnia 2016 przez Shiro Dyskutant (9,670 p.)
A jak zakończyć program wewnątrz funkcji (zakładamy że ta funkcja =/= main) return będzie rozumiany jako zwróć wartość do programu nadrzędnego (często main)
komentarz 10 kwietnia 2016 przez adrian17 VIP (108,820 p.)

do programu nadrzędnego

funkcji.

A jak zakończyć

Grzecznie, po kolei kończąc kolejne poziomy funkcji, pozwalając im posprzątać po sobie. (ewentualnie rzucić wyjątkiem, ale to w sytuacjach specjalnych). To, że exit() jest "łatwą" i "wygodną" metodą rozwiązania problemu, nie oznacza, że jest dobrą.

komentarz 12 kwietnia 2016 przez Shiro Dyskutant (9,670 p.)
No okej w żadnym wypadku nie chciałem dać znać że jest okey i można go używać ja o tym nie wiedziałem, Ty o tym napisałeś stąd moje pytanie w jaki sposób zakończyć program z poziomu innej funkcji niż main(); ;)
0 głosów
odpowiedź 28 sierpnia przez Mithriandil Nowicjusz (160 p.)
Witam! Bardzo proszę o pomoc. Jak przerobić Kod z odcinka - miesiące switch, tak aby po podaniu blednego miesiaca, np litery, nie konczyło dzialania programu tylko wrociło znowu do podania jeszcze raz miesiaca, az do poprawnej liczby. Kombinuje i kombinuje i nie moge. Please, help me!
komentarz 28 sierpnia przez QizmoPL Stary wyjadacz (11,610 p.)
zamiast int daj char
komentarz 28 sierpnia przez Mithriandil Nowicjusz (160 p.)

Nie za bardzo rozumiem, mogłbyś wyjaśnic?

to kod z odcinka:

#include <iostream>
#include <cstdlib>

using namespace std;

int nr_miesiaca;

int main()
{
    cout << "Podaj numer miesiaca: ";
    if(!(cin >> nr_miesiaca))
    {
        cout << "Zla liczba!" << endl;
        exit(0);
    }

    switch(nr_miesiaca)
    {
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
        cout << "Ten miesiac ma 31 dni!";
    break;

    case 4:
    case 6:
    case 9:
    case 11:
        cout << "Ten miesiac ma 30 dni!";
    break;

    case 2:
        {
            int rok;
            cout << "Podaj rok: ";
             if(!(cin >> rok))
            {
                cerr << "To nie jest liczba!";
                exit(0);
            }

            if(((rok % 4 == 0) && (rok % 100 != 0)) || (rok % 400 == 0))
                cout << "Ten miesiac na 29 dni!";
            else
                cout << "Ten miesiac ma 28 dni!";
        }

    break;

    default: cout << "Niepoprawny numer miesiaca" << endl;
    }


    return 0;
}
 

komentarz 28 sierpnia przez Criss VIP (124,820 p.)
bool flag{true};

do
{
   // input do nr_miesiaca
   switch(nr_miesiaca)
   {
       case 1:
       case 3:
       case 5:
       case 7:
       case 8:
       case 10:
       case 12:
            cout<<"Ten miesiac ma 31 dni!";
            flag = true;
            break;
 
       case 4:
       case 6:
       case 9:
       case 11:
            cout<<"Ten miesiac ma 30 dni!";
            flag = true;
            break;
 
       case 2:
           // juz nie pisze tego kodu tutaj
           flag = true;
           break;
      default:
         cout << "Niepoprawny numer miesiaca!";
         flag = false;
         break;
   }
} while(!flag);

Może tak?

komentarz 28 sierpnia przez QizmoPL Stary wyjadacz (11,610 p.)
#include <iostream> 
#include <cstdlib>
using namespace std;
char nr_miesiaca;
int main() 
{ 
    cout << "Podaj numer miesiaca: "; 
    if(!(cin >> nr_miesiaca)) 
    { 
        cout << "Zla liczba!" << endl; 
        exit(0); 
    }
    switch(nr_miesiaca) 
    { 
    case 1: 
    case 3: 
    case 5: 
    case 7: 
    case 8: 
    case 10: 
    case 12: 
        cout << "Ten miesiac ma 31 dni!"; 
    break;
    case 4: 
    case 6: 
    case 9: 
    case 11: 
        cout << "Ten miesiac ma 30 dni!"; 
    break;
    case 2: 
        { 
            int rok; 
            cout << "Podaj rok: "; 
             if(!(cin >> rok)) 
            { 
                cerr << "To nie jest liczba!"; 
                exit(0); 
            }
            if(((rok % 4 == 0) && (rok % 100 != 0)) || (rok % 400 == 0)) 
                cout << "Ten miesiac na 29 dni!"; 
            else 
                cout << "Ten miesiac ma 28 dni!"; 
        }
    break;

#include <iostream> 
#include <cstdlib>
using namespace std;
char nr_miesiaca;
int main() 
{ 
    cout << "Podaj numer miesiaca: "; 
    if(!(cin >> nr_miesiaca)) 
    { 
        cout << "Zla liczba!" << endl; 
        exit(0); 
    }
    switch(nr_miesiaca) 
    { 
    case 1: 
    case 3: 
    case 5: 
    case 7: 
    case 8: 
    case 10: 
    case 12: 
        cout << "Ten miesiac ma 31 dni!"; 
    break;
    case 4: 
    case 6: 
    case 9: 
    case 11: 
        cout << "Ten miesiac ma 30 dni!"; 
    break;
    case 2: 
        { 
            int rok; 
            cout << "Podaj rok: "; 
             if(!(cin >> rok)) 
            { 
                cerr << "To nie jest liczba!"; 
                exit(0); 
            }
            if(((rok % 4 == 0) && (rok % 100 != 0)) || (rok % 400 == 0)) 
                cout << "Ten miesiac na 29 dni!"; 
            else 
                cout << "Ten miesiac ma 28 dni!"; 
        }
    break;
    default: cout << "Niepoprawny numer miesiaca" << endl; 
    }

    return 0; 
} 

    default: cout << "Niepoprawny numer miesiaca" << endl; 
    }

    return 0; 
} 

 

komentarz 28 sierpnia przez Mithriandil Nowicjusz (160 p.)
edycja 28 sierpnia przez Mithriandil
Niestety nie działa mi ten kod, wyrzuca mase błędów. Niech ktoś pomoże..
komentarz 28 sierpnia przez QizmoPL Stary wyjadacz (11,610 p.)
co? jakie bledy?
komentarz 28 sierpnia przez Mithriandil Nowicjusz (160 p.)
Dlaczego w kodzie jest 2x zaczety program, jeden nieskonczony, a w drugim sa dwa return 0?
Jestem początkujący i nie rozumiem. Po wklejeniu do kompilatora nie dziala.
komentarz 28 sierpnia przez Mithriandil Nowicjusz (160 p.)

   cout << "Podaj numer miesiaca: ";
    while(!(cin >> nr_miesiaca))
    {
        cout << "Blad! Podaj poprawny numer miesiaca: ";
        cin.clear();
        cin.ignore(9999, '\n' );
    }

Udało mi się rozwiązać problem w ten sposób, znalazłem taka opcję z cin ignore. Zmienilem ten if'a na while. Program dziala teraz jak chcialem.

Mogłby ktoś wyjaśnic mi  co robia te dwie linijki??

 cin.clear();
cin.ignore(9999, '\n' );

?
    

komentarz 29 sierpnia przez DragonCoder Stary wyjadacz (10,690 p.)
https://forum.pasja-informatyki.pl/5572/getline-i-cin-ignore

 

1)

A) google

B) dokumentacja

C) wyszukiwarka na forum

2) jesli masz problemy z kodem, to sprawdz czy ktos nie mial podobnego prroblemu, lub zaloz nowy temat

Podobne pytania

0 głosów
1 odpowiedź 145 wizyt
0 głosów
0 odpowiedzi 442 wizyt
0 głosów
0 odpowiedzi 1,192 wizyt

42,445 zapytań

81,749 odpowiedzi

162,269 komentarzy

20,388 pasjonatów

Przeglądających: 113
Pasjonatów: 1 Gości: 112

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...