• 像阿超那样,花20分钟写一个能自动生成小学四则运算题目的 “软件”,要求:除了整数以外,还要支持真分数的四则运算。


    四则运算的题目一般含有两个或两个以上运算符号及括号,可以计算出为一个数的结果。
    要求是判断输入的表达式是否正确,分母不能为零,括号的正确性,操作是否正确等。

    #include "stdafx.h"
    #include<iostream>
    #include<string.h>
    #include<stdlib.h>
    #include<fstream>
    using namespace std;
    class  calculator
    {
    public:
    calculator(char str1[100]);
    ~calculator();
     int check(char *c);
     void  move(char *f, double *s,int p);
     double convnum(char *c);
     double good(char *c);
     int print();
     char str[100];
    };
    calculator::calculator(char str1[100])
     {
       strcpy(str,str1);
    }
    calculator::~calculator()
    {
    }
    int calculator::check(char *c)
    {
     int k=0;
     int i=0;
     int len=strlen(c);
     while(*c!='')
     {
      if((*c>='0' && *c<='9') || *c=='+' ||
       *c=='-' || *c=='*' || *c=='/' ||
       *c=='.' || *c=='(' ||  *c==')' )
      {
      }
      else
      {
      cout<<"输入的表达式错误,请重新输入!"<<endl;
       return 0;
      }
           for(i=0;i<len;i++)
           {
             if(*c=='/'&&*(c+1)=='0')
             {
              cout<<"分母不能为零!"<<endl;
              return 0;
             }
           
          }
      if(*c=='(')
       k++;
      else if(*c==')')
       k--;
      c++;
     }
     if(k!=0)
     {
     cout<<"括号输入错误!"<<endl;
      return 0;
     }
     return 1;
    }
    void calculator::move(char *f, double *s,int p)
    {
     int i=0,len=strlen(f);
     for(i=p; i<len; i++)       
     {                     
      f[i]=f[i+1];
      s[i]=s[i+1];
     }
     s[i]=s[i+1];
     f[len-1]='';
     
    }
    double calculator::convnum(char *c)
    {
     double num=0.0;
     double a=1.0;
     int i=0,p=0,len=0;
     char temp[100];
     int tempi=0;
     int start=0;
     int f=1;
    len=strlen(c);
     
     if(c[0]=='-')
     {
      start=1;
      f=-1;
     }
     for(i=start; i<len; i++)
     {
      if(c[i]=='.')
      {
       p=i;
       break;
      }
      temp[tempi++]=c[i];
     }
     temp[tempi]='';
     
     if(p!=0)
     {
      for(i=p+1;i<len;i++)
     {
       if(c[i]=='.')
      {
       cout<<"小数点输入错误!"<<endl;
        exit(0);
       }
       a=a*0.1;
       num+=(a*(c[i]-48));
      }
     }
     a=1.0;
     len=strlen(temp);
     for(i=len-1;i>=0; i--)
     {
      num=num+(a*(temp[i]-48));
      a*=10;
     }
     
     num=num*f;
     return num;
    }
    double calculator::good(char *c)
    {                   
     char g[100],number[30];
     char f[80];
     int fi=0;
     double s[80];
     int si=0;
     int k=0;
     int num=0,i=0;
     int cc=0;
     int jj=0;
      while(*c!='')
        {
           num=0;
        k=0;

         switch(*c)
         {
         case '*':
         case '/':
         case '+':
         case '-':
               f[fi++]=*c;
         if(*c=='*'||*c=='/')
                    cc++;
         else
                 jj++;
         if(*(c-1)!=')')
         {
             number[i]='';
          i=0;
          s[si++]=convnum(number);
         }
                     break;
         case '(':
          k++;
          while(k>0)
          {
             c++;
          g[num]=*c;
          num++;
          if(*c==')')
          {
           k--;
          }
                         else if(*c=='(')
          {
             k++;
          }
          }
            g[num-1]='';
         num=0;
         s[si++]=good(g);
         break;
         default:
          number[i++]=*c;
          if(*(c+1)=='')
          {
             number[i]='';
          s[si++]=convnum(number);
          }
           break;
         }
             c++;
        }
     f[fi]='';
     i=0;
     while(cc>0)
     {
      switch(f[i])
      {
      case '*': cc--;
       s[i+1]=s[i]*s[i+1];
       move(f,s,i);
       break;
      case '/': cc--;
       s[i+1]=s[i]/(float)s[i+1];
       move(f,s,i);
       break;
      default:
       i++;
       break;
      }
     }
     i=0;
     while(jj>0)
     {
      switch(f[i])
      {
      case '+': s[i+1]=s[i]+s[i+1];
       jj--;
       move(f,s,i);
       break;
      case '-': s[i+1]=s[i]-s[i+1];
       jj--;
       move(f,s,i);
       break;
      default:
      cout<<"操作错误!"<<endl;
       break;
      }
     }
     
     return s[0];
    }
    int calculator::print()
    {
     double sum=0;
     sum=good(str);
     
    ofstream fout("text");
     if(!fout)
     {
      cout<<"打不开该文件!"<<endl;
        return 1;
     }

     fout<<"输入的表达式:"<<str<<endl;
     fout<<"sum="<<sum<<endl;
     fout.close();
     cout<<sum;
     cout<<endl;
     return 0;
    }
    void main()
    {
     char str1[100];
     int p=1;
     while(1)
     {
     cout<<"请输入表达式,退出请输入end!"<<endl;
     cin>>str1;
            p=strcmp(str1,"end");
      if(p==0)
       break;
      calculator A(str1);
      p=A.check(str1);
     
      if(p==0)
       continue;
      A.print();
     }
    cout<<"系统已退出"<<endl;
    }

  • 相关阅读:
    JDK源码之Thread 类分析
    java中符号类型和无符号类型的问题分析
    国内高速Maven仓库
    Idea Live Templates代码模板
    正则表达式
    java内存泄漏
    MySQL查看 InnoDB表中每个索引的高度
    ThreadLocalMap里Entry为何声明为WeakReference?
    Java JDBC中,MySQL字段类型到JAVA类型的转换
    MyBatis查询两个字段,返回Map,一个字段作为key,一个字段作为value的实现
  • 原文地址:https://www.cnblogs.com/ALIMAI2002/p/6700966.html
Copyright © 2020-2023  润新知