一、题目要求
我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求:
- 能够自动生成四则运算练习题
- 可以定制题目数量
- 用户可以选择运算符
- 用户设置最大数(如十以内、百以内等)
- 用户选择是否有括号、是否有小数
- 用户选择输出方式(如输出到文件、打印机等)
- 最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)
二、角色说明
这次我担任的是驾驶员角色,负责代码的编写,我的队友是袁琳,负责代码审查。
三、部分代码说明
源代码地址
1.带小数的随机算式的生成
void suijip(int n,int m,int lenth,int b[])//带小数的随机算式的生成
{
FILE *fp;//建立一个文件操作指针
fp=fopen("1.txt","w");//以追加的方式建立或打开1.txt,默认位置在你程序的目录下面
srand((unsigned)time(NULL));
int i;//生成第i行算式
int l;
int len;//随机算式长度
double a[50];//用小数数组代表生成的算式
for( i=0;i<n;i++)
{
len=rand()%9+3;
int j;
j=len%2;//判断随机生成的数组的第j位是否为算符位
if(j==0)
len=len-1;
for(j=0;j<len;j++)
{
a[j]=rand()/(double)(RAND_MAX/m);//生成数组
}
for(j=0;j<len;j++)
{
if(j%2!=0)
{
if((((int)a[j])%4)==3)
Divisorp(&a[j+1],m);//保证除数不为0
}
}
for(j=0;j<len;j++)
{
if(j%2!=0)
{
for(l=0;l<lenth;l++)
{
if((int)a[j]==b[l])
{
Symbol((int)a[j],fp);//生成的算符符号老师要求
break;
}
}
if(l>=lenth)
{
int chong,m=0;
while(1)//生成符合老师要求的算符
{
chong=rand()%4;
for(l=0;l<lenth;l++)
{
if(chong==b[l])
{
m=1;
Symbol(chong,fp);
break;
}
}
if(m==1)
{
break;
}
}
}
}
else
{
if((((int)(a[j]*10))%10)==0)//若生成的为整数,则强制转换为整数输出
{
fprintf(fp,"%d",(int)a[j]);
}
else
{
fprintf(fp,"%.1lf",a[j]);//输出随机生成的算数
}
}
}
fprintf(fp,"=\n");
}
fclose(fp);
}
2.不带小数的随机算式的生成
void suiji(int n,int m,int lenth,int b[])//不带小数的随机算式的生成
{
FILE *fp;//建立一个文件操作指针
fp=fopen("1.txt","w");//以追加的方式建立或打开1.txt,默认位置在你程序的目录下面
srand((unsigned)time(NULL));
int i;//生成第i行算式
int l;//老师需要的第l个算符
int len;//随机算式长度
int a[50];//用数组代表生成的算式
for( i=0;i<n;i++)
{
len=rand()%9+3;
int j=len%2;
if(j==0)
len=len-1;
for(j=0;j<len;j++)
{
a[j]=rand()%m;//生成数组
}
for(j=0;j<len;j++)//规范算符格式
{
if(j%2!=0)
a[j]=a[j]%4;
if(a[j]==3)
Divisor(&a[j+1],m);//除数不为0
}
for(j=0;j<len;j++)
{
if(j%2!=0)
{
for(l=0;l<lenth;l++)
{
if(a[j]==b[l])
{
Symbol(a[j],fp);
break;
}
}
if(l>=lenth)
{
int chong,m=0;
while(1)//生成符合老师要求的算符
{
chong=rand()%4;
for(l=0;l<lenth;l++)
{
if(chong==b[l])
{
m=1;
Symbol(chong,fp);
break;
}
}
if(m==1)
{
break;
}
}
}
}
else
fprintf(fp,"%d",a[j]);//输出随机算数
}
fprintf(fp,"=\n");
}
fclose(fp);//关闭流
}
3.保证除数不为0
void Divisorp(double *a,int m)//生成除数不为0的小数
{
double chong;
while(1)
{
chong=rand()/(double)(RAND_MAX/m);
if(chong!=0.0)
break;
}
*a=chong;
}
void Divisor(int *a,int m)//生成除数不为0的整数
{
int chong;
while(1)
{
chong=rand()%m;
if(chong!=0)
break;
}
*a=chong;
}
四、运行结果
1.输出20条带有“+、-、* 、/”四则运算的、最大值为100的混合整数运算式
2.输出10条带有“+、-“运算的,最大值为20的混合小数运算式
3.输出30条带有“*,/”运算的,最大值为100的混合整数运算式
五、总结
在此次结队作业中,我和小伙伴首先选定了题目,然后确定了编写思路,由我担任“驾驶员”,负责程序的编写;袁琳同学担任“领航员”负责程序审查以及单元测试。在编写代码过程中,由于我的编程习惯不是很好,总是犯一些低级错误,比如命名不规范,格式不符合要求等等,多亏了小伙伴的提醒,我才及时的改正了错误;而且每当我编程遇到瓶颈的时候,小伙伴还会帮我分析思路、查找资料,可以说能够完成这次作业,领航员是功不可没的。唯一有点遗憾的是,我们能力实在有限,没能完成界面的设计,但我们会更加努力,争取尽早掌握页面设计这方面的知识。
通过这次结队编程,我发现自己编程时,在细节方面还存在很大的问题,比如命名随便,注释不够清晰 ,格式不标准等等,在今后的学习以及编程过程中,我会更加注意这些方面的问题,争取做得更好;我也意识到了团结协作的重要性,找到了团队协作的乐趣,也更加期待下次的团队作业。