• 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

VPS Starter Arubacloud
+3 głosów
10,711 wizyt
pytanie zadane 7 kwietnia 2016 w Nasze poradniki przez Mirosław Zelent Nałogowiec (34,750 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​

komentarz 19 stycznia 2023 przez Shiru Nowicjusz (100 p.)
#include <iostream>
#include <cstdlib>

using namespace std;
int nr_miesiaca;

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

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

    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 << "Blad! Podaj poprawny numer miesiaca: ";
        cin.clear();
        cin.ignore(9999, '\n' );


    }

    return 0;
}
}


Wie ktoś co tu jest nie tak?

2 odpowiedzi

+1 głos
odpowiedź 10 kwietnia 2016 przez adrian17 Ekspert (344,100 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 Stary wyjadacz (10,300 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 Ekspert (344,100 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 Stary wyjadacz (10,300 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 2017 przez Mithriandil Początkujący (250 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 2017 przez QizmoPL Stary wyjadacz (11,440 p.)
zamiast int daj char
komentarz 28 sierpnia 2017 przez Mithriandil Początkujący (250 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 2017 przez criss Mędrzec (172,590 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 2017 przez QizmoPL Stary wyjadacz (11,440 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 2017 przez Mithriandil Początkujący (250 p.)
edycja 28 sierpnia 2017 przez Mithriandil
Niestety nie działa mi ten kod, wyrzuca mase błędów. Niech ktoś pomoże..
komentarz 28 sierpnia 2017 przez QizmoPL Stary wyjadacz (11,440 p.)
co? jakie bledy?
komentarz 28 sierpnia 2017 przez Mithriandil Początkujący (250 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 2017 przez Mithriandil Początkujący (250 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 2017 przez DragonCoder Nałogowiec (36,500 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

+1 głos
0 odpowiedzi 8,123 wizyt
+1 głos
0 odpowiedzi 2,362 wizyt
0 głosów
1 odpowiedź 2,283 wizyt
pytanie zadane 29 sierpnia 2017 w C i C++ przez Mithriandil Początkujący (250 p.)

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...