玩命加载中 . . .

简单计算器


http://t.cn/AiKoGS94

描述

读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。

输入描述:

测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。

输出描述:

对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。

示例1

输入:

1 + 2
4 + 2 * 5 - 7 / 11
0

输出:

3.00
13.36
#define _CRT_SECURE_NO_WARNINGS 1
#include <bits/stdc++.h>
using namespace std;

/*

之前计算表达式的题,不需要处理空格。两者的区别就在于怎么处理输入顺序

无空格版本:先输入数字, 之后就按照运算符+数字的顺序反复。直到输入的运算符为换行符为止
空格版本:先输入数字+空格符,再输入运算符,空格,数字,之后就按照空格,运算符,空格,数字的顺序输入,直到第一个空格为换行符为止


*/


int main()
{
    double t, term;//测试数据默认先输入数字。如果存在先输入符号的情况,可以用if语句,比如-5
    char c;//紧接着数字输入运算符号,空格

    double a[150];//保存结果的栈
    double sum;//保存最终结果

    int i;//i表示栈的高度,从0开始计算
    int j;

    //先输入数字,空格
    while (scanf("%lf%c", &t, &c) != EOF)
    {
        sum = 0;
        i = 0;
        a[0] = t;//输入的第一个数字压栈
        if (t != 0 && c == '\n') {
            printf("%0.2f\n", t);
            continue;
        }
        if (t == 0 && c == '\n')
            break;
        //之后的节奏是:符号 空格 或者 数字,空格,或者 数字,换行

        do {
            //这时候输入运算符,空格,数字
            scanf("%c %lf", &c, &term);
            //计算逻辑:加法直接压栈,减法压栈相反数,乘法取出一个数相乘后压栈,除法取出一个数相除后压栈
            //最关键的就是这个加法的处理,两个操作数都要压栈
            if (c == '+')
                a[++i] = term;
            else if (c == '-')
                a[++i] = 0 - term;
            else if (c == '*')
                a[i] *= term;
            else if (c == '/')
                a[i] /= term;
        } while (scanf("%c", &c) != EOF && c != '\n');//此时又输入空格

        for (j = 0; j <= i; j++)
            sum += a[j];
        printf("%0.2f\n", sum);

    }
    return 0;
}

文章作者: Jack Tim
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Jack Tim !
评论
  目录