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