0


基于C语言的Linux学生管理系统设计课程设计

一、课程设计的内容

课程设计题目:《学生管理系统设计》

在现今信息时代,生活速度的加快,使得人们越来越向信息化、智能化、数字化方向开展, 学生信息管理系统是一个由人、计算机等组成的能进展信息的收集、传递、储存、加工、维护和使用的系统 ,必然能代替过去大量、繁杂的手工操作。

通过本课程设计,运用Linux相关数据构造方法,使用数组和应用。

二、功能描述

构建一个学生管理系统,包含以下信息:

1、输入学生信息,包括学号、姓名、班级

2、输入学生成绩(包括语文、数学、英语),并计算学生成绩的总分和平均分

3、按照总分进展排序

4、查询学生信息

5、修改学生信息

6、增加学生信息

7、删除学生信息

8、退出系统

并且有一个清晰的界面来调用各个功能。

三、概要设计

学生管理系统

├── 输入学生信息

│ └── addStudent()

├── 按总分排序和输出学生信息

│ └── sortAndPrintStudents()

├── 查询学生信息

│ └── searchStudent()

├── 修改学生信息

│ └── modifyStudent()

├── 删除学生信息

│ └── deleteStudent()

└── 退出系统

创新功能:制作了编译所用到的makefile文件

四、详细设计

代码整体分为四个模块,分别为输入学生信息模块、查询学生信息模块、修改学生信息模块和删除学生信息模块。同时还制作了Makefile文件,使用Makefile可以提高开发效率,简化编译过程,便于管理和协作。

1、输入学生信息模块:这个模块实现了输入学生信息的功能。

①实现过程:

定义了一个名为addStudent()的函数,用于向学生数组中添加新的学生信息。

函数首先检查当前学生数量numStudents是否已达到最大学生数量MAX_STUDENTS。如果达到最大数量,函数会打印一条提示信息,并立即返回,无法添加更多的学生。

如果当前学生数量还未达到最大数量,则会创建一个名为 newStudent的临时Student结构体变量,用于存储新学生的信息。

然后,函数会通过输入让用户逐个输入学生的学号、姓名、班级以及语文、数学、英语的成绩,并将输入的值存储到newStudent的相应成员变量中。

接下来,函数会根据语文、数学、英语成绩计算学生的总分 totalScore,并计算平均分averageScore。

随后,函数将newStudent存储到学生数组students的下一个位置,然后通过递增 numStudents,维护已添加学生的数量。

如果输入的学号,与先前输入的学号一致,显示输入学号重复。

最后,函数会打印一条提示信息,表示学生信息添加成功。

这个函数的作用是添加新的学生信息到数组中,扩充学生信息的存储,并更新学生数量。

②算法描述:

③所用到的数据结构:使用结构体来表示学生的信息并存储在一个数组中。

2、查询学生信息模块:这个模块实现了查询学生信息的功能。

①实现过程:

定义了一个名为 searchStudent() 的函数,用于查询学生信息。函数首先会要求用户选择查询方式,可以通过学号查询或者通过姓名查询。

根据用户的选择,函数使用 switch 语句来执行相应的查询逻辑。

若用户选择1,表示通过学号查询。函数会要求用户输入要查询的学生学号,然后使用一个循环遍历学生数组,查找与输入学号匹配的学生。如果找到匹配的学生,会将其信息打印出来,并将 found 标志设置为1,表示找到了匹配的学生。

若用户选择2,表示通过姓名查询。函数会要求用户输入要查询的学生姓名,然后使用一个循环遍历学生数组,通过strcmp()函数将输入的姓名与学生数组中的姓名进行比较,找到匹配的学生。如果找到匹配的学生,会将其信息打印出来,并将 found 标志设置为1。

若用户选择3,表示退出查询,此时直接跳出 switch 语句。

若用户选择其他选项,则打印出无效选择的提示。

最后,根据 found 标志的值,判断是否找到了匹配的学生信息。如果没有找到,则打印出相应的提示信息。

②算法描述:

③所用到的数据结构:使用结构体数组来存储学生信息。

3、修改学生信息模块:这个模块实现了修改学生信息的功能。

①实现过程:

定义了一个名为modifyStudent()的函数,用于修改学生信息。函数首先会要求用户输入要修改的学生学号,然后使用一个循环遍历学生数组,查找与输入学号匹配的学生。

如果找到匹配的学生,会将found标志设置为1,表示找到了匹配的学生。然后,函数会要求用户输入要修改后的学生姓名、班级以及语文、数学和英语成绩。这些输入会直接修改对应学生结构体中的字段值。修改后会通过计算重新计算学生的总分和平均分,并将修改成功的提示打印出来。

如果没有找到匹配的学生,会通过判断 found 标志的值为0来输出未找到匹配的学生信息的提示。

②算法描述:

③所用到的数据结构:可以使用结构体数组来存储学生信息。

4、删除学生信息模块:这个模块实现了删除学生信息的功能。

①实现过程:

定义了一个名为deleteStudent()的函数,用于删除学生信息。函数首先会要求用户输入要删除的学生学号,然后使用一个循环遍历学生数组,查找与输入学号匹配的学生。

如果找到匹配的学生,将会通过循环将其后面的学生信息向前移动,以覆盖要删除的学生信息。然后,将学生数量numStudents减一,表示删除了一个学生。最后,输出学生信息删除成功的提示。

如果没有找到匹配的学生,会通过判断 found 标志的值为 0 来输出未找到匹配的学生信息的提示。

②算法描述:

③所用到的数据结构:可以使用结构体数组来存储学生信息。

5、Makefile文件:使用Makefile可以提高开发效率,简化编译过程,便于管理和协作。

①实现过程:

Makefile文件,用于编译和链接C语言源代码以生成可执行文件。以下是对Makefile的逐行解释:

sms: sms.o:这一行定义了一个规则,指定如何生成名为"sms"的可执行文件。在这个规则中,"sms"依赖于"sms.o"这个目标文件。

gcc sms.o -o sms:这是上一行规则的命令部分,使用GCC编译器将"sms.o"链接为名为"sms"的可执行文件。

sms.o: sms.c:这一行定义了另一个规则,指定如何生成名为"sms.o"的目标文件。在这个规则中,"sms.o"依赖于"sms.c"这个源文件。

gcc -c sms.c -o sms.o -std=c99:这是上一行规则的命令部分,使用GCC编译器将"sms.c"编译为名为"sms.o"的目标文件。-c选项表示只编译,不链接。-std=c99选项指定使用C99标准。

clean::这一行定义了一个名为"clean"的伪目标,用于执行清理操作。

rm -f sms:这是上一行规则的命令部分,使用rm命令删除名为"sms"的可执行文件。-f选项表示强制删除,即使文件不存在也不会报错。

rm -f *.o:这是上一行规则的另一个命令,使用rm命令删除所有扩展名为".o"的目标文件。这也是一个清理操作,用于清除编译过程中生成的目标文件。

总体来说,这个Makefile文件包含了两个规则:一个用于编译和链接源代码生成可执行文件,另一个用于清理生成的可执行文件和目标文件。可以通过在终端中运行make命令来执行Makefile中的规则,生成可执行文件。运行make clean命令可以执行清理操作。

②主要源代码:

  1. sms:sms.o
  2. gcc sms.o -o sms
  3. sms.o:sms.c
  4. gcc -c sms.c -o sms.o -std=c99
  5. clean:
  6. rm -f sms
  7. rm -f *.o

五、测试结果

1、使用makefile文件,对文档进行编译。

2、生成可执行文件。

3、运行可执行文件。

4、添加三名学生的信息。

5、如果输入的学号信息相同,显示输入的学号重复。

6、按照总成绩从高分到低分输出学生信息。

7、按照学号和姓名查询两种方式查询学生信息。

8、修改其中一位学生信息。

9、删除其中一位学生信息。

10、输出学生信息,验证是否成功。

11、退出系统。

12、使用make clean指令,删除可执行文件。

六、代码

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define MAX_STUDENTS 1000
  5. struct Student {
  6. long int id;
  7. char name[200];
  8. char class[200];
  9. int scores[3];
  10. int totalScore;
  11. float averageScore;
  12. };
  13. struct Student students[MAX_STUDENTS];
  14. int numStudents = 0;
  15. int isStudentIdDuplicate(long id) {
  16. for (int i = 0; i < numStudents; i++) {
  17. if (students[i].id == id) {
  18. return 1;
  19. }
  20. }
  21. return 0;
  22. }
  23. void addStudent() {
  24. if (numStudents >= MAX_STUDENTS) {
  25. printf("已达到最大学生数量,无法添加更多学生。\n");
  26. return;
  27. }
  28. struct Student newStudent;
  29. printf("请输入学生学号:");
  30. scanf("%ld", &newStudent.id);
  31. if (isStudentIdDuplicate(newStudent.id)) {
  32. printf("学号输入重复,请重新输入。\n");
  33. return;
  34. }
  35. printf("请输入学生姓名:");
  36. scanf("%s", newStudent.name);
  37. printf("请输入学生班级:");
  38. scanf("%s", newStudent.class);
  39. printf("请输入学生语文成绩:");
  40. scanf("%d", &newStudent.scores[0]);
  41. printf("请输入学生数学成绩:");
  42. scanf("%d", &newStudent.scores[1]);
  43. printf("请输入学生英语成绩:");
  44. scanf("%d", &newStudent.scores[2]);
  45. newStudent.totalScore = newStudent.scores[0] + newStudent.scores[1] + newStudent.scores[2];
  46. newStudent.averageScore = newStudent.totalScore / 3.0;
  47. students[numStudents] = newStudent;
  48. numStudents++;
  49. printf("学生信息添加成功。\n");
  50. }
  51. int compareStudents(const void *a, const void *b) {
  52. struct Student *studentA = (struct Student *)a;
  53. struct Student *studentB = (struct Student *)b;
  54. return studentB->totalScore - studentA->totalScore;
  55. }
  56. void sortAndPrintStudents() {
  57. qsort(students, numStudents, sizeof(struct Student), compareStudents);
  58. printf("按总分排序后的学生信息:\n");
  59. for (int i = 0; i < numStudents; i++) {
  60. struct Student *student = &students[i];
  61. printf("学号:%ld 姓名:%s 班级:%s 语文:%d 数学:%d 英语:%d 总分:%d 平均分:%.2f\n", student->id, student->name, student->class,student->scores[0], student->scores[1], student->scores[2], student->totalScore, student->averageScore);
  62. }
  63. }
  64. void searchStudent() {
  65. int choice;
  66. printf("请选择查询方式:\n");
  67. printf("1、通过学号查询\n");
  68. printf("2、通过姓名查询\n");
  69. printf("3、退出本次查询\n");
  70. printf("请选择:");
  71. scanf("%d", &choice);
  72. long int searchId;
  73. char searchName[200];
  74. int found = 0;
  75. switch (choice) {
  76. case 1:
  77. printf("请输入学生学号:");
  78. scanf("%ld", &searchId);
  79. for (int i = 0; i < numStudents; i++) {
  80. if (students[i].id == searchId) {
  81. struct Student *student = &students[i];
  82. printf("学号:%ld 姓名:%s 班级:%s 语文:%d 数学:%d 英语:%d 总分:%d 平均分:%.2f\n", student->id, student->name, student->class,student->scores[0], student->scores[1], student->scores[2], student->totalScore, student->averageScore);
  83. found = 1;
  84. break;
  85. }
  86. }
  87. break;
  88. case 2:
  89. printf("请输入学生姓名:");
  90. scanf("%s", searchName);
  91. for (int i = 0; i < numStudents; i++) {
  92. if (strcmp(students[i].name, searchName) == 0) {
  93. struct Student *student = &students[i];
  94. printf("学号:%ld 姓名:%s 班级:%s 语文:%d 数学:%d 英语:%d 总分:%d 平均分:%.2f\n", student->id, student->name, student->class,student->scores[0], student->scores[1], student->scores[2], student->totalScore, student->averageScore);
  95. found = 1;
  96. break;
  97. }
  98. }
  99. break;
  100. case 3:
  101. printf("未选择退出查询。\n");
  102. found = 1;
  103. break;
  104. default:
  105. printf("无效的选择。\n");
  106. }
  107. if (!found) {
  108. printf("未找到匹配的学生信息。\n");
  109. }
  110. }
  111. void modifyStudent() {
  112. long int modifyId;
  113. printf("请输入要修改的学生学号:");
  114. scanf("%ld", &modifyId);
  115. int found = 0;
  116. for (int i = 0; i < numStudents; i++) {
  117. if (students[i].id == modifyId) {
  118. struct Student *student = &students[i];
  119. printf("请输入修改后的学生姓名:");
  120. scanf("%s", student->name);
  121. printf("请输入修改后的学生班级:");
  122. scanf("%s", student->class);
  123. printf("请输入修改后的学生语文成绩:");
  124. scanf("%d", &student->scores[0]);
  125. printf("请输入修改后的学生数学成绩:");
  126. scanf("%d", &student->scores[1]);
  127. printf("请输入修改后的学生英语成绩:");
  128. scanf("%d", &student->scores[2]);
  129. student->totalScore = student->scores[0] + student->scores[1] + student->scores[2];
  130. student->averageScore = student->totalScore / 3.0;
  131. printf("学生信息修改成功。\n");
  132. found = 1;
  133. break;
  134. }
  135. }
  136. if (!found) {
  137. printf("未找到匹配的学生信息。\n");
  138. }
  139. }
  140. void deleteStudent() {
  141. long int deleteId;
  142. printf("请输入要删除的学生学号:");
  143. scanf("%ld", &deleteId);
  144. int found = 0;
  145. for (int i = 0; i < numStudents; i++) {
  146. if (students[i].id == deleteId) {
  147. for (int j = i; j < numStudents - 1; j++) {
  148. students[j] = students[j + 1];
  149. }
  150. numStudents--;
  151. printf("学生信息删除成功。\n");
  152. found = 1;
  153. break;
  154. }
  155. }
  156. if (!found) {
  157. printf("未找到匹配的学生信息。\n");
  158. }
  159. }
  160. int main() {
  161. int choice;
  162. while (1) {
  163. printf("----------------------\n");
  164. printf("学生管理系统\n");
  165. printf("1、输入学生信息\n");
  166. printf("2、按总分排序和输出学生信息\n");
  167. printf("3、查询学生信息\n");
  168. printf("4、修改学生信息\n");
  169. printf("5、删除学生信息\n");
  170. printf("6、退出系统\n");
  171. printf("----------------------\n");
  172. printf("请选择操作:");
  173. scanf("%d", &choice);
  174. switch (choice) {
  175. case 1:
  176. addStudent();
  177. break;
  178. case 2:
  179. sortAndPrintStudents();
  180. break;
  181. case 3:
  182. searchStudent();
  183. break;
  184. case 4:
  185. modifyStudent();
  186. break;
  187. case 5:
  188. deleteStudent();
  189. break;
  190. case 6:
  191. exit(0);
  192. default:
  193. printf("无效的选择。\n");
  194. }
  195. }
  196. return 0;
  197. }
标签: c语言 linux vim

本文转载自: https://blog.csdn.net/emo_dz/article/details/133814498
版权归原作者 SkyQi_奇崽 所有, 如有侵权,请联系我们删除。

“基于C语言的Linux学生管理系统设计课程设计”的评论:

还没有评论