数据结构课程设计报告宿舍管理系统.docx

上传人:b****5 文档编号:7350606 上传时间:2023-01-23 格式:DOCX 页数:20 大小:104.11KB
下载 相关 举报
数据结构课程设计报告宿舍管理系统.docx_第1页
第1页 / 共20页
数据结构课程设计报告宿舍管理系统.docx_第2页
第2页 / 共20页
数据结构课程设计报告宿舍管理系统.docx_第3页
第3页 / 共20页
数据结构课程设计报告宿舍管理系统.docx_第4页
第4页 / 共20页
数据结构课程设计报告宿舍管理系统.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

数据结构课程设计报告宿舍管理系统.docx

《数据结构课程设计报告宿舍管理系统.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告宿舍管理系统.docx(20页珍藏版)》请在冰豆网上搜索。

数据结构课程设计报告宿舍管理系统.docx

数据结构课程设计报告宿舍管理系统

数据结构课程设计报告

设计题目:

学生宿舍管理系统

学院:

年级专业:

姓名:

学号:

指导老师:

1.设计目的

宿舍对于大学生在校生活来说相当于家的存在,而宿舍管理又是学校后勤管理的重要环节,如何直观的了解宿舍的入住情况和每位同学的住宿位置是提高工作效率的重要课题,根据我们所学的C语言和数据结构课程中有关链表及外部文件的内容,为后勤管理人员编写宿舍管理查询软件,就可以轻松满足实现上述需求。

通过实际课题设计,可以对我们加深书本知识理解,了解并掌握数据结构与算法的设计方法,培养独立分析和设计能力,掌握软件开发过程的基本方法和技能,对我们的个人素质提高大有脾益。

2.需求分析

2.1性能分析

宿舍一般由若干学生入驻,每个宿舍都有独立唯一的编号,入住学生也有唯一的学号,另外添加学生的姓名和班级,使用这些关键字就可以方便的查询和管理宿舍入住情况。

程序设计应采用交互工作方式,并建立数据文件。

程序应通过建立子函数实现创建、保存与载入数据文件,查找、添加、删除、更改、显示等功能,可以自动保存修改。

应具有友好的界面和较强的容错能力。

能够迅速准确地完成各种学生信息的统计和查询,以方便管理员对学生信息的统一管理。

2.2功能分析

为方便管理员对系统进行操作,程序应具有以下功能:

(1)创建宿舍数据文件,并提示管理员输入学生姓名、学号、宿舍号、班级等信息,并在本地保存数据文件

(2)打开宿舍数据文件:

输入文件名打开保存过的数据文件

(3)查询住宿信息:

提供学号、姓名、宿舍号三种查询方式

(4)添加住宿信息:

在数据文件中添加新的住宿信息

(5)删除住宿信息:

提示管理员输入要删除的学生姓名,验证后删除

(6)修改住宿信息:

提示管理员输入要修改的学生姓名,验证后修改

(7)输出数据文件:

将住宿信息按学号的大小排序全部输出

(8)退出系统

3.程序结构及流程设计

3.1系统流程图

 

3.2函数设计

函数原型

函数功能

函数处理描述

voidcreat()

初始条件,创建新数据文件,用于存放学生信息

调用文件操作函数来实现

voidreadfile()

文件读取函数,打开已有的数据文件

调用文件操作函数来实现

voidoutput()

输出函数,用于输出所有的学生信息

调用文件操作函数,并将学号作为关键字进行冒泡排序再输出

voidnamesearch()

查找函数,用于以姓名为关键字查询

使用指针,将关键字与记录比较,若相同则输出

voidnumsearch()

查找函数,用于以学号为关键字查询

使用指针,将关键字与记录比较,若相同则输出

Voiddorsearch()

查找函数,用于以房号为关键字查询

使用指针,将关键字与记录比较,若相同则输出

voidadd()

添加函数,以姓名为关键字加入新的学生信息

使用指针,建立一个新节点,将新信息插入原文件中

voidmodify()

修改函数,用于以修改已存在的学生信息,以姓名为关键字

使用指针,将关键字与记录比较,若相同则更改原纪录并保存在原文件中

voiddeleted()

删除函数,用于删除所选的学生信息,以姓名为关键字

使用指针,将关键字与记录比较,若相同则删除一切相关记录

voidmain()

主函数,用于调用子函数

按照输入的命令调用已定义的子函数

4.系统详细设计

4.1数据结构设计

typedefstructpnode//结构体定义用于存放学生信息的节点

{charname[10];//姓名

charnum[16];//学号

charroom[30];//宿舍号

chargroup[20];//班级

}student;

charfilename[20];//文件名

FILE*fp;//指向文件的指针

4.2创建功能(voidcreat())

使用函数新建链表,再使用while循环完成对宿舍数据的录入,包括姓名、学号、班级、宿舍号等信息。

最终将录入数据保存在数组里。

完成输入后,输入#结束循环。

 

4.3读取功能(voidreadfile())

使用函数读取数据文件,根据输入的文件名加载保存在本地的数据文件,若找不到相同名称文件,则输出错误提示。

4.4查找功能(voidnamesearch(),voidnumsearch(),voidgroupsearch())

通过输入选择相关的查询函数来完成查找功能,使用指针将关键字与记录比较,若相同则输出,若无相同则输出错误提示。

4.5修改功能(voidModify())

使用函数定义指向结构体变量的指针,检验链表中是否有记录,若有记录,根据要修改的编号查找对应结点修改信息并保存,若没记录,输出错误提示。

调用Modify()函数

 

4.6删除功能(voiddeleted())

使用函数定义指向结构体变量的指针,用指针检验链表中是否有记录,若有记录根据要修改的编号查找要删除的结点并删除记录,若没记录,输出错误提示。

调用deleted()函数

 

4.7添加功能(voidAdd())

使用函数定义指向结构体变量的指针,找到插入结点,在要插入的结点输入信息并保存。

调用add()函数

4.8输出功能(voidoutput())

使用循环语句对已有的宿舍记录进行逐个读取,按学号为关键字进行冒泡排序,经过n-1趟子排序完成,第i趟子排序从第1个数至第n-i个数,若第i个数比后一个数大(则升序,小则降序)则交换两数,排序完后按顺序输出所有记录。

5.系统调试

5.1主界面

5.2创建界面

5.3加载界面

5.4按姓名查询

5.5按学号查询

5.6按宿舍号查询

5.7修改界面

5.8删除界面

5.9添加界面

5.10输出界面

5.11本地数据文件

5.12系统分析

经过测试,该宿舍管理系统结构清晰,运行时测试也相对简单。

设计的功能可以完全实现,输入的信息也可以正确显示,可以成功地退出程序。

程序运行开始,根据界面提示选择输入,测试对学生信息的增加,删除,查询,修改等功能是否实现及输出相应的信息。

当选择退出程序时,系统有没有正常结束退出程序。

本程序的不足之处在于没有登录程序,这样就没有办法设置用户管理及权限设置。

程序在运行时没有设置清屏程序,以至于屏幕不够简洁。

函数实现的功能也不够全面,在删除,更改等操作中仅以姓名为关键字,有一定的局限性。

6.心得体会

通过这次课程设计,我对C语言有了更深刻的了解,增强了程序的编写能力,巩固了专业知识,对程序的模块化观念也又模糊逐渐变的清晰了。

在程序的运行与调试过程中出现了很多错误,通过反复地复习课本上的相关知识,不停地修改与调试,我终于完成了这段程序。

在调试过程中,我认识到了C语言的灵活性与严谨性,同一个功能可以由不同的语句来实现,但编写程序时要特别注意细节方面的问题,因为一个小小的疏忽就能导致整个程序不能运行。

当然我也认识到了自己的薄弱之处,如对链表相关知识的欠缺,文件运用的不熟练,在以后的学习中我要集中精力、端正态度,争取把知识学得更扎实、更全面。

这次课程设计我做的还不是很完善,因为功能不是很多,如果以后有机会完善的话,应该对管理员和用户登录时做进一步完善。

学生的信息还不够完整,如学生的宿舍长,系别,一些费用以及学生的成绩等待相关详细信息。

在这次课程设计的过程中,我体会到要想开发一个系统软件,不仅需要相当的专业技术知识,还要有严谨缜密的思维能力。

只有思想上清晰了,编程才有意义,否则就是白费力气。

同时还要善于捕获细小的方面,因为那往往是这个程序的致命因素。

这次课程设计培养了我的细心和耐性,更树立了一种科学的态度。

7.参考资料

[1]田鲁怀.数据结构.北京:

电子工业出版社,2010

[2]谭浩强.C语言程序设计(第三版).北京:

清华大学出版社,2005

[3]刘振安,孙忱,刘燕君.C程序设计课程设计.北京:

机械工业出版社,2007

8.附录

源程序

#include

#include

#include

#include

typedefstructpnode//结构体定义用于存放学生信息的节点

{

charname[10];//姓名

charnum[16];//学号

chardor[30];//房号

chargroup[20];//班级

}student;

charfilename[20];//文件名

FILE*fp;//指向文件的指针

voidcreat()//创建一个二进制文件用于存放学生数据

{student*person;

person=(student*)malloc(sizeof(student));//为节点分配内存

printf("\n请您输入文件名:

\n");

scanf("%s",filename);

if((fp=fopen(filename,"w+"))==NULL)

{printf("\n您没有输入文件名不能找到文件");exit(0);}

printf("\n请输入学生的姓名学号房号班级用空格隔开以#结束\n");

scanf("%s",person->name);

while(strcmp(person->name,"#"))//该循环用于控制学生信息的录入遇#结束{scanf("%s%s%s",person->num,person->dor,person->group);

fprintf(fp,"%-10s%-10s%-10s%-10s\n",person->name,person->num,person->dor,person->group);scanf("%s",person->name);

}

fclose(fp);

}

voidreadfile()//文件读取函数

{printf("\n请输入文件名:

\n");

scanf("%s",filename);//此处输入为文件的路径

if((fp=fopen(filename,"r+"))==NULL)

{printf("\n无法打开该文件:

\n");exit(0);}

fclose(fp);

}

voidoutput()//输出函数用于输出文件的全部信息

{student*person;

longoffset1,offset2;

charname1[10],name2[10],name3[10];

charnum1[16],num2[16],num3[16];

chardor1[30],dor2[30],dor3[30];

chargroup1[20],group2[20],group3[20];

person=(student*)malloc(sizeof(student));

if((fp=fopen(filename,"r"))==NULL)

{printf("\n无法打开该文件");exit(0);}

while(!

feof(fp))//此循环用于对文件数据中关键字学号进行从小到大冒泡排序

{inta,b,c,d;//a为循环结束判定变量b,c,d用于起泡排序学号交换的替换

if((fp=fopen(filename,"r+"))==NULL)//冒泡排序

{printf("\n无法打开该文件");exit(0);}

while(!

feof(fp))//外部循环

{

while(!

feof(fp))//内部循环

{

offset1=ftell(fp);//获取文件内部当前指针位置fscanf(fp,"%s%s%s%s\n",person->name,person->num,person->dor,person->group);

strcpy(name1,person->name);

strcpy(num1,person->num);

strcpy(dor1,person->dor);

strcpy(group1,person->group);

if(feof(fp))

break;//文件结束跳出循环

offset2=ftell(fp);//获取文件内部下一指针位置fscanf(fp,"%s%s%s%s\n",person->name,person->num,person->dor,person->group);

strcpy(name2,person->name);

strcpy(num2,person->num);

strcpy(dor2,person->dor);

strcpy(group2,person->group);

b=strlen(num1);

c=strlen(num2);

d=strcmp(num1,num2);

if(b==c&&d>0)//如果学号1大于等于学号2则交换全部数据

{strcpy(name3,name1);

strcpy(name1,name2);

strcpy(name2,name3);

strcpy(num3,num1);

strcpy(num1,num2);

strcpy(num2,num3);

strcpy(dor3,dor1);

strcpy(dor1,dor2);

strcpy(dor2,dor3);

strcpy(group3,group1);

strcpy(group1,group2);

strcpy(group2,group3);

fseek(fp,offset1,SEEK_SET);//将指针移动offset1个字节

strcpy(person->name,name1);

strcpy(person->num,num1);

strcpy(person->dor,dor1);

strcpy(person->group,group1);

fprintf(fp,"%-10s%-10s%-10s%-10s\n",

person->name,person->num,person->dor,person->group);//排序后写入文件

strcpy(person->name,name2);

strcpy(person->num,num2);

strcpy(person->dor,dor2);

strcpy(person->group,group2);

fprintf(fp,"%-10s%-10s%-10s%-10s\n",person->name,person->num,person->dor,person->group);//排序后写入文件

}

fseek(fp,offset2,SEEK_SET);

//将文件位置指针从文件头向前移动offset2个字节

}

rewind(fp);//指向头文件

while(!

feof(fp))//此循环用于判断学号是否有序

{offset1=ftell(fp);

fscanf(fp,"%s%s%s%s\n",person->name,person->num,person->dor,person->group);

strcpy(num1,person->num);

if(feof(fp))

{a=1;break;}

offset2=ftell(fp);

fscanf(fp,"%s%s%s%s\n",person->name,person->num,person->dor,person->group);

strcpy(num2,person->num);

b=strlen(num1);

c=strlen(num2);

d=strcmp(num1,num2);

if(b==c&&d<=0)

a=1;//若a为1则有序

else

{a=0;//a为0则无序

break;}

fseek(fp,offset2,SEEK_SET);

}

if(a==1)

break;//a为1说明学号已经有序跳出循环

rewind(fp);

}

if(a)break;//若a为1,则学号已有序排列,跳出总循环,输出文件

}

rewind(fp);

printf("\n****************************************************************\n");

printf("%40s\n","输出的记录如下(已按学号排序)\n");

printf("%-20s%-20s%-20s%-20s\n","姓名","学号","房号","班级");

while(!

feof(fp))//次循环用于输出文件

{

fscanf(fp,"%s%s%s%s\n",person->name,person->num,person->dor,person->group);

printf("%-20s%-20s%-20s%-20s\n",

person->name,person->num,person->dor,person->group);

}

fclose(fp);

printf("************************************************************\n\n");

}

voidnamesearch()//按姓名搜索函数

{intk=0;

charnamekey[10];

student*person;

person=(student*)malloc(sizeof(student));

printf("\n请输入您要查找的姓名:

");

scanf("%s",namekey);

if((fp=fopen(filename,"rb"))==NULL)

{printf("\n无法打开文件");exit(0);}

while(!

feof(fp))

{

fscanf(fp,"%s%s%s%s\n",person->name,person->num,person->dor,person->group);

if(!

strcmp(namekey,person->name))

{printf("\n\n已经为您找到以下是记录:

\n\n");

printf("%-20s%-20s%-20s%-20s\n","姓名","学号","房号","班级");

printf("%-20s%-20s%-20s%-20s\n",person->name,person->num,person->dor,person->group);

k=1;

}

}

if(!

k)

printf("\n\n没有关于此姓名的任何信息!

\n");

fclose(fp);

}

voidnumsearch()//按学号搜索函数

{intk=0;

charxhkey[16];

student*person;

person=(student*)malloc(sizeof(student));

printf("\n请您输入需要查找的学号:

");

scanf("%s",xhkey);

if((fp=fopen(filename,"rb"))==NULL)

{

printf("\n无法打开文件");

exit(0);

}

while(!

feof(fp))

{

fscanf(fp,"%s%s%s%s\n",person->name,person->num,person->dor,person->group);

if(!

strcmp(xhkey,person->num))

{printf("\n\n已经为您找到以下是记录:

\n\n");

printf("%-20s%-20s%-20s%-20s\n","姓名","学号","房号","班级");

printf("%-20s%-20s%-20s%-20s\n",person->name,person->num,person->dor,person->group);

k=1;

}

}

if(!

k)

printf("\n\n没有关于该学号的任何信息\n");

fclose(fp);

}

voiddorsearch()//按房号搜索函数

{intk=0;

charfhkey[30];

student*person;

person=(student*)malloc(sizeof(student));

printf("\n请您输入想要查找的房号");

scanf("%s",fhkey);

if((fp=fopen(filename,"rb"))==NULL)

{printf("\n无法打开文件");

exit(0);

}

while(!

feof(fp))

{

fscanf(fp,"%s%s%s%s\n",person->name,person->num,person->dor,person->group);

if(!

strcmp(fhkey,person->dor))

{printf("\n\n已经为您找到以下是记录:

\n\n");

printf("%-20s%-20s%-20s%-20s\n","姓名","学号","房号","班级");

printf("%-20s%-20s%-20s%-20s\n",person->name,person->num,person->dor,person->group);

k=1;

}

}

if(!

k)

printf("\n\n没有关于此房号的任何信息\n");

fclose(fp);

}

voidadd()//插入函数用于像已有文件插入一条新的学生信息记录

{student*person;

person=(student*)malloc(sizeof(student));

if((fp=fopen(filename,"a"))==NULL)

{printf("\n无法打开文件");exit(0);}

printf("\n请您输入学生姓名学号房号班级\n");

scanf("%s%s%s%s",person->name,person->num,person->dor,person->group);

fprintf(fp,"%-10s%-10s%-10s%-10s\n",per

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1