Advertisement
Guest User

Supreme Calculator

a guest
Nov 26th, 2014
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.57 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <string>
  4. #include <math.h>
  5. #include <sstream>
  6. #include <vector>
  7.  
  8. using namespace std;
  9.  
  10. void info()
  11. {
  12.     cout <<"\n======================================================"<< endl;
  13.     cout <<"Wpisz ca\210e dzia\210anie w jednej linii, u\276ywaj\245c informatycznych znak\242w dzia\210a\344\nnp.4*2 lub 45/9"<< endl;
  14.     cout <<"Gdy podajesz u\210amki dziesi\251tne, zamiast przecinka wpisuj kropk\251 np. 2.5"<< endl;
  15.     cout <<"\nDozwolone dzia\210ania:\ndodawanie\nodejmowanie\nmno\276enie\ndzielenie\npot\251gowanie\npierwiastki dowolnego stopnia\nlogarytmy"<< endl;
  16.     cout <<"funkcje trygonometryczne (warto\230\206 k\245ta podaj\nw stopniach, w ulamku dziesietnym a nie w minutach i sekundach)\ndzielenie z reszt\245"<< endl;
  17.     cout <<"\nProgram obs\210uguje tylko pojedy\344cze dzia\210ania."<< endl;
  18.     cout <<"\nDodawanie: + np. 2+2"<< endl;
  19.     cout <<"Odejmowanie: - np. 6-4"<< endl;
  20.     cout <<"Mno\276enie: * np. 6*6"<< endl;
  21.     cout <<"Dzielenie: / np. 45/9"<< endl;
  22.     cout <<"Pot\251gowanie: ^ np. 2^4 (2 do pot\251gi czwartej)"<< endl;
  23.     cout <<"Pierwiastki: rt np. 3rt9 (pierwiastek trzeciego stopnia z 9)"<< endl;
  24.     cout <<"Logarytmy: 2log4 (logarytm z 4 przy podstawie 2)"<< endl;
  25.     cout <<"Funkcje trygonometryczne: sin, cos, tan, ctg, np. sin30 (sinus z 30)"<< endl;
  26.     cout <<"Dzielenie z reszt\245: %, np. 20%9 (20 dzielone z reszt\245 na 9)"<< endl;
  27.     cout <<"\n======================================================\n"<< endl;
  28. }
  29.  
  30. string podajDzialanie()
  31. {
  32.     string dzialanie;
  33.     do
  34.     {
  35.         cout <<"Podaj dzia\210anie matematyczne."<< endl;
  36.         cout <<"Napisz info, \276eby wy\230wietli\206 pomoc."<< endl;
  37.         cout <<"Napisz clear, \276eby wyczy\230ci\206 okno."<< endl;
  38.         cout <<"Napisz exit, \276eby wyj\230\206 z programu."<< endl;
  39.         getline( cin, dzialanie);
  40.         cin.clear();
  41.         cin.sync();
  42.  
  43.         if(dzialanie == "info")
  44.         {
  45.             info();
  46.         }
  47.  
  48.         if(dzialanie == "clear")
  49.         {
  50.             system("cls");
  51.         }
  52.     }while(dzialanie == "info" || dzialanie == "clear");
  53.  
  54.     return dzialanie;
  55. }
  56.  
  57. void szukanieZnaku(string dzialanie, string znak, string & operacja, int & isGood, size_t & miejsce, int & isGoodPoz)
  58. {
  59.     int ileZnakow = 0;
  60.     bool znPozGood = false;
  61.     size_t pozycja = dzialanie.find(znak);
  62.     if(pozycja == 0 && (znak != "sin" && znak != "cos" && znak != "tan" && znak != "ctg"))
  63.     {
  64.         znPozGood = true;//bo nie moge zreturnowac tutaj bo by nie zwiekszylo zmiennej ileZnakow
  65.     }
  66.     if(pozycja == dzialanie.size() - 1 && (znak != "sin" && znak != "cos" && znak != "tan" && znak != "ctg"))
  67.     {
  68.         znPozGood = true;
  69.     }
  70.     if(isGoodPoz == 0 && pozycja != string::npos)
  71.     {
  72.         miejsce = pozycja;
  73.         isGoodPoz++;
  74.     }
  75.     if(pozycja != string::npos)
  76.     {
  77.         do
  78.         {
  79.             pozycja = dzialanie.find(znak, pozycja + znak.size());
  80.             if(pozycja != string::npos);
  81.             {
  82.                 ileZnakow++;
  83.             }
  84.         }while(pozycja != string::npos);
  85.     }
  86.  
  87.  
  88.     if(ileZnakow != 1)
  89.     {
  90.         return;
  91.     }
  92.  
  93.     if(znPozGood == true)
  94.     {
  95.         return;
  96.     }
  97.  
  98.     operacja = znak;
  99.     isGood ++;
  100. }
  101.  
  102. void szukanieZnakuMinus(string dzialanie, string znak, string & operacja, int & isGood, size_t & miejsce, int & isGoodPoz)
  103. {
  104.     vector < unsigned int > minusy;
  105.  
  106.     int ileZnakow = 0;
  107.     size_t pozycja = dzialanie.find(znak);
  108.     if(isGoodPoz == 0 && pozycja != string::npos)
  109.     {
  110.         isGoodPoz++;
  111.     }
  112.     if(pozycja != string::npos)
  113.     {
  114.         minusy.push_back(pozycja);
  115.         do
  116.         {
  117.             pozycja = dzialanie.find(znak, pozycja + znak.size());
  118.             if(pozycja != string::npos);
  119.             {
  120.                 minusy.push_back(pozycja);
  121.                 ileZnakow++;
  122.             }
  123.         }while(pozycja != string::npos);
  124.     }
  125.  
  126.     if(ileZnakow == 0 || ileZnakow > 3)
  127.     {
  128.         return;
  129.     }
  130.  
  131.     if(dzialanie[dzialanie.size() - 1] == 45)
  132.     {
  133.         return;
  134.     }
  135.  
  136.     if(minusy[0] == 0 && isGood == 0)
  137.     {
  138.         if(ileZnakow == 1)//naprawiam buga, dziffko!
  139.         {
  140.             return;
  141.         }
  142.         miejsce = minusy[1];
  143.         operacja = znak;
  144.         isGood++;
  145.     }
  146.     if(minusy[0] != 0 && isGood == 0)
  147.     {
  148.         miejsce = minusy[0];
  149.         operacja = znak;
  150.         isGood++;
  151.     }
  152. }
  153.  
  154. void rozdzielenie(string dzialanie, string element[], size_t pozycja, string operacja)
  155. {
  156.     element[0].clear();
  157.     element[1].clear();//czyszczenie, potrzebne w razie gdy wywali error przy sprawdzaniu czy to liczba, zeby nie bylo pozostalosci z wczesniejszej petli
  158.     element[0].insert(0, dzialanie);
  159.     element[1].insert(0, dzialanie);
  160.     element[0].erase(pozycja);
  161.     element[1].erase(0, element[0].size() + operacja.size());
  162. }
  163.  
  164. bool sprawdzenieCzyLiczba(string tekst)
  165. {
  166.     int ilekropek = 0;
  167.  
  168.     for(unsigned int a = 0; a < tekst.size(); a++)
  169.     {
  170.         if(tekst[a] == 45 && a != 0)
  171.         {
  172.             return false;
  173.         }
  174.         if(tekst[a] == 46)
  175.         {
  176.             ilekropek++;
  177.         }
  178.         if(tekst[a] == 46 && a == 0)
  179.         {
  180.             return false;
  181.         }
  182.         if(tekst[a] == 46 && a > 0)
  183.         {
  184.             if(tekst[a - 1] < 48 || tekst[a - 1] > 57)
  185.             {
  186.                 return false;
  187.             }
  188.         }
  189.         if((tekst[a] < 48 || tekst[a] > 57) && tekst[a] != 45 && tekst[a] != 46)
  190.         {
  191.             return false;
  192.         }
  193.     }
  194.  
  195.     if(ilekropek > 1)
  196.     {
  197.         return false;
  198.     }
  199.  
  200.     return true;
  201. }
  202.  
  203. float konwersja(string strLiczba)
  204. {
  205.     stringstream ss;
  206.     float liczba;
  207.     ss << strLiczba;
  208.     ss >> liczba;
  209.     return liczba;
  210. }
  211.  
  212. void trygonometria(float wartoscKata, string operacja)
  213. {
  214.     wartoscKata = wartoscKata * M_PI/180;//zamiana stopni na radiany, bo komputer liczy funkcje trygonometryczne w radianach
  215.  
  216.     if(operacja == "sin")
  217.     {
  218.         wartoscKata = sin(wartoscKata);
  219.     }
  220.     if(operacja == "cos")
  221.     {
  222.         wartoscKata = cos(wartoscKata);
  223.     }
  224.     if(operacja == "tan")
  225.     {
  226.         wartoscKata = tan(wartoscKata);
  227.     }
  228.     if(operacja == "ctg")
  229.     {
  230.         wartoscKata = 1/tan(wartoscKata);
  231.     }
  232.  
  233.     cout << "Wynik: " << wartoscKata << endl;
  234. }
  235.  
  236. void pierwiastkiLiczbUjemnych(float liczba[])
  237. {
  238.     int intliczba[2];
  239.     for(int a = 0; a < 2; a++)
  240.     {
  241.         intliczba[a] = liczba[a];
  242.     }
  243.  
  244.     if(intliczba[0] % 2 == 0)
  245.     {
  246.         cout <<"Taki pierwiastek nie istnieje."<< endl;
  247.     }
  248.     else
  249.     {
  250.         cout <<"Wynik: " << -(pow(-(liczba[1]), (1 / liczba[0]))) << endl;
  251.     }
  252. }
  253.  
  254. void dzialania(float liczba[], string operacja)
  255. {
  256.     if(operacja == "+")
  257.     {
  258.         cout << "Wynik: "<< liczba[0] + liczba[1] << endl;
  259.     }
  260.     if(operacja == "-")
  261.     {
  262.         cout << "Wynik: "<< liczba[0] - liczba[1] << endl;
  263.     }
  264.     if(operacja == "*")
  265.     {
  266.         cout << "Wynik: "<< liczba[0] * liczba[1] << endl;
  267.     }
  268.     if(operacja == "/")
  269.     {
  270.         if(liczba[1] == 0)
  271.         {
  272.             cout <<"Pami\251taj cholero, nie dziel przez zero!"<< endl;
  273.         }
  274.         else
  275.         {
  276.             cout <<"Wynik: "<< liczba[0] / liczba[1] << endl;
  277.         }
  278.     }
  279.     if(operacja == "^")
  280.     {
  281.         cout <<"Wynik: " << pow(liczba[0], liczba[1]) << endl;
  282.     }
  283.     if(operacja == "rt")
  284.     {
  285.         if(liczba[0] == 0)
  286.         {
  287.             cout <<"Nie ma pierwiastk\242w zerowego stopnia!"<< endl;
  288.             return;
  289.         }
  290.  
  291.         if(liczba[1] < 0)
  292.         {
  293.             pierwiastkiLiczbUjemnych(liczba);
  294.             return;
  295.         }
  296.  
  297.         cout <<"Wynik: " << pow(liczba[1], (1 / liczba[0])) << endl;
  298.     }
  299.     if(operacja == "log")
  300.     {
  301.         cout <<"Wynik: " << log(liczba[1])/log(liczba[0]) << endl;
  302.     }
  303.     if(operacja == "sin")
  304.     {
  305.         trygonometria(liczba[1], operacja);
  306.     }
  307.     if(operacja == "cos")
  308.     {
  309.         trygonometria(liczba[1], operacja);
  310.     }
  311.     if(operacja == "tan")
  312.     {
  313.         trygonometria(liczba[1], operacja);
  314.     }
  315.     if(operacja == "ctg")
  316.     {
  317.         trygonometria(liczba[1], operacja);
  318.     }
  319.     if(operacja == "%")
  320.     {
  321.         if(liczba[1] == 0)
  322.         {
  323.             cout <<"Pami\251taj cholero, nie dziel przez zero!"<< endl;
  324.         }
  325.         else
  326.         {
  327.             int intliczba[2];
  328.             for(int a = 0; a < 2; a++)
  329.             {
  330.                 intliczba[a] = liczba[a];
  331.             }
  332.             cout <<"Wynik: " << intliczba[0] / intliczba[1] << " r " << intliczba[0] % intliczba[1] << endl;
  333.         }
  334.     }
  335. }
  336.  
  337. int main()
  338. {
  339.     do
  340.     {
  341.         bool sprCzyLiczbaGood;
  342.         string operacja;
  343.         string element[2];//to piszemy przed petla do...while zeby wszystko dzialalo
  344.         size_t pozycja;
  345.         string dzialanie;
  346.         do
  347.         {
  348.             do
  349.             {
  350.                 operacja = "BRAK";
  351.                 dzialanie = podajDzialanie();
  352.                 if(dzialanie == "exit")
  353.                 {
  354.                     return 0;
  355.                 }
  356.  
  357.                 int isGood = 0;
  358.                 int isGoodPoz = 0;
  359.  
  360.                 szukanieZnaku(dzialanie, "+", operacja, isGood, pozycja, isGoodPoz);
  361.                 szukanieZnaku(dzialanie, "*", operacja, isGood, pozycja, isGoodPoz);
  362.                 szukanieZnaku(dzialanie, "/", operacja, isGood, pozycja, isGoodPoz);
  363.                 szukanieZnaku(dzialanie, "^", operacja, isGood, pozycja, isGoodPoz);
  364.                 szukanieZnaku(dzialanie, "rt", operacja, isGood, pozycja, isGoodPoz);
  365.                 szukanieZnaku(dzialanie, "log", operacja, isGood, pozycja, isGoodPoz);
  366.                 szukanieZnaku(dzialanie, "sin", operacja, isGood, pozycja, isGoodPoz);
  367.                 szukanieZnaku(dzialanie, "cos", operacja, isGood, pozycja, isGoodPoz);
  368.                 szukanieZnaku(dzialanie, "tan", operacja, isGood, pozycja, isGoodPoz);
  369.                 szukanieZnaku(dzialanie, "ctg", operacja, isGood, pozycja, isGoodPoz);
  370.                 szukanieZnaku(dzialanie, "%", operacja, isGood, pozycja, isGoodPoz);
  371.                 szukanieZnakuMinus(dzialanie, "-", operacja, isGood, pozycja, isGoodPoz);
  372.                 if(isGood != 1)
  373.                 {
  374.                     operacja = "BRAK";
  375.                 }
  376.  
  377.                 if(operacja == "BRAK")
  378.                 {
  379.                     cout <<"ERROR! Nieprawid\210owe dane. Wprowad\253 prawid\210owe.\n"<< endl;
  380.                 }
  381.             }while(operacja == "BRAK");
  382.  
  383.             rozdzielenie(dzialanie, element, pozycja, operacja);
  384.  
  385.             for(int a = 0; a < 2; a++)
  386.             {
  387.                 sprCzyLiczbaGood = sprawdzenieCzyLiczba(element[a]);
  388.                 if(sprCzyLiczbaGood == false)
  389.                 {
  390.                     cout <<"ERROR! Nieprawid\210owe dane. Wprowad\253 prawid\210owe.\n"<< endl;
  391.                     break;//to break jest po to, ze jak pierwsza liczba jest zla a druga dobra, to zeby potem wartosc true przy drugiej liczbie nie nadpisala tej pierwszej
  392.                 }
  393.             }
  394.         }while(sprCzyLiczbaGood == false);
  395.  
  396.         float liczba[2];
  397.  
  398.         for(int a = 0; a < 2; a++)
  399.         {
  400.             liczba[a] = konwersja(element[a]);
  401.         }
  402.  
  403.         dzialania(liczba, operacja);
  404.         cout <<""<<endl;
  405.     }while(0==0);//petla nieskonczona, bitch!
  406.  
  407.     //TO DO:
  408.     //no i w ogole sprawdzic wszystkie dzialania jakie wyniki daje gdy jedna z liczb jest 0 - sa to logarytmy, obczaic to!
  409.     //cos z 90 jest chujowy i w ogole sprawdzic to
  410.  
  411.     return 0;
  412. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement