C 语言从 0 入门(二十六)|终极综合项目:完整版文件持久化学生管理系统
2026/4/16 15:22:14 网站建设 项目流程

大家好,我是网域小星球。

本篇作为本系列收尾实战篇,整合前面全部核心知识点:数组、指针、结构体、动态内存、枚举、文件读写、模块化函数、菜单框架、内存管理。打造一套功能完整、代码规范、可扩容、数据持久化的学生信息管理系统,可直接用作课程设计、期末大作业、实验报告成品代码。

目录

一、本章学习目标

二、系统功能清单

三、整体设计思路

四、完整可运行代码(VS2022 直接编译运行)

五、项目涉及核心知识点复盘

六、项目扩展方向(后续可自主拓展)

七、本章核心总结


一、本章学习目标

  1. 整合 C 语言全阶段知识点,串联前后所有内容
  2. 掌握大型程序模块化拆分、函数封装、代码解耦
  3. 实现动态内存自动扩容,摆脱固定数组限制
  4. 结合文件操作,实现数据保存 & 加载,程序重启不丢失
  5. 具备独立编写小型控制台项目的完整能力

二、系统功能清单

1. 新增学生信息 2. 展示全部学生 3. 按学号查询学生 4. 修改学生成绩 5. 删除学生信息 6. 学生成绩排序 7. 保存数据到文件 8. 从文件加载数据 0. 退出系统

三、整体设计思路

  1. 使用结构体存储学生信息
  2. 采用动态内存 + 自动扩容,不限学生人数
  3. 所有功能独立封装为函数,结构清晰
  4. 文件读写实现持久化存储
  5. while 死循环 + switch 菜单,经典控制台项目架构
  6. 程序退出自动释放内存,杜绝内存泄漏

四、完整可运行代码(VS2022 直接编译运行)

#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <string.h> // 学生结构体 typedef struct { int id; // 学号 char name[20]; // 姓名 float score; // 成绩 }Student; // 动态内存全局管理 Student* stu = NULL; int count = 0; // 当前学生数量 int capacity = 0; // 内存容量 // 函数声明 void menu(); void checkCapacity(); void addStudent(); void showStudent(); void searchStudent(); void modifyStudent(); void deleteStudent(); void sortStudent(); void saveFile(); void loadFile(); int main() { int choice; while (1) { menu(); printf("请输入功能选择:"); scanf("%d", &choice); switch (choice) { case 1: addStudent(); break; case 2: showStudent(); break; case 3: searchStudent(); break; case 4: modifyStudent(); break; case 5: deleteStudent(); break; case 6: sortStudent(); break; case 7: saveFile(); break; case 8: loadFile(); break; case 0: free(stu); stu = NULL; printf("程序已退出,内存已释放\n"); return 0; default: printf("输入错误,请重新选择!\n"); break; } printf("-----------------------------\n"); system("pause"); system("cls"); } return 0; } // 菜单界面 void menu() { printf("==========学生管理系统==========\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("0. 退出系统\n"); printf("================================\n"); } // 动态扩容检测 void checkCapacity() { if (count < capacity) return; int newCap = (capacity == 0) ? 5 : capacity * 2; Student* temp = (Student*)realloc(stu, newCap * sizeof(Student)); if (temp == NULL) { printf("内存扩容失败!\n"); return; } stu = temp; capacity = newCap; } // 1.新增学生 void addStudent() { checkCapacity(); printf("请输入学号 姓名 成绩:"); scanf("%d %s %f", &stu[count].id, stu[count].name, &stu[count].score); count++; printf("学生信息添加成功!\n"); } // 2.展示所有学生 void showStudent() { if (count == 0) { printf("暂无学生数据!\n"); return; } printf("学号\t姓名\t成绩\n"); for (int i = 0; i < count; i++) { printf("%d\t%s\t%.1f\n", stu[i].id, stu[i].name, stu[i].score); } } // 3.按学号查询 void searchStudent() { int id; printf("请输入要查询的学号:"); scanf("%d", &id); for (int i = 0; i < count; i++) { if (stu[i].id == id) { printf("查询结果:%d %s %.1f\n", stu[i].id, stu[i].name, stu[i].score); return; } } printf("未找到该学号学生!\n"); } // 4.修改学生成绩 void modifyStudent() { int id; printf("请输入要修改的学号:"); scanf("%d", &id); for (int i = 0; i < count; i++) { if (stu[i].id == id) { printf("原成绩:%.1f,请输入新成绩:", stu[i].score); scanf("%f", &stu[i].score); printf("成绩修改成功!\n"); return; } } printf("未找到该学生!\n"); } // 5.删除学生 void deleteStudent() { int id, i, j; printf("请输入要删除的学号:"); scanf("%d", &id); for (i = 0; i < count; i++) { if (stu[i].id == id) { for (j = i; j < count - 1; j++) { stu[j] = stu[j + 1]; } count--; printf("学生信息删除成功!\n"); return; } } printf("未找到该学生!\n"); } // 6.成绩降序排序 void sortStudent() { for (int i = 0; i < count - 1; i++) { for (int j = 0; j < count - i - 1; j++) { if (stu[j].score < stu[j + 1].score) { Student temp = stu[j]; stu[j] = stu[j + 1]; stu[j + 1] = temp; } } } printf("成绩排序完成!\n"); } // 7.保存到文件 void saveFile() { FILE* fp = fopen("student_data.txt", "w"); if (fp == NULL) { printf("文件打开失败!\n"); return; } for (int i = 0; i < count; i++) { fprintf(fp, "%d %s %.1f\n", stu[i].id, stu[i].name, stu[i].score); } fclose(fp); printf("数据已保存至 student_data.txt\n"); } // 8.读取文件 void loadFile() { FILE* fp = fopen("student_data.txt", "r"); if (fp == NULL) { printf("数据文件不存在!\n"); return; } count = 0; int id; char name[20]; float score; while (fscanf(fp, "%d %s %f", &id, name, &score) != EOF) { checkCapacity(); stu[count].id = id; strcpy(stu[count].name, name); stu[count].score = score; count++; } fclose(fp); printf("文件数据加载完成,共%d条信息\n", count); }

五、项目涉及核心知识点复盘

  1. 自定义类型typedef 简化结构体,告别 struct 冗余写法
  2. 指针与动态内存malloc、realloc 动态扩容,free 手动释放内存
  3. 数组与字符串结构体数组、字符串拷贝、遍历操作
  4. 函数模块化一个功能对应一个函数,低耦合、易维护
  5. 文件操作fopen、fprintf、fscanf、fclose 实现持久化
  6. 基础算法冒泡排序、数据查找、数据删除移位
  7. 内存四区规范堆内存申请释放、避免野指针与内存泄漏

六、项目扩展方向(后续可自主拓展)

  1. 增加密码登录界面
  2. 增加学生信息批量录入
  3. 增加按姓名模糊查询
  4. 增加数据统计(最高分、最低分、平均分)
  5. 优化界面,美化控制台输出
  6. 改为二进制文件存储,提高安全性

七、本章核心总结

  1. 本项目完整串联 C 语言全部核心语法,是入门阶段终极实战
  2. 动态内存 + 文件持久化,达到初级小型项目标准
  3. 模块化编程思想,是从基础语法走向开发的关键一步
  4. 代码规范、注释清晰、可直接用于作业提交与学习复盘
  5. 整套 26 篇教程由浅入深,完整覆盖 C 语言入门全部考点

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询