【C语言】:门生管理系统(多文件版)

打印 上一主题 下一主题

主题 995|帖子 995|积分 2985

一、文件框架



 二、Data

data.txt

 三、Inc

1. list.h

门生结构体
  1. #ifndef __LIST_H__
  2. #define __LIST_H__
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <stdbool.h>
  7. #include <time.h>
  8. #define MAX_LEN 20
  9. // 学生信息结构体
  10. typedef struct
  11. {
  12.     // 登录用
  13.     char user_name[128]; // 账号
  14.     char password[128];  // 密码
  15.     // 学生信息
  16.     char name[128]; // 学生姓名
  17.     char sex[5];    // 学生性别
  18.     int id;         // 学生id
  19.     int age;        // 学生年龄
  20.     int soc;        // 学生成绩
  21. } stu_user;
复制代码
 顺序表结构体
  1. // 顺序表结构体
  2. typedef struct list_str
  3. {
  4.     // 信息
  5.     stu_user data[MAX_LEN];
  6.     // 长度
  7.     int len;
  8. } list_str;
复制代码
 一些关于list功能函数声明...

2. file.h

  1. #ifndef __FILE_H__
  2. #define __FILE_H__
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include "list.h"
  6. // 保存用户数据
  7. #define FILE_NAME "./Data/data.txt"
  8. // 更新文件 写入文件
  9. void file_updata_file(list_str *L);
  10. // 更新顺序表
  11. void file_updata_list(list_str *L);
  12. #endif
复制代码
 3.  main.h

  1. #ifndef __MAIN_H__
  2. #define __MAIN_H__
  3. // 添加头文件
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. // 添加库文件
  8. #include "file.h"
  9. #include "list.h"
  10. #endif
复制代码
 四、Src

1. file.c

更新顺序表
  1. #include "file.h"
  2. // 更新文件  写入文件
  3. void file_updata_file(list_str *L)
  4. {
  5.     // 安全判定
  6.     if (NULL == L)
  7.     {
  8.         printf("表为空\n");
  9.         exit(-1);
  10.     }
  11.     // 打开文件
  12.     FILE *fp = fopen(FILE_NAME, "w");
  13.     if (NULL == fp)
  14.     {
  15.         printf("文件打开失败\n");
  16.         exit(-1);
  17.     }
  18.     // 写入文件
  19.     for (size_t i = 0; i < L->len; i++)
  20.     {
  21.         fprintf(fp, "%s\t%s\t%s\t%s\t%d\t%d\t%d\n",
  22.                 L->data[i].user_name, L->data[i].password,
  23.                 L->data[i].name, L->data[i].sex, L->data[i].id,
  24.                 L->data[i].age, L->data[i].soc);
  25.     }
  26. }
  27. // 更新顺序表
  28. void file_updata_list(list_str *L)
  29. {
  30.     // 安全判定
  31.     if (NULL == L)
  32.     {
  33.         printf("表为空\n");
  34.         exit(-1);
  35.     }
  36.     // 打开文件
  37.     FILE *fp = fopen(FILE_NAME, "r+");
  38.     if (NULL == fp)
  39.     {
  40.         printf("文件打开失败\n");
  41.         exit(-1);
  42.     }
  43.     // 让文件流回到开头
  44.     fseek(fp, 0, SEEK_SET);
  45.     // 获取文件行数
  46.     int len = 0;
  47.     char ch = 0;
  48.     // EOF 为 文件结尾
  49.     while (EOF != (ch = fgetc(fp)))
  50.     {
  51.         if ('\n' == ch)
  52.         {
  53.             len++;
  54.         }
  55.     }
  56.     // 让文件流回到开头
  57.     fseek(fp, 0, SEEK_SET);
  58.     // 读取文件到顺序表
  59.     stu_user s1;
  60.     for (size_t i = 0; i < len; i++)
  61.     {
  62.         fscanf(fp, "%s\t%s\t%s\t%s\t%d\t%d\t%d\n",
  63.                s1.user_name, s1.password,
  64.                s1.name, s1.sex, &s1.id,
  65.                &s1.age, &s1.soc);
  66.         // 插入到表中
  67.         list_add(L, s1);
  68.     }
  69.     // 关闭文件
  70.     fclose(fp);
  71. }
复制代码
 2. list.c

  1. #include "list.h"
  2. /********************************** 登录 **********************************/
  3. // 学生登录
  4. bool Student_log_in(list_str *L, int *index)
  5. {
  6.     printf("欢迎来到学生登录界面\n");
  7.     // 声明两个字符串
  8.     char user[128];
  9.     char pass[128];
  10.     while (1)
  11.     {
  12.         // 清空字符串
  13.         memset(user, 0, sizeof(user));
  14.         memset(pass, 0, sizeof(pass));
  15.         // 用户输入
  16.         printf("请输入账号:");
  17.         scanf("%s", user);
  18.         printf("请输入密码:");
  19.         scanf("%s", pass);
  20.         // 循环判定
  21.         for (size_t i = 0; i < L->len; i++)
  22.         {
  23.             if (!strcmp(user, L->data[i].user_name))
  24.             {
  25.                 if (!strcmp(pass, L->data[i].password))
  26.                 {
  27.                     *index = i;
  28.                     return true;
  29.                 }
  30.             }
  31.         }
  32.         printf("登录失败,请重新登录!\n");
  33.     }
  34. }
  35. // 老师登录
  36. bool Teacher_log_in(list_str *L)
  37. {
  38.     system("clear");
  39.     printf("欢迎来到老师登录界面\n");
  40.     // 声明两个字符串
  41.     char user[128];
  42.     char pass[128];
  43.     while (1)
  44.     {
  45.         // 清空字符串
  46.         memset(user, 0, sizeof(user));
  47.         memset(pass, 0, sizeof(pass));
  48.         // 用户输入
  49.         printf("请输入账号:");
  50.         scanf("%s", user);
  51.         printf("请输入密码:");
  52.         scanf("%s", pass);
  53.         // 循环判定
  54.         for (size_t i = 0; i < L->len; i++)
  55.         {
  56.             if (!strcmp(user, L->data[i].user_name))
  57.             {
  58.                 if (!strcmp(pass, L->data[i].password))
  59.                 {
  60.                     return true;
  61.                 }
  62.             }
  63.         }
  64.         printf("登录失败,请重新登录!\n");
  65.     }
  66. }
  67. // 初始化
  68. void list_init(list_str **L)
  69. {
  70.     // 创建动态内存
  71.     (*L) = (list_str *)malloc(sizeof(list_str));
  72.     if (NULL == (*L))
  73.     {
  74.         printf("创建失败\n");
  75.         exit(-1);
  76.     }
  77.     // 初始化数据
  78.     (*L)->len = 0;
  79.     return;
  80. }
  81. // 增
  82. bool list_add(list_str *L, stu_user data)
  83. {
  84.     // 判定是否为空
  85.     if (NULL == L)
  86.     {
  87.         printf("传入顺序表为空\n");
  88.         exit(-1);
  89.     }
  90.     // 是否越界
  91.     if (MAX_LEN <= L->len)
  92.     {
  93.         printf("学生已经满了\n");
  94.         return false;
  95.     }
  96.     // 插入操作
  97.     L->data[L->len] = data;
  98.     // 迭代长度
  99.     L->len++;
  100. }
  101. // 增 从终端输入
  102. bool list_add_in(list_str *L)
  103. {
  104.     system("clear");
  105.     list_printf(L);
  106.     // 判定是否为空
  107.     if (NULL == L)
  108.     {
  109.         printf("传入顺序表为空\n");
  110.         exit(-1);
  111.     }
  112.     // 是否越界
  113.     if (MAX_LEN <= L->len)
  114.     {
  115.         printf("学生已经满了\n");
  116.         return false;
  117.     }
  118.     stu_user newStudent;
  119.     char name[128];
  120.     char sex[5];
  121.     int flag = 0;
  122.     printf("请输入你要添加学生的信息:\n");
  123.     printf("姓名:");
  124.     scanf("%s", newStudent.name);
  125.     printf("性别:");
  126.     scanf("%s", newStudent.sex);
  127.     while (1)
  128.     {
  129.         int add_id;
  130.         printf("id:");
  131.         scanf("%d", &add_id);
  132.         for (int i = 0; i < L->len; i++)
  133.         {
  134.             if (add_id == L->data[i].id)
  135.             {
  136.                 flag = 1;
  137.                 break;
  138.             }
  139.         }
  140.         if (1 == flag)
  141.         {
  142.             printf("你输入的id已重复,请重新输入");
  143.         }
  144.     }
  145.     printf("年龄:");
  146.     scanf("%d", &newStudent.age);
  147.     printf("成绩:");
  148.     scanf("%d", &newStudent.soc);
  149.     printf("密码:");
  150.     scanf("%s", newStudent.password);
  151.     strcpy(newStudent.user_name, newStudent.name);
  152.     // 插入操作
  153.     L->data[L->len] = newStudent;
  154.     // 迭代长度
  155.     L->len++;
  156.     printf("添加成功!\n");
  157.     list_printf(L);
  158. }
  159. // 尾删
  160. bool list_del(list_str *L)
  161. {
  162.     system("clear");
  163.     // 判定是否为空
  164.     if (NULL == L)
  165.     {
  166.         printf("传入顺序表为空\n");
  167.         exit(-1);
  168.     }
  169.     // 是否没有学生了
  170.     if (-1 >= L->len)
  171.     {
  172.         printf("学生已经满了\n");
  173.         return false;
  174.     }
  175.     // 删除尾部学生
  176.     L->len--;
  177.     printf("删除成功!\n");
  178.     list_printf(L);
  179. }
  180. // 老师改  姓名....
  181. bool list_Teacher_alter(list_str *L)
  182. {
  183.     int op;
  184.     char user_name[128]; // 账号
  185.     char password[128];  // 密码
  186.     char name[128];      // 学生姓名
  187.     char sex[5];         // 学生性别
  188.     int find_id;         // 查找学生id
  189.     int age;             // 学生年龄
  190.     int soc;             // 学生成绩
  191.     system("clear");
  192.     list_printf(L);
  193.     printf("请输入你要修改的id:");
  194.     scanf("%d", &find_id);
  195.     printf("请输入你要修改的信息:\n");
  196.     printf("1.账号\n2.密码\n3.姓名\n4.性别\n5.年龄\n6.成绩\n7.退出修改\n");
  197.     while (1)
  198.     {
  199.         scanf("%d", &op);
  200.         switch (op)
  201.         {
  202.         case 1:
  203.             scanf("%s", L->data[find_id].user_name);
  204.             break;
  205.         case 2:
  206.             scanf("%s", L->data[find_id].user_name);
  207.             break;
  208.         case 3:
  209.             scanf("%s", L->data[find_id].name);
  210.             break;
  211.         case 4:
  212.             scanf("%s", L->data[find_id].sex);
  213.             break;
  214.         case 5:
  215.             scanf("%d", &L->data[find_id].age);
  216.             break;
  217.         case 6:
  218.             scanf("%d", &L->data[find_id].soc);
  219.             break;
  220.         default:
  221.             break;
  222.         }
  223.         printf("是否继续修改,是输入1,否输入0\n");
  224.         scanf("%d", &op);
  225.         if (0 == op)
  226.             break;
  227.     }
  228.     printf("账号\t密码\t姓名\t性别\tid\t年龄\t成绩\n");
  229.     printf("%s\t%s\t%s\t%s\t%d\t%d\t%d\n",
  230.            L->data[find_id].user_name, L->data[find_id].password,
  231.            L->data[find_id].name, L->data[find_id].sex, L->data[find_id].id,
  232.            L->data[find_id].age, L->data[find_id].soc);
  233.     printf("修改成功!\n");
  234. }
  235. // 老师查
  236. bool list_Teacher_find(list_str *L)
  237. {
  238.     system("clear");
  239.     int find_id;
  240.     printf("请输入你要查找的id:");
  241.     scanf("%d", &find_id);
  242.     printf("账号\t密码\t姓名\t性别\tid\t年龄\t成绩\n");
  243.     printf("%s\t%s\t%s\t%s\t%d\t%d\t%d\n",
  244.            L->data[find_id].user_name, L->data[find_id].password,
  245.            L->data[find_id].name,L->data[find_id].sex, L->data[find_id].id,
  246.            L->data[find_id].age, L->data[find_id].soc);
  247.     printf("查找成功!\n");
  248. }
  249. // 学生查  查自己
  250. bool list_Student_find(list_str *L, stu_user data)
  251. {
  252.     system("clear");
  253.     printf("账号\t密码\t姓名\t性别\tid\t年龄\t成绩\n");
  254.     printf("%s\t%s\t%s\t%s\t%d\t%d\t%d\n",
  255.         data.user_name, data.password,data.name, data.name, data.id,data.age, data.soc);
  256.     printf("查找成功!\n");
  257. }
  258. // 成绩排序
  259. bool list_sort(list_str *L)
  260. {
  261.     for (int i = 0; i < L->len; i++)
  262.     {
  263.         for (int j = 0; j < j - i - 1; i++)
  264.         {
  265.             if (L->data[j].soc > L->data[j + 1].soc)
  266.             {
  267.                 int t = L->data[j].soc;
  268.                 L->data[j].soc = L->data[j + 1].soc;
  269.                 L->data[j + 1].soc = t;
  270.             }
  271.         }
  272.     }
  273. }
  274. // 遍历程序
  275. void list_printf(list_str *L)
  276. {
  277.     if (NULL == L)
  278.     {
  279.         printf("传入顺序表为空\n");
  280.         exit(-1);
  281.     }
  282.     printf("账号\t密码\t姓名\t性别\tid\t年龄\t成绩\n");
  283.     for (size_t i = 0; i < L->len; i++)
  284.     {
  285.         printf("%s\t%s\t%s\t%s\t%d\t%d\t%d\n",
  286.                L->data[i].user_name, L->data[i].password,
  287.                L->data[i].name, L->data[i].sex, L->data[i].id,
  288.                L->data[i].age, L->data[i].soc);
  289.     }
  290. }
  291. // 释放顺序表
  292. void list_free(list_str **L)
  293. {
  294.     if (NULL == (*L))
  295.     {
  296.         printf("传入顺序表为空\n");
  297.         exit(-1);
  298.     }
  299.     free(*L);
  300.     *L = NULL;
  301. }
  302. // 九九乘法表
  303. void nine_nine()
  304. {
  305.     system("clear");
  306.     for (int i = 1; i <= 9; i++)
  307.     {
  308.         for (int j = 1; j <= i; j++)
  309.         {
  310.             printf("%d * %d = %d\t", j, i, j * i);
  311.         }
  312.         printf("\n");
  313.     }
  314. }
  315. // 清屏
  316. void clean_screen()
  317. {
  318.     system("clear");
  319. }
  320. // 猜数字
  321. void guess_num()
  322. {
  323.     system("clear");
  324.     int val;
  325.     val = (time(NULL)) % 100;
  326.     int max_val = 99;
  327.     int min_val = 0;
  328.     int data;
  329.     while (1)
  330.     {
  331.         printf("请输入你要猜的数:");
  332.         scanf("%d", &data);
  333.         if (data > val)
  334.         {
  335.             if (data > max_val)
  336.             {
  337.                 printf("输入数据违规,请输入数据:%d ~ %d\n", min_val, max_val);
  338.             }
  339.             else
  340.             {
  341.                 max_val = data;
  342.                 printf("输入数据大了,请输入数据:%d ~ %d\n", min_val, max_val);
  343.             }
  344.         }
  345.         if (data < val)
  346.         {
  347.             if (data < min_val)
  348.             {
  349.                 printf("输入数据违规,请输入数据:%d ~ %d\n", min_val, max_val);
  350.             }
  351.             else
  352.             {
  353.                 min_val = data;
  354.                 printf("输入数据小了,请输入数据:%d ~ %d\n", min_val, max_val);
  355.             }
  356.         }
  357.         if (data == val)
  358.         {
  359.             printf("恭喜你!!!猜对了\n");
  360.             break;
  361.         }
  362.     }
  363. }
  364. // 计算器
  365. // 加
  366. int add(int data1, int data2)
  367. {
  368.     return data1 + data2;
  369. }
  370. // 减
  371. int subtract(int data1, int data2)
  372. {
  373.     return data1 - data2;
  374. }
  375. // 乘
  376. int multiply(int data1, int data2)
  377. {
  378.     return data1 * data2;
  379. }
  380. // 除
  381. int divide(int data1, int data2)
  382. {
  383.     return data1 / data2;
  384. }
  385. // 回调函数
  386. typedef int (*count_func)(int, int);
  387. void counter()
  388. {
  389.     system("clear");
  390.     count_func func[4];
  391.     func[0] = add;
  392.     func[1] = subtract;
  393.     func[2] = multiply;
  394.     func[3] = divide;
  395.     int data1, data2;
  396.     char ch;
  397.     printf("请输入你要输入的算式:\n");
  398.     scanf("%d %c %d", &data1, &ch, &data2);
  399.     switch (ch)
  400.     {
  401.     case '+':
  402.         printf("%d %c %d = %d\n", data1, ch, data2, func[0](data1, data2));
  403.         break;
  404.     case '-':
  405.         printf("%d %c %d = %d\n", data1, ch, data2, func[1](data1, data2));
  406.         break;
  407.     case '*':
  408.         printf("%d %c %d = %d\n", data1, ch, data2, func[2](data1, data2));
  409.         break;
  410.     case '/':
  411.         printf("%d %c %d = %d\n", data1, ch, data2, func[3](data1, data2));
  412.         break;
  413.     default:
  414.         break;
  415.     }
  416. }
复制代码
 3. main.c

  1. #include "main.h"
  2. // 学生功能函数
  3. // 学生登录
  4. void Student_Func(list_str *list)
  5. {
  6.     // 登录
  7.     int user_index = 0;
  8.     clean_screen();
  9.     if (!Student_log_in(list, &user_index))
  10.     {
  11.         printf("登录失败\n");
  12.         exit(-1);
  13.     }
  14.     printf("恭喜你 登录成功\n");
  15.     int op = 0; // 菜单选型
  16.     while (1)
  17.     {
  18.         // 写一个菜单
  19.         printf("1、查成绩\n");
  20.         printf("2、乘法表\n");
  21.         printf("3、猜数字\n");
  22.         printf("4、计算器\n");
  23.         scanf("%d", &op);
  24.         switch (op)
  25.         {
  26.         case 1:
  27.             /* 1、查成绩 */
  28.             list_Student_find(list, list->data[user_index]);
  29.             break;
  30.         case 2:
  31.             /* 2、乘法表 */
  32.             nine_nine();
  33.             break;
  34.         case 3:
  35.             /* 3、猜数字 */
  36.             guess_num();
  37.             break;
  38.         case 4:
  39.             /* 4、计算器 */
  40.             counter();
  41.             break;
  42.         default:
  43.             break;
  44.         }
  45.     }
  46.     // 销毁顺序表
  47. }
  48. // 老师登录
  49. void Teacher_Func(list_str *list)
  50. {
  51.     // 登录
  52.     if (!Teacher_log_in(list))
  53.     {
  54.         printf("登录失败\n");
  55.         exit(-1);
  56.     }
  57.     clean_screen();
  58.     printf("恭喜你 登录成功\n");
  59.     int op = 0; // 菜单选型
  60.     while (1)
  61.     {
  62.         // 写一个菜单
  63.         printf("1、增加学生\n");
  64.         printf("2、删除学生\n");
  65.         printf("3、成绩排序\n");
  66.         printf("4、修改学生\n");
  67.         scanf("%d", &op);
  68.         switch (op)
  69.         {
  70.         case 1:
  71.             /* 1、增加学生 */
  72.             // 1. 写一个函数 从 终端获取学生信息
  73.             // 2. 插入
  74.             list_add_in(list);
  75.             break;
  76.         case 2:
  77.             /* 2、删除学生 */
  78.             list_del(list);
  79.             break;
  80.         case 3:
  81.             /* 3、成绩排序 */
  82.             list_sort(list);
  83.             break;
  84.         case 4:
  85.             /* 4、修改学生 */
  86.             list_Teacher_alter(list);
  87.             break;
  88.         default:
  89.             break;
  90.         }
  91.     }
  92.     // 销毁顺序表
  93.     list_free(&list);
  94. }
  95. int main(int argc, char const *argv[])
  96. {
  97.     // 1 数据初始化 从文件中读取数据到表
  98.     // 1.1 创建表
  99.     list_str *list;
  100.     list_init(&list);
  101.     // 1.2 从文件中读取数据到表
  102.     file_updata_list(list);
  103.     // 2 选择 老师 或 学生登录
  104.     int op = 0;
  105.     clean_screen();
  106.     printf("1、学生登录 2、老师登录\n");
  107.     scanf("%d", &op);
  108.     switch (op)
  109.     {
  110.     case 1: // 学生登录
  111.         Student_Func(list);
  112.         break;
  113.     case 2: // 老师登录
  114.         Teacher_Func(list);
  115.         break;
  116.     default:
  117.         break;
  118.     }
  119.     return 0;
  120. }
复制代码
五、Makefile
  1. Src = ./Src/main.c ./Src/file.c ./Src/list.c
  2. # 编译选项
  3. CFLAGS = -g -I./Inc
  4. Pro:$(Src)
  5.         gcc $(CFLAGS) $(Src) -o Pro
复制代码
 

 总体来说照旧比较简朴的,只是要注意多文件的结构和关系。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

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

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

tsx81429

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表