四则运算自动生成程序.
题目要求:
-
我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求:
- 能够自动生成四则运算练习题
- 可以定制题目数量
- 用户可以选择运算符
- 用户设置最大数(如十以内、百以内等)
- 用户选择是否有括号、是否有小数
- 用户选择输出方式(如输出到文件、打印机等)
- 最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)
任务分工:
-
驾驶员: 房旭 (负责代码的编写) 代码地址:https://git.dev.tencent.com/dtid_85494e5bcaedfaa6/jieduibianchengsizeyunsuan.git
-
领航员:牛斌帅 (负责调试以及测试) 代码地址:https://git.dev.tencent.com/dtid_85494e5bcaedfaa6/jieduibianchengsizeyunsuan.git
项目成果
1.选择练习题目的最大的数量:
这里选择10题
2.设置最大数:
因为题目要求是10以内或者100以内,这里我就设置为输入0为10以内,输入其他数字为100。
这里选择100以为,输入1。
3.选择是否含有小数:
设置为输入0为不含有小数,输入其他数字含有小数
选择含有小数,输入1
4.选择运算符:
数字1~5分别代表加,减,乘,除,混合运算。
选择5,进行混合运算
-
选择是否输出到文件中:
输入0不输出到文件中,输入其他数字输入到文件中
选择输入到文件中,输入1 -
选择时候带括号:
输入0不带括号,否则带括号
选择带括号,输入1
7.题目打印:
由于我设置的是每次都需要判断是否带括号,所以每输出一个四则运算就需要判断一次,后期我们对这个进行了更改
8.判断10次后结果展示:
算法细节:
1.函数模块设计
加法模块:.
void add(double a,double b,int file)
void add(double a,double b,int file)
{
if(file==0)
{
printf("请回答:%.2lf+%.2lf=",a,b);
printf("
");
}
else
{
printf("请回答:%.2lf+%.2lf=",a,b);
if((fp=fopen("aa.txt","a"))==NULL) //将表达式写入到文件
{
printf("不能打开文件!
");
exit(0);
}
fprintf(fp,"%.2lf+%.2lf=
",a,b);
fclose(fp);
printf("
");
}
}
减法模块:.
void minu(double a,double b,int file)
void minu(double a,double b,int file)
{
if(file == 0)
{
printf("请回答:%.2lf-%.2lf=",a,b);
printf("
");
}
else
{
printf("请回答:%.2lf-%.2lf=",a,b);
if((fp=fopen("aa.txt","a"))==NULL)
{
printf("不能打开文件!
");
exit(0);
}
fprintf(fp,"%.2lf-%.2lf=
",a,b);
fclose(fp);
printf("
");
}
}
乘法模块:.
void mul(double a,double b,int file)
void mul(double a,double b,int file)
{
if(file==0)
{
printf("请回答:%.2lf*%.2lf=",a,b);
printf("
");
}
else
{
printf("请回答:%.2lf*%.2lf=",a,b);
if((fp=fopen("aa.txt","a"))==NULL)
{
printf("不能打开文件!
");
exit(0);
}
fprintf(fp,"%.2lf*%.2lf=
",a,b);
fclose(fp);
printf("
");
}
}
除法模块:.
void di(double a,double b,int file)
void di(double a,double b,int file)
{
if(file==0)
{
printf("请回答:%.2lf÷%.2lf=",a,b);
printf("
");
}
else
{
if((fp=fopen("aa.txt","a"))==NULL)
{
printf("不能打开文件!
");
exit(0);
}
fprintf(fp,"%.2lf÷%.2lf=
",a,b);
fclose(fp);
printf("
");
}
}
随机产生运算符模块:.
void random_2(double a,double b,double c,int sign) //随机产生两个运算符的算式
void random_2(double a,double b,double c,int sign) //随机产生两个运算符的算式
{
int r;
r=rand()%4+1;
switch(r)
{
case 1:
{
if(sign==0)
{
printf("%.2lf+%.2lf-%.2lf=
",a,b,c);
break;
}
else
{
printf("%.2lf+%.2lf-%.2lf=
",a,b,c);
if((fp=fopen("aa.txt","w"))==NULL)
{
printf("不能打开文件!
");
exit(0);
}
fprintf(fp,"%.2lf+%.2lf-%.2lf=
",a,b,c);
fclose(fp);break;
}
}
case 2:
{
if(sign==0)
{
printf("%.2lf*%.2lf+%.2lf=
",a,b,c);
break;
}
else
{
printf("%.2lf*%.2lf+%.2lf=
",a,b,c);
if((fp=fopen("aa.txt","a"))==NULL)
{
printf("不能打开文件!
");
exit(0);
}
fprintf(fp,"%.2lf*%.2lf+%.2lf=
",a,b,c);
fclose(fp);break;
}
}
case 3:
{
if(sign==0)
{
printf("%.2lf÷%.2lf+%.2lf=
",a,b,c);
break;
}
else
{
printf("%.2lf÷%.2lf+%.2lf=
",a,b,c);
if((fp=fopen("aa.txt","a"))==NULL)
{
printf("不能打开文件!
");
exit(0);
}
fprintf(fp,"%.2lf÷%.2lf+%.2lf=
",a,b,c);
fclose(fp);break;
}
}
case 4:
{
if(sign==0)
{
printf("%.2lf*%.2lf÷%.2lf=
",a,c,b);
break;
}
else
{
printf("%.2lf*%.2lf÷%.2lf=
",a,c,b);
if((fp=fopen("aa.txt","a"))==NULL)
{
printf("不能打开文件!
");
exit(0);
}
fprintf(fp,"%.2lf*%.2lf÷%.2lf=
",a,c,b);
fclose(fp);break;
}
}
default :break;
}
}
void random_3(double a,double b,double c,double d,int sign) //随机产生三个运算符的算式
void random_3(double a,double b,double c,double d,int sign) //随机产生三个运算符的算式
{
int r;
r=rand()%4+1;
switch(r)
{
case 1:
{
if(sign==0 )
{
printf("%.2lf+%.2lf-%.2lf*%.2lf=
",a,b,c,d);
break;
}
else
{
printf("%.2lf+%.2lf-%.2lf*%.2lf=
",a,b,c,d);
if((fp=fopen("aa.txt","a"))==NULL)
{
printf("不能打开文件!
");
exit(0);
}
fprintf(fp,"%.2lf+%.2lf-%.2lf*%.2lf=
",a,b,c,d);
fclose(fp);break;
}
}
case 2:
{
if(sign==0)
{
printf("%.2lf*%.2lf+%.2lf*%.2lf=
",a,b,c,d);
break;
}
else
{
printf("%.2lf*%.2lf+%.2lf*%.2lf=
",a,b,c,d);
if((fp=fopen("aa.txt","a"))==NULL)
{
printf("不能打开文件!
");
exit(0);
}
fprintf(fp,"%.2lf*%.2lf+%.2lf*%.2lf=
",a,b,c,d);
fclose(fp);break;
}
}
case 3:
{
if(sign==0)
{
printf("%.2lf÷%.2lf*%.2lf+%.2lf=
",a,b,c,d);
break;
}
else
{
printf("%.2lf÷%.2lf*%.2lf+%.2lf=
",a,b,c,d);
if((fp=fopen("aa.txt","a"))==NULL)
{
printf("不能打开文件!
");
exit(0);
}
fprintf(fp,"%.2lf÷%.2lf*%.2lf+%.2lf=
",a,b,c,d);
fclose(fp);break;
}
}
case 4:
{
if(sign==0)
{
printf("%.2lf*%.2lf-%.2lf÷%.2lf=
",a,b,c,d);
break;
}
else
{
printf("%.2lf*%.2lf-%.2lf÷%.2lf=
",a,b,c,d);
if((fp=fopen("aa.txt","a"))==NULL)
{
printf("不能打开文件!
");
exit(0);
}
fprintf(fp,"%.2lf*%.2lf-%.2lf÷%.2lf=
",a,b,c,d);
fclose(fp);break;
}
}
default :break;
}
}
void random_33(double a,double b,double c,double d,int sign) //随机产生含三个运算符的带括号的算式
void random_33(double a,double b,double c,double d,int sign)//随机产生含三个运算符的带括号的算式
{
int r;
r=rand()%7+1;
switch(r)
{
case 1:
{
if(sign==0)
{
printf("%.2lf+(%.2lf-%.2lf)*%.2lf=
",a,b,c,d);
break;
}
else
{
printf("%.2lf+(%.2lf-%.2lf)*%.2lf=
",a,b,c,d);
if((fp=fopen("aa.txt","a"))==NULL)
{
printf("不能打开文件!
");
exit(0);
}
fprintf(fp,"%.2lf+(%.2lf-%.2lf)*%.2lf=
",a,b,c,d);
fclose(fp);break;
}
}
case 2:
{
if(sign==0)
{
printf("%.2lf*(%.2lf÷%.2lf)*%.2lf=
",a,c,b,d);
break;
}
else
{
printf("%.2lf*(%.2lf÷%.2lf)*%.2lf=
",a,c,b,d);
if((fp=fopen("aa.txt","a"))==NULL)
{
printf("不能打开文件!
");
exit(0);
}
fprintf(fp,"%.2lf*(%.2lf÷%.2lf)*%.2lf=
",a,c,b,d);
fclose(fp);break;
}
}
case 3:
{
if(sign==0)
{
printf("%.2lf÷%.2lf*(%.2lf+%.2lf)=
",a,b,c,d);
break;
}
else
{
printf("%.2lf÷%.2lf*(%.2lf+%.2lf)=
",a,b,c,d);
if((fp=fopen("aa.txt","a"))==NULL)
{
printf("不能打开文件!
");
exit(0);
}
fprintf(fp,"%.2lf÷%.2lf*(%.2lf+%.2lf)=
",a,b,c,d);
fclose(fp);break;
}
}
case 4:
{
if(sign==0)
{
printf("%.2lf+(%.2lf*%.2lf)÷%.2lf=
",a,b,c,d);
break;
}
else
{
printf("%.2lf+(%.2lf*%.2lf)÷%.2lf=
",a,b,c,d);
if((fp=fopen("aa.txt","a"))==NULL)
{
printf("不能打开文件!
");
exit(0);
}
fprintf(fp,"%.2lf+(%.2lf*%.2lf)÷%.2lf=
",a,b,c,d);
fclose(fp);break;
}
}
case 5:
{
if(sign==0)
{
printf("%.2lf-(%.2lf+%.2lf*%.2lf)=
",a,b,c,d);
break;
}
else
{
printf("%.2lf-(%.2lf+%.2lf*%.2lf)=
",a,b,c,d);
if((fp=fopen("aa.txt","a"))==NULL)
{
printf("不能打开文件!
");
exit(0);
}
fprintf(fp,"%.2lf-(%.2lf+%.2lf*%.2lf)=
",a,b,c,d);
fclose(fp);break;
}
}
case 6:
{
if(sign==0)
{
printf("(%.2lf+%.2lf-%.2lf)*%.2lf=
",a,b,c,d);
break;
}
else
{
printf("(%.2lf+%.2lf-%.2lf)*%.2lf=
",a,b,c,d);
if((fp=fopen("aa.txt","a"))==NULL)
{
printf("不能打开文件!
");
exit(0);
}
fprintf(fp,"(%.2lf+%.2lf-%.2lf)*%.2lf=
",a,b,c,d);
fclose(fp);break;
}
}
case 7:
{
if(sign==0)
{
printf("%.2lf*(%.2lf+%.2lf÷%.2lf)=
",a,b,c,d);
break;
}
else
{
printf("%.2lf*(%.2lf+%.2lf÷%.2lf)=
",a,b,c,d);
if((fp=fopen("aa.txt","a"))==NULL)
{
printf("不能打开文件!
");
exit(0);
}
fprintf(fp,"%.2lf*(%.2lf+%.2lf÷%.2lf)=
",a,b,c,d);
fclose(fp);break;
default :break;
}
}
}
}
混合运算模块:.
void mix(double a,double b,double c,double d,int file)
void mix(double a,double b,double c,double d,int file)
{
int num;
int flag; //为0不带括号,为其他带括号
int sign;
sign = file;
num=rand()%2+2; //运算符的数量
printf("你已经进入混合运算,请选择是否带括号(0不带括号,其他数字带括号):");
scanf("%d",&flag);
if(flag==0)
{
switch(num)
{
case 2:random_2(a,b,c,sign);break;
case 3:random_3(a,b,c,d,sign);break;
default :break;
}
}
if(flag!=0)
random_33(a,b,c,d,sign);
}
发现问题:
通过与领航员的交流,我们发现了以下几个问题:
1.括号判断语句的位置有问题,每次进行混合运算前需要进行判断是否带括号;
2.随机数小数只是0.xx而无法生成x.xx的形式;
3.最大值只能为10或100,不够灵活
4.随机数生成种子不变
5.如果输入无效选项,无提示的问题
随后与领航员合作,解决了这些问题,并对代码进行了优化,解决了部分模块代码冗长且不高效的问题
具体解决办法请看领航员牛斌帅的博客 https://www.cnblogs.com/nbsdbk/p/10787254.html
总结:
1.整个项目用了大约两天的时间。看到两个题目,对本题有解题思路,但是对电梯调度算法没有太多的想法,而且不知道多部电梯该如何同时控制。
课后有时间需要对这部分进行思考,并进行解决。
2.由于我选择的是C语言,所以在进行界面图形化的时候遇到了部分问题,而且至今没有解决。这真的很尴尬。课后需要进一步研究。
3.对自己的代码不能静下心来进行审查。很多错误在测试的时候就应该察觉出来,但是事实上这些错误是领航员在帮我审查代码时候检查出来的。日后
应该改掉这个毛病。静下心来审查自己的代码,争取在自查时就把错误检查出来。
4.领航员这个角色真的非常重要。在编码时领航员就不断为我提供思路,并帮我检查语法或逻辑错误。编码结束后进行代码检测以及再次审查,并进一步优化代码。
如果没有领航员,这次作业可能不会快速的完成,质量也不会这么好。在结对编程中我发现我们能够更加专注,并提高解决问题的效率,而且减少了错误的发生,
要知道错误发现的越早,修复成本越低,更不用提无形中促进了个人知识的提高与传递,友谊也在不知不觉中巩固。在这里感谢我的领航员牛斌帅同学。