题目要求
本次作业要求两个人合作完成,驾驶员和导航员角色自定,鼓励大家在工作期间角色随时互换,这里会布置两个题目,请各组成员根据自己的爱好任选一题。
题目1:
我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求:
- 能够自动生成四则运算练习题
- 可以定制题目数量
- 用户可以选择运算符
- 用户设置最大数(如十以内、百以内等)
- 用户选择是否有括号、是否有小数
- 用户选择输出方式(如输出到文件、打印机等)
- 最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)
这次任务中我是驾驶员,廖宇同学是领航员
我由于不太会GUI界面的编程,于是就编写了在控制台界面显示的程序,通过输入数据,以回车键结束来与程序进行交互
下面是我的coding链接https://coding.net/u/Super_fly/p/FourCalculate/git/tree/master/?public=true
实际的输出
代码
#include<iostream>
#include<string>
#include<stdlib.h>
#include<time.h>
using namespace std;
int randnum2(int min,int max) //获得随机数
{
int ranum=0;
ranum=rand();
while(ranum>max)
{
ranum%=max;//保证min<b<max
if(ranum<min)
{
ranum=rand();
}
}
return ranum;
}
double answer(int ope,double num1,double num2)
{
double ans=0;
if(ope==0)
{
ans=num1+num2;
}
if(ope==1)
{
ans=num1-num2;
}
if(ope==2)
{
ans=num1*num2;
}
if(ope==3)
{
ans=num1/num2;
}
return ans;
}
double question(int max,int min,int numam)
{
int a[100],i=2,j=0,num=0;
double b[100];
string str="+-*/";
num=randnum2(i,numam);
i=0;
while(i<=num*3) // 初始化数组
{
a[i]=randnum2(min,max);
b[i]=a[i];
i++;
}
while(j<=num*3)
{
a[j]%=4;//运算符
a[j+1]%=2;//括号
if(a[j+1]==1)
{
a[j+4]=-1;
}
j+=3;
}
int t=0;
i=0;
j=1;
while(j<=num*3) //输出式子
{
if(a[j]==1&&j<num*3-3&&a[j+2]!=2&&a[j+2]!=3)
cout<<"(";
cout<<a[j+1];
if(a[j-3]==1&&j>3&&a[j-1]!=2&&a[j-1]!=3)
cout<<")";
if(j<(num*3-3))
cout<<str[a[j+2]];
j+=3;
}
j=1;
while(j<=num*3-3) //计算括号
{
if(a[j]==1&&j<num*3-3&&a[j+2]!=2&&a[j+2]!=3)
{
b[j+1]=answer(a[j+2],b[j+1],b[j+4]);
a[j+1]=b[j+1];
for(int i=j+2;i<num*3-3;i++)
{
a[i]=a[i+3];
b[i]=b[i+3];
}
num-=1;
}
j+=3;
}
j=1;
while(j<=num*3-3) //计算乘除
{
if(a[j+2]==2||a[j+2]==3)
{
b[j+1]= answer(a[j+2],b[j+1],b[j+4]);
for(int i=j+2;i<num*3-3;i++)
{
a[i]=a[i+3];
b[i]=b[i+3];
}
num-=1;
j-=3;
}
j+=3;
}
j=1;
double ans=0,m=0;
while(j<=num*3)
{
m=b[j+1];
if(a[j+2]==1)
{
ans=ans-m;
}
else
{
ans=ans+m;
}
j+=3;
}
return ans;
}
double question1(int max,int min,int numam)
{
int a[100],i=2,j=0,num=0;
double b[100];
string str="+-";
num=randnum2(i,numam);
i=0;
while(i<=num*3) // 初始化数组
{
a[i]=randnum2(min,max);
b[i]=a[i];
i++;
}
while(j<=num*3)
{
a[j]%=2;//运算符
a[j+1]%=2;//括号
if(a[j+1]==1)
{
a[j+4]=-1;
}
j+=3;
}
int t=0;
i=0;
j=1;
while(j<=num*3) //输出式子
{
if(a[j]==1&&j<num*3-3&&a[j+2]!=2&&a[j+2]!=3)
cout<<"(";
cout<<a[j+1];
if(a[j-3]==1&&j>3&&a[j-1]!=2&&a[j-1]!=3)
cout<<")";
if(j<(num*3-3))
cout<<str[a[j+2]];
j+=3;
}
j=1;
while(j<=num*3-3) //计算括号
{
if(a[j]==1&&j<num*3-3&&a[j+2]!=2&&a[j+2]!=3)
{
b[j+1]=answer(a[j+2],b[j+1],b[j+4]);
a[j+1]=b[j+1];
for(int i=j+2;i<num*3-3;i++)
{
a[i]=a[i+3];
b[i]=b[i+3];
}
num-=1;
}
j+=3;
}
j=1;
while(j<=num*3-3) //计算乘除
{
if(a[j+2]==2||a[j+2]==3)
{
b[j+1]= answer(a[j+2],b[j+1],b[j+4]);
for(int i=j+2;i<num*3-3;i++)
{
a[i]=a[i+3];
b[i]=b[i+3];
}
num-=1;
j-=3;
}
j+=3;
}
j=1;
double ans=0,m=0;
while(j<=num*3)
{
m=b[j+1];
if(a[j+2]==1)
{
ans=ans-m;
}
else
{
ans=ans+m;
}
j+=3;
}
return ans;
}
int main()
{
int quam=5,max=9, min=3,numam=5;
int fly=1;
//输入生成题目的条件
cout<<"一共出几道题:";
cin>>quam;
cout<<"最多几个数(10个数之间):";
cin>>numam;
cout<<"数值范围:\\n最大值:";
cin>>max;
cout<<"最小值:";
cin>>min;
cout<<"有无乘除?有请按1,无请按0(默认有乘除)\\n";
cin>>fly;
//结束输入生成题目的条件
int i=1;
double ansin;
while(quam--) //循环一次生成一道题
{
cout<<"No."<<i++<<": "; //题目计数器
if(fly==1)
double ans=question( max, min,numam);
else
double ans=question1( max, min,numam);
cout<<"=";
}
return 0;
}
结对编程工作照
评价
廖宇同学作为我的领航员,对我的编程起到了很大的帮助作用,不仅在我遇到疑惑问题时帮我想出解决办法,还给了我解决问题的灵感,让我在一筹莫展时有了方向。结对编程可以发散思维,两个人一个小时能讨论出来的东西,或许一个人一个星期都没法想出来,而且当一个人写出一段代码的时候,另一个人作为旁观者往往更容易发现其中的问题,这对于编程者来说帮助无疑是很大的,有1+1>2的效果。
廖宇同学也很想体验一次驾驶员的角色,让我来扮演导航员,去帮助他解决他编程中的问题,我俩如果能角色互换,对相互的帮助应该也是挺大的,总之这次和廖宇同学的合作很愉快!对我来说,结对编程是一个特别的主题,加强了我对编程的看法——和技术相比,人的因素同样重要。我们是人,为人编写软件,和其他人一起工作。技术很显然是必须的,但是在成为一个卓越的程序员的同时,我们也可以成为一个优秀的人。