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

[Lekcja 15] Kalkulator - problem

Ostatnio zmodyfikowano 2014-01-29 17:01
Autor Wiadomość
hhh
Temat założony przez niniejszego użytkownika
[Lekcja 15] Kalkulator - problem
» 2014-01-29 12:21:33
Witam, zrobiłem do lekcji 15 kalkulator, tylko mam taki problem,

C/C++
#include <iostream>
using namespace std;
int main()
{
    cout << "********===========K A L K U L A T O R============*********\n "
    << " ------------O------------------------ - O----------------\n";
    float a, b;
    int liczba;
    bool ww;
   
    do
    {
        cout << "Wybierz dzialanie: \n"
        << "[1] Dodawanie: \n"
        << "[2] Odejmowanie:\n"
        << "[3] Mnozenie:\n"
        << "[4] Dzielenie: \n\n"
        << "[0] Zakoncz program \n\n"
        << "Twoj wybor:         ";
       
        cin >> liczba;
        ww = liczba;
        ww = cin.good();
        cin.sync();
        cin.clear();
       
        bool aa = false, bb = false;
        switch( liczba )
        {
           
        case 1:
            {
                cout << "Wybrales dodawanie( A + B )\n"
                << "Wpisz liczby a i b ktore chcesz do siebie dodac:\n";
                do
                {
                    cout << "a: ";
                    cin >> a;
                    aa = a;
                    aa = cin.good();
                    cin.sync();
                    cin.clear();
                    cout << "b: ";
                    cin >> b;
                    bb = b;
                    bb = cin.good();
                    cin.sync();
                    cin.clear();
                    if( !( aa ) || !( bb ) )
                         cout << "Podales nieprawidlowe znaki w liczbie a lub b. Sproboj jeszcze raz\n";
                   
                } while( !( aa ) ||!( bb ) );
               
                cout << "\nA + B wynosi: "
                << a + b << endl << "\n";
                break;
            }
        case 2:
            {
                cout << "Wybrales odejmowanie( A - B )\n"
                << "Wpisz liczby a i b ktore chcesz od siebie odjac:\n";
                do
                {
                    cout << "a: ";
                    cin >> a;
                    aa = a;
                    aa = cin.good();
                    cin.sync();
                    cin.clear();
                    cout << "b: ";
                    cin >> b;
                    bb = b;
                    bb = cin.good();
                    cin.sync();
                    cin.clear();
                    if( !( aa ) || !( bb ) )
                         cout << "Podales nieprawidlowe znaki w liczbie a lub b.Sproboj jeszcze raz\n";
                   
                } while( !( aa ) || !( bb ) );
               
                cout << "\nA - B wynosi: "
                << a - b << endl << "\n";
                break;
            }
        case 3:
            {
                cout << "Wybrales mnozenie( A * B )\n"
                << "Wpisz liczby a i b ktore chcesz przez siebie pomnozyc:\n";
                do
                {
                    cout << "a: ";
                    cin >> a;
                    aa = a;
                    aa = cin.good();
                    cin.sync();
                    cin.clear();
                    cout << "b: ";
                    cin >> b;
                    bb = b;
                    bb = cin.good();
                    cin.sync();
                    cin.clear();
                    if( !( aa ) || !( bb ) )
                         cout << "Podales nieprawidlowe znaki w liczbie a lub b.Sproboj jeszcze raz\n";
                   
                } while( !( aa ) || !( bb ) );
               
                cout << "\nA * B wynosi: "
                << a * b << endl << "\n";
                break;
            }
        case 4:
            {
                cout << "Wybrales dzielenie( A / B )\n"
                << "Wpisz liczby a i b ktore chcesz przez siebie podzielic:\n";
                do
                {
                    cout << "a: ";
                    cin >> a;
                    aa = a;
                    aa = cin.good();
                    cin.sync();
                    cin.clear();
                    cout << "b: ";
                    cin >> b;
                    bb = b;
                    bb = cin.good();
                    cin.sync();
                    cin.clear();
                    if( b == 0 )
                         cout << "Nie dzielimy przez 0!!!. Sprobuj jeszcze raz" << endl << "\n";
                   
                    if( !( aa ) || !( bb ) ||!( b == 0 ) )
                   
                         cout << "Podales nieprawidlowe znaki w liczbie a lub b.Sproboj jeszcze raz\n";
                   
                } while( !( aa ) || !( bb ) ||!b );
               
                cout << "\nA / B wynosi: "
                << a / b << endl << "\n";
                break;
            }
           
        case 0:
            cout << "Wybrales 0, wiec program zostanie zakonczony";
            cin.sync();
            cin.clear();
        }
        if( !( ww ) )
             cout << "Wpisales nieprawidlowe znaki. Sprobuj jeszcze raz.\n\n\n";
       
    } while( liczba != 0 );
   
    cin.sync();
    cin.get();
    return 0;
}

Problem jest taki jak pokazałem na screenie, po wybraniu opcji 4, wpisaniu a=3,b=0, następnie wpisuje a=e,b=s i wyskakuje mi komunikat "Nie dzielimy przez 0" a nie powinien. Jeżeli najpierw wpiszę a=s,b=c to jest wszystko ok.
 . I jeszcze takie pytanie, czy po za tym problemem, zostały spełnione wszystkie warunki zadania?
P-103495
alixir
» 2014-01-29 12:39:50
Na szybkiego twój problem można rozwiązać tak:

C/C++
if( !( aa ) || !( bb ) ||!( b == 0 ) )

     cout << "Podales nieprawidlowe znaki w liczbie a lub b.Sproboj jeszcze raz\n";
else
if( b == 0 )
     cout << "Nie dzielimy przez 0!!!. Sprobuj jeszcze raz" << endl << "\n";

A ogólnie to pętlę sprawdzającą poprawność danych zrobiłbym dla każdej zmiennej osobno.
P-103496
hhh
Temat założony przez niniejszego użytkownika
» 2014-01-29 12:55:09
Dzięki zadziałało! A mógłbyś mi powiedzieć, co było nie tak z dwoma ifami w pętli, bo to dziwne, jeżeli pierwszy if się wykona("Nie dzielimy przez 0) i pętla się powtórzy, to automatycznie ten if jest uznawany za wykonany i wchodzi do drugiego ifa("Nieprawidlowe znaki"), albo do wartosci b zamiast znaku jest przypisywana wartość 0 hm?
P-103501
alixir
» 2014-01-29 14:52:14
Ogólnie pod zmienną liczbową nie da się przypisać litery, więc jeśli we wcześniejszym przebiegu podałeś jako b=0, a następnym razem testujesz dla liter, to b nadal wynosi 0.
Stąd też pierwszy z warunków sprawdzający czy b==0 wyświetlał twój niechciany tekst.
P-103511
hhh
Temat założony przez niniejszego użytkownika
» 2014-01-29 15:39:49
alixir, hm, sytuacja wyglądała tak:
Jest pętla
C/C++
do
{ if( b == 0 )
    if( !( aa )...)
         } while(...)

I sytuacja:

1. Wpisuje pod b literę(np. b='s')
2. warunek if(b==0) jest pomijany, wykonuje się następny if(!(aa)...)   --->czyli prawidłowo tak jak ma być

II sytuacja:

1.Wpisuje b=0
2. warunek if(b==0) jest  wykonywany
3. Pętla się powtarza, tym razem pod b wpisuje literę
4. Wykonują się 2 warunki: if(b==0) i if(!(aa)...)

Więc żeby zapobiec takiej sytuacji trzeba by było zmienną b zresetować pod koniec pętli czy jak?
P-103522
alixir
» 2014-01-29 17:01:45
Ja bym zapisał to coś w tym stylu: (przeanalizuj sobie)

C/C++
bool aa = true, bb = true;
..
..
case 4:
{
    cout << "Wybrales dzielenie( A / B )\n"
    << "Wpisz liczby a i b ktore chcesz przez siebie podzielic:\n";
    do {
        cout << "a: ";
        cin >> a;
        aa = cin.good();
        if( !aa ) {
            cin.sync();
            cin.clear();
            cout << "Podales nieprawidlowa liczbe. Sproboj jeszcze raz\n";
        }
    } while( !aa );
   
    do {
        cout << "b: ";
        cin >> b;
        bb = cin.good();
        if( !bb ) {
            cin.sync();
            cin.clear();
            cout << "Podales nieprawidlowa liczbe. Sproboj jeszcze raz\n";
        }
        else if( b == 0 ) {
            cout << "Nie dzielimy przez 0!!!. Sprobuj jeszcze raz\n";
            bb = false;
        }
    } while( !bb );
   
    cout << endl << a << " / " << b << " = " << a / b << endl;
    break;
}
P-103530
« 1 »
  Strona 1 z 1