niedziela, 17 lipca 2016

C++ - Podstawowy kalkulator

W tym poście chciałbym przedstawić krótki projekt kalkulatora przygotowanego w C++. Projekt będzie obsługiwany za pomocą okna konsoli.

Jego działanie będzie się opierało na wykonywaniu operacji na dwóch liczbach.

Będzie on posiadał następujące funkcje:

  • dodawanie
  • mnożenie
  • dzielenie
  • pierwiastkowanie
  • potęgowanie
  • silnia
  • dodawanie oraz odejmowanie liczb w systemie dwójkowym


Poniżej wklejam kod z objaśnieniem:

Deklaracje funkcji oraz biblioteki jakie zostały dołączone są następujące:

  1. #include <iostream>
  2. #include <math.h>
  3. #include <windows.h>
  4. #include <cstdlib>
  5.  
  6. using namespace std;
  7.  
  8. //Czesc informacyjna dla uzytkownika
  9. void MenuGlowne();
  10.  
  11. //instrukcja przechodzaca pomiedzy wszystkimi wywolaniami
  12. void PetlaGlowna(floatfloatchar);
  13.  
  14. //Zamiana liczby z dziesietnej na binarna
  15. void ZamianaNaBinarna(int wynik);
  16.  
  17. //Dodawanie
  18. void Dodaj(float liczba1, float liczba2);
  19.  
  20. //Dodawanie binarne
  21. void DodawanieBinarne(float liczba1, float liczba2);
  22.  
  23. //OdejmowanieBinarne
  24. void OdejmowanieBinarne(float liczba1, float liczba2);
  25.  
  26. //Odejmowanie
  27. void Odejmij(float liczba1, float liczba2);
  28.  
  29. //Mnozenie
  30. void Mnozenie(float liczba1, float liczba2);
  31.  
  32. //Dzielenie
  33. void Dzielenie(float liczba1, float liczba2);
  34.  
  35. //Silnia
  36. void Silnia(float liczba1);
  37.  
  38. //Potega
  39. void Potega(float liczba1, float liczba2);
  40.  
  41. //Pierwiastek
  42. void Pierwiastek(float liczba1);

Następnie poszczególne funkcje dokonujące obliczeń oraz wyświetlenia danych

  1. void MenuGlowne()
  2. {
  3.     SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), FOREGROUND_BLUE | FOREGROUND_INTENSITY );
  4.     cout << "Prosty kalkulator" << endl;
  5.  
  6.     SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), FOREGROUND_GREEN | FOREGROUND_INTENSITY );
  7.     cout << "Operacje:" << endl;
  8.     cout << "Dodawanie - '+'" << endl;
  9.     cout << "Dodawanie binarne - 'b'" << endl;
  10.     cout << "Odejmowanie binarne - 'o'" << endl;
  11.     cout << "Odejmowanie - '-'" << endl;
  12.     cout << "Mnozenie - '*'" << endl;
  13.     cout << "Dzielenie - '/'" << endl;
  14.     cout << "Potegowanie - '^'" << endl;
  15.     cout << "Pierwiastkowanie - 's'" << endl;
  16.     cout << "Silnia - '!'" << endl;
  17.     cout << "Wyjscie - 'w'" << endl;
  18. }
  19.  
  20. void PetlaGlowna(float liczba1, float liczba2, char znak)
  21. {
  22.         switch(znak)
  23.         {
  24.         //Dodawanie
  25.         case '+':
  26.             {
  27.                 Dodaj(liczba1, liczba2);
  28.                 SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), FOREGROUND_GREEN | FOREGROUND_INTENSITY );
  29.                 cout << "------------------------------" << endl;
  30.                 break;
  31.             }
  32.         //Dodawanie binarne
  33.         case 'b':
  34.             {
  35.                 DodawanieBinarne(liczba1, liczba2);
  36.                 SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), FOREGROUND_GREEN | FOREGROUND_INTENSITY );
  37.                 cout << "------------------------------" << endl;
  38.                 break;
  39.             }
  40.         //OdejmowanieBinarne
  41.         case 'o':
  42.             {
  43.                 OdejmowanieBinarne(liczba1, liczba2);
  44.                 SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), FOREGROUND_GREEN | FOREGROUND_INTENSITY );
  45.                 cout << "------------------------------" << endl;
  46.                 break;
  47.             }
  48.         //Odejmowanie
  49.         case '-':
  50.             {
  51.                 Odejmij(liczba1, liczba2);
  52.                 SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), FOREGROUND_GREEN | FOREGROUND_INTENSITY );
  53.                 cout << "------------------------------" << endl;
  54.                 break;
  55.             }
  56.         //Mnozenie
  57.             case '*':
  58.             {
  59.                 Mnozenie(liczba1, liczba2);
  60.                 SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), FOREGROUND_GREEN | FOREGROUND_INTENSITY );
  61.                 cout << "------------------------------" << endl;
  62.                 break;
  63.             }
  64.         //Dzielenie
  65.             case '/':
  66.             {
  67.                 Dzielenie(liczba1, liczba2);
  68.                 SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), FOREGROUND_GREEN | FOREGROUND_INTENSITY );
  69.                 cout << "------------------------------" << endl;
  70.                 break;
  71.             }
  72.         //Potegowanie
  73.         case '^':
  74.             {
  75.                 Potega(liczba1, liczba2);
  76.                 SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), FOREGROUND_GREEN | FOREGROUND_INTENSITY );
  77.                 cout << "------------------------------" << endl;
  78.                 break;
  79.             }
  80.         //Pierwiastek
  81.         case 's':
  82.             {
  83.                 Pierwiastek(liczba1);
  84.                 SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), FOREGROUND_GREEN | FOREGROUND_INTENSITY );
  85.                 cout << "------------------------------" << endl;
  86.                 break;
  87.             }
  88.         //Silnia
  89.         case '!':
  90.             {
  91.                 Silnia(liczba1);
  92.                 SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), FOREGROUND_GREEN | FOREGROUND_INTENSITY );
  93.                 cout << "------------------------------" << endl;
  94.                 break;
  95.             }
  96.         case 'w':
  97.             {
  98.                 cout << "------------------------------" << endl;
  99.                 break;
  100.             }
  101.         default:
  102.             {
  103.                 cout << "Podano zly znak" << endl;
  104.                 break;
  105.             }
  106.         }
  107. }
  108.  
  109. //Zamiana liczby z dziesietnej na binarna
  110. void ZamianaNaBinarna(int wynik)
  111. {
  112.     int i=0;
  113.     int tab[31];
  114.  
  115.     //Bedzie wykonywane do momentu gdy libcza = 0
  116.     while(wynik)
  117.     {
  118.         tab[i++]=wynik%2;
  119.         wynik/=2;
  120.     }
  121.  
  122.     for(int j=i-1;j>=0;j--)
  123.     {
  124.         cout<<tab[j];
  125.     }
  126.  
  127.     cout << endl;
  128. }
  129.  
  130. //Dodawanie
  131. void Dodaj(float liczba1, float liczba2)
  132. {
  133.     float wynik;
  134.  
  135.     wynik = liczba1 + liczba2;
  136.  
  137.     cout << liczba1 << " + " << liczba2 << " = " <<wynik << endl;
  138.  
  139. }
  140.  
  141. //Dodawanie binarne
  142. void DodawanieBinarne(float liczba1, float liczba2)
  143. {
  144.     int wynik;
  145.  
  146.     wynik = int(liczba1 + liczba2);
  147.  
  148.     cout << "Dziesietnie: " << wynik << endl;
  149.  
  150.     ZamianaNaBinarna(wynik);
  151. }
  152.  
  153. //OdejmowanieBinarne
  154. void OdejmowanieBinarne(float liczba1, float liczba2)
  155. {
  156.     int wynik;
  157.  
  158.     wynik = int(liczba1 - liczba2);
  159.  
  160.     cout << "Dziesietnie: " << wynik << endl;
  161.  
  162.     ZamianaNaBinarna(wynik);
  163. }
  164.  
  165.  
  166. //Odejmowanie
  167. void Odejmij(float liczba1, float liczba2)
  168. {
  169.     float wynik;
  170.  
  171.     wynik = liczba1 - liczba2;
  172.  
  173.     cout << liczba1 << " - " << liczba2 << " = " <<wynik << endl;
  174. }
  175.  
  176. //Mnozenie
  177. void Mnozenie(float liczba1, float liczba2)
  178. {
  179.     float wynik;
  180.  
  181.     wynik = liczba1 * liczba2;
  182.  
  183.     cout << liczba1 << " * " << liczba2 << " = " <<wynik << endl;
  184. }
  185.  
  186. //Dzielenie
  187. void Dzielenie(float liczba1, float liczba2)
  188. {
  189.     float wynik;
  190.  
  191.     wynik = liczba1/liczba2;
  192.  
  193.     cout << liczba1 << " / " << liczba2 << " = " <<wynik << endl;
  194. }
  195.  
  196. //Silnia
  197. void Silnia(float liczba1)
  198. {
  199.     long long silnia = 1;
  200.  
  201.     for(int i=(int)liczba1;i>1;i--)
  202.     {
  203.         silnia*=(long long)i; //lub silnia = silnia * i
  204.     }
  205.  
  206.     cout << (int)liczba1 << " ! " << "= " << silnia << endl;
  207. }
  208.  
  209. //Potega
  210. void Potega(float liczba1, float liczba2)
  211. {
  212.     float wynik;
  213.  
  214.     wynik = pow(liczba1, liczba2);
  215.  
  216.     cout << liczba1 << " ^ " << liczba2 << " = " <<wynik << endl;
  217. }
  218.  
  219. //Pierwiastek
  220. void Pierwiastek(float liczba1)
  221. {
  222.     float wynik;
  223.  
  224.     wynik = sqrt(liczba1);
  225.  
  226.     cout <<"sqrt( " << liczba1 << " ) = " <<wynik << endl;
  227. }

Główna funkcja main() programu:

  1. int main()
  2. {
  3.     float liczba1 = 0;
  4.     float liczba2 = 0;
  5.     char znak;
  6.  
  7.     MenuGlowne();
  8.  
  9.     while(znak != 'w')
  10.     {
  11.         SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), FOREGROUND_RED | FOREGROUND_INTENSITY );
  12.  
  13.         cin >> liczba1;
  14.         cin >> znak;
  15.  
  16.         if(znak == '!' || znak == 's' || znak == 'w')
  17.         {}
  18.         else
  19.         {
  20.             cin >> liczba2;
  21.         }
  22.  
  23.         PetlaGlowna(liczba1, liczba2, znak);
  24.  
  25.     }
  26.  
  27.     cout << "Zakonczono dzialanie" << endl;
  28. }

Na rysunku 1 znajduje się przykładowe okno programu z przeprowadzoną operacją

Rys. 1. Okno programu