个人项目互评

前言:

首先,很有幸能有这样一次和队友互相学习的机会。正好我们两个人都是选择的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(&lt);
    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空格缩进。

最后,还可以想办法增加一些拓展功能,增加代码的实用性。希望在之后的学习中能和队友互相学习,共同促进,取长补短。

posted @ 2023-09-19 23:46  昼梦  阅读(278)  评论(0)    收藏  举报