软件工程(2018)结对编程第2次作业
1.题目要求
- 题目1:
- 我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求:
- 能够自动生成四则运算练习题
- 可以定制题目数量
- 用户可以选择运算符
- 用户设置最大数(如十以内、百以内等)
- 用户选择是否有括号、是否有小数
- 用户选择输出方式(如输出到文件、打印机等)
- 最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)
2.成员定位
驾驶员:张成威
领航员:郭洋 博客地址
3.编写代码
代码链接:coding
- 定义变量
char Symbol[4]= {'+','-','*','/'};
int mul=2;//乘除标志位
int probrackets=0;//是否有前括号
int num=1;//题目数量
int maximum=100;//最大数
int ifprint=1;//是否打印
int brackets=0;//是否有括号
int decimal=0;//是否有小数
int option;//面板选项
char str[100];//每一行用来存题目的字符串
int I=0;//字符串光标
- 将字符,数字压入字符串str的子函数
void Addstrchar(char c)//将字符c压入str字符串中
{
str[I]=c;
I++;
}
void Addstrint(int a)//将整数a转换成字符串模式压入str字符串中
{
char b[5];
itoa(a,b,10);
for(int i=0;; i++)
{
if(b[i]=='\0') break;
str[I]=b[i];
I++;
}
}
- 定制题目数量子函数
void Num()//定制题目数量
{
printf("请输入题目数量,以回车结束\n");
scanf("%d",&num);
}
- 选择乘除法子函数
void Mul()//选择是否有乘除法
{
printf("是否有乘除法,是输入1,否输入0,以回车结束\n");
scanf("%d",&mul);
if(mul==1)
mul=4;
else mul=2;
}
- 设置最大数子函数
void Maximum()//用户设置最大数
{
printf("请输入最大数\n");
scanf("%d",&maximum);
}
- 设置是否有括号,小数子函数
void Brackets()//设置是否有括号
{
printf("是否有括号,是输入1,否输入0,以回车结束\n");
scanf("%d",&brackets);
}
void Decimal()//设置是否有小数
{
printf("是否有小数,是输入1,否输入0,以回车结束\n");
scanf("%d",&decimal);
}
- 加入括号子函数
void Addbrackets1()//加入前括号
{
if(brackets==1)//开启括号
{
if(probrackets==0)//没有前括号
{
int k=rand()%2;
if(k==1)
{
Addstrchar('(');
probrackets=1;
}
}
}
}
void Addbrackets2()//加入后括号
{
if(brackets==1)
{
if(probrackets==1)
{
int w=rand()%2;
if(w==1)
{
Addstrchar(')');
probrackets=0;
}
}
}
}
- 加入小数子函数
void Adddecimal()//加入小数
{
if(decimal==1)
{
Addstrchar('.');
Addstrint(rand()%100);
}
}
这里设置的小数位小数点后两位。
- 设置是否打印子函数
void Ifprint()//设置是否打印
{
scanf("%d",&ifprint);
}
- 生成题目子函数
void Creat()//生成打印题目
{
fp=fopen("data.txt","w");
for(int i=0; i<num; i++)
{
Addbrackets1();
Addstrint(rand()%maximum+1);
Adddecimal();
for(int j=0; j<rand()%3+2; j++)
{
Addstrchar(Symbol[rand()%mul]);
Addbrackets1();
Addstrint(rand()%maximum+1);
Adddecimal();
Addbrackets2();
}
if(probrackets==1)
Addstrchar(')');
Addstrchar('=');
Addstrchar('\n');
Addstrchar('\0');
probrackets=0;
if(ifprint==1)
printf("%s\n",str);
if(ifprint==0)
fputs(str,fp);
I=0;
}
if(ifprint==0)
printf("存入文件成功\n");
}
根据以上函数改变的变量进行打印题目,或是将题目保存到文件中。
- 生成面板子函数
void Panel()//生成面板
{
printf("*****************************************\n");
printf("*1.定制题目数量 当前状态:%d\t*\n",num);
printf("*2.设置是否有乘除法 当前状态:");
if(mul==2)
printf("否");
else
printf("是");
printf("\t*\n");
printf("*3.定制最大数 当前状态:%d\t*\n",maximum);
printf("*4.设置是否有括号 当前状态:");
if(brackets==0)
printf("否");
else
printf("是");
printf("\t*\n");
printf("*5.设置是否有小数 当前状态:");
if(decimal==0)
printf("否");
else
printf("是");
printf("\t*\n");
printf("*6.设置是否打印 当前状态:");
if(ifprint==0)
printf("否");
else
printf("是");
printf("\t*\n");
printf("*7.生成题目 *\n");
printf("*8.退出 *\n");
printf("*****************************************\n");
}
因本人并未掌握图形图像处理,就简单的在输出界面做了一个面板
- 主函数(输出面板,根据用户的选择进入不同的子函数进行各项修改或题目生成)
int main()
{
while(1)
{
Panel();
scanf("%d",&option);
if(option==8) break;
switch(option)
{
case 1:
Num();
break;
case 2:
Mul();
break;
case 3:
Maximum();
break;
case 4:
Brackets();
break;
case 5:
Decimal();
break;
case 6:
Ifprint();
break;
default:
Creat();
break;
}
}
fclose(fp);
}
4.小结
本次作业是四则运算的编程,由于队友编程能力有待提高,所以我负责了代码的编写。编写代码过程中,队友也做出了很大的贡献,在子函数的编写上,我们是分工合作的,她不但帮助我完成了多个子函数,也在括号子函数与用户界面上给了我不少的建议。起初加入括号的函数对于我来说是一个难点,总是想不到简便的方式解决这个问题,在与队友的讨论下,决定将加入括号函数分成两个函数,即加入前括号的函数与加入后括号的函数,在输出数字的前后分别执行,虽然仍然有一点无关紧要的小缺陷,不过总算攻克了这一难题。在程序基本完成后,我们又研究了一下,想完善优化用户界面,希望界面看起来更加简洁明了。在此过程中,队友也给了我很大帮助,例如她建议我在在用户界面显示此时小数标志位,乘除法标志位等一系列需要用户手动修改的标志当前的状态。加入这种修改之后,显示界面更加适合使用了,大大方便了程序的使用,是我编码时没有考虑到的。本次结对作业和队友合作非常愉快,合作过程中的效率远远大于一个人工作,两个人可以分工合作,在有意见不统一的时候进行讨论往往可以得到一种更优方案,总的来说,有搭档帮助什么的真的是很棒,希望以后再接再厉,做出更完美地程序。