Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ex8.cpp : Defines the entry point for the console application.
- //
- #include "stdafx.h"
- #include "Stack.h" // stos numero uno
- #include "DStack.h" // secondo stos
- #include <stdio.h>
- #include <iostream>
- #include <math.h>
- using namespace std;
- //--- naglowki funckji ---------
- double ONP();
- double Eval(char, double, double);
- double GetNum();
- char GetOper();
- void SkipSpaces();
- int prior( char cOper );
- int IsDigit( char c );
- int IsOper( char cOper );
- //=======================================
- int main( int argc, char* argv[] ) // główna funkcja
- {
- printf("\nPodaj wyrazenie bez nawiasow: ");
- printf("Wartosc wyrazenia = %5f\n", ONP());
- system("PAUSE");
- return 0;
- }
- //-----------------------
- double ONP()
- {
- char c;
- StackItem* pHead = NULL; // wyzerowanie stosu
- DStackItem* pDHead = NULL; // wyzerowanie stosu
- dpush(&pDHead, GetNum());
- while (IsOper(c = GetOper()))
- {
- while (prior(c) <= prior(top(pHead))) // prior operatora MUSI byc silnie wiekszy od prior szczytu stosu
- {
- double x = dpop(&pDHead);
- dpush(&pDHead, Eval(pop(&pHead), dpop(&pDHead), x));
- }
- push(&pHead, c);
- dpush(&pDHead, GetNum());
- }
- while (!isEmpty(pHead))
- {
- double x = dpop(&pDHead);
- dpush(&pDHead, Eval(pop(&pHead), x, dpop(&pDHead)));
- }
- return dpop(&pDHead);
- }
- //-----------------------
- double GetNum()
- {
- char c;
- double res = 0;
- SkipSpaces();
- while(IsDigit(c=getchar())) // sprawdzamy czy c jest liczbą, czy znakiem. jak liczba to res, jak nie to idzie dalej.
- res = res * 10 + (c-'0');
- if (c == '.')
- {
- double coef = 0.1;
- while(IsDigit(c = getchar()))
- {
- res += coef * (c - '0');
- coef *= 0.1;
- }
- }
- ungetc(c, stdin); // znak c zwracamy do strumienia
- return res;
- }
- //-----------------------
- int IsDigit(char c) // sprawdza wartosc liczby
- {
- return (c>='0') && (c<='9');
- }
- //------------------------
- int IsOper(char cOper) // operator
- {
- switch(cOper)
- {
- case '(':
- case ')':
- case '+':
- case '-':
- case '*':
- case '/':
- case '^': return 1;
- default: return 0;
- }
- }
- //------------------------
- char GetOper()
- {
- SkipSpaces();
- return getchar();
- }
- //------------------------
- void SkipSpaces() // opuszczanie spacji
- {
- char c;
- while((c = getchar()) == ' ');
- ungetc(c, stdin);
- }
- //------------------------
- int prior(char cOper) // priorytet operatorow na stosie
- {
- switch(cOper)
- {
- case '(': return 1;
- case '+': ;
- case '-': return 2;
- case '*': ;
- case '/': return 3;
- case '^': return 4;
- case ')': return 5;
- }
- return 0;
- }
- double Eval(char cOper, double arg1, double arg2) // liczenie dzialan itd
- {
- switch (cOper)
- {
- case '+': return arg1 + arg2;
- case '-': return arg1 - arg2;
- case '*': return arg1 * arg2;
- case '/':
- {
- if (arg2 != 0)
- {
- return arg1 / arg2;
- }
- else
- {
- printf("Nie dzielimy przez 0!\n");
- return 0;
- }
- }
- case '^': return pow(arg1, arg2);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement