计算机科学与技术教研室
课程设计说明书
(2014-2015学年第1学期)
课程名称 设计题目 学号 小组成员 算法与数据结构课程设计 校园附近门店服务查询系统 姓名 起止时间: 2015年 1 月 日至 2015 年 1 月 日 在为期两周的课程设计中,该生按时到课,课堂表现良好,参与了课程设计的整个过程,实现了校园附近门店服务查询系统的以下功能:对某一门店服务信息位置进行添加、查询、修改和删除,并可查找两门店之间的最短路径。其课程设计说明书填写正确,条理清楚,对于课程设计过程介绍详细,代码正确,可见对于数据课程设计 结构程序有了一定的独立编程能力并且对课本知识掌握较熟练。作品演示较熟练,评语 能按照设计要求完成指定的功能且能加入一些自己的想法。答辩过程中回答问题较流利,对数据结构程序掌握熟练。 演示与答辩平时成绩 报告成绩 成绩 指导教师 成绩总评 (签字) 注:成绩均用百分制。总成绩=平时成绩*20%+报告成绩*40%+演示与答辩成绩*40%
年月日
设计题目:校园附近门店服务查询系统
1、课程设计目的
(1)数据结构课程设计是综合运用数据结构课程中学到的几种典型数据结构,以及程序设计语言(C++语言),自行实现一个较为完整的应用系统。
(2)通过系统分析、系统设计、编程调试,写实验报告等环节,进一步掌握应用系统设计的方法和步骤,灵活运用并深刻理解典型数据结构在软件开发中的应用。 (3)学会将知识应用于实际的方法,提高分析和解决问题的能力,增加综合能力。
1)熟练掌握链表存储结构及其建立过程和常用操作; 2)学会自己调试程序的方法并掌握一定的技巧;
3)通过温习旧的知识,学习新知识,并提高分析和解决问题的能力。 2、课程设计正文 2.1概要设计 2.1.1 系统分析
该系统主要功能包括:增添服务信息、查询服务信息、修改服务信息、删除服务信息以及推荐路径等。
1.主程序模块:连接各种功能子模块,使用循环等待用户操作,完成程序的基本操作实现功能。
2.菜单显示模块:生成每个菜单的显示界面,使程序更简单清晰。
3.查询服务信息:用户在选择此功能模块后,按照屏幕上方提示的服务信息名称及其对应的编号,要求用户输入想要查询的服务信息的编号,回车后系统将在已存储的服务信息中进行匹配,若该景点信息尚未存储则将提示错误;若找到对应信息则系统将输出服务信息,显示于幕上方。
4.查询两服务信息最短路径:运用弗洛伊德算法,用户在选择此功能模块后,按照屏幕上方提示的服务信息名称及其对应的编号,要求用户输入起点和终点的编号,系统将在已存储的景点中进行匹配,若未找到所需查询的服务信息编号,系统将提示错误并要求用户再次输入。若输入信息合法,则回车后系统将给出最短路径,显示于屏幕上方。
5.删除服务信息:用户操作功能模块,由主程序直接调用的函数模块,将功能具象化,系统工具函数模块,先查找到所存在的服务信息,然后对用户希望删除的服务信息进行删除操作,若所要删除的服务信息不存在,则输出不存在此服务信息。
2.1.2系统结构图
系统要实现的功能:1、增添服务信息;2、修改服务信息;3查询服务信息;4、查询两服务信息之间最短路径;5、删除服务信息;6、退出系统。
系统结构图如图1
增添服务信息修改服务信息校园服务信息管理系统 查询服务信息查询最短路径删除服务信息退出系统 2.2详细设计 2.2.1数据类型定义
#include #define N 100 //服务信息个数最大100 #define Road 1000 //定义路径为1000 intNum=9; //目前服务信息个数 using namespace std; typedefstructElemtype { char name[30]; char number[10]; char introduce[200]; }Elemtype; typedefstruct Place { intnum; //位置序号 Place *next; Elemtype date; //服务信息信息 图1系统结构图 }Place; //定义服务信息 2.2.2 存储结构: 单链表如下: h D1 图2单链表 D2 D3 每个结点包含数据域和指针域: 数据域 指针域 图3结点图 2.2.3 函数声明 (1)服务信息查询函数 函数名:void find(Place *&head) 操作结果:查找需要的服务信息 分析:输入所要查找的服务信息的编号,为链表建立一个附加表头结点,将p付给表头指针;同时判断输入的字符串是否满足条件;用if语句判断是否输入完成。 (2)服务信息增添函数 函数名:void add(Place *&head) 操作结果:增加新的的服务信息 分析:运用指针p指向Place *&head结构体,增加服务信息的位置、编号、名称等信息将p赋给表头指针,初始化count为0,用循环语句遍历进行保存。 (3)服务信息修改函数 函数名:void replace(Place *&head) 操作结果:对原有的服务信息进行修改 分析:使用while与for语句遍历链表,对已经存在的服务信息进行修改并保存。 (4)服务信息删除函数 函数名:void deleted(Place *&head) 操作结果:删除已经不存在的服务信息 分析:用for与if语句,找到所要删除的字符串,用while语句删除已经不存在的服务信息。 (5)求两服务信息之间最短路径函数 函数名:intshortdistance(Place *head) 操作结果:查找两个服务信息之间的最短路径 分析:运用弗洛伊德算法,写出函数,再运用函数计算出两个服务信息之间的最短路径并输出运算结果。 (7)主菜单控制函数 函数名:void menu() 操作结果: 显示以下几个菜单:1) 查询服务信息;2) 修改服务信息;3) 增加服务信息;4) 除服务信息;5)路径搜索;6) 退出系统; 2.2.4函数流程图 系统流程图如图4 开始 初始化 写入服务信息信息 Case 1 F Case 2 F Case 3 F T end T T 查询服务 路径搜索 删除服务 图4系统流程图 2.2.5代码(见附录) 2.3程序测试结果 (1)主菜单函数 (2)查询服务信息函数 (3)增添服务信息函数 (4)修改服务信息函数 (5)删除服务信息函数 (6)路径搜索函数 3、课程设计总结 到现在为止已经学习了一学期的数据结构,再加上如今通过算法与数据结构的课程设计,是我对数据结构这门课有了比较深的了解。当然,在学习过程中也遇到各种各样的困难,不过已经通过各种途径解决了。在解决这些问题的过程中让我也学到了许多课本上没有的知识以及团队合作的重要性。 经过这次课程设计,我对程序中算法的概念理解的更加透彻。算法是程序中必不可少的部分,它是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执 行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。同时,在选择算法时必须考虑算法的时间复杂度和空间复杂度,这样才能让程序正常,高效的运行。 在系统设计时也碰到了很多问题,比如在设计MGr.legs()函数时,首先我想到的是使用数组来保存信息,但发现这种设计无法方便的让程序中各个独立算法访问存储的服务信息,编写代码时十分复杂,后来,在出查阅相关书籍和阅读了网上其它相关算法后,我选择了使用链表来保存信息,同时其它函数模块也可以方便的访问这部分信息,达到了我想要实现的功能。 通过此次课程设计,也学到了很多,比如团队的力量永远大于个人的力量,细节决定成败等等。不但重新温习了以前学到的知识,还学习到许多的新的知识,也认识到了自己的许多的不足。例如耐心不够,有时侯调试程序时,发现了一个错误,但是总是解决不了,心里就会感到厌烦,不想继续做下去。还有不够细心,每一次改写完程序后,检查了一遍,自己认为没有错了,结果一调试发现又有错误等等。不过也发现了自己的一些优点,比如善于听取他人意见,虚心求教等。 最后,通过全组人的齐心协力,最终将程序编写了出来,并且使之得到实现我们的预期目的。通过此次课程设计,从一定成度上提高了我们对数据结构的熟悉度,也提高了我们独立编程的能力,同时也体会到在程序设计过程中团体合作,共同解决问题的重要性。 4、参考文献 [1]严蔚敏等.数据结构[M](C语言版).清华大学出版社,1997.4. [2] 张乃孝主编. 算法与数据结构 [M](C语言版). 高等教育出版社, 2002. [3] 李廉治,姜文清,郭福顺.数据结构[M].大连理工大学出版社,1989. 答辩记录 答辩小组教师: 提问与答辩情况记录如下: 1、求最短路径的函数是怎么运行的? 答:首先需要用户将所要查找到两服务分别输入,然后运用所编写的void folyd()函数进行对两服务位置之间的最短距离进行计算,然后用void display(inti,int j)函数对所得到的结果进行输出,用户便可以从中得到所推荐的最短路径。 2、主要功能查询是如何实现的? 答:主要是在单链表上进行顺序查找,查找成功时,开辟空间,输入要查找服务的编号信息,门店信息查询会有一种查询方式,通过提示进入switch选择语句进行选择,在这个过程中还运用了for、while等语句进行操作。 3、程序的初始化是怎样设计的? 答:程序的初始化先通过void init(Place *&head)定义服务的信息,包括服务位置、服务编号、服务内容等信息,然后运用MGr.legs[i][j]=Road函数定义服务之间的距离,确立了服务信息,定义了程序的初始化。 源代码: #include #define N 100 //服务个数最大100 #define Road 1000 //定义路径为1000 int Num=9; //目前服务个数 using namespace std; typedef struct Elemtype { char name[30]; char number[10]; char introduce[200]; }Elemtype; typedef struct Place { int num; //位置序号 Place *next; Elemtype date; //服务信息 }Place; //定义服务 typedef struct MGraph { Place place; int legs[N][N]; //存放路径长 }MGraph; MGraph MGr; //全局变量,定义MGr为MGraph类型 int shortest[N][N]; //定义全局变量存贮最小路径 int path[N][N]; //定义存贮路径 Place *p; void init(Place *&head) //定义服务位置 { Place *p,*q; head=(Place *)malloc(sizeof(Place)); head->next=NULL; q=head; p=(Place *)malloc(sizeof(Place)); p->num=1; strcpy(p->date.name,\"购物\"); strcpy(p->date.number,\"1\"); strcpy(p->date.introduce,\"位于学校北公寓西行30M处,有两层楼大小,货物十分齐全,地处学校门口,是同学们常去的地方,提供各种购物的服务。\"); p->next=q->next; q->next=p; q=p; p=(Place *)malloc(sizeof(Place)); p->num=2; strcpy(p->date.name,\"上网\"); strcpy(p->date.number,\"2\"); strcpy(p->date.introduce,\"位于学校北公寓东行20M处,有两个店铺可供选择,生意火爆,提供上网服务。\"); p->next=q->next; q->next=p; q=p; p=(Place *)malloc(sizeof(Place)); p->num=3; strcpy(p->date.name,\"洗浴\"); strcpy(p->date.number,\"3\"); strcpy(p->date.introduce,\"位于学校北公寓南行650M处,是学生们经常去的地方,适合平民消费,价格实惠,水温适度,但距离学校较远。\"); p->next=q->next; q->next=p; q=p; p=(Place *)malloc(sizeof(Place)); p->num=4; strcpy(p->date.name,\"清真小吃\"); strcpy(p->date.number,\"4\"); strcpy(p->date.introduce,\"位于学校北公寓南行400M处,作为老店,很受附近居民的欢迎,可提供烧烤,凉菜等服务,适合夜晚在此就餐。\"); p->next=q->next; q->next=p; q=p; p=(Place *)malloc(sizeof(Place)); p->num=5; strcpy(p->date.name,\"打印文件\"); strcpy(p->date.number,\"5\"); strcpy(p->date.introduce,\"位于学校北公寓东行80M处,提供打印文件、制作光盘等服务,价格较实惠,营业时间较长。\"); p->next=q->next; q->next=p; q=p; p=(Place *)malloc(sizeof(Place)); p->num=6; strcpy(p->date.name,\"火锅\"); strcpy(p->date.number,\"6\"); strcpy(p->date.introduce,\"位于学校北公寓南行150M处,作为试营业的商铺,服务态度较好,菜种齐全,适合多人聚餐。\"); p->next=q->next; q->next=p; q=p; p=(Place *)malloc(sizeof(Place)); p->num=7; strcpy(p->date.name,\"早餐\"); strcpy(p->date.number,\"7\"); strcpy(p->date.introduce,\"位于学校北公寓西行300M处,只有早上开放提供服务,其他时间段不营业,菜系有油条、豆浆等。\"); p->next=q->next; q->next=p; q=p; p=(Place *)malloc(sizeof(Place)); p->num=8; strcpy(p->date.name,\"快递\"); strcpy(p->date.number,\"8\"); strcpy(p->date.introduce,\"位于学校北公寓南行300M处,可获取收发韵达、申通快递等服务。\"); p->next=q->next; q->next=p; q=p; p=(Place *)malloc(sizeof(Place)); p->num=9; strcpy(p->date.name,\"照相\"); strcpy(p->date.number,\"9\"); strcpy(p->date.introduce,\"位于学校北公寓南行100M处,可获取快照、艺术照、证件照等服务。\"); p->next=q->next; q->next=p; q=p; int i,j; //定义服务间的距离 for(i=1;i<=N;i++) { for(j=1;j<=N;j++) { MGr.legs[i][j]=Road; } } for(i=1;i<=N;i++) shortest[i][j]=0; MGr.legs[0][1]=MGr.legs[1][0]=30; MGr.legs[0][2]=MGr.legs[2][0]=19; MGr.legs[0][3]=MGr.legs[3][0]=100; MGr.legs[3][4]=MGr.legs[4][3]=50; MGr.legs[3][5]=MGr.legs[5][3]=20; MGr.legs[4][5]=MGr.legs[5][4]=15; MGr.legs[5][6]=MGr.legs[6][5]=18; MGr.legs[6][7]=MGr.legs[7][6]=24; MGr.legs[1][2]=MGr.legs[2][1]=50; MGr.legs[2][7]=MGr.legs[7][2]=20; MGr.legs[8][7]=MGr.legs[7][8]=16; MGr.legs[7][9]=MGr.legs[9][7]=26; } void folyd() { int i,j,k; for(i=1;i<=N;i++) { for(j=1;j<=N;j++) { shortest[i][j]=MGr.legs[i][j]; path[i][j]=0; } } for(k=1;k<=N;k++) { for(i=1;i<=N;i++) { for(j=1;j<=N;j++) //佛洛依德算法 { if(shortest[i][j]>(shortest[i][k]+shortest[k][j])) { shortest[i][j]=shortest[i][k]+shortest[k][j]; path[i][j]=k; path[j][i]=k; //记录经过的路径 } } } } } void display(int i,int j) //输出两个服务的路径及最短路径 { int a,b; a=i; b=j; cout<<\"我们向您推荐的最短路径是: \"; if(i cout<<\"请输入要查询的两个服务的位置序号:\"< Place *p,*t=head->next; p=(Place *)malloc(sizeof(Place)); int a; int b; int x; int y; int i; cout<<\"请输入添加的服务位置(需输入大于9的整数)。\"; cin>>p->num; cout< cout<<\"服务位置:\"< while(q->next) { q=q->next; } p->next=q->next; q->next=p; Num++; } } void deleted(Place *&head) //删除服务 { int text=0; char cnum[10]; Place *p=head; cout<<\"输入删除的服务编号:\"< if(strcmp(p->next->date.number,cnum)==0) { cout<<\"恭喜您,您已成功将服务 \"< cout<<\"该服务不存在!\"< cout< Place *p=head; cout<<\"输入查询的服务位置序号:\"; cout<<\" \"< while(p->next) { if(p->next->num==n) { cout<<\"服务位置:\"< if(p->next==NULL) cout<<\"该服务不存在!\"< char name1[20]; char number1[10],number2[10]; char introduce1[100]; Place *p=head; cout<<\"输入要修改的的服务编号:\"< //修改服务 while(p->next) { if(strcmp(p->next->date.number,number1)==0) { cout<<\"请输入新的服务名称:\"; cin>>name1; cout<<\"请输入新的服务编号:\"; cin>>number2; cout<<\"请输入新的服务简介:\"; cin>>introduce1; strcpy(p->next->date.name,name1); strcpy(p->next->date.number,number2); strcpy(p->next->date.introduce,introduce1); cout< if(p->next==NULL) cout<<\"该服务不存在!\"< cout<<\"4 删除服务请按4键 \"< cout<<\" 欢迎使用衡水学院服务查询系统 \"< 因篇幅问题不能全部显示,请点此查看更多更全内容