简单计算器

原创 2016年05月31日 21:53:11

题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1237


简单计算器



Time Limit: 2000/1000 MS    Memory Limit: 65536/32768 K
Total Submission(s): 17611    Accepted Submission(s): 6171

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

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

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

Sample Input

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

Sample Output

3.00
13.36

解题思路:
在这道题中用栈来存储运算符号,用数组来存储数字。对于*/的优先级比+-高,先是将表达式中的乘除运算做完,然后再将栈里面的符号倒到另一个栈里,从头开始做加减运算。
在水题上折腾了很长时间orz,总结一下,主要是在这几个方面出了问题。
1、如果输入数据是1+2*3的形式,那么在还没有计算2*3就遇到\n结束了。所以在函数中加入了判断栈定元素是否为*/的一段程序。
2、最初的想法是cin.peek()检测到是0就结束了,没有考虑到输入如果是0+0的情况。所以在后面判断是第一位为0后面是/0才是真正的结束。
3、当改好了,感觉应该可以了,却怎么也是wa。找到原因是float的精度太低,有效位只有6-7位,果断改成double。

下面是我的代码

#include<iostream>
#include<memory.h>
#include<stack>
#include<iomanip>
#include<algorithm>
#include<bitset>
#include<string.h>
using namespace std;
#define NUM 250
double divide(char* e)
{
    stack<char>signS;
    stack<char>addS;
    int MulS = 10;
    double h[100] = { 0 };
    int CountX = 0;
    for (int j = 0; e[j] != '\0'; j++)
    {
        if (e[j] >= 0 + '0'&&e[j] <= 9 + '0')
            h[CountX] = h[CountX] * MulS + e[j] - '0';
        else
        {
            if (signS.size() != 0 && signS.top() == '*')
            {
                h[CountX - 1] *= h[CountX];
                h[CountX] = 0;
                CountX--;
                signS.pop();
            }
            if (signS.size() != 0 && signS.top() == '/')
            {
                h[CountX - 1] /= h[CountX];
                h[CountX] = 0;
                CountX--;
                signS.pop();
            }
            signS.push(e[j]);
            CountX++;
        }
    }
    if (signS.size() != 0 && signS.top() == '*')
    {
        h[CountX - 1] *= h[CountX];
        h[CountX] = 0;
        CountX--;
        signS.pop();
    }
    if (signS.size() != 0 && signS.top() == '/')
    {
        h[CountX - 1] /= h[CountX];
        h[CountX] = 0;
        CountX--;
        signS.pop();
    }
    while (signS.size() != 0)
    {
        char s = signS.top();
        addS.push(s);
        signS.pop();
    }
    for (int i = 1; addS.size() != 0; i++)
    {
        char s = addS.top();
        if (s == '+')
            h[0] += h[i];
        else h[0] -= h[i];
        addS.pop();
    }
    return h[0];
}
int main()
{
    bitset<1>flag = 0;
    while (flag == 0)
    {
        double sum = 0;
        char e[NUM];
        memset(e, '\0', sizeof(e));
        for (int i = 0; i < NUM; i++)
        {
            char c = cin.peek();
            if (c == '\n')
                break;
            cin >> e[i];
        }
        if (e[0] == '0'&&e[1] == '\0')
            flag = 1;
        else {
            sum = divide(e);
            //cout << sum << endl;
            cout << setiosflags(ios::fixed) << setprecision(2) << sum << endl;
        }
        cin.ignore();
    }
    return 0;
}

欢迎批评指正!

android:第一个android项目 简单计算器

以前自己写过java版的简单计算器 代码其实都一样就是改改布局 不过我现在不会获取屏幕大小。。然后按照比例设置按钮的长宽。所以先这样凑合把 都在左上角。。 像这样 我用的相对布局 感觉这样比较方便 l...
  • su20145104009
  • su20145104009
  • 2016年02月01日 16:00
  • 3970

用javascript实现简单计算器

这是一个简单计算器的实现。可以实现简单的加,减,乘,除功能,用户按下“←”按钮,删除当前算术表达式最后一个字符,并更新显示,用户按下“CE”按钮,清除当前算术表达式,如果算术表达式非法,弹出警告框提醒...
  • XHF901
  • XHF901
  • 2016年12月09日 15:49
  • 317

HDOJ 1237 简单计算器(堆栈)

简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm...
  • zwj1452267376
  • zwj1452267376
  • 2015年07月27日 23:42
  • 642

MFC简单计算器

由于要接触MFC这个神物,先做个计算器练手,本以为有c#的底子做起来应该不算难,结果两天啊…… 正文: 1.建立mfc工程 选择mfc应用程序,下一步中选择“基于对话框” 2.拖控件,这个都会...
  • zhou_yujia
  • zhou_yujia
  • 2016年04月20日 11:17
  • 1407

基于MFC的一个简单计算器

写一个简单的计算器并不是什么很难的事,主要目的是要通过这个程序来学习和分析其中的核心算法。这个简易计算器的核心部分就是对输入的表达式的正确性判断与求值,其中包括对表达式的解析、中缀表达式转后缀表达式、...
  • lisong694767315
  • lisong694767315
  • 2014年10月07日 15:14
  • 5674

C语言编写的简单计算器程序

这两天在看一个C语言写的计算器程序,做了不少的功夫,跟着作者一步步的进行完善,了解了许多细节性的东西,在此自己做个总结,加深自己对程序的印象,也算是梳理。 在该计算器程序,能进行加减乘除、sin、c...
  • talent_CYJ
  • talent_CYJ
  • 2016年07月01日 10:03
  • 6496

JAVA 一个简单的图形界面计算器

package 计算器; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JOptionPan...
  • xh078910
  • xh078910
  • 2016年02月27日 07:00
  • 1589

杭电ACM-1237-简单计算器

做这个陆陆续续也弄了好几天,一开始是使用栈在做,因为这种类型的题教材上提过(我相信一定也有不少同学一提到写一个简单的不带括号的计算器也会第一时间想到 栈吧)。不过在做的过程,弄了好久也未能用栈来实现。...
  • The_lastest
  • The_lastest
  • 2015年04月08日 15:57
  • 1027

汇编语言实现简单的计算器

计算器实现简单的加减乘除运算(小于65536的正数) ①从键盘输入算数的等式 ②不接受复合算数如3+5*7 ③按‘=’号输出结果 ④按‘C’号作为CLEAR清零 程序分为输入模块,判断模块,...
  • xyisv
  • xyisv
  • 2017年06月15日 23:22
  • 1270

计算器的简单工厂和工厂方法

设计模式这本书学了一多半了,心里也迷糊迷糊的,不过这在怎么迷糊也得总结啊,先从第一个简单工厂开始吧。简单工厂模式是进入设计模式世界的第一个模式,他也告诉了我们面向对象设计时的法则。首先简单工厂模式告诉...
  • wgp15732622312
  • wgp15732622312
  • 2015年11月22日 14:16
  • 637
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:简单计算器
举报原因:
原因补充:

(最多只允许输入30个字)