资源描述
计算机科学与技术教研室
课程设计阐明书
(-第1学期)
课程名称
算法与数据构造课程设计
设计题目
校园附近门店服务查询系统
学号
姓名
小构成员
起止时间: 1 月 日至 年 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
修改服务信息
删除服务信息
查询服务信息
增添服务信息
退出系统
查询最短途径
图1系统构造图
2.2详细设计
2.2.1数据类型定义
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#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; //服务信息信息
}Place; //定义服务信息
2.2.2 存储构造:
h
D1
D2
D3
单链表如下:
图2单链表
数据域
指针域
每个结点包括数据域和指针域:
图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
Case 2
Case 3
查询服务
途径搜索
T
T
F
F
T
end
F
删除服务
图4系统流程图
2.2.5代码(见附录)
2.3程序测试成果
(1) 主菜单函数
(2) 查询服务信息函数
(3) 增添服务信息函数
(4) 修改服务信息函数
(5) 删除服务信息函数
(6) 途径搜索函数
3、课程设计总结
到当前为止已经学习了一学期数据构造,再加上如今通过算法与数据构造课程设计,是我对数据构造这门课有了比较深理解。固然,在学习过程中也遇到各种各样困难,但是已经通过各种途径解决了。在解决这些问题过程中让我也学到了许多课本上没有知识以及团队合伙重要性。
通过这次课程设计,我对程序中算法概念理解更加透彻。算法是程序中必不可少某些,它是指解题方案精确而完整描述,是一系列解决问题清晰指令,算法代表着用系统办法描述解决问题方略机制。也就是说,可以对一定规范输入,在有限时间内获得所规定输出。如果一种算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同算法也许用不同步间、空间或效率来完毕同样任务。同步,在选取算法时必要考虑算法时间复杂度和空间复杂度,这样才干让程序正常,高效运营。
在系统设计时也遇到了诸多问题,例如在设计MGr.legs()函数时,一方面我想到是使用数组来保存信息,但发现这种设计无法以便让程序中各个独立算法访问存储服务信息,编写代码时十分复杂,日后,在出查阅有关书籍和阅读了网上其他有关算法后,我选取了使用链表来保存信息,同步其他函数模块也可以以便访问这某些信息,达到了我想要实现功能。
通过本次课程设计,也学到了诸多,例如团队力量永远不不大于个人力量,细节决定成败等等。不但重新温习了此前学到知识,还学习到许多新知识,也结识到了自己许多局限性。例如耐心不够,有时侯调试程序时,发现了一种错误,但是总是解决不了,心里就会感到厌烦,不想继续做下去。尚有不够细心,每一次改写完程序后,检查了一遍,自己以为没有错了,成果一调试发现又有错误等等。但是也发现了自己某些长处,例如善于听取她人意见,虚心求教等。
最后,通过全组人齐心合力,最后将程序编写了出来,并且使之得到实现咱们预期目。通过本次课程设计,从一定成度上提高了咱们对数据构造熟悉度,也提高了咱们独立编程能力,同步也体会到在程序设计过程中团队合伙,共同解决问题重要性。
4、 参照文献
[1]严蔚敏等.数据构造[M](C语言版).清华大学出版社,1997.4.
[2] 张乃孝主编. 算法与数据构造 [M](C语言版). 高等教诲出版社,.
[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<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#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<j)
{
cout<<a;
while(path[i][j]!=0)
{
cout<<"->"<<path[i][j];
if(i<j)
j=path[i][j];
else
i=path[j][i];
}
cout<<"->"<<b<<endl;
cout<<" "<<endl;
cout<<"您所查找"<<a<<"->"<<b<<"两个服务之间最短距离为:"<<shortest[a][b]<<"米。"<<endl;
}
else
{
cout<<a;
while(path[i][j]!=0)
{
cout<<"->"<<path[i][j];
if(i<j)
j=path[i][j];
else
i=path[j][i];
}
cout<<"->"<<b<<endl;
cout<<"您所查找"<<a<<"->"<<b<<"两个服务之间最短途径是:"<<shortest[a][b]<<" 米。"<<endl;
}
cout<<" "<<endl;
}
int shortdistance(Place *head) //查找两服务之间最短途径
{
int i,j;
Place *t=head->next,*q=head->next;
cout<<"请输入要查询两个服务位置序号:"<<endl;
cin>>i>>j;
while(t)
{
if(t->num==i)break;
else t=t->next;
}
while(q)
{
if(q->num==j)break;
else q=q->next;
}
if(q==NULL||t==NULL)
cout<<"抱歉,没有通向途径!"<<endl;
else
{
folyd();
display(i,j);
}
cout<<endl;
return 1;
}
void add(Place *&head) //增长服务
{
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<<endl;
while(t)
{
if(t->num==p->num)
{
cout<<"此位置已被其他服务占用,请重新输入其他空白位置。"<<endl;
cout<<" "<<endl;
cin>>p->num;continue;
}
else t=t->next;
}
if(t==NULL)
{
cout<<"服务编号:";
cin>>p->date.number;
cout<<"服务名字:";
cin>>p->date.name;
cout<<"服务简介:";
cin>>p->date.introduce;
x=p->num;
cout<<endl;
cout<<"请输入途径条数、有关服务位置y、途径长度"<<endl;
cin>>a;
cout<<endl;
for(i=1;i<=a;i++)
{
cin>>y;
cin>>b;
MGr.legs[x][y]=MGr.legs[y][x]=b;
}
cout<<"服务位置:"<<p->num<<endl;
cout<<"服务编号:"<<p->date.number<<endl;
cout<<"服务名称:"<<p->date.name<<endl;
cout<<"服务简介:"<<p->date.introduce<<endl;
cout<<" "<<endl;
Place *q=head->next;
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<<"输入删除服务编号:"<<endl;
cout<<" "<<endl;
cin>>cnum;
while(p->next)
{
if(strcmp(p->next->date.number,cnum)==0)
{
cout<<"恭喜您,您已成功将服务 "<<p->next->date.name<<" 关闭!"<<endl;
p->next=p->next->next;
Num--;
break;
}
else
{
if(p->next==NULL)
cout<<"该服务不存在!"<<endl;
cout<<" "<<endl;
p=p->next;
}
}
cout<<endl;
}
void find(Place *&head) //查询服务
{
int n;
Place *p=head;
cout<<"输入查询服务位置序号:";
cout<<" "<<endl;
cin>>n;
while(p->next)
{
if(p->next->num==n)
{
cout<<"服务位置:"<<p->next->num<<endl;
cout<<"服务编号:"<<p->next->date.number<<endl;
cout<<"服务名称:"<<p->next->date.name<<endl;
cout<<"服务简介:"<<p->next->date.introduce<<endl;
break;
}
else p=p->next;
}
if(p->next==NULL)
cout<<"该服务不存在!"<<endl;
cout<<" "<<endl;
cout<<" "<<endl;
}
void replace(Place *&head) //修改服务
{
char name1[20];
char number1[10],number2[10];
char introduce1[100];
Place *p=head;
cout<<"输入要修改服务编号:"<<endl;
cout<<" "<<endl;
cin>>number1;
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<<endl;
cout<<"服务位置:"<<p->next->num<<endl;
cout<<"服务编号:"<<p->next->date.number<<endl;
cout<<"服务名称:"<<p->next->date.name<<endl;
cout<<"服务简介:"<<p->next->date.introduce<<endl;
cout<<endl;
break;
}
else p=p->next;
}
if(p->next==NULL)
cout<<"该服务不存在!"<<endl;
cout<<" "<<endl;
cout<<endl;
}
void menu() //主菜单
{ cout<<" "<<endl;
cout<<" "<<endl;
cout<<"1 查询服务请按1键; "<<endl;
cout<<"2 修改服务请按2键; "<<endl;
cout<<"3 增长服务请按3键; "<<endl;
cout<<"4 删除服务请按4键 "<<endl;
cout<<"5 途径搜索请按5键 "<<endl;
cout<<"6 退出系统请按6键; "<<endl;
cout<<" "<<endl;
cout<<" "<<endl;
}
void main() //主函数
{
cout<<" 欢迎使用衡水学院服务查询系统 "<<endl;
cout<<" "<<endl;
cout<<endl;
int x;
init(p);
while(1)
{
cout<<"当前存在服务个数为:"<<Num<<endl;
cout<<endl;
menu();
cin>>x;
switch(x)
{
case 1:find(p);break;
case 2:replace(p);break;
case 3:add(p);break;
case 4:deleted(p);break;
case 5:shortdistance(p);break;
case 6:
cout<<" 恭喜您,成功退出系统! "<<endl;
exit(0);
}
}
}
展开阅读全文