C语言学籍管理系统完整实现源码及解析

苏见山
苏见山
发布时间:2026-10-16 | 5人浏览过
原创

本文详细介绍使用C语言构建学生学籍管理系统的全过程。系统涵盖学生信息的录入、按学号/姓名查询、删除、修改、排序(学号/姓名)以及数据持久化保存功能。通过结构体数组管理数据,结合控制台菜单交互,为初学者提供了一个完整的C语言项目开发范例。

项目目标与核心功能

本项目的目标是设计并实现一个基于控制台的学籍管理系统。该系统旨在通过C语言的基础特性(如结构体、指针、数组和文件操作)来管理学生数据。核心功能模块包括:

  1. 信息录入:支持批量输入学生的基本信息。
  2. 信息查询:支持根据“学号”或“姓名”精准查找学生记录。
  3. 信息删除:提供按条件删除学生记录并自动调整数组的逻辑。
  4. 信息排序:支持对现有数据进行冒泡排序(按学号或姓名字典序)。
  5. 信息修改:定位特定学生并更新其资料。
  6. 数据输出:以表格形式展示当前所有有效学生信息。
  7. 数据保存:将内存中的数据写入本地文本文件以实现持久化。

数据结构定义

系统采用结构体 struct student 来封装单个学生的实体数据。该结构体包含四个字段:学号 (number)、姓名 (name)、年龄 (age) 和性别 (sex)。全局整型变量 count 用于追踪已删除的学生数量,从而确定实际有效的学生数据边界。

struct student{
   int number;
   char name[10];
   int age;
   char sex;
};

int count=0; //计数器记录已删除/已处理的学生个数

主菜单交互逻辑

程序入口点 main 函数初始化了一个容量为3的结构体数组 stu[3],并调用 enter() 函数进入主循环。虽然当前版本限制最大容量为3人,但代码逻辑保留了扩展性。主菜单利用 switch-case 语句分发用户指令,并在执行关键操作前后使用 system("cls") 清理控制台界面以优化视觉体验。

void enter(struct student stu[],int n)
{
   int select;
   while(select!=0) //注意:实际运行需确保select有初始值或改为do-while
   {
       printf("\t\t\t ---------------------------\n");
       printf("\n");
       printf("\t\t\t     欢迎使用学籍管理系统\n");
       printf("\n");
       // ... (菜单选项打印省略) ...
       scanf("%d",&select);
       system("cls");
       switch(select)
       {
           case 1:input(stu,n);break;
           case 2:seek(stu,n);break;
           case 3:delect(stu,n);break;
           case 4:sort(stu,n);break;
           case 5:revise(stu,n);break;
           case 6:output(stu,n);break;
           case 7:keep(stu,n);break;
           case 0:printf("\t\t\t 您已退出学籍管理系统\n");break;
           default:printf("输入有误\n");system("pause");system("cls");
       }
   }
}

详细操作功能实现

第一步:输入学生信息 (input)

目的:初始化系统,录入基础学生数据。
动作:遍历数组前 n 个位置,依次读取学号、姓名、年龄和性别。
参数:stu[] 数组指针,n 为总容量。
注意:每次调用前重置 count 为0,准备新一轮数据录入。

void input(struct student stu[],int n){
   int i;
   if(count!=0) count=0;
   printf("请输入学生基本信息(学号,姓名,年龄,性别(女w,男m))\n");
   for(i=0;i<n;i++)
      scanf("%d %s %d %c",&stu[i].number,stu[i].name,&stu[i].age,&stu[i].sex);
   printf("学生信息已录入");
}

第二步:查询学生信息 (seek)

目的:检索系统中存在的学生记录。
逻辑:用户选择“按学号”或“按姓名”。

  • 按学号:直接比对整型数值 stu[i].number == num2。
  • 按姓名:使用字符串比较函数 strcmp() 判断 stu[i].name == name2。
完成状态:找到则打印详情,否则提示“查无此人”。
case 1:{ //按学号查询
   scanf("%d",&num2);
   for(i=0;i<n-count;i++)
      if(stu[i].number==num2) break;
   if(i<n-count) printf("...学生信息...");
   else printf("\t查无此人\n");
}break;

第三步:删除学生信息 (delect)

目的:移除指定的学生记录并紧凑剩余数据。
风险提醒:此操作不可逆,建议在重要数据场景先进行备份或二次确认。代码中加入了 choice3 确认机制以防误删。
算法:找到目标索引 i 后,从 i+1 开始遍历,将后续元素向前移动一位覆盖当前位置 (stu[j]=stu[j+1]),并将全局计数器 count++ 以减少有效数据量。

第四步:学生信息排序 (sort)

目的:对学生列表进行有序排列,便于浏览或后续处理。
算法:采用经典冒泡排序法 (Bubble Sort)。
逻辑:

  • 按学号:比较 stu[i].number > stu[i+1].number。
  • 按姓名:比较 strcmp() 返回值是否大于0。
范围:仅对前 n - count 个有效学生进行排序,忽略已被标记删除的空位。

第五步:修改学生信息 (revise)

目的:更新特定学生的现有资料。
入口:必须首先输入正确的学号定位目标对象。
动作:定位成功后,提示用户确认,随后再次使用 scanf 将新数据直接覆盖原结构体字段。如果未找到匹配学号,则返回错误提示。

数据持久化与输出

数据输出 (output)

目的:验证当前内存中保留的有效数据。
操作:循环 n-count 次,格式化打印每个有效学生的四项属性。由于使用了紧凑存储逻辑,此处不会打印被删除学生留下的无效空位。

数据保存 (keep)

目的:将内存中的学生数据落盘,防止程序退出后数据丢失。
文件路径:默认硬编码为 D:\xsxx.txt。
操作:

  1. 使用 fopen("d:\\xsxx.txt","wt+") 打开或创建文件。
  2. 检查文件指针是否为 NULL,若失败则终止程序。
  3. 循环写入每一行数据,格式化为 %d\t%s\t%d\t%c\n。
  4. 调用 fclose(fp) 关闭文件流。
完成判断:控制台提示“文件已保存”。若磁盘根目录D不存在,该操作可能会失败,建议在实际使用时修改为当前工作目录相对路径。

总结

上述就是《C语言学籍管理系统》的详细内容,更多关于C语言学生管理开发资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表