newbieguy Temat założony przez niniejszego użytkownika |
Problem z petla while » 2019-10-08 22:44:36 czesc wszystkim,czy ktos pomoglby znalezc rozwiazanie na moja petle do while w case 4 ? bylbym wdzieczny ;d #include <iostream> #include <windows.h>
int main() { { double liczba1, liczba2, wynik; char znak; std::cout << "Podaj liczbe pierwsza: "; std::cin >> liczba1; std::cin.clear(); std::cin.sync(); system( "cls" ); std::cout << "Podaj liczbe druga: "; std::cin >> liczba2; std::cin.clear(); std::cin.sync(); system( "cls" ); if(( liczba1 == std::cin.fail() ) ||( liczba1 == std::cin.fail() ) ) do { std::cout << "Wpisales zle liczby!\nWpisz je ponownie: "; std::cin >> liczba1, liczba2; } while(( liczba1 == std::cin.good() ) &&( liczba2 == std::cin.good() ) ); system( "cls" ); std::cout << "Dobrze,wiec wypisales: " << liczba1 << " i " << liczba2; std::cout << "\nCo chcesz zrobic?: \n[0] Wyjscie\n[1] Dodawanie\n[2] Odejmowanie\n[3] Mnozenie\n[4] Dzielenie\n[5] Potegowanie\n[6] Pierwiastkowanie\n"; std::cin >> znak; switch( tolower( znak ) ) { case '0': std::cout << "Wyszedles z programu!"; return 0; break; case '1': system( "cls" ); wynik = liczba1 + liczba2; std::cout << "Wynik wynosi: " << liczba1 << " + " << liczba2 << " = " << wynik << std::endl; break; case '2': system( "cls" ); wynik = liczba1 - liczba2; std::cout << "Wynik wynosi: " << liczba1 << " - " << liczba2 << " = " << wynik << std::endl; break; case '3': system( "cls" ); wynik = liczba1 * liczba2; std::cout << "Wynik wynosi: " << liczba1 << " * " << liczba2 << " = " << wynik << std::endl; break; case '4': wynik = liczba1 / liczba2; system( "cls" ); if(( liczba1 == 0 ) ||( liczba2 == 0 ) ) do { std::cout << "W matematyce nie dzieli sie przez zero ;/\n Nic sie nie dzieje,wpisz te liczby od nowa !:\n"; std::cin >> liczba1; std::cin >> liczba2; } while(( liczba1 != 0 ) &&( liczba2 != 0 ) ); std::cout << "Wynik wynosi: " << liczba1 << " : " << liczba2 << " = " << wynik << std::endl; break; }
|
|
pekfos |
» 2019-10-08 23:07:35 Warunek pętli powinien być przeciwny, taki jak w warunku. Też raczej powinieneś sprawdzać dzielenie przez zero zanim wykonasz dzielenie. Poza tym, po co wczytujesz od nowa lewy operand dzielenia? Nic nie szkodzi jeśli jest zerowy. |
|
newbieguy Temat założony przez niniejszego użytkownika |
» 2019-10-08 23:19:56 W którym dokładnie miejscu wczytuje od nowa tego operanda? Bo nie rozumiem ;/ |
|
pekfos |
» 2019-10-09 06:44:52 std::cout << "W matematyce nie dzieli sie przez zero ;/\n Nic sie nie dzieje,wpisz te liczby od nowa !:\n"; std::cin >> liczba1; std::cin >> liczba2; |
|
newbieguy Temat założony przez niniejszego użytkownika |
» 2019-10-09 07:13:17 Czyli może być Std::cin>>liczba1,liczba2; |
|
pekfos |
» 2019-10-09 18:43:05 Jestem w stanie zaakceptować std::cin >> liczba2, liczba1;
biorąc pod uwagę, że liczba1 tu kompletnie nic nie robi (zamiast przecinka powinno być drugie >>). Chodzi mi o to, że nie ma potrzeby ponownie wczytywać liczba1. Gdy dzielisz liczba1 / liczba2, tylko liczba2 nie może być zerowa. Nie ma sensu porównywać z zerem obu liczb i obu wczytywać od nowa. Poza tym jak patrzę na resztę kodu, a nie tylko "while w case 4", to: if(( liczba1 == std::cin.fail() ) ||( liczba1 == std::cin.fail() ) )
|
Ten zapis nie ma sensu. Robisz dokładnie to, co piszesz - porównujesz metry z kilogramami. Wczytaną liczbę, z informacją 0/1 informującą o powodzeniu ostatniej operacji. Na dodatek ta informacja została już zniszczona wywołaniem clear(). A co do sync(), w kursie jest czerwona ramka o tym, dlaczego nie powinno tego być w kodzie. std::cin >> liczba1, liczba2;
|
Jak wyżej, std::cin >> liczba1 >> liczba2; . |
|
newbieguy Temat założony przez niniejszego użytkownika |
» 2019-10-09 19:15:38 ahahaa a z tym przecinkiem to się nie skapnalem bo pisalem rano ;D if(( liczba1 == std::cin.fail() ) ||( liczba1 == std::cin.fail() ) )
template < typename T > T io_read( const char * msg, const char * errmsg, std::istream & is = std::cin, std::ostream & os = std::cout ) { T result { }; while(( os << msg ) && !( is >> result ) ) { os << errmsg; is.clear(); is.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); } return result; }
|
|
pekfos |
» 2019-10-09 19:43:10 template < typename T > T io_read( const char * msg, const char * errmsg, std::istream & is = std::cin, std::ostream & os = std::cout ) { T result { }; while(( os << msg ) && !( is >> result ) ) { os << errmsg; is.clear(); is.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); } return result; } | Well, that escalated quickly.. Ja bym dał taki warunek pętli while( os << msg, !( is >> result ) )
w ten sposób błąd strumienia wyjściowego nie sprawia, że zostaje zwrócona błędna wartość. I jeśli chcesz wchodzić w taką ogólność, że przyjmujesz strumień wejściowy, to powinieneś jeszcze obsługiwać eofbit, inaczej będziesz mieć pętlę nieskończoną w przypadku wczytywania z pliku, który kończy się przed wczytaniem poprawnej wartości - co zresztą jest możliwe także dla standardowego wejścia. Nie zapominajmy też o innych typach znakowych, nie ma powodu żeby nie pójść na całość i użyć std::basic_istream<> i std::basic_ostream<>. |
|
« 1 » |