Advertisement
Guest User

Untitled

a guest
Nov 19th, 2017
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.95 KB | None | 0 0
  1. // ex8.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "Stack.h" // stos numero uno
  6. #include "DStack.h" // secondo stos
  7. #include <stdio.h>
  8. #include <iostream>
  9. #include <math.h>
  10.  
  11. using namespace std;
  12.  
  13. //--- naglowki funckji ---------
  14. double ONP();
  15. double Eval(char, double, double);
  16. double GetNum();
  17. char GetOper();
  18. void SkipSpaces();
  19. int prior( char cOper );
  20. int IsDigit( char c );
  21. int IsOper( char cOper );
  22.  
  23. //=======================================
  24. int main( int argc, char* argv[] ) // główna funkcja
  25. {
  26. printf("\nPodaj wyrazenie bez nawiasow: ");
  27. printf("Wartosc wyrazenia = %5f\n", ONP());
  28. system("PAUSE");
  29. return 0;
  30. }
  31. //-----------------------
  32. double ONP()
  33. {
  34. char c;
  35. StackItem* pHead = NULL; // wyzerowanie stosu
  36. DStackItem* pDHead = NULL; // wyzerowanie stosu
  37.  
  38. dpush(&pDHead, GetNum());
  39. while (IsOper(c = GetOper()))
  40. {
  41.  
  42. while (prior(c) <= prior(top(pHead))) // prior operatora MUSI byc silnie wiekszy od prior szczytu stosu
  43. {
  44. double x = dpop(&pDHead);
  45. dpush(&pDHead, Eval(pop(&pHead), dpop(&pDHead), x));
  46. }
  47. push(&pHead, c);
  48. dpush(&pDHead, GetNum());
  49. }
  50. while (!isEmpty(pHead))
  51. {
  52. double x = dpop(&pDHead);
  53. dpush(&pDHead, Eval(pop(&pHead), x, dpop(&pDHead)));
  54. }
  55. return dpop(&pDHead);
  56. }
  57. //-----------------------
  58. double GetNum()
  59. {
  60. char c;
  61. double res = 0;
  62. SkipSpaces();
  63. while(IsDigit(c=getchar())) // sprawdzamy czy c jest liczbą, czy znakiem. jak liczba to res, jak nie to idzie dalej.
  64. res = res * 10 + (c-'0');
  65. if (c == '.')
  66. {
  67. double coef = 0.1;
  68. while(IsDigit(c = getchar()))
  69. {
  70. res += coef * (c - '0');
  71. coef *= 0.1;
  72. }
  73. }
  74. ungetc(c, stdin); // znak c zwracamy do strumienia
  75. return res;
  76. }
  77. //-----------------------
  78. int IsDigit(char c) // sprawdza wartosc liczby
  79. {
  80. return (c>='0') && (c<='9');
  81. }
  82. //------------------------
  83. int IsOper(char cOper) // operator
  84. {
  85. switch(cOper)
  86. {
  87. case '(':
  88. case ')':
  89. case '+':
  90. case '-':
  91. case '*':
  92. case '/':
  93. case '^': return 1;
  94. default: return 0;
  95. }
  96. }
  97. //------------------------
  98. char GetOper()
  99. {
  100. SkipSpaces();
  101. return getchar();
  102. }
  103. //------------------------
  104. void SkipSpaces() // opuszczanie spacji
  105. {
  106. char c;
  107. while((c = getchar()) == ' ');
  108. ungetc(c, stdin);
  109. }
  110. //------------------------
  111. int prior(char cOper) // priorytet operatorow na stosie
  112. {
  113. switch(cOper)
  114. {
  115. case '(': return 1;
  116. case '+': ;
  117. case '-': return 2;
  118. case '*': ;
  119. case '/': return 3;
  120. case '^': return 4;
  121. case ')': return 5;
  122. }
  123. return 0;
  124. }
  125. double Eval(char cOper, double arg1, double arg2) // liczenie dzialan itd
  126. {
  127. switch (cOper)
  128. {
  129. case '+': return arg1 + arg2;
  130. case '-': return arg1 - arg2;
  131. case '*': return arg1 * arg2;
  132. case '/':
  133. {
  134. if (arg2 != 0)
  135. {
  136. return arg1 / arg2;
  137. }
  138. else
  139. {
  140. printf("Nie dzielimy przez 0!\n");
  141. return 0;
  142. }
  143. }
  144. case '^': return pow(arg1, arg2);
  145. }
  146. return 0;
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement