1.用户登录:通过命令行输入用户名和密码,并能够判断用户名和密码都正确,如果都正确,实现登录。
2.类型转化:能够实现用户类型切换,共三种类型:小学、初中、高中。
3.试卷生成:实现试卷自动生成,不同类型难度不同,具体见下表。试卷题目数量范围为10-30,每个题目操作数为1-5,且题目不能重复。
小学 | 初中 | 高中 | |
---|---|---|---|
难度要求 | +,-,*./ | 平方,开根号 | sin,cos,tan |
备注 | 只能有+,-,*./和() | 题目中至少有一个平方或开根号的运算符 | 题目中至少有一个sin,cos或tan的运算符 |
4.试卷保存:生成的题目将以“年-月-日-时-分-秒.txt”的形式保存,每个账号一个文件夹。每道题目有题号,每题之间空一行。
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(); }
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(); }
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(); }
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; }
项目需求的所有功能基本完全实现,且除编码外,基本符合Google代码编写规范。
代码简洁,注释较多,变量命名规范,因此可读性较强
能自动生成用户文件夹保存用户试卷,同时每个文件夹内都有Check.txt,方便之后题目查重。
未使用utf-8编码方式,不符合题目要求。队友utf-8编码不能实现字符输出,输入字符也不能匹配,原因未知。
题目创建操作数只能为2-5个,一个操作数的题目不能创建。初中、高中题目仅仅是题目最后随机生成对应难度的操作符,高中题目也不会生成根号和平方根,不够随机。
题目查重是通过遍历每一条题目,随着题目数量的增加,难免会影响性能。
用户名和密码是通过代码写死的,保存在代码内,之后用户的增加和删减都不能方便实现。
所有功能仅用一个类实现,可扩展性弱。