一、问题描述:
一、要求:
1、题目避免重复
2、可定制(数量/打印方式)
3、可以控制下列参数:是否有乘除法,是否有括号,数值范围,加减有无负数,除法有无余数,是否支持分数(真分数假分数),
是否支持小数(精确到多少位),打印中每行的间隔。
二、问题分析:
问题一:题目避免重复
srand(time(NULL))函数;
问题二:可定制(数量/打印方式)
数量:将题目数量以数组的形式让用户输入;
打印方式:以用户的输入数字来选择打印方式,几行几列...;
问题三:可以控制:是否有乘除法、是否有括号、数值范围、加减有无负数、除法有无余数、是否支持分数(真假分数,、、、)
是否支持小数(精确带多少位)、打印中每行间隔可调整
在选则有无上述各种数,用数字0,1表示有无。
三、源代码:
#include<iostream.h>
#include<stdlib.h>
#include<time.h>
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<<' ';
}
}
}
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<<' ';
}
}
}
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<<' ';
}
}
}
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<<' ';
}
}
}
cout<<i+1<<"·"<<x<<"/"<<y<<"="<<endl;
}
}
cout<<"结束,欢迎下次使用"<<endl;
}
运行结果截图:
五、总结
在本次编程中,有很多小的问题,但是确实我们平时不注意的问题,本来最初的想法是一层一层函数的调用,但是调用函数学的不是很明白,所以造成很多错误,后来又想用if或者switch语句各种嵌套,但是又出现很多代码重复,虽然思路不难,但是没什么技术含量,最后我又分情况讨论,把各种限制条件加到加减乘除每种情况下,这样只是打印输出需要重复写,其余的限制条件就不必了。所以我知道每次编写程序前,必须做到胸中有沟壑,并把详情仔细的过滤下,从中找到最好的解决方案。
还有一点要改进当然地方是,列数总是输出不对,我就不截图了,以后会改进。
六、周活动总结表
项目计划总结 周活动总结表 姓名:唐仙迪 日期:2015/3/15 |
|||||||
任务 日期 |
听课 |
编程 |
阅读课外数目 |
锻炼身体 |
写老师留得作业 |
业余活动 |
日总计 (分钟) |
周日 |
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,时间记录日志:
学生:唐仙迪 日期:2015/3/15
老师:王建民 课程:PSP
日期 |
开始时间 |
结束时间 |
中断时间 |
净时间 |
活动 |
备注 |
3/10 |
08:00 |
12:00 |
40 |
200 |
上课 |
|
14:30 |
15:30 |
60 |
构思程序 |
|||
16:00 |
17:00 |
60 |
写作业 |
|||
21:00 |
21:30 |
30 |
读梦断代码 |
|||
3/11 |
08:00 |
10:00 |
20 |
100 |
听课 |
|
11:00 |
12:00 |
60 |
编程 |
|||
14:00 |
15:00 |
60 |
写作业 |
|||
21:00 |
21:30 |
30 |
读梦断代码 |
|||
3/12 |
10:00 |
12:00 |
20 |
100 |
听课 |
|
14:00 |
14:30 |
30 |
编程 |
|||
15:00 |
16:00 |
60 |
写作业 |
|||
21:00 |
21:30 |
30 |
读梦断代码 |
|||
3/13 |
08:00 |
12:00 |
40 |
200 |
听课 |
|
14:00 |
15:40 |
100 |
编程 |
|||
21:00 |
21:30 |
30 |
读梦断代码 |
3,缺陷记录日志:
学生:唐仙迪 日期:2015/3/15
老师:王建民
日期 |
编号 |
类型 |
引入阶段 |
排除阶段 |
修复阶段 |
修复缺陷 |
3/10 |
1 |
001 |
编程 |
编译 |
15min |
|
描述:函数定义错误 |
||||||
2 |
002 |
编程 |
编译 |
10min |
||
描述:函数调用出现错误 |
||||||
3/11 |
3 |
003 |
编程 |
编译 |
2 |
|
描述:switch语句掌握不好 |
||||||
4 |
004 |
编程 |
编译 |
10min |
||
描述:输入时换行,导致错误 |
||||||
3/12 |
5 |
005 |
编程 |
编译 |
5min |
|
描述:输出混乱 |
||||||
3/13 |
6 |
006 |
编程 |
编译 |
5min |
|
描述: 在运行时,输出的格式不是按要求的输出的,原因是if语句插入的位置不正确 |