题 目:
宿舍管理查询软件
已知技术参数和设计要求:为宿舍管理人员编写一个宿舍管理查询软件,程序设计要求:采用交互工
作方式建立数据文件,数据文件按关键字(姓名、学号、房号)进行排序(冒泡、选择、插入排序等任选
一种)
查询菜单: (用二分查找实现以下操作)
按姓名查询
按学号查询
按房号查询
打印任一查询结果(可以连续操作)
要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
一、需求分析: 在该部分中叙述,每个模块的功能要求
二、概要设计: 在此说明每个部分的算法设计说明(可以是描述算法的流程图),每个程序中使用
的存储结构设计说明(如果指定存储结构请写出该存储结构的定义。
三、详细设计: 各个算法实现的源程序,对每个题目要有相应的源程序(可以是一组源程序,每
个功能模块采用不同的函数实现)源程序要按照写程序的规则来编写。要结构清晰,重点函数的重点
变量,重点功能部分要加上清晰的程序注释。
四、调试分析: 测试数据,测试输出的结果,时间复杂度分析,和每个模块设计和调试时存在问
题的思考(问题是哪些?问题如何解决?),算法的改进设想。
五、用户手册: 使用该软件的方法说明(截图说明)。
六、课设总结:总结可以包括 : 课程设计过程的收获、遇到问题、遇到问题解决问题过程的思考、
程序调试能力的思考、对数据结构这门课程的思考、在课程设计过程中对《数据结构》课程的认识等
内容
一、需求分析
该程序是由 C 语言编写的一个宿舍管理查询软件,其主要功能是实现对学生信息的增加、删除、修改、
查询、排序、存储、加载。其中查询可以分别以姓名、学号、寝室号为关键字查询学生信息。排序可以
分别以学号和寝室号为关键字进行从小到大的排序。
①输入的形式:根据用户所选择的功能,然后再依据程序相应的提示进行输入:
选择功能 1(添加学生信息):按照从先到后的顺序输入学生姓名(30 个字符以内),学
生学号(15 个字符以内),宿舍号码(整数,范围在 0~32767)。
选择功能 2(修改学生信息):按照从先到后的顺序输入要修改的学生姓名(30 个字符以
内),修改后学生的姓名(30 个字符以内),修改后学生的学号(15 个字符以内),修改
后学生的宿舍号(整数,范围在 0~32767)。
选择功能 3(删除学生信息):输入要删除的学生姓名(30 个字符以内)。
选择功能 4(以姓名查询学生信息):输入要查找的学生的姓名(30 个字符以内)。
选择功能 5(以学号查询学生信息):输入要查找的学生的学号(15 个字符以内)。
选择功能 6(以寝室号查询学生信息):输入寝室号(整数,范围在 0~32767)。
②输出的形式:根据用户所选择的功能不同,会有不同的输出:
选择功能 1(添加学生信息):根据程序的判断会输出添加成功或者添加失败。
选择功能 2(修改学生信息):根据程序的判断会输出修改成功或者修改失败。
选择功能 3(删除学生信息):根据程序的判断会输出删除成功或者删除失败。
选择功能 4(以姓名查询学生信息):根据程序的判断,如果查找成功,则会输出相应的
选择功能 5(以学号查询学生信息):根据程序的判断,如果查找成功,则会输出相应的
学生信息,反之,则会输出查找失败。
学生信息,反之,则会输出查找失败。
选择功能 6(以寝室号查询学生信息):根据程序的判断,如果查找成功,则会输出相应
的学生信息,反之,则会输出查找失败。
选择功能 7,8(以寝室号和学号为关键字进行从小到大的排序):程序会输出排序成功。
选择功能 9(显示所有学生的信息):程序会输出所有以存学生的信息。
选择功能 10(保存操作):根据程序的判断会输出保存成功或者保存失败。
选择功能 11(加载记录):根据程序的判断会输出加载记录成功或者加载记录失败。
③测试数据: 对功能 1(添加学生信息)的测试:向程序中添加三条记录
按照先后顺序分别输入:学生姓名:张三,学生学号:20070001,宿舍号:502
学生姓名:李四,学生学号:20070003,宿舍号:502
学生姓名:王五,学生学号:20070002,宿舍号:503
对功能 2(修改学生信息)的测试:修改学生王五的信息
按照先后顺序分别输入:学生姓名:王五,学生姓名:王五,学生学号:20070005,宿
舍号:501
对功能 3(删除学生信息)的测试:删除学生李四的信息
输入:学生姓名:李四
对功能 4(以姓名查询学生信息)的测试:查询学生王五的信息
输入:学生姓名:王五
对功能 5(以学号查询学生信息)的测试:查询学号为 20070001 的信息
输入:学生学号:20070001
对功能 6(以寝室号查询学生信息)的测试:查询寝室号为 501 的信息
输入:寝室号:501
1
对功能 7(按照寝室号从小到大的排序)和功能 9(显示所有学生信息)的测试:先选择
功能 7,然后选择功能 9,观察显示出来的记录是否按照寝室号
从小到大排序。
对功能 8(按照学号从小到大的排序)和功能 9(显示所有学生信息)的测试:先选择功
能 8,然后选择功能 9,观察显示出来的记录是否按照学号从小
到大排序。
对功能 10(保存操作)和功能 11(加载记录)的测试:先选择功能 10,然后关闭程序,
重新运行,此时选择功能 11,然后选择功能 9 显示出学生信息,
查看信息是否有错误。
二、概要设计
1.抽象数据类型:
ADT Student{
数据对象:D={ai,bi,ci,| ai∈char S[31],bi∈char A[16],ci,∈int ,i=1,2,3,….}
数据关系:R={< (ai,bi,ci), (ai+1,bi+1,ci+1)>| (ai,bi,ci) ∈D, i=1,2,3,….}
基本操作: S_number_Judge(Student S,int t)
初始条件:表 S 已存在
操作结果:判断所输入学号在表中是否已存在
Add(Student S)
初始条件:表 S 已存在
操作结果:向表 S 中插入一个记录
Alter(Student S)
初始条件:表 S 已存在
操作结果:修改表 S 中的一条记录
Delete(Student S)
初始条件:表 S 已存在
操作结果:删除表 S 中的一条记录
Display_All(Student S)
初始条件:表 S 已存在
操作结果:显示表中所有学生的信息
Sort_D_number(Student S)
初始条件:表 S 已存在
操作结果:表中记录按照寝室号从小到大排序
Sort_S_number(Student S)
初始条件:表 S 已存在
操作结果:表中记录按学号从小到大排序
Query_S_name(Student S)
初始条件:表 S 已存在
操作结果:根据所输入的学生姓名显示出该学生的信息
Query_S_number(Student S)
初始条件:表 S 已存在
2
操作结果:根据所输入的学号显示出该学生的信息
Query_D_number(Student S)
初始条件:表 S 已存在
操作结果:根据所输入的寝室号显示出该寝室的学生的信息
Save(Student S)
初始条件:表 S 已存在
操作结果:将表中数据保存的文件中去
Load(Student S)
初始条件:表 S 已存在
操作结果:将文件中数据加载到程序中
Judge_Save(int i,Student S)
初始条件:表 S 已存在
操作结果:表中数据改变后没有及时保存在退出程序时提醒用户是否保存
} ADT Student
2.本程序所包含的 15 个函数为:
(1).主函数 main();
(2).菜单函数 Menu();
(3).判断学号是否重复函数 S_number_Judge(Student S,int t);
(4).添加学生信息函数 Add(Student S);
(5).修改学生信息函数 Alter(Student S);
(6).删除学生信息函数 Delete(Student S);
(7).显示所有学生信息函数 Display_All(Student S);
(8).按照寝室号从小到大排序函数 Sort_D_number(Student S);
(9).按照学号从小到大排序函数 Sort_S_number(Student S);
(10).根据学生姓名查找函数 Query_S_name(Student S);
(11).根据学生学号查找函数 Query_S_number(Student S);
(12).根据寝室号查找函数 Query_D_number(Student S)
(13).存储函数 Save(Student S);
(14).加载函数 Load(Student S);
(15).判断在退出程序时是否保存函数 Judge_Save(int i,Student S);
3
各函数之间的调用关系如下:
Display_All(Student S)
Menu()
Sort_D_number(Student S)
Query_S_name(Student S)
Sort_S_number(Student S)
Query_S_number(Student S)
main()
Save(Student S)
Query_D_number(Student S)
Load(Student S)
Delete(Student S)
Judge_Save(int i,Student S)
Add(Student S)
Alter(Student S)
S_number_Judge(Student S,int t)
4
3.N-S 流程图
调用 Menu()
输入 i 值
Y
)
S
(
d
d
A
i= =1
Y
)
S
(
r
e
t
l
A
i= =2
i= =3
Y
)
S
(
e
t
e
l
e
D
Y
)
S
(
e
m
a
n
_
S
_
y
r
e
u
Q
i= =4
Y
)
S
(
r
e
b
m
u
n
_
S
_
y
r
e
u
Q
N
N
N
N
i= =5
i= =6
Y
)
S
(
r
e
b
m
u
n
_
D
_
y
r
e
u
Q
Y
)
S
(
r
e
b
m
u
n
_
D
_
t
r
o
S
i= =7
i= =8
Y
)
S
(
r
e
b
m
u
n
_
S
_
t
r
o
S
5
N
N
N
N
i= =9
Y
)
S
(
l
l
A
_
y
a
l
p
s
i
D
Y
)
S
(
e
v
a
S
i= =10
Y
)
S
(
d
a
o
L
N
N
i= =11
N
i= =12
N
Y
)
S
,
y
t
r
i
d
(
e
v
a
S
_
e
g
d
u
J
输
出
:
选
择
错
误
,
请
在
数
字
1-
1
2
中
选
择
直到 i= =12
三、详细设计
源程序代码:
#include
#include
#include
#define M 100
int dirty=0; //用来判断是否已保存操作
//定义一个存储学生相关信息的结构体
typedef struct
{
char S_name[31];
//学生姓名
char S_number[16]; //学生学号
int D_number;
//学生所在寝室的宿舍号
int Total;
//学生总数
}Student[M],St;
//判断学号是否与表中所存学号重复
void S_number_Judge(Student S,int t)
{
}
int i;
for(i=1;i<=(S->Total)-1;i++)
while(strcmp(S[i].S_number,S[t].S_number)==0)
{
}
printf("学号输入失败,该学号已存在,请重新输入学号!\n");
printf("请输入学生的学号(15个字符以内):");
scanf("%s",S[t].S_number);
getchar();
i=1;
//添加学生信息函数
6
void Add(Student S)
{
}
printf("请输入学生姓名(30个字符以内):");
scanf("%s",S[++(S->Total)].S_name);
getchar();//获取换行符
printf("请输入学生的学号(15个字符以内):");
scanf("%s",S[S->Total].S_number);
getchar();
S_number_Judge(S,S->Total);//判断输入的学号是否与表中所存在的学号重复
printf("请输入宿舍号码:");
scanf("%d",&S[S->Total].D_number);
getchar();
dirty=1;
printf("添加成功!\n\n");
//修改学生信息函数
void Alter(Student S)
{
int i;
int flag=0; //用来判断表中是否存在所要修改的学生的信息
char name[20];
printf("请输入你要修改学生的姓名:");
scanf("%s",name);
getchar();
for(i=1;i<=S->Total;i++)
if(strcmp(S[i].S_name,name)==0)
flag=i;
if(!flag)
printf("你所要修改的学生信息在表中不存在!\n");
else
{
printf("新信息如下:\n");
printf("请输入学生姓名(30个字符以内):");
scanf("%s",S[flag].S_name);
getchar();
printf("请输入学生的学号(15个字符以内):");
scanf("%s",S[flag].S_number);
getchar();
S_number_Judge(S,flag);
printf("请输入宿舍号:");
scanf("%d",&S[flag].D_number);
getchar();
dirty=1;
7