C/C++完成简单二元计算式功能
1、首先建立一个程序的整体框架:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int compute(const char*,int*);//函数声明
int main()
{
char buf[30];//输入的存储空间
printf("Please input:\n>");
gets(buf);
int result;//计算结果
int state=compute(buf,&result);//调用函数
if(state==0)
printf("The result is %d.\n",result);//输出结果
else if(state==-1)
printf("The format your input is wrong!\n");
system("pause");
return 0;
}
其中包括计算函数的声明,该compute函数主要完成输入字符串的转换以及计算。buf[30]用来存储输入字符串,result用于存放计算结果。
2、完成compute函数的编写,完整的函数如下:
int compute(const char* str,int* res)
{
int num1=0;
int num2=0;
int num=0;
int computeSign=0;
int computeSignStart=0;
char sign;
while(1)
{
if(*str>='0'&&*str<='9')
{
num=num*10+*str-'0';
computeSignStart=1;
}
else if(*str=='+'||*str=='-'||*str=='*'||*str=='/'||*str==0)
{
if(*str=='+'||*str=='-'||*str=='*'||*str=='/')
sign=*str;
if(computeSignStart)
{
computeSign++;
computeSignStart=0;
}
if(computeSign==1)//第一个操作数
{
num1=num;
num=0;
}
else if(computeSign==2)//第二个操作数
{
num2=num;
num=0;
}
if(*str==0)
break;
}
else if(*str!=' ')
{
return -1;
}
str++;
}
switch(sign)
{
case'+':*res=num1+num2;break;
case'-':*res=num1-num2;break;
case'*':*res=num1*num2;break;
case'/':*res=num1/num2;break;
}
return 0;
}
首先定义几个变量,num1用于存储第一个计算数,num2用于存储第二个计算数,num用于暂存从字符串中截取出来的计算数,然后根据标志赋值给两个计算数,computeSignStart用于标志是否截取的数字,computeSign用于标志是第几个计算数,sign用于存储操作数。
3、下面的while循环主要用于从字符串中提取出两个操作数和操作符,同时忽略空格,如果输入的字符串中有错误的字符程序将会返回。
思路是:
1.如果是连续的数字,程序将会转化为数字并存放在num中,同时将computeSignStart置为1,表示已经记录到数字。
4、2.如果不是数字而是操作符或者是字符串结束符,则判断将操作符存储在sign,然后如果已记录到数字,再根据computeSign判断是第几个操作数,然后赋值给它,如果是结束符则程序推出。
5、3.如果是除空格外的其它字符程序返回并报错。
6、最后根据操作数和操作符计算出结果并返回,这里采用的是swith语句。
7、运行结果演示如下。