项目需求
面向用户:
小学、初中、高中老师。
功能:
1、命令行输入用户名和密码,两者之间用空格隔开(程序预设小学、初中和高中各三个账号,具体见附表),如果用户名和密码都正确,将根据账户类型显示“当前选择为XX出题”,XX为小学、初中和高中三个选项中的一个。否则提示“请输入正确的用户名、密码”,重新输入用户名、密码;
2、登录后,系统提示“准备生成XX数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):”,XX为小学、初中和高中三个选项中的一个,用户输入所需出的卷子的题目数量,系统默认将根据账号类型进行出题。每道题目的操作数在1-5个之间,操作数取值范围为1-100;
3、题目数量的有效输入范围是“10-30”(含10,30,或-1退出登录),程序根据输入的题目数量生成符合小学、初中和高中难度的题目的卷子(具体要求见附表)。同一个老师的卷子中的题目不能与以前的已生成的卷子中的题目重复(以指定文件夹下存在的文件为准,见5);
4、在登录状态下,如果用户需要切换类型选项,命令行输入“切换为XX”,XX为小学、初中和高中三个选项中的一个,输入项不符合要求时,程序控制台提示“请输入小学、初中和高中三个选项中的一个”;输入正确后,显示“”系统提示“准备生成XX数学题目,请输入生成题目数量”,用户输入所需出的卷子的题目数量,系统新设置的类型进行出题;
5、生成的题目将以“年-月-日-时-分-秒.txt”的形式保存,每个账号一个文件夹。每道题目有题号,每题之间空一行;
6.附录:
(1)附表1:用户名及密码:
(2):小学、初中、高中题目难度要求
Partner代码结构分析
一.代码运行结果
二.代码结构分析
设置了一个类,使用了七个函数,分别完成输入、生成题目数量、出题、获取时间、创建文件夹、查重、切换难度这些功能,互相调用实现命令行界面和出题的效果。
优点:
-
思路清晰,结构分明,可以用一个不错的流程图说明想法过程。很容易让人看清代码的结构功能,而且格式都比较规范,有按照要求来写。模块化处理,不会重复写出同样功能的代码。
-
头文件没有出现通配符,合理利用空间。
#include <iostream> #include <fstream> #include <string> #include <sstream> #include <stdlib.h> #include <math.h> #include <direct.h> #include <time.h>
-
登陆提示比较亲切良好而且直截了当,不花里胡哨。并且完成了基本功能。
-
自动生成的卷子里,三个级别的卷子都是比较符合要求的,满足了小学都是加减乘除,初中题必须包括根号和平方,高中题必须包括sin,cos,tan。
-
类的封装做的很好,生成函数都比较不错,完善代码思路的前提下,还补充了注释思路说明和作用,清晰得当。并且在遇到数字与特殊符号连用的时候用空格分开,符合代码规范。
-
class Teacher { public: void Enter(); //登录,输入用户名和密码,判断是否正确、能否登录系统 void Create_question(); //创建题目,创建生成符合小学、初中、高中难度的题目 void Create_Exampaper(); //创建卷子,创建不含有该老师曾经出过的题的试卷 string Gettime(); //获得当前时间 void Create_File(); //创建文件夹、文件 bool Repeate(); //查重,判断题目是否跟已生成的重复 void Change(); //切换类型选项,切换账户类型,每位老师可以生成不同类型的题 private: string name_; //用户名 string password_; //密码 string type_; //类型 int question_number_; //需生成的题量 ofstream paper_; //要写入的文件 string folderpath_; //文件夹路径 string filepath_; //文件路径 stringstream question_; //题目 };
-
有效使用了生成文件的方法,并且最后关闭们不会造成后台占用问题。
-
void Teacher::Create_File() { string filename_ = Gettime(); filepath_ = folderpath_ + "//" + filename_ + ".txt"; mkdir(folderpath_.c_str()); //创建文件夹 paper_.open(filepath_.c_str()); //创建文件 paper_.close(); }
-
后面查重部分使用了查看路径以及ios文件流的函数,说明这方面的知识十分到位。
-
bool Teacher::Repeate() { fstream check; string checkpath = folderpath_ + "//check.txt"; check.open(checkpath.c_str(), ios::in); //以只读的方式打开 string s; //从文件中读取字符串赋值给s while (getline(check, s)) { //判断是否存在,重复 if (s == question_.str()) return false; } check.close(); check.open(checkpath.c_str(), ios::out | ios::app); //以写的方式打开,且写在文件末尾 check << question_.str(); check.close(); return true; }
-
良好地利用while循环语句,需要多次判断输入,进行指令的回溯和调用,在合适的时刻跳出,大大缩短代码行数。
- 生成题目随机性高。
缺点:
- 路径没有生成相对路径,而是绝对路径如果换了电脑需要重新更改地址。
-
if (f == false) { cout << "请输入正确的用户名、密码" << endl; Enter(); } else { folderpath_ = "D://study//software_Introduction//personal_program//partner//" + name_; Create_File(); }
- 其中里面有几个是重复的代码,需要简化。
- 没有一个比较分明的工程结构,而是全都放到一个cpp文件里面,如果可以将函数独立起来放到别的文件中会看上去有规划性。
总结
总的来说,我的搭档的个人项目完成的非常不错,她在功能实现以及功能完善方面下了功夫,代码方面掌握十分到位,用于我不同的语言写同样的东西,让我学到了不少。人无完人,每个人的代码都有自己的优点,我从朋友这里学到很多良好的代码编写方法。代码的可读性也很高,很快的理解了各个模块的功能,很好的完成了文档中的全部需求。希望之后会能一起做出更好的项目。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/289316.html