像阿超那样,花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!='\0')
 {
  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]='\0';
 
}
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]='\0';
 
 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!='\0')
    {
       num=0;
    k=0;

     switch(*c)
     {
     case '*':
     case '/':
     case '+':
     case '-':
           f[fi++]=*c;
     if(*c=='*'||*c=='/')
                cc++;
     else
             jj++;
     if(*(c-1)!=')')
     {
         number[i]='\0';
      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]='\0';
     num=0;
     s[si++]=good(g);
     break;
     default:
      number[i++]=*c;
      if(*(c+1)=='\0')
      {
         number[i]='\0';
      s[si++]=convnum(number);
      }
       break;
     }
         c++;
    }
 f[fi]='\0';
 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;
}

posted @ 2017-04-12 19:39  Starry*sky  阅读(323)  评论(0编辑  收藏  举报