Problem z drugim zadaniem domowym w Rozdziale 15.
Ostatnio zmodyfikowano 2016-07-10 20:45
Rss |
» 2016-07-10 18:18:32 Być może trochę późno piszę (6 dni po ostatniej odpowiedzi). Poniżej wklejam kod, który ja skonstruowałam. Dodałam sobie ułamek. Działa, tylko mam jeden problem. Otóż zabezpieczyłam program przed wprowadzeniem z klawiatury innej liczby niż do wyboru działania (1-9). Zabezpieczenie nie działa dla np '555'. '555' czyta jako 5 i wykonuje działanie. Jak się tego pozbyć? #include <iostream> #include <math.h>
using namespace std;
long double a, b; char wybor;
int main() { do { cout << "Podaj liczbe a: "; cin.clear(); cin.sync(); } while(( !( cin >> a ) ) ||( a == 0 ) ); do { cout << "Podaj liczbe b: "; cin.clear(); cin.sync(); } while(( !( cin >> b ) ) ||( b == 0 ) ); do { cout << "Wybierz jakie dzialanie chcesz wykonac na wybranych liczbach:" << endl; cout << "[1] Dodawanie" << endl << "[2] Odejmowanie" << endl; cout << "[3] Mnozenie" << endl << "[4] Dzielenie" << endl << "[5] Ulamek z liczby a" << endl << "[6] Ulamek z liczby b" << endl << "[7] Rezygnuj" << endl; cin >> wybor; switch( wybor ) { case '1': cout << "Wynik dodawania: " <<( a + b ) << endl; break; case '2': cout << "Wynik odejmowania: " <<( a - b ) << endl; break; case '3': cout << "Wynik mnozenia: " <<( a * b ) << endl; break; case '4': cout << "Wynik dzielania: " <<( a / b ) << endl; break; case '5': cout << "Ulamek z liczby a: " <<( sqrt( a ) ) << endl; break; case '6': cout << "Ulamek z liczby b: " <<( sqrt( b ) ) << endl; break; case '7': cout << "Rezygnujesz z dzialan" << endl; break; default: cout << "Nie wybrales zadnej opcji" << endl; cin.clear(); cin.sync(); break; } } while(( !( wybor == '1' ) ) &&( !( wybor == '2' ) ) &&( !( wybor == '3' ) ) &&( !( wybor == '4' ) ) &&( !( wybor == '5' ) ) &&( !( wybor == '6' ) ) &&( !( wybor == '7' ) ) ); return 0; }
W tym momencie 'poradziłam' sobie z tym zmieniając nieco kod. do { cout << "Wybierz jakie dzialanie chcesz wykonac na wybranych liczbach:" << endl; cout << "[1] Dodawanie" << endl << "[2] Odejmowanie" << endl; cout << "[3] Mnozenie" << endl << "[4] Dzielenie" << endl << "[5] Ulamek z liczby a" << endl << "[6] Ulamek z liczby b" << endl << "[7] Rezygnuj" << endl; wybor = getch();
Czyli dałam sobie getch(). Przez co zaraz po wprowadzeniu prawidłowej liczby wyświetla się działanie do niej zdefiniowane. Jednak nadal nurtuje mnie to jak się pozbyć tego błędu w mojej pierwotnej wersji kodu? |
|
carlosmay |
» 2016-07-10 18:53:43 Zabezpieczenie nie działa dla np '555'. '555' czyta jako 5 i wykonuje działanie. Jak się tego pozbyć? |
Nie pozbędziesz się tego. Pamiętaj, że wczytujesz do zmiennej typu char , który przechowuje jeden znak. Wpisanie "555" powoduje, że pierwszy znak (czyli 5) wczytywany jest do zmiennej, a pozostałe zostają w buforze strumienia i czekają na swoją kolej. while(( !( wybor == '1' ) ) &&( !( wybor == '2' ) ) &&( !( wybor == '3' ) ) &&( !( wybor == '4' ) ) &&( !( wybor == '5' ) ) &&( !( wybor == '6' ) ) &&( !( wybor == '7' ) ) ) |
Ten warunek można napisać dużo prościej (przy użyciu dwóch wyrażeń - > <, lub >= <=). I to całe zło, zmienne globalne. Używaj zmiennych lokalnych, póki sytuacja nie zmusi cię do użycia zmiennych globalnych. W świetle kursu rozpalony stos czeka. |
|
Rss |
» 2016-07-10 20:45:22 Faktycznie całkowicie zapomniałam, że char jest typem pojedynczego znaku. Zmieniłam też zmienne globalne na lokalne, oraz uprościłam sobie pętle do while. Dzięki za pomoc:) Obecnie to wygląda tak: #include <iostream> #include <math.h> #include <conio.h>
using namespace std;
int main() { double a, b; char wybor; do { cout << "Podaj liczbe a: "; cin.clear(); cin.sync(); } while(( !( cin >> a ) ) ||( a == 0 ) ); do { cout << "Podaj liczbe b: "; cin.clear(); cin.sync(); } while(( !( cin >> b ) ) ||( b == 0 ) ); do { cout << "Wybierz jakie dzialanie chcesz wykonac na wybranych liczbach:" << endl; cout << "[1] Dodawanie" << endl << "[2] Odejmowanie" << endl; cout << "[3] Mnozenie" << endl << "[4] Dzielenie" << endl << "[5] Ulamek z liczby a" << endl << "[6] Ulamek z liczby b" << endl << "[7] Rezygnuj" << endl; wybor = getch(); switch( wybor ) { case '1': cout << "Wynik dodawania: " <<( a + b ) << endl; break; case '2': cout << "Wynik odejmowania: " <<( a - b ) << endl; break; case '3': cout << "Wynik mnozenia: " <<( a * b ) << endl; break; case '4': cout << "Wynik dzielania: " <<( a / b ) << endl; break; case '5': cout << "Ulamek z liczby a: " <<( sqrt( a ) ) << endl; break; case '6': cout << "Ulamek z liczby b: " <<( sqrt( b ) ) << endl; break; case '7': cout << "Rezygnujesz z dzialan" << endl; break; default: cout << "Nie wybrales zadnej opcji" << endl; break; } } while(( wybor < '1' ) ||( wybor > '7' ) ); return 0; }
Myślę, że przejdzie. |
|
1 « 2 » |