算术表达式计算C实现

需求:有两个数组一个是待计算的数值数组,一个是计算符号数组。例如:1+2-3*4/5将其中数值按顺序存入一个数值数组,将计算符号按顺序存入另一个符号数组。根据两个数组的内容计算出算术表达式的结果。

想法:根据符号提取两个相邻的数值数组数据进行计算。问题是涉及到了不同优先级的计算符号,想法是优先处理乘除运算,在处理加减运算。在乘除运算中,待计算的数A和数B,结果存入数B,数A清0,并将符号修改为加号(也可以不改变)。进行完第一轮的乘除运算后,只需要在做加减运算。减法运算需要注意,数A与数B做减法,如果数B为0那么就将数B设为下一个待计算的数值,直到数B不等于0为止。做加法运算则直接将数A与数B相加。数A与数B加减运算的结果存入数B。最后表达式计算结果为数B。


代码实现:

#include <stdio.h>


int main(void)
{
float n[]={1,2,3,4,5};
char p[]={'+','-','*','/'};
int i=0,l;   /*数值数组与符号数组的索引均为i,l用于跳过0*/


l = sizeof(n)/4;         /*sizeof()函数返回的数据结构占据的 字节数,int类型数组占4个字节。因此数值数组的长度需要再除以4*/
for(i=0;i<l-1;i++){
 if(p[i] == '*')                      /*乘法运算,将计算结果放在n[i+1],n[i]清0,p[i]改为加号*/
 {
    n[i+1] = n[i]*n[i+1];
    n[i] = 0;
    p[i] = '+';
 }
 else if(p[i] == '/'){                        /*除法运算类同于乘法*/
 n[i+1] = n[i]/n[i+1];
 n[i] = 0;
         p[i] = '+';
      }
 else 
continue;             /*加减法直接跳过*/
}
float tmp=0;                    /*暂存数据n[i]*/
for(i=0;i<l-1;i++){
if(p[i] == '-')                  /*减法运算,遇到n[i+1]=0需要继续跳到下一个数,此时也跳过了下一个符号(+)的运算*/
{
  tmp = n[i];
  while(1){
    if(n[i+1] == 0)
       i++;
    else
       break;
  }
  n[i+1] = tmp-n[i+1];
}
if(p[i] == '+')                /*加法运算直接相加*/
n[i+1] = n[i]+n[i+1];
}
printf("%f\n",n[i]);           /*表达式计算结果*/
return 0;
}

在Ubuntu运行结果:


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值