二柱子2
一、问题描述:
一、要求:
1、题目避免重复
2、可定制(数量/打印方式)
3、可以控制下列参数:是否有乘除法,是否有括号,数值范围,加减有无负数,除法有无余数,是否支持分数(真分数假分数),
是否支持小数(精确到多少位),打印中每行的间隔。
二、问题分析:
问题一:题目避免重复
srand(time(NULL))函数;
问题二:可定制(数量/打印方式)
数量:将题目数量以数组的形式让用户输入;
打印方式:以用户的输入数字来选择打印方式,几行几列...;
问题三:可以控制:是否有乘除法、是否有括号、数值范围、加减有无负数、除法有无余数、是否支持分数(真假分数,、、、)
是否支持小数(精确带多少位)、打印中每行间隔可调整
在选则有无上述各种数,用数字0,1表示有无。
三、源代码:
#include<iostream> #include<stdlib> #include<time> using namespace std; void main( ) { srand(time(NULL));//避免题目重复 int i,j, x,y,t,b;//x,y表示两个数随机数,i表示题目的数量,t,b是在两个数相减中保证结果为正定义的变量 int a[7]; cout<<"请输入要打印的题目数:"<<endl; cin>>a[0]; while(a[0]<=0) //题目数必须为正数 { cout<<"请重新输入有效的题目数:"<<endl; cin>>a[0]; }; cout<<"请选择否有乘除法(是1;否0):"<<endl; cin>>a[1]; while((a[1]!=1)&&(a[1]!=0)) //只能选择1或0 { cout<<"请重新输入有效的数值:"<<endl; cin>>a[1]; }; cout<<"请输入运算数的范围:"<<endl; cin>>a[2]; while(a[2]<=0) //运算数必须为正数 { cout<<"请重新输入有效的范围:"<<endl; cin>>a[2]; }; cout<<"请选择结果有无负数(是1;否0):"<<endl; cin>>a[3]; while((a[3]!=1)&&(a[3]!=0)) //只能选择1或0 { cout<<"请重新输入有效的数值:"<<endl; cin>>a[3]; }; cout<<"请选择结果有无余数(是1;否0):"<<endl; cin>>a[4]; while((a[4]!=1)&&(a[4]!=0)) //只能选择1或0 { cout<<"请重新输入有效的数值:"<<endl; cin>>a[4]; }; cout<<"请输入要打印的列数: "<<endl; cin>>a[5]; while(a[5]<=0) { cout<<"请重新输入有效列数: "<<endl; cin>>a[5]; }; cout<<"请输入每行间隔数: "<<endl; cin>>a[6]; for(i=0;i<a[0];i++) { if(a[1]==1)//有乘除法的运算 { t=rand()%4; } else//无乘除法的运算 { t=rand()%2; } x=rand()%a[2]+1; y=rand()%a[2]+1; if(t==0)//加法 { if((i+1)%a[5]==0)//判断是否换行 { cout<<endl; if(a[6]!=0) { for(j=0;j<a[6];j++) { cout<<'\t'; } } } cout<<i+1<<"·"<<x<<"+"<<y<<"="<<endl; } if(t==1)//减法,考虑是否存在负数 { if(a[3]==0)//不存在结果负数 { b=x; x=y; y=b; } if(a[3]==1)//存在结果是负数 { } if((i+1)%a[5]==0)//判断是否换行 { cout<<endl; if(a[6]!=0)//如果间隔数不是零 { for(j=0;j<a[6];j++) { cout<<'\t'; } } } cout<<i+1<<"·"<<x<<"-"<<y<<"="<<endl; } if(t==2)//乘法 { if((i+1)%a[5]==0)//判断是否换行 { if(a[6]!=0) { cout<<endl; for(j=0;j<a[6];j++) { cout<<'\t'; } } } cout<<i+1<<"·"<<x<<"*"<<y<<"="<<endl; } if(t==3)//除法,考虑结果是否有余数 { if(a[4]==1)//结果有余数 {} else { while(x%y!=0)//不能整除,重新生成随机函数 { x=rand()%a[2]+1; y=rand()%a[2]+1; }; } if((i+1)%a[5]==0)//判断是否换行 { cout<<endl; if(a[6]!=0) { for(j=0;j<a[6];j++) { cout<<'\t'; } } } cout<<i+1<<"·"<<x<<"/"<<y<<"="<<endl; } } cout<<"结束,欢迎下次使用"<<endl; }
运行结果截图:
五、总结
在本次编程中,有很多小的问题,但是确实我们平时不注意的问题,本来最初的想法是一层一层函数的调用,但是调用函数学的不是很明白,所以造成很多错误,后来又想用if或者switch语句各种嵌套,但是又出现很多代码重复,虽然思路不难,但是没什么技术含量,最后我又分情况讨论,把各种限制条件加到加减乘除每种情况下,这样只是打印输出需要重复写,其余的限制条件就不必了。所以我知道每次编写程序前,必须做到胸中有沟壑,并把详情仔细的过滤下,从中找到最好的解决方案。
还有一点要改进当然地方是,列数总是输出不对,我就不截图了,以后会改进。
六、周活动总结表
项目计划总结 周活动总结表 姓名:张瑶 日期:2016/3/12 |
|||||||
任务 日期 |
听课 |
编程 |
阅读课外数目 |
锻炼身体 |
写老师留得作业 |
业余活动 |
日总计 (分钟) |
周日 |
|
100 |
30 |
|
|
|
130 |
周一 |
400 |
|
30 |
|
|
|
430 |
周二 |
200 |
|
30 |
|
60 |
|
290 |
周三 |
100 |
60 |
30 |
|
60 |
120 |
370 |
周四 |
200 |
30 |
30 |
|
40 |
|
300 |
周五 |
200 |
100 |
30 |
|
40 |
|
370 |
周六 |
|
40 |
30 |
|
40 |
120 |
230 |
阶段时间和效率 周数:1 |
|||||||
总计 |
60 |
415 |
410 |
370 |
420 |
490 |
230 |
平均 |
30 |
69 |
68 |
61 |
70 |
67 |
46 |
最大 |
30 |
400 |
200 |
100 |
200 |
200 |
60 |
最小 |
30 |
15 |
30 |
30 |
30 |
30 |
|
2,时间记录日志:
学生:张瑶 日期:2016/3/12
老师:王建民 课程:PSP
日期 |
开始时间 |
结束时间 |
中断时间 |
净时间 |
活动 |
备注 |
3/8 |
08:00 |
12:00 |
40 |
200 |
上课 |
|
14:30 |
15:30 |
|
60 |
构思程序 |
|
|
16:00 |
17:00 |
|
60 |
写作业 |
|
|
21:00 |
21:30 |
|
30 |
读构建之法 |
|
|
3/9 |
08:00 |
10:00 |
20 |
100 |
听课 |
|
11:00 |
12:00 |
|
60 |
编程 |
|
|
14:00 |
15:00 |
|
60 |
写作业 |
|
|
21:00 |
21:30 |
|
30 |
读构建之法 |
|
|
3/10 |
10:00 |
12:00 |
20 |
100 |
听课 |
|
14:00 |
14:30 |
|
30 |
编程 |
|
|
15:00 |
16:00 |
|
60 |
写作业 |
|
|
21:00 |
21:30 |
|
30 |
读构建之法 |
|
|
3/11 |
08:00 |
12:00 |
40 |
200 |
听课 |
|
14:00 |
15:40 |
|
100 |
编程 |
|
|
21:00 |
21:30 |
|
30 |
读构建之法 |
|
3,缺陷记录日志:
学生:张瑶 日期:2016/3/9
老师:王建民
日期 |
编号 |
类型 |
引入阶段 |
排除阶段 |
修复阶段 |
修复缺陷 |
3/8 |
1 |
001 |
编程 |
编译 |
15min |
|
描述:函数定义错误 |
||||||
2 |
002 |
编程 |
编译 |
10min |
|
|
描述:函数调用出现错误 |
||||||
3/9 |
3 |
003 |
编程 |
编译 |
2 |
|
描述:switch语句掌握不好 |
||||||
4 |
004 |
编程 |
编译 |
10min |
|
|
描述:输入时换行,导致错误 |
||||||
3/10 |
5 |
005 |
编程 |
编译 |
5min |
|
描述:输出混乱 |
||||||
3/11 |
6 |
006 |
编程 |
编译 |
5min |
|
描述: 在运行时,输出的格式不是按要求的输出的,原因是if语句插入的位置不正确
|