Advertisement
Guest User

pasta dla debili

a guest
Mar 29th, 2017
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.43 KB | None | 0 0
  1. #include <iostream>
  2. #include <cassert>
  3. #include <cstring>
  4. #include <cmath>
  5. #define ILOSC_SYMBOLI 5
  6. using namespace std;
  7.  
  8.  
  9. /*
  10. Definicja typu wyliczeniowego "Symbol" dla symboli a, b, c, d, e.
  11. e a b c d
  12.  
  13. e e,a,b,c,d
  14. a a,d,e,b,c
  15. b b,e,c,d,a
  16. c c,b,d,a,e
  17. d d,c,a,e,b
  18.  
  19. */
  20. enum Symbol{ e,a,b,c,d };
  21. Symbol TabliczkaDzialania[5][5] = {{ e,a,b,c,d },{a,d,e,b,c },{ b,e,c,d,a },{ c,b,d,a,e },{ d,c,a,e,b }};
  22.  
  23. Symbol TabliczkaMnozenia[5][5] = {{ e,e,e,e,e},{ e,a,b,c,d },{ e,b,a,d,c},{ e,c,d,b,a },{ e,d,c,a,b }};
  24.  
  25. /* struktura do statystyk */
  26. struct statTestu
  27. {
  28. int ilowszyswyraz = 0;
  29. int poprawnyzapis = 0;
  30. int poprawnywynik = 0;
  31. float procentpoprawnych = 0;
  32. int dododej = 0;
  33. int mnodziel = 0;
  34. };
  35. /* Struktura ze zmiennymi przydatnymi w funkcjach */
  36. struct stalewyrazenia
  37. {
  38. Symbol Arg1;
  39. Symbol Arg2;
  40. char znak;
  41. bool wczytanewyr;
  42. Symbol wprowadzonywynik;
  43. Symbol wynik;
  44. char tmp;
  45. };
  46.  
  47.  
  48.  
  49.  
  50.  
  51. /*
  52. Definicja funkcji: Dodaj, PrzeciwnyDodawania, Odejmij, Mnoz, OdwrotnyMnozenia, Dziel.
  53. */
  54. Symbol Dodaj(Symbol y, Symbol x)
  55. {
  56. return TabliczkaDzialania[y][x];
  57. }
  58. Symbol operator + ( Symbol y, Symbol x)
  59. {
  60. return TabliczkaDzialania[y][x];
  61. }
  62.  
  63.  
  64. Symbol operator - (Symbol Arg1)
  65. {
  66. int ind=0;
  67. Symbol tabSymboli[]={e,a,b,c,d};
  68. Symbol tmpSymbol=tabSymboli[0];
  69. for(ind=0 ; ind<ILOSC_SYMBOLI ; ++ind, tmpSymbol=tabSymboli[ind])
  70. {
  71. if(Arg1+tmpSymbol==e)
  72. return tmpSymbol;
  73.  
  74. }
  75. assert(0);
  76. return e;
  77. }
  78. Symbol operator - (Symbol Arg1 , Symbol Arg2)
  79. {
  80. return Arg1+(-Arg2);
  81. }
  82. /*
  83. Definicja przeciążeń operatorów
  84. */
  85. Symbol operator * (Symbol Arg1 , Symbol Arg2) /*przeciazenie operatora * */
  86. {
  87. return TabliczkaMnozenia[Arg1][Arg2];
  88. }
  89.  
  90. Symbol OdwrotnyMnozenia (Symbol Arg1) /* funkcja odwrócenia argumentu */
  91. {
  92. int ind=0;
  93. Symbol tabSymboli[]={e,a,b,c,d};
  94. Symbol tmpSymbol=tabSymboli[0];
  95. for(ind=0 ; ind<ILOSC_SYMBOLI ; ++ind, tmpSymbol=tabSymboli[ind])
  96. {
  97. if(Arg1*tmpSymbol==a)
  98. return tmpSymbol;
  99. }
  100.  
  101. return a;
  102. }
  103.  
  104. Symbol operator / (Symbol Arg1 , Symbol Arg2)
  105.  
  106. {
  107.  
  108. return TabliczkaMnozenia[Arg1][OdwrotnyMnozenia(Arg2)] ;
  109.  
  110.  
  111. }
  112.  
  113.  
  114.  
  115.  
  116. Symbol operator ^ (Symbol Arg1 , Symbol Arg2)
  117. {
  118. return Arg2*Arg1*Arg1*Arg2+Arg2/Arg1-Arg1;
  119. }
  120.  
  121.  
  122.  
  123. /* Inkrementacje statystyk */
  124.  
  125.  
  126. void iloscwyrazen (statTestu &struc)
  127. {
  128. (struc.ilowszyswyraz)++;
  129. }
  130.  
  131. void popzap (statTestu &struc)
  132.  
  133. {
  134. (struc.poprawnyzapis)++;
  135. }
  136.  
  137. void popwyn (statTestu &struc)
  138. {
  139. (struc.poprawnywynik)++;
  140. }
  141. void dodajodejmij (statTestu &struc)
  142. {
  143. (struc.dododej)++;
  144. }
  145.  
  146. void mnozeniedzielenie (statTestu &struc)
  147. {
  148. (struc.mnodziel)++;
  149. }
  150.  
  151. void WyswietlStaty(statTestu struc) /* funkcja odpowiedzialna za wyswietlanie statystyk */
  152. {
  153. cout<< "Podsumowanie" <<endl;
  154. cout<<" Ilosc wszystkich wyrazen: " << struc.ilowszyswyraz <<endl;
  155. cout<<"Ilosc poprawnie zapisanych wyrazen pod wzgledem skladni: "<<struc.poprawnyzapis<<endl;
  156. cout<<" Ilosc wyrazen z poprawnie zapisanym wynikiem: "<<struc.poprawnywynik<<endl;
  157. struc.procentpoprawnych=(struc.poprawnywynik/struc.ilowszyswyraz)*100;
  158. cout<<" Procent poprawnych wynikow: "<<struc.procentpoprawnych<<"%"<<endl;
  159. cout<<" Ilosc operacji dodawania i odjmowania: "<<struc.dododej<<endl;
  160. cout<<" Ilosc operacji mnozenia i dzielenia: "<<struc.mnodziel<<endl;
  161. }
  162.  
  163.  
  164. bool WczytajSymbol(Symbol &Arg)
  165. {
  166. Symbol tabSymboli[]={e,a,b,c,d};
  167. char* ptrSymbol;
  168. char* tabZnakow = "eabcd";
  169. char tmpZnak = 'x';
  170. cin>> tmpZnak;
  171. ptrSymbol = strchr(tabZnakow,tmpZnak);
  172. if(ptrSymbol==nullptr)
  173. return false;
  174. Arg=tabSymboli[ptrSymbol-tabZnakow];
  175. }
  176. void WypiszSymbol(Symbol Arg)
  177. {
  178. char* tabZnakow = "eabcd";
  179. cout << tabZnakow[Arg];
  180.  
  181. }
  182. ostream & operator<<(ostream&wyj, Symbol Arg)
  183. {
  184. char* tabZnakow = "eabcd";
  185. wyj << tabZnakow[Arg];
  186. return wyj;
  187.  
  188. }
  189.  
  190. istream & operator>>(istream &wej, Symbol & Arg)
  191. {
  192. Symbol tabSymboli[]={e,a,b,c,d};
  193. char* ptrSymbol;
  194. char* tabZnakow = "eabcd";
  195. char tmpZnak = 'x';
  196. wej>> tmpZnak;
  197. if(ptrSymbol=strchr(tabZnakow,tmpZnak))
  198. {
  199. Arg=tabSymboli[ptrSymbol-tabZnakow];
  200. }
  201. else
  202. {
  203. wej.unget();
  204. wej.setstate(ios::failbit);
  205. }
  206. return wej;
  207. }
  208.  
  209. istream & operator>>(istream &wej, stalewyrazenia & Arg)
  210. {
  211.  
  212. Arg.wczytanewyr = false;
  213. wej>>Arg.Arg1; /* Wczytujemy pierwszy argument z wejscia */
  214. if(cin.fail()) /* Sprawdzamy czy pierwszy argument jest poprawny */
  215. {
  216. cout<<"Blad skladni wyrazenia. Niepoprawny pierwszy argument. "<<endl; /* wyswietlamy blad jezeli, pierwszy argument nie znajduje sie w tablicy {e,a,b,c,d} */
  217. cin.clear();
  218. return wej;
  219. }
  220. wej>>Arg.tmp;
  221. if(strchr( "+-*/",Arg.tmp)==nullptr)
  222.  
  223. {
  224. cout<<"Blad skladni wyrazenia. Niedozwolony znak operatora."<<endl;
  225. cin.clear();
  226. return wej;
  227. }
  228. wej>>Arg.Arg2;
  229. if(cin.fail()) /* Sprawdzamy czy drugi argument jest poprawny */
  230. {
  231. cout<<"Blad skladni wyrazenia. Niepoprawny drugi argument."<<endl; /* wyswietlamy blad jezeli, drugi argument nie znajduje sie w tablicy {e,a,b,c,d} */
  232. cin.clear();
  233. return wej;
  234. }
  235. wej>>Arg.znak;
  236. if(Arg.znak!= '=')
  237. {
  238. cout<<"Blad skladni wyrazenia. Brak znaku '='."<<endl;
  239. cin.clear();
  240. return wej;
  241. }
  242. wej>>Arg.wprowadzonywynik;
  243. if(cin.fail())
  244. {
  245. cout<<"Wprowadzony wynik jest nie poprawny."<<endl;
  246.  
  247. cin.clear();
  248. return wej;
  249. }
  250. Arg.wczytanewyr = true;
  251. return wej;
  252.  
  253. }
  254. ostream & operator<<(ostream&wyj, stalewyrazenia & Arg)
  255. {
  256. cout<<"Odczytano wyrazenie: "<<Arg.Arg1<<Arg.tmp<<Arg.Arg2<<"="<<Arg.wprowadzonywynik<<" " <<endl;
  257. }
  258.  
  259. bool InterpretujOperacje(stalewyrazenia Arg, statTestu &struc)
  260. {
  261. switch(Arg.tmp)
  262. {
  263. case '+' :
  264. dodajodejmij(struc);
  265. Arg.wynik=Arg.Arg1+Arg.Arg2;
  266. if(Arg.wprowadzonywynik!=Arg.wynik)
  267. cerr<<"Wynik niepoprawny. Wlasciwy wynik to: "<<Arg.wynik<<endl;
  268. else
  269. {
  270. popwyn(struc);
  271. cout<<"Wynik Poprawny"<<endl;
  272. }
  273. break;
  274. case '-' :
  275. dodajodejmij(struc);
  276. Arg.wynik=Arg.Arg1-Arg.Arg2;
  277. if(Arg.wprowadzonywynik!=Arg.wynik)
  278. cerr<<"Wynik niepoprawny. Wlasciwy wynik to: "<<Arg.wynik<<endl;
  279. else
  280. {
  281. popwyn(struc);
  282. cout<<"Wynik Poprawny"<<endl;
  283. }
  284. break;
  285. case '*' :
  286. mnozeniedzielenie(struc);
  287. Arg.wynik=Arg.Arg1*Arg.Arg2;
  288. if(Arg.wprowadzonywynik!=Arg.wynik)
  289. cerr<<"Wynik niepoprawny. Wlasciwy wynik to: "<<Arg.wynik<<endl;
  290. else
  291. {
  292. popwyn(struc);
  293. cout<<"Wynik Poprawny"<<endl;
  294. }
  295. break;
  296. case '/' :
  297. mnozeniedzielenie(struc);
  298. Arg.wynik=Arg.Arg1/Arg.Arg2;
  299. if(Arg.wprowadzonywynik!=Arg.wynik)
  300. cerr<<"Wynik niepoprawny. Wlasciwy wynik to: "<<Arg.wynik<<endl;
  301. else
  302. {
  303. popwyn(struc);
  304. cout<<"Wynik Poprawny"<<endl;
  305. }
  306. break;
  307. }
  308. }
  309. int main()
  310. {
  311.  
  312. stalewyrazenia wArg1;
  313. statTestu statys;
  314. int i;
  315. for(i=0;i<9;i++)
  316. {
  317. cin>>wArg1;
  318. iloscwyrazen(statys);
  319. InterpretujOperacje(wArg1,statys);
  320. if(wArg1.wczytanewyr)
  321. {
  322. cout<<wArg1;
  323. popzap(statys);
  324. }
  325. }
  326. WyswietlStaty(statys);
  327. return 0;
  328.  
  329. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement