数据库课程设计地铁建设问题.docx
- 文档编号:6834761
- 上传时间:2023-01-11
- 格式:DOCX
- 页数:18
- 大小:131.39KB
数据库课程设计地铁建设问题.docx
《数据库课程设计地铁建设问题.docx》由会员分享,可在线阅读,更多相关《数据库课程设计地铁建设问题.docx(18页珍藏版)》请在冰豆网上搜索。
数据库课程设计地铁建设问题
软件学院
课程设计报告书
课程名称数据结构
设计题目地铁建设问题
专业班级软件工程10-01班
学号1020010121
姓名童林
指导教师徐娇月
2012年1月
目录
1.设计时间…………………………………………………………2
2.设计目的…………………………………………………………2
3.设计任务…………………………………………………………2
4.设计内容…………………………………………………………2
4.1需求分析………………………………………………………2
4.2总体设计………………………………………………………3
4.3详细设计………………………………………………………5
4.4测试与分析……………………………………………………8
4.4.1测试……………………………………………………………9
4.4.2分析……………………………………………………………10
4.5附录……………………………………………………………10
5总结与展望………………………………………………………13
6.参考文献…………………………………………………………14
7.成绩评定…………………………………………………………14
1设计时间
2012/01/03至2012/01/06
2设计目的
1.通过调试程序积累调试C程序的经验;
2.通过完成课程设计,逐渐培养学生的编程能力;
3.培养用计算机解决实际问题的能力;
4.通过课程设计,加深对《数据结构》这一课程所学内容的进一步理解与巩固。
3设计任务
某城市要在各个辖区之间修建地铁,由于地铁建设费用昂贵,因此需要合理安排地铁建设线路,使市民可以沿地铁到达各个辖区,并使总费用最小。
4设计内容
4.1需求分析
1.程序所能达到的功能:
⑴creatve()---创建结构体数组,存储辖区名
CreateGraph()---建立辖区间直接距离的无向图,用邻接矩阵存储
⑶pri()---输出无向图的邻接矩阵
⑷prim()---普利姆算法计算无向图的最小生成树,输出最优路线
2.输入的形式和输入值的范围:
输入数字和字母,字母为辖区名,数字为直接距离,名称个数n,线路个数e,0 3.输出的形式: 最佳建设路径为: (辖区名----辖区名)---直接路径 4.测试数据包括在正确的输入及输出结果及含有错误的输入及输出结果: 正确输入: 辖区个数: 4名称: abcd线路个数: 5 线路起始辖区: 123、132、145、244、343 输出为: (a----c)---2 (a----b)----3 (c----d)---3 总里程数: 11 错误输入: 辖区个数: 4名称: abcd线路个数: 15 输出: 输入错误! 请重新输入: 4.2总体设计 1、抽象数据类型定义 ADTGraph{ 数据对象v: v是具有相同特性的数据元素的集合,成为顶点集。 数据关系R: R={VR} VR={ 谓词P(v,w)定义了弧 基本操作P: CreateGraph(&G,V,VR); 初始条件: V是图的顶点集,VR是图中弧的集合。 操作结果: 按V和VR的定义构造图G。 }ADTGraph 2.主程序模块的整体流程图 输入辖区个数和辖区名 输入线路个数 N Y 输入各条线路起点、终点和直接距离 建立无向图,邻接矩阵存储 输出邻接矩阵 普利姆算法计算最小生成树 输出最优线路和总里程 图1程序流程图 3、各程序模块间层次(调用)关系如下: 主函数main()调用intcreatve(cityvex[max])创建结构体数组存储辖区名; 主函数main()调用intCreateGraph(intg[][max],intn,voidpri(intg[][max],intn))建立无向图,用邻接矩阵存储; intCreateGraph(intg[][max],intn,voidpri(intg[][max],intn))调用voidpri(intg[][max],intn)输出邻接矩阵; 主函数main()调用voidprim(intg[][max],intn,cityvex[max])计算最小生成树,输出最优线路和总里程。 4.3详细设计 1、声明结构体类型 typedefstructnode { charname[10];//辖区名称 }city; 2、主要函数伪码算法 创建结构体数组,存储辖区名: intcreatve(cityvex[max])//创建辖区名数组 { inti,n; printf("设置辖区的个数: ");//城市中辖区的个数 scanf("%d",&n); for(i=1;i { printf("第%d个城市辖区名称为: ",i); scanf("%s",vex[i].name); } return(n); } 创建无向图,邻接矩阵存储 intCreateGraph(intg[][max],intn,voidpri(intg[][max],intn))/*建立无向图*/ { inte,i,j,k,v1=0,v2=0,weight=0; printf("输入可建地铁线线路个数: "); scanf("%d",&e) while(e<=0||e>=n*(n-1)||n>=max) { error(); printf("输入可建地铁线线路个数: "); scanf("%d",&e); } for(i=1;i<=n;i++) for(j=1;j<=n;j++) g[i][j]=inf;/*初始化矩阵,全部元素设为无穷大*/ for(k=1;k<=e;k++) { printf("输入第%d条线路的起始辖区,终点辖区,直接距离: ",k); scanf("%d%d%d",&v1,&v2,&weight); while(v1==v2||v1>n||v2>n||v1<1||v2<1) { error(); printf("输入第%d条线路的起始辖区,终点辖区,直接距离: ",k); scanf("%d%d%d",&v1,&v2,&weight); } g[v1][v2]=weight; g[v2][v1]=weight; } printf("\n输出存储矩阵: \n"); pri(g,n); returnOK; } 输出邻接矩阵 voidpri(intg[][max],intn)/*输出无向图的邻接矩阵*/ { inti,j; for(i=0;i<=n;i++) printf("%d\t",i); for(i=1;i<=n;i++) { printf("\n%d\t",i); for(j=1;j<=n;j++)/*输出边的权值*/ { if(g[i][j]==inf)printf("∞\t",'\354'); elseprintf("%d\t",g[i][j]); } } printf("\n"); } 普利姆算法求最小生成树,输出最优路线 voidprim(intg[][max],intn,cityvex[max])/*prim的函数*/ { intlowcost[max],closest[max]; inti,j,k,min,s=0; for(i=2;i<=n;i++)/*n个顶点,n-1条边*/ {lowcost[i]=g[1][i];/*初始化*/ closest[i]=1;/*顶点未加入到最小生成树中*/ } lowcost[1]=0;/*标志顶点1加入U集合*/ for(i=2;i<=n;i++)/*形成n-1条边的生成树*/ { min=inf; k=0; for(j=2;j<=n;j++)/*寻找满足边的一个顶点在U,另一个顶点在V的最小边*/ if((lowcost[j] =0)) { min=lowcost[j]; k=j; s+=min; } printf("(%s----%s)---%d\t",vex[closest[k]].name,vex[k].name,min); lowcost[k]=0;/*顶点k加入U*/ for(j=2;j<=n;j++)/*修改由顶点k到其他顶点边的权值*/ if(g[k][j] { lowcost[j]=g[k][j]; closest[j]=k; } printf("\n"); } printf("\n修建地铁最短总里程为: "); printf("%d",s); } 3.函数的调用关系图。 intcreatve(cityvex[max]) intCreateGraph(intg[][max],intn,voidpri(intg[][max],intn)) voidpri(intg[][max],intn) voidprim(intg[][max],intn,cityvex[max]) 图2各函数调用关系图 4.4测试与分析 4.4.1测试 正确输入: 错误输入: 4.4.2分析 1.调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析: 开始准备将辖区名和相应距离同存储在邻接矩阵中,但因为数据类型不同,这个想法难以实现;而且就算实现了,在后面的程序中操作也非常麻烦。 所以我创建了一个结构体数组用来存储辖区名,这样辖区名和数组下标一一对应,简明、易懂、清晰。 以后只要看数字所对应的下标存储的是哪个辖区,就可以将其引用。 运行程序时,我要输出最优路线对应的辖区,所以在输出时要直接引用结构体数组,但怎么都不行,我就分模块来调试,最后发现,原来是没有将结构体数组的地址传过来。 修改后,程序运行正常。 没有使用指针,避免了指针指向错误存储区而造成的错误。 2.算法的时间复杂度和空间复杂度的分析,改进设想: 本程序的时间复杂度为o(n^2),主要是for循环的作用。 4.5附录(源程序代码及必要注释) #include #defineinf99999 #definemax40 #definelinelenght77 #defineOK1 typedefstructnode { charname[10];//辖区名称 }city; intcreatve(cityvex[max])//创建辖区名数组 { inti,n; printf("设置辖区的个数: ");//城市中辖区的个数 scanf("%d",&n); for(i=1;i { printf("第%d个城市辖区名称为: ",i); scanf("%s",vex[i].name); } return(n); } voidprim(intg[][max],intn,cityvex[max])/*prim的函数*/ { intlowcost[max],closest[max]; inti,j,k,min,s=0; for(i=2;i<=n;i++)/*n个顶点,n-1条边*/ {lowcost[i]=g[1][i];/*初始化*/ closest[i]=1;/*顶点未加入到最小生成树中*/ } lowcost[1]=0;/*标志顶点1加入U集合*/ for(i=2;i<=n;i++)/*形成n-1条边的生成树*/ { min=inf; k=0; for(j=2;j<=n;j++)/*寻找满足边的一个顶点在U,另一个顶点在V的最小边*/ if((lowcost[j] =0)) { min=lowcost[j]; k=j; s+=min; } printf("(%s----%s)---%d\t",vex[closest[k]].name,vex[k].name,min); lowcost[k]=0;/*顶点k加入U*/ for(j=2;j<=n;j++)/*修改由顶点k到其他顶点边的权值*/ if(g[k][j] { lowcost[j]=g[k][j]; closest[j]=k; } printf("\n"); } printf("\n修建地铁最短总里程为: "); printf("%d",s); } interror()/*提示错误信息*/ {printf("输入错误! \n请重新输入: \n"); fflush(stdin); returnOK;/*清除缓存*/ } intCreateGraph(intg[][max],intn,voidpri(intg[][max],intn))/*建立无向图*/ { inte,i,j,k,v1=0,v2=0,weight=0; printf("输入可建地铁线线路个数: "); scanf("%d",&e); while(e<=0||e>=n*(n-1)||n>=max) { error(); printf("输入可建地铁线线路个数: "); scanf("%d",&e); } for(i=1;i<=n;i++) for(j=1;j<=n;j++) g[i][j]=inf;/*初始化矩阵,全部元素设为无穷大*/ for(k=1;k<=e;k++) { printf("输入第%d条线路的起始辖区,终点辖区,直接距离: ",k); scanf("%d%d%d",&v1,&v2,&weight); while(v1==v2||v1>n||v2>n||v1<1||v2<1) { error(); printf("输入第%d条线路的起始辖区,终点辖区,直接距离: ",k); scanf("%d%d%d",&v1,&v2,&weight); } g[v1][v2]=weight; g[v2][v1]=weight; } printf("\n输出存储矩阵: \n"); pri(g,n); returnOK; } voidpri(intg[][max],intn)/*输出无向图的邻接矩阵*/ { inti,j; for(i=0;i<=n;i++) printf("%d\t",i); for(i=1;i<=n;i++) { printf("\n%d\t",i); for(j=1;j<=n;j++)/*输出边的权值*/ { if(g[i][j]==inf)printf("∞\t",'\354'); elseprintf("%d\t",g[i][j]); } } printf("\n"); } voidmain()/*主函数*/ { intg[max][max],n; cityvex[max]; n=creatve(vex); CreateGraph(g,n,pri); printf("\n\n最佳建设路线为: \n"); printf("(辖区名----辖区名)---直接距离\n\n"); prim(g,n,vex); } 5总结与展望 刚开始拿到题目的时候,没有什么思路,就翻书看了普利姆算法,然后也在网上搜索了相关的资料。 找到有相似的程序,但不符合我的题目的要求,不是邻接矩阵存储,输入输出也不行。 于是,我就仔细的看了程序,弄懂之后我就开始编我的程序。 经过一个星期的奋斗,我终于是把程序整出来了。 这是一个坚苦而又漫长的过程。 看着劳动成果,很欣慰! 毕竟这是我第一次做课程设计。 通过这次课程设计我深刻的理解了普利姆算法,同时理解了数据结构中思想的严谨性和准确性,在这次设计过程中让我找到了自己在设计过程中的缺点,我意识到自己当时学明白并不代表自己就真正的会,自己在看书是看明白了不一定就能在计算机上运行,例如当输入为%c时候如果一个一个的输入程序会把回车也当做一个字符。 再者就是在每次程序中出现的老问题,在函数调用时如果传值和传址弄混那么在函数调用过程中就会出现传不回地址或者传回的值为乱码。 在以后的每个程序中我一定会尽自己最大努力,在每个程序中我都细心地去敲入每个字符,函数调用过程中先想明白在往上面写。 我一定会继续努力,不辜负父母和老师对我的期望! 参考文献 [1]严蔚敏,吴伟民.数据结构(C语言版)[M].北京清华大学出版社,2007 [2]谭浩强.C程序设计(第三版)[M].北京清华大学出版社,2007 [3]谭浩强.C程序设计题解与上机指导(第三版)[M].北京清华大学出版社,2007 成绩评定 成绩教师签字
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库 课程设计 地铁 建设 问题