Advertisement
Guest User

onp.cpp

a guest
Oct 16th, 2019
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.90 KB | None | 0 0
  1. #include <iostream>
  2. #include "Stack.h"
  3.  
  4.  
  5. using namespace std;
  6.  
  7. #define DOT '.'
  8.  
  9. //dodac nawiasy i liczby z przecinkami -> zrobione
  10. //dodac mozliwosc dzialania na wielu stosach -> sparametryzowac funkcje stosem ? -> do funkcji ONP trzeba dodać tworzenie prywatnego stosu
  11.  
  12. /*
  13. ONP
  14. / \
  15. / \
  16. moduł operacje
  17. stosu sterujace
  18.  
  19. do modułu stosu -> stock.h oraz stock.cpp !!! -> importowanie tych plików
  20. */
  21.  
  22.  
  23. //Kompilacja warunkowa przy wszystkich wydrukach!
  24.  
  25. ///////////////////////////////////////////////////////
  26.  
  27.  
  28. //ONP funkcje
  29.  
  30. void skipSpaces();
  31. double getNum();
  32. int isDigit(char c);
  33. int isOper(char c);
  34. char getOper();
  35. int prior(char cOper);
  36. void ONP();
  37.  
  38.  
  39. int main()
  40. {
  41. ONP();
  42. }
  43. void skipSpaces()
  44. {
  45. char c;
  46. while ( ( c = getchar() ) == ' ' );
  47. //musimy 'cofnac' sie o jeden znak bo jak trafi na inny niz spacja to go juz przeczyta, wiec cofamy
  48. ungetc(c, stdin);
  49. }
  50. double getNum()
  51. {
  52. char c;
  53. double num = 0;
  54. double partial = 0.1;
  55. //schemat Hornera
  56. skipSpaces();
  57. while(isDigit(c = getchar()))
  58. {
  59. num *= 10;
  60. num += ( (double)c - '0' );
  61. }
  62. //za kazdy kolejny ulamek partial musi zmniejszac sie 10^(-1) raza
  63. if( c == DOT )
  64. {
  65. while( isDigit( c = getchar() ) )
  66. {
  67. num += (( (double)c - '0' ) * partial);
  68. partial *= 0.1;
  69. }
  70. }
  71. ungetc(c, stdin);
  72. return num;
  73. }
  74. int isDigit(char c)
  75. {
  76. return ( c >= '0' ) && ( c <= '9' );
  77.  
  78. }
  79. int isOper(char c)
  80. {
  81. switch (c)
  82. {
  83. case '+':
  84. case '-':
  85. case '*':
  86. case '^':
  87. case '(':
  88. case ')':
  89. case '/': return 1;
  90. }
  91. return 0;
  92. }
  93. char getOper()
  94. {
  95. skipSpaces();
  96.  
  97. return getchar();
  98.  
  99. }
  100. int prior(char cOper)
  101. {
  102. switch (cOper)
  103. {
  104. case ')': return 1;
  105. case '+':
  106. case '-': return 2;
  107. case '*':
  108. case '/': return 3;
  109. case '^': return 4;
  110. case '(': return 5;
  111. }
  112. return 0;
  113. }
  114.  
  115.  
  116. void ONP()
  117. {
  118. //tutaj cos nie dziala
  119. char c;
  120. skipSpaces();
  121. Stack* stack = createStack();
  122. //nie dziala jesli wyrazenie zaczyna sie od nawiasu
  123. printf("%.2f", getNum());
  124.  
  125. while (isOper(c = getOper()))
  126. {
  127. while (prior(c) <= prior(top(&stack)))
  128. {
  129. //jezeli na gorze nawias otwierajacy to wyjdz z petli
  130. if ( prior(top(&stack)) == 5 )
  131. {
  132. //jezeli dodatkowo obecny znak to nawias zamykajacy, to usun nawias otwierajacy ze stosu
  133. if( prior( c ) == 1)
  134. del(&stack);
  135. break;
  136. }
  137. else
  138. printf(" %c", pop(&stack));
  139. }
  140. //kazdy operator poza nawiasem zamykajacym wpisuje sie na stos, zamykajacy ma wartosc 1
  141. if( prior( c ) > 1 )
  142. push(&stack, c);
  143.  
  144. //jesli nastepny to liczba, to ja odczytaj
  145. //jezeli nastepny to nawias, to petla leci dalej
  146. if (isDigit(c = getchar()))
  147. {
  148. ungetc(c, stdin);
  149. printf(" %.2f", getNum());
  150. }
  151. else
  152. ungetc(c, stdin);
  153.  
  154. }
  155.  
  156. //wyczyscic stos -> pobrac pozostale operatory ze stosu
  157. while (!isEmpty(&stack)) {
  158. printf("%c", pop(&stack));
  159. }
  160.  
  161. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement