结对编程队友代码分析
概要
此次的个人项目,队友和我使用的是不同的编程语言,队友用的是C++,我是用 Java 语言进行编写。当然,语言只是工具,重要的是功能实现。在实现相同功能的情况下,通过分析队友的代码,期望能够发现我的不足,也期望可以帮助队友进行代码改进。
需求:
- 命令行输入用户名和密码,两者之间用空格隔开(程序预设小学、初中和高中各三个账号,具体见附表),如果用户名和密码都正确,将根据账户类型显示“当前选择为XX出题”,XX为小学、初中和高中三个选项中的一个。否则提示“请输入正确的用户名、密码”,重新输入用户名、密码;
- 登录后,系统提示“准备生成XX数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):”,XX为小学、初中和高中三个选项中的一个,用户输入所需出的卷子的题目数量,系统默认将根据账号类型进行出题。每道题目的操作数在1-5个之间,操作数取值范围为1-100;
- 题目数量的有效输入范围是“10-30”(含10,30,或-1退出登录),程序根据输入的题目数量生成符合小学、初中和高中难度的题目的卷子(具体要求见附表)。同一个老师的卷子中的题目不能与以前的已生成的卷子中的题目重复(以指定文件夹下存在的文件为准,见5);
- 在登录状态下,如果用户需要切换类型选项,命令行输入“切换为XX”,XX为小学、初中和高中三个选项中的一个,输入项不符合要求时,程序控制台提示“请输入小学、初中和高中三个选项中的一个”;输入正确后,显示“”系统提示“准备生成XX数学题目,请输入生成题目数量”,用户输入所需出的卷子的题目数量,系统新设置的类型进行出题;
- 生成的题目将以“年-月-日-时-分-秒.txt”的形式保存,每个账号一个文件夹。每道题目有题号,每题之间空一行。
队友代码分析
Teacher.h
在Teacher类中将用户属性私有化,只能用提供的方法来获取,采用面向对象思想设计的结构,实现了封装。
点击查看代码
class Teacher
{
public:
Teacher();
Teacher(string name,string pwd,string type);
~Teacher();
//获取老师用户名
string GetName();
//获取老师密码
string Getpwd();
//获取老师类型
string Gettype();
void Setpwd(string pwd);
string GetTime();
private:
string Type;
string UserName;
string Password;
};
System.h
在System.h头文件当中根据功能定义了初始化、出题、更改账户类型等多个方法,方便不同函数的修改和完善。
点击查看代码
class System{
public:
~System();
System();
//创建老师
void CreateUser(string name,string password,string type);
//检查老师是否重复
bool RepeatCheck(string name);
//初始化老师容器
void initTeach_vect();
//保存老师信息在文件中
void SaveTeacher();
//小学题
string CreatePrimary();
//初中题
string CreateMiddle();
//高中题
string CreateHigh();
//获取当前时间用以作为文件名
string GetTime();
//操作界面
void openMenu();
//生成试卷
int PDTEX(string name, string pwd, string type);
//将整型转成字符串
string int_to_string(int tep);
//检查出的题是否重复
bool CheckMatter(string name, string matter);
//修改老师类型
string Changetype();
//登陆老师界面
void Login(string name, string pwd, string type);
//存放老师的容器
vector <Teacher> Teach_vect;
//试卷的运算符
string Operator[11] = {"+","-","*","/","^2","√","sin","cos","tan","(",")"};
};
出题逻辑
出题逻辑很清楚,根据用户输入的数量确定题目数量,然后根据用户类型调用对应的方法来出题。
点击查看代码
int System::PDTEX(string name, string pwd, string type)
{
cout << "准备生成" + type + "数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登陆):" << endl;
int matterNum = 0;//题目数量
while (1) {
cin >> matterNum;
if (matterNum == -1)
{
cout << "退出登陆,请重新登陆" << endl;
system("pause");
system("cls");
return -1;
} else if (matterNum < 10 || matterNum > 30)
{
cout << "输入有误,题目范围在{10,30}"<<endl;
} else {
string time = this->GetTime();
ofstream os1, os2;
os1.open(("教师账户\\" + name + "\\" + time).c_str(), ios::out);
os1 << "这是" << name << "老师出的一份" << type << "试卷"<<endl;
if (type == "高中")
{
for (int j = 0; j < matterNum; j++)
{
string matter = this->CreateHigh();
if (this->CheckMatter(name, matter) == true) {
j--;
} else {
os2.open(("教师账户\\" + name + "\\CheckMatter.txt").c_str(), ios::app);
os2 << matter << endl;
os2.close();
os1 << "(" << j+1 << ")" << matter <<endl;
}
}
os1.close();
}
else if (type == "初中")
{
for (int j = 0; j < matterNum; j++)
{
string matter = this->CreateMiddle();
if (this->CheckMatter(name , matter) == true)
{
j--;
} else {
os2.open(("教师账户\\" + name + "\\CheckMatter.txt").c_str() , ios::app);
os2 << matter << endl;
os2.close();
os1 << "(" << j+1 << ")" << matter <<endl;
}
}
os1.close();
}
else if (type == "小学")
{
for (int j = 0; j < matterNum; j++)
{
string matter = this->CreatePrimary();
if (this->CheckMatter(name, matter) == true)
{
j--;
} else {
os2.open(("教师账户\\" + name + "\\CheckMatter.txt").c_str(), ios::app);
os2 << matter << endl;
os2.close();
os1 << "(" << j+1 << ") " << matter << endl;
}
}
os1.close();
}
cout<<"生成成功"<<endl;
system("pause");
system("cls");
break;
}
}
}
功能测试
登录


生成试卷


切换类型

优点:
- 属性以及方法封装起来,采用面向对象思想设计的结构,使代码易维护,可读性高。
- 代码简洁明了,没有重复的代码,设计思路与实现非常简洁。
- 代码注释很详细,函数的用法,类的成员、成员函数以及函数的参数等,都用注释详细标出。
- 各个函数之间分工明确,方便后续更改维护。使用完文件后及时关闭文件。
缺点:
- 登录桌面简陋,没有“中小学生数学卷子自动生成系统”的字样。
- 大部分功能代码堆叠在一个cpp文件内,代码过于冗长。

浙公网安备 33010602011771号