C语言学生信息管理系统程序与报告

更新时间:2024-04-21 07:51:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

姓 名:院(系):地空学院指导教师:评 阅 人:

C程序课程设计

学生成绩管理系统的设计与运行

_______ 学号:____________ 专业:地球信息科学 职称: 职称: 2012 年 1 月

目 录

第一章 程序设计课题:学生信息管理系统????????????? (1)

§1.1程序设计题目??????????????????????(1) §1.2程序设计要求??????????????????????(1)

第二章 学生信息管理系统内容及结构??????????????? (1)

§2.1结构和流程图部分????????????????????(1)

第三章 学生信息管理系统运行示例 ????????????????(7)

§3.1运行结果截图展示????????????????????(7)

第四章 程序设计实习感想 ??????????????????? (17)

附录 源代码和注释??????????????????????(18)

参考文献 ??????????????????????????? (46)

2012.1 中国地质大学论文 1

第一章 程序设计课题:学生信息管理系统

§1.1 程序设计题目

课程设计题目:学生信息管理系统设计

通过《学生信息管理系统》项目的实际编程操作训练,让同学们掌握对实际工程项目的开发与设计的基本方法与步骤,掌握结构体数组、分支结构、循环结构、顺序结构程序设计、函数调用的思想,在日后的工作和学习中能够更加熟练地运用所学的知识。 提高学生们的实际操作能力。

§1.2 程序设计要求

界面要求:有简单操作界面, 用户可以通过数字选择不同的功能. 功能要求:

(1) 录入成绩.(建立链表,每个结点包括:)

(2)学生信息包括学号、姓名、数学、物理、英语、计算机、总分。 (2) 输出成绩.(链表的输出)

(4)排序信息(可以按学号排序、按总分排序) (5)查找成绩.(按学号或姓名查找结点) (6)删除信息(按学号或者姓名删除结点)

2 黄泽华:学生信息管理系统的设计 2012.1 (7)添加信息(按学号顺序插入结点,) (8)保存到文件, 以及从文件中读出.

第二章 学生信息管理系统内容及结构

§2.1 结构和流程图部分

本系统在编辑过程中一共定义了28个函数以实现菜单、输入数据,查询信息,删除信息,修改信息,阅读信息,排序和文件处理八个主要的功能,各个不同的功能的函数的调用通过一个main()主函数和四个其他的菜单函数实现功能的选择和切换。各个部分详细如下:

2012.1 中国地质大学论文 3 进入学生信息管理系统 退出系统 进入主目录 开始输入学生信息 从原文件中录入学生信息 显示学生的信息 是 是否编辑信否 返回排序学生信息 查询学生信息补充学生信息按学号排序按年龄排序录返回目删除该生在列表中插入在列表末补充按单科成绩排序按总分排序 保存信息 显示学生信息 返回主目录 是 是否保存 否 退出

4 黄泽华:学生信息管理系统的设计 2012.1 全部系统流程图

1.输入部分:

在编辑程序之处,根据程序的基本要求能够录入学生的学号、姓

名、年龄、数学、物理、英语、计算机四门成绩,同时还考虑到在后期的数据处理中需要计算和显示出每一个学生的总分成绩并建立结点以链表的形式存入电脑中,所以在开始的结构体中我定义了一个long int型num变量存入学号,一个字符数组name存入学生姓名,一个整形age,五个浮点型和为了构建链表用于指向下一个结点地址的struct student型指针变量,student型结构体在全部的系统中都会被引用,所以定义为全局变量。同时定义一个整形变量n作为计数器用于计算总共的学生数目,其中n会在插入函数,查询函数和删除函数中作为循环的总次数多次使用。

P1 Hea10101 成绩 10103 成绩 NULL n=

P2 next

在输入函数中先定义了一个结构体型指针head,作为建立链表的首地址,同时也作为creat函数的返回值,是实现其他的函数在创建

2012.1 中国地质大学论文 5 链表中实现各种功能的地址。在输入数据过程中,默认学号不为零,采用if??else进行判断,如果学号的值扫描为0则终止输入,返回主菜单,不为一使用malloc创建新的结点,由已经定义的指针p1指向,根据p1对结构体进行赋值,赋值完毕后已定义的指针p2此时指向该节点的上一个结点,把p1所指向的新地址赋给上一个结点的next,使链表各结点间相联系,建立保存有学生信息的链表,每输入一次,整形变量n自增,计数学生。

开辟一个新结点是p1、p2指向新结点 读入一个数据给p1指向的结点 真 P1->num=0 假 n=n+1 真 n=1 Head=p1 p2=p1 P2->nexy=p1 假 尾结点是NULL,退出

输入函数流程图

6 黄泽华:学生信息管理系统的设计 2012.1 2.输出部分

输出函数定义为无返回值(void)型,首先把所需输出链表的首

地址head传递给输出函数的形参,定义一个do??while循环,判断循环条件是next的地址不为NULL,把首地址head复制给指针p1,通过printf输出每一个结点信息,p1再根据next中存放的地址指向下一个结点输出,当读入最后一个结点时,next为空,循环终止,函数结束。

P=head 假 输出结点 P指向尾结点 真 P=p->next 输出函数流程图

退出

输出函数仅输出链表内容,不作修改,其他也无功能。

3.排序部分

在本系统中排序功能部分一共定义了7函数sort个以实现从学号

到年龄以及单科成绩和总分的不同排序方式。

以按学号排序为例。在排序中使用了冒泡法排序,根据冒泡法原

理,当p2->num大于p1->num时,数据交换,但因为结构体不是数组,需要从学号,姓名到成绩的全部交换,所以在函数开始定义了一个swap交换函数,并在swap函数中定义了一个struct student类型的

2012.1 中国地质大学论文 7 形参作为中间变量,以交换比较的两个结点的值,swap用于嵌套在sort函数中实现排序功能,然后把p1的地址赋给p2,p1指向下一个结点再次比较,当p1指向最后一个结点,重新把head赋给p1和p2,循环n-1次后实现排序。排序结束之后,所有学生的顺序按照学号的升序排列,排列完后,返回所需排列的链表首地址,嵌套输出函数print输出结果。

其他的排序函数原理与学号排序基本一致。 在排序函数中改变了原来链表中的

4.查询部分

本系统为了使用方便同样定义了8个函数search以实现学号,姓

名及各科成绩的查找。在查找中,首先把查找链表的首地址head传递进入search函数的形参,search函数中又定义了一个变量(根据不同的函数查找功能的不同而变化,如学好查找就定义long int型)函数search根据首地址进行读取,用if??else函数进行判断,如果head= =NULL则直接输出链表空置,请补充信息,其余状况才实现继续扫描。其实现过程实质是链表的遍历及按条件输出的结果。当结点的 num 成员与用户的输入值吻合时,则输出该结点的信息,否则则扫描下一个结点的信息,依次类推。当所有的结点均被扫描但仍未发

8 黄泽华:学生信息管理系统的设计 2012.1 现吻合的 num值时,会提示“不存在的信息”,并跳转到主菜单以实现重新操作。如果发现吻合的信息,用printf函数输出该结点的信息,即为我们所需要查找学生的信息,此时查找终止,返回主菜单。

5.补充信息部分

在本系统中,补充信息包括在链表中间插入信息,和在链表尾部在查询函数中不改变原来连表内部保存的数值信息。

补充信息两种方式,虽然两种函数不同的运行结果可以通过排序函数实现最终输出和保存结果一致,但是再补充信息过程中还是可以更方便的完成。

在插入函数insert中首先定义两个指针,一个用于传递得到的需要插入数据的链表的首地址,另一个用于指向存放待插入信息变量的地址,如果首地址空置(即head= =NULL)则令首地址为p0=stud。函数内定义的指针首先根据num大小的排列顺序,把各个结点中的num与带插入信息stud中的num进行比较,当num小于stud.num时,p=p->next依次向后对比,直到stud.num介于前后的num元素大小之间时,新定义一个指针p0=stud,并把p0的地址赋值给上一个结点的next成员,并把下一个节点的地址赋给p0->next,这样行的信息就成

2012.1 中国地质大学论文 9 功的按照学好顺序插入了链表之中。插入函数一件改变了链表内部的储存信息,因此返回一个head值(如果原来的head= =NULL,则head值改变)用于其他的函数使用该链表。

在链表尾部添加信息的函数定义为add,add函数的功能是在链表

的末尾添加学生的信息结点,首先使用整形变量n的值读出学生总数,把n的值代入for的循环语句,使指针p指向已存在链表的最后一个结点,新建一个结点输入所需要添加的信息,把新结点地址赋给p->next,新结点的next暂时令其为NULL,直至需要再一次的添加结点时,循环以上过程,即可在链表尾部加入新的信息结点。

6.删除信息部分

删除信息部分包括一个查询模块和一个执行删除函数,删除函数

是根据学生的学号查询学生的信息进行删除操作,因此在删除之前如果不知道学号可以根据查询功能首先进行查询,得到具体的信息之后读取学号,进行删除。

先定义指针p1根据链表的首地址进行扫描,如果首地址为空置,

10 黄泽华:学生信息管理系统的设计 2012.1 则输出“学生信息为空,请输入信息”,不为空置则把扫描过程放入一个while的循环之中,扫描结果和输入的结果不吻合p1根据p->next指向下一个的结点,如果一致则修改上一个结点的next地址使其指向下一个结点,跳过所删除的结点之后free(p),这样就成功的删除了该节点,是指在以后的排序、查询、阅读信息中不再显示出来。

P1=head 真 链表为空 假 num=p1->num 假 P2=p1 P1=p1->next 真 P1是删除结点 真 Head=p1->next P1是首结点 假 P2->next=p1->next 退出 删除函数流程图

删除成功

9.文件处理部分:

这一部分主要有读出函数(load)和保存函数(save)两个函数。 Save() 函数可将链表信息写为文本文件保存在硬盘中,保存的文件名为file.txt 。load()函数可实现将以前保存的 file.txt 文件读出,并返回首地址head,根据返回值head(保存链表读入内存之后的首

2012.1 中国地质大学论文 11 地址)代入其他的查询、删除、排序函数中进行其他的操作处理,实现信息的反复使用。

10.菜单部分:

菜单函数在本程序中是实现各个不同的功能的函数之间的反复调

用,因此是实现系统运行的很重要的部分。在本系统中为了实现操作界面的简单化,一共设计了4个菜单函数,首先是主菜单函数,主菜单函数显示出了输入、读取文件、查询、删除、补充、输出、排序、退出、和保存文件九个个主要的功能。

因为在设计函数时,为了让函数之间可以彼此调用,实现功能的模块化,我选择了每一个函数都返回所处理的链表的首地址,因此定义的是返回指针的函数,因此在主函数中定义了struct student型指针变量head用于接受每个函数返回的地址,同时定义一个新的整形变量用于录入使用者的选择,代入switch函数进行判断从而调用不同功能的函数,在本系统中默认输入0为返回主目录,便于进行其他的操作。

第三章 学生信息管理系统运行示例

12 黄泽华:学生信息管理系统的设计 2012.1 §2.1 运行结果截图展示

打开系统选择1进入主目录

2012.1 中国地质大学论文 13 在目录中选择(1)一输入学生信息

按学号、姓名、年龄各科成绩依次输入5个学生的信息

当输入学号为零,系统判断输入完毕返回主菜单,选择6可以查看我们输入的学生信息。

14 黄泽华:学生信息管理系统的设计 2012.1

在主目录中选择保存功能函数,我们把刚才输入的信息以文本文档保存下来

为了检测系统的保存和读取功能,我们打开刚才的文件,显示的是刚才输入的5个学生信息,保存和读取成功。

2012.1 中国地质大学论文 15

现在我们在上次的基础上继续输入学生信息。

输入20107号学生孙皓,添加成功

16 黄泽华:学生信息管理系统的设计 2012.1 现在我们发现没有学号为20104的学生,要插入信息中

大家可以看见学号为20104的学生刘禅成功的插入了链表之中

接下来我想要查询某一位学生的信息,返回主菜单,进入查询功能页面

2012.1 中国地质大学论文 17

这里安排了多种查询方式,下面主要演示

按姓名查询、按学号查询和按数学成绩查询,其他的几种查询函数基本一致,就不做演示。

18 黄泽华:学生信息管理系统的设计 2012.1

2012.1 中国地质大学论文 19

为了便于查看信息,我们把学生信息进行排序查看

20 黄泽华:学生信息管理系统的设计 2012.1 首先按学号进行降序排序

再按数学成绩由高到低进行排序,两次排序均成功,其他的排序类似不做演示

2012.1 中国地质大学论文 21

这时删除一个学生的信息,进入删除功能

22 黄泽华:学生信息管理系统的设计 2012.1

成功删除学号为20101的刘备同学,本次更改结束,把修改结果保存

以message为文件名保存为文本文档

保存成功

2012.1 中国地质大学论文 23

操作完毕后我们退出学生信息管理系统,谢谢您的使用。

第四章 程序设计实习感想

进入本学期以来,我们开始学习C语言课程,这是对于计算机的

学习与使用过程中极为重要的一门课程。本次实习经历,让我对于C语言的理解不仅仅局限在了书本上,而且获得了一次难得的机会去实践所学内容,综合运用一个学期所学习的知识,进行一次系统而复杂的程序编写工作,提高了自己的编程能力,加深了我对与C语言的理解,同时积累了可贵的编程经验,获益匪浅。其中有几点很大的收获如下:

首先,C语言是一门实践性的课程,只是学习书本知识是远远不

24 黄泽华:学生信息管理系统的设计 2012.1 够熟练的掌握它的,要想充分的理解和运用C语言,我们不仅仅需要理解每一个语句的含义和使用方法,而且要通过大量的编写程序来熟练的使用他。而本次实习课程正是为我们创造了这样的条件。学生信息管理系统就目前阶段而言,对我们来说是比较复杂的一个系统,在编写系统过程中,为了实现我们想要的各种功能,我几乎用到了所有的学习过的内容,这一次程序编写是对自己C语言的一次综合考察,全面的测试了自己的学习情况,我就在本次事件中了解到了自己结构数组的知识还不够熟练,有待提高。

其次,本次实习我深刻的学习到了计算机编程的思想,即把复杂

的问题简单化,这一种处理问题的思想在本系统中定义的许多函数中都有体现,如删除函数,查找函数,排序函数,其中以排序函数体现的尤为突出。以按学号排序为例,若干个学号按序号由大到小排序看似复杂,因为学号数目众多而且计算机功能有限,利用基本的语句只能实现两个数据的大小比较,所以看上去很复杂,但是在实习课程中,我学会了冒泡法比较大小,他把复杂的比较进行了简单化,首先比较相邻两个数据的大小,利用指针这个工具,如果不满足我们所要求的大小顺序,就把相邻的两个数值进行交换,然后指针指向下一个结点在比较下面两个数据的大小,进行n-1次循环之后数组就会按大小顺序排列好。这是一种非常好的排序方式,但是他更加体现了化繁为简

2012.1 中国地质大学论文 25 的思维方法,把n个值的比较化为了两个值的比较,从而进行排序,这种方法就像撬动地球的支点一样,用微小的力完成了巨大的工作。这种方法费城值得借鉴。

第三,程序模块化设计的方法,在本次系统设计之中,处处体现着这一种思想,想染大量的定义和使用函数让主程序更加的清晰和简单化,同时还可以通过增加和减少,改变函数的内容来修改整个系统的功能和运行情况,而不回影响到其他的程序的运行。编写的程序在一定的条件下可以实现重复使用大大减少了所需要编写的程序的数量,极大的方便了我们的程序编写工作。学习编写和调用函数是我们在熟练使用计算机语言过程中必不可少了的一项能力。

第四,整体思想,在模块化思想的基础上整体思想极为重要,因为要把如此众多的函数反复的调用,许多的模块都不再是单一的完成该项功能,他还需要与其他的函数相配合完成该项功能,因此许多的语句都有很重要的意义,比如输出函数本不需要返回值,但是为了配合全部的函数同样定义为了一个返回指针的函数

最后,在实习过程中,我锻炼了自己解决问题的能力,编写程序往往会出现很多的问题导致无法运行,或者应有的功能无法实现,折

26 黄泽华:学生信息管理系统的设计 2012.1 旧需要我们深刻的理解每一个语句的含义从中找到问题,并加以改正,这一次实习我充分经历了这样的过程,提高了自己,现在已经基本能够迅速发现各种问题,加深了常见的集中错误的影响,为以后的进一步的学习和实践提供了基础。

附录: 程序源代码及注释

#include #include #include #include

int n;

struct student { };

//插入学生信息的函数

struct student *insert(struct student *head, struct student *stud);

//交换两个结点信息的函数,用于排序函数调用 void swap(struct student *p1, struct student *p2);

//定义一个整形变量计数学生人数

//定义一个结构体作为全局变量,用于存储学生信息,和作为结点

//学号 //姓名 //年龄 //数学

long int num; char name[10]; int age; float math; float phy; float eng; float cpu;

float sum; struct student *next;

//下一个结点地址

2012.1 中国地质大学论文 27 //输入信息的函数 struct student *creat(void);

//输出信息的函数

void print(struct student *head);

//添加学生信息

struct student *add(struct student *head, struct student *stu);

//读取

struct student *load(struct student *head);

//查询模块 //1.按学号查询

struct student *search1(struct student *head);

//2.按姓名查询

struct student *search2(struct student *head);

//3.按年龄查询

struct student *search3(struct student *head);

//4.按数学成绩查询

struct student *search4(struct student *head);

//5.按物理成绩查询

struct student *search5(struct student *head);

//6.按英语成绩查询

struct student *search6(struct student *head);

//7.按计算机成绩查询

struct student *search7(struct student *head);

//8.按总分成绩查询

struct student *search8(struct student *head);

//保存模块

int save(struct student *p1);

28 黄泽华:学生信息管理系统的设计 2012.1 //删除模块 struct student *del(struct student *head);

//排序模块 //1.按学号排序

struct student *sort1(struct student *head);

//2.按年龄排序

struct student *sort2(struct student *head);

//3.按数学成绩排序

struct student *sort3(struct student *head);

//4.按物理成绩排序

struct student *sort4(struct student *head);

//5.按英语成绩排序

struct student *sort5(struct student *head);

//6.按计算机成绩排序

struct student *sort6(struct student *head);

//7.按总分成绩排序

struct student *sort7(struct student *head);

//主目录函数 int menu() {

int k; //定义一个整形变量用于输入选择

printf(\

printf(\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\

2012.1 中国地质大学论文 29 }

printf(\ 9.退出 *\\n\printf(\printf(\我的选择:\ //在显示器上显示菜单页面 scanf(\ //输入选择 getchar(); return(k);

//返回值进入switch函数判断,以调用不同功能的函数

//3.查询信息菜单

struct student *menu3(struct student *head) {

printf(\

printf(\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(\ 9.返回主菜单 *\\n\printf(\printf(\我的选择:\ //输出菜单界面 scanf(\ switch(k) {

case 1: {

} case 2: {

//调用学号查询函数

//返回首地址head用于其他函数的处理 //处理完毕,结束语句 //调用姓名查询函数

//输入选择

int k;

//定义一个整形变量输入switch进行判断

head=search1(head); break;

30 黄泽华:学生信息管理系统的设计 2012.1 }

head=search2(head); break;

//返回首地址head用于其他函数的处理 //处理完毕,结束语句 //调用年龄查询函数

//返回首地址head用于其他函数的处理 //处理完毕,结束语句 //调用数学成绩查询函数

//返回首地址head用于其他函数的处理 //处理完毕,结束语句 //调用物理成绩查询函数

//返回首地址head用于其他函数的处理 //处理完毕,结束语句 //调用英语成绩查询函数

} case 3:

{

head=search3(head); break;

}

case 4:

{

head=search4(head); break;

}

case 5:

{

head=search5(head); break;

} case 6:

{

head=search6(head); break;

//调用计算机成绩查询函数

} case 7:

{

head=search7(head); break;

//调用总分成绩查询函数

} case 8:

{

head=search8(head); break;

}

case 9:break; //退出查询功能,返回主菜单 default:printf(\输入错误请重试\\n\}

return head;

//5.补充信息菜单

2012.1 中国地质大学论文 31 struct student *menu5(struct student *head) {

int k;

//定义一个整形变量输入switch进行判断

struct student *stu=0; struct student stud; printf(\

//用于输入插入学生的信息

printf(\printf(\ 补充学生信息目录 *\\n\printf(\ 1.在列表尾部添加学生信息 *\\n\printf(\ 2.在列表中间插入学生信息 *\\n\printf(\ 3.返回主菜单 *\\n\printf(\printf(\我的选择:\ //菜单界面 scanf(\ switch(k) { case 1: { } case 2: {

printf(\请输入插入的学生的学号(输入0退出):\

//输入选择项

head=add(head, stu);

break; //调用添加函数,把返回地址赋给head

//结束语句

loop4:

scanf(\输入学号 if(stud.num==0)printf(\请根据主目录内容重新选择功能\判断学号是否为零,为零返回主菜单

else {

//不为零,输入其他信息

//再次判断,小于零则重新输入

if(stud.num<0) goto loop4; else {

printf(\请输入学生姓名:\输入学生信息

scanf(\

printf(\请输入学生年龄和数学、物理、英语、计算机成绩:\

scanf(\&stud.age, &stud.math, &stud.phy, &stud.eng,

32 黄泽华:学生信息管理系统的设计 2012.1 &stud.cpu);

}

}

}

stud.sum=stud.math+stud.phy+stud.eng+stud.cpu;//计算总分 head=insert(head, &stud);//调用插入函数,把stud结点放入链表中 break;

case 3: {

break; //跳出,返回主目录

}

default:printf(\输入错误请重试\\n\ }

print(head); return head;

//其他选项显示错误

}

//7.排序信息菜单

struct student *menu7(struct student *head) {

int k; //定义一个整形变量输入switch进行判断

struct student *stu=0; printf(\

printf(\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(\printf(\我的选择:\ //输出菜单界面 scanf(\ switch(k) {

//输入选择 //判断

2012.1 中国地质大学论文 33 case 1: { head=sort1(head);

break;

} case 2: { head=sort2(head); break;

}

case 3:

{ head=sort3(head); break;

} case 4:

{ head=sort4(head);

break;

}

case 5: { head=sort5(head); break;

}

case 6: { head=sort6(head); break;

}

case 7: {

head=sort7(head);

break; }

case 8:break; default:printf(\输入错误请重试\\n\

}

return head;

}

//按学号排序,调用学号排序函数 //跳出

//按年龄排序,调用年龄排序函数

//按数学成绩排序,调用数学成绩排序函数

//按物理成绩排序,调用物理成绩排序函数

//返回主菜单

34 黄泽华:学生信息管理系统的设计 2012.1

//主函数

main() { struct student *head=0, *stu=0; int k, a; loop1:

printf(\printf(\ *\\n\printf(\ *\\n\printf(\ *\\n\printf(\ 学生信息管理系统 2011版 *\\n\printf(\ *\\n\printf(\ 开发人员:黄泽华 *\\n\printf(\ 责任单位:064102 *\\n\printf(\ 1.进入 *\\n\printf(\ 2.退出 *\\n\printf(\printf(\我的选择:\scanf(\ //输入选择 if(a==1) {

//进入系统

//使用循环,在完成一个

//调用主目录函数

//定义录入选择的整形变量

while(1) {

k=menu();

switch(k) { case 1:head=creat();break; //调用输入函数创建新的链表,返回新链表的首地址供其他函数调用 case 2:head=load(head);break;//读取信息函数

case 3: { //调用查询信息菜单函数,并进一步调用各个查询函数

} {

head=menu3(head); break;

case 4:

head=del(head); print(head); break;

//调用删除函数返回首地址 //根据删除函数返回的地址输出结果

2012.1 中国地质大学论文 35

} else { }

}

} case 5: { //调用补充信息菜单函数,并进一步调用插入和添加函数

head=menu5(head);

break;

}

case 6:print(head);break; //输出函数,显示信息

case 7: { //调用信息排序菜单函数,并进一步调用各种排序函数

head=menu7(head); break;

}

case 8:save(head);break; //调用保存文件函数 case 9:goto loop1;break; //返回登录界面 case 0:exit(0); //退出 default:printf(\输入错误请重试\\n\}

printf(\您是否确认退出?(y/n)\ //确认退出程序 getchar();

if(getchar()=='n') goto loop1;

else printf(\请按任意键退出\\n\

}

//在列表中间插入学生信息

struct student *insert(struct student *head, struct student *stud) { //插入信息函数,定义为返回指针的函数,便于其他函数使用其结果

struct student *p0, *p1, *p2; p1=head; p0=stud; {

head=p0;

p0->next=NULL;

//定义三个结构体指针变量 //p1指向首地址

//p2指向带插入的结点

//判断链表是否为空

if(head==NULL)

36 黄泽华:学生信息管理系统的设计 2012.1 }

} else {

while((p0->num>p1->num)&&(p1->next!=NULL))//判断每个节点中学号的大小 {

p2=p1; p1=p1->next;

//找到结点前一个大于插入结点,后一个小于插入结点

}

if(p0->num<=p1->num) {

if(head==p1) { head=p0;

//如果P1是首结点,改变head地址

p0->next=p1; } else { }

p2->next=p0; p0->next=p1;

//如果p1不是首结点,改变next插入结点

} else {

//如果插入结点大于所有的原结点则放在链表末尾

p1->next=p0; p0->next=NULL;

} }

n=n+1; return(head);

//插入一个学生,n自增一次

//返回已改变链表的地址用于其他的函数处理

//交换

void swap(struct student *p1, struct student *p2) //交换函数,用于冒泡法的排序函数中 {

int k, d; char a[10];

//把新定义的num变量作为中间变量交换

//定义各种交换的中间变量

float temp; k=p1->num; swap函数中的前后两个变量的学号信息

2012.1 中国地质大学论文 37

p1->num=p2->num; p2->num=k;

strcpy(a, p1->name); strcpy(p2->name,a);

d=p1->age; p1->age=p2->age; p2->age=d;

temp=p1->math;

//交换成绩信息,采用一个同类型中间变量,过程同上

//交换姓名信息,采用一个同类型中间变量,过程同上

strcpy(p1->name, p2->name);

//交换年龄信息,采用一个同类型中间变量,过程同上

p1->math=p2->math; p2->math=temp;

temp=p1->phy; p1->phy=p2->phy; p2->phy=temp;

temp=p1->eng; p1->eng=p1->eng; p2->eng=temp;

temp=p1->cpu; p1->cpu=p2->cpu; p2->cpu=temp;

temp=p1->sum;

//交换成绩信息,采用一个同类型中间变量,过程同上

//交换成绩信息,采用一个同类型中间变量,过程同上

//交换成绩信息,采用一个同类型中间变量,过程同上

//交换成绩信息,采用一个同类型中间变量,过程同上

p1->sum=p2->sum;

p2->sum=temp;

}

//输入

struct student *creat(void) {

struct student *head; struct student *p1, *p2; n=0;

head=NULL;

p1=p2=(struct student *)malloc(sizeof(struct student)); //malloc创建新的结点

//定义输入函数,为了方便调用定义返回值为首结点地址

38 黄泽华:学生信息管理系统的设计 2012.1

while(1) {

//使用while循环一边输入多个学生信息 printf(\请输入学生资料*\\n\printf(\

printf(\请输入学生学号(输入0退出):\scanf(\if(p1->num==0) goto loop3; else {

}

printf(\请输入年龄、数学、物理、英语、计算机成绩并以空格隔开(0-100):\

scanf(\scanf(\

scanf(\//输入各项信息 p1->sum=p1->math+p1->phy+p1->eng+p1->cpu; n=n+1; if(n==1) head=p1; else { p2->next=p1;

//计算总分

//学号为零则默认退出

//连接上下两个结点

p2=p1;

} p1=(struct student *)malloc(sizeof(struct student)); 的结点输入下一个学生信息 } loop3: p2->next=NULL; }

return(head);

//输入完毕新建一个新

//输出

void print(struct student *head) {

//赋给函数首地址,根据地址输出链表

struct student *p;

printf(\已录入%d个学生的记录是:\\n\

printf(\****\\n\

2012.1 中国地质大学论文 39 printf(\学号\\t姓名\\t年龄\\t数学\\t物理\\t英语\\t计算机\\t总分\\n\ printf(\____\\n\输出格式

p=head;

if(head!=NULL) do

{

//输出信息

printf(\p->num, p->name, p->age, p->math, p->phy, p->eng, p->cpu, p->sum); p=p->next;

printf(\

//当到达最后一个结点停止

//链表为空输出

____\\n\ }while(p!=NULL); }

//添加学生信息

else printf(\没有任何学生的信息\\n\

struct student *add(struct student *head, struct student *stu) 信息地址 {

struct student *p0, *p1, *p3; int i;

p3=stu=(struct student *)malloc(sizeof(struct student)); printf(\请输入要增加的学生的信息:\printf(\请输入学生学号(学号大于0):\scanf(\if(stu->num==0) goto end2; else {

p3=head; if(n>0) {

for(i=0; i

p3=p3->next;

//定义学生函数和首地址及添加

//把新建节点的地址赋给指针

//判断学号为零就终止查询

//循环,让指针指向最后一个结点

40 黄泽华:学生信息管理系统的设计 2012.1

} }

printf(\请输入学生姓名:\

//输入插入学生的

scanf(\

printf(\请输入年龄、数学、物理、英语、计算机成绩并以空格隔开(0-100):\scanf(\, &stu->eng, &stu->cpu); stu->sum=stu->math+stu->phy+stu->eng+stu->cpu; p1=head; p0=stu;

if(head!=NULL) { } else {

head=p0;

p0->next=NULL;

while(p1->next!=NULL) { p1=p1->next; }

p1->next=p0; p0->next=NULL;

//把保存有添加学生信息的结点连接到链表最后

}

n=n+1;

//添加一个学生,计数器n自增一次

end2: printf(\现在的学生数为:%d\\n\ }

//读取

struct student *load(struct student *head) {

return(head); //返回改变链表的首地址

//定义函数

struct student *p1, *p2; int m=0; char fileopen[10];

FILE *fp;

printf(\请输入文件路径及文件名:\ scanf(\

//输入读取文件的路径和文件名

2012.1 中国地质大学论文 41

if((fp=fopen(fileopen, \ {

printf(\不能打开文件\

//地址为空,则输出提示 return 0; }

printf(\学生信息管理系统\\n\

printf(\printf(\学号\\t姓名\\t年龄\\t数学\\t物理\\t英语\\t计算机\\t总分\\n\

printf(\head=NULL;

do { p1=(struct student *)malloc(sizeof(struct student));//每读取一次创建一个新的结点

fscanf(fp, \&p1->num, &p1->name, &p1->age, &p1->math, &p1->phy, &p1->eng, &p1->cpu, &p1->sum); //读入内存 printf(\

p1->age,p1->math, p1->phy,p1->eng,p1->cpu,p1->sum); //输出信息

m=m+1;

if(m==1) head=p2=p1; else { }

p2->next=p1; p2=p1;

//判断结点个数以添加首地址

p1->num,p1->name,

}while(!feof(fp)); p2->next=NULL;

fclose(fp); n=m;

return(head);

//返回读取信息的首地址供其他函数使用

}

//1.按学号查询

struct student *search1(struct student *head)//定义一个函数,赋给他查找链表的首地址 {

int num;

struct student *p1;

printf(\请输入要查询学生的学号(输入0退出):\scanf(\while(num!=0)

//输入查找学号

42 黄泽华:学生信息管理系统的设计 2012.1

{

if(head==NULL) { }

printf(\没有任何学生的资料,请输入\\n\return(head);

printf(\ printf(\学号\\t姓名\\t年龄\\t数学\\t物理\\t英语\\t计算机\\t总分\\n\

printf(\ p1=head; while (num!=p1->num&&p1->next!=NULL) //开始扫描每个结点以查找与要求吻合的结点 p1=p1->next;//如果不相同就扫描下一个

if(num==p1->num)//查找到相同的信息开始输出 {

printf(\p1->num, p1->name, p1->age,p1->math, p1->phy,p1->eng, p1->cpu, p1->sum); } else printf(\不存在学号为%ld的学生\\n\没有查找到满足要求的结点 printf(\输入要查询学生的学号(输入0退出):\ }

scanf(\}

printf(\退出查询\\n\return(head);

//2.按姓名查询

struct student *search2(struct student *head) //定义一个函数,赋给他查找链表的首地址 {

char name[10];

struct student *p1;

printf(\请输入要查询学生的姓名:\//输入查找姓名 scanf(\

printf(\ printf(\学号\\t姓名\\t年龄\\t数学\\t物理\\t英语\\t计算机\\t总分\\n\

printf(\

2012.1 中国地质大学论文 43 p1=head;

while (strcmp(name, p1->name)!=0&&p1->next!=NULL) //开始扫描每个结点以

//如果不相同就扫描下一个 //查找到相同的信息开始输出

查找与要求吻合的结点 p1=p1->next; if(strcmp(name, p1->name)==0)

{

printf(\p1->num, p1->name,

p1->age,p1->math, p1->phy,p1->eng, p1->cpu, p1->sum); } else printf(\不存在姓名为%s学生\\n\没有查找到满足要求的结点

return(head); } //3.按年龄查询

struct student *search3(struct student *head) {

int age;

struct student *p1;

printf(\请输入要查询学生的年龄(输入0退出):\scanf(\while(age!=0) {

if(head==NULL) { printf(\没有任何学生的信息,请输入\\n\ }

return(head);

//同以上查找函数

printf(\ printf(\学号\\t姓名\\t年龄\\t数学\\t物理\\t英语\\t计算机\\t总分\\n\

printf(\

p1=head;

while (age!=p1->age&&p1->next!=NULL) {

p1=p1->next; if(age==p1->age)

printf(\p1->num, p1->name, p1->age,p1->math, p1->phy,p1->eng, p1->cpu, p1->sum);

44 黄泽华:学生信息管理系统的设计 2012.1

} else printf(\不存在年龄为%d学生\\n\printf(\输入要查询学生的年龄(输入0退出):\scanf(\

}

printf(\退出查询\\n\

return(head); }

//4.按数学成绩查询

struct student *search4(struct student *head) {

//同以上查找函数

float math;

struct student *p1;

printf(\请输入要查询学生的数学成绩(输入0退出):\scanf(\while(math!=0) { if(head==NULL)

{

printf(\没有任何学生的资料,请输入\\n\

return(head); }

printf(\printf(\学号\\t姓名\\t年龄\\t数学\\t物理\\t英语\\t计算机\\t总分\\n\

printf(\

p1=head;

while (math!=p1->math&&p1->next!=NULL) p1=p1->next; if(math==p1->math) {

printf(\p1->num, p1->name,

p1->age,p1->math, p1->phy,p1->eng, p1->cpu, p1->sum); }

}

else printf(\不存在数学成绩为%.2f学生\\n\printf(\输入要查询学生的数学成绩(输入0退出):\scanf(\

2012.1 中国地质大学论文 45

printf(\退出查询\\n\return(head);

}

//5.按物理成绩查询

struct student *search5(struct student *head) {

float phy;

struct student *p1;

printf(\请输入要查询学生的物理成绩(输入0退出):\scanf(\while(phy!=0) {

if(head==NULL) { printf(\没有任何学生的资料,请输入\\n\ }

return(head);

//同以上查找函数

printf(\ printf(\学号\\t姓名\\t年龄\\t数学\\t物理\\t英语\\t计算机\\t总分\\n\

printf(\ p1=head; while (phy!=p1->phy&&p1->next!=NULL)

p1=p1->next; if(phy==p1->phy) {

printf(\p1->num, p1->name, p1->age,p1->math, p1->phy,p1->eng, p1->cpu, p1->sum); }

} else printf(\不存在物理成绩为%.2f学生\\n\printf(\输入要查询学生的物理成绩(输入0退出):\scanf(\

}

printf(\退出查询\\n\return(head);

46 黄泽华:学生信息管理系统的设计 2012.1 //6.按英语成绩查询 struct student *search6(struct student *head) {

//同以上查找函数

float eng;

struct student *p1;

printf(\请输入要查询学生的英语成绩(输入0退出):\scanf(\while(eng!=0) { if(head==NULL)

{ }

printf(\没有任何学生的资料,请输入\\n\return(head);

printf(\ printf(\学号\\t姓名\\t年龄\\t数学\\t物理\\t英语\\t计算机\\t总分\\n\

printf(\ p1=head;

while (eng!=p1->eng&&p1->next!=NULL) p1=p1->next;

if(eng==p1->eng) { printf(\p1->num, p1->name,

p1->age,p1->math, p1->phy,p1->eng, p1->cpu, p1->sum);

} }

else printf(\不存在英语成绩为%.2f学生\\n\printf(\输入要查询学生的英语成绩(输入0退出):\

scanf(\}

printf(\退出查询\\n\return(head);

//7.按计算机成绩查询

struct student *search7(struct student *head) {

//同以上查找函数

float cpu;

2012.1 中国地质大学论文 47

struct student *p1;

printf(\请输入要查询学生的计算机成绩(输入0退出):\scanf(\while(cpu!=0) {

if(head==NULL) { printf(\没有任何学生的资料,请输入\\n\ }

return(head);

printf(\ printf(\学号\\t姓名\\t年龄\\t数学\\t物理\\t英语\\t计算机\\t总分\\n\

printf(\ p1=head;

while (cpu!=p1->cpu&&p1->next!=NULL) {

p1=p1->next; if(cpu==p1->cpu)

printf(\p1->num, p1->name,

p1->age,p1->math, p1->phy,p1->eng, p1->cpu, p1->sum); } }

else printf(\不存在英语成绩为%.2f学生\\n\printf(\输入要查询学生的英语成绩(输入0退出):\

scanf(\}

printf(\退出查询\\n\return(head);

//8.按总分成绩查询

struct student *search8(struct student *head) {

float sum;

struct student *p1;

printf(\请输入要查询学生的总分(输入0退出):\scanf(\while(sum!=0) {

//同以上查找函数

48 黄泽华:学生信息管理系统的设计 2012.1

if(head==NULL) { printf(\没有任何学生的资料,请输入\\n\ }

return(head);

printf(\ printf(\学号\\t姓名\\t年龄\\t数学\\t物理\\t英语\\t计算机\\t总分\\n\

printf(\ p1=head;

while (sum!=p1->sum&&p1->next!=NULL) p1=p1->next;

if(sum==p1->sum) { printf(\p1->num, p1->name,

p1->age,p1->math, p1->phy,p1->eng, p1->cpu, p1->sum);

} }

else printf(\不存在英语成绩为%.2f学生\\n\printf(\输入要查询学生的英语成绩(输入0退出):\

scanf(\}

printf(\退出查询\\n\return(head);

//保存

int save(struct student *p1) {

//定义保存函数

//定义fp指针

//输入文件名和路径

FILE *fp;

char fileopen[20];

printf(\请输入保存的文件路径及文件名:\scanf(\

if((fp=fopen(fileopen, \ { printf(\不能打开文件\\n\ }

while(p1!=NULL) {

return 0;

本文来源:https://www.bwwdw.com/article/vzxp.html

Top