学习完C语言的基本课程,很多老师都会布置一个大作业,让同学们编写出学生信息管理系统。学生信息管理系统可以用来管理班级学生,对学生信息(包括姓名、性别、年龄、成绩等)进行增加、删除、更改、查询等操作。该系统主要有两种实现方案:第一种将学生信息直接保存在二进制文件中,当需要查询或者更新时,要能够使用文件操作函数精确定位学生信息;第二种使用数据结构中的链表,将学生信息暂时缓存在链表,如果有变化,才更新到文件。本节我们以第一种方案为例,搭建起学生信息管理系统的框架,将前面几节的知识综合运用起来。创建一个文件夹,命名为StuInfo,并添加以下几个文件:可以看到,我们将所有的头文件放在了include目录,将所有的源文件放在了module目录,而main.c作为主模块,直接放在了StuInfo目录。下面是对各个文件的说明:
1)main.c程序主模块,执行入口,会调用其他模块中的函数。
2)stu.c和stu.h该模块包含了程序的大部分代码,实现了对学生信息的增删改查操作。
3)tools.c和tools.h包含了一些通用的函数,比如文件复制、获取文件大小、数据插入、数据删除等与文件操作有关的函数(在《C语言文件操作》一章已经对它们进行了实现),这些函数不仅可以用于当前项目,也可以不加修改地移植到其他项目,通用性很强,不妨将它们称为工具型函数。
4)vars.c和vars.h定义了一些全局变量。比如文件指针fp、学生总数、文件长度等。
5)config.h配置文件,几乎都是宏定义,比如规定了学号的最大值、姓名的最大长度、成绩的最大值、文件路径等。下面给出了每个文件包含的简略代码。由于本节仅仅是演示,所以下面的代码不完整,我们将在《C语言项目实践》中讲解学生信息管理系统的具体编码。main.c源码:
#includestdio.h#includestdlib.h#include"./include/config.h"#include"./include/stu.h"#include"./include/vars.h"intmain(){init();//addStuInfo();//deleteStuInfo();//findStuByID();//findStuByName();fclose(fp);return0;}
stu.c源码:
#includestdio.h#includestdlib.h#includestring.h#include"../include/config.h"#include"../include/stu.h"#include"../include/tools.h"#include"../include/vars.h"//初始化voidinit(){//打开文件if((fp=fopen(FILENAME,"rb+"))==NULL(fp=fopen(FILENAME,"wb+"))==NULL){pause("Erroronopen%sfile!",FILENAME);exit(EXIT_FAILURE);}//获取文件长度fileSize=getFileSize(fp);}//添加学生信息voidaddStuInfo(){//finsert(fp,nPreEleCount*stuSize,stu,stuSize);pause("提示:添加成功!按任意键返回...");}//删除学生信息voiddeleteStuInfo(){//fdelete(fp,index*stuSize,stuSize);pause("提示:删除成功,按任意键返回...");}//修改学生信息voidalterStuInfo(){//fwrite(stu,stuSize,1,fp);pause("提示:修改成功,按任意键返回...");}//根据学号查询学生信息voidfindStuByID(){pause("错误:该学生信息不存在,查询失败!按任意键返回...");}//根据姓名查询学生信息voidfindStuByName(){pause("错误:没有查询到相关记录!按任意键返回...");}//根据成绩查询学生信息voidfindStuByScores(){pause("错误:没有查询到相关记录!按任意键返回...");}//显示所有学生信息voidshowAllStu(){pause("\n共有%d条学生信息,按任意键返回...",n);}
stu.h源码:
#ifndef_STU_H#define_STU_H//学生信息结构体typedefstruct_STU{intid;//学号charname[20];//姓名charsex[4];//性别intage;//年龄floatmath;//数学成绩floatcn;//语文成绩floaten;//英语成绩}STU;//初始化externvoidinit();//学生信息增删改查externvoidaddStuInfo();externvoiddeleteStuInfo();externvoidalterStuInfo();externvoidfindStuByID();externvoidfindStuByName();externvoidfindStuByScores();externvoidshowAllStu();#endif
tools.c源码:
#includestdio.h#includestdlib.h#includemath.h#includeconio.h#includestdarg.h//获取文件大小(以字节计)longgetFileSize(FILE*fp){longfsize;//TODO:returnfsize;}//文件复制函数longfcopy(FILE*fSource,longoffsetSource,longlen,FILE*fTarget,longoffsetTarget){longnBytes=0;//总共复制了多少个字节//TODO:returnnBytes;}//向文件中插入内容intfinsert(FILE*fp,longoffset,void*buffer,intlen){//TODO:return0;}//从文件中删除内容intfdelete(FILE*fp,longoffset,intlen){//TODO:return0;}//暂停程序voidpause(constchar*str,...){va_listvl;charbuf[]={0};va_start(vl,str);vsnprintf(buf,,str,vl);va_end(vl);printf(buf);getch();printf("\n");}
tools.h源码:
#ifndef_TOOLS_H#define_TOOLS_HexternlonggetFileSize(FILE*fp);//获取文件大小externlongfcopy(FILE*fSource,longoffsetSource,longlen,FILE*fTarget,longoffsetTarget);//文件内容复制externintfinsert(FILE*fp,longoffset,void*buffer,intlen);//向文件中插入数据externintfdelete(FILE*fp,longoffset,intlen);//删除文件内容externvoidpause(constchar*str,...);//暂停程序#endif
vars.c源码:
FILE*fp=NULL;//文件指针intstuCount=0;//总共有多少条学生信息longfileSize=0;//文件长度(占用的字节数)
vars.h源码:
#ifndef_VARS_H#define_VARS_HexternFILE*fp;externintstuCount;externlongfileSize;#endif
config.h源码:
#ifndef_CONFIG_H#define_CONFIG_H#defineFILENAME"stu.data"//保存学生信息的文件名称(含路径)#defineMAX_STU_ID99//学号的最大值#defineMAX_STU_NAME10//姓名的最大长度#defineMAX_STU_AGE//年龄的最大值#defineMAX_STU_MATH//数学成绩的最大值#defineMAX_STU_EN//英语成绩的最大值#defineMAX_STU_CN//语文成绩的最大值#endif预览时标签不可点收录于话题#个上一篇下一篇