12 rozdział - rozbudowanie kalkulatora
Ostatnio zmodyfikowano 2015-04-23 22:22
Feuerschwamm-2 Temat założony przez niniejszego użytkownika |
12 rozdział - rozbudowanie kalkulatora » 2015-04-22 22:13:33 Witam, pisząc krótko chodzi o to że nie rozumiem pewnego działania programu. Oto kod ( tak wiem, kalkulator mogłem prościej napisać ale chciałem go rozbudować ). #include <iostream> using namespace std;
int main() { bool aa; bool bb; float a; float b; int z; std::cout << "Kalkulator" << std::endl; std::cout << "" << std::endl; std::cout << "Podaj pierwsza liczbe" << std::endl; std::cin >> a; aa = std::cin.good(); std::cin.clear(); std::cin.sync(); std::cout << "Podaj druga liczbe" << std::endl; std::cin >> b; bb = std::cin.good(); std::cin.clear(); std::cin.sync(); std::cout << "" << std::endl; if( a || b != 0 && aa || bb != 0 ) { std::cout << "Wybierz co chesz zrobic" << std::endl; std::cout << "Dodac - 1" << std::endl; std::cout << "Odjac - 2" << std::endl; std::cout << "Pomnozyc - 3" << std::endl; std::cout << "Podzielic - 4" << std::endl; std::cin >> z; std::cin.clear(); std::cin.sync(); switch( z ) { case 1: std::cout << "Wynik = " << a + b << std::endl; break; case 2: std::cout << "Wynik = " << a - b << std::endl; break; case 3: std::cout << "Wynik = " << a * b << std::endl; break; case 4: std::cout << "Wynik = " << a / b << std::endl; break; default: std::cout << "Zle dane, urchom ponownie program" << std::endl; break; } } else std::cout << "Uruchom ponownie program" << std::endl; return 0; } Chodzi o instrukcje "if" jak widzicie dałem tam "&&" czyli że muszą być spełnione oba warunki a tu nawet po wpisaniu dwóch zer program będzie dalaj działał. Mógłbym zostawić samo "if ( a || b != 0 )" i wtedy zarówno po wpisaniu liter jak i dwóch zer program przestał by działać czyli tak jak w zamiarze ale pragnę zrozumieć co z tym "a || b != 0 && aa || bb != 0" jest nie tak że po wpisaniu dwóch zer program dalej działa. |
|
pekfos |
» 2015-04-22 22:18:20 if( a || b != 0 && aa || bb != 0 )
|
Co to ma być..? |
|
Feuerschwamm-2 Temat założony przez niniejszego użytkownika |
» 2015-04-22 22:35:45 a || b != 0 && aa || bb != 0
chodzi o to że jak zrobię samo if ( a || b != 0 ) to będzie dobrze i jak wpiszę dwie litery albo dwa razy 0 to program przestanie działać. Ale chciałem poeksperymentować i napisać to samo w szerszy sposób. Ta druga część && aa || bb != 0 to jest tak : && - oznacza że oba warunki muszą być spełnione, tak ? aa i bb to są zmienne bool, odnoszą się do std::cin.good(), że jeśli wszystko jest dobrze to zmienna ma wartość 1. czyli - && aa || bb != 0 że przynajmniej jedno z aa i bb musi być różne od 0 by program działaj a ogólnie to if ( a || b != 0 && aa || bb != 0 )
czyli że zadziała dalej jeśli przynajmniej jedno z a lub b ma wartość inna od 0 i jedno z aa i bb ma wartość różną od zera. |
|
machond |
» 2015-04-22 23:44:09 if(( a || b != 0 ) &&( aa || bb != 0 ) ) Nie wiem, czy o to Ci chodziło. Ale teraz jak wpisze dwa 0, to chce się uruchomić ponownie. |
|
JMII89 |
» 2015-04-23 06:54:28 A nie lepiej zamiast sprawdzać czy ktoś podał poprawną liczbę to prosić go aby jeszcze razją wpisał? |
|
carlosmay |
» 2015-04-23 16:05:04 Zakombinuj z czyszczeniem strumienia cin.clear() i cin.sync(). Czyszczenie strumienia powinno być przed pobraniem danych z klawiatury. Np w pętli, żeby uniknąć nieskończonej pętli po błędzie w danych wejściowych.
|
|
pekfos |
» 2015-04-23 18:14:09 Zapis a || b != 0 sugeruje, że nie wiesz, jak działają operatory. |
|
carlosmay |
» 2015-04-23 20:07:14 Oczywiście też nie pomyślałem, (edytowałem poprzedni post, wprowadzał w błąd) PRIORYTETY operatorów. Nawiasy wymuszjące kolejność działań rozwiążą problem.
((a != 0) || (b != 0)) && (... |
|
« 1 » 2 |