计算与软件工程 作业二
第二周作业要求见链接:第二周作业
本文简介
根据作业二的要求,本文主要完成的是两个作业,作业1是对软件工程讲义第二部分内容的预习和学习以及关于小学四则运算的个人程序的编写,本次代码部分是在VS2010中使用C++语言编写的;作业2是通过对git使用的初步学习将作业1所写代码托管到gitee平台上个人仓库中去
作业1
讲义第二部分的预习
讲义第二部分讲的是个人开发技术,重点是效能分析和单元测试方面,老师上课也进行了讲述,讲义也很详细生动地阐述了相关的概念。首先是效能分析部分,讲义中指出效能分析可以采用的两个方法是:1)抽样(Sampling);2)代码注入(Instrumentation)。进行效能分析的一般的做法是,先用抽样的方法找到效能瓶颈所在,然后对特定的模块用代码注入的方法进行详细分析。
通过对单元测试部分的学习,了解到单元测试是一个代码的重要内容,它用于测试代码各个模块的功能的实现及稳定性。讲义中提到进行单元测的主要步骤是:
1.设置数据(一个假想的正确的E-mail地址)
2.使用被测试类型的功能(用E-mail地址来创建一个User类的实体)
3.比较实际结果和预期的结果(Assert.IsTrue(target!= null);)
文中也指出单元测试应该准确、快速地保证程序基本模块的正确性。一个好的单元测试也应该满足一些列的条件,包括测试的速度要快;测试完后机器的状态保持不变;测试应产生可持续且一致的结果等等。
个人代码部分
本次代码的编写环境是Visual Studio2010(旗舰版),使用的编程语言是C++。主要内容是关于小学一至五年级的四则运算,作业的具体要求是:
- 分别能够实现小学一、二、三、四、五年级的四则运算要求, 逐步实现各个年级的难度
- 要求能够通过输入来选择不同年级,每个年级还得区分难,中,易三个等级
- 对于三、四、五年级需要支持括号与多个运算符
- 程序支持判断对错及累计得分与时间
- 一次可以出100道题目,而且不能重复(比如2+3 与 3+2 算重复的)
编程时各个功能主要是通过函数的编写来实现的,代码目前已经能够实现大部分的功能,包括:能够按照各个年级的需求生成一些列的四则运算题目;每个年级包括三个难度等级;学生可以将自己的答案输入系统,输入完成后系统会进行批改,并将错误的题号显示,最后会给出参考答案。(本程序在年级、难度以及一些数字输入不在范围内的时候会进行提醒,并要求重新输入)
运行结果展示
1) 输入年级以及难度选择:
2) 答案的输入
3) 批改结果以及参考答案的显示
4) 年级、难度以及相关数字输入错误时
作业2
遇到的困难
- 在安装gitee时,在官方网站上一直下载不了,后通过一些软件网站进行的下载
- 刚开始想把本地的程序托管到个人仓库时,不知道该如何设置,后参考了两个博客,按照步骤进行了设置:参考博客1和博客2
代码附录在文尾,托管于gitee上的链接是: https://gitee.com/w1010/four_operations15.git
托管设置步骤
最后一步进行了报错,补救方法如下:
最后会提示输入Git的账号和密码:
输入完成后,即完成了设置,仓库里的文件便成功复制到本地对应的文件夹中。
个人代码附录:
#include<iostream>
#include<ctime>
#include<iomanip>
#include<cstdlib>
#define N 100
#define Max 5000
using namespace std;
bool isRep2(int a1,char c,int a2,int n,int A1[N],char C[N],int A2[N])//判断是否生成了重复的题目
{
if(n==0) return false;
for(int i=0;i<n-1;i++)
{
if(c==C[i]&&(((a1==A1[i])&&(a2==A2[i]))||((a1==A2[i]&&a2==A1[i]))))
{
//cout<<"\n Repeat\n";
return true;
}
}
return false;
}
bool isRep3(int a1,char c1,int a2,char c2,int a3,int n,int A1[N],char C1[N],int A2[N],char C2[N],int A3[N])//判断是否生成了重复的题目
{
if(n=0) return false;
for(int i=0;i<n-1;i++)
{
if(c1==C1[i]&&c2==C2[i]&&(a1==A1[i]&&(a2=A2[i]&&A3[i])))
{
return true;
}
}
return false;
}
bool isRep4(int a1,char c1,int a2,char c2,int a3,char c3,int a4,int n,int A1[N],char C1[N],int A2[N],char C2[N],int A3[N],char C3[N],int A4[N])//判断是否生成了重复的题目
{
if(n=0) return false;
for(int i=0;i<n-1;i++)
{
if(c1==C1[i]&&c2==C2[i]&&c3==C3[i]&&a1==A1[i]&&a2==A2[i]&&a3==A3[i]&&a4==A4[i])
{
return true;
}
}
return false;
}
//打印出两个数字运算的题目
void print2(int A1[N],char C[N],int A2[N],int n)//打印生成的题目
{
for(int i=0;i<n;i++)
{
cout<<A1[i]<<C[i]<<A2[i]<<"="<<setw(10)<<"\t";
if((i+1)%5==0) cout<<"\n\n\n";
}
}
//打印出三个数字运算的题目
void print3(int A1[N],char C1[N],int A2[N],char C2[N],int A3[N],int n)
{
for(int i=0;i<n;i++)
{
cout<<A1[i]<<C1[i]<<A2[i]<<C2[i]<<A3[i]<<"="<<setw(10)<<" ";
if((i+1)%5==0) cout<<"\n\n\n";
}
cout<<endl<<endl;
}
//输出普通参考答案
void printA1(int A[N],int st,int n)
{
cout<<"\n参考答案为:\n";
for(int i=st;i<n;i++)
{
cout<<"第 "<<i+st+1<<"题:";
cout<<A[i+st]<<endl;
}
}
//输出带余除法的参考答案
void printA2(int A1[N],int A2[N],int st,int n)
{
cout<<"\n参考答案为:\n ";
for(int i=0;i<n;i++)
{
cout<<"第"<<i+st+1<<"题:";
cout<<"商:"<<A1[i]<<"余数:"<<A2[i]<<endl;
}
}
//两个数的加减法
void createA_2(int x,int n,int Ans[N],int k)//生成小学1,2年级的题目,一年级时x=20,二年级时x=100
{
int a1,a2,t,A1[N],A2[N];
char c=' ',C[N];
bool flg;
srand(int(time(0)));
for(int i=0;i<n;i++)
{
flg=true;
a1=rand()%x;
a2=rand()%x;
t=rand()%2;
if(t==1)
{
c='+';
if(!(a1+a2<x))//避免乘积过大
{
flg=false;
}
else Ans[k+i]=(a1+a2);
}
else
{
c='-';
if(a1<a2)//避免减法出现负数
{
flg=false;
}
else Ans[i+k]=(a1-a2);
}
if(flg)
{
A1[i]=a1;
C[i]=c;
A2[i]=a2;
if(isRep2(a1,c,a2,i,A1,C,A2))
i--;
}
else
i--;
}
print2(A1,C,A2,n);
}
//三个数的加减法
void createA_3(int x,int n,int Ans[N],int k)//生成小学1,2年级的题目,一年级时x=20,二年级时x=100
{
int a1,a2,a3,t1,t2,A1[N],A2[N],A3[N];
char c1=' ',C1[N],c2=' ',C2[N];
bool flg;
srand(int(time(0)));
for(int i=0;i<n;i++)
{
flg=true;
a1=rand()%x;
a2=rand()%x;
a3=rand()%x;
t1=rand()%2;
t2=rand()%2;
if(t1==1)
{
c1='+';
if(t2==1){
c2='+';
if(!(a1+a2+a3<x))//判断是否在x以内以内
{
flg=false;
}
else Ans[i+k]=a1+a2+a3;
}
else
{
c2='-';
if(!(a1+a2-a3<x)||(a1+a2-a3<0))//判断是否在x以内以内
{
flg=false;
}
else Ans[i+k]=a1+a2-a3;
}
}
else
{
c1='-';
if(t2==1){
c2='+';
if(!(a1-a2+a3<x)||(a1-a2+a3<0))//判断是否在x以内以内
{
flg=false;
}
else Ans[i+k]=a1-a2+a3;
}
else
{
c2='-';
if(a1-a2-a3<0)//判断是否在x以内以内
{
flg=false;
}
else Ans[i+k]=a1-a2-a3;
}
}
if(flg)
{
A1[i]=a1;
C1[i]=c1;
A2[i]=a2;
C2[i]=c2;
A3[i]=a3;
if(isRep3(a1,c1,a2,c2,a3,i,A1,C1,A2,C2,A3))
i--;
}
else
i--;
}
print3(A1,C1,A2,C2,A3,n);
}
//两个数的乘除法,整除
void createB_2(int x,int n,int D,int Ans[N],int k)//乘除法,D表示难度等级:3年级除数在10以内,4年级在20以内
//v1:是否有括号(0:无括号,1:有括号)
{
int a1,a2,t,A1[N],A2[N];
char c=' ',C[N];
bool flg;
srand(int(time(0)));
for(int i=0;i<n;i++)
{
flg=true;
t=rand()%2;
if(t==1)
{
a1=rand()%x;
a2=rand()%x;
c='*';
if(!(a1*a2<Max))//避免乘积过大
{
flg=false;
}
else Ans[k+i]=a1*a2;
if(flg)
{
A1[i]=a1;
C[i]=c;
A2[i]=a2;
if(isRep2(a1,c,a2,i,A1,C,A2))
i--;
}
else
i--;
}
else
{
c='/';
a1=rand()%(D*10);
a2=rand()%(x/10);
if(a1==0)//避免乘积过大
{
flg=false;
}
if(flg)
{
A1[i]=a1*a2;
C[i]=c;
A2[i]=a1;
if(isRep2(a1*a2,c,a1,i,A1,C,A2))
i--;
else Ans[i+k]=a2;
}
else
i--;
}
}
print2(A1,C,A2,n);
}
//三个数的乘除法
void createB_3(int x,int n,int Ans[N],int k)
{
int a1,a2,a3,t,A1[N],A2[N];
char c=' ',C[N];
bool flg;
srand(int(time(0)));
for(int i=0;i<n;i++)
{
flg=true;
a1=rand()%x;
a2=rand()%x;
t=rand()%2;
if(t==1)
{
c='*';
if(!(a1*a2<Max))//避免乘积过大
{
flg=false;
}
}
else
{
c='/';
if(a2==03)//避免减法出现负数
{
flg=false;
}
}
if(flg)
{
A1[i]=a1;
C[i]=c;
A2[i]=a2;
if(isRep2(a1,c,a2,i,A1,C,A2))
i--;
}
else
i--;
}
print2(A1,C,A2,n);
}
//带余除法
void createB_X(int x,int n,int Ans1[N],int Ans2[N],int k)
{
int a1,a2,b1,b2,A1[N],A2[N];
char c=' ',C[N];//char c1,c2;
srand(int(time(0)));
for(int i=0;i<n;i++)
{
a1=rand()%x;
a2=rand()%x;
c='/';
if(a1>a2&&(a2!=0))
{
b1=a1/a2;
b2=a1%a2;
A1[i]=a1;
C[i]=c;
A2[i]=a2;
if(isRep2(a1,c,a2,i,A1,C,A2))
i--;
else
{
Ans1[i]=b1;
Ans2[i]=b2;
}
}
else
i--;
}
print2(A1,C,A2,n);
}
//混合运算
void createM(int x,int n,int D,int Ans[N],int k)
{
int a1,a2,a3,a4,A1[N],A2[N],A3[N],A4[N],f;
char c=' ',C1[N],C2[N],C3[N];
bool flg=true;
srand(int(time(0)));
if(D==3)
{
for(int i=0;i<n;i++)
{
flg=true;
a1=rand()%x;
a2=rand()%x;
a3=rand()%x;
a4=rand()%x;
A1[i]=a1;A2[i]=a2;A3[i]=a3;A4[i]=a4;
f=rand()%3;
if(f==0)
{
C1[i]='+';
f=rand()%2;
if(f==0)
{
C2[i]='-';
C3[i]='*';
Ans[i]=a1+a2-a3*a4;
if(Ans[i]<0) flg=false;
}
else
{
C2[i]='*';
C3[i]='-';
Ans[i]=a1+a2*a3-a4;
if(Ans[i]<0) flg=false;
}
}
else if(f==1)
{
C1[i]='-';
f=rand()%2;
if(f==0)
{
C2[i]='+';
C3[i]='*';
Ans[i]=a1-a2+a3*a4;
if(Ans[i]<0) flg=false;
}
else
{
C2[i]='*';
C3[i]='+';
Ans[i]=a1-a2*a3+a4;
if(Ans[i]<0) flg=false;
}
}
else
{
C1[i]='*';
f=rand()%2;
if(f==0)
{
C2[i]='+';
C3[i]='-';
Ans[i]=a1*a2+a3-a4;
if(Ans[i]<0) flg=false;
}
else
{
C2[i]='-';
C3[i]='+';
Ans[i]=a1*a2-a3+a4;
if(Ans[i]<0) flg=false;
}
}
if(flg)
{
if(isRep4(a1,C1[i],a2,C2[i],a3,C3[i],a4,i,A1,C1,A2,C2,A3,C3,A4)) i--;
}
else
{
i--;
}
}
for(int i=0;i<n;i++)
{
cout<<A1[i]<<C1[i]<<A2[i]<<C2[i]<<A3[i]<<C3[i]<<A4[i]<<"="<<setw(10)<<" ";
if((i+1)%5==0) cout<<"\n\n\n";
}
}
else if(D==4)
{
int f1=rand()%5;
//char K1[N],K2[N],k1,k2;
for(int i=0;i<n;i++)
{
flg=true;
f=rand()%3;
if(f==0)
{
C1[i]='+';
f=rand()%2;
if(f==0)
{
C2[i]='-';
C3[i]='*';
}
else
{
C2[i]='*';
C3[i]='-';
}
}
else if(f==1)
{
C1[i]='-';
f=rand()%2;
if(f==0)
{
C2[i]='+';
C3[i]='*';
}
else
{
C2[i]='*';
C3[i]='+';
}
}
else
{
C1[i]='*';
f=rand()%2;
if(f==0)
{
C2[i]='+';
C3[i]='-';
}
else
{
C2[i]='-';
C3[i]='+';
}
}
}
}
else
{
}
}
//普通答案输入
void inputAns1(int n,int ans[N],int k)
{
int tem;
cout<<"\n是否开始答题?\t 1:开始\t2:暂不开始";
cin>>tem;
while(tem!=1)
{
if(tem==2&&(tem!=1))
{
cout<<"暂未开始答题,若开始答题,请输入数字1;\t是否开始?\t";
cin>>tem;
}
else
{
cout<<"输入数字有误!!!请重新输入:1:开始答题\t2:暂不开始答题";
cin>>tem;
}
}
cout<<"**\t答题开始!!!\t**\n";
cout<<"请输入答案:\n";
for(int i=0;i<n;i++)
{
cout<<"第"<<i+1<<"题:";
cin>>ans[i+k];
}
}
//带余除法的答案输入
void inputAns2(int n,int ans1[N],int ans2[N],int k)
{
for(int i=0;i<n;i++)
{
cout<<"第"<<i+k+1<<"题:";
cout<<"请输入商:";
cin>>ans1[i];
cout<<"请输入余数:";
cin>>ans2[i];
}
}
//普通结果的答案校对
void checkAns1(int A[N],int a[N],int E[N],int st,int &k,int n)
{
for(int i=st;i<n;i++)
{
if(a[i]!=A[i]) E[k++]=i+1;
}
}
//带余除法的答案校对
void checkAns2(int Ans1[N],int Ans2[N],int b1[N],int b2[N],int E[N],int st,int &k,int n)
{
for(int i=st;i<n;i++)
{
if(b1[i]!=Ans1[i]||(b2[i]!=Ans2[i])) E[k++]=i+1;
}
}
//输出错误题号
void printE(int k,int E[N])
{
for(int i=0;i<k;i++)
{
cout<<E[i]<<"\t";
}
}
void main()
{
int x,n,d,tem,ch,k=0,count=0,Ans[N],Ans1[N],Ans2[N],a1[N],ans1[N],ans2[N],e1[N],b1[N],b2[N],E[N];
char temp;
cout<<"\n*****欢迎来到小学四则运算程序*****\n\n";
cout<<"请选择年级(输入数字1~5,对应一至五年级):";cin>>x;
while(x<=0||x>5)
{
cout<<"年级输入有误,请重新输入年级对应数字(数字1~5,对应一至五年级):";
cin>>x;
}
cout<<"请选择题目难度(数字1、2、3对应:简单、中等,难):";cin>>d;
while(d<=0||d>3)
{
cout<<"难度选择有误,请重新选择难度对应的数字(数字1、2、3对应:简单、中等,难):";
cin>>d;
}
cout<<"请输入要生成的题目的个数:";cin>>n;
switch (x)
{
case 1:
cout<<"\n\n计算下列式子:"<<endl;
if(d==1)
createA_2(20,n,Ans,0);
else if(d==3)
createA_3(20,n,Ans,0);
else
{
createA_2(20,n/2,Ans,0);
createA_3(20,(n-n/2),Ans,n/2);
}
inputAns1(n,a1,0);
checkAns1(Ans,a1,E,0,k,n);
cout<<"\n\n错误题号为:";
printE(k,E);
printA1(Ans,0,n);
break;
case 2:
cout<<"\n\n计算下列式子:"<<endl;
if(d==1)
createA_2(100,n,Ans,0);
else if(d==3)
createA_3(100,n,Ans,0);
else
{
createA_2(100,n/2,Ans,0);
createA_3(100,(n-n/2),Ans,n/2);
}
inputAns1(n,a1,0);
checkAns1(Ans,a1,E,0,k,n);
cout<<"\n\n错误题号为:";
printE(k,E);
printA1(Ans,0,n);
break;
case 3:
cout<<"\n\n请通过口算或者列竖式,计算下列式子:"<<endl;
if(d==1)
{
createA_3(200,n/3,Ans,0);
createB_2(100,(n-n/3),3,Ans,n/3);
//createM(100,(n-n/3),3,Ans,n/3);
inputAns1(n,a1,0);
checkAns1(Ans,a1,E,0,k,n);
cout<<"\n\n错误题号为:";
printE(k,E);
printA1(Ans,0,n);
}
else if(d==3)
{
createM(100,n,3,Ans,0);
inputAns1(n,a1,0);
checkAns1(Ans,a1,E,0,k,2*n/3);
cout<<"\n\n错误题号为:";
printE(k,E);
printA1(Ans,0,2*n/3);
}
else
{
createA_3(300,n/3,Ans,0);
createM(100,n/3,3,Ans,n/3);
cout<<"\n使用带余除法计算下列各题\n";
createB_X(100,(n-2*n/3),Ans1,Ans2,0);
inputAns1(2*n/3,a1,0);
inputAns2((n-2*n/3),ans1,ans2,2*n/3);
checkAns1(Ans,a1,E,0,k,2*n/3);
checkAns2(Ans1,Ans2,ans1,ans2,E,2*n/3,k,(n-2*n/3));
cout<<"\n\n错误题号为:";
printE(k,E);
printA1(Ans,0,2*n/3);
printA2(Ans1,Ans2,2*n/3,(n-2*n/3));
printA1(Ans,0,n);
}
break;
case 4:
if(d==1)
createA_2(100,n,Ans,0);
else if(d==3)
createA_3(100,n,Ans,0);
else
{
}
break;
case 5:
if(d==1)
createA_2(100,n,Ans,0);
else if(d==3)
createA_3(100,n,Ans,0);
else
{
}
break;
}
system ("pause");
}