山寨版计算器

原创 2018年04月16日 07:45:58

题目来源:http://116.56.140.75:8000/JudgeOnline/problem.php?id=1735

1735: 山寨版计算器

时间限制: 1 Sec 内存限制: 64 MB

题目描述

我们日常生活中经常使用到一种被称为计算器的工具,这是一个有意思的发明,它可以代替人进行运算,而人只需要将数据输入即可。假设你是一个山寨计算器厂家的程序员,你的老板正要开发一种“新”的计算器,可以进行“+”、“-”、“*”、“\”这四种运算,而且输出有一定的精确度。由于你只负责一部分软件开发,所以运算顺序只需按照从左往右即可。请你按要求制作这个小程序。

输入

一个以“=”结尾的表达式,包含浮点数(也就是小数)和整数和四种合乎规范的运算符,且都用空格隔开,计算过程中数据范围都在double型数据的表示范围之内。输入数据中有浮点数。表达式有多个数据(少于10000个)

输出

一个答案,保留3位小数。

样例输入

1 + 2 - 1 * 4 / 5 + 1 - 1 =

解释:就像你自己在电脑上测试自己的程序一样,POJ会将一个字符串输入到你的程序里面,
这样一个字符串就是上面这个表达式“1 + 2 - 1 * 4 / 5 + 1 - 1 =”,其中的+,-,*,/也是一个个的字符,
可以使用IF语句判断,如:读入了一个“+”,那么把+号之前的值与之后读入的那个值加起来。
思考的时候可以多换换思路。

样例输出

1.600

提示

注意输出的答案最后需要换行。
读入的时候需要考虑空格的处理。
别傻了,真正的测试数据比
1 + 2 - 1 * 4 / 5 + 1 - 1 =
要长得多,而且有浮点数的存在(如123.0029)。

解析:我们可以读取整个字符串后再处理,也可以边读取边处理,就是要把数与运算符分开来

代码://读取完之后再处理

#include<iostream> 
#include<string> 
#include<cmath> 
#include<iomanip> 
using namespace std; 
int main() 
{ 
    string str; 
    getline(cin, str); 
    int num = str.size(); 
    double a[10000] = {}; 
    char ch[10000]; 
    int count = 0; 
    for (int i = 0; i < num - 1; i++) 
    { 
        if (str[i] == ' ') 
            count++; 
    } 
    int a_k = (count + 1) / 2 - 1; 
    int ch_k = (count - 1) / 2 - 1; 
    int a_kk = a_k, ch_kk = ch_k; 
    for (int i = num - 3; i >= 0;) 
    { 
        if (str[i] == ' ') 
        { 
            if (str[i + 1] == '+' || str[i + 1] == '-' || str[i + 1] == '*' || str[i + 1] == '/') 
                ch_k--; 
            i--; 
        } 
        else if (str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/') 
        { 
            ch[ch_k] = str[i]; 
            i--; 
        } 
        else
        { 
            int flag = 0; 
            int k = i; 
            for (; k >= 0; k--) 
            { 
                if (str[k] == ' ' || k == 0) 
                    break; 
                if (str[k] == '.') 
                { 
                    flag = 1; 
                    break; 
                } 
            } 
            if (flag) 
            { 
                k = k - i; 
                int j = i; 
                for (; j >= 0; j--) 
                { 
                    if (str[j] == ' ') 
                        break; 
                    if (str[j] != '.') 
                    { 
                        a[a_k] += (str[j] - '0')*pow(10, k); 
                        k++; 
                    } 
                } 
                i = j - 1; 
            } 
            else
            { 
                int j = i; 
                k = 0; 
                for (; j >= 0; j--) 
                { 
                    if (str[j] == ' ') 
                        break; 
                    else
                    { 
                        a[a_k] += (str[j] - '0')*pow(10, k); 
                        k++; 
                    } 
                } 
                i = j - 1; 
            } 
            a_k--; 
        } 
    } 
    double sum = a[0]; 
    for (int i = 0; i <= ch_kk; i++) 
    { 
        if (ch[i] == '+') 
            sum += a[i + 1]; 
        else if (ch[i] == '-') 
            sum -= a[i + 1]; 
        else if (ch[i] == '*') 
            sum *= a[i + 1]; 
        else if (ch[i] == '/') 
            sum /= a[i + 1]; 
    } 
    cout << fixed << setprecision(3) << sum << endl; 
    return 0; 
} 
/************************************************************** 
    Problem: 1735 
    User: 201730685257 
    Language: C++ 
    Result: 正确 
    Time:0 ms 
    Memory:1500 kb 
****************************************************************/
代码://边读取边处理
#include<iostream> 
#include<string> 
#include<cmath> 
#include<iomanip> 
using namespace std; 
int main() 
{ 
    char ch[10000]; 
    char s=' '; 
    double num = 0, sum = 0; 
    int i = 0, k = 0; 
    int flag = 0; 
    while ((ch[i] = getchar())!= '=') 
    { 
        if (ch[i] == ' ') 
        { 
            flag = 0; 
            if (ch[i - 1] == '+' || ch[i - 1] == '-' || ch[i - 1] == '*' || ch[i - 1] == '/') 
                continue; 
            num = 0; 
            int j = i - 1; 
            for (; j >= k; j--) 
            { 
                if (ch[j] == '.') 
                    flag = 1; 
            } 
            j = j - i; 
            if (flag) 
            { 
                for (int a = i - 1; a >= k; a--) 
                            { 
                                                                       if(ch[a]!='.')    
                                                                       { 
                                                                                num += (ch[a] - '0')*pow(10, j+3); 
                                j++; 
                                                                       } 
                                                                }  
            } 
            else
            { 
                j = 0; 
                for (int a = i - 1; a >= k; a--) 
                    num += (ch[a] - '0')*pow(10, j); 
                j++; 
            } 
                                                  
            if (s == ' ' || s == '+') 
                sum += num; 
            else if (s == '-') 
                sum -= num; 
            else if (s == '*') 
                sum *= num; 
            else if (s == '/') 
                sum /= num; 
        } 
        else if (ch[i] == '+' || ch[i] == '-' || ch[i] == '*' || ch[i] == '/') 
        { 
            s = ch[i]; 
            k = i + 1; 
        } 
        i++; 
    } 
    cout << fixed << setprecision(3) << sum << endl; 
    return 0; 
} 
/************************************************************** 
    Problem: 1735 
    User: 201730685257 
    Language: C++ 
    Result: 正确 
    Time:0 ms 
    Memory:1496 kb 
****************************************************************/
当然,这是题目对数字的处理机制,即四则运算优先级是一样的,那假如是我们正常的运算呢,即乘除高于加减,呵呵,只要稍作改动就可以了,一下附上代码:
#include<iostream> 
#include<string> 
#include<cmath> 
#include<iomanip> 
using namespace std; 
int main() 
{ 
    string str; 
    getline(cin, str); 
    int num = str.size(); 
    double a[10000] = {}; 
    char ch[10000]; 
    int count = 0; 
    for (int i = 0; i < num - 1; i++) 
    { 
        if (str[i] == ' ') 
            count++; 
    } 
    int a_k = (count + 1) / 2 - 1; 
    int ch_k = (count - 1) / 2 - 1; 
    int a_kk = a_k, ch_kk = ch_k; 
    for (int i = num - 3; i >= 0;) 
    { 
        if (str[i] == ' ') 
        { 
            if (str[i + 1] == '+' || str[i + 1] == '-' || str[i + 1] == '*' || str[i + 1] == '/') 
                ch_k--; 
            i--; 
        } 
        else if (str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/') 
        { 
            ch[ch_k] = str[i]; 
            i--; 
        } 
        else
        { 
            int flag = 0; 
            int k = i; 
            for (; k >= 0; k--) 
            { 
                if (str[k] == ' ' || k == 0) 
                    break; 
                if (str[k] == '.') 
                { 
                    flag = 1; 
                    break; 
                } 
            } 
            if (flag) 
            { 
                k = k - i; 
                int j = i; 
                for (; j >= 0; j--) 
                { 
                    if (str[j] == ' ') 
                        break; 
                    if (str[j] != '.') 
                    { 
                        a[a_k] += (str[j] - '0')*pow(10, k); 
                        k++; 
                    } 
                } 
                i = j - 1; 
            } 
            else
            { 
                int j = i; 
                k = 0; 
                for (; j >= 0; j--) 
                { 
                    if (str[j] == ' ') 
                        break; 
                    else
                    { 
                        a[a_k] += (str[j] - '0')*pow(10, k); 
                        k++; 
                    } 
                } 
                i = j - 1; 
            } 
            a_k--; 
        } 
    } 
    
    for(int i=0;i<=ch_kk;i++)
    {
        if(ch[i]=='*')
         {
              a[i+1]=a[i]*a[i+1];
              a[i]=0;
              ch[i]=='+';
          }
          else if(ch[i]=='/')
          {
              a[i+1]=a[i]/a[i+1];
              a[i]=0;
              ch[i]='+';
          }
       }
    double sum = a[0]; 
    for (int i = 0; i <= ch_kk; i++) 
    { 
        if (ch[i] == '+') 
            sum += a[i + 1]; 
        else if (ch[i] == '-') 
            sum -= a[i + 1];  
    } 
    cout << fixed << setprecision(3) << sum << endl; 
    return 0; 
} 





老镇讲堂-Watch版计算器

Apple Watch 计算器实战开发
  • 2015年05月20日 20:55

一个山寨版计算器,实现了一般计算器的所有功能

  • 2010年02月02日 22:00
  • 3KB
  • 下载

重现山寨计算器

来学习java语言也有十来天了,感觉有的时候挺没信心的,面对那些出过N次错误还继续的重犯,面对一个程序的一个小错误看了很久都没能找出来.不过特别高兴的是,在自己的努力过程中,还是收获到了自己比较满意的...
  • dahe5
  • dahe5
  • 2013-02-09 11:28:41
  • 234

用JAVA语言编写:山寨版QQ课程设计报告

  • 2010年01月13日 11:16
  • 190KB
  • 下载

基于java开发的山寨QQ

  • 2017年09月12日 18:51
  • 38.85MB
  • 下载

原创 山寨版微信

use LWP::UserAgent; use URI::Escape; use Net::Ping; use JSON qw(encode_json); use Socket; use Net::S...
  • zhaoyangjian724
  • zhaoyangjian724
  • 2016-01-29 18:22:16
  • 590

【Java小项目】山寨QQ

最近看着韩顺平老师的视频加上百度谷歌做了这个小玩意。   主要功能:            服务器端:                       1.选择监听端口               ...
  • A__yes
  • A__yes
  • 2015-11-12 20:38:26
  • 1669

山寨黑盘安国特殊量产工具最新版

  • 2013年11月06日 22:09
  • 4.17MB
  • 下载

韩顺平山寨QQ课堂版、普通版、改进版(加强版)源代码2套代码

  • 2013年05月06日 17:39
  • 5.65MB
  • 下载

java 山寨QQ 实现(一)

By EvilBinary 小E 先看界面 //登录对话框代码 package org.evilbinary.client.ui; import java.awt.Color; imp...
  • EvilBinary_root
  • EvilBinary_root
  • 2011-12-04 10:28:21
  • 4237
收藏助手
不良信息举报
您举报文章:山寨版计算器
举报原因:
原因补充:

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