C++数据结构-全国交通咨询模拟报告

C++数据结构-全国交通咨询模拟报告
C++数据结构-全国交通咨询模拟报告

数据结构课程设计报告

班级:195182

学号:20181003991

姓名:钟欢

日期:2019.12

一、课程设计题目与要求

1.课程设计题目:全国交通咨询模拟

2.问题描述:

出于不同目的的旅客对交通工具有不同的要求。例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则期望旅费尽可能省,而老年旅客则要求中转次数最少。

编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。3.基本要求:

3.1提供对城市信息进行编辑(如添加或删除)的功能。

3.2城市之间有两种交通工具:火车和飞机。提供对列车时刻表和飞机航班进行编辑(增

加或删除)的功能。

3.3提供两种最优决策:最快到达或最省钱到达。全程只考虑一种交通工具。

3.4旅途中耗费的总时间应该包括中转站的等候时间。

3.5咨询以用户和计算机的对话方式进行。

二、需求分析

1.问题描述

搭建一个全国交通咨询模拟系统,可以实现简单的人机互动从而达到咨询的效果。需要完成的功能有,对城市、列车时刻表、航班时刻表进行编辑(手动/文件添加,删除),能够根据出发城市以及到达城市进行相关线路推荐(花费最少线路、耗时最短线路),其中整个线路的耗时总时长包括中转等待时间。

2.程序的功能:

2.1维护功能:

2.1.1航班操作

2.1.2列车操作

2.1.3更改密码

2.2咨询功能

2.2.1选择出行交通工具

2.2.2选择要查询的信息:

○1查询花费最小的路径

○2查询耗时最短的路径

2.2.3进行进一步的输入得到所需要的结果

三、设计

1.设计思想

1.1数据结构设计

1.1.1逻辑结构设计

采用图结构来表示该全国交通网络,用一个结构体来表示时间,结构体内有标准

化的(天,时,分)的相关表示以及操作,重载的运算符“-”。全国交通网络中的

城市用结点表示,两个城市之间的航线或者列车线用两个结点之间的边来表示。

城市结点中包含城市名字、城市编号、第一条航线/列车线以及航线/列车线的数

目;边结点中包含到达城市名称,指向下一航线/列车线的指针,以及指向该边所

指代航线/列车线信息的指针;航班线/列车线信息结点包含航班号/列车号,出发

时间,到达时间,花费时间,花费金额。

1.1.2存储结构设计

采用链式存储结构—邻接表来存储该交通网络图,建立一个城市结点表,相当于

顶点表,表示出现在全国交通网络图中的城市的信息,并用指针指向他们之间的

相关关系。每一个城市结点又会指出一个指针指向它所包含的相关航线/列车线

的信息,相当于邻接矩阵中的边结点,若干航线/列车结点通过指针的链接构成边

链表。

1.2算法设计

该交通网络咨询模拟系统包含的主要算法有搜索城市编号,手动增加城市,文件

方式增加城市,插入航线/列车线,增加线路,文件方式增加线路,重置图的大小

(顶点表/城市表的大小),删除城市,删除线路,更新文件中的信息,输出所有

城市,输出所有线路,最小花费路径算法,时间转换成权值的算法,最少耗时路

径算法,输出最短路径,核心算法为Dijkstra算法。

1.3菜单设计

菜单分为几个模块。用户模块用于提供给用户进行相关咨询使用,包含交通工具

选择,查询最小花费线路,最少耗时路线;维护模块用于提供给管理员进行相关

信息维护功能,包含航班,列车操作,更改密码操作(初始密码为zhonghuan )。

而这些相关操作通过调用相关函数来实现。

2.设计表示

2.1函数调用关系图

2.1.1主程序流程以及各模块之间调用关系

2.1.2函数调用关系图

2.1.3函数接口规格说明

函数//函数说明(函数接口)

int searchCityNum(const string CityName); //搜索城市编号(城市名称)

void addCity(const string CityName);//手动添加城市(城市名称)

void addCityFromFile(const char FileName[MAXFILESIZE]);//文件添加城市(文件

名)

void insert(string StartName, LineNode* temp, string EndName);//插入线路(开始

地址,线路指针,到达地址)

void addLine();//添加线路

void addLineFromFile(const char FileName[MAXFILESIZE]); //文件添加线路(文件

名)

void reSize(int size); //重置大小(新的大小)

void delCityLine(int i); //删除城市线路(编号)

void delLine();//删除线路

void delCity(string CityName);//删除城市(城市名字)

void updateFile(const char FileName[MAXFILESIZE], const string type);//更新文件

void showCity(); //输出城市

void showLine(); //输出线路

void dijkstra_Money(int v0, int* parent, Node* dis); //Dijkstra算法求最小花费路径

(城市编号,遍历指针,优先队列的顶点结点)

int timeTransWeight(const Time& t); //时间转化为相应权值(时间)

void dijkstra_Time(int v0, int* parent, Node1* dis); //Dijkstra算法求最短耗时路径

(城市编号,遍历指针,优先队列的顶点结点)

void showShortestPath(const string type);//输出最短路径(类型:最小花费/最短

耗时)

3.详细设计

3.1类的数据成员与函数成员设计

//时间

struct Time {

int day;

int hour;

int minute;

friend Time operator - (Time& endtime, Time& st); //"-"重载,两个时间相减};

//边(线路信息)

struct Line {

string LineName;

Time StartTime, EndTime;

Time SpendTime;

float SpendMoney;

};

//边结点(存放到达城市地点,以及下一条线路的指针)

struct LineNode {

string EndName;

struct LineNode* NextLine;

Line* Info;

};

//顶点表(城市表)城市结点

struct HeadNode {

string CityName;

int CityNum;

LineNode* FirstLine;

int Amount;

};

//顶点节点,保存id和到源顶点的估算距离,优先队列需要的类型

struct Node; //最小花费

struct Node1; //最小路径

//图

class ALGraph {

private:

HeadNode* CityList; //城市表

int CityNum; //城市数目

int MaxCityNum; //最大城市数目

int ArcNum; //城市所含线路数目

public:

ALGraph(int size);

~ALGraph();

int searchCityNum(const string CityName); //搜索城市编号

void addCity(const string CityName);//手动添加城市

void addCityFromFile(const char FileName[MAXFILESIZE])//文件添加城市;

void insert(string StartName, LineNode* temp, string EndName); //插入线路void addLine(); //插入线路

void addLineFromFile(const char FileName[MAXFILESIZE]);//文件插入线路void reSize(int size); //重置图的大小

void delCityLine(int i); //删除城市线路

void delLine(); //删除线路

void delCity(string CityName);//删除城市

void updateFile(const char FileName[MAXFILESIZE], const string type);//更新文件

void showCity();//输出文件

void showLine(); //输出线路

void dijkstra_Money(int v0, int* parent, Node* dis);//Dijkstra算法求最小花费路

int timeTransWeight(const Time& t); //时间权值转换

void dijkstra_Time(int v0, int* parent, Node1* dis); //Dijkstra算法求最少耗时路径

void showShortestPath(const string type); //输出最短路径

};

3.1.1主要算法的伪码描述

void dijkstra_Money(int v0, int* parent, Node* dis);//Dijkstra算法求最小花费路径{ priority_queue q; //优化插入和取出最小值两个操作,队列存储最短距离与索引的编号,parent[]记录每个顶点的父亲结点,dis[]记录源点到每个点的估算距离,最后更新为源点到所有顶点的最短距离

bool visited[MaxCityNum]; //判断下标对应的顶点是否算出最短路径或者说是否在最短路径树中

vector visited(MaxCityNum, false);//初始化

dis[v0].money = 0; //源点到源点最短路权值为0

q.push(dis[v0]); //压入队列

while (!q.empty()) {}//队列空说明完成了求解v0到其余各顶点的最短路径取最小估算距离顶点;

被标记了,就无需对其进行更新最短距离等操作;

//松弛操作

while (p) //找所有与它相邻的顶点,进行松弛操作,更新估算距离,压入队列

}

void dijkstra_Time(int v0, int* parent, Node1* dis)//Dijkstra算法求最少耗时路径{ priority_queue q1; parent[]记录每个顶点的父亲结点,di[]记录源点到每个估算距离,最后更新为源点到所有顶点的最短距离

bool visited[MaxCityNum]; //判断下标对应的顶点是否算出最短路径或者说是否在最短路径树中

vector visited(MaxCityNum, false); //初始化

dis[v0].evaluatetime = 0; //源点到源点最短路权值为0

q1.push(dis[v0]); //压入队列

while (!q1.empty()) {}//队列空说明完成了求解v0到其余各顶点的最短路径取最小估算距离顶点;

被标记了,就无需对其进行更新最短距离等操作;

找出所有相邻点,进行松弛操作,即更新dis

//计算中转的时间开销

if (u != v0) { //注意源点到任何点都没有中转时间

int change = timeTransWeight(st - dis[u].et); //当前路线的开车时间-始发站的上一到站时间

t += change;

//松弛操作

while (p) //找所有与它相邻的顶点,进行松弛操作,更新估算距离,压入队列}

3.2界面设计及其他模块设计

3.2.1交通模拟咨询系统主界面设计

cout << endl << "·全国交通咨询系统··" << endl;

cout << setw(28)<<"请输入您的操作类型:" << endl;

cout << setw(20) << "1.咨询" << endl;

cout << setw(20) << "2.维护" << endl;

cout << setw(20) << "3.退出" << endl;

cout << "·" << endl;

3.2.2维护界面设计

while (func) {

cout << "1.从文件中添加城市" << endl;

cout << "2.手动添加城市" << endl;

cout << "3.删除城市" << endl;

cout << "4.从文件中添加线路" << endl;

cout << "5.手动添加线路" << endl;

cout << "6.删除线路" << endl;

cout << "7.显示所有城市" << endl;

cout << "8.显示所有线路" << endl;

cout << "9.保存文件" << endl;

cout << "10.返回";

cout << endl;

cin >> func;

……

}

3.2.3咨询界面设计

选择出行的交通工具

选择限制条件(花费最少/耗时最短)

选择出发到达城市显示结果

四、调试分析

1.调试遇到的问题及问题的解决

1.1程序敲完并且能够成功编译之后,对于程序各个功能测试的时候发现了一些问题:

○1维护板块中的问题主要是文件输入线路时,导入结果总是一些乱码,然后对比分

析了文件输入城市时并未出现这样的问题,经过对代码的分析通过不断调试发现问

题所在,文件输入内容时是一行一行读入并且输入给相对应的存储变量上去,对于

城市的输入,每一行只有编号和城市名称两个内容,结构简单容易读取,而对于文

件输入线路时,有各种数字符号时间等的相互交错穿插着,在设置读取内容时,格

式设置得并不严格,且导入的文件内容是从网上寻找的航班资料/列车资料等格式

不统一,最终我把导入文件做了格式统一化处理,并且代码中文件输入部分也做了

相应的格式调整,最终文件输入线路也没有了问题,文件导入城市和线路均能很好

地完成。

○2用户咨询板块中的主要问题是通过交通模拟咨询之后提供的线路信息出现了莫名其妙的错误——花费时间是负值,按照常理这肯定是错的,经过不同调试发现不是输

入数据有误,而是程序的本身逻辑有误,在对时间结构体的‘-’操作符进行重载时,没有考虑清楚两个时间之间的多一天少一天的进位关系,从而导致最后的计算结果

出现错误,由于默认日期的问题会造成不同天的时刻相减可能为负数,所以当时刻

表相减为负数时需要让天数加一,最后通过代码修改,在相关代码后面加了一个判

断语句,如果两个时间相减为负值那么就在天数上加一,否则不做处理,最终问题

得到有效解决。

2.

五、用户手册

该全国交通咨询模拟系统主要通过键入式人机交互来进行维护与咨询,即通过键盘的输入来获取想要的信息以及达到想要进行的操作。

1.系统初始化:通过维护界面导入全国交通咨询模拟系统的相关信息从而使得能够提供

有效准确的解决方案。

维护界面登录(初始密码:zhonghuan)

1.航班操作——>1.从文件中添加城市

2.手动添加城市

3.删除城市

4.从文件中添加线路

5.手动添加线路

6.删除线路

7.显示所有城市

8.显示所有线路

9.保存文件

10.返回

2.列车操作同航班操作

3.更改密码

4.返回

2.用户咨询

通过主界面键入‘1’进入咨询界面

2.1通过键盘输入选择出行交通工具:

1.飞机

2.火车

3.返回

2.2通过键盘输入选择要查询的信息:

1.查询花费最小的路径

2.查询耗时最短的路径

3.返回

2.3根据界面提示完成相关输入(城市名称等)即可得到咨询结果

2.4感谢您使用全国交通咨询模拟系统

六、测试数据及测试结果

七、源程序清单:

1.Graph.h//Graph头文件

2.menu.h//菜单头文件

3.Graph.cpp//交通图的相关操作函数源文件

4.main.cpp//主程序源文件

#其他文件

Plane.txt/Train.txt//航班列车文本文件PCity.txt/TCity.txt//城市文本文件

#附录1——全国交通咨询模拟系统源代码

------------------------------------------------------------------------------- //Graph.h

#ifndef _GRAPH_H

#define _GRAPH_H

#include

#include

#include

#define MAXFILESIZE 100

using namespace std;

//时间

struct Time {

int day;

int hour;

int minute;

//"-"重载

friend Time operator - (Time& endtime, Time& st) {

Time t = { 0, 0, 0 };

t.minute = endtime.minute - st.minute;

if (t.minute < 0) {

t.minute += 60;

t.hour--;

}

t.hour = t.hour + endtime.hour - st.hour;

if (t.hour < 0) {

t.hour += 24;

t.day--;

}

//由于默认日期的问题会造成不同天的时刻相减可能为负数,所以当时刻表相减为负数时需要让天数加一

//比如甘肃到北京T100 8:00,+0 10:00,+1 北京到长春T101 7:00,+0 T102 8:30,+0 15:10,+0

//实际上需要到北京后要再等待一天才能到,中途等待时间应该是'7:00,+1' - '10:00,+1'

if (endtime.day < st.day) {

t.day++;

}

t.day = t.day + endtime.day - st.day;

return t;

}

};

//边

struct Line {

string LineName;

Time StartTime, EndTime;

Time SpendTime;

float SpendMoney;

};

//边结点

struct LineNode {

string EndName;

struct LineNode* NextLine;

Line* Info;

};

struct HeadNode {

string CityName;

int CityNum;

LineNode* FirstLine;

int Amount;

};

//顶点节点,保存id和到源顶点的估算距离,优先队列需要的类型struct Node; //最小花费

struct Node1; //最小路径

class ALGraph {

private:

HeadNode* CityList;

int CityNum;

int MaxCityNum;

int ArcNum;

public:

ALGraph(int size);

~ALGraph();

int searchCityNum(const string CityName);

void addCity(const string CityName);

void addCityFromFile(const char FileName[MAXFILESIZE]);

void insert(string StartName, LineNode* temp, string EndName);

void addLine();

void addLineFromFile(const char FileName[MAXFILESIZE]);

void reSize(int size);

void delCityLine(int i);

void delLine();

void delCity(string CityName);

void updateFile(const char FileName[MAXFILESIZE], const string type);

void showCity();

void showLine();

void dijkstra_Money(int v0, int* parent, Node* dis);

int timeTransWeight(const Time& t);

void dijkstra_Time(int v0, int* parent, Node1* dis);

//void bfs_Transit (); //最小中转次数以及路径

void showShortestPath(const string type);

};

#endif

------------------------------------------------------------------------------- //Graph.cpp

#include"Graph.h"

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

#define INF 0xffffff

//'>>' 重载

istream& operator >> (istream& in, Time& time) {

char c1, c2, c3;

int hour, minute, day;

in >> hour >> c1 >> minute >> c2 >> c3 >> day;

time.day = day;

time.minute = minute;

time.hour = hour;

return in;

}

//'<<'重载

ostream& operator << (ostream& out, Time& time) {

//数据之间空白用'0'填充

cout.fill('0');

//数据的右对齐与天数的'+'号

out << setw(2) << setiosflags(ios_base::right) << time.hour << ":" << setw(2) << time.minute << resetiosflags(ios_base::right) << "," << setiosflags(ios_base::showpos) << time.day << resetiosflags(ios_base::showpos); //setiosflags(ios_base::showpos) 表示"+" 正号

cout.fill(' '); //fill setiosflags 需手动关闭

return out;

}

ALGraph::ALGraph(int size) {

CityList = new HeadNode[size];

int i;

for (i = 0; i < size; ++i) {

CityList[i].CityName = "NULL";

CityList[i].CityNum = i;

CityList[i].FirstLine = NULL;

CityList[i].Amount = 0;

}

CityNum = 0;

MaxCityNum = size;

ArcNum = 0;

}

ALGraph::~ALGraph() {

delete[]CityList;

}

//查询城市编号

int ALGraph::searchCityNum(const string CityName) {

int i;

for (i = 0; i < CityNum; ++i) {

if (CityList[i].CityName == CityName) {

return i;

}

}

return -1;

}

void ALGraph::reSize(int size) {

if (size <= CityNum) {

return;

}

HeadNode* NewList = new HeadNode[size];

int i;

for (i = 0; i < CityNum; ++i) {

NewList[i] = CityList[i]; //C++可以直接赋值

}

for (i = CityNum; i < size; ++i) {

CityList[i].CityName = "NULL";

CityList[i].CityNum= i;

CityList[i].FirstLine = NULL;

CityList[i].Amount = 0;

}

delete[]CityList;

CityList = NewList;

MaxCityNum = size;

}

//手动添加城市

void ALGraph::addCity(const string CityName) {

//已存在城市

if (searchCityNum(CityName) != -1) {

cout << "The city has in the list!!!" << endl;

return;

}

//空间已满

if (CityNum >= MaxCityNum) {

++MaxCityNum;

reSize(MaxCityNum);

}

CityList[CityNum].CityName = CityName;

CityList[CityNum].CityNum = CityNum;

CityList[CityNum].FirstLine = NULL;

CityList[CityNum].Amount = 0;

++CityNum;

}

//从文件中读取以添加城市

void ALGraph::addCityFromFile(const char FileName[MAXFILESIZE]) { //cout << "开始从" << FileName << "中读入并添加城市!" << endl;

ifstream file(FileName); //打开失败返回NULL

if (!file) {

cout << "打开失败!" << endl;

return;

}

string line; //读取第一行数据,第一行是城市总个数

getline(file, line);

istringstream istr(line); //利用stringstream简化string 到int 的类型转换

int count;

istr >> count;

//空间已满

if (CityNum + count >= MaxCityNum) {

MaxCityNum = CityNum + count;

reSize(MaxCityNum);

}

//从第二行开始读取城市名字

while (getline(file, line)) {

istringstream istr2(line); //利用istringstream类直接将string输入到name

string name;

istr2 >> name;

addCity(name);

}

cout << "城市导入完毕!" << endl;

file.close(); //读取后关闭文件

}

//添加线路

void ALGraph::addLine() {

string StartName, EndName;

//信息输入

cout << "请输入起点城市:" << endl;

cin >> StartName;

cout << "请输入终点城市:" << endl;

cin >> EndName;

LineNode* temp = new LineNode;

Line* info = new Line;

temp->EndName = EndName;

cout << "请输入班次名:";

cin >> info->LineName;

cout << "请输入出发时间:(hh:mm,+d)";

cin >> info->StartTime;

cout << "请输入到达时间:(hh:mm,+d)";

cin >> info->EndTime;

info->SpendTime = info->EndTime - info->StartTime;

cout << "请输入票价:";

cin >> info->SpendMoney;

temp->Info = info;

insert(StartName, temp, EndName);

}//addLine

//插入线路

void ALGraph::insert(string StartName, LineNode* temp, string EndName) { int StartNum = searchCityNum(StartName);

if (StartNum == -1) {

addCity(StartName);

StartNum = searchCityNum(StartName);

}

if (searchCityNum(EndName) == -1) {

addCity(EndName);

}

LineNode* p, * q;

p = CityList[StartNum].FirstLine;

//原本没有线路的情况

if (p == NULL) {

CityList[StartNum].FirstLine = temp;

temp->NextLine = NULL;

}

//原本有线路的情况

else {

q = p->NextLine;

while (q != NULL && EndName != q->EndName) {

p = q;

q = q->NextLine;

}

p->NextLine = temp;

temp->NextLine = q;

}

CityList[StartNum].Amount++;

ArcNum++;

}

string UTF8ToGB(const char* str)

{

string result;

WCHAR* strSrc;

LPSTR szRes;

//获得临时变量的大小

int i = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);

strSrc = new WCHAR[i + 1];

MultiByteToWideChar(CP_UTF8, 0, str, -1, strSrc, i);

//获得临时变量的大小

i = WideCharToMultiByte(CP_ACP, 0, strSrc, -1, NULL, 0, NULL, NULL);

szRes = new CHAR[i + 1];

WideCharToMultiByte(CP_ACP, 0, strSrc, -1, szRes, i, NULL, NULL);

result = szRes;

delete[]strSrc;

delete[]szRes;

return result;

}

//从文件中读取以添加线路

void ALGraph::addLineFromFile(const char FileName[MAXFILESIZE]) {

//cout << "从" << FileName << "中读取并导入线路!" << endl;

ifstream file(FileName);

if (!file) {

cout << "不能打开文件!" << endl;

return;

}

string catalogue; //存储第一行的目录

getline(file, catalogue);

//从第二行开始读取真正需要存储的信息

string line;

while (getline(file, line)) {

istringstream istr(UTF8ToGB(line.c_str()).c_str());;

LineNode* temp = new LineNode;

Line* info = new Line;

temp->Info = info;

string StartName, EndName;

istr >> StartName >> EndName >> info->LineName >> info->StartTime >> info->EndTime >>info->SpendMoney;

info->SpendTime = info->EndTime - info->StartTime;

temp->EndName = EndName;

insert(StartName, temp, EndName);

}

file.close();

}

//删除i城市为起点的所有路线

void ALGraph::delCityLine(int i) {

LineNode* p, * q;

p = CityList[i].FirstLine;

if (p == NULL) {

return;

}

while (p->NextLine) {

q = p;

p = q->NextLine;

delete q->Info;

delete q;

}

if (p->NextLine == NULL) {

delete p->Info;

delete p;

}

}

//删除城市,并删除以城市为起点的航班和列车

void ALGraph::delCity(string CityName) {

int i, j;

i = searchCityNum(CityName);

if (i == -1) {

cout << "没有找到该城市!" << endl;

}

else {

delCityLine(i);

for (j = i; j < CityNum - 1; ++j) {

CityList[j] = CityList[j + 1];

}

--CityNum;

//cout << "删除" << CityName << " 成功!" << endl;

}

}

void ALGraph::delLine() {

string StartName, EndName;

int StartNum;

cout << "请输入起点城市: ";

cin >> StartName;

StartNum = searchCityNum(StartName);

if (StartNum == -1) {

cout << "未找到该城市!" << endl;

return;

}

cout << "请输入终点城市: ";

cin >> EndName;

//显示起点城市的所有线路,并判断是否能到达该终点城市

bool flag = false;

LineNode* p, * q;

cout << "起点城市与终点城市的路线有: " << endl;

cout << "【出发城市】【到达城市】【班次名】【出发时间】【到达时间】【用时】【票价】" << endl;

for (p = CityList[StartNum].FirstLine; p != NULL; p = p->NextLine) {

if (p->EndName == EndName) {

cout << setw(8) << StartName << " " << setw(8) << EndName << " " << setw(6) << p->Info->LineName << " " << p->Info->StartTime << " " << p->Info->EndTime << " " << p->Info->SpendTime << " " << setiosflags(ios_base::showpoint) << p->Info->SpendMoney << resetiosflags(ios_base::showpoint);

flag = true;

}

}

cout << endl;

if (flag == false) {

cout << "该出发城市没有通往到达城市的班次!" << endl;

return;

}

//该出发城市能到达到达城市,开始删除线路

string LineName;

cout << "请输入你想要删除的班次:" << endl;

cin >> LineName;

p = CityList[StartNum].FirstLine;

q = p->NextLine;

//一条路

if (q == NULL) {

if (p->Info->LineName != LineName) {

cout << "没有该班次!" << endl;

return;

}

else {

CityList[StartNum].FirstLine = q;

CityList[StartNum].Amount--;

数据结构实验报告格式

《数据结构课程实验》大纲 一、《数据结构课程实验》的地位与作用 “数据结构”是计算机专业一门重要的专业技术基础课程,是计算机专业的一门核心的关键性课程。本课程较系统地介绍了软件设计中常用的数据结构以及相应的存储结构和实现算法,介绍了常用的多种查找和排序技术,并做了性能分析和比较,内容非常丰富。本课程的学习将为后续课程的学习以及软件设计水平的提高打下良好的基础。 由于以下原因,使得掌握这门课程具有较大的难度: (1)内容丰富,学习量大,给学习带来困难; (2)贯穿全书的动态链表存储结构和递归技术是学习中的重点也是难点; (3)所用到的技术多,而在此之前的各门课程中所介绍的专业性知识又不多,因而加大了学习难度; (4)隐含在各部分的技术和方法丰富,也是学习的重点和难点。 根据《数据结构课程》课程本身的技术特性,设置《数据结构课程实验》实践环节十分重要。通过实验实践内容的训练,突出构造性思维训练的特征, 目的是提高学生组织数据及编写大型程序的能力。实验学时为18。 二、《数据结构课程实验》的目的和要求 不少学生在解答习题尤其是算法设计题时,觉得无从下手,做起来特别费劲。实验中的内容和教科书的内容是密切相关的,解决题目要求所需的各种技术大多可从教科书中找到,只不过其出现的形式呈多样化,因此需要仔细体会,在反复实践的过程中才能掌握。 为了帮助学生更好地学习本课程,理解和掌握算法设计所需的技术,为整个专业学习打好基础,要求运用所学知识,上机解决一些典型问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握所用到的一些技术。数据结构中稍微复杂一些的算法设计中可能同时要用到多种技术和方法,如算法设计的构思方法,动态链表,算法的编码,递归技术,与特定问题相关的技术等,要求重点掌握线性链表、二叉树和树、图结构、数组结构相关算法的设计。在掌握基本算法的基础上,掌握分析、解决实际问题的能力。 三、《数据结构课程实验》内容 课程实验共18学时,要求完成以下六个题目: 实习一约瑟夫环问题(2学时)

交通管控大数据分析研判系统

交通管控大数据分析研 判系统 Document number【AA80KGB-AA98YT-AAT8CB-2A6UT-A18GG】

交通管控大数据分析研判系统 设 计 方 案 目录

1 系统概述 1.1 系统背景 随着经济迅猛发展,机动车辆不断增加,道路交通拥堵、交通肇事现象也越来越严重。交通管理部门部署了大量交通监控设备对道路交通情况进行监控,这些设备24小时不间断捕获过车数据和图像数据,产生了海量的历史记录。在此情况下,如何利用先进的技术手段,对交通监控设备采集的海量的、格式多样的数据进行深度分析应用,对海量数据进行查找、关联、比对等处理,实时发现其中潜在的问题并预警,成为当前迫切需要解决的问题。 主要体现在以下两个方面:一是交通管理部门的现有系统还处于结构化数据处理模式架构体系中,要实现对城市道路交通的整体运行状况、车辆出行规律等方面以日、月甚至年为时间粒度进行数据分析还存在不足。二是交通管理部门的现有系统在对这些具有逻辑关联的海量多源异构数据处理过程中,数据

存储结构、处理种类、处理效率等方面仍存在不足,不能满足持续扩大的交通管理数据规模以及对数据深度快速挖掘和应用需求。 交通管控大数据平台构建了一个支持横向扩展,具有分布、并行、高效特点的大数据处理平台的体系架构。综合运用云计算、云存储、并行数据挖掘、图像识别等技术,开展数据的存储、挖掘、联动、分析。通过将电子监控设备的数据、图像等异构的数据资源接入大数据处理平台,通过分布式存储和并行数据挖掘,提供在线实时分析模式和离线统计分析模式两种应用模式,对交通管理的各类大数据全方位地进行实时和离线分析处理。可以将隐藏于海量数据中的信息挖掘出来,可全面掌握道路通行情况,为策略制定、分析研判、行动部署提供依据,大大提升综合管理的集约化程度。 1.2 系统意义 (1)信息查询和预警分析 借助在线实时分析、离线统计分析和数据共享等手段,通过接口与集成指挥平台等各个业务系统关联,高效开展交通管理工作。例如通过分析一段时间内的过车信息进行查询分析对比,确定该时期造成交通拥堵的主要原因和发展趋势,对交通拥堵的发生进行一定的预测和判断,并采取相应的管控措施控制诱发交通拥堵的原因,科学预防交通拥堵。 (2)多维度布控打击违法犯罪 通过车辆特征二次识别比对,可对特定车辆的局部特征进行提取分析和建模,在车辆号牌信息缺失(套牌、遮挡号牌或无牌)情况下,按照车辆品牌、型号、颜色、类别以及局部特征等自定义组合布控报警,准确快速地实现特定车辆追踪与锁定,获取车辆真实行踪,将有价值的图片数据提供给公安刑侦部门,为侦破交通肇事逃逸案、利用机动车作为犯罪工具的刑事案、以及抢劫出租车等恶性案件提供线索和证据,为刑侦部门确定线索侦查破案提供支持。 (3)大粒度的数据分析为决策提供支持 通过交通流大数据采集存储、流量查询分析,车辆特征研判、车辆轨迹分析等深度应用,系统不仅仅可以实现对车辆和人员的分析研判,通过大量数据

数据结构课程设计交通咨询系统设计(DOC36页)

设计题目<二>:7.3.4交通咨询系统设计P160 一、设计要求 1.问题描述 根据不同目的的旅客对交通工具有不同的要求。例如,因公出差的旅客希望在旅途中的时间尽可能的短,出门旅行的旅客希望旅费尽可能的少,而老年人则要求中转次数少。模拟一个全国城市之间的咨询交通程序,为旅客提供两种或三种最优的交通路线。 2.需求分析 二、概要设计 1.主界面设计 (图2.1“交通咨询系统”主菜单) 2.存储结构设计 本系统采用图结构类型存储抽象交通咨询系统的信息。 typedef struct TrafficNode { char name[MAX_STRING_NUM]; //班次//MAX_STRING_NUM最为10 int StartTime, StopTime; //起止时间 int EndCity; //该有向边指向的顶点在数组中的位置,即该城市编号 int Cost; //票价

} TrafficNodeDat; typedef struct VNode { CityType city; int TrainNum, FlightNum; //标记下面Train数组和Flight数组里元素个数 TrafficNodeDat Train[MAX_TRAFFIC_NUM]; //数组成员为结构体,记录了到达城市、起止时间、票价和班次 TrafficNodeDat Flight[MAX_TRAFFIC_NUM]; // int Cost; //遍历时到达该城市的耗费(时间或者费用) } VNodeDat; typedef struct PNode { int City; int TraNo; } PNodeDat; 3.系统功能设计 (1)添加城市。添加一个城市的名称 (2)删除城市。输入一个城市名称,删除该城市。 (3)添加交通路线。输入起始城市、终点城市、航班或火车、车次、起始时间、终点时间和票价 (4)删除交通路线。输入火车或飞机的班次删除该交通路线。 (5)查询最小费用路线。输入起始城市、终点城市、航班或火车、车次、起始时间、终点时间查询最小费用路线。 三、模块设计 1.模块设计 (图2.2 模块调用示意图)

数据结构实验报告

数据结构实验报告 一.题目要求 1)编程实现二叉排序树,包括生成、插入,删除; 2)对二叉排序树进行先根、中根、和后根非递归遍历; 3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。 4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信息(至少包括学号、姓名、成绩3项),对比查找效率,并说明在什么情况下二叉排序树效率高,为什么? 二.解决方案 对于前三个题目要求,我们用一个程序实现代码如下 #include #include #include #include "Stack.h"//栈的头文件,没有用上 typedefintElemType; //数据类型 typedefint Status; //返回值类型 //定义二叉树结构 typedefstructBiTNode{ ElemType data; //数据域 structBiTNode *lChild, *rChild;//左右子树域 }BiTNode, *BiTree; intInsertBST(BiTree&T,int key){//插入二叉树函数 if(T==NULL) { T = (BiTree)malloc(sizeof(BiTNode)); T->data=key; T->lChild=T->rChild=NULL; return 1; } else if(keydata){ InsertBST(T->lChild,key); } else if(key>T->data){ InsertBST(T->rChild,key); } else return 0; } BiTreeCreateBST(int a[],int n){//创建二叉树函数 BiTreebst=NULL; inti=0; while(i

智慧交通产品总体解决方案-机动车查控分析系统

智慧交通产品解决方案 机动车查控分析系统 【面向城市交通】

目录 1.1.机动车查控分析系统 (4) 1.1.1.系统概述 (4) 1.1.2.系统特点 (4) 1.1.3.系统结构 (5) 1.1.4.业务流程 (7) 1.1.5.系统功能 (10)

1.1.机动车查控分析系统 1.1.1.系统概述 机动车查控分析系统是公安交警日常任务中应用广泛的业务系统,,面向公安交管提供个体交通违法嫌疑车辆准实时查控报警和群体车辆通行特性分析应用,面向公安治安提供涉案嫌疑车辆预警、筛查应用。 1.1. 2.系统特点 1.海量数据秒级响应 底层采用分布式大数据架构,海量过车数据实时查询与分析,无延迟秒级响应。 2.案件模型丰富且可以灵活扩展 系统针对公安、交通各警种的常见案件场景,设计了各种案件分析模型,且可根据案件实际场景灵活扩展与定制。 3.灵活布控、定向报警 提供了单车布控、批量布控、专项布控等多种布控形式,操作简便且支持模糊布控,报警数据流向定向化避免互相干扰。 4.可与公安、交通多系统联动 系统具备灵活的数据共享互通机制,与全国缉查布控系统无缝对接,联网布控。同时可根据需要对接警综平台、警务通、公安情报平台等各类实战系统,做到数据实时共享。

1.1.3.系统结构 1.1.3.1 逻辑结构 1、数据采集服务集群 对厂家提供标准化接口协议,接收卡口厂家数据,将数据转化为系统内部标准格式后传输给kafka(分布式消息队列),并对外提供标准的过车数据共享接口; 采用java语言编写标准的webservice接口,跨语言跨平台; 协议字典完全符合公安部与无锡所标准; 利用kafka作为消息缓冲层,可分布式扩展集群数据量,线性提升缓冲能力。 2、数据入库及流量统计服务 负责图片写入分布式存储(Hadoop),过车数据写入分布式数据库(Hbase),同时将数据写入消息队列对外提供共享;并计算一分钟流量数据写入Hbase; 系统可集群部署,多进程间自动负载均衡; 进程内部采用多线程方式,提升处理效率。 3、分布式存储、计算服务集群 采用Hadoop、Hbase等分布式技术搭建的可扩展存储与计算集群,集群数

全国交通咨询模拟数据结构课程设计

数据结构课程设计报告 题目:全国交通咨询模拟 一.需求分析 1.程序设计任务:从中国地图平面图中选取部分城市,抽象为程序所需要图的结点,并以城市间的列车路线和飞机路线,作为图结点中的弧信息,设计一个全国交通咨询模拟系统。利用该系统实现两种最优决策:最快到达或最省钱到达。 2. 明确规定: (1) 输入形式和输入值的范围:每条飞机弧或者火车弧涉及的信息量很多,包括:起始城市、目的城市、出发时间、到达时间、班次以及费用。作为管理员要输入的信息包括以上信息,而作为用户或者客户,要输入的信息有起始城市和目的城市,并选择何种最优决策。 (2) 输出形式:按用户提供的最优决策的不同而输出不同的信息,其中输出的所搭飞机或火车的班次及其起始地点和终点、起始时间和出发时间还有相关的最优信息,比如最快经多少时间到达、最省钱多少钱到达和最少经多少中转站到达。 (3) 程序所能达到的功能 a. 该系统有供用户选择的菜单和交互性。可以对城市、列车车次和飞机航班进行 编辑,添加或删除。 b. 建立一个全国交通咨询系统,该系统具备自动查找任意两城市间铁路、飞机交通的最短路径和最少花费及中转次数最少等功能。 c. 初始化交通系统有两种方式,键盘和文档。

二.设计概要 1.算法设计 (1)、总体设计 (1)数据存储:城市信息(城市名、代码)、交通信息(城市间的里程、各航班和列车时刻)存储于磁盘文件。建议把城市信息存于文件前面,交通信息存于文件的后面,用fread和fwrite函数操作。 (2)数据的逻辑结构:根据设计任务的描述,其城市之间的旅游交通问题是典型的图结构,可看作为有向图,图的顶点是城市,边是城市之间所耗费的时间(要 包括中转站的等候时间)或旅费。 (3)数据的存储结构:采用邻接表和邻接矩阵都可作为数据的存储结构,但当邻接边不多时,宜采用邻接表,以提高空间的存储效率。这里采用邻接表作为数据的存储结构。 (4)用不同的功能模块对城市信息和交通信息进行编辑。添加、修改、删除 功能可用菜单方式或命令提示方式。只要能方便的对城市信息和交通信息进行管理即可,但要注意人机界面。 (5)最优决策功能模块(fast or province)。 ①读入城市信息和交通信息,用邻接表生成含权网络,表头数组中的元素存放城市名及对方城市到达该元素所代表城市的所有信息;表头数组中的元素所对应的单链表存放与该元素所代表的城市有交通联系的城市(代码、里程、航班、列车车次)。 ②根据具体最优决策的要求,用Dijkstra算法求出出发城市到其它各城市 的最优值(最短时间或最小的费用),搜索过程中所经过城市的局部最优信息都保存在邻接表的表头数组中。其目的城市所代表的元素中就保存了所需的最优决策结果。这过程中,要用队列或栈保存局部最优决策值(局部最短的时间或最省的费用)变小的城市,其相应的初始值可为%,并在表头数组对应的城市元素中保 存响应的信息。开始时,栈(队列)中只有出发地城市,随着对栈(队列)顶(首)城市有交通联系的城市求得决策值(最短时间或最小的费用),若该值是局部最优值且该城市不在栈(队列)中,则进栈(队列),直至栈(队列)为空,本题采用队列实现。 ③输出结果:从目的城市出发,搜索到出发城市,所经过的城市均入栈(队列),再逐一出栈栈(队列)中的城市,输出保存在表头数组中对应城市的信息 (对 方城市的出发信息,里程、时间、费用等)及最终结果。即输出依次于何时何地乘坐几点的飞机或火车于何时到达何地;最终所需的最快需要多长时间才能到达及旅费,或者最少需要多少旅费才能到达及时间。 (6)主程序可以有系统界面、菜单;也可用命令提示方式;选择功能模块执行,要求在程序运行过程中可以反复操作。 (2).详细设计思想: 本题所要求的交通系统是一个有向带权图结构,考虑到要求该系统有动态增加飞机和列车航班的功能,因而采用邻接表的形式存储:对每个顶点建立一个 单链表,单链表中的子结点表示以该顶点连接的弧,单链表中子结点的顺序可以 按权值递增的顺序排列,表头结点按顺序存储。题目中提到要提供三种策略,最快到达,最省钱到达和最少中转次数策略,前两种策略采用迪杰斯特拉算法思想,其中最快到达的权值为到达两城市所需的最短时间,最省钱到达的权值为到达两城市所需的费用,后一种采用广度优先算法的思想,只需求的两城市所在的层数,就可以求的到达两城市所需的最少中转次数。

数据结构实验报告全集

数据结构实验报告全集 实验一线性表基本操作和简单程序 1.实验目的 (1)掌握使用Visual C++ 6.0上机调试程序的基本方法; (2)掌握线性表的基本操作:初始化、插入、删除、取数据元素等运算在顺序存储结构和链表存储结构上的程序设计方法。 2.实验要求 (1)认真阅读和掌握和本实验相关的教材内容。 (2)认真阅读和掌握本章相关内容的程序。 (3)上机运行程序。 (4)保存和打印出程序的运行结果,并结合程序进行分析。 (5)按照你对线性表的操作需要,重新改写主程序并运行,打印出文件清单和运行结果 实验代码: 1)头文件模块 #include iostream.h>//头文件 #include//库头文件-----动态分配内存空间 typedef int elemtype;//定义数据域的类型 typedef struct linknode//定义结点类型 { elemtype data;//定义数据域 struct linknode *next;//定义结点指针 }nodetype; 2)创建单链表

nodetype *create()//建立单链表,由用户输入各结点data域之值,//以0表示输入结束 { elemtype d;//定义数据元素d nodetype *h=NULL,*s,*t;//定义结点指针 int i=1; cout<<"建立一个单链表"<> d; if(d==0) break;//以0表示输入结束 if(i==1)//建立第一个结点 { h=(nodetype*)malloc(sizeof(nodetype));//表示指针h h->data=d;h->next=NULL;t=h;//h是头指针 } else//建立其余结点 { s=(nodetype*) malloc(sizeof(nodetype)); s->data=d;s->next=NULL;t->next=s; t=s;//t始终指向生成的单链表的最后一个节点

数据结构课程设计全国交通咨询系统方案

工业应用技术学院 课程设计任务书 题目全国交通资询系统 主要容: 设计了一个方便用户查询交通咨询系统。该系统所做的工作的是模拟全国交通咨询,为旅客提供三种最优决策的交通咨询。该系统可以进行城市,列车车次和飞机航班的编辑的基本信息输入操作。程序的输出信息主要是:最快需要多少时间才能到达,或最少需要多少旅费才能到达,或最少需要多少次中转到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。程序的功能包括:提供对城市信息的编辑,提供列车时刻表和飞机航班表的编辑,提供三种最优决策:最快到达、最省钱到达、最少中转次数到达。 基本要求: 1、掌握C语言的变量及函数的灵活使用; 2、熟练掌握图的深度、广度优先遍历算法思想及其程序实现; 3、掌握C语言中文件的基本操作; 4、掌握VC++6.0软件的熟练使用。 主要参考资料: [1] 春葆.数据结构程序设计[M].:清华大学,2002,03 [2] 王黎,袁永康https://www.360docs.net/doc/f2801497.html,战略[M].:清华大学,2002,01 [3] 谭浩强.C程序设计第二版[M].:清华大学,2003,03 [4] 任哲.MFC Windows程序设计[M].:清华大学,2004,06 完成期限:2016.12.05—2017.01.05 指导教师签名: 课程负责人签名:

随着高科技的飞速发展,列车、飞机、动车、高铁的出现极大的减少了人们花在旅途上的时间。对于城市间错综复杂交通网的管理,是一项庞大而复杂的工作。在此基础上,如何实现交通网智能化的管理达到帮助乘客选择经济高效的交通工具是目前仍处空白。尤其乘客交通工具的择优选择是一个令人懊恼的工作,一个原因就是各种交通工具的查询十分分散和繁琐。即使有互联网的帮忙,但是没有一个统一的归类、没有一个精细的算法、系统的软件帮助,人们仍然无法获得最优方式。为此开发一个交通择优系统是十分必要的。采用计算机对城市间的交通工具进行系统录入和管理,进一步提高了交通部门针对城市间客运网络的管理效率,实现交通运营网络的系统化、规化和自动化。同时使乘客能通过网络进行称心的交通工具的选择,这也是交通网络优选智能决策的体现。交通信息的咨询和管理是交通部门管理工作中异常重要的一个环节,因此,运用交通资询管理系统对春运时减轻乘客购票压力、舒缓紧的城际拥堵有重要意义。 关键字:错综复杂;智能化;最优方式;择优系统

交通咨询系统设计报告

重庆科技学院 《数据结构》课程设计 报告 学院:_电气与信息工程学院_ 专业班级: 计科2 学生姓名: 学号: 设计地点(单位)__ _ 计算机基础自主学习中心__ _ _ 设计题目:________ 交通咨询系统设计__ ___ _ _ 完成日期:2012年7 月6 日 指导教师评语: ______________________ _________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________

_________ __________ _ 成绩(五级记分制):______ __________ 指导教师(签字):________ ________ 重庆科技学院 课程设计任务书 设计题目:交通咨询系统的设计

系主任:雷亮指导教师:黄永文/王双明/熊茜/彭军/王成敏 2012年6月20日 摘要

在交通网络非常发达,人们在出差、旅游出行时,往往关心节省交通费用或节省所需要的时间等问题。对于这样一个人们关心的问题,可以用一个图结构来表示交通网络,利用计算机建立一个交通咨询系统。图中顶点表示城市,边表示城市之间的交通情况,其权值可代表里程、交通费用或时间。比如任意一个城市到其他城市的最短路径,任意两个城市之间的最短路径问题。 本次设计的交通咨询系统主要是运用C语言的数据结构来完成交通图的存储、图中顶点的单源最短路径和任意一对顶点间的最短路径问题。 关键词:数字结构C语言交通咨询最短路径

数据结构实验报告模板

2009级数据结构实验报告 实验名称:约瑟夫问题 学生姓名:李凯 班级:21班 班内序号:06 学号:09210609 日期:2010年11月5日 1.实验要求 1)功能描述:有n个人围城一个圆圈,给任意一个正整数m,从第一个人开始依次报数,数到m时则第m个人出列,重复进行,直到所有人均出列为止。请输出n个人的出列顺序。 2)输入描述:从源文件中读取。 输出描述:依次从显示屏上输出出列顺序。 2. 程序分析 1)存储结构的选择 单循环链表 2)链表的ADT定义 ADT List{ 数据对象:D={a i|a i∈ElemSet,i=1,2,3,…n,n≧0} 数据关系:R={< a i-1, a i>| a i-1 ,a i∈D,i=1,2,3,4….,n} 基本操作: ListInit(&L);//构造一个空的单链表表L ListEmpty(L); //判断单链表L是否是空表,若是,则返回1,否则返回0. ListLength(L); //求单链表L的长度 GetElem(L,i);//返回链表L中第i个数据元素的值; ListSort(LinkList&List) //单链表排序 ListClear(&L); //将单链表L中的所有元素删除,使单链表变为空表 ListDestroy(&L);//将单链表销毁 }ADT List 其他函数: 主函数; 结点类; 约瑟夫函数 2.1 存储结构

[内容要求] 1、存储结构:顺序表、单链表或其他存储结构,需要画示意图,可参考书上P59 页图2-9 2.2 关键算法分析 结点类: template class CirList;//声明单链表类 template class ListNode{//结点类定义; friend class CirList;//声明链表类LinkList为友元类; Type data;//结点的数据域; ListNode*next;//结点的指针域; public: ListNode():next(NULL){}//默认构造函数; ListNode(const Type &e):data(e),next(NULL){}//构造函数 Type & GetNodeData(){return data;}//返回结点的数据值; ListNode*GetNodePtr(){return next;}//返回结点的指针域的值; void SetNodeData(Type&e){data=e;}//设置结点的数据值; void SetNodePtr(ListNode*ptr){next=ptr;} //设置结点的指针值; }; 单循环链表类: templateclass CirList { ListNode*head;//循环链表头指针 public: CirList(){head=new ListNode();head->next=head;}//构造函数,建立带头节点的空循环链表 ~CirList(){CirListClear();delete head;}//析构函数,删除循环链表 void Clear();//将线性链表置为空表 void AddElem(Type &e);//添加元素 ListNode *GetElem(int i)const;//返回单链表第i个结点的地址 void CirListClear();//将循环链表置为空表 int Length()const;//求线性链表的长度 ListNode*ListNextElem(ListNode*p=NULL);//返回循环链表p指针指向节点的直接后继,若不输入参数,则返回头指针 ListNode*CirListRemove(ListNode*p);//在循环链表中删除p指针指向节点的直接后继,且将其地址通过函数值返回 CirList&operator=(CirList&List);//重载赋

交通管控大数据分析研判系统

交通管控大数据分析研判系统 设 计 方 案

目录 1 系统概述 (5) 1.1 系统背景 (5) 1.2 系统意义 (5) 1.3 研发原则 (6) 1.4 系统内容 (7) 2 需求分析 (8) 2.1 业务需求 (8) 2.1.1 面向交通管理的大数据业务需求 (8) 2.1.2 面向交通安全的大数据业务需求 (8) 2.2 功能需求 (9) 2.2.1 基于大数据的在线统计和离线分析需求 (9) 2.2.2 基于大数据的车辆特征分析需求 (9) 2.2.3 基于大数据的违法事故分析需求 (9) 2.2.4 基于大数据的勤务快速处置需求 (10) 2.2.5 基于大数据平台的车辆特征二次识别需求 (10) 2.2.6 基于大数据平台的技战法需求 (10) 2.3 性能需求 (10) 2.3.1 高并发实时数据采集需求 (10) 2.3.2 海量数据存储需求 (10) 2.3.3 分布式流处理需求 (11) 2.3.4 车辆二次识别需求 (11) 3 架构设计 (11) 3.1 总体应用架构 (11) 3.2 软件框架结构 (12)

3.3 网络部署架构 (12) 3.4 数据流结构 (13) 3.5 关键技术路线 (13) 3.5.1 Hadoop技术 (14) 3.5.2 Spark技术 (14) 3.5.3 车辆特征二次识别技术 (16) 4 功能设计 (16) 4.1 功能结构图 (16) 4.2 功能模块 (16) 4.2.1 首页 (16) 4.2.2 实时预警 (20) 4.2.3 信息查询 (21) 4.2.4 统计分析 (27) 4.2.5 技战法 (31) 4.2.6 车辆布控 (34) 4.2.7 系统设置 (35) 4.2.8 运维管理 (36) 5 数据库设计 (37) 5.1 数据库ER模型 (37) 5.2 数据库表 (37) 6 接口设计 (37) 6.1 接口分布图(接口关联图) (37) 6.2 接口详细说明 (37) 7 系统特色 (37) 7.1 优化交通大数据集中存储能力 (37)

2数据结构_全国交通咨询模拟系统实验报告

全国交通咨询模拟 一、设计目的 掌握线性表、栈、图结构和对文件的操作,学习屏幕编辑和菜单技术,掌握用最短路径及其搜索算法编制较综合性的程序,能用图的邻接存储结构求解最优路线问题,解决有关实际问题。得到软件设计技能的训练。 二、问题描述 交通咨询模拟。根据旅客的不同需要,要考虑到旅客希望在旅途中的时间尽可能短、希望旅费尽可能省等的要求。 三、基本要求 1、对城市信息(城市名、城市间的里程)进行编辑:具备添加、修改、删除功能; 2、对城市间的交通工具:火车。对列车时刻表进行编辑:里程、和列车班次的添加、修改、删除; 3、提供两种最优决策:最快到达或最省钱到达。全程只考虑一种交通工具,可以不考虑回程; 4、咨询以用户和计算机对话方式进行,要注意人机交互的屏幕界面。由用户选择最优决策原则和交通工具,输入起始站、终点站、出发时间,输出信息:最快需要多长时间才能到达及旅费,或者最少需要多少旅费才能到达及时间,并详细说明依次于何时何地乘坐哪一趟列车何时到达何地。

四、具体实现 1、思路 (1) 数据存储。城市信息(城市名、代码)、交通信息(城市间的里程、各航班和列车时刻)存储于磁盘文件。在实验中本想用文本储存数据,但操作不熟悉,而是改用图的邻接矩阵储存原始信息,而后用数组进行添加删改 (2) 数据的逻辑结构。根据设计任务的描述,其城市之间的旅游交通问题是典型的图结构,可看作为无向图,图的顶点是城市,边是城市之间所耗费的时间(要包括中转站的时间)或旅费。 (3) 数据的存储结构。采用邻接表和邻接矩阵都可作为数据的存储结构,这里建议采用邻接矩阵作为数据的存储结构。 (4) 用不同的功能模块对城市信息和交通信息进行编辑。添加、修改、删除功能可用菜单方式或命令提示方式。只要能方便的对城市信息和交通信息进行管理即可,但要注意人机界面,具体实现由学生自行设计,也可参考有关程序(届时在网上提供)。这些工作有不小的工作量。 (5) 最优决策功能模块 ① 读入城市信息和交通信息,用邻接表生成含权网络,表头数组中的元素存放城市名及对方城市到达该元素所代表城市的所有信息;表头数组中的元素所对应的单链表存放与该元素所代表的城市有交通联系的城市(代码、里程、列车车次)。 ② 根据具体最优决策的要求,用floyd算法求出出发城市到其它各城市的最优值(最短时间或最小的费用),搜索过程中所经过城市的局部最优信息都保存在邻接表的表头数组中。其目的城市所代表的元素中就保存了所需的最优决策结果。其相应的初始值可为∞,并在表头数组对应的城市元素中保存响应的信息。 ③主程序可以有系统界面、菜单;也可用命令提示方式;选择功能模块执行,要求在程序运行过程中可以反复操作。 2、数据结构 本程序运用了关于图这种数据结构。 他的抽象数据类型定义如下: typedef struct unDiGraph

(完整版)城市交警局智慧交通决策分析系统解决方案

城市交警局智慧交通决策分析 系统解决方案 国内各城市交警局智慧交通相关基础应用系统和前端电子警察、高清卡口、信号灯控制等系统已大规模建成,并实现城区较高密度的覆盖;在数据资源方面,已实现GPS数据、交通违法数据、道路过车数据、车速、流量等基础数据都的大规模采集。在缓解道路交通拥堵,提升路网运行效率等方面发挥了重要作用。但各系统独立运行,未实现数据的共享,未对现有数据进行深度数据挖掘,缺乏针对性智能决策支,无法了解城区路网的运行状况、不能为城区路网的拥堵疏通、交通组织、交通管制、紧急事件处置、路网优化、交通规划等提供决策依据。因此,建设智慧交通交警业务支撑平台,实现跨部门、跨系统的信息的共享应用,对于提升各级城市的道路交通综合管理和应用水平,实现对城市主要路段交通运行状况的实时、动态掌控具有重要的意义。

? 解决方案介绍 通过对交通数据的深入分析,实现定性管理与定量分析管理相结合,为交通管理决策提供可靠、准确的科学依据,并提高对道路交通的科学化管理水平,警务人员的现代化管理及交通意外事件的预案报警和快速反应能力,促进交通管理决策科学化。 1、路网整体运行状况的研判分析 通过对高清视频综合信息采集系统、公路车辆智能监测记录系统采集的车辆号牌信息和出租车的GPS数据的综合分析,得到不同路段的交通运行状况,并基于GIS地图进行展示,使交通管理者可以实时了解城市整体路网的运行状况;利用高清视频综合信息采集系统采集的车辆号牌信息进行OD数据的分析,得到车辆出行的OD矩阵,为路网规划、交通管理提供决策依据。

2、主次干道运行态势的分析 分析研判主次干道的交通运行态势,实现主次干道交通信息的综合显示,对主次干道路段车辆来源及密度进行研判分析,提出交通疏导、交通组织优化的建议;对主次干道交通拥堵状况、交通违法、交通事故进行关联分析,提出缓解交通拥堵、预防交通事故的对策建议。 3、交叉口综合信息管理与研判 通过对平台汇集的海量交通数据进行综合的研判分析,实现交叉口交通信息的综合显示,包括相位信息、视频信息、违法信息、交通流信息、过车信息等;实现交叉口交通量的双向对比分析、车型构成分析、违法类型构成分析、车辆来源构成分析等。 ?具体优势 本方案基于大数据分析挖掘,采用了十多种先进的仿真和数学模型,实现了交通的决策分析支持,服务于交通规划、城市路网优化、城市交通治堵和提升交通安全,在业内目前没有一个厂商能够提供此类决策分析系统。 具体优势如下: 1、决策分析智慧化 通过对交通数据的深入分析,实现定性管理与定量分析管理相结合,从宏观路网、干线、路口三个层级进行监测、模拟、分析、决策,为交通管理决策提供可靠、准确的科学依据,并提高对道路交通的科学化管理水平,警务人员的现代化管理及交通意外事件的预案报警和快速反应能力,促进交通管理决策科学化。

数据结构全国交通模拟系统

全国交通模拟系统课程设计报告 姓名:唐文龙 班级: 2班 学号: 411417080216 学院:华信学院 专业:计算机科学与技术 指导: 日期:2013.06.20

目录 1 需求分析 (1) 1.1 概述 (1) 1.2 数据需求 (1) 1.3 功能性需求 (1) 1.4 其他需求 (1) 2 概要设计 (2) 3 详细设计 (4) 3.1 记录的定义 (4) 3.2 子程序说明 (5) 3.3 子程序的算法说明 (5) 3.3.1主函数流程图 (6) 4 系统实现 (7) 4.1开发环境 (8) 4.2运行界面 (9) 4.3测试用例 (10) 5 总结 (11) 6.参考文献 (11) 附录:源程序 (11)

1 需求分析 出于不同目的的旅客对交通工具有不同的要求。例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则期望旅费尽可能省,而老年旅客则要求中转次数最少。编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。 1.1 概述 程序的功能包括:提供对城市信息的编辑,提供列车时刻表和飞机航班表的编辑,提供两种最优决策:最快到达、最省钱到达。 1.2 数据需求 输入列车或飞机编号时需输入一个整型数据;输入列车或飞机的费用时需输入一个实型数据;输入列车或飞机开始时间和到达时间时均需输入两个整型数据;在选择功能时,应输入与所选功能对应的一个整型数据。 1.3 功能性需求 总体功能描述 (1) 提供对城市信息进行编辑的功能。 (2) 城市之间有两种交通工具:火车和飞机。提供对列车时刻表和飞机航班进行编辑的功能。 (3) 提供两种最优决策: 最快到达或最省钱到达。全程只考虑一种交通工具,不考虑回程; (4) 旅途中耗费的总时间应该包括中转站的等候时间。 (5) 咨询以用户和计算机的对话方式进行。由用户输入起始站、终点站、最优决策原 则和交通工具, 输出信息: 最快需要多长时间才能到达或者最少需要多少旅费才能到达。 1.4 其他需求 (1)具有可靠性,可用性。

数据结构实验总结报告

数据结构实验总结报告 李博杰PB10000603 一、调试过程中遇到哪些问题? (1)在二叉树的调试中,从广义表生成二叉树的模块花了较多时间调试。 由于一开始设计的广义表的字符串表示没有思考清晰,处理只有一个孩子的节点时发生了混乱。调试之初不以为是设计的问题,从而在代码上花了不少时间调试。 目前的设计是: Tree = Identifier(Node,Node) Node = Identifier | () | Tree Identifier = ASCII Character 例子:a(b((),f),c(d,e)) 这样便消除了歧义,保证只有一个孩子的节点和叶节点的处理中不存在问题。 (2)Huffman树的调试花了较长时间。Huffman编码本身并不难处理,麻烦的是输入输出。 ①Huffman编码后的文件是按位存储的,因此需要位运算。 ②文件结尾要刷新缓冲区,这里容易引发边界错误。 在实际编程时,首先编写了屏幕输入输出(用0、1表示二进制位)的版本,然后再加入二进制文件的读写模块。主要调试时间在后者。 二、要让演示版压缩程序具有实用性,哪些地方有待改进? (1)压缩文件的最后一字节问题。 压缩文件的最后一字节不一定对齐到字节边界,因此可能有几个多余的0,而这些多余的0可能恰好构成一个Huffman编码。解码程序无法获知这个编码是否属于源文件的一部分。因此有的文件解压后末尾可能出现一个多余的字节。 解决方案: ①在压缩文件头部写入源文件的总长度(字节数)。需要四个字节来存储这个信息(假定文件长度不超过4GB)。 ②增加第257个字符(在一个字节的0~255之外)用于EOF。对于较长的文件,会造成较大的损耗。 ③在压缩文件头写入源文件的总长度%256的值,需要一个字节。由于最后一个字节存在或不存在会影响文件总长%256的值,因此可以根据这个值判断整个压缩文件的最后一字节末尾的0是否在源文件中存在。 (2)压缩程序的效率问题。 在编写压缩解压程序时 ①编写了屏幕输入输出的版本 ②将输入输出语句用位运算封装成一次一个字节的文件输入输出版本 ③为提高输入输出效率,减少系统调用次数,增加了8KB的输入输出缓存窗口 这样一来,每写一位二进制位,就要在内部进行两次函数调用。如果将这些代码合并起来,再针对位运算进行一些优化,显然不利于代码的可读性,但对程序的执行速度将有一定提高。

交通咨询系统 C语言

CHINA 交通咨询系统

目录 一、需求分析 (2) 1、程序的功能及设计要求 (2) 2、输入输出的要求 (2) 二、环境说明 (2) 三、详细设计 (3) 1、模块设计 (3) 2、画出各函数的调用关系图、主要函数的流程图。 (3) 2、详细代码 (4) 四、调试分析 (4) 1、测试数据: (4) 2、借鉴的资料 (5) 五、课程总结 (6) 六、附录 (6)

一、需求分析 1、程序的功能及设计要求 在交通网络非常发达、交通工具和交通方式不断更新的今天, 人们在出差、旅游或做其他出行时,不仅关心节省交通费用,而且对里程和所需时间等问题也感兴趣。对于这样一个人们关心的问题,通过建立交通网络图的存储结构图,提供用户查询的功能,功能一:通过输入城市名及任意两个城市的距离,查询任意两个城市之间的最短距离,从而达到最省目的;功能二:通过输入城市名以及任意两个程序的距离,查询中转路线最少。程序所具有的功能特色本程序主要目的是为了给用户提供路径咨询,可以通过输入设置,延续程序的拓展性。 设计要求及分析 设计一个交通咨询系统,能让旅客咨询从任一个城市顶点到另一城市顶点之间的中转次数最少问题或最低花费或最少时间(最短路径)问题。 该设计共分三个部分:一是建立交通网络图的存储结构;二是解决单源最短路径问题;最后再实现任意两个城市顶点之间的最短路径问题。 1. 建立交通网络图的存储结构 要实现设计要求,首先要定义交通图的存储结构:邻接链表和邻接矩阵; 2. 解决任意两个城市顶点之间的中转次数最少的问题; 3. 解决任意两个城市顶点之间的最短路径(最低花费或最少时间)问题。 2、输入输出的要求 定义变量类型应该保持类型一致,通过键盘输入,确保输入输出一致,使最短路径途径以及最短路径能够简单明了的输出,同时保持程序简洁美观,效果明显。输入要求为输入界面直观、亲切;有利于快速输入;有利于准确输入;有利于输入、修改;方便操作。输出要求:输出要求应简单、直观,一目了然,尽量符合用户的习惯,便于用户阅读、理解与使用。输出内容应尽量汉字化,从而使输出格式醒目;各种输出设计要长考虑以利于系统发展和输出项目扩充、变动的需要;输出操作方便 二、环境说明 系统:WINDOS7 开发软件:vc6+

数据结构实验报告及心得体会

2011~2012第一学期数据结构实验报告 班级:信管一班 学号:201051018 姓名:史孟晨

实验报告题目及要求 一、实验题目 设某班级有M(6)名学生,本学期共开设N(3)门课程,要求实现并修改如下程序(算法)。 1. 输入学生的学号、姓名和 N 门课程的成绩(输入提示和输出显示使用汉字系统), 输出实验结果。(15分) 2. 计算每个学生本学期 N 门课程的总分,输出总分和N门课程成绩排在前 3 名学 生的学号、姓名和成绩。 3. 按学生总分和 N 门课程成绩关键字升序排列名次,总分相同者同名次。 二、实验要求 1.修改算法。将奇偶排序算法升序改为降序。(15分) 2.用选择排序、冒泡排序、插入排序分别替换奇偶排序算法,并将升序算法修改为降序算法;。(45分)) 3.编译、链接以上算法,按要求写出实验报告(25)。 4. 修改后算法的所有语句必须加下划线,没做修改语句保持按原样不动。 5.用A4纸打印输出实验报告。 三、实验报告说明 实验数据可自定义,每种排序算法数据要求均不重复。 (1) 实验题目:《N门课程学生成绩名次排序算法实现》; (2) 实验目的:掌握各种排序算法的基本思想、实验方法和验证算法的准确性; (3) 实验要求:对算法进行上机编译、链接、运行; (4) 实验环境(Windows XP-sp3,Visual c++); (5) 实验算法(给出四种排序算法修改后的全部清单); (6) 实验结果(四种排序算法模拟运行后的实验结果); (7) 实验体会(文字说明本实验成功或不足之处)。

三、实验源程序(算法) Score.c #include "stdio.h" #include "string.h" #define M 6 #define N 3 struct student { char name[10]; int number; int score[N+1]; /*score[N]为总分,score[0]-score[2]为学科成绩*/ }stu[M]; void changesort(struct student a[],int n,int j) {int flag=1,i; struct student temp; while(flag) { flag=0; for(i=1;ia[i+1].score[j]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; flag=1; } for(i=0;ia[i+1].score[j]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; flag=1;

相关文档
最新文档