网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
11月26日漏签0天
c++吧 关注:644,011贴子:2,116,937
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 5回复贴,共1页
<<返回c++吧
>0< 加载中...

四则运算程序

  • 只看楼主
  • 收藏

  • 回复
  • a2824821
  • &
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
支持任何正确的四则运算,统一使用小括号,没有中括号及大括号概念,符号与数字之间允许有空格,括号与括号之间允许有空格。
希望大家可以提出优化思路


  • a2824821
  • &
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include <string>
#include <sstream>
#include <string.h>
#include <iostream>
#include <istream>
using namespace std;
double CalculationResults(const string&);//将表达式的结果计算出来,如:2+3*4
double Calculation(double, double, char);
//四则运算
int main(int argc, char* argv[])
{
double dSum = 0;
string strArithmetic;
string strStart, strEnd;
stringstream ss;
strArithmetic = argv[1];
strArithmetic = "(1+2*3+4/5+6-7/8)";
string::size_type nStart = 0;
string::size_type nEnd = 0;
while (true)
{
strStart = strEnd = strArithmetic;
nStart = strStart.rfind('(');//查找最后一个
if (nStart == string::npos)
{
break;
}
nEnd = strArithmetic.find(')', nStart);//查找当前位置的之后的第一个
strStart.resize(nStart);//截取(之前的部分
strEnd = strEnd.substr(nEnd+1);//获取)之后的部分
if (string::npos != nEnd)
{
dSum = CalculationResults(strArithmetic.substr(nStart+1, nEnd - nStart - 1));
}
else
{
printf("input error\n");
return -1;
}
//将前得到的结果进行拼接
ss.clear();
ss << strStart;
ss << dSum;
ss << strEnd;
strArithmetic.clear();
ss >> strArithmetic;
}
dSum = CalculationResults(strArithmetic);
cout << "四则运算的结果为: " << dSum << endl;
getchar();
return 0;
};
double CalculationResults(const string& strCalculate)
{
double dSum = 0;
string::size_type nPos = strCalculate.find_first_of("*/");//查找第一个*或/
if (nPos != string::npos)
{
string::size_type nPrev = strCalculate.find_last_of("+-", nPos - 1);//查找nPos之前的一个运算符下标,可以得到nPos之前的数值
if (string::npos == nPrev)// *或/是第一个运算符
{
dSum = Calculation(atof(&strCalculate[0]), atof(&strCalculate[nPos+1]), strCalculate[nPos]);
}
else
{
dSum = Calculation(atof(&strCalculate[nPrev]), atof(&strCalculate[nPos+1]), strCalculate[nPos]);
}
}
else//没有*或/运算
{
nPos = strCalculate.find_first_of("+-");//查找第一个+或-
if (nPos != string::npos)
{
dSum = Calculation(atof(&strCalculate[0]), atof(&strCalculate[nPos+1]), strCalculate[nPos]);
}
}
string::size_type nStartPos= 0;
string::size_type nEndPos = 0;
//查找是否还有运算
nStartPos = strCalculate.find_last_of("+-*/", nPos - 1);//查找nPos之前的一个运算符
nEndPos = strCalculate.find_first_of("+-*/", nPos + 1);//查找nPos之后的一个运算符
if (nStartPos != string::npos || nEndPos != string::npos)
{//将结果重新拼接字符串,继续递归调用本函数
stringstream ss;
if (nStartPos != string::npos)
{
ss << strCalculate.substr(0, nStartPos+1);
}
ss << dSum;
if (nEndPos != string::npos)
{
ss << strCalculate.substr(nEndPos);
}
string strTmp;
ss >> strTmp;
dSum = CalculationResults(strTmp);
}
return dSum;
}
double Calculation(double dNum1, double dNum2, char cSymbol)
{
switch (cSymbol)
{
case '+':
return dNum1+dNum2;
break;
case '-':
return dNum1-dNum2;
break;
case '*':
return dNum1*dNum2;
break;
case '/':
if (dNum2 == 0)
{
printf("can not divide by zero\n");
exit(-1);
}
return dNum1/dNum2;
break;
default:
break;
}
return 0;
}


2025-11-26 23:21:24
广告
不感兴趣
开通SVIP免广告
  • a2824821
  • &
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
沉的好快,没人给点建议吗


  • leokay601
  • &
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这个问题问得真好,真有意义,然而没人回答


  • q68257962
  • ,
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
代码懒得细看,然而这种问题的经典做法是递归,实现手段就多了,可以字符串直接解也可以建立表达式二叉树。


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 5回复贴,共1页
<<返回c++吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示