• C++学习笔记(三十四)


    在完成对C语言的学习后,我最近开始了对C++和Java的学习,目前跟着视频学习了一些语法,也跟着敲了一些代码,有了一定的掌握程度。现在将跟着视频做的笔记进行整理。本篇博客是整理C++知识点的第三十四篇博客。

    本篇博客用C++实现了机房预约系统,本文是上部分。

    本系列博客所有C++代码都在Visual Studio 2022环境下编译运行。程序为64位。

    目录

    机房预约系统

    系统需求介绍

    程序结构

    主菜单界面搭建以及提供登录接口

    身份的抽象基类创建

    学生类的创建

    教师类创建

    管理员类创建

    全局文件添加

    登录函数封装以及不同身份登录实现


    机房预约系统

    接下来用C++实现一个机房预约系统,由于内容很长,分为三篇博客。本篇博客是第一部分。

    系统需求介绍

    有三种身份:

    学生代表申请使用机房。

    教师审核学生的预约申请。

    管理员给学生和教师创建账号。

    机房有三间,其中1号机房最多容纳20人,2号机房最多容纳50人,3号机房最多容纳100人。

    申请的订单由管理员负责清空。

    学生可以预约未来一周内的机房使用,时间为周一至周五,要选择是上午还是下午。

    教师审核预约,根据实际情况给出通过还是不通过。

    首先进入登录界面,可选身份是学生代表,老师,管理员,或退出。

    每个身份都要验证后进入子菜单,学生要输入学号姓名和密码,老师要输入编号姓名和密码,管理员要输入姓名和密码。

    学生的功能有:

    申请预约,查看自己的预约,查看所有的预约,取消预约和注销登录。

    教师的功能有:

    查看所有预约,审核预约和注销登录。

    管理员的功能有:

    添加账号,查看账号,查看机房,清空预约和注销登录。

    程序结构

    identity.h存放identity类的所有内容。administrator.h和administrator.cpp存放administrator类所有内容。student.cpp和student.h存放student类的所有内容。teacher.h和teacher.cpp存放teacher类所有内容。room.h存放room类所有内容。globalfile.h存放了几个关于文件名称的宏。reservesystem.cpp存放了控制程序流程的内容。

    主菜单界面搭建以及提供登录接口

    1. int main(void)
    2. {
    3. while (true) {
    4. show_totalmenu();
    5. int choice;
    6. cin >> choice;
    7. switch (choice) {
    8. case 1:
    9. log_in(STUDENT_FILE, 1);
    10. break;
    11. case 2:
    12. log_in(TEACHER_FILE, 2);
    13. break;
    14. case 3:
    15. log_in(ADMINISTRATOR_FILE, 3);
    16. break;
    17. case 0:
    18. cout << "exit" << endl;
    19. break;
    20. default:
    21. cout << "Please enter 0,1,2 or 3" << endl;
    22. system("pause");
    23. system("cls");
    24. break;
    25. }
    26. if (choice == 0) {
    27. break;
    28. }
    29. }
    30. return 0;
    31. }

    这一部分在文件reservesystem.cpp中。

    程序用死循环控制流程,首先展示菜单,然后要求用户输入选项。输入1 2 3都会进入log_in函数进行登录,但是参数会不一样,第一个参数是globalfile.h存放的关于文件名的宏。输入0提示退出程序并结束循环。输入其他选项要求重新输入。

    1. void show_totalmenu(void)
    2. {
    3. cout << "***Welcome to use our reverse system!***" << endl;
    4. cout << "*************** 1. student *************" << endl;
    5. cout << "*************** 2. teacher *************" << endl;
    6. cout << "*************** 3. administrator *******" << endl;
    7. cout << "*************** 0. exit ****************" << endl;
    8. cout << "Please enter your choice" << endl;
    9. }

    这一部分在文件reservesystem.cpp中。输出菜单。

    身份的抽象基类创建

    1. #pragma once
    2. #include
    3. #include
    4. using namespace std;
    5. class identity
    6. {
    7. public:
    8. string name;
    9. string password;
    10. virtual void show_menu() = 0;
    11. };

    这是identity.h的内容,实现了identity类,是对学校人员的抽象。name成员表示姓名,password成员表示登陆密码。show_menu函数是展示菜单,设置为纯虚函数,留给子类实现。

    学生类的创建

    1. #pragma once
    2. #include
    3. #include
    4. #include"room.h"
    5. #include"identity.h"
    6. using namespace std;
    7. class student :public identity
    8. {
    9. public:
    10. int id;
    11. vector vroom;
    12. student();
    13. student(int id, string name, string password);
    14. void show_menu();
    15. void make_reverse(void);
    16. void look_my_reverse(void);
    17. void look_all_reverse(void);
    18. void cancel_reverse();
    19. };

    这是student.h的内容,实现了student类。id表示学号,vroom存放room类对象。下面的函数在后面介绍。

    教师类创建

    1. #pragma once
    2. #include
    3. #include
    4. #include"identity.h"
    5. using namespace std;
    6. class teacher :public identity
    7. {
    8. public:
    9. int id;
    10. teacher();
    11. teacher(int id, string name, string password);
    12. void show_menu();
    13. void look_reverse(void);
    14. void audit_reverse(void);
    15. };

    这是teacher.h的内容,实现了teacher类。id表示教师编号。成员函数在后面介绍。

    管理员类创建

    1. #pragma once
    2. #include
    3. #include
    4. #include
    5. #include"student.h"
    6. #include"teacher.h"
    7. #include"identity.h"
    8. #include"room.h"
    9. using namespace std;
    10. class administrator :public identity
    11. {
    12. public:
    13. administrator();
    14. administrator(string name, string password);
    15. void show_menu();
    16. void init_vector(void);
    17. bool check_repeat(int id, int type);
    18. void add_account(void);
    19. void look_account(void);
    20. void look_room(void);
    21. void clear_record(void);
    22. vector vstudent;
    23. vector vteacher;
    24. vector vroom;
    25. };

    这是administrator.h的内容,实现了administrator类。vroom存放room类对象,vstudent存放student类对象,vteacher存放teacher类对象。成员函数在后文介绍。

    全局文件添加

    1. #include
    2. #include
    3. using namespace std;
    4. #define ADMINISTRATOR_FILE "administrator.txt"
    5. #define STUDENT_FILE "student.txt"
    6. #define TEACHER_FILE "teacher.txt"
    7. #define ROOM_FILE "room.txt"
    8. #define REVERSE_FILE "reverse.txt"

    这是globalfile.h的内容,将很多用到文件的名称字符串定义为宏。

    登录函数封装以及不同身份登录实现

    1. void log_in(string filename, int type)
    2. {
    3. identity* person = NULL;
    4. ifstream ifs;
    5. ifs.open(filename, ios::in);
    6. if (ifs.is_open() == false) {
    7. cout << "The file does not exist" << endl;
    8. return;
    9. }
    10. int id;
    11. string name;
    12. string password;
    13. if (type == 1) {
    14. cout << "Please enter the id" << endl;
    15. cin >> id;
    16. }
    17. else if(type == 2) {
    18. cout << "Please enter the id" << endl;
    19. cin >> id;
    20. }
    21. cout << "Please enter the name" << endl;
    22. cin >> name;
    23. cout << "Please enter the password" << endl;
    24. cin >> password;
    25. if (type == 1) {
    26. int rid;
    27. string rname;
    28. string rpassword;
    29. while (ifs >> rid && ifs >> rname && ifs >> rpassword) {
    30. if (rid == id && rname == name && rpassword == password) {
    31. cout << "Succeed to log in" << endl;
    32. person = new student(id, name, password);
    33. system("pause");
    34. system("cls");
    35. do_student(person);
    36. system("pause");
    37. system("cls");
    38. return;
    39. }
    40. }
    41. }
    42. else if (type == 2) {
    43. int rid;
    44. string rname;
    45. string rpassword;
    46. while (ifs >> rid && ifs >> rname && ifs >> rpassword) {
    47. if (rid == id && rname == name && rpassword == password) {
    48. cout << "Succeed to log in" << endl;
    49. person = new teacher(id, name, password);
    50. system("pause");
    51. system("cls");
    52. do_teacher(person);
    53. system("pause");
    54. system("cls");
    55. return;
    56. }
    57. }
    58. }
    59. else if (type == 3) {
    60. string rname;
    61. string rpassword;
    62. while (ifs >> rname && ifs >> rpassword) {
    63. if (rname == name && rpassword == password) {
    64. cout << "Succeed to log in" << endl;
    65. system("pause");
    66. system("cls");
    67. person = new administrator(name, password);
    68. do_administrator(person);
    69. system("pause");
    70. system("cls");
    71. return;
    72. }
    73. }
    74. }
    75. cout << "Fail to log in " << endl;
    76. system("pause");
    77. system("cls");
    78. }

    这一部分在文件reservesystem.cpp中。首先要求用户输入密码和姓名(学生还需要输入学号,教师还需要输入教师编号)。如果是要处理学生,则从文件中获取信息,如果检测到一致就提示登录成功,用信息构建一个对象,随后作为参数传递给do_student函数(后面介绍),否则提示登录失败。如果要处理教师,则从文件获取信息,检测到一致就提示登录成功,用信息构建一个对象,作为参数传递给do_teacher函数(后面)介绍,否则提示登陆失败。如果是要处理管理员,就从文件中获取信息,如果检测到一致就提示登录成功,用信息创建一个对象,随后作为参数传递给do_administrator函数(后面介绍),否则提示登录失败。

  • 相关阅读:
    OpenMLDB BUG 悬赏令
    最优乘车——最短路
    JS深拷贝处理日期、正则以及循环引用问题
    http内网穿透CYarp[开源]
    el-date-picker 组件 监听输入的内容 并按照时间格式 格式化
    利用 NLP 超能力:一步步介绍Hugging Face微调教程
    基于粒子群优化算法的BP神经网络预测模型(Matlab代码实现)
    1339 - Ancient Cipher (UVA)
    【安全体系架构】——SIEM架构
    马尔可夫链文本生成预测
  • 原文地址:https://blog.csdn.net/m0_71007572/article/details/126453898