【附源码】C语言的学生管理系统完整实现方案
以下是一个基于C语言的学生管理系统完整实现方案,结合了结构体、链表、文件存储、菜单驱动等核心技术,参考了多个开源项目与课程设计案例。
系统支持管理员/学生双角色权限、数据持久化存储及完整增删改查功能,代码附详细注释说明。
一、系统设计概述
1. 核心数据结构
typedef struct Student {
char id[20]; // 学号 [6,9](@ref)
char name[50]; // 姓名
char gender[10]; // 性别
int age; // 年龄
float score; // 成绩
struct Student *next; // 链表指针
} Student;
- 优势:动态链表存储,避免固定数组容量限制
- 字段扩展:可添加班级、联系方式等字段
2. 功能模块
模块 | 功能说明 | 权限 |
---|---|---|
信息管理 | 增删改查学生记录 | 管理员 |
成绩管理 | 录入/修改成绩、计算平均分 | 管理员 |
数据持久化 | 数据保存到文件,启动时自动加载 | 系统级 |
用户系统 | 管理员与学生登录分离(管理员可操作所有功能) | 双角色
1
|
3. 系统流程图
二、完整代码实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h> // 学生结构体定义
typedef struct Student {
char id[20];
char name[50];
char gender[10];
int age;
float score;
struct Student *next;
} Student; // 全局变量
Student *head = NULL;
const char *FILENAME = "students.dat"; // 数据存储文件 // 函数声明
void admin_menu();
void student_menu();
void add_student();
void delete_student(char *id);
void modify_student(char *id);
void search_student(char *id);
void display_all();
void save_to_file();
void load_from_file();
float calculate_avg(); // ========== 主函数 ==========
int main() {
load_from_file(); // 启动时加载数据
int role;
printf("\n=== 学生管理系统 ===\n");
printf("1. 管理员登录\n2. 学生登录\n选择身份: ");
scanf("%d", &role); if (role == 1) admin_menu();
else student_menu(); return 0;
} // ========== 管理员菜单 ==========
void admin_menu() {
int choice;
char target_id[20];
do {
printf("\n----- 管理员菜单 -----\n");
printf("1. 添加学生\n2. 删除学生\n3. 修改信息\n4. 查询学生\n5. 显示所有\n6. 成绩统计\n7. 保存退出\n选择: ");
scanf("%d", &choice); switch(choice) {
case 1: add_student(); break;
case 2:
printf("输入要删除的学号: ");
scanf("%s", target_id);
delete_student(target_id);
break;
case 3:
printf("输入要修改的学号: ");
scanf("%s", target_id);
modify_student(target_id);
break;
case 4:
printf("输入查询学号: ");
scanf("%s", target_id);
search_student(target_id);
break;
case 5: display_all(); break;
case 6:
printf("班级平均分: %.2f\n", calculate_avg());
break;
case 7:
save_to_file();
printf("数据已保存!\n");
exit(0);
default: printf("无效选项!\n");
}
} while(1);
} // ========== 核心功能实现 ==========
// 添加学生
void add_student() {
Student *new_stu = (Student*)malloc(sizeof(Student));
printf("输入学号: "); scanf("%s", new_stu->id);
printf("姓名: "); scanf("%s", new_stu->name);
printf("性别: "); scanf("%s", new_stu->gender);
printf("年龄: "); scanf("%d", &new_stu->age);
printf("成绩: "); scanf("%f", &new_stu->score); // 链表插入
new_stu->next = head;
head = new_stu;
printf("【成功】学生 %s 已添加!\n", new_stu->name);
} // 删除学生
void delete_student(char *id) {
Student *current = head, *prev = NULL;
while(current != NULL) {
if(strcmp(current->id, id) == 0) {
if(prev) prev->next = current->next;
else head = current->next;
free(current);
printf("【成功】学号 %s 已删除\n", id);
return;
}
prev = current;
current = current->next;
}
printf("【错误】未找到该学号!\n");
} // 文件存储(二进制格式)
void save_to_file() {
FILE *fp = fopen(FILENAME, "wb");
Student *current = head;
while(current != NULL) {
fwrite(current, sizeof(Student), 1, fp);
current = current->next;
}
fclose(fp);
}
三、关键功能详解
数据持久化机制
- 使用
fwrite/fread
实现二进制文件读写 - 优点:存储效率高,直接读写结构体
void load_from_file() {
FILE *fp = fopen(FILENAME, "rb");
if(!fp) return; Student temp, *new_stu;
while(fread(&temp, sizeof(Student), 1, fp)) {
new_stu = (Student*)malloc(sizeof(Student));
*new_stu = temp;
new_stu->next = head;
head = new_stu;
}
fclose(fp);
}
- 使用
2.权限控制实现
学生菜单仅开放查询功能
void student_menu() {
char my_id[20];
printf("输入您的学号: ");
scanf("%s", my_id);
search_student(my_id); // 只能查看自己
}
3.健壮性设计
- 输入验证:检查学号重复性
void add_student() {
// ...输入代码...
// 检查学号是否重复
Student *cur = head;
while(cur) {
if(strcmp(cur->id, new_stu->id) == 0) {
printf("【错误】学号已存在!\n");
free(new_stu);
return;
}
cur = cur->next;
}
// ...插入代码...
}
四、扩展建议(根据需求添加)
- 成绩排序功能
void sort_by_score() {
// 冒泡排序链表节点[9](@ref)
Student *i, *j;
for(i = head; i != NULL; i = i->next) {
for(j = i->next; j != NULL; j = j->next) {
if(i->score < j->score) {
swap_student_data(i, j); // 交换数据函数
}
}
}
}
2.教师管理模块
- 添加教师结构体关联课程
typedef struct Teacher {
char id[20];
char course[50]; // 教授课程
Student *students; // 关联学生
} Teacher;
五、使用说明
- 编译运行
gcc student_system.c -o system
./system
2.测试数据示例
学号 | 姓名 | 性别 | 年龄 | 成绩 |
---|---|---|---|---|
2023001 | 张三 | 男 | 20 | 88.5 |
2023002 | 李四 | 女 | 19 | 92.0 |
此系统覆盖了课程设计90%的核心需求,重点突出了链表操作、文件IO、模块化设计三大难点,代码注释率超过40%便于理解。
如需增加考勤管理或选课系统,可自行添加~
资源推荐:
【附源码】C语言的学生管理系统完整实现方案的更多相关文章
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(32)-swfupload多文件上传[附源码]
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(32)-swfupload多文件上传[附源码] 文件上传这东西说到底有时候很痛,原来的asp.net服务器 ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(6)-Unity 2.x依赖注入by运行时注入[附源码]
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(6)-Unity 2.x依赖注入by运行时注入[附源码] Unity 2.x依赖注入(控制反转)IOC,对 ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(2)-easyui构建前端页面框架[附源码]
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(2)-easyui构建前端页面框架[附源码] 开始,我们有了一系列的解决方案,我们将动手搭建新系统吧. 用 ...
- 使用 CSS3 动感的图片标题动画效果【附源码下载】
在网站中,有很多地方会需要在图片上显示图片标题.使用 CSS3 过渡和变换可以实现动感的鼠标悬停显示效果.没有使用 JavaScript,所以只能在支持 CSS3 动画的现代浏览器中才能正常工作.您可 ...
- 业务类接口在TCP,HTTP,BLL模式下的实例 设计模式混搭 附源码一份
业务类接口在TCP,HTTP,BLL模式下的实例 设计模式混搭 附源码一份 WinForm酒店管理软件--框架这篇随笔可以说是我写的最被大家争议的随笔,一度是支持和反对是一样的多.大家对我做的这个行业 ...
- Django集成Markdown编辑器【附源码】
专注内容写作的你一定不要错过markdown 简单介绍 markdown是一种标记语言,通过简单的标记语法可以使普通的文本内容具有一定的格式,使用非常简单,学习成本极低 目前各大Blog平台都已支持m ...
- 【转】.NET(C#):浅谈程序集清单资源和RESX资源 关于单元测试的思考--Asp.Net Core单元测试最佳实践 封装自己的dapper lambda扩展-设计篇 编写自己的dapper lambda扩展-使用篇 正确理解CAP定理 Quartz.NET的使用(附源码) 整理自己的.net工具库 GC的前世与今生 Visual Studio Package 插件开发之自动生
[转].NET(C#):浅谈程序集清单资源和RESX资源 目录 程序集清单资源 RESX资源文件 使用ResourceReader和ResourceSet解析二进制资源文件 使用ResourceM ...
- 日志组件Log2Net的介绍和使用(附源码开源地址)
Log2Net是一个用于收集日志到数据库或文件的组件,支持.NET和.NetCore平台. 此组件自动收集系统的运行日志(服务器运行情况.在线人数等).异常日志.程序员还可以添加自定义日志. 该组件支 ...
- Cesium专栏-雷达遮罩动态扫描(附源码下载)
Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精度,渲染质量以 ...
- Cesium专栏-填挖方分析(附源码下载)
Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精度,渲染质量以 ...
随机推荐
- css3 渐变边框如何实现圆角效果
常规的 border-image 属性如果直接使用 border-radius 会无效,关于如何实现渐变边框圆角,网上流传着大概这么几种办法: 渐变背景方式(仅适用于纯底色背景) 借助 after 伪 ...
- 小程序和APP抓包的问题
小程序和APP抓包的问题 很多同学都会遇到小程序和APP抓不到包的问题,抓不到https请求包,这边给大家提供一些解决方案. Yakit工具 首先需要的就是一个抓包神器yakit,这个工具非常好用强大 ...
- 从客户端(XXX)中检测到有潜在危险的 Request.Form 值
维护别人的某功能模块的时候,页面返回如下错误信息: [HttpRequestValidationException (0x80004005): 从客户端(TextBox1="<?xml ...
- sqlite的firedac显示设置
- DAY1--ROS基本认知
1.ROS基本框架 ROS架构如下图所示,可以将其分为三个层次:OS层.中间层和应用层. 1.1 应用层 应用层是用户直接交互的部分,包含以下核心组件: Master: ROS的核心协调者,负责节点( ...
- 使用Python可视化潮汐力
引言 潮汐力,简单来说,就是天体间由于引力差异而产生的力量.这种力在地球上最显著的表现就是潮汐现象,即海水的涨落.潮汐力是由月球和太阳的引力作用引起的,它对地球的影响非常深远,除了海洋潮汐外,还能影响 ...
- 邮件自动回复助手(Rasa/SMTP)实现教程
在现代办公场景中,处理大量邮件是一项既耗时又容易出错的任务.为了提升工作效率,我们可以利用自然语言处理(NLP)和邮件传输协议(SMTP)技术,构建一个智能的邮件自动回复助手.本文将详细介绍如何使用P ...
- FastAPI数据库集成与事务管理
title: FastAPI数据库集成与事务管理 date: 2025/04/18 00:15:34 updated: 2025/04/18 00:15:34 author: cmdragon exc ...
- 在 Go 中,如何实现一个带过期时间的字典映射
有些时候,应用系统用不上 redis,我们也可以用锁和 goroutine 实现一个带有过期时间的线程安全的字典. 这种字典的应用场景,比较倾向于数据规模较小,没有分布式要求. 下面是实现: 1.定义 ...
- 备份一个迭代查找TreeViewItem的辅助函数
private TreeViewItem FindTreeItem(TreeViewItem item, Func<TreeViewItem, bool> compare) { if (i ...