marcinpro Temat założony przez niniejszego użytkownika |
Lekcja 17 - Kalkulator z wczytywaniem liczb i operatora. » 2017-11-04 12:13:38 Witam, Sprawdziłby ktoś czy ten kal spełnia wytyczne i na co zwrócić uwagę, że lepiej pisać prog. #include <iostream>
using namespace std;
int wczytajliczbe() { int a; bool spr; do { cin >> a; spr = cin.good(); if( spr == 0 ) cout << "Podales bledna liczbe! Podaj poprawna:"; cin.clear(); cin.sync(); } while( spr == 0 ); return a; }
int sproperatora() { int a; bool spr; cout << "Wybierz opcje: "; do { cin >> a; if( a > 0 && a < 7 ) { spr = true; cout << "Wybrales: "; } else { cout << "Podales bledny operator! Podaj jeszcze raz:"; spr = false; cin.clear(); cin.sync(); } } while( spr != true ); return a; }
int main()
{ int a, b, c; do { cout << " Kalkulator by Ziolo" << endl; cout << " [1] Dodawanie" << endl; cout << " [2] Odejmowanie" << endl; cout << " [3] Mnozenie" << endl; cout << " [4] Dzielenie" << endl; cout << " [5] Reszta z dzielenia" << endl; cout << " [6] Rezygnuj" << endl; c = sproperatora(); cout << endl; switch( c ) { case 1: cout << " [1] Dodawanie" << endl; cout << "Podaj liczbe a:"; a = wczytajliczbe(); cout << "Podaj liczbe b:"; b = wczytajliczbe(); cout << "Wynik = " << a + b << endl; break; case 2: cout << " [2] Odejmowanie" << endl; cout << "Podaj liczbe a:"; a = wczytajliczbe(); cout << "Podaj liczbe b:"; b = wczytajliczbe(); cout << "Wynik = " << a - b << endl; break; case 3: cout << " [3] Mnozenie" << endl; do { cout << "Podaj liczbe a:"; a = wczytajliczbe(); cout << "Podaj liczbe b:"; b = wczytajliczbe(); if( a != 0 && b != 0 ) cout << "Wynik = " << a * b << endl; else { cout << "Jak mnozysz przez zero glabie to masz zero!" << endl; cout << "Podaj dobre!" << endl; } } while( a == 0 || b == 0 ); break; case 4: cout << " [4] Dzielenie" << endl; do { cout << "Podaj liczbe a:"; a = wczytajliczbe(); cout << "Podaj liczbe b:"; b = wczytajliczbe(); if( b != 0 ) cout << "Wynik = " << a / b << endl; else { cout << "Nie dizelimy przez zero!" << endl; cout << "Wroc sie do podstawowki!" << endl; } } while( b == 0 ); break; case 5: cout << " [5] Reszta z dzielenia" << endl; do { cout << "Podaj liczbe a:"; a = wczytajliczbe(); cout << "Podaj liczbe b:"; b = wczytajliczbe(); if( b != 0 ) cout << "Wynik = " << a % b << endl; else { cout << "Nie dizelimy przez zero!" << endl; cout << "Wroc sie do podstawowki!" << endl; } } while( b == 0 ); break; } } while( c != 6 ); return 0; }
|
|
YooSy |
» 2017-11-04 14:47:14 zamienić na std::cin.ignore() . Podzielić kod na funkcje. Są powtarzające się fragmenty. Pobieranie liczb może być w jednym miejscu. Przed wykonaniem się instrukcji switch . |
|
marcinpro Temat założony przez niniejszego użytkownika |
» 2017-11-04 18:01:56 Z tym cin'em to też stosować na windowsie cin.ignore() ? Sugerujesz, żeby najpierw wczytywać liczby, a dopiero potem wybierać co z nimi będziemy robić. Zastanawiam się gdzie jeszcze dodałbyś funkcje? Pewnie tam gdzie nie można użyć zero? Pozdrawiam |
|
YooSy |
» 2017-11-04 18:59:41 Metoda ignore() służy do odrzucania danych z bufora strumienia wejściowego, natomiast działaniem ubocznym metody sync() jest oczyszczanie i zależy od implementacji. Można zrobić to w dokładnie tej samej kolejności, jak jest teraz. c = sproperatora(); a = wczytajliczbe(); b = wczytajliczbe();
switch( c )
W instrukcji switch wywołujesz tylko odpowiednie funkcje. Napisałbym dla każdej operacji osobną funkcję lub napisał jedną, która przyjmie jako w argumentach operandy oraz znak działania, choć ta pierwsza opcja wydaje się czytelniejsza i łatwiejsza w utrzymaniu. |
|
marcinpro Temat założony przez niniejszego użytkownika |
» 2017-11-04 21:03:48 Ok, zrobiłem fukcje na każde działanie: #include <iostream>
using namespace std;
int wczytajliczbe() { int a; bool spr; do { cin >> a; spr = cin.good(); if( spr == 0 ) { cout << "Podales bledna liczbe! Podaj poprawna:"; cin.clear(); cin.ignore(); } } while( spr == 0 ); return a; }
int sproperatora() { char a; bool spr; cout << "Wybierz opcje: "; do { cin >> a; if( a == '+' || a == '-' || a == '*' || a == '/' || a == '%' || a == 'X' ) { spr = true; } else { cout << "Podales bledny operator! Podaj jeszcze raz:"; spr = false; cin.clear(); cin.ignore(); } } while( spr != true ); return a; }
int dodawanie( int a, int b ) { int wynik; wynik = a + b; return wynik; } int odejmowanie( int a, int b ) { int wynik; wynik = a + b; return wynik; } int mnozenie( int a, int b ) { int wynik; wynik = a * b; return wynik; }
int dzielenie( int a, int b ) { int wynik; wynik = a / b; return wynik; }
int reszta( int a, int b ) { int wynik; wynik = a % b; return wynik; }
int main()
{ int a, b, wynik; char c; do { cout << " Kalkulator by Ziolo" << endl; cout << " [+] Dodawanie" << endl; cout << " [-] Odejmowanie" << endl; cout << " [*] Mnozenie" << endl; cout << " [/] Dzielenie" << endl; cout << " [%] Reszta z dzielenia" << endl; cout << " [X] Rezygnuj" << endl; c = sproperatora(); cout << endl; cout << "Podaj liczbe a:"; a = wczytajliczbe(); cout << "Podaj liczbe b:"; b = wczytajliczbe(); switch( c ) { case '+': wynik = dodawanie( a, b ); cout << " [+] Dodawanie" << endl; cout << "Wynik = " << wynik << endl; break; case '-': wynik = odejmowanie( a, b ); cout << " [-] Odejmowanie" << endl; cout << "Wynik = " << wynik << endl; break; case '*': wynik = mnozenie( a, b ); cout << " [*] Mnozenie" << endl; cout << "Wynik = " << wynik << endl; break; case '/': wynik = dzielenie( a, b ); cout << " [/] Dzielenie" << endl; cout << "Wynik = " << wynik << endl; break; case '%': wynik = reszta( a, b ); cout << " [%] Reszta z dzielenia" << endl; cout << "Wynik = " << wynik << endl; } } while( c != 'X' ); return 0; } Zastanowię się jutro jak rozwiązać problem z dzieleniem i resztą przez 0 i jak pominąć problem zamykania programu, żęby bez sensu licznie podawać. OK to jeszcze dzisiaj zrobiłem if( c != 'X' ) { cout << "Podaj liczbe a:"; a = wczytajliczbe(); cout << "Podaj liczbe b:"; b = wczytajliczbe(); }
|
|
YooSy |
» 2017-11-04 21:15:30 Kilka podpowiedzi, jak to skrócić: int dodawanie( int a, int b ) { return a + b; }
case '+': cout << " [+] Dodawanie" << endl; cout << "Wynik = " << dodawanie( a, b ) << endl;
rozwiązać problem z dzieleniem i resztą |
Musisz zmienić zwracany typ, oraz typy operandów przekazywanych do funkcji na typ zmiennoprzecinkowy. Wystarczy w funkcji sprawdzić ifem czy b jest równe 0 i wypisać stosowny komunikat oraz zwrócić 0. |
|
marcinpro Temat założony przez niniejszego użytkownika |
» 2017-11-05 09:20:26 Ok, bo chciałem zrobić coś na zasadzie, żeby jak poda zero to mógł się poprawić. Poprawiłem kod i zmieniłem typy zmmiennych, ale teraz nie wiem jak zrobić resztę z dzielenia na zmienno przecinkowych :D #include <iostream>
using namespace std;
float wczytajliczbe() { float a; bool spr; do { cin >> a; spr = cin.good(); if( spr == false ) { cout << "Podales bledna liczbe! Podaj poprawna:"; cin.clear(); cin.ignore(); } } while( spr == false ); return a; }
int sproperatora() { char a; bool spr; cout << "Wybierz opcje: "; do { cin >> a; if( a == '+' || a == '-' || a == '*' || a == '/' || a == '%' || a == 'X' || a == 'x' ) { spr = true; } else { cout << "Podales bledny operator! Podaj jeszcze raz:"; spr = false; cin.clear(); cin.ignore(); } } while( spr != true ); 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 0; } else { return a / b; } }
float reszta( float a, float b ) { if( b == 0 ) { return 0; } else { } return a % b; }
int main()
{ float a, b; char c; do { cout << endl; cout << " Kalkulator by Ziolo" << endl; cout << " [+] Dodawanie" << endl; cout << " [-] Odejmowanie" << endl; cout << " [*] Mnozenie" << endl; cout << " [/] Dzielenie" << endl; cout << " [%] Reszta z dzielenia" << endl; cout << " [X] Rezygnuj" << endl; c = sproperatora(); cout << endl; if( c != 'X' && c != 'x' ) { cout << "Podaj liczbe a:"; a = wczytajliczbe(); cout << "Podaj liczbe b:"; b = wczytajliczbe(); } switch( c ) { case '+': cout << " [+] Dodawanie" << endl; cout << "Wynik = " << dodawanie( a, b ) << endl; break; case '-': cout << " [-] Odejmowanie" << endl; cout << "Wynik = " << odejmowanie( a, b ) << endl; break; case '*': cout << " [*] Mnozenie" << endl; cout << "Wynik = " << mnozenie( a, b ) << endl; break; case '/': cout << " [/] Dzielenie" << endl; if( dzielenie( a, b ) == 0 ) { cout << "Nie dzielimy przez 0!" << endl; } else { cout << "Wynik = " << dzielenie( a, b ) << endl; } break; case '%': cout << " [%] Reszta z dzielenia" << endl; if( reszta( a, b ) == 0 ) { cout << "Nie dzielimy przez 0!" << endl; } else { cout << "Wynik = " << reszta( a, b ) << endl; } } } while( c != 'X' && c != 'x' ); return 0; }
|
|
YooSy |
» 2017-11-05 09:56:23 teraz nie wiem jak zrobić resztę z dzielenia na zmienno przecinkowych |
Mój błąd. Słabo wyszło z tym tłumaczeniem. Mam na myśli działanie przedstawione w kodzie poniżej. #include <iostream>
int addition( int lhs, int rhs ) { return lhs + rhs; }
double division( double lhs, double rhs ) { if( rhs ) { return lhs / rhs; } return 0.0; }
int modulo( int lhs, int rhs ) { return lhs % rhs; }
int main() { char oper = '%'; int a = 5; int b = 10; switch( oper ) { case '+': std::cout << addition( a, b ) << std::endl; break; case '/': std::cout << division( a, b ) << std::endl; break; case '%': std::cout << modulo( a, b ) << std::endl; default: break; } } Przy przekazaniu liczb typu int do funkcji division nastąpi niejawna konwersja na typ double . Można też jawnie rzutować wewnątrz funkcji. double division( int lhs, int rhs ) { if( rhs ) { return static_cast < double >( lhs ) / rhs; } return 0.0; } I dodatkowo reszta z dzielenia liczb zmiennoprzecinkowych fmod. |
|
« 1 » 2 |