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

rozdział/lekcja 15, zadanie nr 2/kalkulator

Ostatnio zmodyfikowano 2022-04-06 20:45
Autor Wiadomość
jebackoze
Temat założony przez niniejszego użytkownika
rozdział/lekcja 15, zadanie nr 2/kalkulator
» 2022-04-04 16:10:23
hej,
chcialbym prosic o ocene, czy kod jest wlasciwy. czy ew cos jest niepotrzebnie zakodowane.
C/C++
#include <iostream>
#include <limits>
using namespace std;
int main()
{
   
int dzialanie;
   
float a, b;
   
float wynik = 0;
   
bool test = cin.fail();
   
do {
       
cout << "aktualny wynik: " << wynik;
       
cout << "\nwpisz liczbe:\n";
       
cin >> a;
       
test = cin.fail();
       
cout << "wybierz dzialanie:\n[1] dodawanie\n[2] odejmowanie\n[3] mnozenie\n[4] dzielenie\n[5] rezygnuj\n" << endl;
       
cin >> dzialanie;
       
cin.clear();
       
cin.ignore( numeric_limits < std::streamsize >::max(), '\n' );
       
switch( dzialanie )
       
{
       
case 1:
           
cout << "\nwpisz liczbe:\n";
           
cin >> b;
           
cout << "wynik: " << a + b << endl;
           
wynik +=( a + b );
           
break;
       
case 2:
           
cout << "\nwpisz liczbe:\n";
           
cin >> b;
           
cout << "wynik: " << a - b << endl;
           
wynik +=( a - b );
           
break;
       
case 3:
           
cout << "\nwpisz liczbe:\n";
           
cin >> b;
           
if( a * b != 0 )
           
{
               
cout << "wynik: " << a * b << endl;
               
wynik +=( a * b );
           
}
           
else
               
 dzialanie = 5;
           
           
break;
       
case 4:
           
cout << "\nwpisz liczbe:\n";
           
cin >> b;
           
if( b == 0 )
           
{
               
cout << "nie dziel przez zero jelopie. "
               
<< "Podaj liczbe rozna od zera: " << endl;
               
cin >> b;
           
}
           
cout << "wynik: " << a / b << endl;
           
wynik +=( a / b );
           
break;
       
case 5:
           
// << "koniec" <<endl;
           
break;
       
default:
           
cout << "cos chyba nie umiesz w kalkulator?" << endl;
           
break;
       
}
    }
while( dzialanie < 5 );
   
   
cout << "koniec zabawy.\n" << "koncowy wynik: " << wynik << endl;
   
return 0;
}
P-179358
pekfos
» 2022-04-04 17:24:08
Zmienna test jest zbędna, bo nie jest do niczego wykorzystywana. Według treści zadania operacje są wykonywane między aktualnym wynikiem i jedną liczbą użytkownika. Obliczenie 3*4 to operacje 0+3, 3*4. Prawie jak w zwykłym kalkulatorze, tylko nie można po prostu wpisać pierwszej liczby, a trzeba ją uzyskać jakąś operacją względem aktualnego wyniku. Zabezpieczenie przed błędnym wejściem użytkownika powinno działać jak w zadaniu nr 1, przy czym nie powinieneś pozwalać przejść dalej z błędną wartością. Kod z pierwszego zadania, z braku lepszych opcji, należałoby wkleić w każde miejsce gdzie zadanie 2 mówi o wprowadzeniu jakiejś liczby.
P-179359
jebackoze
Temat założony przez niniejszego użytkownika
» 2022-04-04 21:49:46
C/C++
#include <iostream>
#include <limits>
using namespace std;
int main()
{
   
int dzialanie;
   
cout << "pierwsza liczbe jakas trzeba podac: " << endl;
   
float b, wynik;
   
cin >> wynik;
   
bool test = cin.fail();
   
do {
       
cout << "\nwybierz dzialanie:\n[1] dodawanie\n[2] odejmowanie\n[3] mnozenie\n[4] dzielenie\n[5] rezygnuj\n" << endl;
       
cin >> dzialanie;
       
cin.clear();
       
cin.ignore( numeric_limits < std::streamsize >::max(), '\n' );
       
switch( dzialanie )
       
{
       
case 1:
           
int petla;
           
do {
               
cout << "\nwpisz liczbe:\n";
               
cin >> b;
               
test = cin.fail();
               
cin.clear();
               
cin.ignore( numeric_limits < std::streamsize >::max(), '\n' );
               
if( test == 0 )
               
{
                   
cout << "wynik: " << wynik + b << endl;
                   
wynik = wynik + b;
                   
petla = 1;
               
}
               
else
                   
 petla = 0;
               
           
} while( petla != 1 );
           
           
break;
           
return 0;
           
break;
       
case 2:
           
int petla1;
           
do {
               
cout << "\nwpisz liczbe:\n";
               
cin >> b;
               
test = cin.fail();
               
cin.clear();
               
cin.ignore( numeric_limits < std::streamsize >::max(), '\n' );
               
if( test == 0 )
               
{
                   
cout << "wynik: " << wynik - b << endl;
                   
wynik = wynik - b;
                   
petla1 = 1;
               
}
               
else
                   
 petla1 = 0;
               
           
} while( petla1 != 1 );
           
           
break;
           
return 0;
           
break;
           
       
case 3:
           
int petla2;
           
do {
               
cout << "\nwpisz liczbe:\n";
               
cin >> b;
               
test = cin.fail();
               
cin.clear();
               
cin.ignore( numeric_limits < std::streamsize >::max(), '\n' );
               
if( test == 0 )
               
{
                   
cout << "wynik: " << wynik * b << endl;
                   
wynik = wynik * b;
                   
petla2 = 1;
               
}
               
else
                   
 petla2 = 0;
               
           
} while( petla2 != 1 );
           
           
break;
           
return 0;
           
break;
           
       
case 4:
           
int petla3;
           
do {
               
cout << "\nwpisz liczbe:\n";
               
cin >> b;
               
test = cin.fail();
               
cin.clear();
               
cin.ignore( numeric_limits < std::streamsize >::max(), '\n' );
               
if( test == 0 )
               
{
                   
if( b != 0 )
                   
{
                       
cout << "wynik: " << wynik / b << endl;
                       
wynik = wynik / b;
                       
petla3 = 1;
                   
}
                   
else
                   
cout << "nie dziel przez zero jelopie. "
                       
 << "jeszcze raz sprobuj " << endl;
                   
                   
dzialanie = 4;
               
}
               
else
                   
 petla3 = 0;
               
           
} while( petla3 != 1 );
           
           
break;
           
return 0;
           
break;
           
       
case 5:
           
break;
       
default:
           
cout << "cos chyba nie umiesz w kalkulator?" << endl;
           
break;
       
}
    }
while( dzialanie < 5 );
   
   
cout << "koniec zabawy.\n" << "koncowy wynik: " << wynik << endl;
   
return 0;
   
edycja: musialem usunac poprzednia tresc tego wpisu bo za duzy balagan, czy obecnie powyzszy kod bedzie dobrym rozwiazaniem?
P-179361
pekfos
» 2022-04-05 16:57:14
Wciąż można podać błędne dane w niektórych miejscach, na przykład przy wpisywaniu pierwszej liczby. Spróbuj też skrócić kod o niepotrzebne powtórzenia. Wczytywanie liczby b wystarczy mieć w kodzie raz, tak samo wypisywanie wyniku.
P-179368
jebackoze
Temat założony przez niniejszego użytkownika
» 2022-04-05 23:00:47
troche pogrzebalem w kodzie, coraz dluzszy ten kod, ale nie do konca on chce dzialac tak jakbym chcial i tak jak powinien.
nie wiem czemu, jesli podam litere, np. po wybraniu mnozenia to on traktuje litere jak 0.
dwa, program w niektorych przypadkach po wybraniu dzialania i nastepnie wpisaniu litery zamiast liczby, nie przechodzi dalej.
prosze o jakas podpowiedz
C/C++
#include <iostream>
#include <limits>
#include <cstdlib>
using namespace std;
int main()
{
   
int dzialanie, petla0;
   
float b, wynik;
   
do
   
{
       
cout << "pierwsza liczbe jakas trzeba podac: " << endl;
       
cin >> wynik;
       
bool test0 = cin.fail();
       
if( test0 == 1 )
       
{
           
cout << "to nie liczba, sprobuj ponownie.\n" << endl;
           
cin.clear();
           
cin.ignore( numeric_limits < std::streamsize >::max(), '\n' );
       
}
       
else
           
 petla0 = 1;
       
   
} while( petla0 != 1 );
   
   
bool test1 = cin.fail();
   
do {
       
cout << "\nwybierz dzialanie:\n[1] dodawanie\n[2] odejmowanie\n[3] mnozenie\n[4] dzielenie\n[5] rezygnuj\n" << endl;
       
cin >> dzialanie;
       
cin.clear();
       
cin.ignore( numeric_limits < std::streamsize >::max(), '\n' );
       
if( dzialanie > 0 && dzialanie < 5 )
       
{
           
cout << "\nwpisz liczbe:\n";
           
cin >> b;
           
int petlax;
           
do
           
{
               
test1 = cin.fail();
               
if( test1 == 1 )
               
{
                   
cout << "to nie liczba, sprobuj ponownie.\n" << endl;
                   
cin.clear();
                   
cin.ignore( numeric_limits < std::streamsize >::max(), '\n' );
               
}
               
else
                   
 petlax = 1;
               
           
} while( petlax != 1 );
           
       
}
       
if( dzialanie == 5 )
           
 break;
       
       
switch( dzialanie )
       
{
       
case 1:
           
int petla;
           
do {
               
if( test1 == 0 )
               
{
                   
cout << "wynik: " << wynik + b << endl;
                   
wynik += b;
                   
petla = 1;
               
}
               
else
                   
 petla = 0;
               
           
} while( petla != 1 );
           
           
break;
           
return 0;
           
break;
       
case 2:
           
int petla1;
           
do {
               
if( test1 == 0 )
               
{
                   
cout << "wynik: " << wynik - b << endl;
                   
wynik -= b;
                   
petla1 = 1;
               
}
               
else
                   
 petla1 = 0;
               
           
} while( petla1 != 1 );
           
           
break;
           
return 0;
           
break;
       
case 3:
           
int petla2;
           
do {
               
if( test1 == 0 )
               
{
                   
cout << "wynik: " << wynik * b << endl;
                   
wynik *= b;
                   
petla2 = 1;
               
}
               
else
                   
 petla2 = 0;
               
           
} while( petla2 != 1 );
           
           
break;
           
return 0;
           
break;
           
       
case 4:
           
int petla3;
           
do {
               
if( test1 == 0 )
               
{
                   
if( b != 0 )
                   
{
                       
cout << "wynik: " << wynik / b << endl;
                       
wynik /= b;
                       
petla3 = 1;
                   
}
                   
else
                   
cout << "nie dziel przez zero jelopie. "
                       
 << "jeszcze raz sprobuj " << endl;
                   
                   
dzialanie = 4;
               
}
               
else
                   
 petla3 = 0;
               
           
} while( petla3 != 1 );
           
           
break;
           
return 0;
       
case 5:
           
break;
       
default:
           
cout << "cos chyba nie umiesz w kalkulator?" << endl;
           
break;
       
}
    }
while( dzialanie != 5 );
   
   
cout << "koniec zabawy.\n" << "koncowy wynik: " << wynik << endl;
   
return 0;
}

juz mam taki globus od tego
P-179374
pekfos
» 2022-04-05 23:36:28
Zamieszanie jest ze zmiennymi sterującymi pętlami. Czasami nie mają przypisanych wartości i program będzie się zachowywać w nieprzewidywalny sposób. Na przykład petla0 jest niezainicjalizowane jeśli podasz błędne dane na początku programu. W warunku pętli wystarczy wprost użyć wyniku który wcześniej odczytałeś z fail():
C/C++
bool test;
do
{
   
cout << "pierwsza liczbe jakas trzeba podac: " << endl;
   
cin >> wynik;
   
test = cin.fail();
   
if( test )
   
{
       
cout << "to nie liczba, sprobuj ponownie.\n" << endl;
       
cin.clear();
       
cin.ignore( numeric_limits < std::streamsize >::max(), '\n' );
   
}
}
while( test );
P-179375
jebackoze
Temat założony przez niniejszego użytkownika
» 2022-04-06 09:12:16
@pekfos, dziekuje ci za poswiecony czas, sprawdzanie i podpowiedzi. juz mam dosyc tej lekcji i mam nadzieje, ze teraz cos z tego bedzie.

C/C++
#include <iostream>
#include <limits>
#include <cstdlib>
using namespace std;
int main()
{
   
int dzialanie;
   
float b, wynik;
   
bool test1;
   
do
   
{
       
cout << "pierwsza liczbe jakas trzeba podac: " << endl;
       
cin >> wynik;
       
test1 = cin.fail();
       
if( test1 )
       
{
           
cout << "to ma byc liczba.\n" << endl;
           
cin.clear();
           
cin.ignore( numeric_limits < std::streamsize >::max(), '\n' );
       
}
    }
while( test1 );
   
   
do
   
{
       
cout << "\nwybierz dzialanie:\n[1] dodawanie\n[2] odejmowanie\n[3] mnozenie\n[4] dzielenie\n[5] rezygnuj\n" << endl;
       
cin >> dzialanie;
       
cin.clear();
       
cin.ignore( numeric_limits < std::streamsize >::max(), '\n' );
       
if( dzialanie > 0 && dzialanie < 5 )
       
{
           
do
           
{
               
cout << "\nwpisz liczbe:\n";
               
cin >> b;
               
test1 = cin.fail();
               
if( test1 )
               
{
                   
cout << "to nie liczba, sprobuj ponownie.\n" << endl;
                   
cin.clear();
                   
cin.ignore( numeric_limits < std::streamsize >::max(), '\n' );
               
}
            }
while( test1 );
           
       
}
       
if( dzialanie == 5 )
           
 break;
       
       
switch( dzialanie )
       
{
       
case 1:
           
do {
               
if( test1 == 0 )
               
{
                   
wynik += b;
                   
cout << "wynik: " << wynik << endl;
               
}
            }
while( test1 );
           
           
break;
           
return 0;
       
case 2:
           
do {
               
if( test1 == 0 )
               
{
                   
wynik -= b;
                   
cout << "wynik: " << wynik << endl;
               
}
            }
while( test1 );
           
           
break;
           
return 0;
       
case 3:
           
do {
               
if( test1 == 0 )
               
{
                   
wynik *= b;
                   
cout << "wynik: " << wynik << endl;
               
}
            }
while( test1 );
           
           
break;
           
return 0;
       
case 4:
           
do {
               
if( test1 == 0 )
               
{
                   
if( b != 0 )
                   
{
                       
wynik /= b;
                       
cout << "wynik: " << wynik << endl;
                   
}
                   
else
                       
 cout << "nie dziel przez zero jelopie. \njeszcze raz sprobuj." << endl;
                   
               
}
            }
while( test1 );
           
           
break;
           
return 0;
           
default:
           
cout << "cos chyba nie umiesz w kalkulator?" << endl;
           
break;
       
}
    }
while( dzialanie != 5 );
   
   
cout << "koniec zabawy.\n" << "koncowy wynik: " << wynik << endl;
   
return 0;
}


jeszcze troche pogrzebalem i odchudzilem i chyba uproscilem kod. bedzie lepszy niz ten wyzej, czy moze jakis blad zrobilem?
C/C++
#include <iostream>
#include <limits>
#include <cstdlib>
using namespace std;
int main()
{
   
int dzialanie;
   
float b, wynik;
   
bool test1;
   
do
   
{
       
cout << "pierwsza liczbe jakas trzeba podac: " << endl;
       
cin >> wynik;
       
test1 = cin.fail();
       
if( test1 )
       
{
           
cout << "to ma byc liczba.\n" << endl;
           
cin.clear();
           
cin.ignore( numeric_limits < std::streamsize >::max(), '\n' );
       
}
    }
while( test1 );
   
   
do
   
{
       
cout << "\nwybierz dzialanie:\n[1] dodawanie\n[2] odejmowanie\n[3] mnozenie\n[4] dzielenie\n[5] rezygnuj\n" << endl;
       
cin >> dzialanie;
       
cin.clear();
       
cin.ignore( numeric_limits < std::streamsize >::max(), '\n' );
       
if( dzialanie > 0 && dzialanie < 5 )
       
{
           
do
           
{
               
cout << "\nwpisz liczbe:\n";
               
cin >> b;
               
test1 = cin.fail();
               
if( test1 )
               
{
                   
cout << "to nie liczba, sprobuj ponownie.\n" << endl;
                   
cin.clear();
                   
cin.ignore( numeric_limits < std::streamsize >::max(), '\n' );
               
}
            }
while( test1 );
           
       
}
       
if( dzialanie == 5 )
           
 break;
       
       
switch( dzialanie )
       
{
       
case 1:
           
if( test1 == 0 )
           
{
               
wynik += b;
               
cout << "wynik: " << wynik << endl;
           
}
           
break;
       
case 2:
           
if( test1 == 0 )
           
{
               
wynik -= b;
               
cout << "wynik: " << wynik << endl;
           
}
           
break;
       
case 3:
           
if( test1 == 0 )
           
{
               
wynik *= b;
               
cout << "wynik: " << wynik << endl;
           
}
           
break;
       
case 4:
           
if( test1 == 0 )
           
{
               
if( b != 0 )
               
{
                   
wynik /= b;
                    ;
cout << "wynik: " << wynik << endl;
               
}
               
else
                   
 cout << "nie dziel przez zero jelopie. \nsprobuj jeszcze raz." << endl;
               
           
}
           
break;
           
return 0;
           
default:
           
cout << "cos chyba nie umiesz w kalkulator?" << endl;
           
break;
       
}
    }
while( dzialanie != 5 );
   
   
cout << "koniec zabawy.\n" << "koncowy wynik: " << wynik << endl;
   
return 0;
}
P-179376
pekfos
» 2022-04-06 19:35:08
Można odchudzić dalej. test1 == 0 jest warunkiem wyjścia z pętli, więc te późniejsze ify są zawsze spełnione. Powiedzmy że teraz kod jest zadowalający.
P-179377
« 1 » 2
  Strona 1 z 2 Następna strona