1、唐山学院 数 据 结 构课程设计题系 班目( 部) 级宿舍管理查询系统设计与实现 计算机科学与技术系 姓名 学号 指导教师 2012年 1月 4日至 1月 13日共 2周2012年 1 月13日1 引 言高校学生宿舍信息管理系统的主要功能包括:可以对学生宿舍信息的查询功能,包 括快速查询功能和分类查询功能:对学生宿舍的录入功能,修改功能,删除功能和统计 功能。通过系统上述功能实现宿舍管理部门对学生宿舍信息的日常管理,即方便宿舍管 理人员及时全面地掌握学生住宿情况及宿舍分配情况:为用户(管理用户和一般用户,如学生)提供一些简单的数据查询并输入各种信息等:在实现检索迅速和查找方便同时,进行宿舍管理
2、。该程序是由 C 语言编写的一个宿舍管理查询软件,其主要功能是实现对学生信息的 增加、删除、修改、查询、排序、储存、加载。其中查询可以分别以姓名、学号、寝室 号、为关键字查询学生信息。排序可以分别以学号和寝室号为关键字进行从小到大的排 序。2 问 题 分 析( 1) 该问题采用主要顺序线性表的查找和排序解决。( 2) 宿舍管理系统中存在先后顺序,因此采用线性表。为了加快查找速率采用了顺 序查找和折半查找,因此需要将其按学号或宿舍号进行排序,所以采用了顺序表。通过上述分析我采用顺序线性表储存结构,其结构如下: typedef structchar S_name 31;/学生姓名 char S_n
3、umber 16;/学生学号int D_number;/学生所在寝室的宿舍号 int Total;/ 学生总数Student M,St;3 总 体 设 计此系统是由添加模块、修改模块、删除模块、判断模块、排序模块、查询模块、显 示模块、保存模块和加载模块九个模块构成的。其中添加模块中运用了判断学号是否重 复和宿舍人数是否已满函数,排序模块分为以姓名为关键字排序、以学号为关键字排序 和以寝室号为关键字排序三个功能,查询模块分为按姓名查询、按学号查询和按寝室号 查询三个功能,在对信息进行添加,修改,删除,排序,保存和加载之后可以用显示函 数进行显示。模块结构图和总体流程图(如图 3-1):宿 舍
4、管 理 查 询 系 统添 加 模 块修 改 模 块删 除 模 块判 断 模 块排 序 模 块提 示 保 存 模 块查 找 模 块显 示 模 块储 存 模 块加 载 模 块按 姓 名按 学 号按 学 号按 寝 室 号按 姓 名按 寝 室 号图 3 -1 系 统 模 块 结 构 图(1)添加学生信息:按照从先到后的顺序输入学生姓名(30 个字符以内),学生学号(15 个字符以内),学生学号(15 个字符以内),宿舍号码(整数,范围在 0- 32767), 即可将该学生信息添加到系统中。(2)修改学生信息:输入要修改的学生姓名(30 个字符以内),修改后学生的学号(15 个字符以内),修改后学生的宿
5、舍号(整数,范围在 0- 32767),即可修改该学生信息。(3)删除学生信息:输入要删除的学生的姓名(30 个字符以内),可删除该学生信息。(4)判断学号是否重复和判断宿舍人数是否已满:将输入学生的学号和宿舍号与表中 原有的学生的学号和宿舍号进行比较,判断学号是否重复和该宿舍人数是否已满。(5)以姓名为关键字排序:添加学生信息之后,以学生姓名首字母的先后顺序排序。(6)以学号为关键字排序:添加学生信息之后,以学号从大到小排序。(7)以寝室号为关键字排序:添加学生信息之后,以寝室号大小排序。(8)以姓名查询学生信息:输入要查找的学生的姓名(30 个字符以内),可显示所找 学生信息。(9)以学号
6、查找学生信息:输入要查找的学生的学号(15 个字符以内),可显示所找 学生信息。(10)以寝室号查询学生信息:输入寝室号(整数,范围在 0- 32767),可显示所找学 生信息。(11)储存学生信息:可将录入的学生信息储存起来。(12)加载学生信息:可将学生信息加载到系统中。(13)提示学生信息是否保存:判断操作后的学生信息是否以保存,如果没有保存则显 示提示信息。4.1 添加模块4.1.1 设计思路4 详 细 设 计添加学生信息函数:在学生信息表中的最后一位插入要添加的学生信息,输入学生 姓名,学生学号并判断是否重复,学生宿舍号并判断该宿舍人数是否已满,学生系别, 学生班级,学生手机号。4.
7、1.2 流程图添加学生信息函数的流程图(如图 4-1):开始输 入 “ 1 ”学 号 是 否 重 复NN输 入 宿 舍 号宿 舍 人 数 是 否 已 满N输 入 学 号输 入 系 别 、班 级 和 手 机 号YY添 加 成 功结 束4.2 修改模块4.2.1 设计思路图 4 -1 添 加 流 程 图修改学生信息:输入要修改的学生的学号与表中的学生的学号进行比较,找到与其相等的学生学号。再输入此学号学生的信息:学生姓名,学生学号(判断是否重复),学生宿舍号(该宿舍人数是否已满),学生系别,学生班级,学生手机号。4.2.2 流程图修改学生信息函数的流程图如下(如图 4-2):是否存在Y输入姓名输入
8、学生新信息:姓名开始输入“2”N学号是否重复YN输入新学生学号输入新宿舍号判 断 宿 舍 是 否 已 满NY修改成功结束4.3 删除模块4.3.1 设计思路图 4 -2 修 改 流 程 图删除学生信息:输入要删除的学生的姓名,找到与之相同的学生,然后将其后面的学生信息前移一个位置,再将学生总数减一。4.3.2 流程图删除函数流程图(如图 4-3):开始输入所要删除的学生姓名是否存在NY将后边的数前移删除成功结束4.4 判断模块4.4.1 设计思路图 4 -3 删 除 模 块 流 程 图判断学生学号是否重复函数:将输入的学生学号与表中的学生的学号一一比较(跳 过自身与自身的比较)是否相等,若有相
9、等的则说明重复,否则则没有。判断宿舍人数是否已满函数:将输入的学生的宿舍号与表中前面(Total-1)个学生的宿 舍号进行比较是否相等,每相等一次,使 j+;当 j=4 时,说明该宿舍已满,否则没有 满。4.4.2 流程图判断学号是否重复函数流程图(如图 4-4):开始输入学号比较是否相等N录入成功Y图 4 -4 判 断 函 数 流 程 图结束判断宿舍人数是否已满(如图 4-5):开始输入宿舍号比较是否四次相等N录入成功Y结束图 4 -5 判 断 函 数 流 程 图4.5 显示模块显示所有学生信息:从第一个学生开始一直到最后一个学生依次输出学生的信息。4.6 排序模块4.6.1 设计思路以姓名
10、为关键字排序(冒泡法):从第一个学生开始与后边的学生姓名的首字母比较, 一直到最后一个学生分别与后面的比较。当此学生姓名首字母在后面学生姓名首字母之 后时,两学生的位置交换。以学号为关键字排序和以宿舍号为关键字排序(冒泡法):从第一个学生开始与后面 学生学号(或宿舍号)比较,直到最后一个学生。当前面学生的学号(或宿舍号)大于 后面学生学号(或宿舍号)时,进行交换,否则不交换。4.6.2 流程图冒泡排序流程图(如图 4-6):开始下一个数据是否到尾YN前 一 个 字 符 是 否 大 于 后 一个 字 符 Y交换位置排序完成结束图 4 -6 排 序 模 块 流 程 图4.7 查询模块4.7.1 设
11、计思路以姓名为关键字查询函数:输入要查找的学生姓名,从第一个学生开始比较,当相 等时,输出该学生信息,标记已找到该学生信息,若没有查找到,标记没有找到该学生 信息。4.7.2 流程图以姓名为关键字查找(如图 4-7):开始下一个,是否到尾YN比 较 是 否 相同YN输入要查找学生姓名输出此学生信息查找完成结束图 4-7 按姓名查询流程图4.8 录入模块4.8.1 设计思路以学号为关键字查询:定义折半查找所需的变量 low,high,mid,使 low=1,high=total, mid=(low+high)/2,输入要查找的学生的学号,与第 mid 个学生的学号比较:当等于时, 输出该学生信息
12、;当大于时,low=mid+1,继续折半,比较;当小于时,high=mid-1,继 续折半,比较。若 lowhigh 时则没有查找到该学生信息。4.8.2 流程图以学号为关键字查找流程图(如图 4-8):输出该学生信息是否在这些学号之间YN折半是否成功YNN比较是否相等Y按学号从小到大排序查找失败开始输入要查找的学生学号结束4.9 查询模块4.9.1 设计思路图 4 -8 按 学 号 查 询 函 数 流 程 图以寝室号为关键字查询(折半查找):定义折半查找所需的变量 low=1,high=Total, mid=(low+high)/2,将输入的学生的学号与第 mid 个学生的学号比较:相等时,
13、输出该学 生信息,同时利用两个循环对所查找的寝室分别向前向后查找符合要求的寝室号的学生 信息;大于时,low=mid+1,折半,比较;小于时,high=mid-1,折半,比较。4.9.2 流程图以寝室号为关键字查询函数流程图(如图 4-9):开始输入要查找的学生寝室号输出该学生信息该寝室号是否在其范围内Y折半是否成功YN判断是否相等NY按寝室号大小排序查找失败结束图 4 -9 按 寝 室 号 查 询 函 数 流 程 图4.10 储存模块4.10.1 设计思路储存函数:打开文件并且正确写入数据时保存。4.10.2 流程图储存函数的流程图(如图 4-10):开始储存成功是否成功打开文件NY是否成功
14、写入数据NY结束储存失败图 4 -10 储 存 模 块 流 程 图4.11 加载模块4.11.1 设计思路加载函数:打开文件后读取数据,则加载成功,表中个数减一。4.11.2 流程图加载函数流程图(如图 4-11):开始加载成功Y是否成功打开文件NY是否读取成功NY加载失败结束图 4 -11 加 载 模 块 流 程 图4.12 提示保存模块4.12.1 设计思路退出前判断是否保存函数:若标志变量已变,则提醒保存,允许保存后,执行储存 函数。否则,不保存。4.12.2 流程图退出前提示是否保存函数流程图(如图 4-12):开始储存数据判断数据是否已变NY选择是否保存NY退出程序结束4.13 选择
15、模块4.13.1 设计思路图 4 - 12 提 示 保 存 函 数 流 程 图主函数:定义变量,选择要实现的功能。4.13.2 流程图主函数流程图(如图 4-13):开始输出功能菜单选 择 是 否 正确YN选择要实现的功能执行该功能图 4 -13 选 择 模 块 流 程 图5 运 行 测 试(1)测试结果对功能 1(添加学生信息)的测试:向程序中添加五条记录学生姓名学生学号宿舍号手机号码系别班级(如图 5-2)d206315032jiben10-2(如图 5-3)f203315032jiben10-2(如图 5-4)k215315032jiben10-2(如图 5-5)j212315032ji
16、ben10-2(如图 5-6)n216615032jiben10-2图 5 - 1 菜 单 界 面 图图 5 -2 添 加 界 面 图图 5 -3 添 加 界 面 图图 5 -4 添 加 界 面 图图 5 -5 添 加 界 面 图图 5 -6 添 加 界 面 图对功能 2(修改学生信息)的测试:修改学号为 203 的学生信息 输入信息:学生姓名:f学生学号:203宿舍号:6 手机号码:15032系别:jiben班级:10-2(如图 5-7)图 5 -7 修 改 界 面 图对功能 3(删除学生信息)的测试:删除学生 n 的信息(如图 5-8)图 5 -8 删 除 界 面 图对功能 4(以姓名查找
17、学生信息)的测试:查找学生 f 的信息(如图 5-9)图 5 - 9 按 姓 名 查 找 界 面 图对功能 5(以学号查询学生信息)的测试:查找学号为 212 的学生信息(图 5-10)图 5 -10 按 学 号 查 找 界 面 图对功能 6(按寝室号查询学生信息)的测试:查找 3 号宿舍学生信息(如图 5-11)图 5 -11 按 寝 室 号 查 询 界 面 图对功能 7(按寝室号从大到小排序)和功能 9(显示所有学生信息)的测试(如图 5-12 和图 5-13):图 5 -12 按 寝 室 号 排 序 界 面 图图 5 -13 显 示 结 果 界 面 图对功能 8(按学号大小排序)的测试(
18、如图 5-14 和图 5-15):图 5 -14 按 学 号 排 序 界 面 图图 5 -15 显 示 结 果 界 面 图对功能 12(按姓名排序)的测试(如图 5-16 和图 5-17):图 5 -16 按 姓 名 排 序 界 面 图图 5 -17 显 示 结 果 界 面 图对功能 10(保存数据)的测试(如图 5-18):图 5 -18 保 存 界 面 图对功能 11(加载数据)的测试(如图 5-19):图 5 -19 加 载 界 面 图对功能 13(退出程序)的测试(如图 5-20):图 5 -20 退 出 程 序 界 面 图当数据改变后为执行保存操作而要退出程序时(如图 5-21):图
19、 5 -21 提 醒 是 否 保 存 界 面 图( 2) 时间复杂度分析nlogn判断学号是否重复函数 S_number_Judge(Student S,int t);时间复杂度 T(n)=n 判断宿舍人数是否已满函数 D_number_Judge(Student S,int t);时间复杂度 T(n)=n 添加学生信息函数 Add(Student S);时间复杂度 T(n)=n删除学生信息函数 Delete(Student S); 时间复杂度 T(n)=n 修改学生信息函数 Modify(Student S);时间复杂度 T(n)=n 显示学生信息函数 Display_All(Student
20、 S);时间复杂度 T(n)=n按照学号从小到大排序函数 Order_S_number(Student S);时间复杂度 T(n)= n 按照寝室号从小到大排序函数 Order_D_number(Student S);时间复杂度 T(n)= n 按照姓名首字母的先后顺序排序函数 Order_N_name(Student S);时间复杂度 T(n)=按照姓名查找学生信息函数 Search_S_name(Student S);时间复杂度 T(n)=n 按照学生学号查找学生信息函数 Search_S_number(Student S);时间复杂度 T(n)=按照寝室号查找学生信息函数 Search_
21、D_number(Student S);时间复杂度 T(n)= logn( 3) 调试过程中对所遇到问题的分析问题主要出现在按寝室号查找函数 Search_D_number(Student S),加载函数 Load(Student S)和修改学生信息函数 Modify(Student S)上。在调试按寝室号查找函数 Search_D_number(Student S)时,由于一个寝室肯能居住多个学生,所以在找到所查找的寝室号时,必需利用两个循环对所查找的寝室分别向前向后查找符合要求的寝室号的学生信息。在调试加载函数 Load(Student S)时,由于程序每次都会从文件中多读一条 记录,即乱
22、码,所以在记录加载完毕之后,必需对记录总数减一。在调试修改学生信息 函数 Modify(Student S)时,由于修改的学生学号不能与其他学生重复,因此需要用函数 S_number_Judge(Student S,int t)进行判断学号是否重复,然而若不修改该学生学号仍然 输入原来的学号时会有“输入学生学号重复,请重新输入“的提示,因此需要在函数 S_number_Judge(Student S,int t)的 if 语句中加上“i!=t”的条件。( 4) 算法的改进设想在排序函数上,可将冒泡排序改为效率更高的的算法:如堆排序,归并排序,基排 序等。在查找函数上可将折半查找改为哈希查找法等
23、。6 总 结通过这次数据结构的课程设计,我从中学到了很多,充分利用了这几天的时间进行 程序的编程报告的整理和总结,感觉很满足。许多曾经不懂得知识有了较深刻的了解, 并且熟练地掌握了一些编写程序的方法。(1)收获:1)一个函数既能调用它本身也能调用其他函数,而在 C 语言程序中源文件中包含 头文件“string.h”时可直接调用比较函数“strcmp”和复制函数“strcpy ”。2)以前不知道如何把各个函数编排在一起,不能形成一个整体的模块,现在通过 实践和调试能组装好各个模块,使它们实现各自的功能。(2)程序的不足:按姓名、学号和寝室号排序是用冒泡法排的,程序的效率不高,当有较多学生信 息时
24、,程序的执行速度会较慢。参 考 文 献 1 严 蔚 敏 , 吴 伟 民 数 据 结 构 北 京 : 清 华 大 学 出 版 社 , 2008 . 2 苏 仕 华 数 据 结 构 课 程 设 计 北 京 : 机 械 工 业 出 版 社 , 2010 . 3 .滕 国 文 数 据 结 构 课 程 设 计 北 京 : 清 华 大 学 出 版 社 , 2010 .附 录S _ number_ J udg e( S tudent S ,int t) 初 始 条 件 : 表 S 已 存 在操 作 结 果 : 判 断 所 输 入 学 号 在 表 中 是 否 已 存 在 A dd( S tudent S )初
25、 始 条 件 : 表 S 已 存 在操 作 结 果 : 向 表 中 插 入 一 个 记 录 A lter( S tudent S )初 始 条 件 : 表 S 已 存 在操 作 结 果 : 修 改 表 S 中 的 一 条 记 录 Delete( S tudent S )初 始 条 件 : 表 S 已 存 在操 作 结 果 : 删 除 S 中 的 记 录 Display _ A ll ( S tudent S )初 始 条 件 : 表 S 已 存 在操 作 结 果 : 显 示 表 中 所 有 学 生 的 信 息 S ort_ D_number( S tudent S )初 始 条 件 : 表 S
26、 已 存 在操 作 结 果 : 表 中 记 录 按 寝 室 号 从 小 到 大 排 序 S ort_ S _num ber( S tudent S )初 始 条 件 : 表 S 已 存 在操 作 结 果 : 表 中 记 录 按 学 号 从 小 到 大 排 序 Query _ S _ nam e( S tudent S )初 始 条 件 : 表 S 已 存 在操 作 结 果 : 根 据 所 输 入 的 学 生 姓 名 显 示 出 该 学 生 的 信 息 Query _ S _ num ber( S tudent S )初 始 条 件 : 表 S 已 存 在操 作 结 果 : 根 据 输 入 的
27、学 号 显 示 出 该 学 生 的 信 息 Query _ D_ number( S tudent S )初 始 条 件 : 表 S 已 存 在操 作 结 果 : 根 据 所 输 入 的 寝 室 号 显 示 出 该 寝 室 的 学 生 的 信 息 S ave( S tudent S )初 始 条 件 : 表 S 已 存 在操 作 结 果 : 将 表 中 数 据 保 存 到 文 件 中 去 L oad( S tudent S )初 始 条 件 : 表 S 已 存 在操 作 结 果 : 将 文 件 中 数 据 加 载 到 程 序 中 J udg e_ S ave( int i ,S tudent
28、S )初 始 条 件 : 表 S 已 存 在操 作 结 果 : 表 中 数 据 改 变 后 没 有 及 时 保 存 在 程 序 中 时 提 醒 用 户 是 否 保 存程 序 代 码 :#include#include#include#define M 100int save=0 ;/ 用 来 判 断 是 否 已 保 存 操 作/ 定 义 一 个 存 储 学 生 相 关 信 息 的 结 构 体 ty pedef structchar S _ nam e 31 ;/ 学 生 姓 名 char S _number 16 ; / 学 生 学 号char S _ x ibie 31 ,S _ banji
29、 31 ,P_ num ber 15 ; / 学 生 系 别 , 班 级 int D_number ;/ 学 生 所 在 寝 室 的 宿 舍 号 , 电 话 号 码int Total;/ 学 生 总 数S tudent M ,S t;/ 判 断 学 号 是 否 与 表 中 所 存 学 号 重 复 void S _ num ber_ J udg e( S tudent S ,int t)int i ,j=0 ;for( i=0 ; iTotal)-1 ; i+)if( strcm p( S i .S _ num ber,S t .S _ num ber)=0 & & ( i ! =t)print
30、f(学 号 输 入 失 败 ,该 学 号 已 存 在 ,请 重 新 输 入 学 号 ! n) ; printf(请 输 入 学 生 的 学 号 (15 个 字 符 以 内 ) : );scanf(% s,S t .S _ num ber); g etchar();j=0 ;/ 判 断 宿 舍 人 数 是 否 已 满void D_ number_ Judg e( S tudent S ,int t)int i ,j=0 ;for( i=0 ; iTotal)-1 ; i+)i f( S i .D_ num ber=S t .D_ number) j+; w hile( j=4 )printf(宿
31、 舍 号 输 入 失 败 , 该 宿 舍 人 数 已 满 , 请 重 新 输 入 宿 舍 号 ! n) ; printf(请 输 入 学 生 的 宿 舍 号 ( 整 数 ): );scanf(% d,& S t .D_number); j=0 ;/ 添 加 学 生 信 息 函 数 void A dd( S tudent S )+( S -Total);printf(请 输 入 学 生 姓 名 ( 30 个 字 符 以 内 ) : ); scanf(% s,S S -Total.S _ nam e); g etchar();/ 获 取 换 行 符printf(请 输 入 学 生 的 学 号 (1
32、5 个 字 符 以 内 ) : ); scanf(% s,S S -Total.S _ number);g etchar();S _ number_ J udg e(S ,S -Total);/ 判 断 输 入 的 学 号 是 否 与 表 中 所 存 在 的 学 号 重 复 printf(请 输 入 宿 舍 号 码 : );scanf(% d,& S S -Total.D_ num ber); g etchar();D_ number_J udg e( S ,S -Total);/ 判 断 所 安 排 宿 舍 人 数 是 否 已 满 printf(请 输 入 学 生 系 别 ( 30 个 字
33、符 以 内 ) : );scanf(% s,S S -Total.S _ x ibie); g etchar();printf(请 输 入 学 生 班 级 : ); scanf(% s,S S -Total.S _ banji); g etchar();printf(请 输 入 学 生 电 话 号 码 : ); scanf(% s,S S -Total.P_ number); g etchar();save=1 ;printf(添 加 成 功 ! nn) ;/ 修 改 学 生 信 息 函 数 void M odify ( S tudent S )int i ;int m=0 ; / 用 来 判
34、 断 表 中 是 否 存 在 所 要 修 改 的 学 生 的 信 息 char number 18 ,ch 16 =0 ;printf(请 输 入 你 要 修 改 学 生 的 学 号 : ); scanf(% s,num ber);g etchar();for( i=1 ; iTotal; i+)if( strcmp( S i .S _ number,num ber)=0 ) m =i;i f(! m)printf(你 所 要 修 改 的 学 生 信 息 在 表 中 不 存 在 ! n) ;elseprintf(新 信 息 如 下 : n) ;printf(请 输 入 学 生 姓 名 ( 30
35、 个 字 符 以 内 ) : ); scanf(% s,S m .S _ name);g etchar();printf(请 输 入 学 生 的 学 号 (15 个 字 符 以 内 ) : ); scanf(% s,S m.S _number);g etchar();S _ num ber_ Judg e(S ,m ) ;/ 判 断 学 号 是 否 重 复 printf(请 输 入 宿 舍 号 : );scanf(% d,& S m .D_ number); g etchar();D_ number_ J udg e( S ,S m.D_ number);/ 判 断 该 宿 舍 人 数 是 否
36、 已 满 printf(请 输 入 学 生 系 别 : );scanf(% s,S m.S _ x ibie); g etchar();printf(请 输 入 学 生 班 级 : ); scanf(% s,S m.S _ banji); g etchar();printf(请 输 入 学 生 手 机 号 码 : ); scanf(% s,S m.P_ num ber); g etchar();save=1 ;printf(修 改 成 功 ! n) ;putchar(n) ;/ 删 除 学 生 信 息void Delete( S tudent S )int i ,j;int flag =0 ;
37、/ 用 来 判 断 表 中 是 否 存 在 所 要 删 除 的 学 生 的 信 息 char name 20 ;printf(请 输 入 你 要 删 除 学 生 的 姓 名 : ); scanf(% s,na me);g etchar();for( i=1 ; iTotal; i+)if( strcm p( S i .S _ nam e ,name)=0 ) flag =i;i f( ! flag )printf(你 所 要 删 除 的 学 生 在 表 中 不 存 在 ! );elsefor( i=flag ; iTotal; i+)j=i+1 ;strcpy ( S i .S _nam e
38、,S j .S _ nam e); strcpy ( S i .S _number,S j .S _ num ber); strcpy ( S i .S _x ibie,S j .S _ x ibie); strcpy ( S i .S _ banji,S j .S _ banji); strcpy ( S i .P_ number,S j .P_number); S i .D_ number=S j .D_number;( S -Total)-; save=1 ;printf(删 除 成 功 ! );printf(nn) ;/ 显 示 所 有 学 生 信 息 函 数 void Displa
39、y _ A ll ( S tudent S )int i ;printf(全 体 学 生 信 息 如 下 : n) ;printf(学 生 姓 名学 生 学 号宿 舍 号手 机 号 码系 别班 级 n) ; for( i=1 ; iTotal; i+)printf(% -12 s% -15 s% -8 d% -19 s% -10 s% -10 sn,S i .S _ name,S i .S _ number,S i .D_ number,S i .P_num ber,S i .S _ x ibie,S i .S _ banji);putchar(nn) ;/ 按 姓 名 排 序 ( 冒 泡 法
40、 )void Order_N_ name( S tudent S )int i ,j,t;char name 30 ,ph 15 ;char number 15 ,x ibie 31 ,banji 31 ; for( i=1 ; iTotal; i+)for( j=i; jTotal; j+)i f( strcmp( S i .S _name,S j .S _ name)0 )strcpy ( na me,S i .S _ name);strcpy ( num ber,S i .S _ num ber); strcpy ( ph,S i .P_ number); strcpy ( x ibie
41、,S i .S _ x ibie); strcpy ( banji,S i .S _ banji);t=S i .D_number;strcpy ( S i .S _name,S j .S _ name); strcpy ( S i .S _ num ber,S j .S _ number); strcpy ( S i .P_ number,S j .P_number); strcpy ( S i .S _x ibie,S j .S _ x ibie); strcpy ( S i .S _ banji,S j .S _ banji);S i .D_ number=S j .D_ number; strcpy ( S j .S _nam e,na m e); strcpy ( S j .S _ number,number); strcpy ( S j .P_number,ph); st