四则运算计算器

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
double add(double cd[],char cf[],int cn);
main()
{
  char cmp[255];
  double total;
  char x;
  int n=0;
  printf("input to compuer:");
  gets(cmp);
  if (computer(cmp,&total))
    printf("the resust=%f",total);
  else
    printf("input error!");
  getch();
}


computer(char cmp[],double *total)
{
  char   cf[100];
  double cd[100];
  int cn,i;
  cn=readcmp(cmp,cd,cf);
  if (cn>0)
    {
     *total=add(cd,cf,cn);
     return 1;
    
    }
  else
    return 0;
}

//----内部过程------------------------ 
readcmp(char cmp[],double cd[],char cf[])
{
  /*读取字符=>X
  是加减乘除吗?
    是的
     将数字字符转成数字->存入cd[]
     数组序列号+1
     数字串清空
     将符号存入cf[]
  否是0,1,2,3,4,5,6,7,8,9,吗?
     是
        空格标志是2.
        是 非法返回
        否 加入数字串
       
  否是空格吗?
     是 .数字串是空的吗?
        是 空格标志为2
        否 空格标志为1
  否
     非法字符,返回.     
       
       
  */
  char strdigit[100],x;
  int digitn=0,i,cn=0,spaceflag=0,diaoflag=0;
  cf[0]='+';
  for (i=0;cmp[i]!='/0';i++)
  {
   x=cmp[i];
   if (x=='+'||x=='-'||x=='*'||x=='/')
     {
       if (digitn==0)
        { 
         if (x=='-' && cn==0)
           {
             strdigit[digitn]=x;
             strdigit[digitn+1]='/0';
             digitn++;
           }
          else
            return 0;  
         }
           
       else
         {
           cd[cn]=atof(strdigit);
           cn++;
           digitn=0;
           spaceflag=0;
           diaoflag=0;
           cf[cn]=x;
         } 
     } 
   else if (x>='0' && x<='9')
     {
       if (spaceflag==2)
       {
         return 0;
       }
       else
       {
         strdigit[digitn]=x;
         strdigit[digitn+1]='/0';
         digitn++;
        
       }
     }
    else if (x=='.')
     {
       if (diaoflag==1)
        return 0;
       else
          {
            diaoflag=1;
            strdigit[digitn]=x;
            strdigit[digitn+1]='/0';
            digitn++;
          }
     }     
    else if (x==' ')
       {
         if (digitn>0)
           spaceflag=2;
         else
           spaceflag=1;
       }
    else
       return 0;
 }
 
 
 if (digitn>0)
  {
    cd[cn]=atof(strdigit);
    cn++;
    return cn; 
  }              
}       


double add(double cd[],char cf[],int cn)  //cd[]存放数字组,cf[]存放操作数,cn为操作符数
{
  double total;    //存放结果
  int i;           //循环变量
   //分类数字->数字数组和操作符->操作符数组
 
  for(i=1;i<cn;i++)             //第一个循环计算乘除的值
  if (cf[i]=='*' || cf[i]=='/') //分析操作符是否是乘或除?
  {
                                //是的话
     if (cf[i]=='*')            //分析是乘的话
        cd[i]=cd[i-1]*cd[i];    //当前数=上一个数*当前数
     else
        cd[i]=cd[i-1]/cd[i];    //否则 //当前数=上一个数/当前数
       
        cf[i]=cf[i-1];          //->当前操作为上一操作符
        cd[i-1]=0;                //上一个的数字为零
  }       
 
  total=0;                      //总数=第一个数,   
  for(i=0;i<cn;i++)             //计算加减值
  {
    if (cf[i]=='+')             // 分析操作数是否是'+'
       total=total+cd[i];       //是 //总数=总数+当前数
     else
      total=total-cd[i];        //否 //  总数=总数-当前数
   }
   return total;                //返回总数值.
}    

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值