Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Lekcja 15, zadanie z kalkulatorem

Ostatnio zmodyfikowano 2013-11-24 20:17
Autor Wiadomość
MTPR
Temat założony przez niniejszego użytkownika
Lekcja 15, zadanie z kalkulatorem
» 2013-11-24 19:44:22
Witam.
Tam wiem, tematów odnośnie tego zadania jest dużo jednak przejrzałem większość i nie znalazłem odpowiedzi na mój problem.
Przedstawię najpierw swój kod źródłowy :

C/C++
#include<iostream>
int main()
{
   
    int a;
    int b;
    int c;
    int d;
    int e;
    int f;
    int g;
    int h;
    int i;
    int j;
   
    std::cout << " Kalkulator " << std::endl;
    std::cout << " Wybierz numer dla odpowiedniego dzialania " << std::endl;
    std::cout << " [1] Dodawanie " << std::endl;
    std::cout << " [2] Odejmowanie " << std::endl;
    std::cout << " [3] Mnozenie " << std::endl;
    std::cout << " [4] Dzielenie " << std::endl;
    std::cout << " [5] Rezygnacja " << std::endl;
    do
    {
       
        std::cout << std::endl << " Opcja: ";
        std::cin.clear();
        std::cin.sync();
        std::cin >> a;
        if( a != 0 )
        if( a == 1 || a == 2 || a == 3 || a == 4 || a == 5 )
        switch( a )
        {
           
        case 1:
            std::cout << " Wybrano dodawanie " << std::endl;
            do
            {
                std::cout << " Podaj 1 liczbe ";
                std::cin.clear();
                std::cin.sync();
                std::cin >> b;
                std::cin.good();
            } while( std::cin.good() == 0 );
           
            do
            {
                std::cout << " Podaj 2 liczbe ";
                std::cin.clear();
                std::cin.sync();
                std::cin >> c;
                std::cin.good();
            } while( std::cin.good() == 0 );
           
            if( b != 0 && c != 0 )
                 std::cout << " Otrzymany wynik: " << b + c;
           
            break;
           
        case 2:
            std::cout << " Wybrano odejmowanie " << std::endl;
            do
            {
                std::cout << " Podaj 1 liczbe ";
                std::cin.clear();
                std::cin.sync();
                std::cin >> d;
                std::cin.good();
            } while( std::cin.good() == 0 );
           
            do
            {
                std::cout << " Podaj 2 liczbe ";
                std::cin.clear();
                std::cin.sync();
                std::cin >> e;
                std::cin.good();
            } while( std::cin.good() == 0 );
           
            if( d != 0 && e != 0 )
                 std::cout << " Otrzymany wynik: " << d - e;
           
            break;
           
        case 3:
            std::cout << " Wybrano mnozenie " << std::endl;
            do
            {
                std::cout << " Podaj 1 liczbe ";
                std::cin.clear();
                std::cin.sync();
                std::cin >> f;
                std::cin.good();
            } while( std::cin.good() == 0 );
           
            do
            {
                std::cout << " Podaj 2 liczbe ";
                std::cin.clear();
                std::cin.sync();
                std::cin >> g;
                std::cin.good();
            } while( std::cin.good() == 0 );
           
            if( f != 0 && g != 0 )
                 std::cout << " Otrzymany wynik: " << f * g;
           
            break;
           
        case 4:
            std::cout << " Wybrano dzielenie " << std::endl;
            do
            {
                std::cout << " Podaj 1 liczbe ";
                std::cin.clear();
                std::cin.sync();
                std::cin >> h;
                std::cin.good();
            } while( std::cin.good() == 0 );
           
            do
            {
                std::cout << " Podaj 2 liczbe ";
                std::cin.clear();
                std::cin.sync();
                std::cin >> i;
                std::cin.good();
            } while( std::cin.good() == 0 );
           
            if( h != 0 && i != 0 )
                 std::cout << " Otrzymany wynik: " << h / i;
           
            break;
           
        case 5:
            do
            {
                std::cout << " Wybrano zakonczenie programy, wprowadz 0 aby zatwierdzic ";
                std::cin.clear();
                std::cin.sync();
                std::cin >> j;
                if( j == 0 )
                     std::cout << " Koniec ";
               
            } while( j != 0 );
           
            break;
           
           
        }
        if( a != 1 && a != 2 && a != 3 && a != 4 && a != 5 )
             std::cout << " Brak wybranej opcji, sprobuj ponownie ";
       
    } while( a != 5 );
   
}

A tak wygląda program z konsoli, wykonałem kilka działań aby zobrazować problem.

 Kalkulator
 Wybierz numer dla odpowiedniego dzialania
 [1] Dodawanie
 [2] Odejmowanie
 [3] Mnozenie
 [4] Dzielenie
 [5] Rezygnacja

 Opcja: w
 Brak wybranej opcji, sprobuj ponownie
 Opcja: 2
 Wybrano odejmowanie
 Podaj 1 liczbe 20
 Podaj 2 liczbe 10
 Otrzymany wynik: 10
 Opcja: 6
 Brak wybranej opcji, sprobuj ponownie
 Opcja: w
 Brak wybranej opcji, sprobuj ponownie
 Opcja: 2
 Wybrano odejmowanie
 Podaj 1 liczbe 20
 Podaj 2 liczbe 10
 Otrzymany wynik: 10
 Opcja: w
 Wybrano odejmowanie
 Podaj 1 liczbe

No wiec w 3 linijce od dołu po wprowadzeniu litery: w, program zamiast wyświetlić komunikat " Brak wybranej opcji, sprobuj ponownie " traktuje tą literę jako wcześniej wybrane działanie. Zupełnie nie rozumiem czemu tak się dzieje, skoro w kodzie jest warunek w postaci:

C/C++
if( a != 0 )
if( a == 1 || a == 2 || a == 3 || a == 4 || a == 5 )

Wysunąłem takie wnioski:
Litera: w, nie spełnia tego warunku wiec instrukcja  switch powinna zostać pominięta, a wyświetlić się powinien komunikat wcześniej wspomniany. Oczywiście dzieje się tak tylko kiedy działanie przed wpisaniem błędnego: w ( czy innej litery), będzie prawidłowe. Jeśli damy najpierw w miejscu opcji liczbę: 6, [ patrz na program w konsoli ] dopiero później w, wspomniany komunikat się wyświetli ( ze względu na to że wcześniejsze działanie ( wybrana opcja ) spowodowało ten komunikat).
Na samym początku także wpisałem literę: w, jak widać komunikat się ukazał ( właśnie o to mi chodzi, ale żeby działo się tak niezależnie od wcześniejszego działania, w tym miejscu nie ma wcześniejszego )
Dodam jeszcze że wspomniany problem dotyczy tylko liter.
Tutaj ten sam uruchomiony program, tylko zamiast liter podałem cyfry które nie spełniają początkowego warunku: if.


 Kalkulator
 Wybierz numer dla odpowiedniego dzialania
 [1] Dodawanie
 [2] Odejmowanie
 [3] Mnozenie
 [4] Dzielenie
 [5] Rezygnacja

 Opcja: 10
 Brak wybranej opcji, sprobuj ponownie
 Opcja: 2
 Wybrano odejmowanie
 Podaj 1 liczbe 20
 Podaj 2 liczbe 10
 Otrzymany wynik: 10
 Opcja: 8
 Brak wybranej opcji, sprobuj ponownie
 Opcja: 7
 Brak wybranej opcji, sprobuj ponownie
 Opcja: 2
 Wybrano odejmowanie
 Podaj 1 liczbe 20
 Podaj 2 liczbe 10
 Otrzymany wynik: 10
 Opcja: 9
 Brak wybranej opcji, sprobuj ponownie
 Opcja:

Myślę że przedstawiłem problem jasno.
Przeglądając tematy odnoście tego zadania, sprawdzałem jak zrobili to inni, najczęściej pytali o sprawdzenie kodu.
W odpowiedzi mówili że wszystko jest ok, czasami uwzględniając mniejsze błędy. Choć u wszystkich ( tych co sprawdziłem ) występował podany problem, czasem nawet z gorszym efektem. Więc może tak faktycznie miało być na tym etapie i z wiedzy zgromadzonej dotychczas nie da się temu zaradzić. Jeśli jednak nie to prosiłbym o wytłumaczenie tego szerzej, czyli czemu tak się dzieje w moim kodzie i co zmienić żeby to poprawić.
P-97384
Mitu
» 2013-11-24 19:50:32
Ponieważ wartość, do której pobierasz numer wybranej opcji jest typu int - wprowadzenie tam znaku powoduje błąd.

Tutaj więcej na ten temat: [LINK];

Druga rzecz, nie musisz deklarować zmiennych w taki sposób:

C/C++
int a;
int b;
int c;
int d;
int e;
int f;
int g;
int h;
int i;
int j;

Możesz to zrobić tak:
C/C++
int a, b, c, d, e, f, g, h, i, j;

Pamiętaj też, że po deklaracji zmiennej jej wartość jest nieokreślona, może się tam znajdować cokolwiek. Dlatego przed pierwszym użyciem zmiennej w obliczeniach warto coś do niej przypisać.
P-97385
Buby
» 2013-11-24 19:58:47
Hmm...Mitu cokolwiek to troszkę mało :)
W zmiennej o niezdefiniowanej wartości, znajduje się liczba,
która wcześniej znajdowała się w komórce, która teraz jest przypisana
do zmiennej.
P-97388
MTPR
Temat założony przez niniejszego użytkownika
» 2013-11-24 20:17:25
Faktycznie Mitu, jest tak jak mówisz, poprawiłem typ zmiennej na
long = a
 i teraz działa tak jak tego chciałem.
W sumie przed założeniem tematu nie raz próbowałem coś z tym zrobić, pamiętam że zmieniałem typ zmiennych, jednak nie dało to zamierzanego efektu, możliwe też że akurat ten typ pominąłem :) no nic, dzięki za odpowiedź, temat zamykam.
P-97391
« 1 »
  Strona 1 z 1