📄 quanguojiaotong.txt.txt
字号:
一、设计内容与设计要求
1.设计内容:
出于不同目的的旅客对交通工具有不同的要求。例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则期望旅费尽可能省,而老年旅客则要求中转次数最少。编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。系统可实现城市信息的管理以及两种交通工具火车和飞机信息的管理,并提供最少中转次数、最少时间和最少路费的交通路线咨询。
设计思路:首先用一种存储结构表示旅途工具、出发点、终点、旅途时间和价格。对于要求选择中转次数最少的路径,可对图进行广度搜索得到。对于寻找最少时间和最少路费的路径,实际上就是图最短路径问题。可采用Dijkstra算法。
2.设计要求:
课程设计报告正文内容
需求分析:课题的主要功能;
总体设计:课题的功能模块的划分(要求画出模块图);
程序流程图:主要功能的实现(至少要有一个主要模块的流程图);
程序调试及体会;
参考书目;
附录(所有程序的原代码,要求对程序写出必要的注释)。
书写格式
a.要求用A4纸打印成册
b.正文格式:一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。
c.正文的内容:正文总字数要求在5000字以上(不含程序原代码)。
d.封面格式如下页。
考核方式
指导老师负责验收程序的运行结果,并结合学生的工作态度、实际动手能力、创新精神和设计报告等进行综合考评,并按优秀、良好、中等、及格和不及格五个等级给出每位同学的课程设计成绩。具体考核标准包含以下几个部分:
a.平时出勤 (占10%)
b.系统需求分析、功能设计、数据结构设计及程序总体结构合理与否(占10%)
c.程序能否完整、准确地运行,个人能否独立、熟练地调试程序(占40%)
d.设计报告(占30%)
注意:不得抄袭他人的报告(或给他人抄袭),一旦发现,成绩为零分。
e.独立完成情况(占10%)。
课程验收要求
a.运行所设计的系统。
b.回答有关问题。
c.提交课程设计报告。
d.提交软盘(源程序、设计报告文档)。
e.依内容的创新程度,完善程序情况及对程序讲解情况打分。
二、进度安排
班级: 信息科学0501、0502、0503
主讲教师:郭鹏
辅导教师:周铁山、曹燚
时间安排:
第 18 周
星期一 分析问题,给出数学模型,选择数据结构
星期二 设计算法,给出算法描述
星期三~星期五 编辑、编译、调试源程序
星期六 撰写课程设计报告
目 录
需求分析············································· 1
总体设计(功能模块图)·································3
程序流程图··········································· 4
程序调试············································· 7
体会················································· 8
源程序清单············································9
参考书目·············································24
评分表················································25
需求分析
一)题目分析:
1.通过对题目的分析知,是要让我们能够通过利用所学的数据结构的基本知识和技能来解决程序设计问,因此在搞程序设计之前先好好的把书复习一遍,弄清楚各个知识之间的联系。
2.由题目的分析知全国交通咨询管理系统是有对城市信息的增加、删除、修改、保存、查询、有错时提示出错信息等功能,最后对数据进行保存并退出操作系统。由此可知需要将函数模块化,将它做为一个独立的函数体去实现它的功能。它可以分为四大功能模块,每个模块需要去各个击破。其中可能用到C语言的指针与链表,因此,要先去复习一下C语言课本。
3.根据这些功能和基本要求,可充分运用我们所学的数据结构的基本知识和技能去逐步的解决。其中将函数进行模块化。在数据结构中,通过队列,栈,图的声明来实现系统的各种功能的存储各城市之间乘火车的消耗价格,时间,乘飞机的价格,时间,以及中转站最少。利用指针和结点来实现城市与城市之间各种操作,而这些知识点都是我们学习数据结构必须掌握和学会运用的。
4.完成程序功能的设置后,应对程序进行调试,以便在调试中能及时地找出错误并加以更正,这样能使程序功能进一步的完善和正确。这就要求我们在编程和调试过程中养成认真分析和善于发现问题并及时解决的习惯,不懂的及时问老师或者其他同学。
二)实现方法:
1.图的实现和声明
(1)根据题目要求,声明了一个图形的数据结构用来存储任意几个城市之间的各种信息,其中是把它们的TTime; TPrice; FTime; FPrice;的各种信息用邻接矩阵存储起来的。同时运用构造函数,利用特定的值来构造对象。
(2)struct City图的结构,CreateCity建立邻接图,AddCity增加,DelCity删除,EditCity修改,ShortestPath最小路径,ShortestPath_DIJ求源点v0到各点的最短路径 1火车时间最小,2火车金钱最小,3飞机时间最小,4飞机金钱最小,来实现的。
2.程序功能的实现
(1)全国交通咨询信息录入和增加的实现
主要是对城市基本信息的输入,包括(乘火车的价格,乘火车的时间,乘飞机的价格,乘飞机的时间,中转站次数最少)在程序中只要用AddCity (输入函数)和ShortestPath(C);来实现。
(2)全国交通咨询信息显示的实现
主要为用户ShortestPath(C);函数显示城市之间的基本信息,包括上面录入的信息和增加的内容。
(3)全国交通咨询信息载入文件的实现
在程序中用LoadCity(C);break()函数来载入文件。
(4)全国交通咨询信息删除的实现
在程序中用DelCity(C)函数来实现对有错的信息进行删除。
(5)全国交通咨询信息修改的实现
在程序中用EditCity(C)(修改函数)来实现,而且可通过按编号或城市名来修改,当找不到要修改的内容时提示用户可能输入有误,重新在输一遍。
(6)全国交通咨询信息的重来
CreateCity(C);break重来,实现对错误的从新输入。
(7)全国交通咨询信息的保存
在程序中用SaveCity(C)保存函数来实现,并提示用户数据已保存。
(8)全国交通咨询信息的增加
ShowCityDat(C);break, case 2:AddCity(C);break 增加
功能模块图
该课题可以分为如下几个模块:控制选择功能项的main函数、建立邻接图的CreateCity(City *C)函数、增加城市的AddCity(City *C)函数、删除城市的DelCity(City *C)函数、修改资料的EditCity(City *C)函数、求最小路径的ShortestPath(City *C)函数、求其他最值的ShortestPath_DIJ(City *C,int v0,int k)函数、载入文件资料的LoadCity(City *C)函数、保存资料的SaveCity(City *C)函数、显示城市之间关系数据的ShowCityName(City *C,int k)函数。
功能模块图如下:
程序流程图
输入int m;
输入1()输入城市
输入2()输入飞机
输入3()输入火车
输入4()删除飞机
输入5()删除火车
输入6()显示飞机
输入7()显示火车
输入8()变换飞机
输入9()保存数据
输入10()显示城市
输入11()显示最短时间
输入12()更换飞机
输入13()录入数据
e!=0
是
否
结束
2)add_city添加函数流程图:
c_num++
输入city[c_num]
结束
3)delete_train删除函数流程图:
声明int j
for(j=i;j<=t_num;j++)
train[i+1]=>train[i];
t_num--
结束
4)show_train显示函数流程图:
声明int i
输出id-start-end-time、price
for(i=0;i<t_num+1;i++)
输出train[i].id-train[i].start-
-train[i].end-train[i].time train[i].price);
结束
程序调试
心得体会
一周课程设计很快就结束了,回顾自己所做的课程设计真是困难重重有喜亦有忧。从接触计算机语言开始我虽然很喜欢这门课程但是我并没有真正的做过稍微大点课题的课程设计,大多数做的是一些写算法的题目仅此而已。因此,我在专业里所选的方向也就是计算科学中的算法设计。这一次课程设计让我意识到我的知识是很零乱,多么的不连贯不系统化,我自感到在C语言以及数据结构方面的知识是那么的不扎实。同时也让我意识到学习计算机语言是没有什么捷径可走的,靠的是平时的多练习,多上机操作才可能有好的效果。
在拿到这个题目的时候我仔细的分析了一番,觉得自己只能写一写匡架性的东西出来而根本不知道如何去实现每一个函数。会用一点队列的知识(比如通过队列的先进先出的特点来存储各种乘火车方式和乘飞机方式的时间,价格,中转站最少的最优值),也会根据要求在模块定义所需要的函数,但是不知道如何去实现,可能是由于C语言中的函数、指针及链表没学到多少。所以,现在知道要用什么但是就是用不出。我从别人的作品中看出了我的不足,也感慨自己平时写的太少了。我真的需要多多的练习。哪怕是一天写一个也行。
在答辨的时候老师问我二个问题,一个是程序演示后通过SaveCity(C)来保存,老师要我把具体位置找出来,这个还容易找的。第二个问题是我定义的静态队列给来干什么用的,我回答到是给来存储各个城市之间交通来往的最优值包括最便宜价格,最短时间,中转站最少。只能是看完别人的程序才恍然大悟,哦,原来是这样实现这个函数的啊。我还在一边自责我就怎么没想到呢。当然那里面也有我自己的成分,就是那排名函数用的是冒泡排序法。还有类的基本框架也是。我想这样的机会是不多的,以后我一定要自己写,不会就看书或是问老师。要靠自己的努力去完成自己的任务,才不愧为一个学生。
这次数据结构设计给我的感想与启示。在整个程序的结构上的把握是一个很难的问题,在刚开始拿到课题的时候对整个的程序具体应该怎样去划分结构,以及怎样去抽象各个对象的属性等方面都感觉有点生疏,四大模块分别实现各种功能,真的在这么短的时间内很难去完成实现的。所以我感到在平时的练习中我们应该多做一些例如:如何去具体的抽象出一个客观事物的属性,以及该事物所须完成的具体功能等等的操作练习。通过这次课程设计我发现了自己所存在的问题,不是课本知识没掌握好而是用的太少以至用不出来的结局。下学期还有数据库要学,我想也一定有课程设计,所以,在这个暑假我计划从图书馆先借书来看。到时在家里没事的时候就写一写数据库方面的程序。以后学习的路还很长,希望通过这次课程设计能够给我带来的思考有助于我以后的学习。
源程序清单
//交通管理系统
//Powered by YJ
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define OK 1
#define ERROR 0
#define true 1
#define false 0
#define INFINITY 2000
#define MAX_VERTEX_NUM 30
int change = 0;
typedef int Status;
typedef int ElemType;
typedef struct QNode{ //队列结构:节点存储结构
ElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct{ // 队列
QueuePtr front;
QueuePtr rear;
}LinkQueue;
Status InitQueue(LinkQueue *Q){// 初始化队列
Q->front = Q->rear = (QueuePtr)malloc(sizeof(QNode));
if(!Q->front) return ERROR;
Q->front->next = NULL;
return OK;
}
Status EnQueue(LinkQueue *Q,ElemType e){// 入队
QueuePtr p = NULL;
p = (QueuePtr)malloc(sizeof(QNode));
if(!p) return ERROR;
p->data = e;
p->next = NULL;
Q->rear->next = p;
Q->rear = p;
return OK;
}
Status DeQueue(LinkQueue *Q,ElemType *e){ // 出队
QueuePtr p = NULL;
if(Q->front == Q->rear) return ERROR;
p = Q->front->next;
e = p->data;
Q->front->next = p->next;
if(Q->rear == p) Q->rear = Q->front; // 注意当出队后为空队的情况
free(p);
return OK;
}
Status EmptyQueue(LinkQueue *Q){// 判断是否为空队列
return Q->front == Q->rear?true:false;
}
Status CopyQueue(LinkQueue *Q1,LinkQueue *Q2){// 复制队列(copy Q1 to Q2)
int e;
QueuePtr p;
while(!EmptyQueue(Q2)) DeQueue(Q2,e); // clean Q2
p = Q1->front->next;// copy one by one
while(p){
e = p->data;
p = p->next;
EnQueue(Q2,e);
}
return OK;
}
typedef struct AdJ{// 图的结构:邻接矩阵
int TTime;
int TPrice;
int FTime;
int FPrice;
}ADJ;
typedef struct City{// 图的结构
char name[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//城市名称
ADJ arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵
int CityNum;//城市数
}City;
Status CreateCity(City *C){// 建立邻接图
int i,j;
printf("please input city num:");
scanf("%d",&C->CityNum);
for(i = 0;i < C->CityNum; i++){
printf("input NO.%d city name: ",i+1);
scanf("%s",&C->name[i]);
}
for(i = 0; i < C->CityNum; i++)
for(j = 0; j < C->CityNum; j++){
C->arcs[i][j].TTime = INFINITY;
C->arcs[i][j].TPrice = INFINITY;
C->arcs[i][j].FTime = INFINITY;
C->arcs[i][j].FPrice = INFINITY;
}
for(i = 0; i < C->CityNum; i++)
for(j = i+1;j < C->CityNum; j++){
printf("input TTime,TPrice,FTime,FPrice[%s -> %s]: ",C->name[i],C->name[j]);
scanf("%d%d%d%d",&C->arcs[i][j].TTime,&C->arcs[i][j].TPrice,&C->arcs[i][j].FTime,&C->arcs[i][j].FPrice);
if(C->arcs[i][j].TTime == 0){
C->arcs[i][j].TTime = INFINITY;
C->arcs[i][j].TPrice = INFINITY;
C->arcs[i][j].FTime = INFINITY;
C->arcs[i][j].FPrice = INFINITY;
}
C->arcs[j][i] = C->arcs[i][j];
}
return ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -