涉及到的知识有:面向对象的思想、泛型编程思想、STL的使用、文件的读写操作
项目需求:
4OZ~FO]~JD`6O}KM%K_6(RK.png

1.创建主界面

显示界面,用switch语句来控制菜单
项目一:机房预约系统 - 图2语句来实现清屏操作

2.定义身份类(父类)

学生、老师以及管理员都有用户名和密码的属性,这是他们的共性,所以可以通过继承实现
对于不同人的显示功能方法不同,可以通过多态(纯虚函数)重写。
创建三个类student、teacher、manager

3.全局文件

本项目将不同身份的数据存放在不同的文件中,可以将文件名宏定义到一个全局文件中,在后面写操作时会有智能联想,方便文件管理。

4.登录函数

根据不同的用户选择不同的身份登录
在system.cpp文件中添加全局函数 LoginIn(string filename,int type)
filename:操作的文件,调用不同文件的数据进行用户比对。
type:登录的身份

5.管理员模块

5.1管理员登录与注销

  1. //用父类指针Identity* 接收上面创建的父类对象->子类对象
  2. void managerMenu(Identity* &manager)
  3. {
  4. while (true)
  5. {
  6. //登陆界面
  7. manager->open_menu();
  8. //父类指针强转为子类指针,不然父类指针只能调用公共部分的接口
  9. Manager* m = (Manager*)manager;
  10. //manager只有三个接口,m有七个接口
  11. int select = 0;
  12. cin >> select;
  13. if (select == 1) //添加账号
  14. {
  15. m->add_person();
  16. }
  17. else if (select == 2) //查看账号
  18. {
  19. m->show_person();
  20. }
  21. else if (select == 3) //查看机房
  22. {
  23. m->show_house();
  24. }
  25. else if (select == 4) //清空预约
  26. {
  27. m->clear();
  28. }
  29. //注销退出
  30. else {
  31. delete manager;
  32. cout << "注销成功!" << endl;
  33. system("pause");
  34. system("cls");
  35. return;
  36. }
  37. }
  38. }
  1. int main()
  2. {
  3. LoginIn(ADMIN_FILE, 3);
  4. }
  5. void LoginIn(string filename,int type)
  6. {
  7. if (type == 3)
  8. {
  9. while(ifs >> fname && ifs >> fpw)
  10. {
  11. if (name == fname && pw == fpw)
  12. {
  13. cout << "管理员验证登录成功!" << endl;
  14. system("pause");
  15. system("cls");
  16. person = new Manager(name, pw);
  17. //进入管理员的子菜单界面
  18. managerMenu(person);
  19. return;
  20. }
  21. }
  22. }
  23. }

5.2添加账号

1、添加功能操作

写文件

  1. void test()
  2. {
  3. ofstream ofs;
  4. ofs.open("test.txt", ios::out);
  5. ofs << "姓名:张三" << ' '<< "性别:男" << ' ' << "年龄:18" <<endl;
  6. cout << "写入成功!" << endl;
  7. ofs.close();
  8. }
  1. void Manager::add_person()
  2. {
  3. cout << "请输入添加账号的类型" << endl;
  4. cout << "1、添加学生" << endl;
  5. cout << "2、添加老师" << endl;
  6. ofstream ofs;
  7. string filename;
  8. string tip;
  9. int select = 0;
  10. cin >> select;
  11. if (select == 1)
  12. {
  13. filename = STUDENT_FILE;
  14. tip = "请输入学号:";
  15. }
  16. else
  17. {
  18. filename = TEACHER_FILE;
  19. tip = "请输入职工号:";
  20. }
  21. //写操作
  22. ofs.open(filename, ios::out | ios::app);
  23. int id;
  24. string name;
  25. string pw;
  26. cout << tip; //妙
  27. cin >> id;
  28. cout << "请输入姓名:";
  29. cin >> name;
  30. cout << "请输入密码:";
  31. cin >> pw;
  32. ofs << id << ' ' << name << ' ' << pw << ' ' << endl;
  33. cout << "添加成功!" << endl;
  34. system("pause");
  35. system("cls");
  36. ofs.close();
  37. }

2、去重操作

首先要获取到学生和老师的账号信息
新建容器Vector(Student)和Vector(Teacher)用于存放学生和老师的账号信息
读文件

  1. void test()
  2. {
  3. ifstream ifs;
  4. ifs.open("test.txt", ios::in);
  5. person p;
  6. ifs >> p.m_id << endl;
  7. cout << "读取成功!" << endl;
  8. ifs.close();
  9. }
  1. void Manager::InitVector()
  2. {
  3. //确保容器为空,然后再将数据读取进来对比
  4. vStu.clear();
  5. vTea.clear();
  6. ifstream ifs;
  7. //统计学生信息
  8. ifs.open(STUDENT_FILE, ios::in);
  9. if (!ifs.is_open())
  10. {
  11. cout << "文件读取失败!" << endl;
  12. return;
  13. }
  14. Student s;
  15. while (ifs >> s.m_id && ifs >> s.m_name && ifs >> s.m_pw)
  16. {
  17. vStu.push_back(s);
  18. }
  19. ifs.close();
  20. //统计老师信息
  21. ifs.open(TEACHER_FILE, ios::in);
  22. if (!ifs.is_open())
  23. {
  24. cout << "文件读取失败!" << endl;
  25. return;
  26. }
  27. Teacher t;
  28. while (ifs >> t.m_empID && ifs >> t.m_name && ifs >> t.m_pw)
  29. {
  30. vTea.push_back(t);
  31. }
  32. ifs.close();
  33. }

在添加账号前进行验证是否已重复添加(姓名可重复,学号/职工号不能重复),如果重复就重新添加

  1. void Manager::add_person()
  2. {
  3. //检查添加的名字是否重复
  4. while (true)
  5. {
  6. cin >> id;
  7. bool ret = this->cheak_same(id, select);
  8. if (ret)
  9. {
  10. cout << errorTip << endl; //妙
  11. cout << tip;
  12. }
  13. else
  14. break;
  15. }
  16. }

5.3显示账号

5.4查看机房

5.5清空所有预约