Rozdział 15 Zad. domowe - Kalkulator | sprawdzenie kodu
Witam wszystkich serdecznie. Niedawno zacząłem się uczyć programowania, i chciałbym aby ktoś z doświadczonych forumowiczów ocenił mój kod i wyjaśnij mi dokładniej niektóre funkcje w moim kodzie.
Powiedzmy że jest to pierwsza "poważniejsza" praca domowa, nad którą trzeba było już dłuższą chwilę spędzić.
Przede wszystkim nie jestem pewny, czy dobrze zrozumiałem treść zadania domowego, brzmi tak:
- Napisz prosty kalkulator, który będzie potrafił dodawać, odejmować, mnożyć i dzielić. Program ten ma działać następująco:
1. Wypisuje obecny wynik
2. Wprowadź liczbę
3. Wybierz działanie (jeżeli liczba różna od 0)
4. Wykonaj obliczenia (jeżeli liczba różna od 0)
5. Wróć do kroku 1.
6. Jeżeli wprowadzoną liczbą jest 0, zakończ program.
- Zabezpiecz wcześniej napisany kalkulator przed podawaniem niepoprawnych liczb i operacji. Wykorzystaj wiedzę zdobytą z pierwszego zadania pracy domowej niniejszego rozdziału. Zabezpiecz również w analogiczny sposób przed możliwością wyboru nieprawidłowego działania.
Przede wszystkim zastanawiają mnie punkty 2, 3 i 4. W 2 punkcie "Wprowadź liczbę" sugeruje że mam wprowadzić 1 liczbę, napisałem kalkulator tak aby od razu wprowadzać 2 liczby. Ponadto nie rozumiem w kolejnych punktach tych nawiasów (jeżeli liczba różna od 0). Przecież można wykonywać wszystkie działania z 0, poza dzieleniem przez 0.
W każdym razie czy ktoś mógłby ocenić mój kod, ewentualnie nanieść jakieś poprawki? Chciałbym jeszcze zapytać o zabezpieczenie przed podaniem niepoprawnych liczb i operacji. Użyłem do tego funkcji sprawdzającej strumień wejścia cin.good(), a jej wynik zapisałem w zmiennej bool. Bez zmiennej cała pętla przy wprowadzaniu liter mi się zapętlała w kółko nie mam pojęcia dlaczego, tak samo jak nie ma funkcji cin.clear() oraz cin.sync(). Ponadto nie rozumiem czemu program zwraca mi 0 i kończy działanie, jak przy wyborze operacji (dodawanie, odejmowanie itp.) wpisze literę zamiast cyfry, komunikat wyświetla poprawnie że nie ma takiej opcji w menu, ale kończy działanie programu. Czy ktoś mógłby dokładnie wytłumaczyć mi działanie funkcji cin.clear() oraz cin.sync()? Jak się domyślam, program działa odczytując kolejne wiersze więc nie rozumiem, czemu to działa w przypadku, kiedy obie te funkcje są przed wprowadzaniem danych.
Wklejam kod i pozdrawiam :)
#include <iostream>
using namespace std;
int main()
{
float a, b;
int dzialanie;
float wynik = 0;
bool spr;
do
{
cin.clear();
cin.sync();
cout << "Wynik = " << wynik << endl;
cout << endl << "Wprowadz 2 liczby rozdzielone spacjami: ";
cin >> a >> b;
spr = cin.good();
if( spr == 1 )
{
cout << endl << "[1] Dodawanie \n[2] Odejmowanie \n[3] Mnozenie \n[4] Dzielenie \n[5] Zakoncz" << endl << endl;
cout << "Wybierz dzialanie: ";
cin.clear();
cin.sync();
cin >> dzialanie;
switch( dzialanie )
{
case 1: wynik = a + b; cout << a << " + " << b << endl;
break;
case 2: wynik = a - b; cout << a << " - " << b << endl;
break;
case 3: wynik = a * b; cout << a << " * " << b << endl;
break;
case 4: if( b != 0 ) { wynik = a / b; cout << a << " / " << b << endl; }
else cout << endl << "Nie dzielimy przez 0 LAMUSIE!" << endl;
break;
case 5: cout << endl << "Dzieki za skorzystanie z kalkulatora!" << endl;
return 0;
default: cout << endl << "Nie ma takiej opcji w menu!" << endl;
break;
}
} else cout << "Wprowadz poprawne liczby" << endl;
} while( dzialanie != 0 );
return 0;
}