个人项目互评
前言:
首先,很有幸能有这样一次和队友互相学习的机会。正好我们两个人都是选择的C++,通过对比分析对方的代码,学习到了很多,也深刻认识到了自己的不足,还有很长的路要走。
程序结构:
队友的代码用了一个cpp文件便包含了所有代码,这稍微有点不好,如果能够将各个功能函数各自放在头文件,就能让代码读起来更加通俗易懂。看上去也更加美观,方便读者理解。
函数功能:
1.Login()为登录函数,主要用来显示登录界面和输入账号密码。
void login(){
cout<<"======================================="<<endl;
cout<<"===========试卷生成程序================"<<endl;
cout<<"======================================="<<endl;
cout<<endl;
cout<<"请输入用户名和密码(两者用空格隔开)"<<endl;
cout<<"退出的话请输入-1"<<endl;
string core;
getline(cin,core);
cout<<endl;
if (core=="-1") {
exit(0);
}
else
for(int i=0;i<9;i++){ //遍历九个账户对比
if (student[i].check(core)) {
cout<<"登录成功!"<<endl;
order=i;
result=1;
NowEducation=student[i].education;
ChooseEducation();
ProduceExam();
break;
}
if (i==8) { //遍历找不到相同的说明输入数据错误
cout<<"数据无效,请输入正确的账户密码。"<<endl;
getline(cin,core);
cout<<endl;
i=-1;
result=0;
}
}
}
2. ChooseEducation()函数可以让用户选择是否切换试卷难度。
void ChooseEducation(){ //选择是否切换难度以及新的难度
cout<<"您当前的选择的难度为"+NowEducation<<","<<"是否需要切换?"<<endl;
cout<<"切换的话请输入新的难度,不切换的话请输入“否”即可"<<endl;
string choice;
cin>>choice;
if (choice=="否") {
cout<<"确认,不修改难度"<<endl;}
else{
NowEducation=choice;
}
}
3. ProduceExam()函数用来生成试卷,为了不让本函数行数太多,生成试卷的具体操作则被拆分成了3个函数: Primary(),Middle(),High()三个函数分别用来生成小学,初中,高中试卷。令人注意的是,三个函数之间的代码存在着大量的重复,如果可以在此改进的话可以大大减少代码的行数。由于代码量较大,此处不予具体展示。
void ProduceExam(){
cout<<"将为您生成"+NowEducation+"题目"<<endl;
cout<<"请选择题目数量(范围为10-30),退出登录的话请输入-1"<<endl;
cin>>number;
if (number==-1) { //输入-1退出
cout<<"您已退出登录,请重新登录。"<<endl;
login();
exit(0);
}
while(number<10||number>30){ //不在范围内则重新输入
cout<<"您输入的数量不在范围内,请输入正确的数量"<<endl;
cin>>number;
}
if (number>=10&&number<=30) {
const char *folder = student[order].account.c_str();
if (_access(folder,0) == -1) {
_mkdir(folder);
}
MakeRoad(); //生成文件路径
cfile.open(road.c_str());
cfile<<"当前试卷为"<<NowEducation<<"难度,共有"<<number<<"道题目"<<endl;
checkfile.open(checkroad.c_str(),ios::app);
if (NowEducation=="小学") { //按难度决定用哪个函数
Primary(number);
}
if (NowEducation=="初中") {
Middle(number);
}
if (NowEducation=="高中") {
High(number);
}
cfile.close();
checkfile.close(); //流关闭
}
}
4.MakeRoad()函数用来生成存储题目的文件路径。
void MakeRoad() //生成文件路径
{
road = ""; //路径清空
checkroad = "";
struct tm *ctime;
time_t lt;
char str[80];
lt=time(NULL);
ctime=localtime(<);
strftime(str,100,"%Y-%m-%d-%H-%M-%S.txt",ctime);
road = student[order].account + "/" + str;
checkroad = student[order].account + "/Repeat.txt";
}
5.Same()函数用来查重。
bool same(string exam, string road) //如果遇到重复的题目,就返回true
{
fstream file;
file.open(road.c_str());
string file_exercise;
while (getline(file,file_exercise))
{
if (file_exercise == exam) {
file.close();
return true;
}
}
file.close();
return false;
}
6.main()函数。有个不错的优点就是队友的主函数非常简洁,只有很少的几行。
int main(){
AddStudent();
login();
return 0;
}
总结:
总的来说,代码大体上来说还算比较简洁,注释的地方也比较详细,排版整洁美观,理解起来也没有太大的问题,也基本实现的项目所需要的功能。
但是还有许多地方可以改进,比如没有设置头文件分散函数,有些量的定义不是很规范,代码中有许多重复的地方,高中的题目不够复杂(没有平方和根号)等。除此以外,代码规范也存在着问题,要求2空格缩进,但队友的代码是4空格缩进。
最后,还可以想办法增加一些拓展功能,增加代码的实用性。希望在之后的学习中能和队友互相学习,共同促进,取长补短。
浙公网安备 33010602011771号