鱼C论坛

 找回密码
 立即注册
查看: 1235|回复: 5

[技术交流] fishcC++入门课程(复杂的数据类型:对象的基础-结构)作业(非成品)

[复制链接]
发表于 2024-7-5 21:23:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 MUYIXUE 于 2024-7-6 15:15 编辑

非科班出生的小白一枚.       今天学习fishcC++入门课程的时候,看到"复杂的数据类型05_对象的基础:结构.mp4",然后就突发奇想,想要试一下二级菜单,没想到文思泉涌!!!写完后我自己都懵逼了!!!感觉写的有点不错,特来分享!!
目前写完命令行界面,还没有写好功能.现在发现了一些地方设计的不是很好,后面写完也会重构.                     ------现在已经写到了数据的保存了,更新一下代码.


浅浅的谈一下感想: 写的真的累,难受的是刚开始写的时候没有梳理好思路,现在依靠标志的管理,界面功能切换没有问题,然而功能却写的一塌糊涂,很多代码重复出现,

教训:
1. 对于链表的使用,真的要有一个迭代器,如果每一个细节都需要多次考虑分析,会带来很大的工作量.
2. 二级展开菜单的代码做的不好,其中涉及到的很多常量不可以自动更新,所以添加或者修改功能会带来繁重的工作量.
3. 一定要多敲代码,我没有学习过数据结构,但是我之前在书上看到过链表的原理,所以我就自己摸索自己实现了一个双向链表,虽然有些部分很多余,但是很离谱的是:即使刚开始我写起来很慢,但当我反复书写6-7次链表后,我竟然越写越快!!,我对于这个原来很陌生的结构慢慢熟悉,最后写着就知道内存中发生了什么,出错了应该如何检查,都自然浮现于眼前.

如果说什么是屎山,估计我这个就是,因为有很多重复的功能没有封装,这个程序明显分为3个部分,1. 链表管理,2. 用户界面 3. 文件管理(还没有写).但是接近800行的代码,不是十分重要的代码,整理起来过于耗费心神,所以我也不打算整理了,后面C++入门课程学习完后,一定要在写代码前就理清所有的思路.
  1. #include <iostream>
  2. #include <fstream>
  3. #include <format>

  4. #define GUI_WIDTH  "40"

  5. using namespace std;

  6. enum gender
  7. {
  8.         boy, girl
  9. };

  10. struct student {
  11.         string name = "";
  12.         long IDcard = 0;
  13.         gender sex = boy;
  14. };

  15. struct data {
  16.         struct student* data;
  17.         struct data* pre;
  18.         struct data* post;
  19. };

  20. const char* menu[] = {
  21.         "学生管理系统",
  22.         //主菜单选项
  23.         "1. 创建表单",
  24.         "2. 打开表单",
  25.         "3. 添加学生",
  26.         "4. 查询学生",
  27.         "5. 删除学生",
  28.         "6. 打印表单",
  29.         "7. 保存表单",
  30.         "q. 退出系统",
  31.         //查询学生菜单
  32.         "1. 名字查询",    //9
  33.         "2. 身份证查询",
  34.         //删除学生菜单
  35.         "1. 请输入名字",  //11
  36.         "2. 请输入身份证",
  37.         //打印表单菜单
  38.         "1. 打印到文件",  //13
  39.         "2. 打印到控制台",
  40.          
  41.         //二级菜单退出
  42.         "退出二级菜单"
  43. };

  44. const char* message[]{
  45.         "请输入数字选项: ",
  46.         "请输入合法值 !",
  47.         "请输入二级菜单数字选项!"
  48. };


  49. //用来标记菜单的界限
  50. enum menu_edge {
  51.         main_menu = 8,
  52.         search_menu = main_menu + 2,
  53.         delete_menu = search_menu + 2,
  54.         print_menu = delete_menu + 2
  55. };


  56. static void flush_screen(string* menu, string* message) {
  57.         system("cls");
  58.         cout << format("{0:#^" GUI_WIDTH "s}", menu[0]) << endl;
  59.         for (int i = 1; i <= main_menu; i++) {
  60.                 cout << format("{0: <" GUI_WIDTH "s}", menu[i]) << endl;
  61.         }
  62.         cout << format("{0: <" GUI_WIDTH "s}", *message);
  63. }

  64. bool change_menu_option(bool secondary_menu_flag, int menu_option_num, string* menu_dynamic, string* message_dynamic) {
  65.         bool status = true;
  66.         if (secondary_menu_flag) {
  67.                 switch (menu_option_num) {
  68.                 case 4://查询
  69.                         menu_dynamic[menu_option_num] += "->";
  70.                         menu_dynamic[menu_option_num] += menu[menu_option_num + 5];
  71.                         menu_dynamic[menu_option_num + 1] += "  ";
  72.                         menu_dynamic[menu_option_num + 1] += menu[menu_option_num + 6];
  73.                         menu_dynamic[menu_option_num + 2] += "  ";
  74.                         menu_dynamic[menu_option_num + 2] += "q. ";
  75.                         menu_dynamic[menu_option_num + 2] += menu[15];
  76.                         *message_dynamic = message[2];
  77.                         break;
  78.                 case 5://删除';
  79.                         menu_dynamic[menu_option_num] += "->";
  80.                         menu_dynamic[menu_option_num] += menu[menu_option_num + 6];
  81.                         menu_dynamic[menu_option_num + 1] += "  ";
  82.                         menu_dynamic[menu_option_num + 1] += menu[menu_option_num + 7];
  83.                         menu_dynamic[menu_option_num + 2] += "  ";
  84.                         menu_dynamic[menu_option_num + 2] += "q. ";
  85.                         menu_dynamic[menu_option_num + 2] += menu[15];
  86.                         *message_dynamic = message[2];
  87.                         break;
  88.                 case 6://打印
  89.                         menu_dynamic[menu_option_num] += "->";
  90.                         menu_dynamic[menu_option_num] += menu[menu_option_num + 7];
  91.                         menu_dynamic[menu_option_num + 1] += "  ";
  92.                         menu_dynamic[menu_option_num + 1] += menu[menu_option_num + 8];
  93.                         menu_dynamic[menu_option_num + 2] += "  ";
  94.                         menu_dynamic[menu_option_num + 2] += "q. ";
  95.                         menu_dynamic[menu_option_num + 2] += menu[15];
  96.                         *message_dynamic = message[2];
  97.                         break;
  98.                 default:
  99.                         status = false;
  100.                         break;
  101.                 }
  102.         }
  103.         else {
  104.                 int option_num = sizeof(menu) / sizeof(char*);
  105.                 for (int i = 0; i < option_num; i++) {
  106.                         menu_dynamic[i] = menu[i];
  107.                 }
  108.                 *message_dynamic = message[0];
  109.         }
  110.         return status;
  111. }

  112. struct data* make_list() {//makelist不需要申请任何内存,只需要返回一个表头即可
  113.         struct data* first = NULL;
  114.         first = new struct data;
  115.         first->data = NULL;
  116.         first->pre = NULL;
  117.         first->post = NULL;
  118.         return first;
  119. }

  120. struct data* add_student(struct data* list, string name, long IDcard, gender sex) {
  121.         if (list != NULL) {
  122.                 struct data* temp = new struct data;   //首先创建节点
  123.                 temp->data = new struct student;       //然后创建数据
  124.                 temp->data->IDcard = IDcard;
  125.                 temp->data->name = name;
  126.                 temp->data->sex = sex;                 //然后初始化数据

  127.                 struct data* ptr = list->post;         //默认向后增加数据
  128.                 list->post = temp;
  129.                 temp->pre = list;
  130.                 temp->post = ptr;

  131.                 return temp;

  132.         }
  133.         else {
  134.                 cerr << "你还没有创建列表,无法添加学生!" << endl;
  135.                 system("pause");
  136.         }
  137. }

  138. struct data* search_student(struct data* list, string name) {
  139.         struct data* temp_ptr = NULL;
  140.         string temp_name = name;
  141.         if (list == NULL) {//如果是使用make_list创建表头,不可能为空
  142.                 cerr << "空指针无法索引任何数据 !" << endl;
  143.                 exit(EXIT_FAILURE);
  144.         }
  145.         else {
  146.                 if (list->pre == NULL && list->post == NULL) {
  147.                         cout << "你还没有添加任何学生!" << endl;
  148.                 }
  149.                 else if (list->pre == NULL && list->post != NULL) {//这是表头
  150.                         struct data* temp = list;
  151.                         for (;;) {
  152.                                 temp = temp->post;
  153.                                 if (temp->data->name == temp_name) {
  154.                                         cout << "名字: " << temp->data->name << endl;
  155.                                         cout << "身份证号: " << temp->data->IDcard << endl;
  156.                                         if (temp->data->sex == boy) {
  157.                                                 cout << "性别: " << "男" << endl;
  158.                                         }
  159.                                         else if (temp->data->sex == girl) {
  160.                                                 cout << "性别: " << "女" << endl;
  161.                                         }
  162.                                         temp_ptr = temp;
  163.                                         break;
  164.                                 }
  165.                                 if (temp->post == NULL) {//如果下一个列表后就没有链表就表示结束
  166.                                         cout << "你创建的表中不含有这个学生" << endl;
  167.                                         break;
  168.                                 }

  169.                         }
  170.                 }
  171.                 else if (list->pre != NULL && list->post == NULL) {//这是表尾
  172.                         struct data* temp = list;
  173.                         for (;;) {
  174.                                 if (temp->data == NULL) {
  175.                                         cout << "你创建的表中不含有这个学生" << endl;
  176.                                         break;
  177.                                 }
  178.                                 if (temp->pre == NULL) {//如果下一个列表后就没有链表就表示结束
  179.                                         cout << "你创建的表中不含有这个学生" << endl;
  180.                                         break;
  181.                                 }
  182.                                 if (temp->data->name == temp_name) {
  183.                                         cout << "名字: " << temp->data->name << endl;
  184.                                         cout << "身份证号: " << temp->data->IDcard << endl;
  185.                                         if (temp->data->sex == boy) {
  186.                                                 cout << "性别: " << "男" << endl;
  187.                                         }
  188.                                         else if (temp->data->sex == girl) {
  189.                                                 cout << "性别: " << "女" << endl;
  190.                                         }
  191.                                         temp_ptr = temp;
  192.                                         break;
  193.                                 }
  194.                                 temp = temp->pre;

  195.                         }

  196.                 }
  197.                 else {//这是表的中间一个节点
  198.                         bool not_find_pre = false;
  199.                         bool not_find_post = false;
  200.                         bool not_find_curr = false;

  201.                         //自己检查自己
  202.                         struct data* temp = list;
  203.                         if (temp->data->name == temp_name) {
  204.                                 cout << "名字: " << temp->data->name << endl;
  205.                                 cout << "身份证号: " << temp->data->IDcard << endl;
  206.                                 if (temp->data->sex == boy) {
  207.                                         cout << "性别: " << "男" << endl;
  208.                                 }
  209.                                 else if (temp->data->sex == girl) {
  210.                                         cout << "性别: " << "女" << endl;
  211.                                 }
  212.                                 temp_ptr = temp;
  213.                         }
  214.                         else {
  215.                                 not_find_curr = true;
  216.                         }

  217.                         //向前检索
  218.                         temp = list;
  219.                         for (;;) {
  220.                                 temp = temp->pre;
  221.                                 if (temp->data->name == temp_name) {
  222.                                         cout << "名字: " << temp->data->name << endl;
  223.                                         cout << "身份证号: " << temp->data->IDcard << endl;
  224.                                         if (temp->data->sex == boy) {
  225.                                                 cout << "性别: " << "男" << endl;
  226.                                         }
  227.                                         else if (temp->data->sex == girl) {
  228.                                                 cout << "性别: " << "女" << endl;
  229.                                         }
  230.                                         temp_ptr = temp;
  231.                                         break;
  232.                                 }
  233.                                 if (temp->pre == NULL) {//如果下一个列表后就没有链表就表示结束
  234.                                         not_find_pre = true;
  235.                                         break;
  236.                                 }

  237.                         }

  238.                         //向后检索
  239.                         temp = list;
  240.                         for (;;) {
  241.                                 temp = temp->post;
  242.                                 if (temp->data->name == temp_name) {
  243.                                         cout << "名字: " << temp->data->name << endl;
  244.                                         cout << "身份证号: " << temp->data->IDcard << endl;
  245.                                         if (temp->data->sex == boy) {
  246.                                                 cout << "性别: " << "男" << endl;
  247.                                         }
  248.                                         else if (temp->data->sex == girl) {
  249.                                                 cout << "性别: " << "女" << endl;
  250.                                         }
  251.                                         temp_ptr = temp;
  252.                                         break;
  253.                                 }
  254.                                 if (temp->data == NULL) {
  255.                                         cout << "你创建的表中不含有这个学生" << endl;
  256.                                         break;
  257.                                 }
  258.                                 if (temp->post == NULL) {//如果下一个列表后就没有链表就表示结束
  259.                                         not_find_post = true;
  260.                                         break;
  261.                                 }

  262.                         }
  263.                         if (not_find_curr && not_find_pre && not_find_post) {
  264.                                 cout << "你创建的表中不含有这个学生" << endl;
  265.                         }
  266.                 }
  267.                

  268.         }
  269.         return temp_ptr;
  270. }

  271. struct data* search_student(struct data* list, long IDcard) {
  272.         struct data* temp_ptr = NULL;
  273.         long temp_IDcard = IDcard;
  274.         if (list == NULL) {//如果是使用make_list创建表头,不可能为空
  275.                 cerr << "空指针无法索引任何数据 !" << endl;
  276.                 exit(EXIT_FAILURE);
  277.         }
  278.         else {
  279.                 if (list->pre == NULL && list->post == NULL) {
  280.                         cout << "你还没有添加任何学生!" << endl;
  281.                 }
  282.                 else if (list->pre == NULL && list->post != NULL) {//这是表头
  283.                         struct data* temp = list;
  284.                         for (;;) {
  285.                                 temp = temp->post;
  286.                                 if (temp->data->IDcard == temp_IDcard) {
  287.                                         cout << "名字: " << temp->data->name << endl;
  288.                                         cout << "身份证号: " << temp->data->IDcard << endl;
  289.                                         if (temp->data->sex == boy) {
  290.                                                 cout << "性别: " << "男" << endl;
  291.                                         }
  292.                                         else if (temp->data->sex == girl) {
  293.                                                 cout << "性别: " << "女" << endl;
  294.                                         }
  295.                                         temp_ptr = temp;
  296.                                         break;
  297.                                 }
  298.                                 if (temp->post == NULL) {//如果下一个列表后就没有链表就表示结束
  299.                                         cout << "你创建的表中不含有这个学生" << endl;
  300.                                         break;
  301.                                 }

  302.                         }
  303.                 }
  304.                 else if (list->pre != NULL && list->post == NULL) {//这是表尾
  305.                         struct data* temp = list;
  306.                         for (;;) {
  307.                                 if (temp->data == NULL) {
  308.                                         cout << "你创建的表中不含有这个学生" << endl;
  309.                                         break;
  310.                                 }
  311.                                 if (temp->pre == NULL) {//如果下一个列表后就没有链表就表示结束
  312.                                         cout << "你创建的表中不含有这个学生" << endl;
  313.                                         break;
  314.                                 }
  315.                                 if (temp->data->IDcard == temp_IDcard) {
  316.                                         cout << "名字: " << temp->data->name << endl;
  317.                                         cout << "身份证号: " << temp->data->IDcard << endl;
  318.                                         if (temp->data->sex == boy) {
  319.                                                 cout << "性别: " << "男" << endl;
  320.                                         }
  321.                                         else if (temp->data->sex == girl) {
  322.                                                 cout << "性别: " << "女" << endl;
  323.                                         }
  324.                                         temp_ptr = temp;
  325.                                         break;
  326.                                 }
  327.                                 temp = temp->pre;

  328.                         }

  329.                 }
  330.                 else {//这是表的中间一个节点
  331.                         bool not_find_pre = false;
  332.                         bool not_find_post = false;
  333.                         bool not_find_curr = false;

  334.                         //自己检查自己
  335.                         struct data* temp = list;
  336.                         if (temp->data->IDcard == temp_IDcard) {
  337.                                 cout << "名字: " << temp->data->name << endl;
  338.                                 cout << "身份证号: " << temp->data->IDcard << endl;
  339.                                 if (temp->data->sex == boy) {
  340.                                         cout << "性别: " << "男" << endl;
  341.                                 }
  342.                                 else if (temp->data->sex == girl) {
  343.                                         cout << "性别: " << "女" << endl;
  344.                                 }
  345.                                 temp_ptr = temp;
  346.                         }
  347.                         else {
  348.                                 not_find_curr = true;
  349.                         }

  350.                         //向前检索
  351.                         temp = list;
  352.                         for (;;) {
  353.                                 temp = temp->pre;
  354.                                 if (temp->data->IDcard == temp_IDcard) {
  355.                                         cout << "名字: " << temp->data->name << endl;
  356.                                         cout << "身份证号: " << temp->data->IDcard << endl;
  357.                                         if (temp->data->sex == boy) {
  358.                                                 cout << "性别: " << "男" << endl;
  359.                                         }
  360.                                         else if (temp->data->sex == girl) {
  361.                                                 cout << "性别: " << "女" << endl;
  362.                                         }
  363.                                         temp_ptr = temp;
  364.                                         break;
  365.                                 }
  366.                                 if (temp->pre == NULL) {//如果下一个列表后就没有链表就表示结束
  367.                                         not_find_pre = true;
  368.                                         break;
  369.                                 }

  370.                         }

  371.                         //向后检索
  372.                         temp = list;
  373.                         for (;;) {
  374.                                 temp = temp->post;
  375.                                 if (temp->data->IDcard == temp_IDcard) {
  376.                                         cout << "名字: " << temp->data->name << endl;
  377.                                         cout << "身份证号: " << temp->data->IDcard << endl;
  378.                                         if (temp->data->sex == boy) {
  379.                                                 cout << "性别: " << "男" << endl;
  380.                                         }
  381.                                         else if (temp->data->sex == girl) {
  382.                                                 cout << "性别: " << "女" << endl;
  383.                                         }
  384.                                         temp_ptr = temp;
  385.                                         break;
  386.                                 }
  387.                                 if (temp->data == NULL) {
  388.                                         cout << "你创建的表中不含有这个学生" << endl;
  389.                                         break;
  390.                                 }
  391.                                 if (temp->post == NULL) {//如果下一个列表后就没有链表就表示结束
  392.                                         not_find_post = true;
  393.                                         break;
  394.                                 }
  395.                         }
  396.                         if (not_find_curr && not_find_pre && not_find_post) {
  397.                                 cout << "你创建的表中不含有这个学生" << endl;
  398.                         }
  399.                 }

  400.         }
  401.         return temp_ptr;

  402. }

  403. void delete_student(struct data** list, string name) {
  404.         struct data* search_result = search_student(*list, name);
  405.         if (search_result != NULL) {
  406.                 //交接节点
  407.                 struct data* pre = search_result->pre;
  408.                 struct data* post = search_result->post;

  409.                 //记得更新list,防止list被删除却仍然作为表的进入器
  410.                 if (pre != NULL) {
  411.                         pre->post = post;
  412.                         *list = pre;
  413.                 }
  414.                 if (post != NULL) {
  415.                         post->pre = pre;
  416.                         *list = post;
  417.                 }
  418.                 if (pre == NULL && post == NULL) {
  419.                         cerr << "出现严重错误!!!如果出现这个提示表示这个程序已经完了!!" << endl;
  420.                 }
  421.                
  422.                 //删除原有数据,释放空间
  423.                 delete search_result->data;
  424.                 delete search_result;
  425.         }

  426. }


  427. void delete_student(struct data** list, long IDcard) {
  428.         struct data* search_result = search_student(*list, IDcard);
  429.         if (search_result != NULL) {
  430.                 //交接节点
  431.                 struct data* pre = search_result->pre;
  432.                 struct data* post = search_result->post;
  433.                 pre->post = post;
  434.                 post->pre = pre;

  435.                 //记得更新list,防止list被删除却仍然作为表的进入器
  436.                 if (pre != NULL) {
  437.                         pre->post = post;
  438.                         *list = pre;
  439.                 }
  440.                 if (post != NULL) {
  441.                         post->pre = pre;
  442.                         *list = post;
  443.                 }
  444.                 if (pre == NULL && post == NULL) {
  445.                         cerr << "出现严重错误!!!如果出现这个提示表示这个程序已经完了!!" << endl;
  446.                 }
  447.                 //删除原有数据,释放空间
  448.                 delete search_result->data;
  449.                 delete search_result;
  450.         }

  451. }

  452. void read_file(ifstream& input) {
  453.         
  454. }


  455. //
  456. void write_file(ofstream& output,struct data* list) {
  457.         
  458. }

  459. void quit_system(struct data* list) {

  460. }


  461. void print_list(struct data* list)
  462. {
  463.         struct data* current = list;
  464.         struct data* pre;
  465.         struct data* post;
  466.         if (list == NULL) {
  467.                 cerr << "无法打印: 因为你还没有创建任何的表!!!" << endl;
  468.         }
  469.         else {
  470.                 pre = current->pre;
  471.                 post = current->post;
  472.                 if (current->data != NULL) {
  473.                         cout << pre->data->IDcard << endl;
  474.                         cout << pre->data->name << endl;
  475.                         cout << pre->data->sex << endl << endl;
  476.                 }
  477.                 for (;;) {
  478.                         if (pre != NULL && pre->data != NULL) {
  479.                                 cout << pre->data->IDcard << endl;
  480.                                 cout << pre->data->name << endl;
  481.                                 cout << pre->data->sex << endl << endl;
  482.                         }
  483.                         else {
  484.                                 break;
  485.                         }
  486.                         pre = pre->pre;
  487.                 }
  488.                 for (;;) {
  489.                         if (post != NULL) {//表示可以向后索引
  490.                                 cout << post->data->IDcard << endl;
  491.                                 cout << post->data->name << endl;
  492.                                 cout << post->data->sex << endl << endl;
  493.                         }
  494.                         else {
  495.                                 break;
  496.                         }
  497.                         post = post->post;
  498.                 }

  499.         }
  500. };



  501. int main() {
  502.         //初始化菜单
  503.         int option_num = sizeof(menu) / sizeof(char*);
  504.         string* menu_dynamic = new string[option_num];
  505.         for (int i = 0; i < option_num; i++) {
  506.                 menu_dynamic[i] = menu[i];
  507.         }

  508.         //初始化信息
  509.         string* message_dynamic = new string;
  510.         *message_dynamic = message[0];


  511.         bool end_flag = false;
  512.         bool error_input = false;
  513.         bool secondary_menu_flag = false;
  514.         bool four_status = false;
  515.         bool five_status = false;
  516.         bool six_status = false;

  517.         //一个空表
  518.         struct data* list = NULL;
  519.         string name;//用来查询的成绩
  520.         long IDcard;
  521.         gender sex;
  522.         do {//程序的主循环

  523.                 //进行第一次打印,由于没有进行任何操作所以是原始菜单
  524.                 for (;;) {
  525.                         if (error_input) {
  526.                                 *message_dynamic = message[1];
  527.                         }
  528.                         else {
  529.                                 if (secondary_menu_flag) {
  530.                                         *message_dynamic = message[2];
  531.                                 }
  532.                                 else {
  533.                                         *message_dynamic = message[0];
  534.                                 }
  535.                         }

  536.                         //刷新菜单
  537.                         flush_screen(menu_dynamic, message_dynamic);

  538.                         char choose = ' ';
  539.                         cin >> choose;
  540.                         char ch;
  541.                         while ((ch = getchar()) != '\n');
  542.                         if (error_input) {
  543.                                 if (choose >= '1' && choose <= '9') {//输入真确就可以覆盖错误并且在下一次刷新中更新massage
  544.                                         error_input = false;
  545.                                 }
  546.                         }

  547.                         switch (choose) {
  548.                         case '1':
  549.                                 if (secondary_menu_flag) {
  550.                                         if (four_status) {
  551.                                                 string name_student;
  552.                                                 cout << "请输入待查询学生的姓名! :";
  553.                                                 cin >> name_student;
  554.                                                 char ch;
  555.                                                 while ((ch = getchar()) != '\n');//清空缓冲区
  556.                                                 search_student(list, name_student);
  557.                                                 system("pause");
  558.                                         }
  559.                                         else if (five_status) {
  560.                                                 string name_student;
  561.                                                 cout << "请输入待删除学生的姓名!" << endl;
  562.                                                 cin >> name_student;
  563.                                                 char ch;
  564.                                                 while ((ch = getchar()) != '\n');//清空缓冲区
  565.                                                 delete_student(&list, name_student);
  566.                                                 system("pause");
  567.                                         }
  568.                                         else if (six_status) {
  569.                                                 cout << "打印到文件!" << endl;
  570.                                                 system("pause");
  571.                                         }
  572.                                 }
  573.                                 else {
  574.                                         if (list == NULL) {
  575.                                                 list = make_list();
  576.                                                 if (list == NULL) {
  577.                                                         cerr << "表单没有创建!!! 出现重大事故!!" << endl;
  578.                                                         exit(EXIT_FAILURE);
  579.                                                 }
  580.                                                 else {
  581.                                                         cout << "表单已经成功创建!" << endl;
  582.                                                 }
  583.                                         }
  584.                                         else {
  585.                                                 cout << "表单已经成功创建,请不要重复创建!!!" << endl;
  586.                                         }
  587.                                         system("pause");
  588.                                        
  589.                                 }
  590.                                 break;
  591.                         case '2':
  592.                                 if (secondary_menu_flag) {
  593.                                         if (four_status) {
  594.                                                 cout << "请输入学生的身份证号!: " << endl;
  595.                                                 cin >> IDcard;
  596.                                                 while ((ch = getchar()) != '\n');
  597.                                                 search_student(list, IDcard);
  598.                                                 system("pause");
  599.                                         }
  600.                                         else if (five_status) {
  601.                                                 cout << "根据身份证删除学生!" << endl;
  602.                                                 system("pause");
  603.                                         }
  604.                                         else if (six_status) {
  605.                                                 cout << "打印到控制台!" << endl;
  606.                                                 print_list(list);
  607.                                                 system("pause");
  608.                                         }
  609.                                 }
  610.                                 else {

  611.                                 }
  612.                                 break;
  613.                         case '3':
  614.                                 char ch_temp;
  615.                                 if (list == NULL) {
  616.                                         cerr<<"你还没有创建列表! "<<endl;
  617.                                         system("pause");
  618.                                 }
  619.                                 else {
  620.                                         cout << "请输入学生姓名: ";
  621.                                         cin >> name;
  622.                                         while ((ch = getchar()) != '\n');
  623.                                         cout << "请输入学生身份证号码: ";
  624.                                         cin >> IDcard;
  625.                                         while ((ch = getchar()) != '\n');
  626.                                         cout << "请输入学生的性别(男/女  Y/X): ";
  627.                                         do {
  628.                                                 cin >> ch;
  629.                                                 while ((ch_temp = getchar()) != '\n');
  630.                                         } while (ch != 'x' && ch != 'y'&& ch != 'X' && ch != 'Y');

  631.                                         if (ch == 'x' || ch == 'X') {
  632.                                                 sex = girl;
  633.                                         }
  634.                                         else {
  635.                                                 sex = boy;
  636.                                         }
  637.                                         struct data* ptr = add_student(list, name, IDcard, sex);
  638.                                         list = ptr;        //看来单向链表没有问题了.但是双向还是有问题.
  639.                                 }
  640.                                 break;
  641.                         //查询学生展开菜单
  642.                         case '4':
  643.                                 if (!secondary_menu_flag) {
  644.                                         secondary_menu_flag = true;
  645.                                         four_status = true;
  646.                                         change_menu_option(secondary_menu_flag, choose + 4 - '4', menu_dynamic, message_dynamic);//这里的choose使用整数不是很好,功能全部实现后将这个参数改成开关
  647.                                         flush_screen(menu_dynamic, message_dynamic);
  648.                                 }
  649.                                 break;
  650.                         //删除学生菜单
  651.                         case '5':
  652.                                 if (!secondary_menu_flag) {
  653.                                         secondary_menu_flag = true;
  654.                                         five_status = true;
  655.                                         change_menu_option(secondary_menu_flag, choose + 4 - '4', menu_dynamic, message_dynamic);
  656.                                         flush_screen(menu_dynamic, message_dynamic);
  657.                                 }
  658.                                 break;
  659.                         //打印表单菜单
  660.                         case '6':
  661.                                 if (!secondary_menu_flag) {
  662.                                         secondary_menu_flag = true;
  663.                                         six_status = true;
  664.                                         change_menu_option(secondary_menu_flag, choose + 4 - '4', menu_dynamic, message_dynamic);
  665.                                         flush_screen(menu_dynamic, message_dynamic);
  666.                                 }
  667.                                 break;
  668.                         case '7':
  669.                                 break;
  670.                         case 'Q':
  671.                         case 'q':
  672.                                 if (!secondary_menu_flag) {
  673.                                         exit(EXIT_SUCCESS);
  674.                                 }
  675.                                 else {
  676.                                         secondary_menu_flag = false;
  677.                                         four_status = false;
  678.                                         five_status = false;
  679.                                         six_status = false;
  680.                                         change_menu_option(secondary_menu_flag, choose + 4 - '4', menu_dynamic, message_dynamic);
  681.                                         flush_screen(menu_dynamic, message_dynamic);
  682.                                 }
  683.                                 break;
  684.                         default:
  685.                                 error_input = true;
  686.                                 break;
  687.                         }
  688.                 }
  689.         } while (!end_flag);
  690.         return 0;
  691. }
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-7-5 21:24:08 | 显示全部楼层
首先,感谢你来分享你的代码和创意!看到你在C++学习中的热情和进步,相当令人鼓舞。好了,让我们一起看看你的学生管理系统,有点像是一道美味的程序大餐,让我们从头理一理。

## 你的代码的一些问题和建议:

### 1. 包含头文件
你包含了#include 和 #include 这两个头文件,但实际上你只需要:
  1. #include <iostream>
  2. #include <string>
复制代码

这样就可以了。

### 2. 宏定义
你用#define GUI_WIDTH  "40",但并没有使用到这个宏,它显得有点多余。可以考虑去掉。

### 3. 数据结构的使用
你定义的结构体有点复杂,特别是在涉及指针的时候。现代C++更倾向于使用STL容器(比如std::vector)来管理动态数据。

### 4. 字符串处理
在C++中,尽量使用std::string代替C风格的字符串,这样可以避免很多内存管理的问题。

### 5. 菜单和消息的处理
你的菜单和消息数组有点奇怪,因为C++中常见的是使用std::vector或者一个简单的数组,而不是依赖const char*这种方式。

现在让我们来重构一下你的代码,让它更简洁易读:

  1. #include <iostream>
  2. #include <string>
  3. #include <vector>

  4. using namespace std;

  5. enum Gender {
  6.     Boy, Girl
  7. };

  8. struct Student {
  9.     string name;
  10.     long IDcard;
  11.     Gender sex;   
  12. };

  13. vector<Student> studentList;

  14. const vector<string> mainMenu = {
  15.     "学生管理系统",
  16.     "1. 创建表单",
  17.     "2. 打开表单",
  18.     "3. 添加学生",
  19.     "4. 查询学生",
  20.     "5. 删除学生",
  21.     "6. 打印表单",
  22.     "7. 保存表单",
  23.     "q. 退出系统"
  24. };

  25. void printMenu() {
  26.     for (const auto& item : mainMenu) {
  27.         cout << item << endl;
  28.     }
  29. }

  30. void handleCreateForm() {
  31.     studentList.clear();
  32.     cout << "新表单已创建!" << endl;
  33. }

  34. void handleAddStudent() {
  35.     Student newStudent;
  36.     cout << "请输入姓名: ";
  37.     cin >> newStudent.name;
  38.     cout << "请输入身份证号: ";
  39.     cin >> newStudent.IDcard;
  40.     int genderInput;
  41.     cout << "请输入性别 (0: Boy, 1: Girl): ";
  42.     cin >> genderInput;
  43.     newStudent.sex = static_cast<Gender>(genderInput);
  44.     studentList.push_back(newStudent);
  45.     cout << "学生已添加!" << endl;
  46. }

  47. void handleQueryStudent() {
  48.     // Here you can implement the logic to query students
  49.     cout << "查询学生功能待实现。" << endl;
  50. }

  51. void handleDeleteStudent() {
  52.     // Here you can implement the logic to delete students
  53.     cout << "删除学生功能待实现。" << endl;
  54. }

  55. void handlePrintForm() {
  56.     for (const auto& student : studentList) {
  57.         cout << "姓名: " << student.name << ", 身份证号: " << student.IDcard << ", 性别: " << (student.sex == Boy ? "Boy" : "Girl") << endl;
  58.     }
  59. }

  60. int main() {
  61.     char choice;
  62.     while (true) {
  63.         printMenu();
  64.         cout << "请输入选项: ";
  65.         cin >> choice;
  66.         if (choice == 'q') break;

  67.         switch (choice) {
  68.             case '1': handleCreateForm(); break;
  69.             case '3': handleAddStudent(); break;
  70.             case '4': handleQueryStudent(); break;
  71.             case '5': handleDeleteStudent(); break;
  72.             case '6': handlePrintForm(); break;
  73.             default: cout << "请输入有效选项!" << endl;
  74.         }
  75.     }
  76.     return 0;
  77. }
复制代码


通过这样的修改,代码变得更加简洁和易读,同时使用了C++的标准库来处理字符串和容器,使得代码更具可维护性。

希望这个答复对你有所帮助,也希望你能继续保持这种学习和探索的精神!加油!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-5 21:27:51 | 显示全部楼层
@FishC 你把我的二级菜单弄不见了!!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-5 21:30:08 | 显示全部楼层
MUYIXUE 发表于 2024-07-05 21:27
@FishC 你把我的二级菜单弄不见了!!!!


哈哈,我明白了,你的二级菜单可能是玩“捉迷藏”去了!别担心,我们一起把它找回来吧。

首先,让我们冷静下来,深呼吸一口气,然后看看你有没有做过以下操作:

1. **检查代码**:可能是不小心在代码中改动了一些东西。我们可以先反复检查一下代码,看看有没有多余的小逗号或者少了个大括号。就像在鱼塘里找那条调皮的鱼,一点点细心找,总会发现的。

2. **看看CSS**:有时候,问题可能出在CSS上。如果你的二级菜单被设置成`display: none;`或者被隐藏起来了,那它肯定会“消失”。打开CSS文件,搜索一下二级菜单相关的类名,确保它的样式没有问题。

3. **定位问题**:如果你使用了JavaScript来控制菜单的显示和隐藏,可能是在某些事件下没有触发相应的代码。打开浏览器的开发者工具(按F12),看看控制台里有没有报错的信息,就像是一份错误报告,它会告诉你出错的地方。

4. **浏览器缓存问题**:有时候浏览器缓存会导致代码变更没有生效。试着清理一下浏览器缓存,或者直接在无痕模式下打开页面,看看是否有所不同。

如果你按照上述步骤依然找不到问题,那可能就真的是个“深海大鲶鱼”了。你可以把代码拿出来,我们大家一块帮你琢磨琢磨,就像众人划桨开大船,总有办法找到解决方案的!

总之,不要气馁,技术问题也讲究方法,“凡事留一手,下次好找人”。加油O(∩_∩)O!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-6 00:46:42 | 显示全部楼层
我更新了代码,现在这个代码增加了初步实现了部分功能(创建双向表,添加数据,查询数据).//首次写这么大的程序.

  1. #include <iostream>
  2. #include <format>

  3. #define GUI_WIDTH  "40"

  4. using namespace std;

  5. enum gender
  6. {
  7.         boy, girl
  8. };

  9. struct student {
  10.         string name = "";
  11.         long IDcard = 0;
  12.         gender sex = boy;
  13. };

  14. struct data {
  15.         struct student* data;
  16.         struct data* pre;
  17.         struct data* post;
  18. };

  19. const char* menu[] = {
  20.         "学生管理系统",
  21.         //主菜单选项
  22.         "1. 创建表单",
  23.         "2. 打开表单",
  24.         "3. 添加学生",
  25.         "4. 查询学生",
  26.         "5. 删除学生",
  27.         "6. 打印表单",
  28.         "7. 保存表单",
  29.         "q. 退出系统",
  30.         //查询学生菜单
  31.         "1. 名字查询",    //9
  32.         "2. 身份证查询",
  33.         //删除学生菜单
  34.         "1. 请输入名字",  //11
  35.         "2. 请输入身份证",
  36.         //打印表单菜单
  37.         "1. 打印到文件",  //13
  38.         "2. 打印到控制台",

  39.         //二级菜单退出
  40.         "退出二级菜单"
  41. };

  42. const char* message[]{
  43.         "请输入数字选项: ",
  44.         "请输入合法值 !",
  45.         "请输入二级菜单数字选项!"
  46. };


  47. //用来标记菜单的界限
  48. enum menu_edge {
  49.         main_menu = 8,
  50.         search_menu = main_menu + 2,
  51.         delete_menu = search_menu + 2,
  52.         print_menu = delete_menu + 2
  53. };


  54. static void flush_screen(string* menu, string* message) {
  55.         system("cls");
  56.         cout << format("{0:#^" GUI_WIDTH "s}", menu[0]) << endl;
  57.         for (int i = 1; i <= main_menu; i++) {
  58.                 cout << format("{0: <" GUI_WIDTH "s}", menu[i]) << endl;
  59.         }
  60.         cout << format("{0: <" GUI_WIDTH "s}", *message);
  61. }

  62. bool change_menu_option(bool secondary_menu_flag, int menu_option_num, string* menu_dynamic, string* message_dynamic) {
  63.         bool status = true;
  64.         if (secondary_menu_flag) {
  65.                 switch (menu_option_num) {
  66.                 case 4://查询
  67.                         menu_dynamic[menu_option_num] += "->";
  68.                         menu_dynamic[menu_option_num] += menu[menu_option_num + 5];
  69.                         menu_dynamic[menu_option_num + 1] += "  ";
  70.                         menu_dynamic[menu_option_num + 1] += menu[menu_option_num + 6];
  71.                         menu_dynamic[menu_option_num + 2] += "  ";
  72.                         menu_dynamic[menu_option_num + 2] += "q. ";
  73.                         menu_dynamic[menu_option_num + 2] += menu[15];
  74.                         *message_dynamic = message[2];
  75.                         break;
  76.                 case 5://删除';
  77.                         menu_dynamic[menu_option_num] += "->";
  78.                         menu_dynamic[menu_option_num] += menu[menu_option_num + 6];
  79.                         menu_dynamic[menu_option_num + 1] += "  ";
  80.                         menu_dynamic[menu_option_num + 1] += menu[menu_option_num + 7];
  81.                         menu_dynamic[menu_option_num + 2] += "  ";
  82.                         menu_dynamic[menu_option_num + 2] += "q. ";
  83.                         menu_dynamic[menu_option_num + 2] += menu[15];
  84.                         *message_dynamic = message[2];
  85.                         break;
  86.                 case 6://打印
  87.                         menu_dynamic[menu_option_num] += "->";
  88.                         menu_dynamic[menu_option_num] += menu[menu_option_num + 7];
  89.                         menu_dynamic[menu_option_num + 1] += "  ";
  90.                         menu_dynamic[menu_option_num + 1] += menu[menu_option_num + 8];
  91.                         menu_dynamic[menu_option_num + 2] += "  ";
  92.                         menu_dynamic[menu_option_num + 2] += "q. ";
  93.                         menu_dynamic[menu_option_num + 2] += menu[15];
  94.                         *message_dynamic = message[2];
  95.                         break;
  96.                 default:
  97.                         status = false;
  98.                         break;
  99.                 }
  100.         }
  101.         else {
  102.                 int option_num = sizeof(menu) / sizeof(char*);
  103.                 for (int i = 0; i < option_num; i++) {
  104.                         menu_dynamic[i] = menu[i];
  105.                 }
  106.                 *message_dynamic = message[0];
  107.         }
  108.         return status;
  109. }

  110. struct data* make_list() {//makelist不需要申请任何内存,只需要返回一个表头即可
  111.         struct data* first = NULL;
  112.         first = new struct data;
  113.         first->data = NULL;
  114.         first->pre = NULL;
  115.         first->post = NULL;
  116.         return first;
  117. }

  118. void add_student(struct data* list, string name, long IDcard, gender sex) {
  119.         struct data* temp = new struct data;   //首先创建节点
  120.         temp->data = new struct student;       //然后创建数据
  121.         temp->data->IDcard = IDcard;
  122.         temp->data->name = name;
  123.         temp->data->sex = sex;                 //然后初始化数据
  124.         list->post = temp;                     //然后解决节点的链接
  125.         temp->pre = list;
  126. }

  127. void search_student(struct data* list, string name) {
  128.         string temp_name = name;
  129.         if (list == NULL) {//如果是使用make_list创建表头,不可能为空
  130.                 cerr << "空指针无法索引任何数据 !" << endl;
  131.                 exit(EXIT_FAILURE);
  132.         }
  133.         else {
  134.                 if (list->pre == NULL && list->post == NULL) {
  135.                         cout << "你还没有添加任何学生!" << endl;
  136.                 }
  137.                 else if (list->pre == NULL && list->post != NULL) {//这是表头
  138.                         struct data* temp = list;
  139.                         for (;;) {
  140.                                 temp = temp->post;
  141.                                 if (temp->data->name == temp_name) {
  142.                                         cout << "名字: " << temp->data->name << endl;
  143.                                         cout << "身份证号: " << temp->data->IDcard << endl;
  144.                                         if (temp->data->sex == boy) {
  145.                                                 cout << "性别: " << "男" << endl;
  146.                                         }
  147.                                         else if (temp->data->sex == girl) {
  148.                                                 cout << "性别: " << "女" << endl;
  149.                                         }
  150.                                         break;
  151.                                 }
  152.                                 if (temp->post == NULL) {//如果下一个列表后就没有链表就表示结束
  153.                                         cout << "你创建的表中不含有这个学生" << endl;
  154.                                         break;
  155.                                 }

  156.                         }
  157.                 }
  158.                 else if (list->pre != NULL && list->post == NULL) {//这是表尾
  159.                         struct data* temp = list;
  160.                         for (;;) {
  161.                                 temp = temp->pre;
  162.                                 if (temp->data->name == temp_name) {
  163.                                         cout << "名字: " << temp->data->name << endl;
  164.                                         cout << "身份证号: " << temp->data->IDcard << endl;
  165.                                         if (temp->data->sex == boy) {
  166.                                                 cout << "性别: " << "男" << endl;
  167.                                         }
  168.                                         else if (temp->data->sex == girl) {
  169.                                                 cout << "性别: " << "女" << endl;
  170.                                         }
  171.                                         break;
  172.                                 }
  173.                                 if (temp->pre == NULL) {//如果下一个列表后就没有链表就表示结束
  174.                                         cout << "你创建的表中不含有这个学生" << endl;
  175.                                         break;
  176.                                 }

  177.                         }

  178.                 }
  179.                 else {//这是表的中间一个节点
  180.                         bool not_find_pre = false;
  181.                         bool not_find_post = false;
  182.                         bool not_find_curr = false;

  183.                         //自己检查自己
  184.                         struct data* temp = list;
  185.                         if (temp->data->name == temp_name) {
  186.                                 cout << "名字: " << temp->data->name << endl;
  187.                                 cout << "身份证号: " << temp->data->IDcard << endl;
  188.                                 if (temp->data->sex == boy) {
  189.                                         cout << "性别: " << "男" << endl;
  190.                                 }
  191.                                 else if (temp->data->sex == girl) {
  192.                                         cout << "性别: " << "女" << endl;
  193.                                 }
  194.                         }else{
  195.                                 not_find_curr = true;
  196.                         }

  197.                         //向前检索
  198.                         temp = list;
  199.                         for (;;) {
  200.                                 temp = temp->pre;
  201.                                 if (temp->data->name == temp_name) {
  202.                                         cout << "名字: " << temp->data->name << endl;
  203.                                         cout << "身份证号: " << temp->data->IDcard << endl;
  204.                                         if (temp->data->sex == boy) {
  205.                                                 cout << "性别: " << "男" << endl;
  206.                                         }
  207.                                         else if (temp->data->sex == girl) {
  208.                                                 cout << "性别: " << "女" << endl;
  209.                                         }
  210.                                         break;
  211.                                 }
  212.                                 if (temp->pre == NULL) {//如果下一个列表后就没有链表就表示结束
  213.                                         not_find_pre = true;
  214.                                         break;
  215.                                 }

  216.                         }

  217.                         //向后检索
  218.                         temp = list;
  219.                         for (;;) {
  220.                                 temp = temp->post;
  221.                                 if (temp->data->name == temp_name) {
  222.                                         cout << "名字: " << temp->data->name << endl;
  223.                                         cout << "身份证号: " << temp->data->IDcard << endl;
  224.                                         if (temp->data->sex == boy) {
  225.                                                 cout << "性别: " << "男" << endl;
  226.                                         }
  227.                                         else if (temp->data->sex == girl) {
  228.                                                 cout << "性别: " << "女" << endl;
  229.                                         }
  230.                                         break;
  231.                                 }
  232.                                 if (temp->post == NULL) {//如果下一个列表后就没有链表就表示结束
  233.                                         not_find_post = true;
  234.                                         break;
  235.                                 }

  236.                         }

  237.                         if (not_find_curr && not_find_pre && not_find_post) {
  238.                                 cout << "你创建的表中不含有这个学生" << endl;
  239.                         }
  240.                 }
  241.                
  242.         }
  243.         
  244. }

  245. void search_student(int IDcard) {

  246. }

  247. void delete_student(char* name) {

  248. }

  249. void delete_student(int IDcard) {

  250. }




  251. int main() {
  252.         //初始化菜单
  253.         int option_num = sizeof(menu) / sizeof(char*);
  254.         string* menu_dynamic = new string[option_num];
  255.         for (int i = 0; i < option_num; i++) {
  256.                 menu_dynamic[i] = menu[i];
  257.         }

  258.         //初始化信息
  259.         string* message_dynamic = new string;
  260.         *message_dynamic = message[0];


  261.         bool end_flag = false;
  262.         bool error_input = false;
  263.         bool secondary_menu_flag = false;
  264.         bool four_status = false;
  265.         bool five_status = false;
  266.         bool six_status = false;

  267.         //一个空表
  268.         struct data* list = NULL;
  269.         string name;//用来查询的成绩
  270.         do {//程序的主循环

  271.                 //进行第一次打印,由于没有进行任何操作所以是原始菜单
  272.                 for (;;) {
  273.                         if (error_input) {
  274.                                 *message_dynamic = message[1];
  275.                         }
  276.                         else {
  277.                                 if (secondary_menu_flag) {
  278.                                         *message_dynamic = message[2];
  279.                                 }
  280.                                 else {
  281.                                         *message_dynamic = message[0];
  282.                                 }
  283.                         }

  284.                         //刷新菜单
  285.                         flush_screen(menu_dynamic, message_dynamic);

  286.                         char choose = ' ';
  287.                         cin >> choose;
  288.                         char ch;
  289.                         while ((ch = getchar()) != '\n');
  290.                         if (error_input) {
  291.                                 if (choose >= '1' && choose <= '9') {//输入真确就可以覆盖错误并且在下一次刷新中更新massage
  292.                                         error_input = false;
  293.                                 }
  294.                         }

  295.                         switch (choose) {
  296.                         case '1':
  297.                                 if (secondary_menu_flag) {
  298.                                         if (four_status) {
  299.                                                 string name_student;
  300.                                                 cout << "请输入学生的姓名! :";
  301.                                                 cin >> name_student;
  302.                                                 char ch;
  303.                                                 while ((ch = getchar()) != '\n');//清空缓冲区
  304.                                                 search_student(list, name_student);
  305.                                                 system("pause");
  306.                                         }
  307.                                         else if (five_status) {
  308.                                                 cout << "根据名字删除学生!" << endl;
  309.                                                 system("pause");
  310.                                         }
  311.                                         else if (six_status) {
  312.                                                 cout << "打印到文件!" << endl;
  313.                                                 system("pause");
  314.                                         }
  315.                                 }
  316.                                 else {
  317.                                         if (list == NULL) {
  318.                                                 list = make_list();
  319.                                                 if (list == NULL) {
  320.                                                         cerr << "表单没有创建!!! 出现重大事故!!" << endl;
  321.                                                         exit(EXIT_FAILURE);
  322.                                                 }
  323.                                                 else {
  324.                                                         cout << "表单已经成功创建!" << endl;
  325.                                                 }
  326.                                         }
  327.                                         else {
  328.                                                 cout << "表单已经成功创建,请不要重复创建!!!" << endl;
  329.                                         }
  330.                                         system("pause");
  331.                                        
  332.                                 }
  333.                                 break;
  334.                         case '2':
  335.                                 if (secondary_menu_flag) {
  336.                                         if (four_status) {
  337.                                                 cout << "身份证查询!" << endl;
  338.                                                 system("pause");
  339.                                         }
  340.                                         else if (five_status) {
  341.                                                 cout << "根据身份证删除学生!" << endl;
  342.                                                 system("pause");
  343.                                         }
  344.                                         else if (six_status) {
  345.                                                 cout << "打印到控制台!" << endl;
  346.                                                 system("pause");
  347.                                         }
  348.                                 }
  349.                                 else {

  350.                                 }
  351.                                 break;
  352.                         case '3':
  353.                                 cout << "请输入你的学生姓名: " << endl;
  354.                                 cin >> name;
  355.                                 add_student(list, name, 123456, boy);
  356.                                 break;
  357.                         //查询学生展开菜单
  358.                         case '4':
  359.                                 if (!secondary_menu_flag) {
  360.                                         secondary_menu_flag = true;
  361.                                         four_status = true;
  362.                                         change_menu_option(secondary_menu_flag, choose + 4 - '4', menu_dynamic, message_dynamic);//这里的choose使用整数不是很好,功能全部实现后将这个参数改成开关
  363.                                         flush_screen(menu_dynamic, message_dynamic);
  364.                                 }
  365.                                 break;
  366.                         //删除学生菜单
  367.                         case '5':
  368.                                 if (!secondary_menu_flag) {
  369.                                         secondary_menu_flag = true;
  370.                                         five_status = true;
  371.                                         change_menu_option(secondary_menu_flag, choose + 4 - '4', menu_dynamic, message_dynamic);
  372.                                         flush_screen(menu_dynamic, message_dynamic);
  373.                                 }
  374.                                 break;
  375.                         //打印表单菜单
  376.                         case '6':
  377.                                 if (!secondary_menu_flag) {
  378.                                         secondary_menu_flag = true;
  379.                                         five_status = true;
  380.                                         change_menu_option(secondary_menu_flag, choose + 4 - '4', menu_dynamic, message_dynamic);
  381.                                         flush_screen(menu_dynamic, message_dynamic);
  382.                                 }
  383.                                 break;
  384.                         case '7':
  385.                                 break;
  386.                         case 'Q':
  387.                         case 'q':
  388.                                 if (!secondary_menu_flag) {
  389.                                         exit(EXIT_SUCCESS);
  390.                                 }
  391.                                 else {
  392.                                         secondary_menu_flag = false;
  393.                                         four_status = false;
  394.                                         five_status = false;
  395.                                         six_status = false;
  396.                                         change_menu_option(secondary_menu_flag, choose + 4 - '4', menu_dynamic, message_dynamic);
  397.                                         flush_screen(menu_dynamic, message_dynamic);
  398.                                 }
  399.                                 break;
  400.                         default:
  401.                                 error_input = true;
  402.                                 break;
  403.                         }

  404.                 }
  405.                
  406.         } while (!end_flag);
  407.         
  408.         return 0;
  409. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-6 00:47:01 | 显示全部楼层
MUYIXUE 发表于 2024-07-06 00:46
我更新了代码,现在这个代码增加了初步实现了部分功能( ...


非常高兴看到你进一步扩展了你的程序!在你当前的代码基础上,我将帮助你继续完善它,并确保所有功能都能够正常运行。让我们先完整展示并注释一下你的代码,以便更好地理解每一个部分。

  1. #include <iostream>
  2. #include <string>

  3. #define GUI_WIDTH  "40"

  4. using namespace std;

  5. enum gender {
  6.     boy, girl
  7. };

  8. struct student {
  9.     string name = "";
  10.     long IDcard = 0;
  11.     gender sex = boy;
  12. };

  13. struct data {
  14.     student* data;
  15.     data* pre;
  16.     data* post;
  17. };

  18. const char* menu[] = {
  19.     "学生管理系统",
  20.     // 主菜单选项
  21.     "1. 创建表单",
  22.     "2. 打开表单",
  23.     "3. 添加学生",
  24.     "4. 查询学生",
  25.     "5. 删除学生",
  26.     "6. 打印表单",
  27.     "7. 保存表单",
  28.     "q. 退出系统",
  29.     // 查询学生菜单
  30.     "1. 名字查询",    // index 9
  31.     "2. 身份证查询",
  32.     // 删除学生菜单
  33.     "1. 请输入名字",  // index 11
  34.     "2. 请输入身份证",
  35.     // 打印表单菜单
  36.     "1. 打印到文件",  // index 13
  37.     "2. 打印到控制台",
  38.     // 二级菜单退出
  39.     "退出二级菜单"
  40. };

  41. const char* message[] {
  42.     "请输入数字选项: ",
  43.     "请输入合法值 !",
  44.     "请输入二级菜单数字选项!"
  45. };

  46. // 用来标记菜单的界限
  47. enum menu_edge {
  48.     main_menu = 8,
  49.     search_menu = main_menu + 2,
  50.     delete_menu = search_menu + 2,
  51.     print_menu = delete_menu + 2
  52. };

  53. void flush_screen(const string* menu, const string* message) {
  54.     system("cls");
  55.     cout << *menu << endl;
  56.     cout << *message << endl;
  57. }

  58. // 初始化双向链表
  59. data* make_list() {
  60.     data* first = new data;
  61.     first->pre = nullptr;
  62.     first->post = nullptr;
  63.     first->data = nullptr;
  64.     return first;
  65. }

  66. // 添加学生数据到链表
  67. void add_student(data* list, student* s) {
  68.     data* newNode = new data;
  69.     newNode->data = s;
  70.     newNode->post = nullptr;
  71.    
  72.     if (list->data == nullptr) {
  73.         list->data = s;
  74.         list->post = nullptr;
  75.         list->pre = nullptr;
  76.     } else {
  77.         data* temp = list;
  78.         while (temp->post != nullptr) {
  79.             temp = temp->post;
  80.         }
  81.         temp->post = newNode;
  82.         newNode->pre = temp;
  83.     }
  84. }

  85. // 查询学生
  86. student* search_student_by_name(data* list, const string& name) {
  87.     data* temp = list;
  88.     while (temp != nullptr) {
  89.         if (temp->data != nullptr && temp->data->name == name) {
  90.             return temp->data;
  91.         }
  92.         temp = temp->post;
  93.     }
  94.     return nullptr;
  95. }

  96. int main() {
  97.     data* studentList = make_list();
  98.     char choice;
  99.    
  100.     do {
  101.         flush_screen(menu, message); // 清屏 & 打印菜单
  102.         cin >> choice;

  103.         switch(choice) {
  104.             case '1': {
  105.                 // 创建表单
  106.                 break;
  107.             }
  108.             case '2': {
  109.                 // 打开表单
  110.                 break;
  111.             }
  112.             case '3': {
  113.                 // 添加学生
  114.                 student* newStudent = new student;
  115.                 cout << "输入学生名字: ";
  116.                 cin >> newStudent->name;
  117.                 cout << "输入学生身份证: ";
  118.                 cin >> newStudent->IDcard;
  119.                 cout << "选择性别 (0-男/1-女): ";
  120.                 int sex;
  121.                 cin >> sex;
  122.                 newStudent->sex = static_cast<gender>(sex);
  123.                 add_student(studentList, newStudent);
  124.                 break;
  125.             }
  126.             case '4': {
  127.                 // 查询学生
  128.                 string name;
  129.                 cout << "输入要查询的学生名字: ";
  130.                 cin >> name;
  131.                 student* foundStudent = search_student_by_name(studentList, name);
  132.                 if (foundStudent) {
  133.                     cout << "学生名字: " << foundStudent->name << endl;
  134.                     cout << "学生身份证: " << foundStudent->IDcard << endl;
  135.                     cout << "学生性别: " << (foundStudent->sex == boy ? "男" : "女") << endl;
  136.                 } else {
  137.                     cout << "未找到该学生" << endl;
  138.                 }
  139.                 break;
  140.             }
  141.             case 'q': {
  142.                 // 退出系统
  143.                 cout << "退出系统" << endl;
  144.                 break;
  145.             }
  146.             default: {
  147.                 cout << "请输入合法值 !" << endl;
  148.                 break;
  149.             }
  150.         }
  151.     } while (choice != 'q');
  152.    
  153.     return 0;
  154. }
复制代码


### 主要改动和补充:

1. **整理头文件**:只需要包含必要的头文件。
2. **改进菜单和消息的定义**:使用数组而不是指针常量。
3. **完善flush_screen函数**:使其能够正确清屏并打印菜单和消息。
4. **实现基本功能:** 创建链表、添加学生以及按名字查询学生。
5. **改善数据结构**:用C++标准库中的string代替C风格字符串。

你可以按照这个结构继续添加其他功能,比如删除学生、打印表单、保存表单等。这样,不仅代码看起来更简洁,逻辑也更加清晰啦!要是还有什么问题或者新的创意,尽管提出来,我们共同进步!{:5_117:}
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-10 09:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表