实现自动生成30道四则运算题目(3)

 
这周老师在前两周的基础上又增加了一些要求
1.可以判断答案的正确与否
2.程序必须能处理四则运算的混合算式
这次的作业我们封装了几个子函数,
1.随机数函数:把取值范围按最大最小值传递给函数就会返回一个符合要求的随机数(前两周的作业就已经存在随机数生成函数)
2.计算函数:把运算符和操作数传递给函数就会返回运算的的结果(根据运算需要新添加到的子函数)
3.题目生成函数:把要生成题目的要求传递给该函数就会返回一个符合要求的运算式
                      这个函数主要包括:运算式的输出,括号的运算,乘除的运算,加减的运算
主函数主要进行数据的输入和结果正确的判定
程序的主要思路还是用数组,3个数为一个单位,这次因为需要运算出得数,所以用了两个数组a,b。其中a为整型数组,b为double型数组,经过运算的得数因为有可能是小数所以用b来储存得数。
改程序的缺点
   1.目前还不支持分数的运算(思路是用结构体)
   2.两个连续的除法需要括号(思路是初始化数组完成后加判断语句增加括号时间原因暂时无法实现)
  1 #include<iostream>
  2 #include<string>
  3 #include<stdlib.h>
  4 #include<time.h>
  5 using namespace std;
  6 int randnum2(int min,int max)   //获得随机数
  7 {
  8    int ranum=0;
  9    ranum=rand(); 
 10    while(ranum>max)
 11    { 
 12       ranum%=max;//保证min<b<max
 13       if(ranum<min)
 14       {
 15         ranum=rand();
 16       }
 17    }
 18    return ranum;
 19 }
 20 double answer(int ope,double num1,double num2)
 21 {
 22     double ans=0;
 23     if(ope==0)
 24     {
 25         ans=num1+num2;
 26     }
 27     if(ope==1)
 28     {
 29         ans=num1-num2;
 30     }
 31     if(ope==2)
 32     {
 33         ans=num1*num2;
 34     }
 35     if(ope==3)
 36     {
 37         ans=num1/num2;
 38     }
 39     return ans;
 40 }
 41 double  question(int max,int min,int numam)
 42 {
 43     int a[100],i=2,j=0,num=0;
 44     double b[100];
 45     string str="+-*/";
 46     num=randnum2(i,numam);
 47     i=0;
 48     while(i<=num*3)                  // 初始化数组
 49     {
 50         a[i]=randnum2(min,max);
 51         b[i]=a[i];
 52         i++;
 53     }
 54     while(j<=num*3)
 55     {
 56         a[j]%=4;//运算符
 57         a[j+1]%=2;//括号
 58         if(a[j+1]==1)
 59         {
 60            a[j+4]=-1;
 61         }
 62         j+=3;
 63     } 
 64 
 65     //测试
 66     int t=0;
 67     //测试1111111111111111
 68     i=0;
 69     j=1; 
 70     while(j<=num*3)                            //输出式子
 71     { 
 72         if(a[j]==1&&j<num*3-3&&a[j+2]!=2&&a[j+2]!=3)cout<<"(";
 73         cout<<a[j+1];
 74         if(a[j-3]==1&&j>3&&a[j-1]!=2&&a[j-1]!=3)cout<<")";
 75         if(j<(num*3-3))cout<<str[a[j+2]];
 76         j+=3;
 77     }
 78     
 79     j=1;
 80     while(j<=num*3-3)                          //计算括号
 81     { 
 82         if(a[j]==1&&j<num*3-3&&a[j+2]!=2&&a[j+2]!=3)
 83         { 
 84            b[j+1]=answer(a[j+2],b[j+1],b[j+4]);
 85            a[j+1]=b[j+1];
 86            for(int i=j+2;i<num*3-3;i++)
 87            {
 88               a[i]=a[i+3];
 89               b[i]=b[i+3];  
 90            }
 91            num-=1;
 92         }
 93         j+=3;
 94     }
 95     j=1; 
 96     while(j<=num*3-3)                                //计算乘除
 97     { 
 98         if(a[j+2]==2||a[j+2]==3)
 99         {
100           
101            b[j+1]= answer(a[j+2],b[j+1],b[j+4]);
102            for(int i=j+2;i<num*3-3;i++)
103            {
104               a[i]=a[i+3];
105               b[i]=b[i+3];
106            }
107            num-=1;
108            j-=3;
109         }
110         j+=3;
111     }
112     j=1; 
113     double ans=0,m=0;
114     while(j<=num*3)
115     { 
116         m=b[j+1];
117         if(a[j+2]==1)
118         {
119              ans=ans-m;
120         }
121         else
122         {
123             ans=ans+m;
124         }
125         j+=3;
126     }
127     return ans;
128 }
129 int main()
130 {
131   int quam=5,max=9, min=3,numam=5;
132                 //输入生成题目的条件
133      cout<<"一共出几道题:";
134      cin>>quam;
135      cout<<"最多几个数(10个数之间):";
136      cin>>numam;
137      cout<<"数值范围:
最大值:";
138      cin>>max;
139      cout<<"最小值:";
140      cin>>min;
141                //结束输入生成题目的条件
142     int i=1;
143     double ansin;
144     while(quam--)                            //循环一次生成一道题
145     {
146      cout<<"No."<<i++<<":";   //题目计数器
147      double ans=question( max, min,numam);
148      cout<<"=";
149      cin>>ansin;
150      cout<<"你输入的数为:"<<ansin<<endl;
151      ansin=ansin-ans;
152      if(ansin<0)
153      {
154         ansin=-ansin;
155      }
156      if(ansin<0.1)
157      {
158          cout<<"good!!"<<endl;
159      }
160      else
161      {
162         cout<<"回答错误!!!正确答案为:"<<ans<<endl;
163      }
164   }
165   return 0;
166 }

实验结果:

1.生成3道最多5个数取值范围在2~9之间的四则运算式

2.生成3道最多6个数取值范围在4~9之间的四则运算式

六、PSP0级相关日志:

1、项目计划日志

周活动总结表

姓名:李晨                                                                    日期:3/19

日期任务

听课    

编写程序

阅读书本

考研复习

 安装软件

日总计  

周日

周一

周二

周三

周四

 300

 50

 30

 90

 80

 550

周五

 200

 60

 30

 290

周六

周总结

 500

 110

 60

 90

 80

 840

阶段时间和效率                                                                      周数:1

不包括上一周在内的累计时间                                                                

总计

    

    

    

    

    

平均

最大

最小

 以前各周的累计时间                                                                         

总计

500

110

60

90

80

840

平均

500

110

60

90 

80

840 

最大

500

110

60

90

80

840

最小

500 

110

60 

90 

80

840 

2、时间记录日志

学生:李晨                                                                     日期:3/19

教师:王建民                                                                      课程:PSP

日期

开始时间

结束时间

中断时间

净时间

活动

备注

3/19

08:00

12:00

40

200

听课

课间休息

14:00

15:50

10 

100

听课

课间休息

16:00

17:30

90

考研复习

18:30

20:00

10

80

安装软件

休息

20:10

21:00

50

编写程序

21:00

21:30

30

阅读

 3/20

08:00

12:00

40 

200

听课

课间休息 

14:30

15:40

10 

60

编写程序

休息、问题 

21:00

21:30

30 

阅读 

3、缺陷记录日志

学生:李晨                                                               日期:3/19

教员:王建民                                                                程序号:02

日期

编号

类型   

引入阶段

排除阶段

修复阶段

修复缺陷

3/19 

1

 001

 设计

编译 

20min

描述:判断语句位置错误

002 

编码

 编译

1min 

描述:使用数组之前没有定义

 3/20

 3

003 

设计

编译 

5min 

描述:计算数值的算式位置放错

注:结队开发组员:刘伟

     博客园地址:http://www.cnblogs.com/Lw-1573/ 

附:工作照

原文地址:https://www.cnblogs.com/jiajun1/p/5295364.html