数据结构校园导游咨询系统设计和总结_第1页
数据结构校园导游咨询系统设计和总结_第2页
数据结构校园导游咨询系统设计和总结_第3页
数据结构校园导游咨询系统设计和总结_第4页
数据结构校园导游咨询系统设计和总结_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

、、,.、/

।【八;一•J

IdLrLJ-r工mJ系统

姓名:

班级:

学号:

指导教师:

2023年12月

目录

1、需求分析......................................................错误!未定义书签。

1.1系统简介.................................................错误!未定义书签。

1.2系统功能模块简介........................................错误!未定义书签。

2、概要设计......................................................错误!未定义书签。

2.1系统功能构造图...........................................错误!未定义书签。

2.2系统流程图...............................................错误!未定义书签。

2.3重要函数概要设计........................................错误!未定义书签。

2.3.1主函数概要设计.....................................错误!未定义书签。

2.3.2初始化图函数InitGraphO.........................................................错误!未定义书签。

2.3.4查询景点信息函数设计SearchGraphO..................................错误!未定义书签。

2.3.5显示图中信息函数设计ShowGraph()....................................错误!未定义书签。

2.3.6弗洛伊德算法函数设计Floyd()...............................................错误!未定义书签。

3、详细设计......................................................错误!未定义书签。

3.1主函数详细设计...........................................错误!未定义书签。

3.2初始化图函数详组设计InitGraphO....................................................错误!未定义书签。

3.3查询景点信息函数详细设计SearchGraphO.....................................错误!未定义书签。

3.4弗洛伊德算法函数详细设计Floyd()..................................................错误!未定义书签。

4、调试分析......................................................错误:未定义书签。

4.1显示主界面函数测试.......................................错误!未定义书签。

4.2查找两景点间最短途径测试................................错误!未定义书签。

4.3查看景点信息测试........................................错误!未定义书签。

5.课程设计总结...................................................错误!未定义书签。

6、附录..........................................................错误!未定义书签。

2、查询景点信息:顾客在选择此功能模块后,按照屏幕上方提

醒日勺景点名称及其对应的编号,规定顾客输入想要查询日勺景点日勺编

号,回车后系统将在已存储的景点中进行匹配,若该景点信息尚未存

储则将提醒错误;若找到对应信息则系统将输出景点信息,显示于幕

上方;

3、退出系统:顾客在使用完本系统后,选择此功能模块,系统

提醒“欢迎再次使用”后,按任意键系统将自动退出。

2、概要设计

2.1系统功能构造图

用户主界面

退

2.2系统流程图

U、任匕TZT:r^-rR51d

2.3重要函数概要设计

主函数概要设计

主函数首先是调用初始化图函数InitGraphO函数创立一种图,

而后调用显示主界面函数显示一种可视化主界面,内容包括本系统

LOGO以及景点信息及操作编号H勺提醒信息。之后,当顾客成功输入

操作编号后,使用一种switch。函数,判断顾客所需操作,匹配成

功后,调用有关函数实现顾客所需功能。

初始化图函数InitGraphO

TnitGraph。函数首先使用MyGraph构造体申明一种用于存储图

中信息的构造体,而后定义构造体中的景点数量以及途径数量,然后

使用循环为景点信息和途径长度赋值,其中赋值景点信息时使用

strcpy()函数将字符串复制给G.siteArray[i].siteName以及

G.siteArray[i].siteinfo两个数组。

显示主界面函数设计MainGraph()

MainGraph()函数重要用于显示主界面,函数中设计了本系统LOGO,

同步,界面还提醒了景点名称及其对应编号。主界面下方以列表方式

提醒顾客系统可进行的操作及其对应编号,最终提醒顾客进行输入。

查询景点信息函数设计SearchGraph()

该函数首先定义了一种变量k(用于接受顾客输入日勺查询编号)和

一种标识位flag(初始值设为1),而后使用while。循环,判断条件

为flag=l,当输入编号不合法时提醒错误,当输入合法时标识位flag

置为0,此时跳出循环,调用MyGraph构造体对应编号的景点信息,

以列表方式输出。

显示图中信息函数设计ShowGraph()

ShowGraphO函数重要功能为用循环将存储于图中的景点信息以

列表方式输出,以便顾客对应着进行输入,同步提醒顾客进行输入。

弗洛伊德算法函数设计Floyd()

本算法在设计时参照了《数据构造C语言版》一书中有关Floyd

算法日勺简介,同步借鉴了如今网上流行日勺设计方式。之因此选择本算

法来实现计算最短途径,原因在于本算法轻易理解,可以算出任意两

个节点之间的最短距离,代码编写简朴。不过,本算法缺陷在于时间

复杂度过高,不适用于计算大量数据。

Floyd算法首先将两景点间途径长度数据存储于数组D[v][w]中,

而后使用一种三维数组用于寄存最短途径所通过KJ顶点,接下来使用

三重循环判断两景点之间直接途径与否不小于间接途径,若不小于,

则将三维数组中寄存的顶点信息更改为简介途径所通过的顶点信息。

以上部分完毕后,当用于标识输入数据与否合法的Hag=l时,输

出错误信息,提醒顽客重新输入,当输入数据合法时,输出以上程序

得到成果。

3、详细设计

3.1主函数详细设计

#defineInfiniteNum10000〃定义一种无穷大数

#defineMaxInfoNum100〃定义景点数据最大容量

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#includez/MyGraph.hzz〃调用头文献

voidmain(void)

{MGraphg;〃创建图

inti;

g=InitGraphO;〃初始化校园地图

MainGraph(ftg);〃调用显示主界面函数

scanf(〃%d〃,&i);

while(i!=3)

(

switch(i)

case1:ShowGraph(&g);Floyd(&g);MainGraph(&g);break;

case2:ShowGraph(&g);SearchGraph(&g);MainGraph(&g);break;

case3:exit(0);break;

default:break;

}

scanf&:);

)

printf(〃欢迎下次继续使用!\n\n〃);

)

3.2初始化图函数详细设计InitGraphQ

MGraphInitGraph(void)〃初始化图中的信息

(

MGraphG;

inti,j;

G.siteNumber=6;〃景点数量

G.pathNumbcr=8;〃路径数量

foi(i=l;i<=G.sileNumbei-;i++)

G.siteArray[i].siteidentifier=i;〃对景点进行对应编号

strcpy(G.siteArray[1].siteName,*一教”);

strcpy(G.siteArray[1].siteinfo,〃最有历史的J教学楼〃);

strcpy(G.siteArray[2].siteName,“软件学院〃);

strcpy(G.siteArray[2].siteinfo,”规模庞大,师资雄厚,全校第二大院");

strcpy(G.siteArray[3].siteName,〃老图书馆”);

strcpy(G.siteArray[3].siteinfo,"说实话,太破了!〃);

strcpy(G.siteArray[4].siteName,“校门”):

strcpy(G.siteArray[4].siteinfo,“有点小家子气,规模太小〃);

strcpy(G.siteArray[5].siteName,〃新图书馆〃);

strcpy(G.siteArray[5].sitclnfo,〃邵逸夫先生捐赠『、J,设施较为完备,最

常去的地方〃);

strcpy(G.siteArray[6].siteName,〃南区食堂〃);

strcpy(G.siteArray[6].siteinfo,〃价格尚算公道,但卫生状况较为堪忧,

已经吃出好几次头发了〃);

for(i=1;i<=G.siteNumber;i++)〃使用循环对途径进行赋

值,对于没有直接路径的,赋值为无穷大

for(j=1;j<=G.siteNumber;j++)

G.pathArray[i][j].path=InfiniteNun;

G.pathArray[l][2].path=200;

G.pathArray[1][3],path=100;

G.pathArray[l][4].path=400;

G.pathArray[2][4].path=300;

G.pathArray[4][5].path=100;

G.pathArray[4][6].path=500;

G.pathArray[5][6].path=500;

for(i=1;i<=G.siteNumber;i++)〃所构造的图为无向图,故

相反方向途径相似

for(j=1;j<=G.siteNumber;j++)

G.pathArray[j][i].path=G.pathArray[i][j].path;

returnG;

)

3.3查询景点信息函数详细设计SearchGraphQ

voidSearchGraph(MGraph*G)〃用于查询景点信息,以列表方式

输出

(

intk,flag=l;

while(flag)

(

prinlfC请输入要查询H勺景点编号:〃);

scanf&k);

if(k<=0||k>G->siteNumber)〃输入景点编号不合法时提醒错误

printf(〃景点编号不存在!请重新输入

景点编号:〃);

scanf(〃%d〃,&k);

}

if(k>O&&k<=G->siteNumber)//输入合法时将falg置为0

flag=O;

}

printf("

\n〃);

printf(z,编号景点名称简介\n〃);

printfC%-4d%~16s%~62s

\n〃,G->siteArray[k],siteldentifier,G->siteArray[k].siteName,G->siteAr

ray[k].siteinfo);〃输出景点信息

)

3.4弗洛伊德算法函数详细设计Floyd()

voidFloyd(MGraph〃使用弗洛伊德算法2求出最短途

(

intv,u,i,w,k,j;

intflag=1;〃用于标识输入数据与否对的,

若输入数据符合规定,则将flag置为0

intp⑺⑺[7],D[7]⑺;

for(v=1;v<=G->siteNumber;v++)

for(w=1;w<=G->siteNumber;w++)

{

D[v][w]=G->pathArray[v][w].path;〃将途径数据寄存至数

组D[v][w]中

for(u=1;u<=G->siteNumber;u++)

p[v][w][u]=0;〃该三维数组用于寄存

两景点之间与否有直接途径,若有则记为1,无则记为0

if(D[v][w]<InfiniteNum)

(

P[v][w][v]=l;p[v][w][w]=1;

)

}

for(u=1;u<=G->siteNumber;u++)

for(v=1;v<=G->siteNumber;v++)

for(w=1;w<=G->siteNumber;w++)

if(D[v][u]+D[u][w]<D[v][w])//假如两点之间直接途径

不小于简介途径,则将该两点之间途径置为间接途径

D[v][w]=D[v][u]+D[u][w];

for(i=1;i<=G->siteNumber;i++)

p[v][w][i]=p[v][u][i]||p[u][w][i];〃获取两点

之间途径所通过H勺景点编号

)

while(flag)

(

printfC请输入出发点和目的地口勺编

号:〃);

scanf(〃%d%d〃,&k,&j);

if(k<=0||k>G->siteNumber|Ij<=0||j>G->siteNumber)

(

printfC景点编号不存在!请重新输

入:〃);

scanf(,,%d\n%d/,,&k,&j);

}

if(k==j)

printf(〃出发点和目的地同样!请重新

输入:〃);

scanf(〃%d\n%d〃,&k,&j);

if(k>O&&k<=G->siteNumber&&j>0&&j<=G->siteNumber)

flag=0;〃输入的数据合

法,故将flag=0

}

printf(z/\n最短游览路线:%sz/,G->siteArray[k].sitcNamc);

if(k>j){

for(u=G->siteNumber;u>0;u-)

if(p[k][j][u]&&k!=u&&j!=u)

printfC—>%s”,G->siteArray[u].siteName);)

if(k<j){

for(u=l;u<=G->siteNumber;u++)

if(p[k][j][u]&&k!=u&&j!=u)

printfC一>%s〃,G->siteArray[u].siteName);}

printf(〃一>%s,z,G->siteArray[j].siteName);

printf("总路线长%dm\n〃,D[k][j]);

}

4、调试分析

4.1显示主界面函数测试

显示主界面函数必须实现提醒景点名称及其对应编号,主界面下

方以列表方式提醒顾客系统可进行的操作及其对应编号,最终提醒顾

客进行输入。经测试成果如下:

■I:\QQPCmgr\Desktop\数据结比浑程设计U弗司氨校医导游咨泡系统.exe口回汉

■输入命令后最短路径或景点信息显示于屏幕上方

名称

工^

2W

3翳

4

5图

编号功能

1查找两景点间最短路径

2查看景点信息

3退出系统

请输入您的操作编号:

4.2查找两景点间最短途径测试

本功能模块规定在按照景点信息列表中提醒的信息顾客输入起点

编号和终点标号后输出最短途径,经测试后该功能可以实现,没有何

错误。测试成果如下图:

输入起点和终点:

。|回l-awl

"I:\QQPCmgr\Desktop\数据结吃课程设计\通程序\校医导游咨询系统.exe

l件1

i帛

r图

a区

编号功能

1查找两景点间最通路径

2查看景点信息

3退出系统

输出最短途径:

I>

最短游览路线:一教一>校门一>南筌幕里虎卷线均。轲

…*********************江西农业大学校园导游系统^eM*M*M*M*M*M*M*M*M*M*M*M*M*M*M*M*M*M*M*M*M*M*M*)6)e)e)H1|

,输入命令后最短路径或景点信息显示于屏幕上方・

工-

2u1

3f

4f

52

6l

编号功能

1查找两景点间最短路径

2查看景点信息

3退出系统

请输入您的操作编号:

4.3查看景点信息测试

本功能模块规定在顾客输入景点编号后,系统和已存储日勺景点信

息进行配对,假如景点不存在,则提醒错误,若景点存在则输出景点

信息,经测试,到达了预期效果,且容错处理正常运行。测试成果如

下:

,I:\QQPCmgr\Desktop\数据结比课程设计1谅星小校医导游咨询系院.exe

.江西农业大学校园导游系统*****************************

-------------输入命令后最短路径或景点信息显示于屏幕上方

1-

2u1

3f

4f

52

6i

编号功能

1查找两景点间最短路径

2查看景点信息

3退出系统

请输入您的操作编号:.______________

5.课程设计总结

通过这次课程设计,我对程序中算法的概念理解的愈加透彻。算

法是程序中必不可少日勺部分,它是指解题方案日勺精确而完整日勺描

述,是一系列处理问题日勺清晰指令,算法代表着用系统的措施描

述处理问题日勺方略机制。也就是说,可以对一定规范日勺输入,在

有限时间内获得所规定日勺输出。假如一种算法有缺陷,或不适合

于某个问题,执行这个算法将不会处理这个问题。不一样日勺算法

也许用不一样的时间、空间或效率来完毕同样的任务。同步,在

选择算法时必须考虑算法H勺时间复杂度和空间复杂度,这样才能

让程序正常,高效W、J运行。

在系统设计时也碰到了诸多问题,例如在设计InitGraph。函数

时,首先我想到的是使用数组来保留信息,但发现这种设计无法

以便口勺让程序中各个独立算法访问存储II勺景点信息,编写代码时

十分复杂,后来,在出查阅有关书籍和阅读了网上其他有关算法

后,我选择了使用构造体数组来保留信息,这种方式顺利地将信

息保留到了图中,同步其他函数模块也可以以便的访问这部分信

息,到达了我想要实现的功能。

《数据构造》在计算机科学中是一门综合性日勺专业基础课.数据构

造的研究不仅波及到计算机的硬件(尤其是编码理论、存储装置和存

取措施等)的研究范围,并且和计算机软件均研究有着更亲密的关系,

无论是编译程序还是操作系统,都波及到数据元素在存储器中H勺分派

问题.在研究信息检索时也必须考虑怎样组织数据,以便查找和存取数

据元素更为方面.因此,可以认为数据构造是介于数学、计算机硬件和

计算机软件三者之间的一门关键课程.在计算机科学中,数据构造不仅

是一般程序设计(尤其是非数值计算的程序设计)H勺基础,并且是设计

和实现编译程序、操作系统、数据库系统及其他系统程序和大型应用

程序日勺重要基础。

6、附录

源程序清单:

〃如下保留在头文献“MyGraph.h”中

typedefstruct〃定义用于寄存权值日勺构造体

(

intpath;〃途径长度

}ArCel1,AdjMatrix[MaxInfoNum][Max1nfoNum];

typedefstruct

(

charsiteName[30];//用于寄存景点名称

intsiteidentifier;〃用于寄存景点编号

charsitelnfo[200];〃用于寄存景点信息

}infoType;

typedefstruct

(

infoTypesiteArray[MaxInfoNum];//景点数组,用于寄存景点名及景点信息

AdjMatrixpathArray;//途径数组

intsiteNumber;//景点数量

intpathNumbcr;//途径总数量

}MGraph;

MGraphInitGraph(void)//初始化图中的信息

MGraphG;

inti,j;

G.siteNumber=6:〃景点数最

G.pathNumber=8;〃路径数量

for(i=l;i<=G.siteNumber;i++)

G.siteArray[i].siteldentifier=i;〃对景点进行对应编号

strcpy(G.siteArray[l].siteName,"一教”);

strcpy(G.siteArray[l].siteinfo,〃最有历史的教学楼”);

strcpy(G.siteArray[2].siteName,〃软件学院“);

strcpy(G.siteArray[2].siteinfo,”规模庞大,师资雄厚,全校第二大院”);

strcpy(G.siteArray[3].siteName,"老图书馆");

strcpy(G.siteArray[3].siteinfo,“说实话,太破了!“);

strcpy(G.siteArray[4].sitcNamc,"校门”);

strcpy(G.siteArray[4].siteinfo,”有点小家子气,规模太小”);

strcpy(G.siteArray[5].siteName,”新图书馆”);

strcpy(G.siteArray[5].siteinfo,"邵逸夫先生捐赠的,设施较为完备,最常去H勺地方

”);

strcpy(G.siteArray[6].siteName,"南区食堂”);

strcpy(G.siteArray[6].sitelnfo,”价格尚算公道,但卫生状况较为堪忧,已经吃出好

几次头发了〃);

for(i=1;i<=G.siteNumoer;i++)//使用循环对途径进行赋值,对于没

有直接路径的,赋值为无穷大

for(j=1:j<=G.siteNumber:j++)

G.pathArra>r[I][j].path=Infinite;

G.pathArray[1][2].path=200;

G.pathArray[1][3].path=10();

G.pathArray[1][4].path=400;

G.pathArray[2][4].path=300;

G.pathArray[4][5].path=100;

G.pathArray[4][6].path=500;

G.pathArray[5][6].path=500;

for(I=1;i<=G.siteNumber;i++)〃所构造的图为无向图,故相反方向途

径相似

for(j=1;j<=G.siteNumber;j++)

G.pathArray[j][i].path=G.pathArray[i][j].path;

returnG;

)

voidFloyd(MGraph*G)//使用弗洛伊德算法2求出最短途径

(

intv,u,i,w,k,j;

intflag=1;〃用于标识输入数据与否对的,若输入数据

符合规定,则将flag置为0

intp[7][7][7],D[7][7]:

for(v=1;v<=G->siteNumber;v++)

for(w=1;w<=G->siteNumber;w++)

(

D[v][w]=G->pathArray[v][w].path;〃将途径数据寄存至数组l)[v][w]

for(u=1;u<=G->siteNumber;u++)

p[v][w][u]=0;〃该三维数组用于寄存两景点之

间与否有直接途径,若有则记为1,无则记为0

if(D[v][w]<InfiniteNum)

p[v][w][v]=l;p[v][w][w]=1;

)

for(u=1;u<=G->sitcNumber;u++)

for(v=I;v<=G->siteNumber;v++)

for(w=1;w<=G->siteNumber;\v++)

if(D[v][u]+l)[u][w]<D[v][w])//假如两点之间直接途径不小于简

介途径,则将该两点之旬途径置为间接途径

(

D[v][w]=D[v][u]+D[u][w];

for(i=1;i<=G->siteNumber;i++)

p[v][w][i]=p[v][u][i]||p[u][w][i];//获取两点之间途

径所通过的景点编号

)

while(flag)

(

printff请输入出发点和目的地的编号:〃);

scanf("%d%d”,&k,&j);

if(k<=0k>G->siteNumber|Ij<=0|j>G->siteNumber)

(

printff景点编号不存在!请重新输入:“);

scanf("%d\n%d”,&k,&j);

)

if(k==j)

(

printfC出发点和目的地同样!请重新输入:〃);

scanf(,,%d\n%d,\&k,&j);

}

if(k>O&&k<=G->siteNumber&&j>O&&j<=G->siteNumber)

flag=O;//输入的数据合法,故将

flag=0

)

printf(?,\n最短游览路线:%sz,,G->siteArray[k].siteName);

if(k>j){

for(u=G->siteNumbcr;u>0;u一)

if(p[k][j][u]&&k!=u&&j!=u)

printf(w—G->siteArray[u].siteName);}

if(k<j){

for(u=l;u<=G->sileNumber;u++)

if(p[k][j][u]&&k!=u&&j!=u)

printf(*―>%s^,G->siteArray[u].siteName);}

printfC—>%sz,,G->siteArray[j].siteName);

printf("总路线长D[k][j]);

)

voidMainGraph(MGraph*G)〃调用此函数可实现输出主界面功能

inti;

printf("**************************江西农业大学校园导游系统

printf('\n"):

printff-----------输入命令后最短途径或景点信息显示于屏幕上方

\n〃);

printf("\n");

printfC编号景点名称\n〃);

for(i=1;i<=G->siteNumber;i++){

printfC%-4d%-12s

\n”,G->siteArray[i].siteidentifier,G->siteArray[i].siteName);

)

printfC\n*);

printfC'n");

printf(*编号功能\n");

printfC

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论