Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

12 rozdział - rozbudowanie kalkulatora

Ostatnio zmodyfikowano 2015-04-23 22:22
Autor Wiadomość
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ć ).

C/C++
#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.
P-131284
pekfos
» 2015-04-22 22:18:20
C/C++
if( a || b != 0 && aa || bb != 0 )
Co to ma być..?
P-131285
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.
P-131290
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.
P-131295
JMII89
» 2015-04-23 06:54:28
A nie lepiej zamiast sprawdzać czy ktoś podał poprawną liczbę to prosić go aby jeszcze razją wpisał?
P-131304
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.

P-131330
pekfos
» 2015-04-23 18:14:09
Zapis a || b != 0 sugeruje, że nie wiesz, jak działają operatory.
P-131335
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)) && (...
P-131341
« 1 » 2
  Strona 1 z 2 Następna strona