软件工程个人作业02
设计思路:
功能一:题目避免重复。
1、在原程序中将原程序的数据进行记录(三组数据用队列或者是栈);
2、从第二次循环开始将三项纪录依次与之前记录的数据进行比较(for循环?)
功能二:可定制。控制循环的次数
功能三:是否有乘除法:控制运算符
是否有括号:没有实现
数值范围:控制随机数的范围
有无负数:判断两个数值的大小,递归
除法有无余数:若规定无余数则生成随机数并判断是否符合要求,直到符合要求为止。
流程图:
程序源代码:
//可怜的二柱子同学,老师又对他的自动出题系统提出了新的要求 //This is a program of math operation 02 //2016/3/17 #include<iostream> #include<stdlib.h> #include<time.h> using namespace std; int a; int a1,a2; int b; int b1,b2; int item; int d; int p; int y; char c[4]; int main() { int g; cout<< "请输入您需要打印/输出的算式的个数:";//功能二:定制打印个数 cin>>g; //定制取值范围 int MAX,MIN; cout << "请输入算式中所允许数值范围的最大值:" ; cin>>MAX; cout << "请输入算式中所允许数值范围的最小值:"; cin>>MIN; //定制是否有乘除法 int m; cout << "是否允许有乘除法:1、允许;0、不允许"<<endl; cin>>m; //有无负数 int f; cout << "是否允许结果有负数:1、允许;0、不允许"<<endl; cin>>f; //除法有无余数 int cy; cout << "是否允许除法有余数:1、允许;0、不允许"<<endl; cin>>cy; srand((int)time(NULL)); c[0]='+'; c[1]='-'; c[2]='*'; c[3]='÷'; for(int i =1;i <= g;i++) { p = (0+rand()%2); if(m==1)//允许有乘除 { if(p == 0)//整数 { a = (MIN+rand()%MAX); y = (0 + rand()%4); if(y == 1) { b = (MIN+rand()%MAX); if(a<b) { item = a; b = a; b = item; } } if(y == 3) { b = (1 + rand()%MAX); if(a<b) { item = a; b = a; b = item; } if(cy == 0) { for(;i == 0;) { i = a%b; b = (1 + rand()%MAX); } } } else { b = (MIN + rand()%MAX); } cout << a << " " << c[y] << " " << b << " " << "="<<endl; } else //分数 { a1 = (MIN + rand()%MAX); a2 = (MIN + rand()%MAX); if(a1 > a2) { item = a1; a1 = a2; a2 = item; } y = (0 + rand()%3); if(y == 1) { b1 = (1 + rand()%MAX); b2 = (1 + rand()%MAX); if(b1>b2) { item = b1; b1 = b2; b2 = item; } if((b1/b2)>(a1/a2)) { int item1,item2; item1 = a1,a1 = b1,b1 = item1; item2 = a2,a2 = b2,b2 = item2; } } if(y == 3) { b1 = (1 + rand()%MAX); b2 = (1 + rand()%MAX); if(b1>b2) { item = b1; b1 = b2; b2 = item; } } else { b1 = (1+rand()%MAX); b2 = (1+rand()%MAX); if(b1>b2) { item = b1; b1 = b2; b2 = item; } } } for(int s = a1;s > 1;s--) { if(a1%s == 0 && a2%s == 0) { a1/=s; a2/=s; } } for(int s = b1;s > 1;s--) { if(b1%s == 0 && b2%s == 0) { b1/=s; b2/=s; } } cout << a1<<"/"<<a2<<" " <<c[y]<<" "<<" "<< b1 <<"/"<<b2 << " " <<"="<<endl; } else { if(p == 0)//整数 { a = (MIN+rand()%MAX); y = (0 + rand()%1); b = (MIN + rand()%MAX); if(y == 1) { //b = (MIN+rand()%MAX); if(a<b) { item = a; b = a; b = item; } } cout << a << " " << c[y] << " " << b << " " << "="<<endl; } else //分数 { a1 = (MIN + rand()%MAX); a2 = (MIN + rand()%MAX); if(a1 > a2) { item = a1; a1 = a2; a2 = item; } y = (0 + rand()%1); b1 = (1+rand()%MAX); b2 = (1+rand()%MAX); if(b1>b2) { item = b1; b1 = b2; b2 = item; } if((b1/b2)>(a1/a2)) { int item1,item2; item1 = a1,a1 = b1,b1 = item1; item2 = a2,a2 = b2,b2 = item2; } } for(int s = a1;s > 1;s--) { if(a1%s == 0 && a2%s == 0) { a1/=s; a2/=s; } } for(int s = b1;s > 1;s--) { if(b1%s == 0 && b2%s == 0) { b1/=s; b2/=s; } } cout << a1<<"/"<<a2<<" " <<c[y]<<" "<<" "<< b1 <<"/"<<b2 << " " <<"="<<endl; } } }
运行结果截图:
程序分析与反思:
在原来的程序上进行了分数的约分(分子分母同时除以一个数s若是可以除尽则将这个数约去,可以利用for循环,当s大于分子是便可以停止)。
要根据客观实际即客观需求,分子分母的大小问题,除法是否有余数等问题都应该想到。还有没有实现的功能以及控制运算项为几项的问题都应该尽快解决。
周活动总结表
姓名:黄丽萍
日期:3.19.2016
日期 任务 |
听课 |
编写程序 |
阅读课本 |
准备考试 |
|
|
日总计 |
周日 |
|
|
|
|
|
|
0 |
周一 |
100 |
90 |
30 |
|
|
|
220 |
周二 |
|
|
|
|
|
|
0 |
周三 |
|
|
|
|
|
|
0 |
周四 |
|
|
30 |
|
|
|
30 |
周五 |
|
120 |
|
|
|
|
120 |
周六 |
|
180 |
120 |
|
|
|
300 |
周总计 |
100 |
390 |
180 |
|
|
|
670 |
时间记录日志
学生:黄丽萍
教师:王建民老师
课程:PSP
日期 |
开始时间 |
结束时间 |
中断时间 |
净时间 |
活动 |
备注 |
C |
U |
3/14 |
9:35 |
9:50 |
0 |
15 |
设计思路 |
|
√ |
|
3/14 |
20:00 |
21:00 |
30 |
30 |
自己先思考补充 |
聊天了 |
√ |
|
3/15 |
19:00 |
19:30 |
0 |
30 |
小组讨论设计思路 |
|
√ |
|
3/17 |
21:00 |
21:30 |
0 |
30 |
阅读 |
|
√ |
|
3/18 |
19:00 |
21:00 |
0 |
120 |
编写程序 |
|
√ |
|
3/19 |
8:00 |
10:00 |
0 |
120 |
阅读 |
|
√ |
|
3/19 |
13:00 |
16:00 |
0 |
180 |
编写程序 |
|
√ |
|
学生:黄丽萍
老师:王建民老师
程序编号:02
日期:2016/3/19
日期 |
编号 |
类型 |
引入阶段 |
排除阶段 |
修复时间 |
修复缺陷 |
|||
3/14 |
02 |
忽略问题 |
此程序的上个版本 |
10min |
|||||
描述:未化简分子分母 |
|||||||||
3/19 |
02 | 命名问题 | 10 | ||||||
描述:命名不规范 |