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;
}
#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;
}