*此试验报告为软件工程综合实践专题课程第二次博文,内容主要包括三个方面:代码,过程和心得,我们从这三个方面出发详细介绍了我们整个结对编程的全部过程;此博文结对人分别为:学号为1759113的张兴鹏和学号为1759126的齐祥遥。
一、编程
首先我们两人通过简单的讨论和查找资料后确定了编写程序的语言为C++语言,然后由齐祥遥主导张兴鹏辅助合力完成了包含了题目基本要求的代码(下面附上了代码和结果图1-1)。在这一过程中两人首先查找了一些会用到的函数,阅读了一些大佬所写的代码,完成准备工作后,两人开始编写,在编写过程中边写边改效率还是很高的,这一过程总共花了大约1个半小时。
*基本要求:出300道题,两个运算符(+/-),100以内的数字,不需要写答案,具体程序如下:(这其中包含一些隐藏要求:由于小学没有学负数所以要保证结果不为0;300道量较大所以需要合适的输出格式)
*ver1.1
#include <iostream>
using namespace std;
#include<stdlib.h>
#include<conio.h>
#include<string.h>
//运算符数组
string Operation[2]={"+","-"};
//出题
void drawQuestion(){
int i=rand()%100;
int j=rand()%100;
int n=rand()%2;
/*保证结果不为负数,控制输出格式*/
if(i>=j){
if(i>=10&&j>=10)
cout<<i<< Operation[n] <<j<<" = "<<" ";
else if(i>=10&&j<10)
cout<<i<< Operation[n] <<j<<" = "<<" ";
else if(i<10&&j>=10)
cout<<i<<" "<< Operation[n] <<j<<" = "<<" ";
else cout<<i<<" "<< Operation[n] <<j<<" = "<<" ";
}
else drawQuestion();
}
//主函数
int main(int argc, char** argv) {
for(int i=1;i<=300;i++){
drawQuestion();
if(i%10==0) cout<<endl;
}
return 0;
}
1-1运算结果
二、修改
(一)初次修改:
在基本要求的基础上,现在增加了新的要求:需要写出答案,并保证答案在0-100之间。所以我们需要在前面的基础上对功能进行拓展,这一部分同样主要由齐祥遥主导张兴鹏辅助,和前面一样边写边改,只用了差不多10分钟的时间,因为只需要添加很少一部分的代码具体程序如下:(同时附上结果图2-1)
*ver1.2
#include <iostream>
using namespace std;
#include<stdlib.h>
#include<conio.h>
#include<string.h>
//运算符数组
string Operation[2]={"+","-"};
//出题
void drawQuestion(){
int i=rand()%100;
int j=rand()%100;
int n=rand()%2;
int answer=0;
switch(n){
case 0:answer=i+j;break;
case 1:answer=i-j;break;
}
/*保证结果在0~100之间,控制输出格式*/
if(answer>=0&&answer<=100&&i>=j){
if(i>=10&&j>=10){
if(answer>=10)
cout<<i<< Operation[n] <<j<<" = "<<answer<<" ";
else cout<<i<< Operation[n] <<j<<" = "<<answer<<" ";
}
else if(i>=10&&j<10){
if(answer>=10)
cout<<i<< Operation[n] <<j<<" = "<<answer<<" ";
else cout<<i<< Operation[n] <<j<<" = "<<answer<<" ";
}
else if(i<10&&j>=10){
if(answer>=10)
cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<" ";
else cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<" ";
}
else {
if(answer>=10)
cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<" ";
else cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<" ";
}
}
else drawQuestion();
}
//主函数
int main(int argc, char** argv) {
for(int i=1;i<=300;i++){
drawQuestion();
if(i%10==0) cout<<endl;
}
return 0;
}
2-1-1运算结果
(二)二次修改:
在第二次修改时我们经过讨论决定再添加两个新的功能:①题目避免重复;②增加乘除法(其中除法有余数并显示余数)。这些同样是需要在原来代码的基础上进行扩展,这部分由张兴鹏负责完成避免题目重复功能,由齐祥遥完成增加乘除法功能,在这部份上我们花费的时间要稍微多一点点,主要是因为除法需要注意的地方很多,最后花了大概半个多小时的时间完成。而这其中涉及到的一些问题的解决和最终的程序如下:
(1)问题:
①在前面两个版本中我们注意到rand()函数的局限性:不管运行多少次后面生成的都和第一次完全一样,所以如果想要实现避免题目重复的功能就必须要了解rand()函数的使用方法并对它进行修改,最后我们通过查找资料找到了相关的解决办法如下:
首先由于rand()函数不是真正的随机数生成器,而srand()会设置供rand()使用的随机数种子,所以如果你在第一次调用rand()之前没有调用srand(),那么系统会为你自动调用srand(),而使用同种子相同的数调用 rand()会导致相同的随机数序列被生成,所以才导致了前面的局限性,而解决办法就是引入srand()函数。
②在这一版本中我们增加了乘除法,乘法倒是不用特别注意,但是除法就需要注意到很多问题了:首先我们要的是没有余数,这个还好直接使用“/”符号就可以达到要求,但是由于是小学题要注意保证能除整且被除数大于或等于除数,其次要注意被除数和除数都不能为0,所以针对除法我们专门设计了一个函数来解决。
(2)最终程序:(同时附上两个不一样的结果图2-2-1和2-2-2)
*ver1.3
#include <iostream>
using namespace std;
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#include <time.h>
//函数
void drawQuestion1(int i,int j,int answer,int n);
void drawQuestion2(int i,int j,int answer,int n);
void drawQuestion3(int i,int j,int answer,int n,int remainder);
int division(int num1,int num2);
//运算符数组
string Operation[4]={"+","-","*","/"};
//出题
void drawQuestion(){
int i=rand()%100;
int j=rand()%100;
int n=rand()%4;
int answer;
switch(n){
case 0:{
answer=i+j;
drawQuestion2(i,j,answer,n);
break;
}
case 1:{
answer=i-j;
drawQuestion1(i,j,answer,n);
break;
}
case 2:{
answer=i*j;
drawQuestion2(i,j,answer,n);
break;
}
case 3:{
if(i!=0&&j!=0){
int div=division(i,j);
if(div==i){
answer=i/j;
int remainder=i%j;
drawQuestion3(i,j,answer,n,remainder);
}
else if(div==j){
answer=j/i;
int remainder=j%i;
drawQuestion3(j,i,answer,n,remainder);
}
}
else drawQuestion();
break;
}
}
}
//主函数
int main(int argc, char** argv){
srand(time(0));
for(int i=1;i<=300;i++){
drawQuestion();
if(i%10==0) cout<<endl;
}
return 0;
}
//保证被除数大于或等于除数
int division(int num1,int num2){
if(num1<num2)/*交换两个数,使大数放在num1上*/
{
int temp=num1;
num1=num2;
num2=temp;
}
return num1;
}
//保证输出格式(针对减法)
void drawQuestion1(int i,int j,int answer,int n){
if(answer>=0&&answer<=100&&i>=j){
if(i>=10&&j>=10){
if(answer>=10)
cout<<i<< Operation[n] <<j<<" = "<<answer<<" ";
else cout<<i<< Operation[n] <<j<<" = "<<answer<<" ";
}
else if(i>=10&&j<10){
if(answer>=10)
cout<<i<< Operation[n] <<j<<" = "<<answer<<" ";
else cout<<i<< Operation[n] <<j<<" = "<<answer<<" ";
}
else if(i<10&&j>=10){
if(answer>=10)
cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<" ";
else cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<" ";
}
else {
if(answer>=10)
cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<" ";
else cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<" ";
}
}
else drawQuestion();
}
//保证输出格式(针对加法和乘法)
void drawQuestion2(int i,int j,int answer,int n){
if(answer>=0&&answer<=100){
if(i>=10&&j>=10){
if(answer>=10)
cout<<i<< Operation[n] <<j<<" = "<<answer<<" ";
else cout<<i<< Operation[n] <<j<<" = "<<answer<<" ";
}
else if(i>=10&&j<10){
if(answer>=10)
cout<<i<< Operation[n] <<j<<" = "<<answer<<" ";
else cout<<i<< Operation[n] <<j<<" = "<<answer<<" ";
}
else if(i<10&&j>=10){
if(answer>=10)
cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<" ";
else cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<" ";
}
else {
if(answer>=10)
cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<" ";
else cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<" ";
}
}
else drawQuestion();
}
//保证输出格式(针对除法 )
void drawQuestion3(int i,int j,int answer,int n,int remainder){
if(answer>=0&&answer<=100){
if(i>=10&&j>=10){
if(answer>=10){
if(remainder>=10)
cout<<i<< Operation[n] <<j<<" = "<<answer<<"..."<<remainder<<" ";
else cout<<i<< Operation[n] <<j<<" = "<<answer<<"..."<<remainder<<" ";
}
else {
if(remainder>=10)
cout<<i<< Operation[n] <<j<<" = "<<answer<<"..."<<remainder<<" ";
else cout<<i<< Operation[n] <<j<<" = "<<answer<<"..."<<remainder<<" ";
}
}
else if(i>=10&&j<10){
if(answer>=10){
if(remainder>=10)
cout<<i<< Operation[n] <<j<<" = "<<answer<<"..."<<remainder<<" ";
else cout<<i<< Operation[n] <<j<<" = "<<answer<<"..."<<remainder<<" ";
}
else {
if(remainder>=10)
cout<<i<< Operation[n] <<j<<" = "<<answer<<"..."<<remainder<<" ";
else cout<<i<< Operation[n] <<j<<" = "<<answer<<"..."<<remainder<<" ";
}
}
else if(i<10&&j>=10){
if(answer>=10){
if(remainder>=10)
cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<"..."<<remainder<<" ";
else cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<"..."<<remainder<<" ";
}
else {
if(remainder>=10)
cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<"..."<<remainder<<" ";
else cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<"..."<<remainder<<" ";
}
}
else {
if(answer>=10){
if(remainder>=10)
cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<"..."<<remainder<<" ";
else cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<"..."<<remainder<<" ";
}
else {
if(remainder>=10)
cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<"..."<<remainder<<" ";
else cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<"..."<<remainder<<" ";
}
}
}
else drawQuestion();
}
2-2-1运算结果
2-2-2运算结果
(三)最后修改:
考虑到我们的能力和时间问题,我们经过讨论将这次修改作为最后一次修改,所以有很多老师后面提出的要求我们没能实现,而这次修改也是在原来的基础上增加了两个新功能:①可定制数值范围②可定制除法有无余数,即可以使这个程序的受众面更广。这部分也是一种扩展,但是只用在前面的基础上添加一些选择语句即可,在技术上是没有什么难度的,但是选择语句在哪里添加是我们所需要认真考虑的,这部分内容同样由张兴鹏负责数值范围,齐祥遥负责有无余数,在这一次修改上我们花费的时间还是挺多的,因为增加选择语句对很多地方都有一些影响要非常注意才行,所以花了大概1个小时才完成,最终程序如下:(同时附上结果图)
*ver1.3
#include <iostream>
using namespace std;
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#include <time.h>
//函数
void drawQuestion1(int i,int j,int answer,int n,int SZ,int YS,int MIN=0,int MAX=100);
void drawQuestion2(int i,int j,int answer,int n,int SZ,int YS,int MIN=0,int MAX=100);
void drawQuestion3(int i,int j,int answer,int n,int remainder,int SZ,int YS,int MIN=0,int MAX=100);
void drawQuestion4(int i,int j,int answer,int n,int SZ,int YS,int MIN=0,int MAX=100);
int division1(int num1,int num2);
//运算符数组
string Operation[4]={"+","-","*","/"};
//出题
void drawQuestion(int SZ,int YS,int MIN=0,int MAX=100){
if(SZ==0){
int i=rand()%MAX;
int j=rand()%MAX;
int n=rand()%4;
int answer;
switch(n){
case 0:{
answer=i+j;
drawQuestion2(i,j,answer,n,SZ,YS,MIN,MAX);
break;
}
case 1:{
answer=i-j;
drawQuestion1(i,j,answer,n,SZ,YS,MIN,MAX);
break;
}
case 2:{
answer=i*j;
drawQuestion2(i,j,answer,n,SZ,YS,MIN,MAX);
break;
}
case 3:{
if(YS==0){
if(i!=0&&j!=0){
int div=division1(i,j);
if(div==i){
answer=i/j;
int remainder=i%j;
drawQuestion3(i,j,answer,n,remainder,SZ,YS,MIN,MAX);
}
else if(div==j){
answer=j/i;
int remainder=j%i;
drawQuestion3(j,i,answer,n,remainder,SZ,YS,MIN,MAX);
}
}
else drawQuestion(SZ,YS,MIN,MAX);
break;
}
else if(YS==1){
if(i!=0&&j!=0){
int div=division1(i,j);
if(div==i){
if(i%j==0){
answer=i/j;
drawQuestion4(i,j,answer,n,SZ,YS,MIN,MAX);
}
else drawQuestion(SZ,YS,MIN,MAX);
}
else if(div==j){
if(j%i==0){
answer=j/i;
drawQuestion4(j,i,answer,n,SZ,YS,MIN,MAX);
}
else drawQuestion(SZ,YS,MIN,MAX);
}
}
else drawQuestion(SZ,YS,MIN,MAX);
break;
}
}
}
}
else {
int i=MIN+rand()%(MAX-MIN+1);
int j=MIN+rand()%(MAX-MIN+1);
int n=rand()%4;
int answer;
switch(n){
case 0:{
answer=i+j;
drawQuestion2(i,j,answer,n,SZ,YS,MIN,MAX);
break;
}
case 1:{
answer=i-j;
drawQuestion1(i,j,answer,n,SZ,YS,MIN,MAX);
break;
}
case 2:{
answer=i*j;
drawQuestion2(i,j,answer,n,SZ,YS,MIN,MAX);
break;
}
case 3:{
if(YS==0){
if(i!=0&&j!=0){
int div=division1(i,j);
if(div==i){
answer=i/j;
int remainder=i%j;
drawQuestion3(i,j,answer,n,remainder,SZ,YS,MIN,MAX);
}
else if(div==j){
answer=j/i;
int remainder=j%i;
drawQuestion3(j,i,answer,n,remainder,SZ,YS,MIN,MAX);
}
}
else drawQuestion(SZ,YS,MIN,MAX);
break;
}
else if(YS==1){
if(i!=0&&j!=0){
int div=division1(i,j);
if(div==i){
if(i%j==0){
answer=i/j;
drawQuestion4(i,j,answer,n,SZ,YS,MIN,MAX);
}
else drawQuestion(SZ,YS,MIN,MAX);
}
else if(div==j){
if(j%i==0){
answer=j/i;
drawQuestion4(j,i,answer,n,SZ,YS,MIN,MAX);
}
else drawQuestion(SZ,YS,MIN,MAX);
}
}
else drawQuestion(SZ,YS,MIN,MAX);
break;
}
}
}
}
}
//主函数
int main(int argc, char** argv){
cout<<"请选择是否定制数值范围:"<<endl;
cout<<" 0、否!即默认0~100之间 "<<endl;
cout<<" 1、是! "<<endl;
cout<<"请选择除法是否带有余数:"<<endl;
cout<<" 0、是! "<<endl;
cout<<" 1、否! "<<endl;
srand(time(0));
int MIN,MAX,SZ,YS;
cin>>SZ>>YS;
cout<<"请输入数值范围:"<<endl;
cin>>MIN>>MAX;
for(int i=1;i<=300;i++){
drawQuestion(SZ,YS,MIN,MAX);
if(i%10==0) cout<<endl;
}
return 0;
}
//保证被除数大于或等于除数
int division1(int num1,int num2){
if(num1<num2)/*交换两个数,使大数放在num1上*/
{
int temp=num1;
num1=num2;
num2=temp;
}
return num1;
}
//保证输出格式(针对减法)
void drawQuestion1(int i,int j,int answer,int n,int SZ,int YS,int MIN,int MAX){
if(answer>=0&&answer<=100&&i>=j){
if(i>=10&&j>=10){
if(answer>=10)
cout<<i<< Operation[n] <<j<<" = "<<answer<<" ";
else cout<<i<< Operation[n] <<j<<" = "<<answer<<" ";
}
else if(i>=10&&j<10){
if(answer>=10)
cout<<i<< Operation[n] <<j<<" = "<<answer<<" ";
else cout<<i<< Operation[n] <<j<<" = "<<answer<<" ";
}
else if(i<10&&j>=10){
if(answer>=10)
cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<" ";
else cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<" ";
}
else {
if(answer>=10)
cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<" ";
else cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<" ";
}
}
else drawQuestion(SZ,YS,MIN,MAX);
}
//保证输出格式(针对加法和乘法)
void drawQuestion2(int i,int j,int answer,int n,int SZ,int YS,int MIN,int MAX){
if(answer>=0&&answer<=100){
if(i>=10&&j>=10){
if(answer>=10)
cout<<i<< Operation[n] <<j<<" = "<<answer<<" ";
else cout<<i<< Operation[n] <<j<<" = "<<answer<<" ";
}
else if(i>=10&&j<10){
if(answer>=10)
cout<<i<< Operation[n] <<j<<" = "<<answer<<" ";
else cout<<i<< Operation[n] <<j<<" = "<<answer<<" ";
}
else if(i<10&&j>=10){
if(answer>=10)
cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<" ";
else cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<" ";
}
else {
if(answer>=10)
cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<" ";
else cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<" ";
}
}
else drawQuestion(SZ,YS,MIN,MAX);
}
//保证输出格式(有余数除法)
void drawQuestion3(int i,int j,int answer,int n,int remainder,int SZ,int YS,int MIN,int MAX){
if(answer>=0&&answer<=100){
if(i>=10&&j>=10){
if(answer>=10){
if(remainder>=10)
cout<<i<< Operation[n] <<j<<" = "<<answer<<"..."<<remainder<<" ";
else cout<<i<< Operation[n] <<j<<" = "<<answer<<"..."<<remainder<<" ";
}
else {
if(remainder>=10)
cout<<i<< Operation[n] <<j<<" = "<<answer<<"..."<<remainder<<" ";
else cout<<i<< Operation[n] <<j<<" = "<<answer<<"..."<<remainder<<" ";
}
}
else if(i>=10&&j<10){
if(answer>=10){
if(remainder>=10)
cout<<i<< Operation[n] <<j<<" = "<<answer<<"..."<<remainder<<" ";
else cout<<i<< Operation[n] <<j<<" = "<<answer<<"..."<<remainder<<" ";
}
else {
if(remainder>=10)
cout<<i<< Operation[n] <<j<<" = "<<answer<<"..."<<remainder<<" ";
else cout<<i<< Operation[n] <<j<<" = "<<answer<<"..."<<remainder<<" ";
}
}
else if(i<10&&j>=10){
if(answer>=10){
if(remainder>=10)
cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<"..."<<remainder<<" ";
else cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<"..."<<remainder<<" ";
}
else {
if(remainder>=10)
cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<"..."<<remainder<<" ";
else cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<"..."<<remainder<<" ";
}
}
else {
if(answer>=10){
if(remainder>=10)
cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<"..."<<remainder<<" ";
else cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<"..."<<remainder<<" ";
}
else {
if(remainder>=10)
cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<"..."<<remainder<<" ";
else cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<"..."<<remainder<<" ";
}
}
}
else drawQuestion(SZ,YS,MIN,MAX);
}
//保证输出格式(无余数除法)
void drawQuestion4(int i,int j,int answer,int n,int SZ,int YS,int MIN,int MAX){
if(answer>=0&&answer<=100){
if(i>=10&&j>=10){
if(answer>=10){
cout<<i<< Operation[n] <<j<<" = "<<answer<<" ";
}
else {
cout<<i<< Operation[n] <<j<<" = "<<answer<<" ";
}
}
else if(i>=10&&j<10){
if(answer>=10){
cout<<i<< Operation[n] <<j<<" = "<<answer<<" ";
}
else {
cout<<i<< Operation[n] <<j<<" = "<<answer<<" ";
}
}
else if(i<10&&j>=10){
if(answer>=10){
cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<" ";
}
else {
cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<" ";
}
}
else {
if(answer>=10){
cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<" ";
}
else {
cout<<i<<" "<< Operation[n] <<j<<" = "<<answer<<" ";
}
}
}
else drawQuestion(SZ,YS,MIN,MAX);
}
2-3-1运算结果
2-3-2运算结果
2-3-3运算结果
2-3-4运算结果
三、心得与体会
在这次结对编程中我们了解到了团队合作的重要性,除了可以快速高效的完成任务之外,还能有很多新的想法碰撞出来,在彼此的学习之中又收获了许多一个人无法获得的东西,比如说彼此之间的交流d等。除了团队合作之外,这次的最大收获应该算得上是对随机函数的全面理解学习和掌握了,除此之外还有对程序功能一点一点扩展的过程,但是也仍然有很多很多的不足之处,比如说代码还是太过繁杂,可能无法让他人直接读明白,运行的时间太长等等等等还有很多东西我们依然要去学习,我们还有很长的路要走,加油吧(ง •̀_•́)ง!