Advertisement
Guest User

Untitled

a guest
Oct 21st, 2017
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.76 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include "Stack.h"
  3. #include "DStack.h"
  4. #include <stdio.h>
  5. #include <iostream>
  6. #include <math.h>
  7. using namespace std;
  8.  
  9. //--- naglowki funckji ---------
  10. double ONP();
  11. double Eval(char, double, double);
  12. double GetNum();
  13. char   GetOper();
  14. void   SkipSpaces();
  15. int    prior( char cOper );
  16. int    IsDigit( char c );
  17. int    IsOper( char cOper );
  18.  
  19. //=======================================
  20. int main( int argc, char* argv[] )
  21. {
  22.     cout << "\nPodaj wyrazenie bez nawiasow: ";
  23.     cout << "wartosc = " << ONP();
  24.  
  25.     cout << "\n\n";
  26.     system("PAUSE");
  27.     return 0;
  28. }
  29. //-----------------------
  30. double ONP()
  31. {
  32.   char c;
  33.  
  34.   StackItem* pHead = NULL;      // wyzerowanie stosu
  35.  
  36.   DStackItem* pDHead = NULL;        // wyzerowanie stosu
  37.  
  38.   dpush( &pDHead, GetNum() );
  39.  
  40.  
  41.   while (IsOper(c = GetOper()))
  42.   {
  43.           // prior operatora MUSI byc silnie wiekszy od prior szczytu stosu
  44.           while (prior(c) <= prior(top(pHead))) // jeżeli wyższy priorytet to wyrzucam
  45.           {
  46.               double x = dpop(&pDHead);
  47.               dpush(&pDHead, Eval(pop(&pHead), dpop(&pDHead), x));
  48.           }
  49.  
  50.           push(&pHead, c);
  51.  
  52.           dpush(&pDHead, GetNum());
  53.      
  54.   }
  55.   while( !isEmpty(pHead) )
  56.   {
  57.       double x = dpop(&pDHead);
  58.       dpush(&pDHead, Eval(pop(&pHead), dpop(&pDHead), x));
  59.   }
  60.   return dpop(&pDHead);
  61. }
  62. //-----------------------
  63. double GetNum()
  64. {
  65.     char c;
  66.     double  res = 0;
  67.  
  68.   SkipSpaces();
  69.   while( IsDigit( c=getchar() ) )
  70.     res = res * 10 + (c-'0');
  71.   if (c == '.')
  72.   {
  73.       double coef = 0.1;
  74.       while (IsDigit(c = getchar()))
  75.       {
  76.           res += coef * (c - '0');
  77.           coef *= 0.1;
  78.       }
  79.   }
  80.  
  81.   ungetc( c, stdin );
  82.   return res;
  83. }
  84. //-----------------------
  85. int IsDigit( char c )
  86. {
  87.   return ( c>='0' ) && ( c<='9' );
  88. }
  89. //------------------------
  90. int  IsOper( char cOper )
  91. {
  92.   switch( cOper )
  93.   {
  94.     case '+':
  95.     case '-':
  96.     case '*':
  97.     case '/':
  98.     case '^':
  99.     case '(':
  100.     case ')': return 1;
  101.     default: return 0;
  102.   }
  103. }
  104. //------------------------
  105. char GetOper()
  106. {
  107.   SkipSpaces();
  108.   return getchar();
  109. }
  110. //------------------------
  111. void SkipSpaces()
  112. {  
  113.   char c;
  114.   while( ( c = getchar() ) == ' ' );
  115.   ungetc( c, stdin );
  116. }
  117. //------------------------
  118. int prior( char cOper )
  119. {
  120.   switch( cOper )
  121.   {
  122.     case '(': return 1;
  123.     case '+': ;
  124.     case '-': return 2;
  125.     case '*': ;
  126.     case '/': return 3;
  127.     case '^': return 4;
  128.   }
  129.   return 0;
  130. }
  131. double Eval(char cOper, double arg1, double arg2)
  132. {
  133.     switch (cOper)
  134.     {
  135.     case '+': return arg1 + arg2;
  136.     case '-': return arg1 - arg2;
  137.     case '*': return arg1 * arg2;
  138.     case '/':  if (arg2 != 0)
  139.     {
  140.         return arg1 / arg2;
  141.     }
  142.                else
  143.                {
  144.                    printf("%s,Nie można dzielić przez 0");
  145.                    return 0;
  146.                }
  147.     case '^': return pow(arg1, arg2);
  148.  
  149.         system("PAUSE");
  150.         return 0;
  151.     }
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement