当前位置: 首页 > news >正文

简易学生成绩管理系统(C语言)

学生成绩管理系统(C语言实现)

前提:

一、基础语法

  1. 数据类型

    • 基本类型:intfloatchar

    • 构造类型:struct(学生信息结构体)

    • 字符串处理:char name[20]

  2. 输入输出

    • printf()/scanf()格式化输入输出

    • %d%f%s等格式控制符

  3. 运算符

    • 算术运算符:+/(计算总分和平均分)

    • 比较运算符:><==(成绩比较)

    • 逻辑运算符:&&||(复合条件判断)


二、流程控制

  1. 分支结构

    • if-else:成绩筛选条件判断

    • switch-case:菜单选择和多条件分支

  2. 循环结构

    • for循环:遍历学生数组

    • do-while:菜单循环

    • 嵌套循环:排序算法实现


三、核心数据结构

  1. 数组

    • 固定长度数组:Student students[MAX_STUDENTS]

    • 数组遍历和操作

  2. 结构体

    c

    复制

    下载

    typedef struct {int id;char name[20];float chinese, math, english;float total, average;
    } Student;
    • 复合数据类型组织学生信息

    • 结构体成员访问(.运算符)


四、算法实现

  1. 排序算法

    • 冒泡排序实现多条件排序(按学号/各科成绩等)

    c

    复制

    下载

    for(i=0; i<studentCount-1; i++){for(j=0; j<studentCount-1-i; j++){if(students[j].total < students[j+1].total){// 交换结构体}}
    }
  2. 查找算法

    • 线性查找:按学号/姓名查找学生

    • 条件筛选:阈值过滤(如score >= 60


五、内存与文件操作

  1. 文件I/O

    • fopen()/fclose()文件开关

    • fwrite()/fread()二进制读写

    c

    复制

    下载

    // 保存数据
    fwrite(&studentCount, sizeof(int), 1, file);
    fwrite(students, sizeof(Student), studentCount, file);
  2. 内存管理

    • 静态数组内存分配

    • 结构体整体读写(二进制安全)


六、工程化实践

  1. 模块化设计

    • 功能函数化(添加/查询/修改等独立函数)

    • 函数声明与实现分离

  2. 用户交互

    • 菜单驱动界面

    • 输入验证(未做完善处理,实际项目需要加强)

  3. 数据持久化

    • 程序退出保存状态

    • 启动时加载历史数据


七、可扩展方向

  1. 动态内存

    • 改用malloc()实现动态数组

    • 链表存储代替静态数组

  2. 高级特性

    • 指针优化结构体操作

    • 多文件编程(头文件分离)

  3. 增强功能

    • 输入错误处理

    • 成绩分段统计(优良率等)

    • 图形界面(如结合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");
}
 

系统功能说明

  1. 基本功能

    • 添加学生信息(学号、姓名、语文、数学、英语成绩)

    • 显示所有学生信息

    • 查找学生(按学号或姓名)

    • 修改学生信息

    • 删除学生信息

  2. 成绩处理功能

    • 自动计算总分和平均分

    • 多种排序方式(按各科成绩、总分、平均分)

    • 成绩筛选(可按各科成绩、总分、平均分设置阈值筛选)

    • 成绩统计(各科平均分、最高分、最低分)

  3. 数据持久化

    • 保存数据到文件

    • 从文件加载数据

  4. 用户界面

    • 清晰的菜单导航

    • 格式化的数据展示

使用说明

  1. 编译运行程序后,会显示主菜单

  2. 选择相应数字执行对应功能

  3. 数据会自动计算总分和平均分

  4. 退出前建议选择"保存数据到文件"选项

  5. 下次启动时会自动加载之前保存的数据

这个系统可以满足基本的成绩管理需求,您可以根据需要进一步扩展功能。

相关文章:

  • 动手试一试 Spring Security入门
  • 服务器上安装node
  • Ubuntu服务器上如何监控Oracle数据库
  • JCP官方定义的Java技术体系组成部分详解
  • 操作系统---经典同步问题
  • 高功率激光输出稳定性不足?OAS 光学软件来攻克
  • 【Python网络爬虫实战指南】从数据采集到反反爬策略
  • ActiveMQ 快速上手:安装配置与基础通信实践(一)
  • HTB - BigBang靶机记录
  • 【MySQL数据库】表的增删改查
  • 雪花算法生成int64,在前端js的精度问题
  • PostgreSQL的dblink扩展模块使用方法
  • Java并发编程|CompletableFuture原理与实战:从链式操作到异步编排
  • 数据库监控 | MongoDB监控全解析
  • vue3实现v-directive;vue3实现v-指令;v-directive不触发
  • 【AI平台】n8n入门1:详细介绍n8n的多种安装方式(含docer图形化安装n8n)
  • 武汉火影数字虚拟展厅制作:打破时空限制的数字化盛宴
  • 【高频考点精讲】JavaScript中的组合模式:从树形结构到组件嵌套实战
  • 基于 Spring Boot 的银行柜台管理系统设计与实现(源码+文档+部署讲解)
  • AD16如何设置合适的PCB板框
  • 2025全国知识产权宣传周:用AI生成的图片要小心什么?
  • 云南省委常委、组织部部长刘非任浙江省委常委、杭州市委书记
  • 今年地质灾害防治形势严峻,哪些风险区被自然资源部点名?
  • 现场观察·国防部记者会|美将举行大演习“应对中国”,备战太平洋引发关注
  • 5月1日起,涉外婚姻登记将在上海市16区全面铺开
  • 民政部党组成员、中国老龄协会会长刘振国任民政部副部长