与我结对的队友是木拉迪力.艾海提同学,接下来我来分析一下他的个人项目:
#include <iostream>
#include <string>
#include <fstream>
#include <ctime>
#include <cstdlib>
using namespace std;
class Teacher {
public:
Teacher();
Teacher(string username, string pwd, string type);
~Teacher();
string GetName();
string Getpwd();
string Gettype();
void Setpwd(string pwd);
string GetTime();
private:
string type_;
string username_;
string password_;
};
Teacher::Teacher() {
}
Teacher::~Teacher() {
}
Teacher::Teacher(string username, string pwd, string type) {
this->username_ = username;
this->password_ = pwd;
this->type_ = type;
}
string Teacher::GetName() {
return this->username_;
}
string Teacher::Getpwd() {
return this->password_;
}
string Teacher::Gettype() {
return this->type_;
}
void Teacher::Setpwd(string pwd) {
this->password_ = pwd;
}
string Teacher::GetTime() {
time_t now = time(0);
tm* ltm = localtime(&now);
string time = to_string(1900 + ltm->tm_year) + "-" + to_string(1 + ltm->tm_mon) + "-" + to_string(ltm->tm_mday) + " " + to_string(ltm->tm_hour) + ":" + to_string(ltm->tm_min) + ":" + to_string(ltm->tm_sec);
return time;
}
class System {
public:
System();
~System();
void openMenu();
void LogTeacher(string t_name, string t_pwd, string t_type);
string CreatePrimaryPaper();
bool CheckPaper(string name, string question);
int ProduceTheExamination(string name, string pwd, string type);
string Changetype();
string intTostring(int num);
};
System::System() {
}
System::~System() {
}
void System::openMenu() {
cout << "欢迎使用自动生成数学试卷系统" << endl;
cout << "1. 生成试卷" << endl;
cout << "2. 修改密码" << endl;
cout << "3. 切换类型" << endl;
cout << "0. 注销" << endl;
cout << "请输入选项:";
}
string System::intTostring(int num) {
string str = "";
if (num == 0) {
str = "0";
}
while (num) {
str = char(num % 10 + '0') + str;
num /= 10;
}
return str;
}
string System::CreatePrimaryPaper() {
string question;
int Preparentheses = 0;
int temp = rand() % 11;
if (temp == 9) {
question += "(";
Preparentheses++;
}
temp = (rand() % 100) + 1;
question += intTostring(temp);
int operatorNum = (rand() % 4) + 1;
for (int i = 0; i < operatorNum; i++) {
temp = rand() % 4;
switch (temp) {
case 0:
question += "+";
break;
case 1:
question += "-";
break;
case 2:
question += "*";
break;
case 3:
question += "/";
break;
}
temp = rand() % 11;
if (temp == 9) {
question += "(";
Preparentheses++;
}
temp = (rand() % 100) + 1;
question += intTostring(temp);
temp = rand() % 11;
if (temp == 10 && Preparentheses > 1) {
question += ")";
Preparentheses--;
}
}
for (int i = 0; i < Preparentheses; i++) {
question += ")";
}
question += "=";
return question;
}
bool System::CheckPaper(string name, string question) {
ifstream ifs;
string temp;
ifs.open(("教师账户\\" + name + "\\CheckPaper.txt").c_str(), ios::in);
if (!ifs.is_open()) {
return false;
}
while (ifs >> temp) {
if (temp == question) {
return true;
}
}
ifs.close();
return false;
}
int System::ProduceTheExamination(string name, string pwd, string type) {
cout << "准备生成" + type + "数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登陆):" << endl;
int paperNum = 0;
while (1) {
cin >> paperNum;
if (paperNum == -1) {
cout << "退出登陆,请重新登陆" << endl;
system("pause");
system("cls");
return -1;
}
else if (paperNum < 10 || paperNum > 30) {
cout << "输入有误,题目范围在【10,30】" << endl;
}
else {
string time = this->GetTime();
ofstream ofs1, ofs2;
ofs1.open(("教师账户\\" + name + "\\" + time).c_str(), ios::out);
ofs1 << "这是" << name << "老师出的一份" << type << "试卷" << endl;
if (type == "小学") {
for (int i = 0; i < paperNum; i++) {
string question = this->CreatePrimaryPaper();
if (this->CheckPaper(name, question) == true) {
i--;
}
else {
ofs2.open(("教师账户\\" + name + "\\CheckPaper.txt").c_str(), ios::app);
ofs2 << question << endl;
ofs2.close();
ofs1 << "(" << i + 1 << ") " << question << endl;
}
}
ofs1.close();
}
cout << "生成成功" << endl;
system("pause");
system("cls");
break;
}
}
return 0;
}
string System::Changetype() {
cout << "选择需要切换的类型(小学、初中、高中),输入:切换为XX" << endl;
string newtype;
while (1) {
cin >> newtype;
newtype = newtype.substr(newtype.size() - 4, 4);
if (newtype != "小学" && newtype != "初中" && newtype != "高中") {
cout << "请输入小学、初中和高中三个选项中的一个" << endl;
}
else {
break;
}
}
return newtype;
}
void System::LogTeacher(string t_name, string t_pwd, string t_type) {
string type = t_type;
int state = 0;
while (state != -1) {
this->openMenu();
int select = 0;
cin >> select;
switch (select) {
case 1:
cout << "生成试卷中..." << endl;
state = this->ProduceTheExamination(t_name, t_pwd, type);
break;
case 2:
cout << "修改密码" << endl;
// 修改密码的逻辑
break;
case 3:
cout << "切换类型" << endl;
type = this->Changetype();
cout << "切换成" + type + "成功" << endl;
system("pause");
system("cls");
break;
case 0:
cout << "注销成功" << endl;
system("pause");
system("cls");
return;
}
if (state == -1) {
return;
}
}
}
int main() {
string username, password, type;
cout << "请输入用户名:";
cin >> username;
cout << "请输入密码:";
cin >> password;
cout << "请输入类型(小学、初中、高中):";
cin >> type;
Teacher teacher(username, password, type);
System system;
system.LogTeacher(teacher.GetName(), teacher.Getpwd(), teacher.Gettype());
return 0;
}
这段代码在整体上符合谷歌编码规范,但还有一些可以改进的地方。下面对代码进行分析,并解释其优点和缺点。
1. 符合谷歌编码规范的方面:
- 使用了合理的命名规范,变量和函数名使用小写字母和下划线的组合,类名使用驼峰命名法。
- 使用了适当的缩进和空格,增强了代码的可读性。
- 使用了头文件保护宏,避免了重复包含头文件的问题。
- 使用了类的封装,将相关的数据和函数封装在一起,提高了代码的可维护性和可复用性。
- 使用了合适的访问修饰符,将类的成员变量设置为私有,通过公有的成员函数进行访问和修改。
- 使用了合适的数据类型,例如使用string来存储用户名、密码等信息。
2. 代码的优点:
- 代码结构清晰,将Teacher类和System类分别定义,使得功能模块化,易于理解和维护。
- 通过Teacher类封装了教师的相关信息,提供了获取和设置密码的接口,增加了代码的安全性。
- System类提供了生成试卷、修改密码和切换类型等功能,通过openMenu函数实现了简单的用户交互界面,提升了用户体验。
- 使用了随机数生成题目,增加了试卷的多样性和难度。
3. 代码的缺点:
- 缺乏注释,没有对关键代码进行注释说明,降低了代码的可读性和可维护性。
- 缺少错误处理机制,例如在文件操作中没有对打开文件是否成功进行判断,可能导致程序崩溃或产生错误结果。
- 缺少异常处理机制,例如在输入不合法的选项时没有进行异常处理,可能导致程序崩溃或产生错误结果。
- 缺少代码的模块化和重用性,例如生成试卷的逻辑和生成题目的逻辑没有进行分离,导致代码耦合度较高。
综上所述,这段代码在整体上符合谷歌编码规范,具有一定的优点,但还有一些可以改进的地方。通过添加注释、完善错误处理和异常处理机制,以及优化代码的模块化和重用性,可以进一步提升代码的可读性、可维护性和健壮性。
这是一次很特别的尝试,相信木拉迪力同学和我一样,都在这次编程项目中收获了许多。
标签:结对,string,question,System,互评,队友,type,Teacher,cout From: https://www.cnblogs.com/mt1024/p/17718500.html