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

Kalkulator - drobne błędy

Ostatnio zmodyfikowano 2011-06-14 23:05
Autor Wiadomość
jaupl
Temat założony przez niniejszego użytkownika
Kalkulator - drobne błędy
» 2011-06-02 20:12:14
Pisząc kalkulator (oparty na funkcjach) trafiłem na dwa drobne błędy :
  • Po pierwsze gdy wpiszemy liczbę mniejszą od zera jako dzielnik program prosi nas
o podanie innej dwukrotnie chociaż powinien tylko raz. (pętla while i do while dają ten sam efekt)
  • Drugim problemem jest użycie funkcji pow do uzyskania pierwiastka dowolnego
stopnia. nie mogę tam podstawić zmiennej do drugiego argumentu. ogólnie skutek jest taki że program wyrzuca liczbę jeden jako wynik. Jak to zapisać żeby działało ??

C/C++
#include <iostream>
#include <math.h>
using namespace std;
int wprowadz()
{
    int a;
    cin >> a;
    return a;
}
int wprowadz2()
{
    int b;
    cin >> b;
    return b;
}
int dodawanie( int a, int b )
{
    return a + b;
}
int odejmowanie( int a, int b )
{
    return a - b;
}
int mnozenie( int a, int b )
{
    return a * b;
}
int dzielenie( int a, int b )
{
    if( b != 0 )
         return a / b;
    else
    {
        cout << " NIE MOZNA DZIELIC PRZEZ ZERO !! Podaj inny mianownik :" << endl;
        int c;
        do
        {
            cin >> c;
            b = c;
        }
        while( b == 0 ); // napisałem też odpowiednik pętlą while ...  ;/ ( w komentarzu )
        /*
                while ( b==0 )
                {
                cin >> c;
                b=c;
                }
                */
        return a / b;
    }
}
int main()
{
    int x, liczba, wynik;
    do
    {
        cout << "Podaj dwie liczby miedzy ktorymi chcesz wykonac dzialanie: " << endl;
        cout << "pierwsza : " << endl;
        int a = wprowadz();
        cout << "A teraz druga: " << endl;
        float b = wprowadz2();
        /* MENU */
        cout << "Napisz jakie dzialanie chcesz wykonac :" << endl;
        cout << " 1.-Dodawanie." << endl;
        cout << " 2.-Odejmowanie." << endl;
        cout << " 3.-Mnozenie." << endl;
        cout << " 4.-Dzielenie." << endl;
        cout << " 5.-Potegowanie." << endl;
        cout << " 6.-Pierwiastkowanie." << endl;
        cout << " 7.- Wyjscie z progrmu." << endl;
        cin >> liczba;
        switch( liczba )
        {
        case 1:
            dodawanie( a, b );
            wynik = dodawanie( a, b );
            cout << " Oto wynik dodawania: " << wynik << endl;
            break;
        case 2:
            odejmowanie( a, b );
            wynik = odejmowanie( a, b );
            cout << " Oto wynik odejmowania: " << wynik << endl;
            break;
        case 3:
            mnozenie;
            wynik = mnozenie( a, b );
            cout << " oto wynik mnozenia: " << wynik << endl;
            break;
        case 4:
            dzielenie( a, b );
            wynik = dzielenie( a, b );
            cout << " oto wynik: " << wynik << endl;
            break;
        case 5:
            wynik = pow( a, b );
            cout << " oto wynik: " << wynik << endl;
            break;
        case 6:
            wynik = pow( a,( 1 / b ) );
            cout << " oto wynik: " << wynik << endl;
            break;
        case 7:
            x = 1;
            break;
        default:
            cout << "zly operator !!" << endl;
            break;
        }
    }
    while( x != 1 );
   
    return 0;
}
P-33780
malan
» 2011-06-02 20:35:48
#Błąd1:
C/C++
dzielenie( a, b );
wynik = dzielenie( a, b );
cout << " oto wynik: " << wynik << endl;
Podpowiem jeszcze, że przy opcji 1, 2 i 4 masz ten sam błąd.

#Błąd2: Chodzi Ci o to, że wynikiem jest liczba całkowita? Jeżeli tak, to wystarczy zmienić tym pewnej zmiennej.
P-33785
jaupl
Temat założony przez niniejszego użytkownika
» 2011-06-02 22:32:07
Fakt ;) od razu lepiej. Ehh ... chyba muszę się bardziej przykładać i być bardziej spostrzegawczy :D
P-33788
absflg
» 2011-06-03 06:56:49
Nie kontrolujesz przekazania do funkcji
pow()
. Pamiętaj, że
pow( 0, 0 )
 nie ma prawa się wykonać. To samo z
pow( a,( 1 / b ) )
 gdy
b
 to zero (dzielenie przez zero).

Poza tym widzę tu też kilka dziwnych rzeczy, które nie zaburzają pracy programu:

C/C++
int wprowadz()
{
    int a;
    cin >> a;
    return a;
}
int wprowadz2()
{
    int b;
    cin >> b;
    return b;
}
Dwie identyczne funkcje!

Zmienna
x
 jest niepotrzebna. Przecież to, że program ma być zamknięty nie jest tracone. Wystarczy, że w
case 7:
 zostawisz samo
break;
, a na końcu zamiast
x != 1
 skontrolujesz
liczba != 7
.

Osobliwe jest też to, że zmienna
b
 jest typu float mimo, że przyjmuje wartości zwrócone przez funkcję zwracającą int.
P-33790
jaupl
Temat założony przez niniejszego użytkownika
» 2011-06-14 23:05:45
Usunąłem niektóre błędy wymienione przez ciebie ;) Ale co do przedostatniego ... to choćbym chciał, nie mogę się zgodzić. To był akurat zabieg celowy mający na celu umożliwienie wykonania więcej niż jednego działania (dania użytkownikowi możliwości decydowania kiedy kalkulator ma zakończyć prace)
C/C++
#include <iostream>
#include <math.h>
using namespace std;
float wprowadz()
{
    int x;
    float a;
    do
    {
        cin >> a;
        x = cin.fail();
        if( x != 0 )
        {
            cin.clear();
            cin.sync();
        }
        else;
       
    }
    while( x != 0 );
   
    return a;
}
float dodawanie( float a, float b )
{
    return a + b;
}
float odejmowanie( float a, float b )
{
    return a - b;
}
float mnozenie( float a, float b )
{
    return a * b;
}
float dzielenie( float a, float b )
{
    if( b != 0 )
         return a / b;
    else
    {
        cout << " NIE MOZNA DZIELIC PRZEZ ZERO !! Podaj inny mianownik :" << endl;
        float c;
        do
        {
            cin >> c;
            b = c;
        }
        while( b == 0 );
       
        return a / b;
    }
}
int main()
{
    float wynik;
    int x, liczba;
    do
    {
        cout << "Podaj dwie liczby miedzy ktorymi chcesz wykonac dzialanie: " << endl;
        cout << "pierwsza : " << endl;
        float a = wprowadz();
        cout << "A teraz druga: " << endl;
        float b = wprowadz();
        /* MENU */
        cout << "Napisz jakie dzialanie chcesz wykonac :" << endl;
        cout << " 1.-Dodawanie." << endl;
        cout << " 2.-Odejmowanie." << endl;
        cout << " 3.-Mnozenie." << endl;
        cout << " 4.-Dzielenie." << endl;
        cout << " 5.-Potegowanie." << endl;
        cout << " 6.-Pierwiastkowanie." << endl;
        cout << " 7.- Wyjscie z progrmu." << endl;
        liczba = wprowadz();
        switch( liczba )
        {
        case 1:
            wynik = dodawanie( a, b );
            cout << " Oto wynik dodawania: " << wynik << endl;
            break;
        case 2:
            wynik = odejmowanie( a, b );
            cout << " Oto wynik odejmowania: " << wynik << endl;
            break;
        case 3:
            wynik = mnozenie( a, b );
            cout << " oto wynik mnozenia: " << wynik << endl;
            break;
        case 4:
            wynik = dzielenie( a, b );
            cout << " oto wynik: " << wynik << endl;
            break;
        case 5:
            wynik = pow( a, b );
            cout << " oto wynik: " << wynik << endl;
            break;
        case 6:
            while( b == 0 )
            {
                b = wprowadz();
            }
            wynik = pow( a,( 1 / b ) );
            cout << " oto wynik: " << wynik << endl;
            break;
        case 7:
            x = 1;
            break;
        default:
            cout << "zly operator !!" << endl;
            break;
        }
    }
    while( x != 1 );
   
    return 0;
}
Po namyśle, podajesz inny sposób rozwiązania ... mój po prostu wydawał mi się bardziej oczywisty i łatwy ;p Dzięki za pomoc :)
P-34156
« 1 »
  Strona 1 z 1