C++实用案例:整数四则运算计算器
前言
很多学习C++的人都想过要编一个计算器吧,有可能你没有想过,但你肯定对这个感兴趣。如果你再CSDN上搜一下,出来的一定是双栈啊,class啊什么的,因此你看不懂,所以你感觉没必要copy下来,因为自己不会。那这期我会带大家深度剖析用简单的字符串就能解决的整数四则运算计算器。
一、整体框架
①思路框架
一个合格的计算器,就必须有处理多项式的功能,那么我们遇到一个多项式,会怎么算呢?比如:3 * 3 + 2 / 2 * 5 - 4 * 10 / 5.
首先,我们应该想到的是将多项式化为单项式,也就是以+ -为分界线:
比如:3*3 + 2/2*5 + 4*10/5
然后依次算出:
比如:9 + 5 + 8
最后求和:
比如:22
②代码框架
代码框架大概是这样的:我们用math函数算单项式,main分离多项式。
#include<......> using namespace std; int math(string n){ 算单项式;(分离各位) } int main(){ 分离多项式; 依次调用math() 输出ans; }
二、 自定义函数math详解
刚刚我们了解到要用一个自定义math函数来求一个单项式的值,那我们来具体分析一下:
在程序中计算一个单项式,该怎么做呢?
设这个字符串变量名为a,则:
char now='*'; string s; for(int i=0;i<a.size();i++){ if(当前一位是符号){ 统计目前s的数据,并根据now做相应的运算,然后清零,并统计当前符号至now }else{//当前一位是数字 统计这一位的数据,加到字符串s中 } }
于是,我们补全代码,就是:
int math(string a){//计算单项式头文件 stringstream ss;//定义字符串流ss string num;//定义字符串类型变量num int num_;//定义整数类型变量num_ int ans=1;//定义整数类型变量ans并初始化赋值为1 char now='*';//定义字符类型变量* for(int i=0;i<a.size();i++){//分析 if(a[i]=='*'||a[i]=='/'){//如果当前是符号位 ss<<num;//导入至ss ss>>num_;//导出至num_ if(now=='*'){//如果之前统计的符号位是* ans*=num_;//*前一个项 }else{//否则 ans/=num_;///前一个项 } ss.clear();//清空ss流 num="";//清空num now=a[i];//获取当前符号位 }else{//如果当前为数字位 num+=a[i];//统计当前数字位 } } ss<<num;//导入至ss ss>>num_;//导出至num_ if(now=='*'){//如果之前统计的符号位是* ans*=num_;//*前一个项 }else{//否则 ans/=num_;///前一个项 } ss.clear();//清空ss流 num="";//清空num return ans;//返回ans }
怎么样,学费了还是学会了?我们继续来看下一部分吧!
三、main函数详解
在main()函数里,重要的任务就是分离多项式,其实也很简单,以加,减符号为间隔就行,再注意一下细节就可以。
main代码:
int main(){//主函数开始 string s;//定义字符串类型变量s int ans_all=0;//定义整数类型变量ans_all string num;//定义字符串类型变量num cin>>s;//输入s的值 char now='+';//定义字符类型变量now并初始化赋值为+ for(int i=0;i<s.size();i++){//分离单项式 if(s[i]=='+'||s[i]=='-'){//如果当前位为+-符号 if(now=='+'){//如果之前统计的是+ ans_all+=math(num);//就加 num="";//清除num }else{//否则 ans_all-=math(num);//减 num="";//清除num } now=s[i];//统计符号 } else{//否则 num+=s[i];//统计数字位 } } if(now=='+'){//如果之前统计的是+ ans_all+=math(num);//加 num="";//清空,可省 }else{//否则 ans_all-=math(num);//减 num="";//清空,可省 } cout<<ans_all;//输出ans_all return 0;//主函数结束,返回0 }
四、完整AC代码
#include<iostream>//调用输入输出流头文件
#include<string>//调用字符串流头文件
#include<cstdio>//调用C语言输入输出头文件
#include<sstream>//调用字符串流头文件
using namespace std;//使用标准名字空间
int math(string a){//计算单项式头文件
stringstream ss;//定义字符串流ss
string num;//定义字符串类型变量num
int num_;//定义整数类型变量num_
int ans=1;//定义整数类型变量ans并初始化赋值为1
char now='*';//定义字符类型变量*
for(int i=0;i<a.size();i++){//分析
if(a[i]=='*'||a[i]=='/'){//如果当前是符号位
ss<<num;//导入至ss
ss>>num_;//导出至num_
if(now=='*'){//如果之前统计的符号位是*
ans*=num_;//*前一个项
}else{//否则
ans/=num_;///前一个项
}
ss.clear();//清空ss流
num="";//清空num
now=a[i];//获取当前符号位
}else{//如果当前为数字位
num+=a[i];//统计当前数字位
}
}
ss<<num;//导入至ss
ss>>num_;//导出至num_
if(now=='*'){//如果之前统计的符号位是*
ans*=num_;//*前一个项
}else{//否则
ans/=num_;///前一个项
}
ss.clear();//清空ss流
num="";//清空num
return ans;//返回ans
}
int main(){//主函数开始
string s;//定义字符串类型变量s
int ans_all=0;//定义整数类型变量ans_all
string num;//定义字符串类型变量num
cin>>s;//输入s的值
char now='+';//定义字符类型变量now并初始化赋值为+
for(int i=0;i<s.size();i++){//分离单项式
if(s[i]=='+'||s[i]=='-'){//如果当前位为+-符号
if(now=='+'){//如果之前统计的是+
ans_all+=math(num);//就加
num="";//清除num
}else{//否则
ans_all-=math(num);//减
num="";//清除num
}
now=s[i];//统计符号
}
else{//否则
num+=s[i];//统计数字位
}
}
if(now=='+'){//如果之前统计的是+
ans_all+=math(num);//加
num="";//清空,可省
}else{//否则
ans_all-=math(num);//减
num="";//清空,可省
}
cout<<ans_all;//输出ans_all
return 0;//主函数结束,返回0
}
总结
今天就到这里了,大家再见,这是我原创的,来之不易,好好理解一下吧。