一、项目选题
本次作业要求两个人合作完成,驾驶员和导航员角色自定。在小学四则运算自动生成程序和电梯调度问题中,我们选择了四则运算题目。
二、题目要求
①能够自动生成四则运算练习题
②可以定制题目数量
③用户可以选择运算符
④用户设置最大数(如十以内、百以内等)
⑤用户选择是否有括号、是否有小数
⑥用户选择输出方式(如输出到文件、打印机等)
⑦最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)
三、角色选定
- 驾驶员:王成成
- 任务
(1)能够完成全部代码工作,程序基本实现全部要求功能,并将代码上传至coding.net或者GitHub代码托管系统中。
(2)能够对导航员在本次编程工作中起到的作用给出客观评价。
- 任务
- 领航员:耿蝶芮
- 任务
(1)能够辅助驾驶员完成全部代码工作,并且为关键函数选用合适的覆盖标准设计测试用例,并编写代码进行单元自动测试。
(2)能够根据上次作业的代码检查表对驾驶员的本次工作进行评价。
- 任务
四、代码上传
- 博客地址:
五、程序设计
四则运算问题,关键是能够自动生成算数表达式。在这部分中,我们整体代码采用C语言和结构体进行设计。而针对页面显示结构,我们则采用了html以及js进行设计。我们给出表达式的组数、表达式中涉及到的数据的大小范围以及数据类型。除此之外,还要考虑到生成的表达式是否含有括号、具体包含哪些运算符等。因此,我们在代码中进行了详细分析设计,并且进行了重构,从而使得代码整洁、可修改性强。
1、结构体设计
struct data
{
int num[10001];
float num1[10001];
}p[10001];
2、主函数
在主函数中,我们主要针对一些必要要求进行了判断,并依据此在其各个子函数中进行处理。对于运算符的选择,我们依据学生的要求进行设计,通过设定字符串数组来完成运算符的选择。
int main()
{
int NUM,Num,Max;
int parentheses,print_yes_no,decimal;
char op_operator[5];
printf("----------------------------------------------------------\n");
printf("请输入共有多少组运算表达式:");
cin>>NUM;
printf("----------------------------------------------------------\n");
printf("请输入运算数的最大值,以保证所有计算数据都在该数字以内: ");
cin>>Max;
printf("----------------------------------------------------------\n");
printf("请输入有无括号(1代表有括号、0代表无括号): ");
cin>>parentheses;
printf("----------------------------------------------------------\n");
printf("请输入是否将结果存到文件中(1代表存放、0代表不存放): ");
cin>>print_yes_no;
printf("----------------------------------------------------------\n");
printf("请选择输入是小数还是整数(1代表整数、0代表小数):");
cin>>decimal;
printf("----------------------------------------------------------\n");
printf("请选择输入的运算符:");
cin>>op_operator;
printf("----------------------------------------------------------\n");
Num=-1;
while(1)
{
if(Num<2||Num>8)
Num=int(rand()%10);//定义每个表达式有多少个参与运算的实数
else
break;
}
if(parentheses==1)
Have_parentheses(NUM,Max,Num,print_yes_no,op_operator,decimal);
else if(parentheses==0)
No_parentheses(NUM,Max,Num,print_yes_no,op_operator,decimal);
system("pause");
return 0;
}
3、括号处理
对于表达式中是否含有括号的问题,我们分为两部分:有括号和无括号。在程序中,我们利用了随机数生成函数进行处理。
(1)无括号形式的表达式
void No_parentheses(int NUM,int Max,int Num,int print_yes_no,char op_operator[],int decimal)//无括号的运算形式
{
int i,j,len;
int op;
len=strlen(op_operator);
FILE *fp;
fp=fopen("a.txt","w");
for(i=0;i<NUM;i++)
{
for(j=0;j<Num;j++)
{
op=int(rand()%len);
if(decimal==1)
calculate_int(&p[i].num[j],&p[i].num[j+1],&op_operator[op],NUM,Max);
if(decimal==0)
calculate_decimal(&p[i].num1[j],&p[i].num1[j+1],&op_operator[op],NUM,Max);
if(j<Num-1)
{
if(decimal==1)
{
cout<<p[i].num[j]<<" "<<op_operator[op]<<" ";
if(print_yes_no==1)
{
if(fp==NULL)
printf("打开文件a.txt失败\n");
fprintf(fp,"%d",p[i].num[j]);
fprintf(fp,"%c",' ');
fprintf(fp,"%c",op_operator[op]);
fprintf(fp,"%c",' ');
}
}
else
{
printf("%.1f",p[i].num1[j]);
cout<<" "<<op_operator[op]<<" ";
if(print_yes_no==1)
{
if(fp==NULL)
printf("打开文件a.txt失败\n");
fprintf(fp,"%.1f",p[i].num1[j]);
fprintf(fp,"%c",' ');
fprintf(fp,"%c",op_operator[op]);
fprintf(fp,"%c",' ');
}
}
}
if(j==Num-1)
{
if(decimal==1)
{
cout<<p[i].num[j]<<" ";
if(print_yes_no==1)
{
if(fp==NULL)
printf("打开文件a.txt失败\n");
fprintf(fp,"%d",p[i].num[j]);
fprintf(fp,"%c",' ');
}
}
else
{
printf("%.1f ",p[i].num1[j]);
if(print_yes_no==1)
{
if(fp==NULL)
printf("打开文件a.txt失败\n");
fprintf(fp,"%.1f",p[i].num1[j]);
fprintf(fp,"%c",' ');
}
}
}
}
cout<<"= "<<"\n";
if(print_yes_no==1)
{
if(fp==NULL)
printf("打开文件a.txt失败\n");
fprintf(fp,"%c",'=');
fprintf(fp,"%c",'\n');
}
}
fclose(fp);
}
(2)有括号形式的表达式
void Have_parentheses(int NUM,int Max,int Num,int print_yes_no,char op_operator[],int decimal)//带括号的运算
{
int flag1=0,flag2=0;
int k1,k2;
int op;
int i,j,len;
len=strlen(op_operator);
FILE *fp;
fp=fopen("a.txt","w");
for(i=0;i<NUM;i++)
{
k1=-1;
k2=-1;
while(1)
{
if(k1>k2||k2-k1<2||k2>Num)
{
k1=int(rand()%3);
k2=int(rand()%4);
}
else
break;
}
for(j=0;j<Num;j++)
{
op=int(rand()%len);
if(decimal==1)
calculate_int(&p[i].num[j],&p[i].num[j+1],&op_operator[op],NUM,Max);
if(decimal==0)
calculate_decimal(&p[i].num1[j],&p[i].num1[j+1],&op_operator[op],NUM,Max);
if(j<Num-1)
{
if(j==k1)
{
if(decimal==1)
{
cout<<"("<<p[i].num[j]<<" "<<op_operator[op]<<" ";
flag1=1;
if(print_yes_no==1)
{
if(fp==NULL)
printf("打开文件a.txt失败\n");
fprintf(fp,"%c",'(');
fprintf(fp,"%d",p[i].num[j]);
fprintf(fp,"%c",' ');
fprintf(fp,"%c",op_operator[op]);
fprintf(fp,"%c",' ');
}
}
else
{
cout<<"(";
printf("%.1f",p[i].num1[j]);
cout<<" "<<op_operator[op]<<" ";
flag1=1;
if(print_yes_no==1)
{
if(fp==NULL)
printf("打开文件a.txt失败\n");
fprintf(fp,"%c",'(');
fprintf(fp,"%.1f",p[i].num1[j]);
fprintf(fp,"%c",' ');
fprintf(fp,"%c",op_operator[op]);
fprintf(fp,"%c",' ');
}
}
}
else if(j==k2)
{
if(decimal==1)
{
cout<<p[i].num[j]<<")"<<" "<<op_operator[op]<<" ";
flag1=1;
if(print_yes_no==1)
{
if(fp==NULL)
printf("打开文件a.txt失败\n");
fprintf(fp,"%d",p[i].num[j]);
fprintf(fp,"%c",')');
fprintf(fp,"%c",' ');
fprintf(fp,"%c",op_operator[op]);
fprintf(fp,"%c",' ');
}
}
else
{
printf("%.1f",p[i].num1[j]);
cout<<")"<<" "<<op_operator[op]<<" ";
flag1=1;
if(print_yes_no==1)
{
if(fp==NULL)
printf("打开文件a.txt失败\n");
fprintf(fp,"%.1f",p[i].num1[j]);
fprintf(fp,"%c",')');
fprintf(fp,"%c",' ');
fprintf(fp,"%c",op_operator[op]);
fprintf(fp,"%c",' ');
}
}
}
else
{
if(decimal==1)
{
cout<<p[i].num[j]<<" "<<op_operator[op]<<" ";
if(print_yes_no==1)
{
if(fp==NULL)
printf("打开文件a.txt失败\n");
fprintf(fp,"%d",p[i].num[j]);
fprintf(fp,"%c",' ');
fprintf(fp,"%c",op_operator[op]);
fprintf(fp,"%c",' ');
}
}
else
{
printf("%.1f",p[i].num1[j]);
cout<<" "<<op_operator[op]<<" ";
if(print_yes_no==1)
{
if(fp==NULL)
printf("打开文件a.txt失败\n");
fprintf(fp,"%.1f",p[i].num1[j]);
fprintf(fp,"%c",' ');
fprintf(fp,"%c",op_operator[op]);
fprintf(fp,"%c",' ');
}
}
}
}
else
{
if(flag1==1&&flag2==0)
{
if(decimal==1)
{
cout<<p[i].num[j]<<")"<<" ";
if(print_yes_no==1)
{
if(fp==NULL)
printf("打开文件a.txt失败\n");
fprintf(fp,"%d",p[i].num[j]);
fprintf(fp,"%c",')');
fprintf(fp,"%c",' ');
}
}
else
{
printf("%.1f",p[i].num1[j]);
cout<<")"<<" ";
if(print_yes_no==1)
{
if(fp==NULL)
printf("打开文件a.txt失败\n");
fprintf(fp,"%.1f",p[i].num1[j]);
fprintf(fp,"%c",')');
fprintf(fp,"%c",' ');
}
}
}
else
{
if(decimal==1)
{
cout<<p[i].num[j]<<" ";
if(print_yes_no==1)
{
if(fp==NULL)
printf("打开文件a.txt失败\n");
fprintf(fp,"%d",p[i].num[j]);
fprintf(fp,"%c",' ');
}
}
else
{
printf("%.1f ",p[i].num1[j]);
if(print_yes_no==1)
{
if(fp==NULL)
printf("打开文件a.txt失败\n");
fprintf(fp,"%.1f",p[i].num1[j]);
fprintf(fp,"%c",' ');
}
}
}
}
}
cout<<"= "<<"\n";
if(print_yes_no==1)
{
if(fp==NULL)
printf("打开文件a.txt失败\n");
fprintf(fp,"%c",'=');
fprintf(fp,"%c",'\n');
}
}
fclose(fp);
}
六、界面设计
对于界面的设计,我们采用了html以及js等技术,大体上实现了四则运算的显示界面。
七、总结
本次结对作业,由于种种原因,我们假期结束后才开始进行设计、编码等工作,时间较紧。