简易学生成绩管理系统(C语言)
学生成绩管理系统(C语言实现)
前提:
一、基础语法
-
数据类型
-
基本类型:
int
,float
,char
-
构造类型:
struct
(学生信息结构体) -
字符串处理:
char name[20]
-
-
输入输出
-
printf()
/scanf()
格式化输入输出 -
%d
,%f
,%s
等格式控制符
-
-
运算符
-
算术运算符:
+
,/
(计算总分和平均分) -
比较运算符:
>
,<
,==
(成绩比较) -
逻辑运算符:
&&
,||
(复合条件判断)
-
二、流程控制
-
分支结构
-
if-else
:成绩筛选条件判断 -
switch-case
:菜单选择和多条件分支
-
-
循环结构
-
for
循环:遍历学生数组 -
do-while
:菜单循环 -
嵌套循环:排序算法实现
-
三、核心数据结构
-
数组
-
固定长度数组:
Student students[MAX_STUDENTS]
-
数组遍历和操作
-
-
结构体
c
复制
下载
typedef struct {int id;char name[20];float chinese, math, english;float total, average; } Student;
-
复合数据类型组织学生信息
-
结构体成员访问(
.
运算符)
-
四、算法实现
-
排序算法
-
冒泡排序实现多条件排序(按学号/各科成绩等)
c
复制
下载
for(i=0; i<studentCount-1; i++){for(j=0; j<studentCount-1-i; j++){if(students[j].total < students[j+1].total){// 交换结构体}} }
-
-
查找算法
-
线性查找:按学号/姓名查找学生
-
条件筛选:阈值过滤(如
score >= 60
)
-
五、内存与文件操作
-
文件I/O
-
fopen()
/fclose()
文件开关 -
fwrite()
/fread()
二进制读写
c
复制
下载
// 保存数据 fwrite(&studentCount, sizeof(int), 1, file); fwrite(students, sizeof(Student), studentCount, file);
-
-
内存管理
-
静态数组内存分配
-
结构体整体读写(二进制安全)
-
六、工程化实践
-
模块化设计
-
功能函数化(添加/查询/修改等独立函数)
-
函数声明与实现分离
-
-
用户交互
-
菜单驱动界面
-
输入验证(未做完善处理,实际项目需要加强)
-
-
数据持久化
-
程序退出保存状态
-
启动时加载历史数据
-
七、可扩展方向
-
动态内存
-
改用
malloc()
实现动态数组 -
链表存储代替静态数组
-
-
高级特性
-
指针优化结构体操作
-
多文件编程(头文件分离)
-
-
增强功能
-
输入错误处理
-
成绩分段统计(优良率等)
-
图形界面(如结合GTK)
-
这个项目综合运用了C语言90%的基础知识点,是典型的控制台应用程序范例。通过这个案例可以系统掌握:
-
结构化编程思想
-
数据+算法的结合实现
-
小型系统开发流程
-
调试和优化技巧
以下是一个完整的学生成绩管理系统,包含语文、数学、英语三科成绩,并支持多种筛选功能:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>#define MAX_STUDENTS 100// 学生结构体
typedef struct {int id; // 学号char name[20]; // 姓名float chinese; // 语文成绩float math; // 数学成绩float english; // 英语成绩float total; // 总分float average; // 平均分
} Student;Student students[MAX_STUDENTS];
int studentCount = 0;// 函数声明
void addStudent();
void displayAll();
void searchStudent();
void updateStudent();
void deleteStudent();
void sortStudents();
void filterStudents();
void calculateStats();
void saveToFile();
void loadFromFile();
void showMenu();int main() {loadFromFile();int choice;do {showMenu();printf("请输入您的选择(0-9): ");scanf("%d", &choice);switch(choice) {case 1: addStudent(); break;case 2: displayAll(); break;case 3: searchStudent(); break;case 4: updateStudent(); break;case 5: deleteStudent(); break;case 6: sortStudents(); break;case 7: filterStudents(); break;case 8: calculateStats(); break;case 9: saveToFile(); break;case 0: printf("感谢使用,再见!\n"); break;default: printf("无效的选择,请重新输入!\n");}} while(choice != 0);return 0;
}// 显示菜单
void showMenu() {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("8. 统计信息\n");printf("9. 保存数据到文件\n");printf("0. 退出系统\n");printf("============================\n");
}// 添加学生信息
void addStudent() {if (studentCount >= MAX_STUDENTS) {printf("学生数量已达上限,无法添加!\n");return;}Student s;printf("请输入学号: ");scanf("%d", &s.id);printf("请输入姓名: ");scanf("%s", s.name);printf("请输入语文成绩: ");scanf("%f", &s.chinese);printf("请输入数学成绩: ");scanf("%f", &s.math);printf("请输入英语成绩: ");scanf("%f", &s.english);s.total = s.chinese + s.math + s.english;s.average = s.total / 3;students[studentCount++] = s;printf("学生信息添加成功!\n");
}// 显示所有学生信息
void displayAll() {if (studentCount == 0) {printf("没有学生信息可显示!\n");return;}printf("\n%-10s %-15s %-10s %-10s %-10s %-10s %-10s\n", "学号", "姓名", "语文", "数学", "英语", "总分", "平均分");printf("------------------------------------------------------------\n");for (int i = 0; i < studentCount; i++) {Student s = students[i];printf("%-10d %-15s %-10.1f %-10.1f %-10.1f %-10.1f %-10.1f\n", s.id, s.name, s.chinese, s.math, s.english, s.total, s.average);}
}// 查找学生信息
void searchStudent() {if (studentCount == 0) {printf("没有学生信息可查找!\n");return;}int choice;printf("\n1. 按学号查找\n");printf("2. 按姓名查找\n");printf("请选择查找方式: ");scanf("%d", &choice);if (choice == 1) {int id;printf("请输入要查找的学号: ");scanf("%d", &id);int found = 0;for (int i = 0; i < studentCount; i++) {if (students[i].id == id) {printf("\n%-10s %-15s %-10s %-10s %-10s %-10s %-10s\n", "学号", "姓名", "语文", "数学", "英语", "总分", "平均分");printf("------------------------------------------------------------\n");Student s = students[i];printf("%-10d %-15s %-10.1f %-10.1f %-10.1f %-10.1f %-10.1f\n", s.id, s.name, s.chinese, s.math, s.english, s.total, s.average);found = 1;break;}}if (!found) {printf("未找到学号为%d的学生!\n", id);}} else if (choice == 2) {char name[20];printf("请输入要查找的姓名: ");scanf("%s", name);int found = 0;printf("\n%-10s %-15s %-10s %-10s %-10s %-10s %-10s\n", "学号", "姓名", "语文", "数学", "英语", "总分", "平均分");printf("------------------------------------------------------------\n");for (int i = 0; i < studentCount; i++) {if (strcmp(students[i].name, name) == 0) {Student s = students[i];printf("%-10d %-15s %-10.1f %-10.1f %-10.1f %-10.1f %-10.1f\n", s.id, s.name, s.chinese, s.math, s.english, s.total, s.average);found = 1;}}if (!found) {printf("未找到姓名为%s的学生!\n", name);}} else {printf("无效的选择!\n");}
}// 修改学生信息
void updateStudent() {if (studentCount == 0) {printf("没有学生信息可修改!\n");return;}int id;printf("请输入要修改的学生学号: ");scanf("%d", &id);int index = -1;for (int i = 0; i < studentCount; i++) {if (students[i].id == id) {index = i;break;}}if (index == -1) {printf("未找到学号为%d的学生!\n", id);return;}printf("当前学生信息:\n");printf("%-10s %-15s %-10s %-10s %-10s %-10s %-10s\n", "学号", "姓名", "语文", "数学", "英语", "总分", "平均分");printf("------------------------------------------------------------\n");Student s = students[index];printf("%-10d %-15s %-10.1f %-10.1f %-10.1f %-10.1f %-10.1f\n", s.id, s.name, s.chinese, s.math, s.english, s.total, s.average);printf("\n请输入新的姓名(原值: %s): ", s.name);scanf("%s", s.name);printf("请输入新的语文成绩(原值: %.1f): ", s.chinese);scanf("%f", &s.chinese);printf("请输入新的数学成绩(原值: %.1f): ", s.math);scanf("%f", &s.math);printf("请输入新的英语成绩(原值: %.1f): ", s.english);scanf("%f", &s.english);s.total = s.chinese + s.math + s.english;s.average = s.total / 3;students[index] = s;printf("学生信息修改成功!\n");
}// 删除学生信息
void deleteStudent() {if (studentCount == 0) {printf("没有学生信息可删除!\n");return;}int id;printf("请输入要删除的学生学号: ");scanf("%d", &id);int index = -1;for (int i = 0; i < studentCount; i++) {if (students[i].id == id) {index = i;break;}}if (index == -1) {printf("未找到学号为%d的学生!\n", id);return;}for (int i = index; i < studentCount - 1; i++) {students[i] = students[i + 1];}studentCount--;printf("学号为%d的学生信息已删除!\n", id);
}// 排序学生信息
void sortStudents() {if (studentCount == 0) {printf("没有学生信息可排序!\n");return;}int choice;printf("\n1. 按学号排序\n");printf("2. 按语文成绩排序\n");printf("3. 按数学成绩排序\n");printf("4. 按英语成绩排序\n");printf("5. 按总分排序\n");printf("6. 按平均分排序\n");printf("请选择排序方式: ");scanf("%d", &choice);int i, j;Student temp;for (i = 0; i < studentCount - 1; i++) {for (j = 0; j < studentCount - 1 - i; j++) {int needSwap = 0;switch(choice) {case 1: needSwap = students[j].id > students[j+1].id; break;case 2: needSwap = students[j].chinese < students[j+1].chinese; break;case 3: needSwap = students[j].math < students[j+1].math; break;case 4: needSwap = students[j].english < students[j+1].english; break;case 5: needSwap = students[j].total < students[j+1].total; break;case 6: needSwap = students[j].average < students[j+1].average; break;default: printf("无效的选择!\n"); return;}if (needSwap) {temp = students[j];students[j] = students[j+1];students[j+1] = temp;}}}printf("排序完成!\n");displayAll();
}// 筛选学生信息
void filterStudents() {if (studentCount == 0) {printf("没有学生信息可筛选!\n");return;}int choice;printf("\n1. 筛选语文成绩大于等于某值\n");printf("2. 筛选数学成绩大于等于某值\n");printf("3. 筛选英语成绩大于等于某值\n");printf("4. 筛选总分大于等于某值\n");printf("5. 筛选平均分大于等于某值\n");printf("请选择筛选方式: ");scanf("%d", &choice);float value;printf("请输入筛选阈值: ");scanf("%f", &value);printf("\n筛选结果:\n");printf("%-10s %-15s %-10s %-10s %-10s %-10s %-10s\n", "学号", "姓名", "语文", "数学", "英语", "总分", "平均分");printf("------------------------------------------------------------\n");int count = 0;for (int i = 0; i < studentCount; i++) {Student s = students[i];int match = 0;switch(choice) {case 1: match = s.chinese >= value; break;case 2: match = s.math >= value; break;case 3: match = s.english >= value; break;case 4: match = s.total >= value; break;case 5: match = s.average >= value; break;default: printf("无效的选择!\n"); return;}if (match) {printf("%-10d %-15s %-10.1f %-10.1f %-10.1f %-10.1f %-10.1f\n", s.id, s.name, s.chinese, s.math, s.english, s.total, s.average);count++;}}if (count == 0) {printf("没有符合条件的学生!\n");} else {printf("\n共找到%d名学生符合条件\n", count);}
}// 统计信息
void calculateStats() {if (studentCount == 0) {printf("没有学生信息可统计!\n");return;}float chineseSum = 0, mathSum = 0, englishSum = 0;float chineseMax = students[0].chinese, chineseMin = students[0].chinese;float mathMax = students[0].math, mathMin = students[0].math;float englishMax = students[0].english, englishMin = students[0].english;for (int i = 0; i < studentCount; i++) {Student s = students[i];chineseSum += s.chinese;mathSum += s.math;englishSum += s.english;if (s.chinese > chineseMax) chineseMax = s.chinese;if (s.chinese < chineseMin) chineseMin = s.chinese;if (s.math > mathMax) mathMax = s.math;if (s.math < mathMin) mathMin = s.math;if (s.english > englishMax) englishMax = s.english;if (s.english < englishMin) englishMin = s.english;}printf("\n===== 成绩统计信息 =====\n");printf("语文 - 平均分: %.2f, 最高分: %.1f, 最低分: %.1f\n", chineseSum/studentCount, chineseMax, chineseMin);printf("数学 - 平均分: %.2f, 最高分: %.1f, 最低分: %.1f\n", mathSum/studentCount, mathMax, mathMin);printf("英语 - 平均分: %.2f, 最高分: %.1f, 最低分: %.1f\n", englishSum/studentCount, englishMax, englishMin);printf("========================\n");
}// 保存数据到文件
void saveToFile() {FILE *file = fopen("students.dat", "wb");if (file == NULL) {printf("无法打开文件进行保存!\n");return;}fwrite(&studentCount, sizeof(int), 1, file);fwrite(students, sizeof(Student), studentCount, file);fclose(file);printf("学生数据已保存到文件!\n");
}// 从文件加载数据
void loadFromFile() {FILE *file = fopen("students.dat", "rb");if (file == NULL) {printf("未找到数据文件,将创建新文件。\n");return;}fread(&studentCount, sizeof(int), 1, file);fread(students, sizeof(Student), studentCount, file);fclose(file);printf("学生数据已从文件加载!\n");
}
系统功能说明
-
基本功能:
-
添加学生信息(学号、姓名、语文、数学、英语成绩)
-
显示所有学生信息
-
查找学生(按学号或姓名)
-
修改学生信息
-
删除学生信息
-
-
成绩处理功能:
-
自动计算总分和平均分
-
多种排序方式(按各科成绩、总分、平均分)
-
成绩筛选(可按各科成绩、总分、平均分设置阈值筛选)
-
成绩统计(各科平均分、最高分、最低分)
-
-
数据持久化:
-
保存数据到文件
-
从文件加载数据
-
-
用户界面:
-
清晰的菜单导航
-
格式化的数据展示
-
使用说明
-
编译运行程序后,会显示主菜单
-
选择相应数字执行对应功能
-
数据会自动计算总分和平均分
-
退出前建议选择"保存数据到文件"选项
-
下次启动时会自动加载之前保存的数据
这个系统可以满足基本的成绩管理需求,您可以根据需要进一步扩展功能。