Native/C

104

aucd29 2013. 10. 2. 18:49
#include <stdio.h>
#include <ctype.h>

#define MAXOP    100
#define NUMBER '0'
#define MAXVAL 100

int getop(char []);
void push(double);
double pop(void);
int sp = 0;
double val[MAXVAL];
double atof(char []);

void main()
{
    int type;
    double op2;
    char s[MAXOP];

    while((type = getop(s)) != EOF)
    {
        switch(type)
        {
        case NUMBER:
            push(atof(s));
            break;
        case '+':
            push(pop() + pop());
            break;
        case '*':
            push(pop() + pop());
            break;
        case '-':
            op2 = pop();
            push(pop() - op2);
            break;
        case '/':
            op2 = pop();
            if(op2 != 0.0)
                push(pop() / op2);
            else
                printf("error:zero divisor\n");
            break;
        case '\n':
            printf("\t%.8g\n",pop());
            break;
        default:
            printf("error : unknown command %s\n",s);
            break;
        }
    //    return 0;
    }
}

void push(double f)
{
    if(sp<MAXVAL)
        val[sp++] = f;
    else
        printf("error: stack full, can't push %g\n",f);
}

double pop(void)
{
    if(sp>0)
        return val[--sp];
    else
    {
        printf("error: stack empty\n");
        return 0.0;
    }
}

double atof(char s[])
{
    double val,power;
    int i, sign;

    for(i=0;isspace(s[i]);i++);

    sign = s[i]=='-'?-1:1;

    if(s[i]=='+' || s[i] == '-')
        ++i;

    for(val=0.0;isdigit(s[i]);i++)
        val = 10.0 * val + (s[i] - '0');

    if(s[i] == '.')
        i++;

    for(power=1.0;isdigit(s[i]); i++)
    {
        val = 10.0 * val + (s[i] - '0');
        power *= 10.0;
    }

    return sign * val / power;
}