第一篇:数据结构专题设计报告—北京公交查询
图专题设计报告
题目:公交线路查询成员:组长:
张俭伟 组员:
邵
青
杨梓艺
赵
欣
李
哲
宁立跃
彭少龙 时间:2013年4月30
日
一、问题描述
随着经济和科技的高速发展,城市的公共交通建设进程加快。北京作为一个国际化大都市,其公共交通网络已日趋完善。但随着一条条交通线路的开始运行,调整路线,或被其它路线取代而停用,城市复杂的公共交通网络有时也给市民出行造成了不小的困扰。一个用户从甲地到乙地,有多种交通方式及多种交通路线。而由于对速度,距离,交通方式,及费用等方面的不同需要,用户需要有多种满足不同需求的方案以备选择。常见的交通方式有公交车和地铁。本次专题就为人机交互的北京公交线路查询系统。用户只需输入起始站、终点站,系统即可为用户提供三种或以上决策的交通咨询。
二、具体要求
a.提供对交通线路进行编辑功能。要求可添加或删除线路。
b.提供两种交通工具,公交车和地铁,设定路程所需要的时间、距离及费用等参数。
c.提供多种决策:最短距离、最快到达、最少费用、最少换乘次数等。d.中途不考虑等候、拥堵等消耗时间。
e.该系统以人机对话方式进行。用户输入起始站、终点站及需求原则,系统输出乘车方案:乘什么车、乘几路车、距离、时间、费用换乘方法等相关信息。
三、数据结构与算法分析
1)可以以邻接表作交通图的存储结构,表示边的结构内除包含有邻接点的信息外,还应包括交通工具、路程时间和费用等多种属性。
2)使用图的基本算法:插入、删除、排序、深度优先级搜索和广度优先搜索等算法。
四、算法设计与实现
1、流程图
由于算法较为明朗,这里只对其中较为复杂的部分——通过全链表的线路结构建立邻接链表这一过程给出流程图。
2、算法设计思路及特点
1)迪克斯特拉(Dijkstra)算法
按路径长度递增逐步产生最短路径 2)线路结构
在线路存储处理上,我们小组采用了链表结构进行存储线路: 站点链结点结构 StationData 线路链结点结构 RouteData
3)图结构
我们有四种搜索路径方式:最短距离、最短时间、最少换乘、最少花费。
a.用来搜索最短距离和最短时间的路径时是只考虑相邻的两个站点,所以在整个图结构中边数较小。为了节省空间资源,我们采用了邻接链表的方式来存储图。
b.用来搜索最少换乘与最少花费的路径时需要考虑到一个站点所有可能0换乘到达的站点,所以整个图结构中边数较多,所以采用了邻接矩阵的结构。
3、程序代码(有备注,见附录)
五、测试与结论
1、采用VC进行编译调试(代码界面)
2、主界面(用户体验界面)
按照提示输入1.管理员(管理权限系统权限,增加、删除、查询路线站点)
2.普通用户(查询路线站点)
3、管理员权限测试
1)登录需输入正确密码
2)管理员功能选择界面
3)管理员增加路线界面
通过输入站点、时间间隔和距离间隔新建一条9号地铁线,保存。此时,显示全部线路的界面中新建的线路subway9已存在。
4)管理员删除线路界面
通过输入线路的名称,确定是否删除此线路。
4、用户权限测试
1)用户功能选择界面
2)查询站点测试
输入要查询的站点,系统会显示出经过此站点的全部路线。如此用例中,输入“西直门”,西直门为换乘站,系统给出了经过此站的2条线路的详细情况。
3)用户搜索路线(最核心的功能)
首先先展示我们测试使用的路径图片。
首先是最短距离的测试。
最少时间的测试。
最少换乘——最短距离模式。
最少换乘——最短时间模式。
最少花费——最短距离模式。
最少花费——最短时间模式。
4)、输入两个报错用例 a.以管理员身份登录
以管理员身份登录系统时需要输入密码,若输入错误,则系统提示“密码错误,返回主界面”。b.用户查询报错
用户站点查询时,输入站点名错误,系统提示“无此站点,重新输入。”
六、小组分工
邵青:编写了最短时间、最短距离部分的搜索函数
杨梓艺:编写了建立邻接链表部分的函数
赵欣:编写了最少换乘、最少花费部分的搜索函数 李哲:负责编写了建立邻接矩阵的函数,并编写了路线链表与该部分相关的函数 彭少龙:编写了路线链表的全部函数
宁立跃:构思、讨论并给出Dijkstra算法的模板及程序其他方面的构思,供其他组员使用,张俭伟:构思、讨论并给出Dijkstra算法的模板及程序其他方面的构思,供其他组员使用
七、总结与思考
通过大家的共同努力,完成了最后一次的专题程序设计。小组的各位成员都在本次设计中学习到了很多。
1)专业方面。我们对图和链表的结构从书面了解,逐步熟悉到能够掌握结构用法并运用到本次的图专题程序设计中。小组成员的基于C++编程的能力又得到了进一步的提升。
2)本次专题的主题为“北京公交查询系统”。题目与生活联系非常紧密,这就要求我们的程序设计一定要理论与实践相结合,同时考虑到交通网络中各种复杂的重叠,交叉及往返等情况,统筹兼顾。让小组成员都学会把专业中的编程更深入有效地运用到实际生活中去。
3)完成专题设计中组内合作是非常重要的。组内成员不断的进行思考与沟通,完善分工,提升了协作能力。
附录:
#include
#define MAX 200 #define Infinity 65535 #define PASSWORD “123”
string password();
/******************************存储格式********************************** 线路名 线路类型 线路费用
站名1 距下一站时间 距下一站距离 站名2。。。。。。。。#(表示该线路结束)
*************************************************************************/
/******************************线路链表部分***********************************/
class StationData { public:
string sn;
//站点名
int distance,time,number;//距下一站的距离和时间
StationData *next;
StationData *former;
StationData()
{
distance = time = number = 0;
next = former = NULL;
} };
class RouteData { public:
string rn;
//公交路线名
int type;
//类型
float fee;
//费用
StationData *link;
RouteData *next;
RouteData()
{
link = NULL;
next = NULL;
} };
class Route { public:
RouteData *head;
int num;
Route()
{
head = NULL;
num = 0;
}
void Creat();
RouteData * Find(string s);
void Add();
void Dele();
void Save();
void ShowOneRoute(RouteData * p);
void Showall();
RouteData * FindRoute(string one,string two);
double MinWay(string one,string two,int way);
double MinWayMoney(string one,string two,int way);
RouteData * MinWayReturnRouteData(string one,string two,int way);
int TwoStationDistantAndShowRoute(RouteData *point,string one,string two,int &t);
void CheckRoute();
void CheckStation();};
void Route::CheckRoute(){
string rr;point2:
cout << “请输入您需要查询的线路名,然后将会显示该线路的相关信息。n”;
cout << “线路名:”;
cin >> rr;
cout << endl;
RouteData * p = head;
int tf = 0;
while(p!= NULL)
{
if(p->rn == rr)
{
tf = 1;
ShowOneRoute(p);
break;
}
p = p->next;
}
if(tf == 0)
{
cout << “没有找到该线路!请重新输入……n”;
system(“pause”);
goto point2;
}
cout << endl;
system(“pause”);}
void Route::CheckStation(){
string ss;point3:
cout << “请输入您需要查询的站点名,然后将会显示通过该站点的所有线路的相关信息。n”;
cout << “站点名:”;
cin >> ss;
cout << endl;
int tf = 0;
RouteData * p = head;
while(p!=NULL)
{
StationData * q = p->link;
while(q!=NULL)
{
if(q->sn == ss)
{
tf = 1;
ShowOneRoute(p);
cout << endl;
break;
}
q = q->next;
}
p = p->next;
}
if(tf == 0)
{
cout << “没有找到该站点!请重新输入……n”;
system(“pause”);
goto point3;
}
system(“pause”);}
double Route::MinWayMoney(string one,string two,int way){
RouteData * f = head;
RouteData * m = NULL;
int min,min0,mark;
min = Infinity;
while(f!= NULL)
{
min0 = 0;
StationData * p = f->link;
while(p->next!= NULL && p->sn!= one && p->sn!= two)p = p->next;
if(p->next == NULL)min0 = Infinity;
else if(p->sn == one)
{
while(p->sn!= two&&p->next!=NULL)
{
if(way == 1)mark = p->distance;
else if(way == 2)mark = p->time;
min0 = min0 + mark;
p = p->next;
}
if(p->sn!= two)min0 = Infinity;
if(min > min0){min = min0;m = f;}
}
else if(p->sn == two)
{
while(p->sn!= one && p->next!=NULL)
{
if(way == 1)mark = p->distance;
else if(way == 2)mark = p->time;
min0 = min0 + mark;
p = p->next;
}
if(p->sn!= one)min0 = Infinity;
if(min > min0){min = min0;m = f;}
}
f = f->next;
}
double d;
if(min == Infinity)d =(double)min;
else d = m->fee +((float)min)/1000;
return d;}
int Route::TwoStationDistantAndShowRoute(RouteData two,int &t){
RouteData *n = point;
int distant = 0;
StationData *p = n->link;
StationData *start;
int tf = 0;
while(p!= NULL)
{
if(p->sn == one){start = p;break;}
p = p->next;
}
p = start;
while(p!=NULL)
{
if(p->sn == two){tf = 1;break;}
p = p->next;
}
one,string *point,string
p = start;
while(p!= NULL)
{
if(p->sn == two){tf = 2;break;}
p = p->former;
}
if(tf == 1)
{
p = start;
distant = distant + p->distance;
t = t + p->time;
p = p->next;
while(p->sn!= two)
{
cout << “ 经 ” << p->sn << “ 站 ”;
distant = distant + p->distance;
t = t + p->time;
p = p->next;
}
}
else if(tf == 2)
{
p = start;
distant = distant + p->former->distance;
t = t + p->former->time;
p = p->former;
while(p->sn!= two)
{
cout << “ 经 ” << p->sn << “ 站 ”;
distant = distant + p->former->distance;
t = t + p->former->time;
p = p->former;
}
}
return distant;}
double Route::MinWay(string one,string two,int way){
RouteData * f = head;
RouteData * m = NULL;
int min,min0,mark;
min = Infinity;
while(f!= NULL)
{
min0 = 0;
StationData * p = f->link;
while(p->next!= NULL && p->sn!= one && p->sn!= two)p = p->next;
if(p->next == NULL)min0 = Infinity;
else if(p->sn == one)
{
while(p->sn!= two&&p->next!=NULL)
{
if(way == 1)mark = p->distance;
else if(way == 2)mark = p->time;
min0 = min0 + mark;
p = p->next;
}
if(p->sn!= two)min0 = Infinity;
if(min > min0){min = min0;m = f;}
}
else if(p->sn == two)
{
while(p->sn!= one && p->next!=NULL)
{
if(way == 1)mark = p->distance;
else if(way == 2)mark = p->time;
min0 = min0 + mark;
p = p->next;
}
if(p->sn!= one)min0 = Infinity;
if(min > min0){min = min0;m = f;}
}
f = f->next;
}
double d;
if(min == Infinity)d =(double)min;
else d = 1 +((float)min)/1000;
return d;}
RouteData * Route::MinWayReturnRouteData(string one,string two,int way){
RouteData * f = head;
RouteData * m = NULL;
int min,min0,mark;
min = Infinity;
while(f!= NULL)
{
min0 = 0;
StationData * p = f->link;
while(p->next!= NULL && p->sn!= one && p->sn!= two)p = p->next;
if(p->next == NULL)min0 = Infinity;
else if(p->sn == one)
{
while(p->sn!= two&&p->next!=NULL)
{
if(way == 1)mark = p->distance;
else if(way == 2)mark = p->time;
min0 = min0 + mark;
p = p->next;
}
if(p->sn!= two)min0 = Infinity;
if(min > min0){min = min0;m = f;}
}
else if(p->sn == two)
{
while(p->sn!= one && p->next!=NULL)
{
if(way == 1)mark = p->distance;
else if(way == 2)mark = p->time;
min0 = min0 + mark;
p = p->next;
}
if(p->sn!= one)min0 = Infinity;
if(min > min0){min = min0;m = f;}
}
f = f->next;
}
return m;}
RouteData * Route::FindRoute(string one,string two){
RouteData * f = head;
while(f!= NULL)
{
StationData * p = f->link;
while(p->next!= NULL)
{
if(p->sn == one && p->next->sn == two)return f;
else if(p->sn == two && p->next->sn == one)return f;
p = p->next;
}
f = f->next;
} }
RouteData * Route::Find(string s){
RouteData * n = head;
while(n!= NULL)
{
if(n->rn == s)return n;
n = n->next;
}
return n;}
void Route::Dele(){
Showall();
string s;
RouteData * n;
point3:
cout << “请选择您希望删除的线路的名字(不包括前缀地铁或公交):”;
cin >> s;
n = Find(s);
if(n == NULL)
{point4:
cout << “没有找到您所想删除的路线!n1.重新输入n2.离开n选项:”;
int i;
cin >> i;
if(i == 1)goto point3;
else if(i == 2);
else goto point4;
}
else
{
ShowOneRoute(n);
point5:
cout << “确定删除该路线么?删除Y或y,不删除N或nn选项:”;
char ch;
cin >> ch;
if(ch == 'Y' || ch == 'y')
{
RouteData * p = head;
while(p->next!= n)p = p->next;
p->next = n->next;
Save();
}
else if(ch == 'N' || ch == 'n');
else goto point5;
} }
void Route::Showall(){
RouteData * n = head;
while(n!= NULL)
{
ShowOneRoute(n);
cout << “n”;
n = n->next;
} }
void Route::ShowOneRoute(RouteData * p){
if(p->type == 0)cout << “地铁”;
else cout << “公交”;
cout << p->rn << “:n”;
StationData * n = p->link;
while(n!= NULL)
{
if(n->next!= NULL)
cout << n->sn << “--” << “(” << n->time << “min,” << n->distance << “km)--”;
else cout << n->sn;
n = n->next;
}
cout << “nn”;}
void Route::Creat(){
RouteData * p = head;
fstream f(“.data.txt”,ios::in);
string ssss;
f >> ssss;
while(ssss!= “end”)
{
num++;
RouteData * n = new RouteData;
StationData * w = n->link;
n->rn = ssss;
f >> n->type >> n->fee;
if(head == NULL){head = n;p = head;}
else
{
p->next = n;
p = n;
}
string s;
f >> s;
while(s!= “#”)
{
StationData * pp = new StationData;
pp->sn = s;
f >> pp->time >> pp->distance;
if(n->link == NULL){n->link = pp;w = n->link;pp->former = NULL;}
else
{
w->next = pp;
pp->former = w;
w = pp;
}
f >> s;
}
f >> ssss;
} }
void Route::Add(){
RouteData *nr = new RouteData;
cout << “您将要建立一条新的公交线路。请按照指示输入新路线!n”;
cout << “请输入路线的名称:”;
cin >> nr->rn;
point1:
cout << “请输入该线路的类型(0为地铁,1为公交):”;
cin >> nr->type;
if(nr->type == 0)
{
cout << “北京地铁实行统一票价(2元),无需输入票价!n”;
nr->fee = 2;
}
else if(nr->type == 1)
{
cout << “请输入该条线路的票价(元):”;
cin >> nr->fee;
}
else
{
cout << “输入有误,请重新输入!n”;
goto point1;
}
StationData * w = nr->link;
cout << “下面请依照提示,按顺序输入站点信息。n”;
cout << “请输入站点名,如输入完毕请输入“#”: ”;
string s;
cin >> s;
while(s!= “#”)
{
StationData * pp = new StationData;
pp->sn = s;
cout << “请输入与下一站的时间间隔(min):”;
cin >> pp->time;
cout << “请输入与下一站的距离(km):”;
cin >> pp->distance;
if(nr->link == NULL){nr->link = pp;w = nr->link;}
else
{
w->next = pp;
w = pp;
}
cout << “请输入站点名,如输入完毕请输入“#”: ”;
cin >> s;
}
ShowOneRoute(nr);
point2:
cout << “您确定保存么?保存Y或y,不保存N或n。n选项:”;
char ch;
cin >> ch;
if(ch == 'Y' || ch == 'y')
{
RouteData * k = head;
if(head == NULL){head = nr;k = nr;}
else
{
while(k->next!= NULL)k = k->next;
k->next = nr;
}
num++;
}
else if(ch == 'N' || ch == 'y');
else goto point2;}
void Route::Save(){
fstream f(“.data.txt”,ios::out);
if(!f)return;
RouteData * r = head;
while(r!= NULL)
{
StationData * s = r->link;
f << r->rn << “ ” << r->type << “ ” << r->fee << “n”;
while(s!= NULL)
{
f << s->sn << “ ” << s->time << “ ” << s->distance << “ ”;
s = s->next;
}
f << “#n”;
r = r->next;
}
f << “end”;
f.close();}
/******************************图部***********************************/
class lineroute { public:
string sn;
RouteData *r;
lineroute *next;
lineroute()
{
分
r = NULL;
next = NULL;
} };
class Line { public:
string sn;
string rn;
int type;
float fee;
Line *next;
Line()
{
next = NULL;
} };
//边尾节点信息结构体 struct edgeNode {
int no;//尾接点序号
int dtime,dlong;//边权值
RouteData *r;
edgeNode *next;//其下一条邻接边尾节点指针 };
//节点信息结构体 struct vexNode {
string sn;//节点名称
edgeNode *link;//与其相连的边的尾节点链表指针 };
struct Queue {
int no;//队列中节点序号
int cost;//以此为尾节点的边的权值 };
class Graph { public:
//优先队列
Queue priQue[MAX];
//节点数组
vexNode adjlist[MAX];
//指定源点到节点i的最短路径花费
int lowcost[MAX];
//指定源点到节点i路径中,节点i的前驱节点序号
int parent[MAX];
int vexNumber;
Line *s;
void CreatGraph(Route &R);
void keep_min_heap(int &num,const int k);
void heap_insert(int &num,int no,int cost);
Queue heap_extract_min(int &num);
void print_it(Route &R,int v);
void DijkstraDistance(Route &R,string start,string end);
void DijkstraTime(Route &R,string start,string end);
int FindNumber(string sn);
void CreatLine(int v);
void MinMoney(Route &R,string start,string end,int way);
void MinChange(Route &R,string start,string end,int way);};/*****最大值:Infinity*******/
void Graph::MinMoney(Route &R,string start,string end,int way){
int v0,v1,n,w;
n = vexNumber;
v0 = FindNumber(start);
v1 = FindNumber(end);
double shortest[MAX];
double EDGE[n][n];
int final[MAX]={0};
int path[MAX][MAX]={0};
/*****建立邻接矩阵******/
int i,j;
for(i = 0;i < n;i++)
{
for(j = 0;j < n;j++)
{
if(i == j)
{
EDGE[i][j] = Infinity;
continue;
}
string one = adjlist[i].sn;
string two = adjlist[j].sn;
EDGE[i][j] = R.MinWayMoney(one,two,way);
}
}
/******初始化数组******/
int order = 1;
int step = 1;
int min_i;
double min_shortest;
for(i = 0;i < n;i++)
{
shortest[i] = EDGE[v0][i];
for(j = 0;j < n;j++)path[i][j] = 0;
if(EDGE[v0][i] } shortest[v0] = 0; final[v0] = order; path[v0][v0] = step; /*****算法部分*****/ for(i = 1;i < n;i++) { min_shortest = Infinity; for(j = 0;j < n;j++) { if(!final[j] && shortest[j] < min_shortest) { min_i = j; min_shortest = shortest[j]; } } if(!path[min_i][min_i])path[min_i][min_i] = ++step; else step = path[min_i][min_i]; final[min_i] = ++order; for(j = 0;j < n;j++) { if(!final[j] &&(min_shortest + EDGE[min_i][j] < shortest[j])) { shortest[j] = min_shortest + EDGE[min_i][j]; for(int l = 0;l < n;l++)path[j][l] = path[min_i][l]; path[j][j] = path[min_i][min_i] + 1; } } } /********路线生成*******/ lineroute *linep = NULL,*ttt; ttt = linep; int times; for(times = 1;times < n;times++) { for(i = 0;i < n;i++) { if(path[v1][i]==times) { lineroute *newl = new lineroute; newl->sn = adjlist[i].sn; if(ttt == NULL){linep = newl;ttt = linep;} else {ttt->next = newl;ttt = newl;} } } } /*****完善路线节点*****/ ttt = linep; while(ttt->next!= NULL) { ttt->r = R.MinWayReturnRouteData(ttt->sn,ttt->next->sn,way); ttt = ttt->next; } /*****显示路线*****/ float cost = 0;int distance = 0; int t = 0; ttt = linep; cost = cost + ttt->r->fee; cout << “在 ” << ttt->sn << “ 乘坐 ” << ttt->r->rn; distance = distance R.TwoStationDistantAndShowRoute(ttt->r,ttt->sn,ttt->next->sn,t); ttt = ttt->next; while(ttt->next!= NULL) { cost = cost + ttt->r->fee; cout << “至 ” << ttt->sn << endl; cout << “在 ” << ttt->sn << “ 站转乘 ” << ttt->r->rn; distance = distance R.TwoStationDistantAndShowRoute(ttt->r,ttt->sn,ttt->next->sn,t); ttt = ttt->next; + + } cout << “至目的地 ” << ttt->sn << “。n寻径结束!n”; cout << “转乘次数:” <<(int)shortest[v1] << “次。n”; cout << “距离:” << distance << “KM。时间:” << t << “MIN。费用:” << cost << “元。n”;} void Graph::MinChange(Route &R,string start,string end,int way){ int v0,v1,n,w; n = vexNumber; v0 = FindNumber(start); v1 = FindNumber(end); double shortest[MAX]; double EDGE[n][n]; int final[MAX]={0}; int path[MAX][MAX]={0}; /*****建立邻接矩阵******/ int i,j; for(i = 0;i < n;i++) { for(j = 0;j < n;j++) { if(i == j) { EDGE[i][j] = Infinity; continue; } string one = adjlist[i].sn; string two = adjlist[j].sn; EDGE[i][j] = R.MinWay(one,two,way); } } /******初始化数组******/ int order = 1; int step = 1; int min_i; double min_shortest; for(i = 0;i < n;i++) { shortest[i] = EDGE[v0][i]; for(j = 0;j < n;j++)path[i][j] = 0; if(EDGE[v0][i] } shortest[v0] = 0; final[v0] = order; path[v0][v0] = step; /*****算法部分*****/ for(i = 1;i < n;i++) { min_shortest = Infinity; for(j = 0;j < n;j++) { if(!final[j] && shortest[j] < min_shortest) { min_i = j; min_shortest = shortest[j]; } } if(!path[min_i][min_i])path[min_i][min_i] = ++step; else step = path[min_i][min_i]; final[min_i] = ++order; for(j = 0;j < n;j++) { if(!final[j] &&(min_shortest + EDGE[min_i][j] < shortest[j])) { shortest[j] = min_shortest + EDGE[min_i][j]; for(int l = 0;l < n;l++)path[j][l] = path[min_i][l]; path[j][j] = path[min_i][min_i] + 1; } } } /********路线生成*******/ lineroute *linep = NULL,*ttt; ttt = linep; int times; for(times = 1;times < n;times++) { for(i = 0;i < n;i++) { if(path[v1][i]==times) { lineroute *newl = new lineroute; newl->sn = adjlist[i].sn; if(ttt == NULL){linep = newl;ttt = linep;} else {ttt->next = newl;ttt = newl;} } } } /*****完善路线节点*****/ ttt = linep; while(ttt->next!= NULL) { ttt->r = R.MinWayReturnRouteData(ttt->sn,ttt->next->sn,way); ttt = ttt->next; } /*****显示路线*****/ float cost = 0;int distance = 0; int t = 0; ttt = linep; cost = cost + ttt->r->fee; cout << “在 ” << ttt->sn << “ 乘坐 ” << ttt->r->rn; distance = distance + R.TwoStationDistantAndShowRoute(ttt->r,ttt->sn,ttt->next->sn,t); ttt = ttt->next; while(ttt->next!= NULL) { cost = cost + ttt->r->fee; cout << “至 ” << ttt->sn << endl; cout << “在 ” << ttt->sn << “ 站转乘 ” << ttt->r->rn; distance = distance + R.TwoStationDistantAndShowRoute(ttt->r,ttt->sn,ttt->next->sn,t); ttt = ttt->next; } cout << “至目的地 ” << ttt->sn << “。n寻径结束!n”; cout << “转乘次数:” <<(int)shortest[v1] << “次。n”; cout << “距离:” << distance << “KM。时间:” << t << “MIN。费用:” << cost << “元。n”;} void Graph::CreatGraph(Route &R){ //建立节点信息 RouteData *rp = R.head; int n = 0; while(rp!= NULL) { StationData *sp = rp->link; while(sp!= NULL) { int i,tf = 0; for(i = 0;i < n;i++) { if(adjlist[i].sn == sp->sn) { tf = 1; sp->number = i; break; } } if(tf == 0) { adjlist[n].sn = sp->sn; adjlist[n].link = NULL; lowcost[n] = Infinity; parent[n] = n; sp->number = n; n++; } sp = sp->next; } rp = rp->next; } vexNumber = n; //建立边 edgeNode *ep; rp = R.head; while(rp!= NULL) { StationData *sp = rp->link; while(sp!= NULL) { int v1,v2; v1 = sp->number; if(sp->former!= NULL) { v2 = sp->former->number; ep = new edgeNode; ep->no = v2; ep->dlong = sp->former->distance; ep->dtime = sp->former->time; ep->r = rp; ep->next = adjlist[v1].link; adjlist[v1].link = ep; } if(sp->next!= NULL) { v2 = sp->next->number; ep = new edgeNode; ep->no = v2; ep->dlong = sp->distance; ep->dtime = sp->time; ep->r = rp; ep->next = adjlist[v1].link; adjlist[v1].link = ep; } sp = sp->next; } rp = rp->next; } } void Graph::keep_min_heap(int &num,const int k){ int l = 2*k; int r = 2*k + 1; int smallest = k; if(l<=num&&priQue[l].cost if(r<=num&&priQue[r].cost if(smallest!= k) { Queue temp = priQue[smallest]; priQue[smallest] = priQue[k]; priQue[k] = temp; keep_min_heap(num,smallest); } } void Graph::heap_insert(int &num,int no,int cost){ num +=1; priQue[num].no = no; priQue[num].cost = cost; int i = num; while(i>1&&priQue[i/2].cost>priQue[i].cost) { Queue temp = priQue[i]; priQue[i] = priQue[i/2]; priQue[i/2] = temp; i = i/2; } } Queue Graph::heap_extract_min(int &num){ if(num<1)return priQue[0]; Queue min = priQue[1]; priQue[1] = priQue[num]; num-=1; keep_min_heap(num,1); return min;} void Graph::CreatLine(int v){ if(parent[v] == v) { Line *p = new Line; p->sn = adjlist[v].sn; p->next = s; s = p; } else { CreatLine(parent[v]); Line *p = new Line; p->sn = adjlist[v].sn; p->next = s; s = p; } } void Graph::print_it(Route &R,int v){ s = NULL; CreatLine(v); Line *p = s; Line *n = NULL; while(p!= NULL) { Line *ppp = new Line; *ppp = *p; ppp->next = n; n = ppp; p = p->next; } p = n; while(p->next!= NULL) { RouteData * routedata = R.FindRoute(p->sn,p->next->sn); p->fee = routedata->fee; p->rn = routedata->rn; p->type = routedata->type; p=p->next; } int change = 0; float money = 0; p = n; cout << “在 ” << p->sn << “ 站点乘坐 ” << p->rn; money = money + p->fee; while(p->next->next!= NULL) { if(p->rn == p->next->rn) { p = p->next; cout << “经 ” << p->sn << “ 站 ”; } else if(p->rn!= p->next->rn) { int t1 = p->type; int t2 = p->next->type; p = p->next; cout << “ 至 ” << p->sn << “ 站n在” << p->sn << “ 站换乘 ” << p->rn << “ ”; money = money + p->fee; change++; } } p = p->next; cout << “至目的地 ” << p->sn << “。寻径结束!nn”; cout << “总费用:” << money << “元。换乘次数:” << change << “次。n”;} int Graph::FindNumber(string sn){ int i,number; for(i = 0;i < vexNumber;i++) { if(adjlist[i].sn == sn) { number = i; break; } } return number;} void Graph::DijkstraDistance(Route &R,string start,string end){ int v0,v1; v0 = FindNumber(start); v1 = FindNumber(end); int v =v0; lowcost[v0] = 0; Queue queue; int i,num = 0; for(i=0;i { edgeNode *p = adjlist[v0].link; while(p!= NULL) { if(lowcost[v0] + p->dlong < lowcost[p->no]) { lowcost[p->no] = lowcost[v0] + p->dlong; parent[p->no] = v0; heap_insert(num,p->no,lowcost[p->no]); } p = p->next; } queue = heap_extract_min(num); v0 = queue.no; } //mincost = 0; cout<<“从 ”<< start <<“ 开始到 ” << end << “ 的距离最短路径为:”< print_it(R,v1); cout<<“距离为:”< void Graph::DijkstraTime(Route &R,string start,string end){ int v0,v1; v0 = FindNumber(start); v1 = FindNumber(end); int v =v0; lowcost[v0] = 0; Queue queue; int i,num = 0; for(i=0;i { edgeNode *p = adjlist[v0].link; while(p!= NULL) { if(lowcost[v0] + p->dtime < lowcost[p->no]) { lowcost[p->no] = lowcost[v0] + p->dtime; parent[p->no] = v0; heap_insert(num,p->no,lowcost[p->no]); } p = p->next; } queue = heap_extract_min(num); v0 = queue.no; } //mincost = 0; cout<<“从 ”<< start <<“ 开始到 ” << end << “ 的时间最短路径为:”< print_it(R,v1); cout<<“时间为:”< /******************************主函数***********************************/ void Manager(Route &R){ string c1; while(1) { system(“cls”); cout << “************************************************n”; cout << “ 管理员n”; cout << “************************************************n”; cout << “**** 请选择选项对线路进行操作 ****n”; cout << “**** 1.显示全部线路 ****n”; cout << “**** 2.建立新线路 ****n”; cout << “**** 3.删除线路 ****n”; cout << “**** 4.查询一条线路 ****n”; cout << “**** 5.查询站点 ****n”; cout << “**** 6.保存目前线路 ****n”; cout << “**** 7.返回上一级 ****n”; cout << “************************************************n”; cout << “ 选项:”; cin >> c1; system(“cls”); if(c1 == “1”) { R.Showall(); system(“pause”); system(“cls”); } else if(c1 == “2”) { R.Add(); system(“pause”); } else if(c1 == “3”) { R.Dele(); system(“pause”); } else if(c1 == “4”) { R.CheckRoute(); } else if(c1 == “5”) { R.CheckStation(); } else if(c1 == “6”) { R.Save(); cout << “已保存!!n”; system(“pause”); } else if(c1 == “7”) { break; } else { cout << “您没有选择任何一个选项!n”; system(“pause”); } } system(“cls”);} void User(Route &R){ string c1,c2; while(1) { system(“cls”); cout << “************************************************n”; cout << “ 欢迎使用北京公交路线查询系统n”; cout << “************************************************n”; cout << “**** 请选择您需要的服务 ****n”; cout << “**** 1.查询一条线路 ****n”; cout << “**** 2.查询站点 ****n”; cout << “**** 3.搜索路线 ****n”; cout << “**** 4.返回上一级 ****n”; cout << “************************************************n”; cout << “ 选项:”; cin >> c1; system(“cls”); if(c1 == “1”) { R.CheckRoute(); } else if(c1 == “2”) { R.CheckStation(); } else if(c1 == “3”) { cout << “nn”; Graph G; G.CreatGraph(R); string start,end; point4: cout << “请输入起始站点名称:”; cin >> start; cout << “请输入目的地站点名称:”; cin >> end; if(start == end) { cout << “起始站与目的地不能相同!!n”; system(“pause”); goto point4; } cout << “nn”; cout << “************************************************n”; cout << “**** 请选择路线查询方式 ****n”; cout << “**** 1.最短距离 ****n”; cout << “**** 2.最短时间 ****n”; cout << “**** 3.最少换乘 ****n”; cout << “**** 4.最少花费 ****n”; cout << “************************************************n”; cout << “ 选项:”; cin >> c2; if(c2 == “1”) { cout << “nn************************************************n”; G.DijkstraDistance(R,start,end); cout << “************************************************n”; system(“pause”); system(“cls”); } else if(c2 == “2”) { cout << “nn************************************************n”; G.DijkstraTime(R,start,end); cout << “************************************************n”; system(“pause”); system(“cls”); } else if(c2 == “3”) { cout << “************************************************n”; cout << “**** 请选择最少换乘模式 ****n”; cout << “**** 1.最短距离 ****n”; cout << “**** 2.最短时间 ****n”; cout << “************************************************n”; cout << “ 选项:”; int whatever; cin >> whatever; cout << “nn************************************************n”; G.MinChange(R,start,end,whatever); cout << “************************************************n”; system(“pause”); system(“cls”); } else if(c2 == “4”) { cout << “************************************************n”; cout << “**** 请选择最少花费模式 ****n”; cout << “**** 1.最短距离 ****n”; cout << “**** 2.最短时间 ****n”; cout << “************************************************n”; cout << “ 选项:”; int whatever; cin >> whatever; cout << “nn************************************************n”; G.MinMoney(R,start,end,whatever); cout << “************************************************n”; system(“pause”); system(“cls”); } } else if(c1 == “4”)break; else { cout << “您没有选择任何一个选项!n”; system(“pause”); } } system(“cls”);} int main(){ string passwd; string c; Route R; int i; R.Creat(); while(1) { system(“cls”); cout << “************************************************n”; cout << “ 欢迎使用北京公交路线查询系统n”; cout << “************************************************n”; cout << “**** 请选择您的身份 ****n”; cout << “**** 1.管理员 ****n”; cout << “**** 2.普通用户 ****n”; cout << “************************************************n”; cout << “ 选项:”; cin >> c; if(c == “1”) { cout << “nn”; cout << “请输入管理员密码:”; passwd = password(); if(passwd!= PASSWORD) { cout << “密码错误,返回主界面……n”; system(“pause”); } else { system(“cls”); Manager(R); } } else if(c == “2”) { system(“cls”); User(R); } else { cout << “您没有选择任何一个选项!n”; system(“pause”); } } return 0;} string password() //密码 { string psw;//用于存密码的字符串; int length; char temp_c; while(1) { temp_c=getch();//输入一个字符 if(temp_c!=char(13))//判断该字符是否为回车,如果是则退出while { switch(temp_c) { case 8: if(length!=0) { cout<<“b b”; psw=psw.substr(0,length-1); length--; } else; break; default: cout<<“*”; psw+=temp_c;//连成字符串; length++; break; } } else break; } return psw;} 《管理信息系统》作业清单 一、图书出纳管理系统数据库设计 今有为学校图书馆出纳台设计一个自动化管理系统。该系统的功能为:读者可以由书名(或书名的一部分)、作者名查馆藏书号:出纳台可由馆藏书号查书的去向;读者借书时,登录有关信息;读者还书时,检查是否有逾期及其他违规行为,登录有关信息。 请根据上述信息,设计该系统的数据库。 分析:要完成这些信息的存储和使用,至少需要3个表:读者信息表、书籍信息表、借阅表同时考虑到资料的利用和备份,引入 队的总分、名次。2)学籍管理系统 根据本校具体管理办法,开发学籍管理系统。该系统功能为:根据任课教师提供的成绩单,登录学习成绩:根据奖学金评定办法,提出总成绩和单科奖学金获得者名单:根据升、留级条件,提供留级、退学、补考学生名单;打印学生成绩单(补考者注明补考时间、地点),记录学生在校期间所有学习成绩、升留降级、休复学、奖励及处分等情况。3)图书出纳管理系统 为学校图书馆出纳台设计一个自动化管理系统。该系统的功能为:读者可以由书名(或书名的一部分)、作者名查馆藏书号:出纳台可由馆藏书号查书的去向;读者借书时,登录有关信息;读者还书时,检查是否有逾期及其他违规行为,登录有关信息。4)学术会议论文管理系统 系统的功能为:收到应征论文后进行分类编号登录,审稿前打印分类目录和审稿单;审稿后登录审稿结论(录用、不录用、修改后录用),并将结论通知作者(修改后录用的,附修改建议);收到作者修改稿和版面费后进行登记:打印论文集目录(收到版面费的录用论文列入论文集)。 5)宾馆管理系统 为中型宾馆设计一个宾客消费管理系统。该系统具有下列功能:客房管理、客房预定和变更、查询、结算(住宿、餐饮、购物、通信、娱乐等各种费用一次结清)。6)住宅小区物业管理信息系统 物业公司负责住宅小区房屋、设施、设备、环境卫生、公共秩序、保安、绿化等管理工作。由住户缴纳费用和出租房屋费用来维持各项费用支出。 “邯郸公交查询系统”可行性研究报告 1.引言。 随着我国城市化的进程的加快,经济的高速发展,所带来的是公路网的快速发展,城市化对提高人们的生活水平起到了积极的作用,但是高速增长的公路网与公交管理系统之间产生了矛盾,因此怎样提高公交查询系统的利用效率方便人们出行,提高公路网的使用效率,成为了未来政府部门必须考虑的一个问题。 1.1开发目的。 本报告是对开发“邯郸公交查询系统”进行可行性研究与分析的综合性报告。目的在与通过乘客的出行提供准确的、及时的、优化的公交服务。对于乘客的出行有系统自动生成最优的规划,为乘客节省时间与费用,同时也优化了城市路网的使用效率。 1.2背景 该单位图书馆现为人工管理,效率低,易比错,手续繁琐,而且耗费大量的人力。图书馆希望设计一个图书管理系统,用于管理读者的登记,图书的购入、借出、归还以及注销等。并且方便管理人员还查阅某位读者、某本图书的借阅情况。并可加快对当前借阅情况统计的效率,以全面掌握图书的流通情况、提高工作效率、加快信息反馈,为读者提供满意的借阅环境。 1.3参考资料 用易图书馆管理系统。 2.现行组织系统概况 2.1 组织目标和战略 图书馆的目标是以优质的服务、快捷的借阅方式、大量优质的、最新的图书,向本市读者提供优质的借阅环境,使本图书馆能够顺利发展逐步壮大。具体分解为: 1)更加方便读者借阅,减少读者借书、还书时间20%,提高读者满意度。 2)近三年每年增加25%的新图书品种。 3)能够快速统计和掌握本市读者的借书要求,对借阅次数较多的图书及时增加馆藏册数。对读者需要而还未购入的,能够即时统计购入。 4)及时发现破损书籍,及时补充。 5)快速掌握国内最新出版的各类图书。 6)统计借书、还书、馆存与盘点信息效率加快50%。 7)加大图书馆面积,增加馆藏图书数量。 8)每年增加30%购书资金,增加图书品种。 9)修改库存管理办法,提高效率,方便管理。 10)建立图书馆管理系统,全面提高工作效率与管理水平。 2.2 业务概况 该图书馆为中等规模图书馆。读者覆盖面占全市20%。书馆设有采购部、图书管理部、读者管理部、人力资源部四个部门。采购部负责编制图书订购计划、图书订购、图书征订等项业务。图书管理部负责图书入库、出库、盘库、图书的报损和统计过期未还罚款等项工作。读者管理部部负新增读者、读者注销和读者信息的统计等工作。人力资源部负责书书店员工的相关事务管理工作。 2.3 存在的主要问题 长期以来,该图书馆业务一直采用手工管理。图书采购、管理、借还和统计的手工信息管理存在工作量大、易出错、手续繁琐、工作效率低、耗费人员多,图书的馆存、读者反馈等信息不能及时提供等问题。 2.4 条件、假定和限制 由于图书管内部各部门都需要使用该系统对相关业务进行管理,故需要用B/S模式进行开发。部分人没有计算机基础,所以要求系统要简单易用。要求软件最短寿命为10年。 2.5 评价的尺度 本次可行性分析将从经济可行性、技术可行性、社会可行性三方面进行分析。 3.拟建立的图书馆管理系统 3.1 简要说明 为了提高该图书馆的工作效率和管理水平,为读者提供满意的借阅环境,书店计划投入一定资金建立图书馆管理系统,以全面管理图书业务。图书馆领导以及工作人员对所建立的管理系统有以下基本需求: 1)对图书馆管理业务提供全面管理的书店信息系统。要求该系统可以完成读者登记、购入新书、读者借书、读者还书、图书注销等功能。 2)对所有读者提供全面管理与统计。可以完成读者登记、购入新书、读者借书、读者还书、图书注销等功能。读者登记时要为读者编制读者卡片,包括读者的具体信息(读者编号、姓名、学院、专业、年龄等),写入读者目录文件中。 3)对图书的借、还、罚款统计、报损、盘点、统计、借阅情况提供全面管理与统计。读者借书时,先检查该读者是否是有效的读者,若无效则拒绝借书,另外检查该读者所借同书是否超过最大限制数(根据情况自定)以及有无未归还的过期图书,否则拒绝借书。查找该图书是否还有,如果有则可以借出,登记图书分类号、读者号和借阅日期等;读者还书时,根据流水号,从借书文件中读出有关记录,查明应还书日期,如果图书过期,则处以罚款,并打印罚款单;在某些情况下,需要对图书馆的图书进行清理工作,对无价值的、过时的和损坏的图书要能够及时注销。 4)对进书、出版社、图书商提供全面管理。购入新书时要为该书编制图书卡片,包括分类日录号、流水号(唯一)、书名、作者、内容摘要、价格和购书日期等信息,写入图书目录文件中。 5)系统能够方便的查询到需要的信息并能够打印报表。咨询要求分为查询某位读者、某种图书和全局图书3种情况;可以打印读者和图书情况统汁表。 6)对工作人员信息提供全方面的管理。 7)管理系统应当足够稳定,能够长时间运行并且保证数据不丢失。 3.2 初步建设计划 项目计划于2008年9月开工建设。开发期1.5个月,系统计划于2008年 10月31日正式投入运行。 3.3 对图书馆的影响与意义 本管理系统的开发能够提高工作效率、扩大服务范围、加快图书借还效率、减少各项事务手续、为读者创造良好的借阅环境、及时获取信息、减少决策失误、减少工作量、提高统计能力、充分掌握图书馆现状。 4.经济可行性分析 4.1支出 1)系统开发费用 (1)人员费用:开发工作量约需5个人月工作量。每人月工资约为2000元,累计1万元。 (2)硬件设备费用:估计开发该系统须购买硬件、外部设备(高性能计算机1台、普通计算机5台、打印机3台、条形码扫描仪6台、网络设备和布线、不间断电源1台、工作台8台),花费5.18万元左右。 (3)软件费用:开发过程中所需软件费用为2.1万(WINDOWS SERVER 2008、SQL SERVER、JAVA环境ROSE建模工具)。 (4)耗材费用:0.8万 (5)咨询和评审费:1.2万。 (6)调研和差旅费:1.0万。 (7)不可预见费:按开发总费用的15%计算。系统开发总费用约为:12.97万元。 2)系统运行费用 开发完成后维护费用平均每年约1500元,开发成功后,原有的3名管理人员可以减少为两名,每人月工资1000元。按使用10年计算25.5万元。开发总费用为38.47万元,平均3.85万元/年。 4.2 收益 1)提高工作效率,减少工作人员:本管理系统累计可以综合提高工作效率达50%。可以减少现有15%的工作人员,书店现有人员按30人计算,可减少4.5人。每人月平均工资按1500元计算,节约人员工资0.15×12×4.5=8.1万元/年。 2)提高服务能力,增加图书馆收入:本系统的建设可以加快服务速度并能及时发现受欢迎图书与损坏图书的信息。提高订书的合理性和准确率,提高读者满意度,增加读者数量。收入假定在原有基础上可以增加10%的业务量。图书馆每年的总利润按300万计算,可以增加收入30万/年。 5.技术可行性分析 1)管理系统开发方法:在开发小组中有开发软件系统的经验并有强大的技术支持做后盾。在本图书馆管理系统开发方法上不存在任何问题。 2)网络和通信技术:本开发小组有使用TOMCAT和IIS做服务器的经验。 3)B/S结构规划和设计技术:开发小组有B/S开发经验。 4)数据库技术:开发小组有应用数据库开发经验。 5)java开发技术:开发小组能够使用java编程。 综上,本系统开发技术是可行的。 6.社会可行性分析 目前已有很多成功开发图书馆管理系统的先例,社会需要图书馆管理的现代化和信息化。图书馆管理系统开发和运行与国家的政策法规不存在任何冲突和抵触之处。另外,图书馆管理系统所采用的操作和工作方式符合工作人员和读者的日常习惯,而且操作方便灵活,便于学习。具有可行性。 7.可行性研究结论 通过经济、技术和社会等方面的可行性分析,可以确定本系统的开发完全必要,而且是可行的,可以立项开发。 实习(调研)报告 一、课题来源及意义 随着改革开放的迅猛展开,中国的交通方式变得越来越完善,公交车几乎可以遍及大城市的每一个角落,在繁华忙碌的大城市里各式各样的公交车成为了其中一道亮丽的风景,错综复杂的公交车线路网让人们的出行,上下班获得了巨大的方便和实惠。城市公交是专门服务于市民出行的客运企业,它是城市社会和经济活动的重要组成部分。伴随着国民经济和城市建设的快速发展,城市经济的繁荣,人口的增加,城市必须解决好人们出行的需求。城市公交直接关系着城市的经济发展和居民生活,对城市经济具有全局性、先导性的影响,城市公交以其方便、快捷、容量大而成为城市交通的主体。 复杂的交通也给人们的出行带来难题,我国城市公交信息系统的发展处于一个较落后的水平,广大乘客可以获得信息的方式很少, 随着公交系统的庞大,人们很难得到准确的公交信息,这样给一些人的出行就带来了不便。随着社会的不断发展,互联网已经被千千万万的家庭所接收,网络替人们解决了如何找到快速、便捷的道路通往目的地这个问题。网络的生活化使得很多的事情无需远行,就能够很快的解决,生活上的信息很多都能从网络中获得。海量信息是现代网络的特点,在海量的公交线路和公交站点中提取出想要的公交车信息就需要一个公交车信息管理系统。通过这样的系统,可以使人们方便、快捷的查询到所需要的交通信息,从而节省时间,提高效率。 公交信息管理系统作为城市公众信息服务平台的一部分,它的建立不仅为广大公众的出行提供所需的公交信息,而且对于缓解城市的交通压力和降低城市的环境污染都有很大意义。近年来,由于计算机编程技术和Internet技术的发展,国内外各大城市纷纷推出了基于Internet的城市公交查询系统。这些查询系统的推出为人们获得所需的公交信息提供了方便。但鉴于当时技术和开发人员自身能力的限制,这些公交查询系统都或多或少地存在着一些问题。 二、国外的发展状况 信息技术已经成为当代最先进的技术手段,信息技术的渗透与融合,将在提升国民经济各部门的产业技术水平中发挥核心作用。国外发达国家经验表明,虽然以信息化推动工业化将增加30%的投资,但可以提高产品档次和质量、改善生产环境、降低能源和原材料消耗,从而增加85%的经济效益。 目前,国内外公交信息管理即公交查询系统都发展到了一个比较成熟的阶段,无论是从理论上还是从技术上都比较成熟。发达国家对城市公交查询的研究比较早,技术发展的已经相当成熟。1962年,加拿大地理信息系统(CGIS)在加拿大问世,经过十年的努力,CGIS成为世界上第一个可以运行的地理信息系统。20实际90年代进入GIS时代,并且由于数字系统信息产品和地理信息产业的广泛普及,致使地理信息系统发展成一个 独立的产业。 国外公交信息管理系统更是早已经实现了智能化、信息化、社会化。据相关资料了解,国外的公交信息管理系统现在已经将GIS、GPS、RS技术集合到公交查询系统中。GIS技术:即Geography Infomation System,地理信息系统。简单说就是将地图与数据库相结合。GPS技术:即Globe Position System,全球定位系统,通过每3颗卫星确定一个点的经纬度坐标,使用WGS_1984坐标系。RS技术:Remote Sensing,遥感。通过卫星或飞机接收地面反射波普,判断地面情况的技术。 许多国际化大都市都非常重视公交信息服务系统的管理和发展,例如美国的洛杉矶交通委员会建立了企业级的公交地理信息系统,加拿大的卡尔加市也成立了企业级的GIS系统,以用于公共交通的规划、运营、管理和效益评定。在1996年,美国联邦公共管理局发布了“适用于公共交通的地理信息系统国家规范”,通过标准化的地理信息数据,促进GIS技术在公共交通中的应用。 在发达国家,公交查询系统发展的目的是提供准确、可靠、及时的公交信息服务,以吸引更多的旅行者使用城市公交查询系统这一工具,从而促进城市公共交通服务的发展、完善。发达国家的公交查询系统的研究、简历、测试的大部分费用由政府部门负责承担,而用户和国家公交企业是该系统的最终受益者和使用者。 三、国内的发展状况 我国城市公交信息系统的发展起步较晚,城市公共交通系统对于信息化的管理系统应用不够完善,公交系统的研究和开发还需要一个漫长的过程。普遍存在的现象是:许多乘客可以获得信息的方式以及信息量较少,且不能保证查询信息的可靠性和完整性,也没有负责发布信息和管理信息的专门机构。随着互联网技术的发展,许多网站陆续地推出公交查询系统,现阶段国内的公交信息管理系统也结合了很多技术,比如:基于ASP.NET+XML的公交查询系统,基于J2EE的公交查询系统,基于WebGIS公交查询系统。国内公交查询系统也正在向将GIS、GPS、RS技术相结合的方向发展。与此同时,各种手机版本的公交查询软件也良莠不齐。但是这些城市公交查询系统也存在一些问题,归结起来主要有以下几个方面: (1)公交查询的模式单调,查询范围小。 (2)系统配备的地图功能不够完善,显示方式不够直观。 (3)数据库的设计不够合理,公交数据信息不易扩充。 (4)查询效率不高,程序臃肿,运行速率低下。 (5)系统管理员和用户相分离,无法进行信息交流。 虽然现在国内公交查询系统技术上已经发展到了一定阶段,但是管理上还缺乏一定的规范,还有待进一步的规范和完善。 四、本课题的研究目标 应广大城市市民查询公交信息的需求,公交公司对城市公交线路等信息的管理需求,开发一套公交信息管理系统。用户可以登录本系统进行公交线路的查询、车次的查询,近期的公交新闻、各公交线路的线路图等相关信息的浏览,而管理者可以设置新的线路信息及时地展示给用户,对变更的公交线路进行修改,浏览用户的投诉信息等。主要针对用户和管理员,用户在此系统可以对所要了解的公交线路进行查询,对公交服务中存在的问题提出建议,对服务中的不合理行为进行投诉,参与用户之间的讨论等。而管理员主要负责后台的管理,管理员不需要运用传统的方式进行纷繁复杂的操作,使用本系统,管理员登录后可以对线路信息、用户信息、留言信息进行添加、删除、查询和修改功能。此系统将以简洁、易懂的界面呈现给用户,目标能够使每一个用户易于操作,减少不必要的业务逻辑,提高该系统的利用率和运行、维护效率。 五、研究内容 在这样的背景下,提出了计算机管理的公交信息管理系统,辅助公交车运营公司对公交信息进行管理,实现公交车、公交线路和用户管理科学化,更合理的利用资源。包括对公交线路信息管理、用户信息管理、公交新闻信息管理和用户反馈信息管理等功能。在针对数据操作方面,主要通过存储过程的方式实现数据的添加、删除和查询等操作。通过系统测试,解决了公交车辆管理系统主要问题。 公交信息管理系统是一个协助公交车运营商对公交线路进行全面的管理,也是一个方便广大市民出行路线选择的重要提示工具。本系统采用B/S结构下的MVC设计模式,S2SH开源框架。MVC英文即Model-View-Controller,即把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分成三个层——模型层、视图层、控制层。 如何准确完善的构架模型,并准确的调用控制器,最后展现给用户清晰可读的界面是本次研究的内容。 六、研究方法 运用学过的知识(网页开发、JSP技术、JAVA编程技术、J2EE框架技术、Web技术和数据库技术),按照软件工程开发流程来实施本课题,理论联系实际,多动手操作,采用系统模块化方式完成本课题。 七、己具备的实验条件 硬件开发环境: CPU:Intel Core2 T6600 2.2GHz 内存:2GBDDRⅡ 硬盘:320G 软件开发环境: 操作系统:Microsoft Windows Vista HomeBasic 开发工具包:Struts2,Spring,Hibernate等。 开发工具:MyEclipse 6.0, MySQL 5.1 ,Adobe Dreamweaver, EditPlus 2,IE8 等。 服务器:Tomcat 6.0或更高版本 数据库:MySQL 5.1 浏览器:Microsoft Internet Explorer 8.0或更高版本。 八、进度安排 第一周:实习调研,查阅课题相关外文资料,查找相关文献和所需技术要求等。 第二周:了解行业状况、查阅文献资料,阅读资料,撰写调研报告安排设计进度,填写 设计进度表。继续查阅参考文献资料,深入研究设计的流程。 第三周:翻译10000字符以上的外文资料,准备资料,学习所采用的相关技术。主要是 学习如何实现企业信息发布系统,参考网上其他优秀案例等。 第四周:提交毕业论文提纲,呈交外文文献翻译资料。对整个系统进行需求分析和概要 设计。 第五周:复习“数据库设计”理论,并开始根据信息发布系统概要设计创建数据库,准 备数据等。 第六周:模块设计并集成,基本框架完成(使用三层架构),确定使用技术细节。完成详细设计内容。 第七周:完成后台数据库的设计,完成部分论文。代码设计完成,初步实现,并基于现 阶段的完成情况对系统和数据做出修改和细化。 第八周:完成前台界面的设计,完成部分论文。前台功能和视觉化平台的实现,美化界 面,基本系统整体功能实现。代码完成。调试结束。 第九周:进行程序测试,继续编写毕业设计论文。主要是设计者本人针对系统进行测试,第一阶段进行单元测试。(同时基于代码和文档进行测试)。 第十周:继续进行程序测试,继续编写毕业设计论文。单元测试阶段结束,请其他同学 帮助进行第二阶段系统集成测试,主要是黑盒测试,针对设计文档上功能的实现进行测试。 第十一周:整理资料、文档、图表等,修改毕业设计论文。最后阶段进行品质向上,性 能提升的测试和最终的页面美化工作。 第十二周:完成毕业设计论文,并进行2次以上的查看和修改,交给导师验收并最终定 稿,打印,按要求装订。 第十三周:软件验收和准备毕业设计答辩。实现阶段的全部文献的整理,针对核心技术的深度发掘和数据的二次采集,准备应对论文答辩,争取优秀。 第十四周:毕业设计答辩及成绩评定 九、参考文献 [1] 耿祥义,张跃平.JSP实用教程[M].北京:清华大学出版社,2003.[2] 耿祥义,张跃平.JAVA 2实用教程(第三版).北京:清华大学出版社,2006.[3] 孟凡荣 等编著.数据库原理与应用.北京:清华大学出版社,2010.[4] 吴镝.J2EE应用开发实例精解(WAS+RAD).北京:清华大学出版社,2011.[5] 赵慧敏,杨鑫华,邓武.DB2数据库实践基础教程.北京:清华大学出版社,2010.[6] 施穆勒著,李虎,赵龙刚译.UML基础、案例与应用(第三版).北京:人民邮电出版 社,2004.[7] 沙赫著,邓迎春等译.软件工程:面向对象和传统的方法.机械工业出版社,2007.[8] 高英,张晓东.MySQL数据库应用系统与实例.人民邮电出版社,2012.[9] 王进.实时公交查询系统的优化设计与实现.北京邮电大学,2013.[10] 徐兵,谢仕义.基于站点优先级的公交换乘算法实现.计算机时代期刊,2005.07 期.[11] 罗超理,李万红.管理信息系统原理与应用[M]北京:清华大学出版社,2012.[12] 张少敏,王保义.基于Web的管理信息系统方案及安全性[J].华北电力大学报,2011.[13] Jame Gosling,Bill Joy,Guy L.Steele Jr,Gilad Bracha.JAVA语言规范[M] 北京:机械工业出版社,2006,165-173. 1.考核方式:考查 实习日记 实习期间,学生每天以日记形式,记录施工情况、个人心得、参观、报告内容等,为实习结束时书写实习报告积累材料。 2、实习报告 实习结束时,每个学生必须写出实习报告,主要内容是实习中的业务收获和技术要求的资料以及对实习的建议,报告用图文表达,力求科学系统、简捷工整。 实习报告大致内容可分以下几个部分: (1)实习工地概况、包括工程名称、规模、总平面布置等; (2)建筑方面:主要平、立、剖面,若干细部构造,图中主要说明等; (3)结构方面:基础地质状况,基础形式及布置等,上部结构形式及布置,主要结构构件配筋情况,主要施工图有哪些说明; (4)施工方面:施工总平面及其说明,工期、施工进度计划及说明等。 指导教师和实习单位指导人员,根据学生实习日记、报告或专题总结、分析和解决实际问题的能力等实习期间的表现进行综合评分,最后结合实习答辩给出最终评分。 2.成绩评定: 计分制:五级分制 通过参与设计院、建筑公司、房(地)产开发公司等单位的具体工作,收集有关 设计资料。具体内容如下: 1、建筑部分 了解建筑单体的总平面图及其定位的一般规定;熟悉建筑单体的平、立、剖面图及一些节点详图的设计,主立图设计的一些技巧;了解楼梯(包括消防楼梯)、电梯井道、水箱等的平面位置的布置方法;熟悉楼地面、屋面及内外墙面装饰工程的一般做法,建筑设计(总)说明的写法格式等。 2、结构部分 熟悉并掌握一般钢筋混凝土框架结构、排架结构、框架一剪力墙结构的电算方法及框架的手算方法;熟悉这些结构的构件钢筋构造的措施,节点详图的绘制方法;熟悉结构在特(给)定地质条件下桩基础的设计方法及施工图的绘制方法。 3、施工部分 熟悉工程预算的程序和决算依据,施工平面图的设计、进度表的编制等。 4、实习纪律 实习期间,学生应在老师和工地指导人员的安排指导下,充分收集建筑设计、结构设计、施工设计三个阶段的资料,并进行消化和整理,为 设计及以后上岗打下扎实的基础。学生抵达实习基地后,先利用一天时间熟悉情况,包括安全知识教育、人员组织机构、工程情况、设计图纸、施工组织、施工日记、混凝土施工日记、分部分项目工程验收记录等,然后根据实习总计划拟订自己的计划。实习结束前,二天时间安排学生整理实习报告,并由实习指导人员根据该生的实习表现写出评语,连同学生的实习日记、实习报告交给实习指导教师。 设计院实习报告 2012年11月开始,学校开始为期三个月的工程技术实习,我深知我们这个专业,实践扮演着一个不可或缺的角色。因此,我非常重视这次实习的机会,尽可能的把大学所学的专业知识应用到实践环节中。光有理论是不够的,必须通过理论联系实践,才能更深刻的理解运用知识,掌握知识,为以后的工作生活打下良好的基础。很幸运我能够在汉嘉设计集团实习,汉嘉设计集团是一家大型设计集团,公司业务遍布全国各地,在公司所学到的知识和技能对我工作有着重要作用。 实习周记一 第一次到设计院,师傅热情的接待了我,把我叫到会议室,结合学校教学大纲和指导教师的安排给我安排设计院的实习任务。 一 练习使用AutoCAD 随着计算机技术的发展,计算机已经被应用到各个领域,建筑设计行业也不例外。因此,必须要学好计算机绘图。师傅也叫我先从CAD开始练起。大学课程有计算机绘图,课程最后也要求我们描一副简单的施工图。这次实习用到AutoCAD的时候发现自己以前学的都忘的差不多了,不过毕竟有一定的印象,再次学起来不会像第一次那么难了。 最开始练习CAD时候是描从同事那里拷过来的一个平房,正所谓麻雀虽小,五脏俱全。平房虽然小了点,但是板、梁、柱和墙都有,非常适合初学者。虽然是小平房,但是打开AutoCAD软件,自己并不能快速入手,一边看这个图的板、梁、柱,一边回忆以前学过的AutoCAD绘图知识,经过一段时间的思考,总算给自己定下来绘图的步骤。刚开始画的是基础平面图,首先画定位轴线,然后用偏移(O)命令或复制(CO)命令输入轴线间距,把横向和纵向轴线输好,这样就达到定位的效果。定位轴线布置好后然后布置柱子,柱子可以用矩形(RAC)命令来完成,相同的柱子尺寸则可以通过复制(CO)完成,这时候画出来的矩形一般一角在节点上,通过画对角线的把矩形中心移至节点上。柱子布置好了之后就该布梁和画墙了,墙用实线 二看图集和规范《房屋建筑制图统一标准》、《08G101-11系列图集》、三学习使用探索者软件 通过一周CAD绘图练习,已经能够绘制基本的图形和简单的板梁柱和节点,如果想要达到设计院同事们的水平则需要不断练习提高自己的熟练度。CAD是一个开放的软件,与其他软甲与CAD相结合可以大大就提高绘图效率,我在绘图时候去问同事关于CAD钢筋类型符号的时候,同事告诉我说他们都是用探索者软件,钢筋标注不用自己一个一个写,他推荐我学习掌握探索者软件。探索者软件右侧菜单包括初始设置,图形接口,外部接口,布置轴网,布置柱子,梁绘制,楼板设计,楼梯阳台,基础设计,构件计算,钢筋绘制,钢筋工具,尺寸标注,书写文字,表格绘制,钢结构,图层显示,组与图块,试题工具等模块。其中最重要的包括布置轴网,布置柱子,梁绘制,墙体绘制,钢筋绘制,钢筋工具尺寸标注等。这些菜单归门别类,且都在不同图层上,省去了新建图层的麻烦。轴网顾名思义就是轴线形成的网格,轴线与轴线相交形成节点。布置轴网菜单下的添加轴线(TZ)可以在原有轴线基础上添加平行轴线,类似于CAD操作中的复制和偏移;单根轴线(DZ)完成后还可以输入轴线号,比CAD里面输入轴线号方便快捷,探索者的方便不仅体现在输入轴号这里,探索者软件方便还体现在输入柱子,柱子都布置在节点上,只需要通过跳出来的对话框输入柱子的长宽和矩形中心左右上下偏移的位移,就布置好柱子了,柱子布置好后,可以在轴线上布置梁,根据梁的宽度,设置好梁中心线便宜的位移,在轴线上就可以布置出来了,遇到相同的梁还可以用窗口拾取,大大提高了效率。一般梁是虚线,如果纯CAD操作的话不仅要设置梁的图层,还需要设置线形,设置好后,要逐条布置,不够迅速。梁柱布置好后,接下来就是进行标注了,在绘图练习中,梁尺寸标注主要用到线形标注,四PKPM建模 PKPM建模是通过其子项PMCAD来完成的,PMCAD软件采用人机交互的方式,引导用户逐层地布置各层平面和各层楼面,再输入层高就建立起一套描述建筑物整体结构的数据,且具有较强的荷载统计和传导计算功能除计算结构的自重外,还自动完成从楼板到次梁,从次梁到主梁,从主梁到承重的柱墙,再从上部结构传到基础的全部计算,加上局部的外加荷载,PMCAD可方便的建立起整栋建筑的荷载数据。 以前从来没有接触过PKPM,打开了PKPM多版本控制器,双击PKPM2010版本后,跳出PKPM菜单,里面包含了结构 建筑 钢结构 等子项,结构菜单下则包括PMCAD SATWE JCCAD子项。新建工程一般都是从PMCAD建模开始的,由于我是初学者,刚开始什么都不懂,先把软件熟悉一遍起显得尤为重要,新建工程后,跳出来的界面有点像AutoCAD界面是黑色的背景,右边有主菜单,包括轴线输入,网格生成,楼层定义,荷载输入,广义层及楼层组装,设计参数,常用工具和下拉菜单,保存文件和退出程序等。结构设计时PKPM建模和画CAD平面图有点像,主要区别是建模时确定键一定要按『ENTER』键,学了CAD后 五Satwe计算 师傅给了我一本《SATWE多层及高层建筑结构空间有限元分析与设计软件用户手册》 六画板、梁、柱、基础结构施工图。 七结构设计 框架结构、排架结构、框架一剪力墙结构的电算方法 框架的手算方法 构件钢筋构造的措施 节点详图的绘制方法 桩基础的设计方法及施工图的绘制方法第二篇:图书馆出纳台业务数据结构设计
第三篇:邯郸公交查询系统可行性分析报告
第四篇:公交查询系统毕业设计调研(开题)报告
第五篇:结构设计实习报告