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

C 语言从 0 入门(二十六)|终极综合项目:完整版文件持久化学生管理系统

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

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

目录

一、本章学习目标

二、系统功能清单

三、整体设计思路

四、完整可运行代码(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 语言入门全部考点
http://www.jsqmd.com/news/650737/

相关文章:

  • 别再死记硬背!用Python+OpenCV手把手带你标定相机内参外参(附完整代码)
  • 2026临沂企业如何选对人力资源管理顾问?
  • Colab实战:用GitHub代码仓库快速搭建深度学习环境(含GPU设置避坑指南)
  • 基于Python的来访管理系统毕业设计源码
  • PUBG罗技鼠标宏压枪脚本技术解析与实战应用指南
  • ComfyUI-WanVideoWrapper:模块化AI视频生成框架的技术深度解析
  • 从英文障碍到设计自由:FigmaCN如何让中文设计师重获创作主动权
  • 对抗攻击实战解析:从梯度扰动到模型集成的攻防博弈
  • Matlab里mod和rem到底啥区别?一个例子讲透,选错函数你的计算结果可能全错
  • Linux命令:vmstat
  • 别让反电动势烧了你的单片机!手把手教你给继电器/电机加保护二极管(附ULN2803实战)
  • 在安卓Termux上通过QEMU部署Windows 11:从零开始的移动端虚拟化实践
  • 如何在Mac上使用CXPatcher提升CrossOver游戏性能:完整教程
  • GitHub中文化插件:彻底消除语言障碍的专业解决方案
  • 实测4大AI做PPT神器:千问 vs Kimi vs 豆包 vs 扣子,谁才是最强生产力?(附完整对比)
  • STM32C8T6驱动IIS3DWB传感器:从CubeMX配置到USB-CDC数据输出的完整实战
  • 天津继承诉讼律师:天津家理律所姜春梅律师:咨询400-0073-869 - 外贸老黄
  • 深入解析timm中的FeatureListNet:灵活提取模型中间特征的秘密武器
  • RVC音色训练实战:用干声素材3分钟打造专属语音模型
  • 5种大模型多智能体协作模式详解:从入门到进阶,收藏这份架构指南
  • 5分钟搞定:如何彻底解决微信QQ消息撤回烦恼
  • 实战指南:基于STM32与DRV8825的步进电机闭环控制(STM32CubeIDE + 编码器)
  • 2026年乌鲁木齐家装工装一体化方案深度横评:从源头材料到气候适配的完整选购指南 - 精选优质企业推荐榜
  • 别再被PaddlePaddle-GPU版本搞懵了!手把手教你搞定CUDA 12.0 + PaddleOCR 2.0.1环境
  • 保姆级教程:STM32CubeMX 6.2.1从下载到固件库安装的完整避坑指南
  • Kubernetes Node 污点与调度权重
  • 收藏!小白也能玩转大模型,抓住AI红利!
  • 2026江苏保安公司排名前七:园区/学校/商场/小区安保优质服务商推荐 - 栗子测评
  • LinuxCNC完整指南:从零开始掌握开源数控系统
  • RISC-V实战:从考研408真题看指令格式与数据通路设计(附C语言模拟代码)