结对编程队友代码分析
项目需求分析
1.用户登录:通过命令行输入用户名和密码,并能够判断用户名和密码都正确,如果都正确,实现登录。
2.类型转化:能够实现用户类型切换,共三种类型:小学、初中、高中。
3.试卷生成:实现试卷自动生成,不同类型难度不同,具体见下表。试卷题目数量范围为10-30,每个题目操作数为1-5,且题目不能重复。
小学 | 初中 | 高中 | |
---|---|---|---|
难度要求 | +,-,*./ | 平方,开根号 | sin,cos,tan |
备注 | 只能有+,-,*./和() | 题目中至少有一个平方或开根号的运算符 | 题目中至少有一个sin,cos或tan的运算符 |
4.试卷保存:生成的题目将以“年-月-日-时-分-秒.txt”的形式保存,每个账号一个文件夹。每道题目有题号,每题之间空一行。
功能实现
1.用户登录
void User::SignIn() { //用户登录函数
while(1){
cout << "请输入用户名和密码:";
cin >> user_name_ >> user_pswd_;
string user_name = user_name_.substr(0,user_name_.length()-1);
if(user_name == "张三") {
user_type_ = "小学";
} else if(user_name == "李四") {
user_type_ = "初中";
} else if(user_name == "王五") {
user_type_ = "高中";
} else {
cout << "请输入正确的用户名、密码!" << endl << endl;
continue;
}
if(user_pswd_ == "123"){
break;
} else {
cout << "请输入正确的用户名、密码!" << endl << endl;
}
}
cout << endl << "*****当前选择为" << user_type_ << "出题*****" << endl << endl;
folder_path_ = user_name_;
if (0 != access(folder_path_.c_str(), 0)) {
mkdir(folder_path_.c_str()); // 返回 0 表示创建成功,-1 表示失败
}
User::CreateFile();
User::CreatePaper();
}
2.类型转化
void User::SwitchType() { // 切换类型选项
while(1) {
cout << endl << "以下为类型切换选项";
cout << "(若需要切换类型,请输入/"切换为XX/",若不需要,输入/"否/",若退出登录请输入/"-1/")";
cout << endl << "请输入:";
string type_switch; // 存储转化类型
cin >> type_switch;
if(type_switch == "否" || type_switch == "") {
User::CreateFile();
User::CreatePaper(); // 生出符合输入的数学试卷
continue;
} else if(type_switch == "-1") {
break; // 退出操作
}
if(type_switch.substr(0,6)=="切换为") {
user_type_ = type_switch.erase(0,6);
User::CreateFile();
User::CreatePaper();
continue;
} else {
while(1) {
cout<<"请输入小学、初中和高中三个选项中的一个:";
cin>>type_switch;
if(type_switch=="小学"||type_switch=="初中"||type_switch=="高中") {
user_type_ = type_switch;
User::CreateFile();
User::CreatePaper();
break;
} else if(type_switch=="-1") {
break;
}
}
}
if(type_switch=="-1") break;
}
cout << "您已退出本次登录!" << endl << endl;
User::SignIn();
}
3.试卷生成
void User::CreatePaper() {
cout << "准备生成" << user_type_ << "数学题目..." << endl;
cout << "请输入生成题目数量(输入-1将退出当前用户,重新登录):";
cin >> exa_numb_;
while(exa_numb_ < 10 || exa_numb_ > 30) {
if(exa_numb_ == -1) {
cout << "您已退出,请重新登录!" << endl;
cout << endl;
User::SignIn();
break;
}
cout << endl << "输入的题目数量无效,请重新输入:";
cin >> exa_numb_;
}
paper_.open(file_path_.c_str(), ios::out);
string check_path = folder_path_+"//Check.txt";
check_.open(check_path.c_str(), ios::out|ios::app);
cout << "这是一张" << user_type_ << "卷子,共有" << exa_numb_ << "道题目。" << endl << endl;
int number = exa_numb_;
string symbol[] = {"+", "-", "*", "/", "√", "^2", "sin", "cos", "tan"};
while(number--) {
int operand_number = rand() % 4 + 2; // 随机生成2-4个操作数
int bracket_number = operand_number / 2 - 1; // 括号生成数量
int bracket_index = -1;
for(int i = 0; i < (operand_number * 2 - 1); i++) {
if(i % 2 == 0) {
if(i < operand_number && bracket_number != 0 && rand() % 2 == 1) {
question << "(";
bracket_index = i + 3;
bracket_number --;
}
question << (rand() % 100 + 1);
} else {
if(i == bracket_index) {
question << ")";
}
question << symbol[rand() % 4];
}
}
if(user_type_ == "初中") {
int junior = rand() % 2 + 4;
if(junior != 4) {
question << symbol[junior];
} else {
question << symbol[rand() % 4];
question << symbol[junior];
question << (rand() % 100 + 1);
}
} else if(user_type_ == "高中") {
int senior = rand() % 3 + 6;
question << symbol[rand() % 4];
question << symbol[senior];
question << (rand() % 100 + 1);
}
cout << exa_numb_ - number << "、" << question.str()<<endl;
bool check_flag = User::Check();
if(check_flag = true) {
paper_ << exa_numb_ - number << "、" << question.str() << '=' <<endl;
check_ << question.str() << '=' << endl;
question.str("");
}
}
paper_.close();
check_.close();
}
4.试卷保存
void User::CreateFile() { // 给文件命名的函数
char file_name[100];
struct tm *ptr;
time_t It=time(NULL);
ptr=localtime(&It);
strftime(file_name,30,"%y-%m-%d-%H-%M-%S.txt",ptr); // 以年月日时分秒对输出文件命名
file_path_ = folder_path_ +"//"+file_name;
}
5.代码测试
优点
1.功能实现完全
项目需求的所有功能基本完全实现,且除编码外,基本符合Google代码编写规范。
2.可读性强
代码简洁,注释较多,变量命名规范,因此可读性较强
3.能自动生成文件夹
能自动生成用户文件夹保存用户试卷,同时每个文件夹内都有Check.txt,方便之后题目查重。
缺点
1.未使用utf-8编码方式
未使用utf-8编码方式,不符合题目要求。队友utf-8编码不能实现字符输出,输入字符也不能匹配,原因未知。
2.题目创建不随机
题目创建操作数只能为2-5个,一个操作数的题目不能创建。初中、高中题目仅仅是题目最后随机生成对应难度的操作符,高中题目也不会生成根号和平方根,不够随机。
3.题目查重效率不高
题目查重是通过遍历每一条题目,随着题目数量的增加,难免会影响性能。
4.数据和代码未实现分离
用户名和密码是通过代码写死的,保存在代码内,之后用户的增加和删减都不能方便实现。
5.可扩展性弱
所有功能仅用一个类实现,可扩展性弱。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/289315.html