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 : o podanie innej dwukrotnie chociaż powinien tylko raz. (pętla while i do while dają ten sam efekt) 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 ?? #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 ); 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(); 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; }
|
|
malan |
» 2011-06-02 20:35:48 #Błąd1: 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. |
|
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 |
|
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:
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. |
|
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) #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(); 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 :) |
|
« 1 » |