🌟 嗨,我是LucianaiB!
🌍 总有人间一两风,填我十万八千梦。
🚀 路漫漫其修远兮,吾将上下而求索。
C语言之小型成绩管理系统
目录
- 设计题目
- 设计目的
- 设计任务描述
- 设计要求
- 输入和输出要求
- 验收要求
- 进度安排
- 系统分析
- 总体设计
- 详细设计
- 数据结构设计
- 函数列表及功能简介
- 程序实现
- 测试数据和运行结果
- 总结与思考
- 参考文献
- 附录代码
设计题目
C语言之小型成绩管理系统
设计目的
- 加深对C语言基础知识和基本理论的理解,培养学生独立分析和解决问题的能力。
- 培养学生在计算机软硬件开发、理论计算、查阅资料等方面的能力,树立正确的设计思想。
- 加强理论联系实际,培养学生科学严谨、实事求是的工作作风和创新精神。
设计任务描述
设计一个学生信息管理系统,能够实现以下功能:
- 添加学生信息:录入学生的姓名、学号和三门课程的成绩。
- 显示学生信息:显示所有已添加的学生信息。
- 按学号查找学生信息:根据学号搜索学生信息。
- 插入学生信息:在特定位置插入一个新的学生记录。
- 删除学生信息:根据学号删除一个学生记录。
- 按总分降序排序:按学生的总分降序排序学生记录。
- 退出系统:退出程序。
设计要求
- 按照分析、设计、编码、调试和测试的软件开发过程独立完成系统。
- 应用模块化编程思想,各项功能分别用函数实现。
- 系统功能设计成菜单形式,用户通过菜单选择操作。
- 系统界面友好、直观、易操作。
输入和输出要求
- 系统界面友好、直观、易操作。
- 用户根据提示输入数据。
- 输入数据时提供清晰的提示信息。
- 处理完成后,清楚地显示运行结果。
验收要求
- 运行所设计的系统。
- 回答有关问题。
- 提交课程设计报告。
- 提交源程序。
进度安排
- 系统分析、设计准备阶段:6学时。
- 编程调试阶段:26学时。
- 总结和书写报告阶段:6学时。
- 考核阶段:2学时。
系统分析
学生信息管理系统旨在简化学生信息的管理流程,提高管理效率,同时为用户提供便捷的操作体验。系统需要实现以下功能:
- 添加学生信息。
- 显示学生信息。
- 按学号查找学生信息。
- 插入学生信息。
- 删除学生信息。
- 按总分降序排序。
总体设计
系统采用模块化设计,主要模块包括:
- 学生信息管理模块:添加、显示、查找、插入和删除学生信息。
- 排序模块:按总分降序排序学生记录。
- 用户界面模块:提供友好的用户界面。
- 数据持久化模块:将数据存储到文件系统(可选)。
详细设计
数据结构设计
struct Student {
char name[50];
int id;
int grades[3];
};
函数列表及功能简介
-
addStudent()
:- 功能:添加一个新的学生记录到
students
数组中。 - 过程:提示用户输入学生的姓名、学号和三门课程的成绩,然后将这些信息存储在一个新的
Student
结构体中,并将其添加到数组的下一个空位。
- 功能:添加一个新的学生记录到
-
displayStudents()
:- 功能:显示所有已添加的学生信息。
- 过程:检查是否有学生记录,如果有,则遍历数组并打印每个学生的姓名、学号和成绩。
-
searchStudentById()
:- 功能:根据学号搜索学生信息。
- 过程:提示用户输入要搜索的学号,然后在数组中查找匹配的学生记录。如果找到,打印该学生的详细信息。
-
insertStudent()
:- 功能:在特定位置插入一个新的学生记录。
- 过程:首先提示用户输入要插入的学生的学号,然后找到合适的插入位置,接着提示用户输入新学生的详细信息,并将新学生记录插入到数组中。
-
deleteStudent()
:- 功能:根据学号删除一个学生记录。
- 过程:提示用户输入要删除的学号,找到对应的学生记录,然后从数组中删除该记录。
-
sortByTotalGrades()
:- 功能:按学生的总分降序排序学生记录。
- 过程:使用冒泡排序算法,根据每个学生的总分进行排序,然后打印排序后的学生信息。
-
swap(struct Student *a, struct Student *b)
:- 功能:交换两个
Student
结构体指针所指向的记录。 - 过程:使用一个临时变量来交换两个学生记录的内容。
- 功能:交换两个
-
calculateTotalGrades(struct Student student)
:- 功能:计算一个学生的总分。
- 过程:将一个学生的三门课程成绩相加并返回总分。
测试数据和运行结果
测试数据
-
添加学生信息:
请输入学生姓名: John Doe 请输入学生学号: 1001 请输入三门课程的成绩(用空格分隔): 85 90 78
-
显示学生信息:
所有学生信息如下: 姓名: John Doe, 学号: 1001, 成绩: 85 90 78
-
按学号查找学生信息:
请输入要查找的学生学号: 1001 学生姓名: John Doe, 学号: 1001, 成绩: 85 90 78
-
插入学生信息:
请输入要插入的学生学号: 1002 请输入学生姓名: Jane Smith 请输入三门课程的成绩(用空格分隔): 92 88 90
-
删除学生信息:
请输入要删除的学生学号: 1001 要删除的学生信息:姓名: John Doe, 学号: 1001, 成绩: 85 90 78 学生信息删除成功。
-
按总分降序排序:
按总分降序输出的学生信息: 姓名: Jane Smith, 学号: 1002, 总分: 270
总结与思考
优点
- 功能完善:系统涵盖了添加、显示、查找、插入、删除和排序等核心功能。
- 界面友好:系统提供了简洁直观的用户界面,操作方便。
- 模块化设计:代码结构清晰,便于维护和扩展。
改进方向
- 数据持久化:当前系统未实现数据持久化,建议将学生信息存储到文件中,以便程序重启后仍能读取数据。
- 错误处理:增加对用户输入的验证,避免非法输入导致程序异常。
- 更多功能:可以增加更多功能,如修改学生信息、统计平均分等。
参考文献
【排序算法】八大排序(下)(c语言实现)(附源码)-阿里云开发者社区
超详细之C语言实现学生信息管理系统(含文件读写)_c语言学生信息管理系统-CSDN博客
附录代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Student {
char name[50];
int id;
int grades[3];
};
struct Student students[100]; // 最多存储100个学生信息
int studentCount = 0;
void addStudent();
void displayStudents();
void searchStudentById();
void insertStudent();
void deleteStudent();
void sortByTotalGrades();
void swap(struct Student *a, struct Student *b);
int calculateTotalGrades(struct Student student);
int main() {
int choice;
do {
printf("\n学生信息管理系统菜单\n");
printf("1 添加学生信息\n");
printf("2 显示学生信息\n");
printf("3 按学号查找学生信息\n");
printf("4 插入一个学生信息\n");
printf("5 删除一个学生信息\n");
printf("6 按总分降序输出\n");
printf("7 退出\n");
printf("请选择操作:");
scanf("%d", &choice);
switch (choice) {
case 1:
addStudent();
break;
case 2:
displayStudents();
break;
case 3:
searchStudentById();
break;
case 4:
insertStudent();
break;
case 5:
deleteStudent();
break;
case 6:
sortByTotalGrades();
break;
case 7:
printf("退出程序。\n");
break;
default:
printf("无效选择,请重新输入。\n");
}
} while (choice != 7);
return 0;
}
void addStudent() {
struct Student newStudent;
printf("请输入学生姓名: ");
scanf("%s", newStudent.name);
printf("请输入学生学号: ");
scanf("%d", &newStudent.id);
printf("请输入三门课程的成绩(用空格分隔): ");
for (int i = 0; i < 3; i++) {
scanf("%d", &newStudent.grades[i]);
}
students[studentCount] = newStudent;
studentCount++;
printf("学生信息添加成功。\n");
}
void displayStudents() {
if (studentCount == 0) {
printf("暂无学生信息。\n");
return;
}
printf("所有学生信息如下:\n");
for (int i = 0; i < studentCount; i++) {
printf("姓名: %s, 学号: %d, 成绩: %d %d %d\n", students[i].name, students[i].id, students[i].grades[0], students[i].grades[1], students[i].grades[2]);
}
}
void searchStudentById() {
int searchId;
printf("请输入要查找的学生学号: ");
scanf("%d", &searchId);
for (int i = 0; i < studentCount; i++) {
if (students[i].id == searchId) {
printf("学生姓名: %s, 学号: %d, 成绩: %d %d %d\n", students[i].name, students[i].id, students[i].grades[0], students[i].grades[1], students[i].grades[2]);
return;
}
}
printf("未找到该学生。\n");
}
void insertStudent() {
struct Student newStudent;
int insertId;
printf("请输入要插入的学生学号: ");
scanf("%d", &insertId);
int insertIndex = 0;
while (insertIndex < studentCount && students[insertIndex].id < insertId) {
insertIndex++;
}
// 输入学生信息
printf("请输入学生姓名: ");
scanf("%s", newStudent.name);
newStudent.id = insertId;
printf("请输入三门课程的成绩(用空格分隔): ");
for (int i = 0; i < 3; i++) {
scanf("%d", &newStudent.grades[i]);
}
// 插入学生信息
for (int i = studentCount; i > insertIndex; i--) {
students[i] = students[i - 1];
}
students[insertIndex] = newStudent;
studentCount++;
printf("学生信息插入成功。\n");
}
void deleteStudent() {
int deleteId;
int deleteIndex = -1;
printf("请输入要删除的学生学号: ");
scanf("%d", &deleteId);
// 寻找要删除的学生
for (int i = 0; i < studentCount; i++) {
if (students[i].id == deleteId) {
deleteIndex = i;
break;
}
}
if (deleteIndex == -1) {
printf("未找到该学生。\n");
} else {
printf("要删除的学生信息:姓名: %s, 学号: %d, 成绩: %d %d %d\n", students[deleteIndex].name, students[deleteIndex].id, students[deleteIndex].grades[0], students[deleteIndex].grades[1], students[deleteIndex].grades[2]);
// 删除学生信息
for (int i = deleteIndex; i < studentCount - 1; i++) {
students[i] = students[i + 1];
}
studentCount--;
printf("学生信息删除成功。\n");
}
}
void sortByTotalGrades() {
// 使用冒泡排序
for (int i = 0; i < studentCount - 1; i++) {
for (int j = 0; j < studentCount - i - 1; j++) {
if (calculateTotalGrades(students[j]) < calculateTotalGrades(students[j + 1])) {
swap(&students[j], &students[j + 1]);
}
}
}
// 显示按总分降序排序后的学生信息
printf("按总分降序输出的学生信息:\n");
for (int i = 0; i < studentCount; i++) {
printf("姓名: %s, 学号: %d, 总分: %d\n", students[i].name, students[i].id, calculateTotalGrades(students[i]));
}
}
void swap(struct Student *a, struct Student *b) {
struct Student temp = *a;
*a = *b;
*b = temp;
}
int calculateTotalGrades(struct Student student) {
return student.grades[0] + student.grades[1] + student.grades[2];
}
嗨,我是LucianaiB。如果你觉得我的分享有价值,不妨通过以下方式表达你的支持:👍 点赞来表达你的喜爱,📁 关注以获取我的最新消息,💬 评论与我交流你的见解。我会继续努力,为你带来更多精彩和实用的内容。
点击这里👉LucianaiB ,获取最新动态,⚡️ 让信息传递更加迅速。