软件工程第二次作业(结对作业)
1.题目
- 我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求:
- 能够自动生成四则运算练习题
- 可以定制题目数量
- 用户可以选择运算符
- 用户设置最大数(如十以内、百以内等)
- 用户选择是否有括号、是否有小数
- 用户选择输出方式(如输出到文件、打印机等)
- 最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)
2.作业分配
我和我的小伙伴蔡沛沛选择的是题目1,在这次结对作业中我负责的是写代码这块,也就是充当驾驶员的角色,沛沛担当的是领航员的角色。
3.代码部分解释
代码的基本内容实现,但是因为能力有限,图形化界面没有实现,以下是操作界面的截图:
-
这部分的截图显示的是初始界面,显示用户需要进行的操作,代码位于menu函数中。
-
代码如下:
void menu()//*主菜单*
{
printf("********************************************************************************");
printf("^_^_^_^_^_^_^_^_^_^_^_^ ^_^ 欢迎你们来学习四则运算^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_");
printf(" \n");
printf(" 1.选择练习运算的数量 \n\n");
printf(" 2.选择练习运算的运算符(1为加,2为减,3为乘,4为除) \n");
printf(" 3.设置最大数 \n");
printf(" \n");
printf(" 快设置你要学习的内容吧! \n");
printf("^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_\n");
printf("*************************************************************************\n");
}
-
2.这两张截图是主要函数运行过程中的结果,假设用户设置练习最大数量为10;假设用户设置10为最大数(设置最大数,若输入为0,最大数为10,若不是,最大数为100);假设不含小数为0(是否含有小数(输入0不是,其他数是));可以设置括号也可以设置没有括号(选择练习运算的运算符(1为加,2为减,3为乘,4为除,5为混合运算(含括号或不含括号)),若选择5,则输出你已经进入混合运算,请选择是否带括号(输入0否,输入1或其他数字是))。
-
代码如下:
void add(double a,double b)
{
double out=0;
int ci;
printf("请回答:%.2lf+%.2lf=",a,b);
if((fp=fopen("aa.txt","a"))==NULL)//将表达式写入到文件
{
printf("不能打开文件!\n");
exit(0);
}
fprintf(fp,"%.2lf+%.2lf=\n",a,b);
fclose(fp);
out=a+b;
scanf("%d",&ci);
if(a+b!=ci)
printf("回答错误\n正确答案:%.2lf\n",out);
else
printf("回答正确\n");
}
void minu(double a,double b)
{
/*随机产生1个100以内的整数,并赋值给a。
srand()函数是随机数发生器的初始化函数,还缺少
#include <stdlib.h> #include <time.h> 两个头文件,
int x,a;//表示初始化整数x和a
srand(time(0));//表示随机数产生初始
a=(int)(rand()%100);//表示调用rand()函数产生100以内整数并赋值给a*/
double out=0;
int ci;
printf("请回答:%.2lf-%.2lf=",a,b);
if((fp=fopen("aa.txt","a"))==NULL)
{
printf("不能打开文件!\n");
exit(0);
}
fprintf(fp,"%.2lf-%.2lf=\n",a,b);
fclose(fp);
out=a-b;
scanf("%d",&ci);
if(a-b!=ci)
printf("回答错误\n正确答案:%.2lf\n",out);
else
printf("回答正确\n");
}
void mul(double a,double b)
{
double out=0;
int ci;
printf("请回答:%.2lf*%.2lf=",a,b);
if((fp=fopen("aa.txt","a"))==NULL)
{
printf("不能打开文件!\n");
exit(0);
}
fprintf(fp,"%.2lf*%.2lf=\n",a,b);
fclose(fp);
out=a*b;
scanf("%d",&ci);
if(a*b!=ci)
printf("回答错误\n正确答案:%.2lf\n",out);
else
printf("回答正确\n");
}
void di(double a,double b)
{
int ci;
double out=0;
printf("请回答:%.2lf÷%.2lf=",a,b);
if((fp=fopen("aa.txt","a"))==NULL)
{
printf("不能打开文件!\n");
exit(0);
}
fprintf(fp,"%.2lf÷%.2lf=\n",a,b);
fclose(fp);
scanf("%d",&ci);
out=a/b;
if(out!=ci)
printf("回答错误\n正确答案:%.2lf\n",out);
else
printf("回答正确\n");
}
void random_2(double a,double b,double c) //随机产生两个运算符的算式
{
int r;
r=rand()%4+1;
switch(r)
{
case 1:printf("%.2lf+%.2lf-%.2lf=\n",a,b,c);
if((fp=fopen("aa.txt","w"))==NULL)
{
printf("不能打开文件!\n");
exit(0);
}
fprintf(fp,"%.2lf+%.2lf-%.2lf=\n",a,b,c);
fclose(fp);break;
case 2:printf("%.2lf*%.2lf+%.2lf=\n",a,b,c);
if((fp=fopen("aa.txt","a"))==NULL)
{
printf("不能打开文件!\n");
exit(0);
}
fprintf(fp,"%.2lf*%.2lf+%.2lf=\n",a,b,c);
fclose(fp);break;
case 3:printf("%.2lf÷%.2lf+%.2lf=\n",a,b,c);
if((fp=fopen("aa.txt","a"))==NULL)
{
printf("不能打开文件!\n");
exit(0);
}
fprintf(fp,"%.2lf÷%.2lf+%.2lf=\n",a,b,c);
fclose(fp);break;
case 4:printf("%.2lf*%.2lf÷%.2lf=\n",a,c,b);
if((fp=fopen("aa.txt","a"))==NULL)
{
printf("不能打开文件!\n");
exit(0);
}
fprintf(fp,"%.2lf*%.2lf÷%.2lf=\n",a,c,b);
fclose(fp);break;
default :break;
}
}
void random_3(double a,double b,double c,double d) //随机产生三个运算符的算式
{
int r;
r=rand()%4+1;
switch(r)
{
case 1:printf("%.2lf+%.2lf-%.2lf*%.2lf=\n",a,b,c,d);
if((fp=fopen("aa.txt","a"))==NULL)
{
printf("不能打开文件!\n");
exit(0);
}
fprintf(fp,"%.2lf+%.2lf-%.2lf*%.2lf=\n",a,b,c,d);
fclose(fp);break;
case 2:printf("%.2lf*%.2lf+%.2lf*%.2lf=\n",a,b,c,d);
if((fp=fopen("aa.txt","a"))==NULL)
{
printf("不能打开文件!\n");
exit(0);
}
fprintf(fp,"%.2lf*%.2lf+%.2lf*%.2lf=\n",a,b,c,d);
fclose(fp);break;
case 3:printf("%.2lf÷%.2lf*%.2lf+%.2lf=\n",a,b,c,d);
if((fp=fopen("aa.txt","a"))==NULL)
{
printf("不能打开文件!\n");
exit(0);
}
fprintf(fp,"%.2lf÷%.2lf*%.2lf+%.2lf=\n",a,b,c,d);
fclose(fp);break;
case 4:printf("%.2lf*%.2lf-%.2lf÷%.2lf=\n",a,b,c,d);
if((fp=fopen("aa.txt","a"))==NULL)
{
printf("不能打开文件!\n");
exit(0);
}
fprintf(fp,"%.2lf*%.2lf-%.2lf÷%.2lf=\n",a,b,c,d);
fclose(fp);break;
default :break;
}
}
void random_33(double a,double b,double c,double d)//随机产生含三个运算符的带括号的算式
{
int r;
r=rand()%7+1;
switch(r)
{
case 1:printf("%.2lf+(%.2lf-%.2lf)*%.2lf=\n",a,b,c,d);
if((fp=fopen("aa.txt","a"))==NULL)
{
printf("不能打开文件!\n");
exit(0);
}
fprintf(fp,"%.2lf+(%.2lf-%.2lf)*%.2lf=\n",a,b,c,d);
fclose(fp);break;
case 2:printf("%.2lf*(%.2lf÷%.2lf)*%.2lf=\n",a,c,b,d);
if((fp=fopen("aa.txt","a"))==NULL)
{
printf("不能打开文件!\n");
exit(0);
}
fprintf(fp,"%.2lf*(%.2lf÷%.2lf)*%.2lf=\n",a,c,b,d);
fclose(fp);break;
case 3:printf("%.2lf÷%.2lf*(%.2lf+%.2lf)=\n",a,b,c,d);
if((fp=fopen("aa.txt","a"))==NULL)
{
printf("不能打开文件!\n");
exit(0);
}
fprintf(fp,"%.2lf÷%.2lf*(%.2lf+%.2lf)=\n",a,b,c,d);
fclose(fp);break;
case 4:printf("%.2lf+(%.2lf*%.2lf)÷%.2lf=\n",a,b,c,d);
if((fp=fopen("aa.txt","a"))==NULL)
{
printf("不能打开文件!\n");
exit(0);
}
fprintf(fp,"%.2lf+(%.2lf*%.2lf)÷%.2lf=\n",a,b,c,d);
fclose(fp);break;
case 5:printf("%.2lf-(%.2lf+%.2lf*%.2lf)=\n",a,b,c,d);
if((fp=fopen("aa.txt","a"))==NULL)
{
printf("不能打开文件!\n");
exit(0);
}
fprintf(fp,"%.2lf-(%.2lf+%.2lf*%.2lf)=\n",a,b,c,d);
fclose(fp);break;
case 6:printf("(%.2lf+%.2lf-%.2lf)*%.2lf=\n",a,b,c,d);
if((fp=fopen("aa.txt","a"))==NULL)
{
printf("不能打开文件!\n");
exit(0);
}
fprintf(fp,"(%.2lf+%.2lf-%.2lf)*%.2lf=\n",a,b,c,d);
fclose(fp);break;
case 7:printf("%.2lf*(%.2lf+%.2lf÷%.2lf)=\n",a,b,c,d);
if((fp=fopen("aa.txt","a"))==NULL)
{
printf("不能打开文件!\n");
exit(0);
}
fprintf(fp,"%.2lf*(%.2lf+%.2lf÷%.2lf)=\n",a,b,c,d);
fclose(fp);break;
default :break;
}
}
void mix(double a,double b,double c,double d)
{
int num;
int flag;//为0不带括号,为其他带括号
num=rand()%2+2;//运算符的数量
printf("你已经进入混合运算,请选择是否带括号(0否,1或其他数字是):");
scanf("%d",&flag);
if(flag==0)
{
printf("%d\n",num);
switch(num)
{
case 2:random_2(a,b,c);break;
case 3:random_3(a,b,c,d);break;
default :break;
}
}
if(flag!=0)
random_33(a,b,c,d);
}
- 3.这张截图是将表达式输出到文件。
4.小结
因为之前就看过一点点题目,所以对这次实验不算陌生,在编写的过程中也有一定的基础,所以开始看到题目的时候还是挺乐观的,但是看了具体的要求之后就不是很开心了,因为加了很多的要求,而且还用到了很多以前的知识,比如说文件,这个是大一时学的C语言的内容,但是还是重新翻了书。在写代码的过程中也遇到了很多问题,虽然刚开始写的时候很容易下手,然而还有很多的小细节的东西在实现的时候也很麻烦,有的时候设计的代码实现不了期待的要求,出现错误信息的时候,还需要一遍遍单步调试运行。总之,这次的实验对我来说不容易,而且因为能力有限,并没有实现老师要求的所有东西。以后一定会继续努力学习更多的东西,像一张白纸一样的接收更多新的知识。
5.评价及合作时的照片
在写这份代码的过程中,我的小伙伴沛沛给了我很多的帮助,每当我代码出问题,运行结果不出来时,她总是能及时的给我提出意见,指出错误的所在,及时的解决问题。特别是有一次我不小心把写好的代码给删除了,因为写了很久,又不小心给删了,吓得不知道怎么办时,沛沛很镇定的帮助我找回了文件。这次的事让我懂得了遇事不要慌张,也很感谢沛沛给我的帮助,她及时的帮我纠错,替我解惑,很庆幸有这么一个好搭档。
- 照片