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

[C++] Kalkulator. Ćwiczenie na funkcjach. Dzielenie wykonuje się dwukrotnie.

Ostatnio zmodyfikowano 2014-08-17 22:37
Autor Wiadomość
carlosmay
Temat założony przez niniejszego użytkownika
[C++] Kalkulator. Ćwiczenie na funkcjach. Dzielenie wykonuje się dwukrotnie.
» 2014-08-17 20:54:48
Założyłem:
1. Kalkulator ma zabezpieczyć wejście.
2. Ma informować o niepoprawnym dzieleniu przez 0.


C/C++
#include <iostream>
#include <cstdio>
using namespace std;

void opcje()
{
    cout << "[1] dodawanie\n";
    cout << "[2] odejmowanie\n";
    cout << "[3] mnozenie\n";
    cout << "[4] dzielenie\n";
    cout << "[5] reszta z dzielenia\n";
    cout << "[6] wyjscie z programu\n\n";
}
(...)
C/C++
float dzielenie()
{
    float a;
    cout << "Podaj liczbe a:  ";
    cin >> a;
    bool ap = cin.good();
    cin.clear();
    cin.sync();
   
    float b;
    cout << "Podaj liczbe b:  ";
    cin >> b;
    bool bp = cin.good();
    cin.clear();
    cin.sync();
    cout << "Wynik = ";
   
    if( ap != false && bp != false && b != 0 ) //jak zmienie na false na 0 to przy 5 / 9 wywala ze
    //Dzielenie przez zero niedozwolone, a w tej sytuacji jak w logu
         return a / b;
    else
         return 0;
   
}
(...)
C/C++
int main()
{
    cout << "\t\tZAPRASZAMY\n\n";
    cout << "W programie dostepne sa nastepujace opcje:\n\n";
   
    int x;
    bool koniec = false;
    do {
        cout << "\n\nWybierz jedna z opcji:  \n";
        opcje();
        cout << endl;
        cin >> x;
        if( x >= 1 && x <= 6 )
        {
            switch( x )
            {
            case 1:
                cout << dodawanie() << endl;
                break;
            case 2:
                cout << odejmowanie() << endl;
                break;
            case 3:
                cout << mnozenie() << endl;
                break;
            case 4:
                if( dzielenie() != 0 )
                     cout << dzielenie() << endl;
                else
                     cout << "Dzielenie przez zero niedozwolone./n";
               
                break;
            case 5:
                if( resztaZdzielenia() != 0 )
                     cout << resztaZdzielenia() << endl;
                else
                     cout << "Dzielenie przez zero niedozwolone./n";
               
                break;
            case 6:
                koniec = true;
                break;
            }
        }
        else cout << "\n\nWybrales niepoprawna opcje.\n\n";
       
    } while( x != 6 && !koniec );
   
    cout << "ZAPRASZAMY PONOWNIE\n\n";
   
    system( "pause" );
    return 0;
}


Podaj liczbe a:  5
Podaj liczbe b:  9
Wynik = Podaj liczbe a:  5
Podaj liczbe b:  9
Wynik = 0.555556
P-115657
Vister26
» 2014-08-17 21:06:59
Wywołujesz funkcję dzielenie() dwa razy pod rząd
C/C++
if( dzielenie() != 0 ) // tutaj
     cout << dzielenie() << endl; // i tutaj


Aby tego uniknąć, możesz zapisać sobie wartość zwracaną przez tą funkcję do jakiejś zmiennej i na niej wykonywać dalsze operacje.

@edit
Z obsługą funkcji resztaZdzielenia() to samo.
P-115658
carlosmay
Temat założony przez niniejszego użytkownika
» 2014-08-17 22:03:32
Nie bardzo to wychodz.
C/C++
case 4:
{ float zastapDziel = dzielenie();
    if( zastapDziel != 0 )
         cout << dzielenie() << endl;
    else
         cout << "Dzielenie przez zero niedozwolone./n";
   
    break;
}

Wykonuje się przy przypisywaniu i póżniej normalnie.
Jeśli zrobie przypisanie na poczatku funkcji main to wykonje się przed możliwością wyboru.
Nie mam pomyslu jak to zrobic.
P-115660
Vister26
» 2014-08-17 22:18:11
Musisz zrozumieć jak to działa:
C/C++
case 4:
{ float zastapDziel = dzielenie(); /* w tym miejscu wykonujesz funkcję dzielenie() (w której wpisujesz dwie liczby) i zapisujesz jej wartość( czyli wynik dzielenia ) do zmiennej floatzastapDziel. */
   
    if( zastapDziel != 0 ) // sprawdzasz czy wynik jest różny od zera(nie było dzielenia przez zero). To jest OK
         cout << dzielenie() << endl; /* jeśli jest różny od zera to ponownie wykonujesz funkcję dzielenie() (w której znów musisz wpisać dwie liczby). To jest źle. */
    else
         cout << "Dzielenie przez zero niedozwolone./n";
   
    break;
}

Wystarczy, że
cout << dzielenie() << endl;
 zamienisz na
cout << zastapDziel << endl;
 (ponieważ ta zmienna zawiera wynik dzielenia) i powinno być dobrze. Jeśli nadal nie rozumiesz, to spróbuj po kolei od początku przeanalizować kod. Być może cię olśni ;)
P-115663
carlosmay
Temat założony przez niniejszego użytkownika
» 2014-08-17 22:37:58
Czyli funkcja jest wywołana
float zastapDziel = dzielenie();
 i wykonuje polecenia,
następnie przypisuje sam wynik tego działania do zmiennej
float zastapDziel
,
a tutaj
C/C++
if( zastapDziel != 0 )
     cout << zastapDziel << endl;

wyświetla tylko wynik juz wykonanego działania, bez wywoływania funkcji.
Chyba zaskoczyłem. Taki detal niezrozumiany a tyle krwi.
Podziękowania.
P-115665
« 1 »
  Strona 1 z 1