软件工程个人作业03
Note:
/*
第一版为能自动生成30道小学四则运算题目,要求除了整数以外,还要支持假分数的四则运算。
这个是先把第一版的面向过程改成了面向对象,然后设计的第二版。
第二版的要求为:
1、题目避免重复;_
2、可定制(数量/打印方式);_
3、可以控制下列参数:
是否有乘除法;
是否有括号(最多可以支持十个数参与计算);
数值范围;
加减有无负数;
除法有无余数!
第二个版本的限制为最多出2000道题,用的宏定义
如果想要不重复,我需要把被除数和除数分别用数组表示,这样才能在后面用于比较是否重复。
在判断是否重复的时候,用的方法不是一次性判断第一个数并且第二个数并且符号都同时相等,这样比较每次需要比较三个;
我用的是,先判断第一个,如果和上面有重复的,那么比较第二个;如果第二个同时也重复了,那么比较符号。这样只有当上一个比较满足的时候,
才会比较后面的;否则后面的根本不需要比较,觉得可以简化比较过程。
关于这个程序的一个想法,不同于现在的编程思路:输出全部的条件,让用户选择。
然后根据条件,来随机出现选定的条件。比如是否有乘除法,有的话,就随机出现;没有的话,就不用出现。
大概是根据大一通讯录的添加,查询,删除之类的程序来的想法。
第三版
老师提出了新的要求:
1、学生写的程序必须能判定用户的输入答案是否正确,
例如程序输出:20 – 5 = ?用户输入15,那么程序就会反馈正确,然后继续出题。直到 30 道题目结束,程序最后告诉用户作对了几道题。
2、程序必须能处理四种运算的混合算式;
20 – 5 * 2 =? 正确答案是10.
20– 5 * 2 + 9 / 3 = ? 正确答案是13
注意:
连续的减法和除法,应该遵守左结合的规定。
连续除法要打括号,否则会引起歧义
程序只实现了第一个要求,能够判断用户结果的正确和错误数量。
*/
Main:
- /* 底云飞 2016.3.26 */
- #include <iostream>
- #include <time.h>
- #include <string>
- using namespace std;
- #define MAX 2000
- //显示有乘除法的运算题
- void show_multiplication()
- {
- //随机数dividend1和divisor1对应第一个随机数和第二个随机数,operate是用于四则运算的
- float dividend1[MAX],divisor1[MAX],operate[4]; //分别为第一个随机数,第二个随机数,运算符
- float result=0; //result是结果
- string fu; //运算符号
- int number=0,a=0,user_result=0,true_number=0,false_number=0;
- //number要生成多少道题 ,a用来给计数的,user_result用户输入的答案,true_number答题正确数量,false_number错误数量
- cout<<"要生成多少道题呢?";
- cin>>number;
- for(int i=1;;i++)
- {
- p: dividend1[i] = rand()%100;
- divisor1[i] = rand()%100;
- operate[i%4+1] = rand()%4+1; //生成第一二个随机数和随机运算符的代表数字
- for(int j=1;j<=i-1;j++)
- if(dividend1[i]==dividend1[j])
- if(divisor1[i]==divisor1[j])
- if(operate[i%4+1]==operate[j%4+1]) //判断是否重复
- goto p;
- if(operate[i%4+1]==1)
- {
- result=dividend1[i]+divisor1[i];
- fu = "+";
- }
- else if(operate[i%4+1]==2)
- {
- result=dividend1[i]-divisor1[i];
- fu = "-";
- }
- else if(operate[i%4+1]==3)
- {
- result=dividend1[i]*divisor1[i];
- fu = "*";
- }
- else if(operate[i%4+1]==4)
- {
- result=dividend1[i]/divisor1[i];
- fu = "/";
- } //直接用result把运算结果算出来,用于后面显示
- if(fu=="/"&&divisor1[i]==0) //如果除法时分母为0,则重新生成随机数
- goto p;
- cout<<a+1<<". "<<dividend1[i]<<fu<<divisor1[i]<<"=";
- cin>>user_result;
- if(user_result==result)
- {
- cout<<"答题正确。"<<endl;
- true_number++;
- }
- else
- {
- cout<<"答题错误。"<<endl;
- false_number++;
- }
- a++;
- if(a==number) //当达到指定数量时,结束
- {
- cout<<"正确数量为:"<<true_number<<" .错误数量为:"<<false_number<<endl;
- break;
- }
- } //for
- }
- //显示没有乘除法的运算题
- void show_nomultiplication()
- {
- //随机数dividend1和divisor1对应第一个随机数和第二个随机数,operate是用于四则运算的
- float dividend1[MAX],divisor1[MAX],operate[2]; //分别为第一个随机数,第二个随机数,运算符
- float result=0; //result是结果
- string fu; //运算符号
- int number=0,a=0,user_result=0,true_number=0,false_number=0;
- //number要生成多少道题 ,a用来给计数的,user_result用户输入的答案,true_number答题正确数量,false_number错误数量
- cout<<"要生成多少道题呢?";
- cin>>number;
- for(int i=1;;i++)
- {
- p: dividend1[i] = rand()%100;
- divisor1[i] = rand()%100;
- operate[i%2+1] = rand()%2+1;
- for(int j=1;j<=i-1;j++)
- if(dividend1[i]==dividend1[j])
- if(divisor1[i]==divisor1[j])
- if(operate[i%2+1]==operate[j%2+1])
- goto p;
- if(operate[i%2+1]==1)
- {
- result=dividend1[i]+divisor1[i];
- fu = "+";
- }
- else if(operate[i%2+1]==2)
- {
- result=dividend1[i]-divisor1[i];
- fu = "-";
- } //直接用result把运算结果算出来,用于后面显示
- cout<<a+1<<". "<<dividend1[i]<<fu<<divisor1[i]<<"=";
- cin>>user_result;
- if(user_result==result)
- {
- cout<<"答题正确。"<<endl;
- true_number++;
- }
- else
- {
- cout<<"答题错误。"<<endl;
- false_number++;
- }
- a++;
- if(a==number) //当达到指定数量时,结束
- {
- cout<<"正确数量为:"<<true_number<<" .错误数量为:"<<false_number<<endl;
- break;
- }
- } //for
- }
- //显示假分数运算题
- void showimproperfraction()
- {
- //int dividend1[MAX],divisor1[MAX],operate[4]; //分别为被除数,除数和运算符
- float dividend1[MAX], divisor1[MAX], dividend2[MAX], divisor2[MAX], operate[MAX];
- float result; //计算之后的结果
- string fu; //计算符号
- int number=0,b=0,user_result=0,true_number=0,false_number=0;
- //number要生成多少道题 ,b用来给计数的,user_result用户输入的答案,true_number答题正确数量,false_number错误数量
- cout<<"需要生成几个假分数的四则运算?";
- cin>>number;
- cout<<"下面是生成的"<<number<<"个假分数四则运算:"<<endl;
- cout<<"个数 "<<"随机次数 "<<"题目"<<endl;
- for(int i=1;;i++)
- {
- q: dividend1[i] = rand()%100;
- divisor1[i] = rand()%100;
- dividend2[i] = rand()%100;
- divisor2[i] = rand()%100;
- operate[i%4+1] = rand()%4+1;
- for(int j=1;j<=i-1;j++)
- if(dividend1[i]==dividend1[j])
- if(divisor1[i]==divisor1[j])
- if(dividend2[i]==dividend2[j])
- if(divisor2[i]==divisor2[j])
- if(operate[i%4+1]==operate[j%4+1])
- goto q;
- if(divisor1[i]>=dividend1[i]&&divisor2[i]>=dividend2[i]&÷nd1[i]!=0&&divisor1[i]!=0) //判断是真分数并且分母不能为0
- {
- if(operate[i%4+1]==1)
- {
- result=(divisor1[i]/dividend1[i])+(divisor2[i]/dividend2[i]);
- fu = "+";
- }
- else if(operate[i%4+1]==2)
- {
- result=(divisor1[i]/dividend1[i])-(divisor2[i]/dividend2[i]);
- fu = "-";
- }
- else if(operate[i%4+1]==3)
- {
- result=(divisor1[i]/dividend1[i])*(divisor2[i]/dividend2[i]);
- fu = "*";
- }
- else if(operate[i%4+1]==4)
- {
- result=(divisor1[i]/dividend1[i])/(divisor2[i]/dividend2[i]);
- fu = "/";
- }
- cout<<b+1<<". "<<i<<". "<<"("<<divisor1[i]<<"/"<<dividend1[i]<<")"<<fu<<"("<<divisor2[i]<<"/"<<dividend2[i]<<")=";
- cin>>user_result;
- if(user_result==result)
- {
- cout<<"答题正确。"<<endl;
- true_number++;
- }
- else
- {
- cout<<"答题错误。"<<endl;
- false_number++;
- }
- b++;
- }//判断是两个真分数的if条件语句
- if(b==number) //当达到真分数数量要求时,停止
- {
- cout<<"正确数量为:"<<true_number<<" .错误数量为:"<<false_number<<endl;
- break;
- }
- }//for
- }
- void main()
- {
- int fenshuflag,chengchuflag;
- srand((unsigned)time(0)); //用时间做随机种子,随机数发生器
- cout<<"需要有乘除法吗?需要输入1,不需要输入0:"<<endl;
- cin>>chengchuflag;
- if(chengchuflag==1)
- show_multiplication(); //带有乘除法的运算
- else
- show_nomultiplication(); //不带有乘除法的运算
- //假分数的四则运算
- cout<<"需要生成假分数的四则运算吗(需要输入1,不需要输入0)?:";
- cin>>fenshuflag;
- if(fenshuflag==1)
- showimproperfraction();
- else if(fenshuflag == 0)
- exit(1);
- }