九度OJ 题目1019:简单计算器

一题目描述:
    读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
输入:
    测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
输出:
    对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。

样例输入:

1 + 2
4 + 2 * 5 - 7 / 11
0
样例输出:

3.00
13.36

二.题目分析

     刚开始看到此题时还有点胆怯,脑子中一下子跳出逆波兰式,各种数字栈,操作符栈等,仔细看一下,只有+ - * /四种运算,没有括号,因此可以采用简答模拟的方式,遇见高优先级的* /就先运算,最后对只有+ -的运算进行二次运算。

三.代码

1.

#include 
#include 
#define MAX 210
int Isdigit(char ch)
{
    if('0'<=ch&&ch<='9')
        return 1;
    return 0;
}
int main()
{

    char str[MAX],temp[MAX],opstack[MAX];
    int i,j,k1,k2;
    double numstack[MAX],x,t1,t2;
   
    while(gets(str))
    {
        if(strlen(str)==1&&str[0]=='0')
            break;
        for(i=0,j=0;str[i]!='\0';i++)
        {
            if(str[i]!=' ')
                temp[j++]=str[i];
        }
        temp[j]='\0';
        k1=0;k2=0;
        for(i=0;i


2.某不知名网友

#include 
 
int main(void){
    double data[200];
    int top;
    double sum;
    char operator, blank;
    int dat;
 
    while (scanf ("%d%c", &dat, &blank) != EOF){
        if ((dat == 0) && (blank != ' '))
            break;
        data[0] = dat*1.0;
        top = 0;
        while (scanf ("%c %d%c", &operator, &dat, &blank) != EOF){
            if (operator == '+') { ++top; data[top] = 1.0*dat; }
            if (operator == '-') { ++top; data[top] = -1.0*dat; }
            if (operator == '*') { data[top] *= dat; }
            if (operator == '/') { data[top] /= dat; }
            if (blank != ' ') break;
        }
        sum = 0.0;
        while (top >= 0){
            sum += data[top];
            --top;
        }
        printf ("%.2lf\n", sum);
    }
    return 0;
}


你可能感兴趣的:(九度OJ)