rendered paste body
#include <stdio.h>
#include <math.h> /* dla pow() */
#include <string.h> /* dla strlen() */
#include <stdlib.h> /* 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();
}