dwamiliony

Symbole2

Mar 30th, 2016
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.73 KB | None | 0 0
  1. #include <iostream>
  2. #include <cassert>
  3. #include <stdio.h>
  4. #include <cstring>
  5.  
  6. using namespace std;
  7. const int WLK=5;        //ilosc elementow zbioru typu Symbol
  8.  
  9. /***********************************************************************/
  10. /* bc - bład czytania znaku (niepoprawny)                              */
  11. /* bw - bład wyswietlania symbolu                                      */
  12. /* z  - inny, nie zdefiniowany bład                                    */
  13. /***********************************************************************/
  14. enum Symbol {e, a, b, c, d, jablko, bc=10, bw=11, z=100};  
  15.  
  16.  
  17.  
  18. struct WyrAlg{                             //elementy wyrazenia algebr.
  19.   Symbol Arg1, Arg2, Wynik;
  20.   char Op;
  21. };
  22.  
  23. struct Staty{                              //liczniki statystyk
  24.   int CalkowitaLiczbaWyrazen;
  25.   int PoprawneWyniki;
  26.   int BlednaSkladnia;
  27.   int NiepoprawnyWynik;
  28. };
  29.  
  30. /************************************************************************/
  31. /* InicjujStaty - inicjuje elementy statystyki zerami                   */
  32. /* PRE:    brak                                                         */
  33. /* POST:   wszystkie elementy "stat" mają wartośc zero                  */
  34. /************************************************************************/
  35. void InicjujStaty (Staty &stat)            
  36. {
  37.   stat.CalkowitaLiczbaWyrazen=0;
  38.   stat.PoprawneWyniki=0;
  39.   stat.BlednaSkladnia=0;
  40.   stat.NiepoprawnyWynik=0;
  41. }
  42.  
  43. /************************************************************************/
  44. /* Dodaj - dodawanie symboli                                            */
  45. /* PRE:    brak                                                         */
  46. /* POST:   Funkcja zwraca sume dwoch argumentow na podstawie tabliczki  */
  47. /************************************************************************/
  48. Symbol Dodaj (Symbol Arg1, Symbol Arg2)
  49. {
  50.   Symbol TabDod[WLK][WLK]={{e,a,b,c,d},        //arytmetyka dodawania symboli
  51.                {a,d,e,b,c},
  52.                {b,e,c,d,a},
  53.                {c,b,d,a,e},
  54.                {d,c,a,e,b}};
  55.   return TabDod [Arg1][Arg2];
  56. }
  57.  
  58. /************************************************************************/
  59. /* Pierwiastkowanie - pierwiastowanie symbolu                           */
  60. /* PRE:    brak                                                         */
  61. /* POST:   Funkcja zwraca pierwiastek argumentu na podstawie tabliczki  */
  62. /************************************************************************/
  63. Symbol Pierwiastkowanie (Symbol x)
  64. {
  65.   Symbol TabPierw[WLK]={e,a,c,d,b};           //arytmetyka pierwiastkowania
  66.  
  67.   return TabPierw[x];
  68. }
  69.  
  70. /************************************************************************/
  71. /* PrzeciwnyDodawania - zwraca symbol przeciwny                         */
  72. /* PRE:    brak                                                         */
  73. /* POST:   Funkcja zwraca symbol przeciwny lub komunikat o bledzie      */
  74. /************************************************************************/
  75. Symbol PrzeciwnyDodawania (Symbol Arg1)
  76. {
  77.   for (int i=0;i!=WLK;i++)
  78.     if (TabDod[Arg1][i]==e) return TabDod[0][i];
  79.   assert(!"Blad: Nie znaleziono elementu przeciwnego! Cos jest nie tak!");
  80.   return z;    
  81. }
  82.  
  83. /************************************************************************/
  84. /* Odejmij - odejmowanie symboli                                        */
  85. /* PRE:    brak                                                         */
  86. /* POST:   Funkcja zwraca roznice dwoch argumentow                      */
  87. /************************************************************************/
  88. Symbol Odejmij (Symbol Arg1, Symbol Arg2)
  89. {
  90.   return Dodaj (Arg1,PrzeciwnyDodawania(Arg2));
  91. }
  92.  
  93. /*************************************************************************/
  94. /* Mnozenie - mnozenie symboli                                           */
  95. /* PRE:    brak                                                          */
  96. /* POST:   Funkcja zwraca iloczyn dwoch argumentow na podstawie tabliczki*/
  97. /*************************************************************************/
  98. Symbol Mnozenie (Symbol Arg1, Symbol Arg2)
  99. {
  100.   Symbol TabMnoz[WLK][WLK] = {{e,e,e,e,e},   //arytmetyka mnozenia symboli
  101.                   {e,a,b,c,d},
  102.                   {e,b,a,d,c},
  103.                   {e,c,d,b,a},
  104.                   {e,d,c,a,b}};
  105.   return TabMnoz [Arg1][Arg2];
  106. }
  107.  
  108. /************************************************************************/
  109. /* OdwrotnyMnozenia - zwraca symbol odwrotny                            */
  110. /* PRE:    brak                                                         */
  111. /* POST:   Funkcja zwraca symbol odwrotny                               */
  112. /************************************************************************/
  113. Symbol OdwrotnyMnozenia(Symbol Arg1)
  114. {
  115.   if (Arg1==e) return e;
  116.   for (int i=1;i!=WLK;i++)
  117.     if (TabMnoz[Arg1][i]==a) return Symbol(i);
  118.   assert(!"Blad: Nie znaleziono elementu odwrotnego! Cos jest nie tak!");
  119.   return z;
  120. }
  121.  
  122. /************************************************************************/
  123. /* Dzielenie - dzielenie symboli                                        */
  124. /* PRE:    brak                                                         */
  125. /* POST:   Funkcja zwraca iloraz dwoch argumentow na podstawie tabliczki*/
  126. /************************************************************************/
  127. Symbol Dzielenie (Symbol Arg1, Symbol Arg2)
  128. {
  129.   if (Arg2==e) return jablko;
  130.   return Mnozenie(Arg1,OdwrotnyMnozenia(Arg2));
  131. }
  132.  
  133. /************************************************************************/
  134. /* WczytajSymbol - zwraca symbol (wczytany jako char)                   */
  135. /* Argumet:  Ch - wczytywany znak                                       */
  136. /* PRE:      brak                                                       */
  137. /* POST:     funkcja zwraca symbol (wczytany wcześniej jako char) lub   */
  138. /*           kod błędu w przypadku niepowodzenia                        */
  139. /************************************************************************/
  140. Symbol WczytajSymbol (char Ch)
  141. {
  142.   Symbol TabS[]={a,b,c,d,e};
  143.   if (Ch<'a' || Ch>'e') return bc;
  144.   return TabS[Ch-'a'];
  145. }
  146. /************************************************************************/
  147. /* WyswietlSymbol - wyswietla symbol jako char                          */
  148. /* Argument: Arg1 - argument, który ma byc wyswietlony                  */
  149. /* PRE:      brak                                                       */
  150. /* POST:     funkcja wyswietla symbol lub kod błędu w przypadku         */
  151. /*           niepowodzenia (przekroczenia zakresu)                      */
  152. /************************************************************************/
  153. char WyswietlSymbol (Symbol Arg1)
  154. {
  155.   const char *Nazwa="eabcd";
  156.   if (Arg1<e || Arg1>d) return bw;
  157.   return Nazwa[Arg1];
  158. }
  159.  
  160.  
  161. /************************************************************************/
  162. /* Przeciazenia operatorow                                              */
  163. /************************************************************************/
  164.  
  165.  
  166. istream& operator >> (istream& stream, Symbol &Sym)
  167. {
  168.   char Znak;
  169.   stream >> Znak;
  170.   Sym = WczytajSymbol(Znak);
  171.   if (Sym==bc) stream.setstate(ios::failbit);  //gdy czytanie się nie powiodło
  172.   return stream;
  173. }
  174.  
  175. ostream& operator << (ostream& stream, Symbol Sym)
  176. {
  177.   stream << WyswietlSymbol(Sym);
  178.   return stream;
  179. }
  180.  
  181. ostream& operator << (ostream& stream, const WyrAlg &wa)
  182. {
  183.   stream << wa.Arg1 << " ";
  184.   stream << wa.Op << " ";
  185.   stream << wa.Arg2;
  186.   stream << " = ";
  187.   stream << wa.Wynik;
  188.   return stream;
  189. }
  190.  
  191. istream& operator >> (istream& stream, WyrAlg &wa)
  192. {
  193.   char Rowna;              //znak '=' czy inny
  194.   stream >> wa.Arg1;
  195.   if (cin.fail())
  196.     {
  197.       cerr << "Blad skladni wyrazenia. Niepoprawny pierwszy argument" << endl;
  198.       cin.ignore(10000,'\n');
  199.       return stream;
  200.     }
  201.   stream >> wa.Op;
  202.   if (!(strchr("+-*/",wa.Op)))
  203.     {
  204.       cerr << "Blad skladni wyrazenia. Niedozwolony znak operatora" << endl;
  205.       stream.setstate(ios::failbit);
  206.       cin.ignore(10000,'\n');
  207.       return stream;
  208.     }
  209.   stream >> wa.Arg2;
  210.   if (cin.fail())
  211.     {
  212.       cerr << "Blad skladni wyrazenia. Niepoprawny drugi argument" << endl;
  213.       cin.ignore(10000,'\n');
  214.       return stream;
  215.     }
  216.   stream >> Rowna;
  217.   if (Rowna!='=')
  218.     {
  219.       cerr << "Blad skladni: Brak znaku ''=''" << endl;
  220.       stream.setstate(ios::failbit);
  221.       return stream;
  222.     }
  223.   stream >> wa.Wynik;
  224.   if (cin.fail())
  225.     {
  226.       cerr << "Blad skladni wyrazenia. Niepoprawny symbol wyniku" << endl;
  227.       cin.ignore(10000,'\n');
  228.     }
  229.   return stream;
  230. } // operator >>
  231.  
  232. Symbol operator + (Symbol Arg1, Symbol Arg2)
  233. {
  234.   return Dodaj(Arg1,Arg2);
  235. }
  236.  
  237. Symbol operator - (Symbol Arg1)
  238. {
  239.   return PrzeciwnyDodawania(Arg1);
  240. }
  241.  
  242. Symbol operator - (Symbol Arg1, Symbol Arg2)
  243. {
  244.   return Arg1+-Arg2;
  245. }
  246.  
  247. Symbol operator * (Symbol Arg1, Symbol Arg2)
  248. {
  249.   return Mnozenie(Arg1,Arg2);
  250. }
  251.  
  252. Symbol operator ~ (Symbol Arg1)      //przeciazenie odwrotnego
  253. {
  254.   return OdwrotnyMnozenia(Arg1);
  255. }
  256.  
  257. Symbol operator / (Symbol Arg1, Symbol Arg2)
  258. {
  259.   if (Arg2==e) return jablko;           //dzielenie przez "0"
  260.   return Arg1*~Arg2;
  261. }
  262.  
  263. /************************************************************************/
  264. /* Kalkulator - funkcja oblicza prawidłowy wynik równania               */
  265. /* Argumenty:   WyrAlg &wa - wprowadzone wyrażenie algebraiczne         */
  266. /* PRE:         wa musi byc zainicjowane                                */
  267. /* POST:        funkcja zwraca "Symbol" jako wynik działania            */
  268. /*              algebraicznego                                          */
  269. /************************************************************************/
  270. Symbol Kalkulator(const WyrAlg &wa)
  271. {
  272.   switch (wa.Op)
  273.     {
  274.     case '+': return wa.Arg1+wa.Arg2; break;
  275.     case '-': return wa.Arg1-wa.Arg2; break;
  276.     case '*': return wa.Arg1*wa.Arg2; break;
  277.     case '/': return wa.Arg1/wa.Arg2; break;
  278.     default: cerr<< "Nie powinienies tego widziec!" << endl; return z; break;
  279.     }
  280.   return z;
  281. }
  282.  
  283. /***********************************************************************/
  284. /* Sprawdzian - funckja obsługująca wyrażenie algebraiczne             */
  285. /* Argumenty:   wa - stuktura do której wczytywane są elementy         */
  286. /*                   wyrazenia algebraicznego                          */
  287. /*              stat - struktura zawierająca dane statystyczne         */
  288. /* PRE:         stat musi byc zainicjowane                             */
  289. /* POST:        funkcja wczytuje wyrażenie algebraiczne ze standardoweg*/
  290. /*              wejścia i zapisuje je do stukruty wa lub zwraca        */
  291. /*              odpowiedni komunikat o błędzie, sprawdza różnież       */
  292. /*              poprawność wprowadzonego wyniku, zmienia odpowiednie   */
  293. /*              dane statystyczne                                      */
  294. /***********************************************************************/
  295. void Sprawdzian(WyrAlg &wa, Staty &stat)
  296. {
  297.   Symbol wynik;
  298.  
  299.   ++ stat.CalkowitaLiczbaWyrazen;
  300.   cin >> wa;
  301.   if (cin.fail()) ++stat.BlednaSkladnia;
  302.   else
  303.     {
  304.       cout << "Wczytano wyrazenie: " << wa << endl;
  305.       wynik=Kalkulator(wa);
  306.       if (wynik==z) cerr << "Niepoprawne wyrazenie w pamieci" << endl;
  307.       if (wa.Wynik!=wynik)
  308.     {
  309.       cout << "Wynik niepoprawny. Wlasciwy wynik to: " << wynik << endl;
  310.       ++stat.NiepoprawnyWynik;
  311.     }
  312.       else
  313.     {
  314.       cout << "Wynik poprawny" << endl;
  315.       ++stat.PoprawneWyniki;
  316.     }
  317.     }
  318. } //Sprawdzian
  319.  
  320. /**************************************************************************/
  321. /* Statystyka - funkcja wyświelta statstykę sprawdzianu                   */
  322. /* PRE:         stats musi być zainicjowane                               */
  323. /* POST:        funkcja wyświetla na standardowym wyjściu statystykę      */
  324. /**************************************************************************/
  325. void Statystyka (const Staty &stats)
  326. {
  327.   int PoprWyrazenia=stats.CalkowitaLiczbaWyrazen-stats.BlednaSkladnia;
  328.   cout << "Statystyka: " << endl;
  329.   cout << "Ilosc wszytskich wyrazen: " << stats.CalkowitaLiczbaWyrazen
  330.        << endl;
  331.   cout << "Ilosc poprawnie zapisanych wyrazen: "
  332.        << PoprWyrazenia
  333.        << endl;
  334.   cout << "Ilosc wyrazen z poprawnym wynikiem: " << stats.PoprawneWyniki
  335.        << endl;
  336.   cout << "Procentowo ilosc poprawnych wynikow: "
  337.        << (static_cast<double>(stats.PoprawneWyniki)/PoprWyrazenia)*100 << "%\n";
  338. }
  339.  
  340. int main()
  341. {  
  342.   WyrAlg wa;
  343.   Staty stat;
  344.   char Znak;
  345.  
  346.   cout << "Start sprawdzianu z artymetyki:" << endl;
  347.   cout << "Wprowadzaj wyrazenia liniami, znaki i symbole oddzielone spacjami"
  348.        << endl << endl;
  349.  
  350.   InicjujStaty(stat);
  351.  
  352.   while ((Znak=getc(stdin))!=EOF)   //ctrl+D = EOF w linuxie
  353.     {
  354.       ungetc(Znak,stdin);
  355.       Sprawdzian(wa,stat);
  356.       cin.clear();
  357.       cin.ignore(10000,'\n');
  358.     }
  359.  
  360.   Statystyka(stat);         //wyświetlenie statystyki
  361.  
  362.  
  363. }
Advertisement
Add Comment
Please, Sign In to add comment