差不多就这样子了,希望大家多多找出错误
目前同一级别括号只能支持100个,不算括号内的运算符号最多支持100个,要是想扩大你可以扩大number[]和fuhao[]的大小
可以使用小数,和负数,不过非表达式开头的负数请用括号括起来,没学过数据结构不会用笺只能写成这个德行了
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
double transform(char [],int );
void del(char* ,char *);
void del2(double [],int );
void convert(char [],char *,char *);
double jisuan(char []);
void main()
{
char str[100];
printf("IF you want to exit,press twice CTRL+Z will help you!!\n");
while(scanf("%s",str)!=EOF)
printf("%f\n",jisuan(str));
}
double jisuan(char str[])
{
char *p;
char ss[100]={'\0'},fuhao[100]={'\0'};
double number[100]={0.0},num[100]={0.0};
int kk=0,right,left,i,j=0,flag=0;
p=strchr(str,'(');
while(p!=NULL)
{
for(left=right=i=0;str[i]!='\0';i++)
{
if(str[i]=='(')left++;
if(str[i]==')')right++;
if(left==right&&left!=0)
{
convert(ss,++p,&str[i-1]);
number[kk++]=jisuan(ss);
*(--p)='q';
p++;
del(p,&str[i+1]);
left=right=0;
i=-1;
break;
}
}
p=strchr(str,'(');
}
if(str[0]=='-')
flag=1;
for(i=1,kk=0;str[i-1]!='\0';i++)
{
if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/'||str[i]=='\0')
{
if(str[i-1]!='q')
{
num[j]=transform(str,i);
fuhao[j++]=str[i];
}
else
{
num[j]=number[kk++];
fuhao[j++]=str[i];
}
}
}
if(flag)
{
num[0]=0-num[0];
flag=0;
}
for(i=0;fuhao[i]!='\0';i++)
{
if(fuhao[i]=='*'||fuhao[i]=='/')
{
if(fuhao[i]=='*')
num[i]*=num[i+1];
else
num[i]/=num[i+1];
del(&fuhao[i],&fuhao[i+1]);
del2(num,i+1);
i=-1;
}
}
for(i=0;fuhao[i]!='\0';i++)
{
if(fuhao[i]=='+'||fuhao[i]=='-')
{
if(fuhao[i]=='+')
num[i]+=num[i+1];
else
num[i]-=num[i+1];
del(&fuhao[i],&fuhao[i+1]);
del2(num,i+1);
i=-1;
}
}
return num[0];
}
void del(char *i,char *j)
{
for(i;*j!='\0';j++)
*(i++)=*j;
*i=*j;
}
void del2(double 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;
}
double transform(char str[],int j)
{
char temp[100]={'\0'};
int k=0,i;
i=j;
while(i--)
{
if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/')
break;
}
for(i++;i<j;i++)
temp[k++]=str[i];
return atof(temp);
}
自己没有测试过太复杂的数据,最复杂的就是这个了1.0+(-3.0)/2.0+((3.0-4.0)/2.0)
目前同一级别括号只能支持100个,不算括号内的运算符号最多支持100个,要是想扩大你可以扩大number[]和fuhao[]的大小
可以使用小数,和负数,不过非表达式开头的负数请用括号括起来,没学过数据结构不会用笺只能写成这个德行了
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
double transform(char [],int );
void del(char* ,char *);
void del2(double [],int );
void convert(char [],char *,char *);
double jisuan(char []);
void main()
{
char str[100];
printf("IF you want to exit,press twice CTRL+Z will help you!!\n");
while(scanf("%s",str)!=EOF)
printf("%f\n",jisuan(str));
}
double jisuan(char str[])
{
char *p;
char ss[100]={'\0'},fuhao[100]={'\0'};
double number[100]={0.0},num[100]={0.0};
int kk=0,right,left,i,j=0,flag=0;
p=strchr(str,'(');
while(p!=NULL)
{
for(left=right=i=0;str[i]!='\0';i++)
{
if(str[i]=='(')left++;
if(str[i]==')')right++;
if(left==right&&left!=0)
{
convert(ss,++p,&str[i-1]);
number[kk++]=jisuan(ss);
*(--p)='q';
p++;
del(p,&str[i+1]);
left=right=0;
i=-1;
break;
}
}
p=strchr(str,'(');
}
if(str[0]=='-')
flag=1;
for(i=1,kk=0;str[i-1]!='\0';i++)
{
if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/'||str[i]=='\0')
{
if(str[i-1]!='q')
{
num[j]=transform(str,i);
fuhao[j++]=str[i];
}
else
{
num[j]=number[kk++];
fuhao[j++]=str[i];
}
}
}
if(flag)
{
num[0]=0-num[0];
flag=0;
}
for(i=0;fuhao[i]!='\0';i++)
{
if(fuhao[i]=='*'||fuhao[i]=='/')
{
if(fuhao[i]=='*')
num[i]*=num[i+1];
else
num[i]/=num[i+1];
del(&fuhao[i],&fuhao[i+1]);
del2(num,i+1);
i=-1;
}
}
for(i=0;fuhao[i]!='\0';i++)
{
if(fuhao[i]=='+'||fuhao[i]=='-')
{
if(fuhao[i]=='+')
num[i]+=num[i+1];
else
num[i]-=num[i+1];
del(&fuhao[i],&fuhao[i+1]);
del2(num,i+1);
i=-1;
}
}
return num[0];
}
void del(char *i,char *j)
{
for(i;*j!='\0';j++)
*(i++)=*j;
*i=*j;
}
void del2(double 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;
}
double transform(char str[],int j)
{
char temp[100]={'\0'};
int k=0,i;
i=j;
while(i--)
{
if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/')
break;
}
for(i++;i<j;i++)
temp[k++]=str[i];
return atof(temp);
}
自己没有测试过太复杂的数据,最复杂的就是这个了1.0+(-3.0)/2.0+((3.0-4.0)/2.0)