结对编程——对洪滢聪的个人项目分析

------------恢复内容开始------------

简介:

洪滢聪的个人项目分为三个部分:源代码,出题文件,说明书。

优缺点分析:

如下图所示

 

 

 

说明书向我们说明了洪滢聪的源代码中的各个函数名以及其对应的功能,如图所示

 

 

 

 源代码如下

1.对类的对应,将运行所需要的信息均写入了类中,之后通过在类中实现各种功能

实现了模块化。

 2.类中各函数

void User::Sign() //用户登录函数
{
while(1)
{
cout<<"请输入用户名和密码:";
cin>>Name>>Passward;
if(Name=="张三1"||Name=="张三2"||Name=="张三3")
{
if(Passward=="123")
{
Grade="小学";
break;
}
}
else if(Name=="李四1"||Name=="李四2"||Name=="李四3")
{
if(Passward=="123")
{
Grade="初中";
break;
}
}
else if(Name=="王五1"||Name=="王五2"||Name=="王五3")
{
if(Passward=="123")
{
Grade="高中";
break;
}
}
cout<<"请输入正确的用户名、密码!"<<endl<<endl;
Sleep(1000);
system("CLS");
}
system("CLS");
cout<<" -------------------"<<endl;
cout<<" |当前选择为"<<Grade<<"出题| "<<endl;
cout<<" -------------------"<<endl;
folderPath=Name;//确定当前账号对应的文件夹的位置
NameFile();//文件命名
Exam();//生成数学试卷
}
void User::Exam()
{
cout<<" 准备生成"<<Grade<<"数学题目";
cout<<"请输入生成题目数量(有效范围为10~30,输入-1将退出当前用户,重新登录):";
cin>>Number;//输入生成题目数量
while(Number>30||Number<10)
{
if(Number==-1)
{
cout<<"您已退出,请重新登录!"<<endl<<endl;
Sign();
Sleep(1000);
system("CLS");
break;
}
cout<<"输入的题目数量有效范围为10~30或-1,请重新输入:";
cin>>Number;
}

Paper.open(Path.c_str());
cout<<"试卷生成成功"<<endl;

int n=Number;//出题
while(n!=0)
{
n--;
int Operand=rand()%5+1;//生成操作数
if(Operand==1&&Grade=="小学") //小学至少是两位操作数
{
Operand=rand()%4+2;//生成2-5个操作数
}
int oNum=Operand;
bool flag=false;
int bracketnum=0;
while(oNum!=0)
{
oNum--;
int option,opt=0;
if(Grade=="小学") option=0;
else if(Grade=="初中")
{
option=rand()%3;//symbol前三个对应初中类型
if(option!=0) flag=true;//说明已经生成了平方或者根号中的一个了
if(oNum==0&&flag==false) option=rand()%2+1;//确保至少有一个
}
else if(Grade=="高中")
{
option=rand()%6;
if(option>2) flag=true;//说明已经生成了平sin,cos或tan中的一个了
if(oNum==0&&flag==false) option=rand()%5+1;//说明一直到最后一个操作数都没有sin,cos或tan,则最后一个必须有
}
int Operand=rand()%100+1;//操作数100以内
if(rand()%2==0&&oNum!=0)
{
question<<"(";
bracketnum++;
}

switch(option)
{
case 0://小学的题目
question<<Operand;
break;
case 1:
question<<Operand<<"^2";
break;
case 2://初中的题目
question<<"√"<<Operand;
break;
case 3:
question<<"sin"<<Operand;
break;
case 4:
question<<"cos"<<Operand;
break;
case 5://高中的题目
question<<"tan"<<Operand;
break;
}

if(rand()%2==1&&bracketnum!=0&&opt!=0)
{
question<<")";
bracketnum--;
opt=0;
}
if(oNum!=0)
{
int opt=rand()%4;
switch(opt)
{
case 0:
question<<"+";
break;
case 1:
question<<"-";
break;
case 2:
question<<"*";
break;
case 3:
question<<"/";
break;
}
opt++;
}
else
{
while(bracketnum!=0)
{
question<<")";
bracketnum--;
}
question<<"=";
}
}
question<<endl;
bool check_result=Check();//检查
if(check_result==true)
{
int order=Number-n;
Paper<<order<<"、 "<<question.str()<<endl;
string pass=Grade+"\\"+Name+"\\"+"passpaper.txt";
passpaper.open(pass.c_str(),ios::app);//打开出题老师已出的题库
passpaper<<question.str()<<endl;
passpaper.close();
question.str(" ");
}
else n++;
}
Paper.close();
}

 


bool User::Check() //查重
{
string checkpass=Grade+"\\"+Name+"\\"+"passpaper.txt";
fstream CheckFile;
CheckFile.open(teacher.c_str(),ios::in|ios::app);
string temp;
while(getline(CheckFile,temp))
{
stringstream stemp(temp);
if(stemp==question)
{
return false;
}
}
CheckFile.close();
return true;
}

void User::Switch()//账号切换
{
string TypeSwitch;
while(1)
{
cout<<endl<<"可选择切换类型(若需要切换类型,请输入\"切换为XX\",若不需要,输入\"否\",若退出登录请输入\"-1\""<<endl;
cout<<"请输入:";
cin>>TypeSwitch;
if(TypeSwitch=="否"||TypeSwitch=="")
{
NameFile();//继续生成
Exam();
system("CLS");
continue;
}
else if(TypeSwitch=="-1") break; //退出操作
if(TypeSwitch=="切换为小学"||TypeSwitch=="切换为初中"||TypeSwitch=="切换为高中")
{
Grade=TypeSwitch.erase(0,6);
NameFile();
Exam();
continue;
}
else
{
while(1) {
cout<<"请输入小学,初中或高中:";
cin>>TypeSwitch;
if(TypeSwitch=="小学"||TypeSwitch=="初中"||TypeSwitch=="高中")
{
Grade=TypeSwitch;
NameFile();
Exam();
break;
}
else if(TypeSwitch=="-1") break;
}
}
if(TypeSwitch=="-1") break;
}
cout<<"您已退出登录!"<<endl;
}
void User::NameFile() //给文件命名的函数
{
char FileName[100];3
time_t It=time(NULL);
tm *ptr=localtime(&It);
strftime(FileName,30,"%y-%m-%d-%H-%M-%S.txt",ptr);
Path=Grade+"\\"+folderPath+"\\"+FileName;
}

(太长了,我就不截图了。。。)

 

总结:洪滢聪的代码将要实现的各功能均作为一个方法在类中实现,功能完整,实现了模块化和子问题的拆分,这是他的代码的一大优点,

但美中不足的是批注实在太多,逐行翻译解释代码含义,不免显得冗余。其次,并未使用工程的方法,将类和主函数写在不同文件中,使得

文件内容过多,不方便“分离编译”的实现。功能测试十分完美,可见洪滢聪对题意及软件体系结构有着充分的思考。综合来看,虽然有些瑕疵,

但总体来说是非常优秀的代码。

 

posted @ 2021-09-28 23:06  湖大挨踢攻城狮caesar  阅读(40)  评论(0)    收藏  举报