学生成绩管理系统-C语言程序设计(5)
时间:2026-01-21
时间:2026-01-21
行删除学生记录操作;若选择3,则调用Qur()函数,执行查询学生记录操作;若选择4,则调用Modify()函数,执行修改学生记录操作;若选择5,则调用Insert()函数,执行插入学生记录操作;若选择6,则调用Tongji()函数,执行统计学生记录操作;若选择7,则调用Sort()函数,执行按降序排序学生记录操作;若选择8,则调用Save()函数,执行将学生记录存入数据文件的操作;若输入为0~8之外的值,则调用Wrong()函数,给出按键错误的提示。
2.2.3 输入记录模块
输入记录模块主要实现将数据存入单链表中。当从数据文件中读出记录时,调用fread(p,sizeof(Node),1,fp)文件读取函数,执行一次从文件中读取一条学生成绩记录信息存入指针变量p所指的节点中的操作,并且该操作在main()函数中执行,即当成绩管理系统进入显示菜单界面时,该操作已经执行了。若该文件中没有数据,系统会提示单链表为空,没有任何学生记录可操作,此时,用户应选择1,调用Add()函数,进行学生记录的输入,即完成在单链表l中添加记录的操作。值得一提的是,这里的字符串和数值的输入分别采用了函数来实现,在函数中完成输入数据任务,并对数据进行条件判断,直到满足条件为止,这样一来,大大减少了代码的重复和冗余,符合模块化程序设计的特点。
2.2.4 查询记录模块
查询记录模块主要实现了在单链表中按学号或姓名查找满足相关条件的学生记录。在查询函数Qur(l)中,l为指向保存了学生成绩信息的单链表的首地址的指针变量。为了遵循模块化编程的原则,我们将在单链表中进行的指针定位操作,设计成了一个单独的函数 Node *Locate(Link l,char findmess[],char nameornum[]),参数findmess[]保存要查找的具体内容,nameornum[]保存要查找的字段(值为字符串类型的name或者num),若找到该记录,则返回指向该节点的指针;否则,返回一个空指针。
2.2.5 更新记录模块
此模块主要实现了对学生记录的修改、删除、插入和排序操作。因为学生记录是以单链表的结构形式存储的,所以这些操作都在单链表中完成。下面分别介绍着4个功能模块。
① 修改记录。该操作需要对单链表中目标节点的数据域中的值进行修改,它分两步完成。 第一步,输入要修改的学号,输入后调用定位函数Locate(),在单链表中逐个对节点数据域中学号字段的值进行比较,直到找到该学号的学生记录; 第二步,若找到该学生记录,修改除学号字段之外的各字段值,并将存盘标记变量saveflag置1,表示已经对记录进行了修改,但还未执行存盘操作。 ② 删除记录。该操作完成删除指定学号或姓名的学生记录,它也分两步完成。
第一步,输入要删除的学号或姓名,输入后调用定位函数Locate(),在单链表中逐个对节点数据域中学号或姓名字段的值进行比较,直到找到该学号或姓名的学生记录,则返回指向该学生记录的节点指针;
第二步,若找到该学生记录,将该学生记录所在节点的前驱节点的指针域,指向目标节点的后继节点。
③ 插入记录。该操作完成在指定学号的随后位置插入新的学生记录。首先,要求用户输入某个学生的学号,新的记录将插入在该学生记录之后;然后,提示用户输入一条新的学生记录的信息,这些信息保存在新节点的数据域中;最后,将该节点插入在指定位置学号之后。它的具体插入执行过程如图2.3所示,图中q为位置学号所在节点的指针变量,p为q所指节点的后继节点的指针变量,q->next=p,指针变量i指向新记录所在的节点,即为插入节点i,依次执行的操作为:① i->next= q->next;② q->next=i。
④ 排序记录。有关排序的算法很多,如冒泡排序、插入排序等。针对单链表结构的特点,我们采用插入排序算法实现按总分的从高到低对学生记录进行排序,排序完成之后,即可按顺序给名次字段赋值。在单链表中,实现插入排序的基本步骤如下:
1) 新建一个单链表l,用来保存排序结果,其初始值为待排序单链表中的头节点。 2) 从待排序单链表中取出下一个节点,将其总分字段值与单链表l中的各节点中总
分字段的值进行比较,直到在链表l中找到总分小于它的节点。若找到此节点,系统将待排序链表中取出的节点插入此节点前,作为其前驱。否则,将取出的节点放在单链表l的尾部。
3) 重复第二步,直到从待排序链表中取出的节点的指针域为NULL,即此节点为链
表的尾部节点,排序完成。
2.2.6 统计记录模块
主要通过循环读取指针变量p所指的当前节点的数据域中各字段的值,并对各个成绩字段进行逐个判断的形式,完成单科最高分学生的查找和各科不及格人数的统计。
2.2.7 输出记录模块
当把记录输出至文件时,调用fwrite(p,sizeof(Node),1,fp)函数,将p指针所指节点中的各字段值,写入文件指针fp所指的文件。当把记录输出至屏幕时,调用void Disp (Link l)函数,将单链表l中 的学生记录信息以表格的形式在屏幕上打印出来。
2.2.8 函数功能描述
printheader()
函数原型:void printheader()
printheader()函数用于在以表格形式显示学生记录时,打印输出表头信息。
printdata()
函数原型:void printdata(Node *pp)
printdata()函数用于在以 …… 此处隐藏:855字,全部文档内容请下载后查看。喜欢就下载吧 ……
上一篇:保险公司决战四季度战报模板8页