#include #include /* dla pow() */ #include /* dla strlen() */ #include /* dla atoi() */ #include "stos.h" #define MAX 1024 /* maksymalna dlugosc wyrazenia (OdwNotPl) w znakach */ void konwerterOdwNotPl(char *, char *); double oblicz(char *); int main(void) { char wyrazenie[MAX], wyrazenieOdwNotPl[MAX]; printf("Podaj wyrazenie arytmetyczne:\n"); scanf("%s", wyrazenie); konwerterOdwNotPl(wyrazenieOdwNotPl, wyrazenie); printf("Wynik konwersji do Odwrotnej Notacji Polskiej: %s\n", wyrazenieOdwNotPl); printf("Wynik: %.5g\n", oblicz(wyrazenieOdwNotPl)); getchar(); return 0; getchar(); } /* konwerterOdwNotPl: funkcja przeksztalca wyrazenie zapisane w notacji * nawiasowej do wyrazenia w Odwrotnej Notacji Polskiej. * * Obslugiwane sa operatory: ^ * / + - */ void konwerterOdwNotPl(char *wynik, char *s) { char x, y; while (x = *s++) { /* krok 1 */ if ((x >= '0' && x <= '9') || x == '.') { /* krok 2 */ /* kopiowanie calej liczby z wejscia na wyjscie */ do *wynik++ = x; while (x = *s, ((x >= '0' && x <= '9') || x == '.') && s++); *wynik++ = ' '; } else if (x == '(') /* krok 3 */ push((double)'('); else if (x == ')') /* krok 4 */ while ((y = (char)pop()) != '(') *wynik++ = y, *wynik++ = ' '; else { /* krok 5 */ while (y = (char)pop(), y && (y == '^' || (y == '*' || y == '/') && x != '^' || (y == '+' || y == '-') && x != '*' && x != '/' && x != '^')) *wynik++ = y, *wynik++ = ' '; push((double)y); push((double)x); } } while(x = (char)pop()) /* krok 6 */ *wynik++ = x, *wynik++ = ' '; *wynik = '\0'; /* zakonczenie lancucha wyjsciowego */ getchar(); } /* oblicz: funkcja oblicza wartosc wyrazenia arytmetycznego zapisanego w * Odwrotnej Notacji Polskiej */ double oblicz(char *s) { char element[MAX]; double op2; while (sscanf(s, "%s", element) != -1) { s += strlen(element) + 1; switch (element[0]) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '.': /* liczba */ push(atof(element)); break; case '^': op2 = pop(); /* ze wzgledu na nieprzemiennosc potegowania */ push(pow(pop(), op2)); break; case '*': push(pop() * pop()); break; case '/': op2 = pop(); /* ze wzgledu na nieprzemiennosc dzielenia */ if (op2 != 0.0) push(pop() / op2); else { printf("oblicz: Blad dzielenia przez zero!\n"); return -1; } break; case '+': push(pop() + pop()); break; case '-': op2 = pop(); /* ze wzgledu na nieprzemiennosc odejmowania */ push(pop() - op2); break; default: printf("oblicz: Blad - nieznany znak!\n"); return -1; } } getchar(); getchar(); return pop(); /* zwraca wynik */ getchar(); getchar(); }