作业帮 > 综合 > 作业

如何用简单的C语言实现带有括号的四则运算

来源:学生作业帮 编辑:拍题作业网作业帮 分类:综合作业 时间:2024/04/29 09:13:38
如何用简单的C语言实现带有括号的四则运算
/>考虑复杂的表达式,不可能简单吧.
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>
void SplitK(char *str);
void SplitPrem(char *str);
void Combine(float f1,char Operate,float f2);
void StringBracket(char *str);
char str1[100],str2[100],str3[100],sub_str1[100],sub_str2[100],sub_str3[20];
char sub_str31[20],sub_str32[20],str_4[100],operate;
int pause=0,left=0,k1,k2,k3;
float f1=0.0,f2=0.0, f=0.0;
void main()
{
float temp;

printf("Please input a description :\n");
scanf("%s",&str1);
SplitK(str1);
temp=atof(str1);
printf("description value is %.2f\n",temp);
}
void SplitK(char *str)
{
int i,j,k,l,jk;
left=0;
while(*str) {
if(*str == '(') left++;
str++;
}
str2[0]='\0';
str3[0]='\0';
if(left>0)
{
StringBracket(str1);
j=strlen(str1);
for( i=0; i<j; i++)
{
if(str1[i]== '(')
{
jk=0;
for( k=i; k<j; k++)
{
if(str1[k]== ')') break;
for( l=i+1; l<k-1; l++)
{
if(str1[l]== '(')
}
}
if(jk==0)
{
 for(l=0; l<i; l++) str2[l]=str1[l];
 str2[i]='\0';
 for(l=k+1; l<j; l++) str3[l-k-1]=str1[l];
 str3[j-k-1]='\0';
 for(l=i+1; l<=k-1; l++) str1[l-i-1]=str1[l];
 str1[k-i-1]='\0';
 break;
}
}
}
}
SplitPrem(str1);
}
void SplitPrem(char *str)
{
int i,j,k,l;
f1=0.0;
f2=0.0;
pause=0;
strcpy(str1,str);
StringBracket(str1);
j=strlen(str1);
for( i=1; i<j-1; i++)
{
if((str1[i]=='*'||str1[i]=='/'))
{
strcpy(sub_str1," ");
strcpy(sub_str2," ");
strcpy(sub_str3," ");
strcpy(sub_str31," ");
strcpy(sub_str32," ");
operate=str1[i];
for( k1=i-2; k1>=0; k1--)
{
 if((str1[k1]=='*'||str1[k1]=='/'||str1[k1]=='+'||str1[k1]=='-'))
 {
 for( l=0; l<=k1; l++) sub_str1[l]=str1[l];
 sub_str1[k1+1]='\0';
 break;
 }
 }
for( k2=i+2; k2<j; k2++)
 {
 if((str1[k2]=='*'||str1[k2]=='/'||str1[k2]=='+'||str1[k2]=='-'))
 {
 for(l=k2; l<j; l++) sub_str2[l-k2]=str1[l];
 sub_str2[j-k2]='\0';
 break;
 }
 }
if(k1<0) k1=-1;
 for(l=k1+1; l<i; l++) sub_str31[l-k1-1]=str1[l];
 sub_str31[i-k1-1]='\0';
if(k2>j) k2=j;
 for(l=i+1; l<k2; l++) sub_str32[l-i-1]=str1[l];
 sub_str32[k2-i-1]='\0';
 f1=atof(sub_str31);
 f2=atof(sub_str32);
 Combine(f1,operate,f2);
}
if(pause==1) break;
}
j=strlen(str1);
for( i=1; i<j-1; i++)
{
if((str1[i]=='+'||str1[i]=='-'))
{
strcpy(sub_str1," ");
strcpy(sub_str2," ");
strcpy(sub_str3," ");
strcpy(sub_str31," ");
strcpy(sub_str32," ");
operate=str1[i];
 sub_str1[0]='\0';
 k3=0;
for( k2=i+2; k2<j-1; k2++)
 {
 if((str1[k2]=='+'||str1[k2]=='-'))
 {
 k3=1;
 for(l=k2; l<j; l++) sub_str2[l-k2]=str1[l];
 sub_str2[j-k2]='\0';
 break;
 }
 }
 for(l=0; l<i; l++) sub_str31[l]=str1[l];
 sub_str31[i]='\0';
if(k2>j) k2=j;
 if( k3==0) k2=j;
 for(l=i+1; l<k2; l++) sub_str32[l-i-1]=str1[l];
sub_str32[k2-i-1]='\0';
 f1=atof(sub_str31);
 f2=atof(sub_str32);
 Combine(f1,operate,f2);
}
if(pause==1) break;
}
strcpy(str_4,str2);
strcat(str_4,str1);
strcat(str_4,str3);
strcpy(str1,str_4);
StringBracket(str1);
j=strlen(str1);
str2[0]='\0';
str3[0]='\0';
for( i=0; i<j; i++)
{
if((str1[i]=='('))
{
 SplitK(str1);
 break;
}
}
for( i=0; i<j-1; i++)
{
if((str1[i]=='*'||str1[i]=='/'||str1[i]=='+'||str1[i]=='-'))
{
 k=1;
 if(str1[0]=='-')
 {
 k=0;
 for( l=1; l<j-1; l++)
 {
 if((str1[l]=='*'||str1[l]=='/'||str1[l]=='+'||str1[l]=='-'))
 {
 k=1;
 break;
 }
 }
 }
 if(k==0) break;
 if(k==1)
 {
 SplitPrem(str1);
 break;
 }
 }
}
}
void Combine(float f1,char Operate,float f2)
{
int i,j,k,l;
f=0.0;
switch (Operate) {
 case '+':
f=f1+f2;
break;
 case '-':
f=f1-f2;
break;
 case '*':
f=f1*f2;
break;
 case '/':
 if(f2!=0)
 f=f1/f2;
 break;
}
sprintf(sub_str3,"%5.3f",f);
strcpy(str1,sub_str1);
strcat(str1,sub_str3);
strcat(str1,sub_str2);
StringBracket(str1);
j=strlen(str1);
for( i=0; i<j-1; i++)
{
if((str1[i]=='*'||str1[i]=='/'||str1[i]=='+'||str1[i]=='-'))
{
 k=1;
 if(str1[0]=='-')
 {
 k=0;
 for( l=1; l<j-1; l++)
 {
 if((str1[l]=='*'||str1[l]=='/'||str1[l]=='+'||str1[l]=='-'))
 {
 k=1;
 break;
 }
 }
 }
 if(k==0) break;
 if(k==1)
 {
 SplitPrem(str1);
 break;
 }
}
}
pause=1;
strcpy(str_4,str2);
strcat(str_4,str1);
strcat(str_4,str3);
strcpy(str1,str_4);
str2[0]='\0';
str3[0]='\0';
StringBracket(str1);
j=strlen(str1);
for( i=0; i<j; i++)
{
if((str1[i]=='('))
{
 SplitK(str1);
 break;
 }
}
}
void StringBracket(char *str)
{
int i,j,len;
len=strlen(str);
j=0;
for(i=0; i<len; i++)
{
if(str[i]!=' ')
{
str[j]=str[i];
j=j+1;
}
}
str[j]='\0';
if(j>0 && str[j-1]=='.')
{
str[j-1]='\0';
j=j-1;
}
}