jebackoze Temat założony przez niniejszego użytkownika |
rozdział/lekcja 15, zadanie nr 2/kalkulator » 2022-04-04 16:10:23 hej, chcialbym prosic o ocene, czy kod jest wlasciwy. czy ew cos jest niepotrzebnie zakodowane. #include <iostream> #include <limits> using namespace std; int main() { int dzialanie; float a, b; float wynik = 0; bool test = cin.fail(); do { cout << "aktualny wynik: " << wynik; cout << "\nwpisz liczbe:\n"; cin >> a; test = cin.fail(); cout << "wybierz dzialanie:\n[1] dodawanie\n[2] odejmowanie\n[3] mnozenie\n[4] dzielenie\n[5] rezygnuj\n" << endl; cin >> dzialanie; cin.clear(); cin.ignore( numeric_limits < std::streamsize >::max(), '\n' ); switch( dzialanie ) { case 1: cout << "\nwpisz liczbe:\n"; cin >> b; cout << "wynik: " << a + b << endl; wynik +=( a + b ); break; case 2: cout << "\nwpisz liczbe:\n"; cin >> b; cout << "wynik: " << a - b << endl; wynik +=( a - b ); break; case 3: cout << "\nwpisz liczbe:\n"; cin >> b; if( a * b != 0 ) { cout << "wynik: " << a * b << endl; wynik +=( a * b ); } else dzialanie = 5; break; case 4: cout << "\nwpisz liczbe:\n"; cin >> b; if( b == 0 ) { cout << "nie dziel przez zero jelopie. " << "Podaj liczbe rozna od zera: " << endl; cin >> b; } cout << "wynik: " << a / b << endl; wynik +=( a / b ); break; case 5: break; default: cout << "cos chyba nie umiesz w kalkulator?" << endl; break; } } while( dzialanie < 5 ); cout << "koniec zabawy.\n" << "koncowy wynik: " << wynik << endl; return 0; } |
|
pekfos |
» 2022-04-04 17:24:08 Zmienna test jest zbędna, bo nie jest do niczego wykorzystywana. Według treści zadania operacje są wykonywane między aktualnym wynikiem i jedną liczbą użytkownika. Obliczenie 3*4 to operacje 0+3, 3*4. Prawie jak w zwykłym kalkulatorze, tylko nie można po prostu wpisać pierwszej liczby, a trzeba ją uzyskać jakąś operacją względem aktualnego wyniku. Zabezpieczenie przed błędnym wejściem użytkownika powinno działać jak w zadaniu nr 1, przy czym nie powinieneś pozwalać przejść dalej z błędną wartością. Kod z pierwszego zadania, z braku lepszych opcji, należałoby wkleić w każde miejsce gdzie zadanie 2 mówi o wprowadzeniu jakiejś liczby. |
|
jebackoze Temat założony przez niniejszego użytkownika |
» 2022-04-04 21:49:46 #include <iostream> #include <limits> using namespace std; int main() { int dzialanie; cout << "pierwsza liczbe jakas trzeba podac: " << endl; float b, wynik; cin >> wynik; bool test = cin.fail(); do { cout << "\nwybierz dzialanie:\n[1] dodawanie\n[2] odejmowanie\n[3] mnozenie\n[4] dzielenie\n[5] rezygnuj\n" << endl; cin >> dzialanie; cin.clear(); cin.ignore( numeric_limits < std::streamsize >::max(), '\n' ); switch( dzialanie ) { case 1: int petla; do { cout << "\nwpisz liczbe:\n"; cin >> b; test = cin.fail(); cin.clear(); cin.ignore( numeric_limits < std::streamsize >::max(), '\n' ); if( test == 0 ) { cout << "wynik: " << wynik + b << endl; wynik = wynik + b; petla = 1; } else petla = 0; } while( petla != 1 ); break; return 0; break; case 2: int petla1; do { cout << "\nwpisz liczbe:\n"; cin >> b; test = cin.fail(); cin.clear(); cin.ignore( numeric_limits < std::streamsize >::max(), '\n' ); if( test == 0 ) { cout << "wynik: " << wynik - b << endl; wynik = wynik - b; petla1 = 1; } else petla1 = 0; } while( petla1 != 1 ); break; return 0; break; case 3: int petla2; do { cout << "\nwpisz liczbe:\n"; cin >> b; test = cin.fail(); cin.clear(); cin.ignore( numeric_limits < std::streamsize >::max(), '\n' ); if( test == 0 ) { cout << "wynik: " << wynik * b << endl; wynik = wynik * b; petla2 = 1; } else petla2 = 0; } while( petla2 != 1 ); break; return 0; break; case 4: int petla3; do { cout << "\nwpisz liczbe:\n"; cin >> b; test = cin.fail(); cin.clear(); cin.ignore( numeric_limits < std::streamsize >::max(), '\n' ); if( test == 0 ) { if( b != 0 ) { cout << "wynik: " << wynik / b << endl; wynik = wynik / b; petla3 = 1; } else cout << "nie dziel przez zero jelopie. " << "jeszcze raz sprobuj " << endl; dzialanie = 4; } else petla3 = 0; } while( petla3 != 1 ); break; return 0; break; case 5: break; default: cout << "cos chyba nie umiesz w kalkulator?" << endl; break; } } while( dzialanie < 5 ); cout << "koniec zabawy.\n" << "koncowy wynik: " << wynik << endl; return 0; edycja: musialem usunac poprzednia tresc tego wpisu bo za duzy balagan, czy obecnie powyzszy kod bedzie dobrym rozwiazaniem? |
|
pekfos |
» 2022-04-05 16:57:14 Wciąż można podać błędne dane w niektórych miejscach, na przykład przy wpisywaniu pierwszej liczby. Spróbuj też skrócić kod o niepotrzebne powtórzenia. Wczytywanie liczby b wystarczy mieć w kodzie raz, tak samo wypisywanie wyniku. |
|
jebackoze Temat założony przez niniejszego użytkownika |
» 2022-04-05 23:00:47 troche pogrzebalem w kodzie, coraz dluzszy ten kod, ale nie do konca on chce dzialac tak jakbym chcial i tak jak powinien. nie wiem czemu, jesli podam litere, np. po wybraniu mnozenia to on traktuje litere jak 0. dwa, program w niektorych przypadkach po wybraniu dzialania i nastepnie wpisaniu litery zamiast liczby, nie przechodzi dalej. prosze o jakas podpowiedz #include <iostream> #include <limits> #include <cstdlib> using namespace std; int main() { int dzialanie, petla0; float b, wynik; do { cout << "pierwsza liczbe jakas trzeba podac: " << endl; cin >> wynik; bool test0 = cin.fail(); if( test0 == 1 ) { cout << "to nie liczba, sprobuj ponownie.\n" << endl; cin.clear(); cin.ignore( numeric_limits < std::streamsize >::max(), '\n' ); } else petla0 = 1; } while( petla0 != 1 ); bool test1 = cin.fail(); do { cout << "\nwybierz dzialanie:\n[1] dodawanie\n[2] odejmowanie\n[3] mnozenie\n[4] dzielenie\n[5] rezygnuj\n" << endl; cin >> dzialanie; cin.clear(); cin.ignore( numeric_limits < std::streamsize >::max(), '\n' ); if( dzialanie > 0 && dzialanie < 5 ) { cout << "\nwpisz liczbe:\n"; cin >> b; int petlax; do { test1 = cin.fail(); if( test1 == 1 ) { cout << "to nie liczba, sprobuj ponownie.\n" << endl; cin.clear(); cin.ignore( numeric_limits < std::streamsize >::max(), '\n' ); } else petlax = 1; } while( petlax != 1 ); } if( dzialanie == 5 ) break; switch( dzialanie ) { case 1: int petla; do { if( test1 == 0 ) { cout << "wynik: " << wynik + b << endl; wynik += b; petla = 1; } else petla = 0; } while( petla != 1 ); break; return 0; break; case 2: int petla1; do { if( test1 == 0 ) { cout << "wynik: " << wynik - b << endl; wynik -= b; petla1 = 1; } else petla1 = 0; } while( petla1 != 1 ); break; return 0; break; case 3: int petla2; do { if( test1 == 0 ) { cout << "wynik: " << wynik * b << endl; wynik *= b; petla2 = 1; } else petla2 = 0; } while( petla2 != 1 ); break; return 0; break; case 4: int petla3; do { if( test1 == 0 ) { if( b != 0 ) { cout << "wynik: " << wynik / b << endl; wynik /= b; petla3 = 1; } else cout << "nie dziel przez zero jelopie. " << "jeszcze raz sprobuj " << endl; dzialanie = 4; } else petla3 = 0; } while( petla3 != 1 ); break; return 0; case 5: break; default: cout << "cos chyba nie umiesz w kalkulator?" << endl; break; } } while( dzialanie != 5 ); cout << "koniec zabawy.\n" << "koncowy wynik: " << wynik << endl; return 0; }
juz mam taki globus od tego |
|
pekfos |
» 2022-04-05 23:36:28 Zamieszanie jest ze zmiennymi sterującymi pętlami. Czasami nie mają przypisanych wartości i program będzie się zachowywać w nieprzewidywalny sposób. Na przykład petla0 jest niezainicjalizowane jeśli podasz błędne dane na początku programu. W warunku pętli wystarczy wprost użyć wyniku który wcześniej odczytałeś z fail(): bool test; do { cout << "pierwsza liczbe jakas trzeba podac: " << endl; cin >> wynik; test = cin.fail(); if( test ) { cout << "to nie liczba, sprobuj ponownie.\n" << endl; cin.clear(); cin.ignore( numeric_limits < std::streamsize >::max(), '\n' ); } } while( test ); |
|
jebackoze Temat założony przez niniejszego użytkownika |
» 2022-04-06 09:12:16 @pekfos, dziekuje ci za poswiecony czas, sprawdzanie i podpowiedzi. juz mam dosyc tej lekcji i mam nadzieje, ze teraz cos z tego bedzie. #include <iostream> #include <limits> #include <cstdlib> using namespace std; int main() { int dzialanie; float b, wynik; bool test1; do { cout << "pierwsza liczbe jakas trzeba podac: " << endl; cin >> wynik; test1 = cin.fail(); if( test1 ) { cout << "to ma byc liczba.\n" << endl; cin.clear(); cin.ignore( numeric_limits < std::streamsize >::max(), '\n' ); } } while( test1 ); do { cout << "\nwybierz dzialanie:\n[1] dodawanie\n[2] odejmowanie\n[3] mnozenie\n[4] dzielenie\n[5] rezygnuj\n" << endl; cin >> dzialanie; cin.clear(); cin.ignore( numeric_limits < std::streamsize >::max(), '\n' ); if( dzialanie > 0 && dzialanie < 5 ) { do { cout << "\nwpisz liczbe:\n"; cin >> b; test1 = cin.fail(); if( test1 ) { cout << "to nie liczba, sprobuj ponownie.\n" << endl; cin.clear(); cin.ignore( numeric_limits < std::streamsize >::max(), '\n' ); } } while( test1 ); } if( dzialanie == 5 ) break; switch( dzialanie ) { case 1: do { if( test1 == 0 ) { wynik += b; cout << "wynik: " << wynik << endl; } } while( test1 ); break; return 0; case 2: do { if( test1 == 0 ) { wynik -= b; cout << "wynik: " << wynik << endl; } } while( test1 ); break; return 0; case 3: do { if( test1 == 0 ) { wynik *= b; cout << "wynik: " << wynik << endl; } } while( test1 ); break; return 0; case 4: do { if( test1 == 0 ) { if( b != 0 ) { wynik /= b; cout << "wynik: " << wynik << endl; } else cout << "nie dziel przez zero jelopie. \njeszcze raz sprobuj." << endl; } } while( test1 ); break; return 0; default: cout << "cos chyba nie umiesz w kalkulator?" << endl; break; } } while( dzialanie != 5 ); cout << "koniec zabawy.\n" << "koncowy wynik: " << wynik << endl; return 0; } jeszcze troche pogrzebalem i odchudzilem i chyba uproscilem kod. bedzie lepszy niz ten wyzej, czy moze jakis blad zrobilem? #include <iostream> #include <limits> #include <cstdlib> using namespace std; int main() { int dzialanie; float b, wynik; bool test1; do { cout << "pierwsza liczbe jakas trzeba podac: " << endl; cin >> wynik; test1 = cin.fail(); if( test1 ) { cout << "to ma byc liczba.\n" << endl; cin.clear(); cin.ignore( numeric_limits < std::streamsize >::max(), '\n' ); } } while( test1 ); do { cout << "\nwybierz dzialanie:\n[1] dodawanie\n[2] odejmowanie\n[3] mnozenie\n[4] dzielenie\n[5] rezygnuj\n" << endl; cin >> dzialanie; cin.clear(); cin.ignore( numeric_limits < std::streamsize >::max(), '\n' ); if( dzialanie > 0 && dzialanie < 5 ) { do { cout << "\nwpisz liczbe:\n"; cin >> b; test1 = cin.fail(); if( test1 ) { cout << "to nie liczba, sprobuj ponownie.\n" << endl; cin.clear(); cin.ignore( numeric_limits < std::streamsize >::max(), '\n' ); } } while( test1 ); } if( dzialanie == 5 ) break; switch( dzialanie ) { case 1: if( test1 == 0 ) { wynik += b; cout << "wynik: " << wynik << endl; } break; case 2: if( test1 == 0 ) { wynik -= b; cout << "wynik: " << wynik << endl; } break; case 3: if( test1 == 0 ) { wynik *= b; cout << "wynik: " << wynik << endl; } break; case 4: if( test1 == 0 ) { if( b != 0 ) { wynik /= b; ; cout << "wynik: " << wynik << endl; } else cout << "nie dziel przez zero jelopie. \nsprobuj jeszcze raz." << endl; } break; return 0; default: cout << "cos chyba nie umiesz w kalkulator?" << endl; break; } } while( dzialanie != 5 ); cout << "koniec zabawy.\n" << "koncowy wynik: " << wynik << endl; return 0; }
|
|
pekfos |
» 2022-04-06 19:35:08 Można odchudzić dalej. test1 == 0 jest warunkiem wyjścia z pętli, więc te późniejsze ify są zawsze spełnione. Powiedzmy że teraz kod jest zadowalający. |
|
« 1 » 2 |