include
#include
#define LEN 100
#define FLOAT 30///这两个参数控制表达式最大长度
unsigned char left;
unsigned char right;///括号起始和结束
int opverify( char*s)///检查运算符是否有错误的函数
{
unsigned char i,flagl=0,flagr=0;
int a;
for(i=0;i
{
if(s[i]==43||s[i]==45)
{
flagr=0;
for(a=i+1;a
{
if(s[a]==46||(s[a]>=48&&s[a]<=57)||s[a]==40)
{
flagr=1;
break;
}
if(s[a]==42||s[a]==47||s[a]==41)
{
return i;
}
}
if(flagr==0)
return i;
}
if(s[i]==42||s[i]==47)
{
flagl=0;flagr=0;
for(a=i-1;i>=0;a--) ///左边有数字
{
if(s[a]==46||(s[a]>=48&&s[a]<=57)||s[a]==41)
{
flagl=1;
break;
}
if(s[a]==42||s[a]==47||s[a]==40)
{
return i;
}
}
for(a=i+1;a
{
if(s[a]==46||(s[a]>=48&&s[a]<=57)||s[a]==40)
{
flagr=1;
break;
}
if(s[a]==42||s[a]==47||s[a]==41)
{
return i;
}
}
if(flagl==0||flagr==0)
return i;
}
}
return -1;
}
int dotverify( char*s)///检查小数点是否有错误的函数
{
unsigned char i,dotcount,numcount;
for(i=0;i
{
if(s[i]==46||(s[i]>=48&&s[i]<=57))
{
dotcount=0;
numcount=0;
while(1)
{
if(s[i]==46)
{
dotcount++;
i++;
continue;
}
if(s[i]>=48&&s[i]<=57)
{
numcount++;
i++;
continue;
}
break;
}
if(dotcount>1||numcount==0)
{
while(s[i]!=46)
i--;
return i;
}
}
}
return -1;
}
int kuohaoverify( char*s)///检查括号是否有错误的函数
{
unsigned char i;
char wrongposition=0;
int flag=0;
for(i=0;i
{
if(i>0)
if(s[i-1]==40&&s[i]==41)
return wrongposition;
if(s[i]==40)
flag++;
if(s[i]==41)
flag--;
if(flag<0)
return wrongposition;
if(s[i]!=0)
wrongposition++;
}
if(flag==0)
return -1;
return wrongposition;
}
int kuohaolocater( char*s)///定位内层配对括号起点和终点
{
unsigned char i;
for(i=0;i
{
if(s[i]==40)
left=i;
if(s[i]==41)
{
right=i;
return 1;
}
}
return 0;
}
void convert( char*s,float*num)///原始字符串分离成运算符和编号数组+浮点数组
{
int source=LEN-1,target=LEN-2;
unsigned char count=0;
while(s[source]==0)
source--;
count=target-source;
while(source>=0)
{
s[target]=s[source];
target--;
source--;
}
for(source=0;source
s[source]=0;
source=count;target=0;count=0;
while(source
{
if(s[source]==46||(s[source]>=48&&s[source]<=57))
{
num[count]=(float)atof(s+source);
s[target]=48+count;
count++;
source++;
target++;
while(s[source]==46||(s[source]>=48&&s[source]<=57))
source++;
continue;
}
if(s[source]==41&&(s[source+1]==46||(s[source+1]>=48&&s[source+1]<=57)))
{
s[target]=s[source];
target++;
source++;
s[target]=42;
target++;
continue;
}
if(s[source]==40&&(s[source-1]==46||(s[source-1]>=48&&s[source-1]<=57)))
{
s[target]=42;
target++;
}
s[target]=s[source];
target++;
source++;
}
for(source=target;source
s[source]=0;
}
void signprocess(char *s,float*num)///运算符处理函数,负责处理符号以及处理一些不标准的写法
{
unsigned char flagl;
int a,i;
for(i=right;i>=left;i--)
{
if(s[i]==43||s[i]==45)
{
flagl=0;
for(a=i-1;a>=left;a--) ///zuobianyoushuzi
{
if(s[a]>=48)
{
flagl=1;
break;
}
if(s[a]>=40&&s[a]<=47)
{
break;
}
}
if(flagl==0)
{
if(s[i]==43)
s[i]=0;
if(s[i]==45)
{
s[i]=0;
for(a=i+1;;a++)
if(s[a]>=48)
{
num[s[a]-48]=-num[s[a]-48];
break;
}
}
}
}
}
}
void multipledivide(char *s,float*num)///乘除法计算函数
{
unsigned char i,flagl,flagr,a;
for(i=left+1;i
{
if(s[i]==42||s[i]==47)
{
for(a=i+1;;a++)
if(s[a]>=48)
{
flagr=s[a]-48;
break;
}
for(a=i-1;;a--)
if(s[a]>=48)
{
flagl=s[a]-48;
break;
}
if(s[i]==42)
{
num[flagr]=num[flagl]*num[flagr];
s[a]=0;
s[i]=0;
}
if(s[i]==47)
{
num[flagr]=num[flagl]/num[flagr];
s[a]=0;
s[i]=0;
}
}
}
}
void addminus(char*s,float*num)///加减法计算函数
{
unsigned char i,flagl,flagr,a;
for(i=left+1;i
{
if(s[i]==43||s[i]==45)
{
for(a=i+1;;a++)
if(s[a]>=48)
{
flagr=s[a]-48;
break;
}
for(a=i-1;;a--)
if(s[a]>=48)
{
flagl=s[a]-48;
break;
}
if(s[i]==43)
{
num[flagr]=num[flagl]+num[flagr];
s[a]=0;
s[i]=0;
}
if(s[i]==45)
{
num[flagr]=num[flagl]-num[flagr];
s[a]=0;
s[i]=0;
}
}
}
}
void singlecacu(char*s,float*num)///中间层运算函数,不带括号的计算函数,可以处理无括号的表达式
{
signprocess(s,num);
printf("***正负号处理完毕***\n");
multipledivide(s,num);
printf("***乘除完毕***\n");
addminus(s,num);
printf("***加减完毕***\n");
if(s[left]==40)
{
printf("***去括号***\n");
s[left]=0;
}
if(s[right]==41)
s[right]=0;///每次计算都将被处理的运算数、运算符、括号抹掉并在原位值写入本次计算结果,这样表达式越来越简。
}
void caculate (char*s,float*num)///顶层运算函数,循环调用括号查找和无括号计算函数,直到把括号消完
{
while(kuohaolocater(s))
singlecacu(s,num);
left=0;right=LEN-1;
singlecacu(s,num);
}
void display(char*s,float*num)///显示最终结果
{
unsigned char i;
for(i=0;i
if(s[i]>=48)
{
printf("结果:%f",num[s[i]-48]);
break;
}
}
int main()///注意不要使用中文括号和小数点
{
char wrongposition;///表达式错误位置
unsigned char i;
char s[LEN];///STEP1:初始化部分开始
for(i=0;i
{
s[i]=0;
}
float num[FLOAT];
for(i=0;i
{
num[i]=0;
}///初始化部分结束
printf("输入表达式\n");
scanf("%s",s);
///STEP2:表达式查错开始
wrongposition=kuohaoverify(s);
if(kuohaoverify(s)!=-1)
{
printf("括号错误\n位置:%d\n",wrongposition);
return 0;
}
printf("括号检查完毕\n");
wrongposition=dotverify(s);
if(dotverify(s)!=-1)
{
printf("小数点错误\n位置:%d\n",wrongposition);
return 0;
}
printf("小数点检查完毕\n");
wrongposition=opverify(s);
if(opverify(s)!=-1)
{
printf("运算符错误\n位置:%d\n",wrongposition);
return 0;
}
printf("运算符检查完毕\n");
///表达式查错部分结束
///STEP3:开始处理表达式,数据与运算符分离
convert(s,num);
printf("%s\n",s);
for(i=0;i
printf("%f ",num[i]);
printf("\n***数据与运算符分离完毕***\n");
printf("\n");
///表达式处理完成
///STEP4:开始计算
caculate(s,num);
display(s,num);
return 0;
}