All pastes #839464 Raw Edit

Unnamed

public text v1 · immutable
#839464 ·published 2007-12-31 01:06 UTC
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();
}