一. 设计目的
1. 强化上机动手能力,在理论和实践的基础上进一步巩固《数据结构》课程学习的内容,掌握工程化软件设计的基本方法;
2. 掌握图的创建和应用;
3. 掌握迪杰斯特拉以及Prim等基本算法思想;
4. 掌握if语句及switch语句的运用方法及嵌套应用方法;
5. 掌握C语言主函数和被调用函数之间的参数传递方式,学会函数的调用过程和方法;
6. 掌握结构体类型变量的定义和使用;
7. 掌握指针变量和指向指针的指针变量的定义及使用,进一步了解指向结构体的指针变量的概念及使用方法;
8. 能够采用模块化思想调试程序;
9. 学会将知识应用于实际的方法,提高分析和解决问题的能力,增加综合能力;
10. 为后续各门计算机课程的学习打下坚实基础。
二. 设计内容
用C语言编写了《西邮校园导游咨询系统》,通过使用循环、条件、数组、结构体、函数、指针、等相关C语言知识学习编写较大的程序,结合数据结构中的算法思想实现一个导游咨询系统基本的功能。
三.概要设计
1.功能模块图;
2.各个模块详细的功能描述。
(1).浏览校园全景
可让用户浏览校园平面全景图,图上信息包括景点名称,路径长度,风景位置,ATM机位置等,一目了然。
(2). 查看景点信息
用户根据界面显示的校园景点信息表,输入要查询的景点名称,可以查看景点信息。
(3). 从一个景点到其他所有景点的最短距离
利用迪杰斯特拉算法,由用户输入要查询的景点编号,查询该景点到其余所有景点的最短路径,以及最短路径长度。
(4). 从某一景点出发的最短连通路线
利用Prim算法求最短连通图,也就是说,让用户输入起始的景点名称就可以查询由该景点出发的所有最短连通图。
(5). 用户输入出发点和目的地获取所有游览线路
利用图的深度遍历,调用递归的思想逐个遍历景点,找到由出发点到目的地的所有游览路线,并打印出来。
(6). 两个景点之间的最短距离
在菜单中通过switch语句进入排序功能,同样使用迪杰斯特拉算法求出图中两个节点之间的最短路径,这里由用户输入两个景点的名称就可查询两个景点之间的最短路径,以及路径长度。
(7). 修改景点信息,新西邮
在菜单中通过switch语句进入修改功能,输入要修改的景点信息数目以及要修改景点的序号,输入新的信息以及修改的路径,即修改成功,重新查询就可查询到新的景点信息。
(8). 西邮沿途风景,ATM机介绍新鲜资讯
在菜单中通过switch语句进入查询功能,改模块主要是方便用户了解西邮的推荐景点的位置以及常用的ATM机的位置,每天会更新“旭日苑”和“美食广场”推荐的美食,我觉得是个比较贴近生活的模块。
(9).安全退出
用exit(0)实现,退出导游系统;
(10).main 函数
通过主函数main()将各个模块结合起来,main()函数主要调用了menu()菜单。
四.详细设计
1.功能函数的调用关系图
2.各功能函数的数据流程图
录入信息模块
查找信息模块
两景点最短路径模块
两景点所有路径模块
一景点出发的最短连通路径模块
修改景点信息模块
3.重点设计及编码
//利用Dijkstra算法求得从起点景点到终点景点的最短路线
void Dijkstra(AdjMatrix *G,int start,int end,int dist[],int path[][MAX])
{
int mindist,i,j,k,t=1;
for(i=0;i<G->vexnum;i++)//初始化
{
dist[i]=G->arcs[start][i];
if(G->arcs[start][i]!=INFINITY)
path[i][1]=start;
}
path[start][0]=1;
for(i=1;i<G->vexnum;i++)//寻找各终点
{
mindist=INFINITY;
for(j=0;j<G->vexnum;j++)//选择路线最短的线路
if(!path[j][0]&&dist[j]<mindist)
{
k=j;
mindist=dist[j];
}
if(mindist==INFINITY)
return;
path[k][0]=1;
for(j=0;j<G->vexnum;j++)//修改路线
{
if(!path[j][0]&&G->arcs[k][j]<INFINITY&&dist[k]+G->arcs[k][j]<dist[j])
{
dist[j]=dist[k]+G->arcs[k][j];
t=1;
while(path[k][t]!=0)//记录最新的最短路线
{
path[j][t]=path[k][t];
t++;
}
path[j][t]=k;
path[j][t+1]=0;
}
}
}
for(i=0;i<=G->vexnum;i++)
if(i==end) break;
printf("%s------>%s最短路线为:",G->vex[start].name,G->vex[end].name);
for(j=1;path[i][j]!=0;j++)
printf("%s",G->vex[path[i][j]].name);
printf("->%s距离为%dm\n",G->vex[end].name,dist[i]);
}
//寻找最短路线
void Shortroute(AdjMatrix *G)
{
char sight[MAX];
int start,end;
int dist[MAX],path[MAX][MAX]={0};
system("cls");
menu1();
printf("请输入起始景点:");
scanf("%s",sight);
start=Locate(G,sight);
printf("请输入终止景点:");
scanf("%s",sight);
end=Locate(G,sight);
Dijkstra(G,start,end,dist,path);
}
//修改创建新的图
int Newgraph(AdjMatrix * G)
{
int changenum; //计数。用于记录要修改的对象的个数
int i,m,n,t,distance,v0,v1;
system("cls");
menu1();
printf("\n下面请输入你要修改的景点的个数:\n");
scanf("%d",&changenum);
while(changenum<0||changenum>G->vexnum )
{
printf("\n输入错误!请重新输入");
scanf("%d",&changenum);
}
for(i=0;i<changenum;i++)
{
printf("\n请输入景点的编号:");
scanf("%d",&m);
t=Locate2(G,m);
printf("\n请输入景点的名称:");
scanf("%s",&G->vex[t].name );
printf("\n请输入景点的简介:");
scanf("%s",&G->vex[t].introduction );
}
printf("\n下面请输入你要更新的边数");
scanf("%d",&changenum);
while(changenum<0||changenum>G->arcnum )
{
printf("\n输入错误!请重新输入");
scanf("%d",&changenum);
}
printf("\n下面请输入更新边的信息:\n");
for(i=1;i<=changenum ;i++)
{
printf("\n修改的第%d条边的起点序号 终点序号 长度为:",i);
scanf("%d %d %d",&v0,&v1,&distance);
m=Locate2(G,v0);
n=Locate2(G,v1);
if(m>=0&&n>=0)
{
G->arcs[m][n] =distance;
G->arcs[n][m] =G->arcs[m][n] ;
}
}
return 1;
}
//打印序号为m,n景点间的长度不超过8个景点的路径
void path(AdjMatrix *G, int m,int n,int k)
{
int s,x=0;
int t=k+1; //t 记载路径上下一个中间顶点在d[]数组中的下标
if(d[k]==n && k<8) //d[k]存储路径顶点。若d[k]是终点n且景点个数<=8,则输出
{ //递归出口,找到一条路径
for(s=0;s<k;s++)
printf("%s--->",G->vex[d[s]].name); //输出该路径。s=0 时为起点m
printf("%s",G->vex[d[s]].name); //输出最后一个景点名
printf("\n\n");
}
else
{
s=0;
while(s<G->vexnum) //从第m个顶点,试探至所有顶点是否有路径
{
if((G->arcs[d[k]][s]<INFINITY) && (visited[s]==0)) //初态
{
visited[s]=1;
d[k+1]=s; //存储顶点编号s 至d[k+1]中
path(G,m,n,t); //打印出一条m至n的路径
visited[s]=0;
}
s++; //试探从下一个顶点 s 开始是否有到终点的路径
}
}
}
//打印两景点间的景点个数不超过8的所有路径
int Allpath(AdjMatrix * G)
{
int k,m,n;
char sight1[MAX];
char sight2[MAX];
system("cls");
menu1();
printf("\n\n请输入你要查询的两个景点名称:\n\n");
scanf("%s%s",sight1,sight2);
printf("\n\n");
m=Locate(G,sight1); //确定该顶点是否存在。若存在,返回该顶点编号
n=Locate(G,sight2);
d[0]=m; //存储路径起点m (int d[]数组是全局变量)
for(k=0;k<G->vexnum;k++) //全部顶点访问标志初值设为0
visited[k]=0;
visited[m]=1; //第m个顶点访问标志设置为1
path(G,m,n,0); //k=0,对应起点d[0]==m。k为d[]数组下标
return 1;
}
五.测试数据及运行结果
1.正常测试数据和运行结果
2.异常测试数据及运行结果
六.调试情况,设计技巧及体会
1.改进方案
这次课程设计时间比较短,问题比较多,最大的问题就是求所有路径和最短路径,这个花了我很多时间,通过实践知道调试的时候可以多加一些printf()语句查错。另外自己再外观上通过调用DOS命令玩了很多花样比如说换背景颜色。需要改进的就是存储问题,我用的是初始化,这样修改不是很方便,我想如果有时间的话,我会改成文件存储,这样会更好,更方便。
2.体会
通过这次课程设计,我发现自己对图还很不熟,栈的运用也不是很娴熟,在这之前曾编过两个跟图有关的题,做这个的时候才不那么束手无策。发现其实程序要写得好,关键在于它的移植性,可以多次调用,代码才会简单。有些程序就是在我以前的程序上作了修改直接拿过来用的。通过这次课程设计发现自己连c语言的门都没入。C语言要学好并不是那么简单,光听老师讲就行了。有很多问题是在自己动手编的时候发现的。只有程序编得多,问题出来得多,自己才有经验,下次遇到才知道该怎么做,而不是一头雾水。自己做的系统太简陋了,无法运用不到实际生活中,与真正的系统相差甚远,实用性很差,界面也不好看。功能特不完善。对于数据结构来说,我们还只是菜鸟级别。以后要学的还有很多,踏踏实实地学好,以后才有出路。
学习的方式不是单一的,大学的学习要多提问,多寻找资源,这几天的学习,我发现共同学习,帮别人找错误都是很好的提升办法。总之,好好努力!!
七.参考文献
《c语言程序设计》
《数据结构》
八.附录:
源代码(电子版)
西安邮电大学
(计算机学院)
数据结构设计报告
题 目:西邮校园导游咨询系统
专业名称:计算机科学与技术
班 级:计科1202班
学生姓名:苟凡
学号(8位):04121060
指导教师:曾艳
设计起止时间: 20##年12月9日—20##年12月13日
第二篇:课程设计报告格式与内容
PLC控制系统设计报告
项目名称: 电动机星角启动延时正反转 的自动控制系统设计
学生姓名:霍瑞朋
专业名称:自动化
班 级:自师1001班
指导教师:胡山
项目名称:电动机星角启动延时正反转的自动控制系统设计
一、 任务要求
通过plc编程控制电动机完成以下任务要求
1. 按下正转启动开关,电动机星接启动正转,延时五秒后转换为角接正转运行。
2. 在正转运行过程中按下反转启动按钮,电机先停止运行,延时五秒后再星接反转运行,延时五秒后自动转换为角接反转运行。同理,在反转运行过程中按下正转启动按钮,电机先停止运行,延时五秒后再星接正转运行,延时五秒后自动转换为角接正转运行。
3. 在点击运行任一过程中按下停止按钮,电机停止运行,延时五秒后按下启动按钮方可启动。
二、总体设计方案
简要说明项目总体设计方案,其中包括系统组成框图和控制系统方框图(针对控制类项目),系统工作原理、系统功能和技术指标等。
基于plc控制系统通过编程控制电机实现上述功能。
系统组成框图
控制系统方框图
系统工作原理
三、 系统硬件设计
对上述电气控制电路中用到的输入设备和输出负载进行分析,归纳出应有三个输入设备,即正向启动按钮SB1,反向启动按钮SB2,停止按钮SB3;四个输出,即星接正转,角接正转,星接反转,角接反转。
主电路
PLC I/O接线图
四、系统软件设计
设计思想
1. 根据任务要求分析做什么,确定总体任务,然后将任务细化。
2. 设计顺序控制功能图,分析所有可能发生的情况,完善顺序控制功能图。
3. 根据顺序控制功能图设计编程。
4. 调试程序,观察分析现象进行改进。
四、 程序
五、系统调试
调试过程
编译所写程序,检查无误后下载。然后将plc设置为运行模式。在监控状态下进行调试操作。按下启动按钮,按照要求检查功能是否实现。观察初始状态的监控状态;按下启动按钮后,观察此时的监控状态,按照任务要求观察各运行过程中的监控状态;观察按下停止按钮后的监控状态。
调试结果
1. 按下正转启动开关,电动机星接启动正转,延时五秒后转换为角接正
转运行。
2. 在正转运行过程中按下反转启动按钮,电机先停止运行,延时五秒后
再星接反转运行,延时五秒后自动转换为角接反转运行。同理,在反
转运行过程中按下正转启动按钮,电机先停止运行,延时五秒后再星
接正转运行,延时五秒后自动转换为角接正转运行。
3. 在点击运行任一过程中按下停止按钮,电机停止运行,延时五秒后按
下启动按钮方可启动。
调试过程中遇到问题
在电动机角接运行过程中按下停止按钮电动机不停止。
解决问题措施
按下停止按钮观察监控状态下V10.0到V0.1的监控状态
分析得出需要在V10.0到V0.1的这一网络中加入按下I1.2电机停止运行这一条件。即对网络 做如下改动。
设计体会
说明完成该设计的收获和设计方案有待改进之处等
通过这次对电机星角启动延时正反转的控制设计,我对plc的工作过程和控制理念都有了更深入的体会。而且通过这次自主设计,我意识到自身的不足。在设计编程的过程中遇到很多问题,而且设计思路有欠缺,同时也发现了自己的设计过程较慢,这都需要我对知识有一个更加深入的了解,同时在今后的学习中不断深入学习,加强练习和总结,让自己逐渐建立起一套完整的设计思路,在今后的设计编程或者遇到问题的过程中能够有更加准确和迅速的完成任务。同时,我将自己的设计方案与其他同学比较,也发现了自己的设计方案中存在的一些缺陷,例如有些网络可以合并在一起,有些网络可以改进的的更为简单。这也需要我再今后的学习中勤加练习,让自己更熟练,让自己设计出的方案更简单清晰。最后要感谢胡山老师这一学期的悉心教导和耐心的讲解,老师辛苦了。
参考文献
按照公开发行期刊和书籍中参考文献的格式逐项列出主要参考文献:
(1)期刊:作者名.文章名[J].期刊名,年,卷(期):起止页;
(2)书籍:作者名.书名[M].出版社城市名:出版社名,年;
(3)会议论文:作者名.文章名[C].会议地点:会议名称,年,;
(4)学位论文:作者名.论文题目[D].单位城市:单位,年,卷(期):起止页;
(5)电子文献:作者名.文章名.网址。
以上作者≦3个全部列出(各作者名用逗号“,”隔开),作者>3个列前3名后加“ 等”。