分享

C语言

 吴敬锐 2022-11-29 发布于广东

本系统分成了三个文件,main.c student.c student.h

功能:

实现对班级成员的增加、删除、修改、遍历、根据成绩排序。

增加 会检查,现在班级已有的人数,班级是否已满(没有学号重复检测)

删除(根据学号查询-->删除) 会判断 班级中是否存在这个学生

修改(根据学号查询) 可以修改学生的其他信息(除学号外),也有检测该班级中是否存在该学生ID的功能函数

遍历 会判断该班级中是否有学生,没有学生 会做出提示

排序 根据成绩,由高到低,本系统使用的是冒泡排序

注:没有调用数据库,所有的数据都是存在内存里

---代码中有详细注释---

main.c功能

主要包含文件的整体逻辑(子函数的调用),主要的逻辑代码

student.c功能

是子函数的功能实现的执行代码

student.h功能

是函数的所有的头文件,以及结构体的定义

代码

main.c

  1. #include './student.h'
  2. int main(int argc, const char *argv[])
  3. {
  4. //使用结构体之前需要定义一个结构体类型的变量
  5. class_t my_class;//定义一个班级的结构体变量
  6. my_class.count = 0;//初始化班级人数
  7. int choose = 0;
  8. //循环等待客户操作
  9. while(1){
  10. //打印主菜单
  11. print_menu();
  12. printf('>>');
  13. scanf('%d',&choose);
  14. switch(choose){
  15. case 1://插入学生
  16. insert_student(&my_class);
  17. break;
  18. case 2://遍历学生
  19. print_student(&my_class);
  20. break;
  21. case 3://修改学生信息(没有学号)
  22. xiugai_student(&my_class);
  23. break;
  24. case 4://删除学生
  25. rm_student(&my_class);
  26. break;
  27. case 5://根据成绩排序
  28. PX_student(&my_class);
  29. break;
  30. case 6://退出系统
  31. exit(0);
  32. break;
  33. default:
  34. printf('输入错误,请重新输入\n');
  35. break;
  36. }
  37. }
  38. return 0;
  39. }

student.c

  1. #include './student.h'
  2. void print_menu(){
  3. printf('-------------------------------------------------\n');
  4. printf(' 学生管理系统 \n');
  5. printf('-------------------------------------------------\n');
  6. printf('| 1.添加学员 2.遍历学员信息 3.修改学员信息 |\n');
  7. printf('| 4.删除学员 5.根据成绩降序排序 6.退出程序 |\n');
  8. printf('-------------------------------------------------\n');
  9. }
  10. //添加学员信息的函数
  11. int insert_student(class_t *p_class){//主函数传输参数,接收,由于传输的是指针变量,需要定义一个同类型的指针接收
  12. //指针的非空检查 否则操作空指针会有段错误
  13. if(NULL == p_class){
  14. printf('入参指针为空,请检查\n');
  15. exit(-1);
  16. }
  17. if(40 == p_class->count)
  18. {
  19. printf('班级人数已满,无法插入\n');
  20. return 0;
  21. }
  22. printf('请输入学员信息 :姓名 年龄 学号 成绩\n');
  23. scanf('%s%d%d%d',
  24. p_class->stu[p_class->count].name,
  25. &(p_class->stu[p_class->count].age),
  26. &(p_class->stu[p_class->count].id),
  27. &(p_class->stu[p_class->count].score));
  28. //信息写入到指针对应的结构体的 数组 的 新的位置(count位置)
  29. //添加完学生后,班级人数加加
  30. p_class->count++;
  31. }
  32. //输出所有学员信息的函数
  33. int print_student(class_t *p_class){
  34. //判断 非空检查
  35. if(NULL == p_class){
  36. printf('入参指针为空,请检查\n');
  37. exit(-1);
  38. }
  39. if(0 == p_class->count)
  40. {
  41. printf('没有学生,无法遍历\n');
  42. return 0;
  43. }else{
  44. int i = 0;
  45. //循环遍历输出,该指针指向的结构体的数组的 第i个成员
  46. for(i = 0; i < p_class->count; i++){
  47. printf('%s %d %d %d \n',
  48. p_class->stu[i].name,
  49. p_class->stu[i].age,
  50. p_class->stu[i].id,
  51. p_class->stu[i].score);
  52. }
  53. }
  54. }
  55. //修改学生信息
  56. int xiugai_student(class_t *p_class)
  57. {
  58. //非空检查
  59. if(NULL == p_class)
  60. {
  61. printf('修改,传入指针错误\n');
  62. exit(-1);
  63. }
  64. printf('请输入要修改的学生的学号>>');
  65. int num = 0;
  66. int i = 0;
  67. scanf('%d',&num);//接收对应的学号
  68. //循环遍历学号所对应的下标
  69. for(i=0;i<p_class->count;i++)
  70. {
  71. if(num == p_class->stu[i].id)
  72. {//如果找到,说明该学生存在
  73. printf('---该学生存在---\n');
  74. break;
  75. }
  76. }
  77. if(i == p_class->count)
  78. {
  79. printf('----该学生不存在----\n');
  80. return 0;
  81. }
  82. printf('请输入该学生新的信息:姓名 年龄 成绩\n');
  83. scanf('%s%d%d',
  84. p_class->stu[i].name,
  85. &(p_class->stu[i].age),
  86. &(p_class->stu[i].score));
  87. printf('修改成功\n');
  88. return 0;
  89. }
  90. //删除成员
  91. int rm_student(class_t *p_class)
  92. {
  93. //非空检查
  94. if(NULL == p_class)
  95. {
  96. printf('删除传入指针错误\n');
  97. exit(-1);
  98. }
  99. int num = 0;
  100. int i = 0;
  101. int n=0;//定义一个标识
  102. printf('请输入要删除的学生的学号>>');
  103. scanf('%d',&num);
  104. //循环遍历找到该学生的学号,对应的数组的下标
  105. for(i=0;i<p_class->count;i++)
  106. {
  107. if(num == p_class->stu[i].id)
  108. {
  109. n=1;//标识
  110. printf('--该学生存在--正在删除---\n');
  111. break;
  112. }
  113. }//此时i里存的数据就是 对应学号的学生的 数组的下标
  114. if(n == 1)
  115. {
  116. //从这一位开始,由后往前,逐个赋值---覆盖
  117. for(i;i<p_class->count;i++)
  118. {
  119. p_class->stu[i] = p_class->stu[i+1];
  120. }
  121. //删除完成后,班级人数减减
  122. p_class->count--;
  123. printf('删除成功\n');
  124. }else{
  125. printf('----该学生不存在----\n');
  126. return -1;
  127. }
  128. return 0;
  129. }
  130. //排序
  131. int PX_student(class_t *p_class)
  132. {
  133. int i = 0;
  134. int j = 0;
  135. //定义一个跟学生结构体 相同类型的变量,用来充当 交换数据的桶
  136. student_t temp;
  137. printf('降序排列\n');
  138. //冒泡排序
  139. //根据成绩,交换数组中的两个 学生结构体
  140. for(i=0;i<p_class->count;i++)
  141. {
  142. for(j=0;j<p_class->count-i-1;j++)
  143. {
  144. if(p_class->stu[j].score < p_class->stu[j+1].score)
  145. {
  146. temp = p_class->stu[j];
  147. p_class->stu[j] = p_class->stu[j+1];
  148. p_class->stu[j+1] = temp;
  149. }
  150. }
  151. }
  152. printf('排序完成\n');
  153. return 0;
  154. }

注:自己调整 菜单格式

student.h

  1. #ifndef STUDENT_H
  2. #define STUDENT_H
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. //定义学生结构体,typedef重命名,命名成student_t
  6. typedef struct Student{
  7. char name[32];
  8. int age;
  9. int id;
  10. int score;
  11. }student_t;
  12. //定义班级结构体,typedef重命名,class_t
  13. //该结构体 调用学生结构体,生成对应的结构体数组
  14. typedef struct Class{
  15. student_t stu[40];//学生成员结构体
  16. int count;//班级人数
  17. }class_t;
  18. //原型声明
  19. //注意:原型声明 传参位置需要加参数类型
  20. void print_menu();
  21. //传过来的是&my_class(班级的结构体指针) 需要用 班级的结构体指针 进行接收
  22. int insert_student(class_t*);
  23. int print_student(class_t*);
  24. int rm_student(class_t*);
  25. int xiugai_student(class_t*);
  26. int PX_student(class_t*);
  27. #endif

编译:执行

本系统用Ubuntu编写,gcc编译

把三个文件放一个目录下,

gcc main.c student.c

 生成对应的a.out 可执行文件

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约