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 :
#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:
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ć.