软件工程个人作业02------即01的升级版本
程序要求:
第二版的要求为:
1、题目避免重复;
2、可定制(数量/打印方式);
3、可以控制下列参数:
是否有乘除法;
是否有括号(最多可以支持十个数参与计算);
数值范围;
加减有无负数;
除法有无余数!
设计思路:
先把第一版的面向过程,改成面向对象的设计,要不然不容易改。
第一个要求为不重复,需要把第一二个随机数分别用数组表示,这样在后面比较的时候,才能在 第一二个随机数组里面和前面的进行比较。
如果想要不重复,我在判断是否重复的时候,用的方法不是一次性判断第一个数并且第二个数并且符号都同时相等,这样比较每次需要比较三个。
for(int j=1;j<=i-1;j++)
if(dividend1[i]==dividend1[j] && divisor1[i]==divisor1[j] && operate[i%4+1]==operate[j%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])
比较的时候,每生成一个新的,就和前面所有已经生成过的进行一次比较,用for的嵌套实现。
假分数的做法和上面的整数做法基本雷同。
程序做的不如意的地方就是:整数和假分数是有共同的代码段的,他们从某种角度来看是可以合并的,或者是用另外一个函数来封装共同代码段,然后在整数和假分数里面分别进行调用就可以,但是程序当中并没有实现。
关于乘除法这部分,只有整数部分实现了,假分数部分没有做,不过就是把假分数部分的乘除法去掉即可,与整数部分没区别。
关于这个程序的一个想法,不同于现在的编程思路:输出全部的条件,让用户选择。
然后根据条件,来随机出现选定的条件。比如是否有乘除法,有的话,就随机出现;没有的话,就不用出现。
大概是根据大一通讯录的类的添加,查询,删除之类的程序来的想法。
源代码:
- /* 底云飞 2016.3.19 */
- #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 a=0; //a用来给计数的
- int number=0; //要生成多少道题
- 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]<<"="<<result<<endl;
- a++;
- if(a==number) //当达到指定数量时,结束
- break;
- } //for
- }
- //显示没有乘除法的运算题
- void show_nomultiplication()
- {
- //随机数dividend1和divisor1对应第一个随机数和第二个随机数,operate是用于四则运算的
- float dividend1[MAX],divisor1[MAX],operate[2]; //分别为第一个随机数,第二个随机数,运算符
- float result=0; //result是结果
- string fu; //运算符号
- int a=0; //a用来给计数的
- int number=0; //要生成多少道题
- 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]<<"="<<result<<endl;
- a++;
- if(a==number) //当达到指定数量时,结束
- break;
- } //for
- }
- //显示假分数运算题
- void showimproperfraction()
- {
- //int dividend1[MAX],divisor1[MAX],operate[4]; //分别为被除数,除数和运算符
- float dividend1[MAX], divisor1[MAX], dividend2[MAX], divisor2[MAX], operate[MAX];
- int number,b=0; //number用来输入几个假分数的运算,b用来计数,查看是否到达number个
- float result; //计算之后的结果
- string fu; //计算符号
- 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]<<")="<<result<<endl;
- b++;
- }//判断是两个真分数的if条件语句
- if(b==number) //当达到真分数数量要求时,停止
- 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);
- }
程序感想:
程序的众多功能并没有实现,原因还是在于自己的懒惰,觉得这个程序比较难,就没有想去做了,所以一时之间又不能实现所有功能。
程序有的部分自己有想法,但是并没有体现在程序中,做的和自己设想的还是相差好多。