项目要求:输入一行字符数量不超过80的四则运算表达式,字符中所有的数都是一位整数,在不考虑运算符优先级的情况下,计算该表达式的最后的值。(除法仅考虑整除)
在实现该计算器之前,我理清楚了几个关键点:
1.用什么数据类型存储表达式?
答:长度为80的字符数组。
2.如何将数字字符转成数字?
答:若有一数字字符ch,那么该字符可通过ch-48或者ch-‘0’即可转成数字。
那么该如何进行表达式的运算呢?根据项目要求,我们不妨把长的四则运算表达式想象成是由一个简单的四则运算表达式逐渐整体放大形成长的表达式,可以用下面这个图来理解:
好了,那么我们就必不可少的需要写两个函数来帮助完成这个V1.0版本的四则计算器。
首先是数字字符转数字的函数:
/*
函数功能:将数字字符转换成数字
*/
int Toint(char ch)
{
int re;
re=ch-'0';
return re;
}
然后就是实现两个操作数之间的运算的函数:
/*
函数功能:传入两个操作数a和b,还有一个操作符ch
返回a与b之间进行ch运算后的结果
*/
int Calculate(int a,char ch,int b){
int res;
switch(ch)
{
case '+':
res=a+b;
break;
case '-':
res=a-b;
break;
case '*':
res=a*b;
break;
case '/':
res=a/b;
break;
}
return res;
}
接下来就要在主函数中来写代码了。
下面是完整的实现代码:
#include<stdio.h>
#include<string.h>
/*
函数功能:传入两个操作数a和b,还有一个操作符ch
返回a与b之间进行ch运算后的结果
*/
int Calculate(int a,char ch,int b){
int res;
switch(ch)
{
case '+':
res=a+b;
break;
case '-':
res=a-b;
break;
case '*':
res=a*b;
break;
case '/':
res=a/b;
break;
}
return res;
}
/*
函数功能:将数字字符转换成数字
*/
int Toint(char ch)
{
int re;
re=ch-'0';
return re;
}
int main()
{
char a[80]; //定义一个长度为80的字符数组a
int sum,i; //定义一个sum用来储存运算结果,i是循环控制变量
gets(a); //输入一串字符,将这串字符赋值给字符数组a
sum=Toint(a[0]);//让sum先存储第一个出现的操作数
/*
因为我们一开始已经拿到了第一个操作数了,
所以我们从第二个操作数开始进行循环。
因此i的初值为2。
并且根据表达式的字符规律可知,每次i步进
2之后,其i-1就是对应的运算符。
*/
for(i=2;i<strlen(a);i+=2)
{
//调用Calculate函数进行运算
sum=Calculate(sum,a[i-1],Toint(a[i]));
}
//输出结果
printf("%d",sum);
return 0;
}
我们把刚刚的表达式例子拿出来验证一下:
可以看到完成了表达式的运算。
特别注意,该代码仅支持一位数的表达式运算!
过一段时间再更新支持多位数的表达式运算的算法。