参考文章:
https://blog.csdn.net/u011692041/article/details/49796343
https://blog.csdn.net/u011692041/article/details/49799145
/*
使用递归实现计算器
*/
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
//公式分割函数
char *splitcrp(char *content,int m,int n)//取出m到n-1
{
int i=m;
int j=0;
static char temp[50];
for(i;i<n;i++)
{
temp[j++]=content[i];
}
temp[j]='\0';
return temp;
}
//递归函数计算公式,运算符分类处理
double splitform(char *content)
{
int i=0;
int j=0;
int n=strlen(content);//字符个数
char contemp[50];//中转数组,有括号时需要两次平级调用content,不能用指针,数据必须拿出来
int p=0;//指定字符下标
int pl=-1;//最后一个左括号位置
int pt=0;左括号后第一个右括号
double d=0; //存放括号内的计算结果
char dtemp[50];//括号内的计算结果转换为字符串形式
while(i<n)
{
contemp[j++]=content[i++];
}
contemp[j]='\0';
//分离括号部分,找到最后一个左括号,然后找到对应的右括号
pl=strrchr(content,'(')-content;//最后一个左括号
if(pl>-1)
{
for(i=pl;i<n;i++)
{
if(content[i]==')')//左括号后第一个右括号
{
pt=i;
break;
}
}
d=splitform(splitcrp(content,pl+1,pt));//计算括号内的值
gcvt(d,10,dtemp);//括号内结果转化为字符型
//将括号内的值重新放入公式中,返回递归函数
return splitform(strcat(splitcrp(contemp,0,pl),strcat(dtemp,splitcrp(content,pt+1,n))));
}
//strchr从前向后找字符,返回值是地址
//strrchr从后向前找字符,返回值是地址
//分离‘+’两边公式,从前向后,找到第一个'+'号
if(strchr(content,'+')!=0)
{
p=strchr(content,'+')-content;
return splitform(splitcrp(content,0,p))+splitform(splitcrp(content,p+1,n));
}
//分离‘-’两边公式,从后向前,找到最后一个'-'号
//if(strrchr(content,'-')!=0)
if((strrchr(content,'-')!=0)&&(strrchr(content,'-')-content)!=0)
{
p=strrchr(content,'-')-content;
return splitform(splitcrp(content,0,p))-splitform(splitcrp(content,p+1,n));
}
//分离‘*’两边公式,从前向后,找到第一个'*'号
if(strchr(content,'*')!=0)
{
p=strchr(content,'*')-content;
return splitform(splitcrp(content,0,p))*splitform(splitcrp(content,p+1,n));
}
//分离‘/’两边公式,从后向前,找到最后一个'/'号
if(strrchr(content,'/')!=0)
{
p=strrchr(content,'/')-content;
return splitform(splitcrp(content,0,p))/splitform(splitcrp(content,p+1,n));
}
//返回浮点型数值
return atof(content);
}
//主函数
void main()
{
char num[50];
double result=0;//保存计算结果
while(1)
{
//输入公式
scanf("%s",&num);//接收输入的公式以字符串形式
//调用递归函数
result=splitform(num);//公式代入递归函数
//输出结果
printf("计算结果=%f\n",result);//输出结果
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)