多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

背景C语言实现学生管理系统:从零构建你的第一个控制台项目 [特殊字符]

背景C语言实现学生管理系统:从零构建你的第一个控制台项目 [特殊字符] 学生管理系统注此文章运用AL来辅助撰写引言功能介绍核心技术要点分析核心代码解读与避坑运行结果展示注此文章运用AL来辅助撰写引言为什么我们要手写一个学生管理系统对于每一位C语言初学者来说当学完指针、结构体和动态内存分配后总会面临一个“灵魂拷问”这些零散的知识点到底该怎么串起来答案往往藏在经典的控制台小项目中。学生管理系统作为C语言入门的“必修课”不仅涵盖了数组、结构体、函数封装等核心语法更考验我们对内存管理和程序逻辑的把控。今天我们就通过一段完整的C语言代码从零开始构建一个基础版的学生管理系统并在代码Review中探讨如何写出更优雅、更规范的C代码功能介绍 系统功能介绍本系统采用经典的菜单驱动Menu-Driven模式通过 while 循环不断接收用户输入核心功能包括以下五点添加学生101录入学生的姓名、学号、学分和年龄并追加到内存列表中删除学生102根据指定的位置下标从列表中移除对应学生查找学生103支持按“姓名”或“学号”两种方式进行精准检索显示所有学生105遍历当前内存中的学生列表格式化打印所有信息退出系统106结束程序运行核心技术要点分析 核心技术要点分析在深入代码之前我们先来看看这个系统用到了哪些C语言的核心技术•结构体struct建模使用 struct Student 将学生的姓名、学号、年龄、成绩等异构数据封装为一个整体这是面向对象思想在C语言中的初步体现•动态内存分配malloc摒弃了固定大小的静态数组使用 malloc 在堆区申请内存配合 size 变量动态记录当前学生数量提高了内存利用率•函数封装与指针传参将删除、查找、显示等操作封装为独立函数。特别是删除函数中通过传递 int *size 指针成功在函数内部修改了外部的数组长度•控制台编码处理代码开头使用了 system(“chcp 65001”)。这是一个Windows系统命令用于将控制台的活动代码页设置为 UTF-8。这能有效防止在中文环境下控制台输出出现乱码问题核心代码解读与避坑 核心代码解读与“避坑”指南这段代码虽然能跑起来但在命名规范和逻辑严谨性上有一些初学者常犯的典型问题。我们边看代码边分析结构体与动态数组初始化structStudent{charname[50];charstuID[50];intage;intscore;};// 在main函数中intlen10;structStudent*stuList(structStudent*)malloc(len*sizeof(structStudent));intsize0;这里我们预分配了10个学生大小的内存。size 变量作为“游标”始终指向下一个可插入的位置函数命名与功能不匹配的“小插曲” 在代码中我们看到了这样的函数定义intdeleteStudent(int*size,structStudentstu1[],charname[]){for(inti0;i*size;i){if(strcmp(stu1[i].name,name)0){returni;// 找到后返回下标}}return-1;}⚠️ 代码Review提示这个函数名叫 deleteStudent但它实际上并没有执行删除操作仅仅是返回了匹配学生的下标这是一个典型的“名不副实”。 改进建议在编程规范中函数名必须准确反映其行为。建议将其重命名为 findStudentByName同理 deleteStudentID 应改为 findStudentByID。真正的删除逻辑数组元素前移structStudentremoveStudent(int*size,intindex,structStudentstu1[]){intsi*size;if(indexsi||index0){printf(你输入的下标不对\n);returnstu1[0];// 越界时返回第一个元素作为占位}structStudentolddatestu1[index];for(intiindex;isi;i){stu1[i]stu1[i1];// 核心将后续元素整体前移}*size*size-1;// 通过指针修改外部sizereturnolddate;}这段代码展示了数组删除的核心原理覆盖。同时通过 *size *size - 1 巧妙地利用了传址调用。 ⚠️ 逻辑遗漏提示在 main 函数调用 removeStudent 后并没有对返回的 olddate 做任何处理比如打印“删除成功”。建议补全反馈信息提升用户体验运行结果展示完整代码显示#includestdio.h#includestring.h#includestdlib.hstructStudent{charname[50];charstuID[50];intage;intscore;};structStudentremoveStudent(int*size,intindex,structStudentstu1[]){intsi*size;if(indexsi||index0){printf(你输入的下标不对\n);returnstu1[0];}structStudentolddatestu1[index];for(intiindex;isi;i){stu1[i]stu1[i1];}*size*size-1;returnolddate;}intdeleteStudent(int*size,structStudentstu1[],charname[]){for(inti0;i*size;i){if(strcmp(stu1[i].name,name)0){returni;}}return-1;}intdeleteStudentID(int*size,structStudentstu1[],charinID[]){for(inti0;i*size;i){if(strcmp(stu1[i].stuID,inID)0){returni;}}return-1;}voidshowInfo(structStudentstu2){printf(【%s %s %d %d】\n,stu2.name,stu2.stuID,stu2.score,stu2.age);}intmain(){system(chcp 65001);intlen10;// Student stuList[len];// int *parr (int*)malloc(len*4);structStudent*stuList(structStudent*)malloc(len*sizeof(structStudent));intsize0;while(1){printf( 学生管理系统 \n);printf( 101: 添加学生 \n);printf( 102: 删除学生 \n);printf( 103: 查找学生 \n);printf( 105: 显示所有学生 \n);printf( 106: 退出系统 \n);printf( 请输入功能编号\n);intcid;scanf(%d,cid);if(cid101){printf( 请输入姓名 学号 学分 年龄\n);structStudentstu;scanf(%s,stu.name);scanf(%s,stu.stuID);scanf(%d,stu.score);scanf(%d,stu.age);stuList[size]stu;size;}elseif(cid105){for(inti0;isize;i){structStudentstustuList[i];showInfo(stu);}}elseif(cid102){intindex0;printf(请输入一个位置\n);scanf(%d,index);structStudentolddateremoveStudent(size,index,stuList);}elseif(cid103){printf(如果想查找学生名字就输入1\n);printf(如果想查找学生学号就输入2\n);intchoice;scanf(%d,choice);if(choice1){printf(请输入学生名字\n);charinname[10];scanf(%s,inname);intfindstudentdeleteStudent(size,stuList,inname);if(findstudent-1){printf(在管理系统里没有此人\n);}else{showInfo(stuList[findstudent]);}}elseif(choice2){printf(请输入学生学号\n);charinID[10];scanf(%s,inID);intfindstudentdeleteStudentID(size,stuList,inID);if(findstudent-1){printf(在管理系统里没有此人\n);}else{showInfo(stuList[findstudent]);}}}}}️ 运行效果展示程序启动后控制台会呈现如下清晰的交互流程学生管理系统101:添加学生102:删除学生103:查找学生105:显示所有学生106:退出系统请输入功能编号系统通过 scanf 接收输入利用 showInfo 函数将结构体数据格式化输出形成了一个完整的闭环交互101添加学生查看学生查找学生1查找名字2查找学号删除学生
返回列表