学生成绩管理系统(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%的基础知识点,是典型的控制台应用程序范例。通过这个案例可以系统掌握:
-
结构化编程思想
-
数据+算法的结合实现
-
小型系统开发流程
-
调试和优化技巧
以下是一个完整的学生成绩管理系统,包含语文、数学、英语三科成绩,并支持多种筛选功能:
cpp
#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");
}
系统功能说明
-
基本功能:
-
添加学生信息(学号、姓名、语文、数学、英语成绩)
-
显示所有学生信息
-
查找学生(按学号或姓名)
-
修改学生信息
-
删除学生信息
-
-
成绩处理功能:
-
自动计算总分和平均分
-
多种排序方式(按各科成绩、总分、平均分)
-
成绩筛选(可按各科成绩、总分、平均分设置阈值筛选)
-
成绩统计(各科平均分、最高分、最低分)
-
-
数据持久化:
-
保存数据到文件
-
从文件加载数据
-
-
用户界面:
-
清晰的菜单导航
-
格式化的数据展示
-
使用说明
-
编译运行程序后,会显示主菜单
-
选择相应数字执行对应功能
-
数据会自动计算总分和平均分
-
退出前建议选择"保存数据到文件"选项
-
下次启动时会自动加载之前保存的数据
这个系统可以满足基本的成绩管理需求,您可以根据需要进一步扩展功能。