资源描述
广东海洋大学信息学院
课程设计报告
设计题目
公交换乘系统
课程名称
数据结构
姓名(学号)
XXX
联系电话
XXX
专业名称
计算机科学与技术
所在班级
XXX
指导教师
XXX
教师职称
教授
起止时间
2011 年12月26日至 2012年1月6日
评定成绩
一、 课程设计的主要内容
1、 公交线路中,为用户查找最短路径,有【0】次换乘就能到达目的地和【1】次换乘就能到达目的地。
2、 为用户计算出路程所需费用。
3、 该课程设计的公交系统中有分权限;分管理员用户和普通用户,管理员的登陆需要帐号和密码(暗文),普通用户可以直接登陆。
4、 管理员可以重新输入新公交路线、输出公交路线、读取已经存盘的公交路线资料、存入新公交路线资料(慎用!)、查找最短公交路线、新增管理员用户和删除管理员用户。
5、 普通用户只能输出公交路线和查找最短公交路线两个功能。
二、 功能和结构设计
1、 为用户分权限
2、 管理员有重新输入新公交路线、输出公交路线、读取已经存盘的公交路线资料、存入新公交路线资料(慎用!)、查找最短公交路线、新增管理员用户和删除管理员用户
3、 普通用户只能输出公交路线和查找最短公交路线两个功能。
注:系统默认的公交线路图(系统开发者为用户事先存好的,在f1.txt文档中)
三、 流程图和算法设计
算法:(给出查找最短路径的方法)
void Bus<T>::findline()
{
int x,y,i,j,k,l,longers;
longers=0;
//x、y是起始和终止车站的编码;i、j是每个站点后两位编码;k是每个站点后两位编码的差值;l是转乘站点的后两位编码
while(1)
{
cout<<"请输入起始站点编号:";
cin>>x;
cout<<" 终止站点编号:";
cin>>y;
if((x/100)>lineNum||(x/100)<=0||(x%100)>=busStationNum[x/100-1]||(y/100)>lineNum||(y/100)<=0||(y%100)>=busStationNum[y/100-1])//前两个是判断车站编码的首位的,第三个是判断车站编码的后两位的
cout<<"----找不到您所输入站点,请重新输入!----"<<endl;
else
break;
}
i=x%100;
j=y%100;
if((x/100)==(y/100))
{
cout<<"您可【0】次换乘到达目的地,路线如下:"<<endl;
// k=j-i;
if(j-i>0)
{
for(k=0;k<j-i;k++)
{
cout<<line[x/100-1][x%100+k].busStationName<<"-->";
longers+=line[x/100-1][x%100+k].longer;
}
cout<<line[x/100-1][x%100+k].busStationName<<endl;
}
else
{
for(k=0;k>j-i;k--)
{
cout<<line[x/100-1][x%100+k].busStationName<<"-->";
longers+=line[x/100-1][x%100+k-1].longer;
}
cout<<line[x/100-1][x%100+k].busStationName<<endl;
longers+=line[x/100-1][x%100+k].longer;
}
cout<<"----路程所需费用:"<<longers*0.5<<"元,祝您路途愉快!----"<<endl;
}
else
{
string takeName[2][5];//存放两条路线上可转乘车站的名称;
int takeNum[2][5];//存放两条路线上可转乘车站的编号;
int a,b;//a、b是计数的
for(a=0;a<2;a++)
for(b=0;b<5;b++)
{
takeName[a][b]=" ";
takeNum[a][b]=0;
}
//遍历每条路线可换乘的站点
for(a=0,b=0;a<busStationNum[x/100-1];a++)
if(line[x/100-1][a].take)
{
takeName[0][b]=line[x/100-1][a].busStationName;
takeNum[0][b]=line[x/100-1][a].number;
b++;
}
for(a=0,b=0;a<busStationNum[y/100-1];a++)
if(line[y/100-1][a].take)
{
takeName[1][b]=line[y/100-1][a].busStationName;
takeNum[1][b]=line[y/100-1][a].number;
b++;
}
//比较可换乘的站点是否有相同的,如果有,可以了一次换乘到达目的地;否则不可以
bool nn=false;
for(a=0;a<5;a++)
{
for(b=0;b<5;b++)
{
if(takeName[0][a]!=" "&&takeName[1][b]!=" "&&takeName[0][a]==takeName[1][b])
{
cout<<"您可以【1】次换乘到达目的地(换乘点前面有“*”提示),为你选择的路线如下:"<<endl;
l=takeNum[0][a]%100;
if(l-i>0)
{
for(k=0;k<l-i;k++)
{
cout<<line[x/100-1][x%100+k].busStationName<<"-->";
longers+=line[x/100-1][x%100+k].longer;
}
cout<<"*"<<line[x/100-1][x%100+k].busStationName<<"-->";
// money+=line[x/100-1][x%100+k].longer;
}
else
{
for(k=0;k>l-i;k--)
{
cout<<line[x/100-1][x%100+k].busStationName<<"-->";
longers+=line[x/100-1][x%100+k-1].longer;
}
cout<<"*"<<line[x/100-1][x%100+k].busStationName<<"-->";
// money+=line[x/100-1][x%100+k].longer;
}
l=takeNum[1][b]%100;
if(j-l>0)
{
longers+=line[y/100-1][l].longer;
for(k=1;k<j-l;k++)
{
cout<<line[y/100-1][l+k].busStationName<<"-->";
longers+=line[y/100-1][l+k].longer;
}
cout<<line[y/100-1][l+k].busStationName<<endl;
}
else
{
//money+=line[y/100-1][l-1].longer;
for(k=-1;k>j-l;k--)
{
cout<<line[y/100-1][l+k].busStationName<<"-->";
longers+=line[y/100-1][l+k].longer;
}
cout<<line[y/100-1][l+k].busStationName<<endl;
longers+=line[y/100-1][l+k].longer;
}
cout<<"----路程所需费用:"<<longers*0.5<<"元,祝您路途愉快!----"<<endl;
nn=true;
break;
}
else if(a==4&&b==4)
cout<<"很抱歉,没有【0】次换乘或【1】次换乘可以到达目的地的路线!";
}
if(nn)
break;
}
}
}
四、 源程序代码
Bus.h:
#include<iostream>
#include<string>
using namespace std;
template <typename T>
class Bus
{
public:
struct BusStation
{
int number; //车站编号
string busStationName;//车站名称
bool take; //是否可乘换
int longer; //到下一个车站的路程
};
Bus();
~Bus();
void input();
void output();
void findline();//查找线路
void readfile();//读取公交路线数据
void writefile();//存入公交路线数据
typedef BusStation* Pointer;
private:
Pointer *line; //指向三条路线的指针
int lineNum;//路线数
int *busStationNum;//每条路线的车站数
};
template<typename A>
class Administrator
{
public:
Administrator();
~Administrator();
void readAdministrator();//读取管理员资料
void writeAdministrator();//存入管理员资料
void addAdministrator();//增加用户
void deleteAdministrator();//删除用户
bool land();
private:
string *name;
string *mima;
int num;
};
///////////////////////////////////////////////////////////////////////////
Bus.cpp
#include"Bus.h"
#include<fstream>
template<typename T>
Bus<T>::Bus()
{
lineNum=0;
line=new Pointer[lineNum];//三条线路
busStationNum=new int [lineNum];//每条线路的车站数
}
template<typename T>
Bus<T>::~Bus()
{
for(int i=0;i<lineNum;i++)
delete [] line[i];
lineNum=0;
delete [] busStationNum;
delete [] line;
}
template<typename T>
void Bus<T>::input()
{
cout<<"请输入公交线路数:";
cin>>lineNum;
line=new Pointer[lineNum];//三条线路
busStationNum=new int [lineNum];//每条线路的车站数
for(int a=0;a<lineNum;a++)
{
cout<<"请输入第"<<a+1<<"条公交线路的车站数:";
cin>>busStationNum[a];
}
for(int b=0;b<lineNum;b++)
line[b]=new BusStation[busStationNum[b]];//依据每条线路的车站数创建每条线路
int k,m,i,j;//k指前一线,m指后一线,i指要比较的前一线的车站,j指要比较的后一线的车站
cout<<"请依次输入每个车站的名称、到下一站点的距离:"<<endl;
for(i=0;i<lineNum;i++)
{
cout<<"第"<<i+1<<"条路线的资料"<<endl;
for(j=0;j<busStationNum[i];j++)
{
line[i][j].number=(i+1)*100+j;//设置每个车站的编号
line[i][j].take=false;//初始化每个车站为不可换乘
cin>>line[i][j].busStationName;
if(j<busStationNum[i]-1)
cin>>line[i][j].longer;//到下一站点有3公里
else
cin>>line[i][j].longer;
}
}
//以下是要找出线路中可换乘的车站
for(k=0,m=k+1;k<lineNum-1;)//每条路线的站点与另一条路线的站点进行比较
{
for(i=0;i<busStationNum[k];i++)
for(j=0;j<busStationNum[m];j++)
{
if(line[k][i].busStationName==line[m][j].busStationName)
{
line[k][i].take=true;
line[m][j].take=true;
}
}
if(m>=lineNum-1)
{
k++;
m=k;
}
m++;
}
}
template<typename T>
void Bus<T>::output()
{
cout<<"编码 ";
cout<<"车站名称 ";
cout<<"到下一站的距离 ";
cout<<"是否可以乘换"<<endl;
cout<<setiosflags(ios::left);
for(int i=0;i<lineNum;i++)
{
for(int j=0;j<busStationNum[i];j++)
{
cout<<setw(6)<<line[i][j].number;
cout<<setw(20)<<line[i][j].busStationName;
cout<<setw(20)<<line[i][j].longer;
if(line[i][j].take)
cout<<"是 "<<endl;
else
cout<<"否 "<<endl;
}
cout<<endl;
}
}
template<typename T>
void Bus<T>::findline()
{
int x,y,i,j,k,l,longers;
longers=0;
//x、y是起始和终止车站的编码;i、j是每个站点后两位编码;k是每个站点后两位编码的差值;l是转乘站点的后两位编码
while(1)
{
cout<<"请输入起始站点编号:";
cin>>x;
cout<<" 终止站点编号:";
cin>>y;
if((x/100)>lineNum||(x/100)<=0||(x%100)>=busStationNum[x/100-1]||(y/100)>lineNum||(y/100)<=0||(y%100)>=busStationNum[y/100-1])//前两个是判断车站编码的首位的,第三个是判断车站编码的后两位的
cout<<"----找不到您所输入站点,请重新输入!----"<<endl;
else
break;
}
i=x%100;
j=y%100;
if((x/100)==(y/100))
{
cout<<"您可【0】次换乘到达目的地,路线如下:"<<endl;
// k=j-i;
if(j-i>0)
{
for(k=0;k<j-i;k++)
{
cout<<line[x/100-1][x%100+k].busStationName<<"-->";
longers+=line[x/100-1][x%100+k].longer;
}
cout<<line[x/100-1][x%100+k].busStationName<<endl;
}
else
{
for(k=0;k>j-i;k--)
{
cout<<line[x/100-1][x%100+k].busStationName<<"-->";
longers+=line[x/100-1][x%100+k-1].longer;
}
cout<<line[x/100-1][x%100+k].busStationName<<endl;
longers+=line[x/100-1][x%100+k].longer;
}
cout<<"----路程所需费用:"<<longers*0.5<<"元,祝您路途愉快!----"<<endl;
}
else
{
string takeName[2][5];//存放两条路线上可转乘车站的名称;
int takeNum[2][5];//存放两条路线上可转乘车站的编号;
int a,b;//a、b是计数的
for(a=0;a<2;a++)
for(b=0;b<5;b++)
{
takeName[a][b]=" ";
takeNum[a][b]=0;
}
//遍历每条路线可换乘的站点
for(a=0,b=0;a<busStationNum[x/100-1];a++)
if(line[x/100-1][a].take)
{
takeName[0][b]=line[x/100-1][a].busStationName;
takeNum[0][b]=line[x/100-1][a].number;
b++;
}
for(a=0,b=0;a<busStationNum[y/100-1];a++)
if(line[y/100-1][a].take)
{
takeName[1][b]=line[y/100-1][a].busStationName;
takeNum[1][b]=line[y/100-1][a].number;
b++;
}
//比较可换乘的站点是否有相同的,如果有,可以了一次换乘到达目的地;否则不可以
bool nn=false;
for(a=0;a<5;a++)
{
for(b=0;b<5;b++)
{
if(takeName[0][a]!=" "&&takeName[1][b]!=" "&&takeName[0][a]==takeName[1][b])
{
cout<<"您可以【1】次换乘到达目的地(换乘点前面有“*”提示),为你选择的路线如下:"<<endl;
l=takeNum[0][a]%100;
if(l-i>0)
{
for(k=0;k<l-i;k++)
{
cout<<line[x/100-1][x%100+k].busStationName<<"-->";
longers+=line[x/100-1][x%100+k].longer;
}
cout<<"*"<<line[x/100-1][x%100+k].busStationName<<"-->";
// money+=line[x/100-1][x%100+k].longer;
}
else
{
for(k=0;k>l-i;k--)
{
cout<<line[x/100-1][x%100+k].busStationName<<"-->";
longers+=line[x/100-1][x%100+k-1].longer;
}
cout<<"*"<<line[x/100-1][x%100+k].busStationName<<"-->";
// money+=line[x/100-1][x%100+k].longer;
}
l=takeNum[1][b]%100;
if(j-l>0)
{
longers+=line[y/100-1][l].longer;
for(k=1;k<j-l;k++)
{
cout<<line[y/100-1][l+k].busStationName<<"-->";
longers+=line[y/100-1][l+k].longer;
}
cout<<line[y/100-1][l+k].busStationName<<endl;
}
else
{
//money+=line[y/100-1][l-1].longer;
for(k=-1;k>j-l;k--)
{
cout<<line[y/100-1][l+k].busStationName<<"-->";
longers+=line[y/100-1][l+k].longer;
}
cout<<line[y/100-1][l+k].busStationName<<endl;
longers+=line[y/100-1][l+k].longer;
}
cout<<"----路程所需费用:"<<longers*0.5<<"元,祝您路途愉快!----"<<endl;
nn=true;
break;
}
else if(a==4&&b==4)
cout<<"很抱歉,没有【0】次换乘或【1】次换乘可以到达目的地的路线!";
}
if(nn)
break;
}
}
//cout<<"还未写代码";
}
template<typename T>
void Bus<T>::readfile()
{
ifstream infile("f1.txt",ios::in);
if(!infile)
{
cerr<<"open error!"<<endl;
exit(1);
}
infile>>lineNum;
line=new Pointer[lineNum];//三条线路
busStationNum=new int [lineNum];//每条线路的车站数
for(int a=0;a<lineNum;a++)
{
infile>>busStationNum[a];
}
for(int b=0;b<lineNum;b++)
line[b]=new BusStation[busStationNum[b]];//依据每条线路的车站数创建每条线路
for(int i=0;i<lineNum;i++)
for(int j=0;j<busStationNum[i];j++)
{
infile>>line[i][j].number;
infile>>line[i][j].busStationName;
infile>>line[i][j].longer;
infile>>line[i][j].take;
}
cout<<"----读取成功----"<<endl;
infile.close();
}
template <typename T>
void Bus<T>::writefile()
{
ofstream outfile("f1.txt",ios::out);
if(!outfile)
{
cerr<<"open error!"<<endl;
exit(1);
}
outfile<<lineNum<<" ";
for(int a=0;a<lineNum;a++)
{
outfile<<busStationNum[a]<<" ";
}
for(int i=0;i<lineNum;i++)
for(int j=0;j<busStationNum[i];j++)
{
outfile<<line[i][j].number<<" ";
outfile<<line[i][j].busStationName<<" ";
outfile<<line[i][j].longer<<" ";
outfile<<line[i][j].take<<" ";
}
cout<<"----存入成功----"<<endl;
outfile.close();
}
//////////////////////////////////////////////
template <typename A>
Administrator<A>::Administrator()
{
num=0;
name=new string[num];
mima=new string[num];
}
template<typename A>
Administrator<A>::~Administrator()
{
num=0;
delete [] name;
delete [] mima;
name=NULL;
mima=NULL;
}
template<typename A>
void Administrator<A>::readAdministrator()
{
ifstream infile("Administrator.txt",ios::in);
if(!infile)
{
cerr<<"open error!"<<endl;
exit(1);
}
infile>>num;
name=new string[num];
mima=new string[num];
for(int i=0;i<num;i++)
{
infile>>name[i]>>mima[i];
}
}
template<typename A>
void Administrator<A>::writeAdministrator()
{
ofstream outfile("Administrator.txt",ios::out);
if(!outfile)
{
cerr<<"open error!"<<endl;
exit(1);
}
outfile<<num<<" ";
for(int i=0;i<num;i++)
{
outfile<<name[i]<<" ";
outfile<<mima[i]<<" ";
}
}
template<typename A>
bool Administrator<A>::land()
{
string myname;
string mymima;
cout<<"请输入管理员帐号:";
cin>>myname;
cout<<" 密码:";
char ch;
while ((ch=getch())!=13) //输入密码时显示星号功能。老师,学生登录时也与这个相同。
{
mymima+=ch;//string对象重载了+=
cout<<"*";
}
//cin>>mymima;
readAdministrator();
for(int i=0;i<num;i++)
if(myname==name[i]&&mymima==mima[i])
return true;
return false;
}
template <typename A>
void Administrator<A>::addAdministrator()
{
string *name_aux,*mima_aux;
name_aux=new string[num+1];
mima_aux=new string[num+1];
for(int i=0;i<num;i++)//将用户的帐户和密码赋给辅助变量
{
name_aux[i]=name[i];
mima_aux[i]=mima[i];
}
//一下几行代码是为了扩大存储帐户和密码的数组
delete [] name;
delete [] mima;
num++;
name=new string[num];
mima=new string[num];
for(int j=0;j<num-1;j++)//将用户和密码重新复制回来
{
name[j]=name_aux[j];
mima[j]=mima_aux[j];
}
delete [] name_aux;
delete [] mima_aux;
name_aux=NULL;
mima_aux=NULL;
cout<<"请输入要新建的管理员帐户:";
cin>>name[num-1];
cout<<" 密码:";
cin>>mima[num-1];
for(int k=0;k<num-1;k++)
{
if(name[k]==name[num-1])
{
cout<<"帐户已存在!";
num--;
break;
}
else if(k==num-2)
cout<<"----新管理员用户创建成功----";
}
writeAdministrator();
}
template<typename A>
void Administrator<A>::deleteAdministrator()
{
string dname,dmima;//分别存放要删除的管理员用户的帐号和密码
cout<<"请输入您要删除的管理员的帐号:";
cin>>dname;
cout<<" 密码:";
cin>>dmima;
for(int i=0;i<num;i++)
{
if(dname==name[i]&&dmima==mima[i])
{
for(int j=i;j<num-1;j++)
{
name[j]=name[j+1];
mima[j]=mima[j+1];
}
num--;
writeAdministrator();
cout<<"----您已经成功删除"<<dname<<"管理员用户"<<endl;
break;
}
else
{
if(i>=num-1)
cout<<"----您要删除的用户不存在!----";
}
}
getch();
}
//////////////////////////////////////////////////////////////////////////
main.cpp
/*
日期:2011.12.28~2011.12.30
作者:周钦雄
声明:我只是编程世界中小兵,程序中不足之处请多多提点,不胜感激
*/
#include"Bus.cpp"
#include<iomanip>
#include<Windows.h>
#include<conio.h>
void main()
{
//system("Color 3D");
Bus<int> b;
Administrator<int> a;
int num;
loop:
while(1)
{
system("cls");
cout<<setw(70)<<"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓"<<endl;
cout<<setw(70)<<"┃ wwwwwwww ><^^^:> 欢迎进入公交换乘系统 <:^^^>< wwwwwwwww┃"<<endl;
cout<<setw(70)
展开阅读全文