找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5076|回复: 0
收起左侧

C语言 用数组实现了计算器的加减乘除运算并且已经成功支持小数点

[复制链接]
ID:379586 发表于 2018-7-26 19:37 | 显示全部楼层 |阅读模式
#define N   100
#define L   100
//可加减乘除的计算器
  void Make_Calculate(void)
{
  float  str[N]={ 2,3,'+',5,7, '+',20,'/',4,'/',5,'+',11,'*',80,'*',40,'/',13,'-',20,'/',2,'*',2,'/',6,'+',5,'='}; //将要运算的东西放入数组
  float  str1[L];
  u16 i,j,k=0;
  float a=1,b=1;

  for(i=0;i<N;i++)
  {
          
                   j++;
     if(str[i]=='+'  )
     {

         switch(j-1)
         {
                 
                 case 1: str1[k]=str[i-1]; k++; str1[k]='+'; k++;  break;
                 case 2: str1[k]=str[i-2]*10+str[i-1]; k++;  str1[k]='+'; k++;  break;
             case 3: str1[k]=str[i-3]*100+str[i-2]*10+str[i-1]; k++;  str1[k]='+'; k++; break;
             case 4: str1[k]=str[i-4]*1000+str[i-3]*100+str[i-2]*10+str[i-1]; k++; str1[k]='+'; k++; break;
         }
       j=0;         

         }
         else  if(str[i]=='-')
     {

         switch(j-1)
         {
                 case 1: str1[k]=str[i-1]; k++; str1[k]='-'; k++;  break;
                 case 2: str1[k]=str[i-2]*10+str[i-1]; k++;  str1[k]='-'; k++;   break;
             case 3: str1[k]=str[i-3]*100+str[i-2]*10+str[i-1]; k++;  str1[k]='-'; k++; break;
             case 4: str1[k]=str[i-4]*1000+str[i-3]*100+str[i-2]*10+str[i-1]; k++; str1[k]='-'; k++; break;
         }
       j=0;         

         }
          else  if(str[i]=='*')
     {

         switch(j-1)
         {
                 case 1: str1[k]=str[i-1]; k++; str1[k]='*'; k++;  break;
                 case 2: str1[k]=str[i-2]*10+str[i-1]; k++;  str1[k]='*'; k++;   break;
             case 3: str1[k]=str[i-3]*100+str[i-2]*10+str[i-1]; k++;  str1[k]='*'; k++; break;
             case 4: str1[k]=str[i-4]*1000+str[i-3]*100+str[i-2]*10+str[i-1]; k++; str1[k]='*'; k++; break;
         }
       j=0;         

         }
        else if(str[i]=='/')
     {

         switch(j-1)
         {
                 case 1: str1[k]=str[i-1]; k++; str1[k]='/'; k++;  break;
                 case 2: str1[k]=str[i-2]*10+str[i-1]; k++;  str1[k]='/'; k++; break;
             case 3: str1[k]=str[i-3]*100+str[i-2]*10+str[i-1]; k++;  str1[k]='/'; k++; break;
             case 4: str1[k]=str[i-4]*1000+str[i-3]*100+str[i-2]*10+str[i-1]; k++; str1[k]='/'; k++; break;
         }
       j=0;         

         }
         
         
         
        else  if(str[i]=='=')
                 {           
  //   printf("%d",j);
         switch(j-1)
         {
                 case 1: str1[k]=str[i-1]; k++; str1[k]='=';     break;
                 case 2: str1[k]=str[i-2]*10+str[i-1]; k++;  str1[k]='=';  break;
             case 3: str1[k]=str[i-3]*100+str[i-2]*10+str[i-1]; k++;  str1[k]='=';  break;
             case 4: str1[k]=str[i-4]*1000+str[i-3]*100+str[i-2]*10+str[i-1]; k++; str1[k]='=';  break;
         }
       j=0;         

                 }
          

  }

//以下内容是将数组str1 里面的乘法和除法运算的数消掉全部变成只带加减运算符的数
  j=0;k=0;
  for(i=0;i<N;i++)
  str[i]=0;          //清空数组重复利用

  for(i=0;i<N;i++)
  {
     if( str1[i]=='+' || str1[i]=='-' )
         {
            str[j]=str1[i-1];
                j++;
            str[j]=str1[i];
                j++;
         }
    else  if(str1[i]=='*')
    {
        if( (i-2>0) && str1[i-2]=='/' ) a=b/str1[i-1]; //前一个数必须是存在的且是除法运算符         目的是将乘号前面的除法运算符的结果算出来
                                                   //应为连续的除法运算并没有放入数组而是存入变量b               
        else     a =str1[i-1]*a;                        //不然就连续将带乘法运算符的数算成一个数
            if( str1[i+2]=='+' || str1[i+2]=='-' )
                {  
                        a =str1[i+1]*a;      //将加号之前的乘法运算结合
                    str[j]=a;           //将乘积放入数组
                    j++;
                        str[j]=str1[i+2];  //将加或减法运算符放入数组
            j++;
            i=i+2;
            a=1;b=1;k=0;                        //说明除法运算已到尽头记得将除积和乘积清掉       
                }

            else if( str1[i+2]=='=' ) //如果连乘碰到‘=’运算符就说明运算筛选结束了
                {
                    a =str1[i+1]*a;      //将加号之前的乘法运算结合
                    str[j]=a;  
                    j++;
                        str[j]=str1[i+2];                               
            break;               
               
                }
                               
        }

        else  if(str1[i]=='/')
    {
                if( (i-2>0) && str1[i-2]=='*' ) b=a*str1[i-1];
            else  if(k==1)   b /=str1[i-1];  
            else  if(k==0)  {b =str1[i-1]; k=1;}  
               
                if( str1[i+2]=='+' || str1[i+2]=='-' )
                {  
                        b /=str1[i+1];      //将加号之前的除法运算结合
                    str[j]=b;
                    j++;
                        str[j]=str1[i+2];
            j++;
            i=i+2;
            b=1;a=1;k=0;                  //说明除法运算已到尽头记得将除积和乘积清掉               
                }

            else if( str1[i+2]=='=' )
                {
                    b /=str1[i+1];      //将加号之前的除法运算结合
                    str[j]=b;  
                    j++;
                        str[j]=str1[i+2];               
            break;               
               
                }
                               
        }
          else  if(str1[i]=='=')  //如果连除碰到‘=’运算符就说明运算筛选结束了
      {
                 str[j]=str1[i-1];
                j++;
            str[j]=str1[i];
            break;
          
          
          }

  }
/******************当不确定时可以看看自己的数对不对*******************/
//    printf("**********\n");   
//    printf("%5.2f\n",str[0]);
//    printf("%5.2f\n",str[2]);   
//    printf("%5.2f\n",str[4]);
//    printf("%5.2f\n",str[6]);
//    printf("%5.2f\n",str[8]);
  /*********************/
  //将数组剩下的数进行加减运算  
    a=0;
  for(i=0;i<N;i++)
  {
    if( str[i]=='+' )  
    {
        if( i-2<0 )   a= str[i-1]+str[i+1];      
        else          a +=str[i+1];
        }
       
       
        else if( str[i]=='-' )
        {       
     if( i-2<0 )   a= str[i-1]-str[i+1];
         else          a -=str[i+1];
        }
       
        else if( str[i]=='=' )
        {
           printf("%5.2f\n",a); //输出结果
           break;
        }


  }

  for(i=0;i<N;i++)
  str[i]=0;          //清空数组重复利用

}


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表