如何用C语言实现多个操作数的基本四则运算

(输入字符串,进行识别,按照先乘除后的加减的运算法则,输出结果)

#include <stdlib.h>
#include <math.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>

void SplitPrem(char *str);
float Combine();

char str[200],str1[200],str2[50][30],operate_c[50],sub_str[30];
int operate_2str[50];
int strnum=0,operatenum=0; /* 子字符串个数,操作符个数 */
int i,j,k,flag;
float f=0.0,str_f[50];

void main()
{
float temp;

printf("请输入一个字符串表达式:\n");
gets(str);
strcpy(str1,str);
SplitPrem(str1);
temp=Combine();
printf("%s=%g\n",str,temp);
}
/* 分解为子字符串和操作符 */
void SplitPrem(char *str1)
{

j=strlen(str1);
sub_str[0]=str1[0];
k=1;
for( i=1; i<j; i++)
{
if(str1[i]=='*'||str1[i]=='/'||str1[i]=='+'||str1[i]=='-')
{
sub_str[k]=0;
strcpy(str2[strnum],sub_str);
operate_c[operatenum]=str1[i];
operate_2str[operatenum]=strnum;
strnum++;
operatenum++;
k=0;
}
else
{
sub_str[k]=str1[i];
k++;
}
}
if(k>0)
{
sub_str[k]=0;
strcpy(str2[strnum],sub_str);
strnum++;
}
for( i=0; i<strnum; i++)
str_f[i]=atof(str2[i]); /* 字符串转化为浮点数 */
}
/*先计算乘除,后计算加减,每计算一次,子字符串和操作符向前移动 */
float Combine()
{
while(1)
{
flag=0;
for( i=0; i<operatenum; i++)
{
if(operate_c[i]=='*'||operate_c[i]=='/')
{
if(operate_c[i]=='*')
{
f=str_f[operate_2str[i]]*str_f[operate_2str[i]+1];
str_f[operate_2str[i]]=f;
for( j=i; j<operatenum-1; j++)
{
operate_c[j]=operate_c[j+1];
operate_2str[j]=operate_2str[j+1]-1;
}
for( j=operate_2str[i]+1; j<strnum-1; j++)
str_f[j]=str_f[j+1];
operatenum=operatenum-1;
strnum=strnum-1;
flag=1;
}
else
{
f=str_f[operate_2str[i]]/str_f[operate_2str[i]+1];
str_f[operate_2str[i]]=f;
for( j=i; j<operatenum-1; j++)
{
operate_c[j]=operate_c[j+1];
operate_2str[j]=operate_2str[j+1]-1;
}
for( j=operate_2str[i]+1; j<strnum-1; j++)
str_f[j]=str_f[j+1];
operatenum=operatenum-1;
strnum=strnum-1;
flag=1;
}
}
}
if(flag==0)break;
}

while(1)
{
flag=0;
for( i=0; i<operatenum; i++)
{
if(operate_c[i]=='+'||operate_c[i]=='-')
{
if(operate_c[i]=='+')
{
f=str_f[operate_2str[i]]+str_f[operate_2str[i]+1];
str_f[operate_2str[i]]=f;
for( j=i; j<operatenum-1; j++)
{
operate_c[j]=operate_c[j+1];
operate_2str[j]=operate_2str[j+1]-1;
}
for( j=operate_2str[i]+1; j<strnum-1; j++)
str_f[j]=str_f[j+1];
operatenum=operatenum-1;
strnum=strnum-1;
flag=1;
}
else
{
f=str_f[operate_2str[i]]-str_f[operate_2str[i]+1];
str_f[operate_2str[i]]=f;
for( j=i; j<operatenum-1; j++)
{
operate_c[j]=operate_c[j+1];
operate_2str[j]=operate_2str[j+1]-1;
}
for( j=operate_2str[i]+1; j<strnum-1; j++)
str_f[j]=str_f[j+1];
operatenum=operatenum-1;
strnum=strnum-1;
flag=1;
}
}
}
if(flag==0)break;
}
return f;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-12-30
以前见过这么一个程序,挺复杂的。
相似回答