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 |