写了两个小时写的很粗陋,只能计算整数,但是可以支持多级别括号,和同一级别的多个括号。
希望大家多多指教,这个题目其实很有意思,要是大家有兴趣,可以把功能做的更加全面,比如算次方什么的
#include<stdio.h>
#include<string.h>
#include<math.h>
void del(char* ,char *);
void del2(int [],int );
void convert(char [],char *,char *);
int jisuan(char []);
int num[100]={0};
void main()
{
char str[100];
int i;
printf("IF you want to exit,CTRL+Z will help you!!\n");
while(EOF!=scanf("%s",str))
{
printf("%d\n",jisuan(str));
for(i=0;i<100;i++)
num[i]=0;
}
}
int jisuan(char str[])
{
char *p;
char ss[100]={'\0'};
char fuhao[20]={'\0'};
int number[20]={0};
int kk=0,k,l,i,j=0,end=0,jj,wei=0;
p=strchr(str,'(');
while(p!=NULL)//查找str中的括号,并且优先处理,直到没有为止,
{
for(k=l=i=0;str[i]!='\0';i++)
{
if(str[i]=='(')k++;//这里是匹配多个括号,大家列个式子就能找到规律
if(str[i]==')')l++;
if(k==l&&k!=0)//第n个'('是和第'n'个')'匹配的
{
convert(ss,++p,&str[i-1]);//把括号中的字符传递出来处理
number[kk++]=jisuan(ss);//处理括号中的字符
num[0]=0;
*(--p)='q';//原来str中的括号位置用'q'来标志
p++;
del(p,&str[i+1]);//删除处理过的括号内容
k=l=0;
i=-1;
break;
}
}
p=strchr(str,'(');//继续查找括号
}
kk=0;
for(i=0;str[i]!='\0';i++)//这里我自己都觉得很没有条理,大家多花点时间
{
if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/')
{
if(str[i-1]!='q')
{
for(jj=i-1,wei=0;jj>=end;jj--)
{
num[j]+=(str[jj]-'0')*(int)pow(10,wei++);
}
end=i+1;//end记录的是最后数字的位子,比如说“123”end记录的应该是2的位置
fuhao[j++]=str[i];
}
else
end=i+1;
}
if(str[i]=='q')
{
num[j]=number[kk++];//遇到第几个q就把number中的第机个元素传递给num
end=i+2;
fuhao[j++]=str[i+1];
}
}
if(str[i-1]!='q')//这里是考虑到数组的结尾有没有处理的数据
{ //比如说字符串"1+2+q+3"按照上面的处理最后就还有一个'3'没处理
for(--i,wei=0;i>=end;i--)
{
num[j]+=(str[i]-'0')*(int)pow(10,wei++);
}
}
for(jj=0;fuhao[jj]!='\0';jj++)//开始进行计算这时候原来有括号的式子
{ //已经简化为没有括号的式子
if(fuhao[jj]=='*'||fuhao[jj]=='/')//先乘除
{
if(fuhao[jj]=='*')//参与第jj个符号计算的数据是num[]中的第jj个和第jj+1
{
num[jj]*=num[jj+1];
}
else
{
num[jj]/=num[jj+1];
}
del(&fuhao[jj],&fuhao[jj+1]);
del2(num,jj+1);
jj=-1;
}
}
for(jj=0;fuhao[jj]!='\0';jj++)
{
if(fuhao[jj]=='+'||fuhao[jj]=='-')
{
if(fuhao[jj]=='+')
{
num[jj]+=num[jj+1];
}
else
{
num[jj]-=num[jj+1];
}
del(&fuhao[jj],&fuhao[jj+1]);
del2(num,jj+1);
jj=-1;
}
}
return num[0];
}
void del(char *i,char *j)
{
for(i;*j!='\0';j++)
{
*(i++)=*j;
}
*i=*j;
}
void del2(int num[],int i)
{
for(;i<100;i++)
{
num[i]=num[i+1];
}
}
void convert(char ss[],char *p,char *q)
{
int i=0;
char *pp;
for(pp=p;pp<=q;pp++)
{
ss[i++]=*pp;
}
}
刚开始偷了个懒,把number[]和num[] 设置成为int型,所以精度只能做到整数,其次还不能处理 小数和负数,
如果大家有兴趣就替小弟我改一下,提示一下要是想处理负数和小数在做字符串转换成数字的时候建议用atoi;
免的用什么pow10(),等我作业写完了自己在来改一下