程序设计报告城市管理.docx
《程序设计报告城市管理.docx》由会员分享,可在线阅读,更多相关《程序设计报告城市管理.docx(32页珍藏版)》请在冰豆网上搜索。
程序设计报告城市管理
课程设计报告
设计题目:
城市管理
*******
专业:
电子信息工程
班级:
电信工17-1班
学号:
********64
******
完成日期:
2018年6月29日
合肥工业大学计算机与信息学院
(1)需求和规格说明
问题描述:
问题描述:
用无序表实现一个城市数据库。
每条数据库记录包括城市名(任意长的字符串)和城市的坐标(用整数x和y表示)。
实现数据的插入、删除、查询功能,并实现指定距离内的所有城市。
设计算法实现指定一定数目的具体城市,寻找遍历这些城市并回到出发点的最佳路径,观察随着城市数目的增加,算法执行效率的变化。
编程任务:
1)用列表对城市进行记录和管理,实现城市的增加、删除和查询功能,并实现文件保存和读取
2)计算城市之间距离,统计输出距离某城市一定范围内的所有城市。
3)实现一定规模城市的遍历最佳路径选择。
4)分析随着城市数目增加时,算法执行效果的改变,深刻理解旅行商问题。
(2)设计
建立一个CityNode,包含城市的名称,横纵坐标和指针。
再建立一CityManage类
属性和方法定义
类名
成员类别
类型
成员名
描述
CityNode
属性
String
cityname
城市名称
int
x
城市的横坐标
int
y
城市的纵坐标
CityNode*
next
其连接作用
Class中的方法
boolInsert_CityNode(stringcityname,intx,inty);(添加城市)
boolInsert_CityNode_2(stringcityname,intx,inty);(添加城市---文件读入)
boolInsert_CityNode_3(stringcityname,floatx,floaty);(遍历指定城市中使用)
boolSearch_CityNode(stringcityname);(通过城市名字查找)
boolSearch_CityNode(intx,inty);(用过城市坐标查找)
boolDelete_CityNode(stringcityname);(用过城市名字删除)
boolDelete_CityNode(intx,inty);(通过城市坐标删除)
floatDistance(stringcityname1,stringcityname2);(两城市间的距离)
voidSaveFile(stringcityname,intx,inty);(保存文件)
voidReadFile();(读取文件)
voidOperation();(switc语句,便于操作)
voidSaveAgain();(删除节点时重新保存文件)
voidClear();(遍历指定城市后清空链表)
voidIsExist(intx,inty,stringcityname,int&temp);(判断是否已经存在)
boolDistance_In_Range(intnum,intx,inty);(一定范围内的城市)
boolTravel_Edge();(将城市和坐标分别存在数组中,便于求最短路径)
voidTravel_Path();(贪心算法求最短路径)
boolTravel_Edge_ALL();(遍历所有城市)
boolZDCZ(stringcityname);(添加需要便利的指定城市)
CityNode*head;(保存所有城市数据)
CityNode*head2;(保存指定城市的信息)
(3)
用户手册
(4)调试及测试
1.添加城市
若城市已存在,则提示存在,不能添加
2.查找城市
通过名称查找
通过坐标查找
3.删除城市
通过名称删除
通过坐标删除
4..查看两城市间的距离
5..查找距离定点一定距离的城市
6.查找最优路径
《1》制定城市查询最短路径
《2》全部城市最短路径
测试数据(环形数据能更好的检测)
中国91合肥96广州56深圳51安徽16北京11
7.查看所有城市
(5)附录程序代码
#include
#include
#include
#include
#include
usingnamespacestd;
intnumber=0,number2=0;
floatWeight[100][100];
stringcitys[100];
structCityNode
{
stringcityname;
floatx,y;
CityNode*next;
};
structminedge
{
intvex;
intlow;
};
minedgeEdge[100];
voidTravel();
classCityManage
{
public:
CityManage();
//~CityManage();
boolInsert_CityNode(stringcityname,floatx,floaty);
boolInsert_CityNode_2(stringcityname,floatx,floaty);
boolInsert_CityNode_3(stringcityname,floatx,floaty);
boolSearch_CityNode(stringcityname);
boolSearch_CityNode(floatx,floaty);
boolDelete_CityNode(stringcityname);
boolDelete_CityNode(floatx,floaty);
floatDistance(stringcityname1,stringcityname2);
voidSaveFile(stringcityname,floatx,floaty);
voidReadFile();
voidOperation();
voidSaveAgain();
voidClear();
voidIsExist(floatx,floaty,stringcityname,int&temp);
boolDistance_In_Range(intnum,floatx,floaty);
boolTravel_Edge();
boolTravel_Edge_ALL();
boolZDCZ(stringcityname);
private:
CityNode*head;
CityNode*head2;
};
CityManage:
:
CityManage()
{
head=newCityNode;
head->next=NULL;
head2=newCityNode;
head2->next=NULL;
}
boolCityManage:
:
Insert_CityNode(stringcityname,floatx,floaty)
//(添加城市)
{
CityNode*p=newCityNode;
p->cityname=cityname;
p->x=x;
p->y=y;
inttemp1=0;
IsExist(x,y,cityname,temp1);
if(temp1==0)
{
SaveFile(cityname,x,y);
cout<<"添加成功"<if(head->next==NULL)
{
head->next=p;
p->next=NULL;
number=1;
returntrue;
}
p->next=head->next;
head->next=p;
number++;
returntrue;
}
returntrue;
}
boolCityManage:
:
Insert_CityNode_2(stringcityname,floatx,floaty)
//(添加城市---文件读入)
{
CityNode*p=newCityNode;
p->cityname=cityname;
p->x=x;
p->y=y;
if(head->next==NULL)
{
head->next=p;
p->next=NULL;
number=1;
returntrue;
}
p->next=head->next;
head->next=p;
number++;
returntrue;
}
boolCityManage:
:
Insert_CityNode_3(stringcityname,floatx,floaty)
//(添加城市---文件读入)
{
CityNode*p=newCityNode;
p->cityname=cityname;
p->x=x;
p->y=y;
if(head2->next==NULL)
{
head2->next=p;
p->next=NULL;
number2=1;
returntrue;
}
p->next=head2->next;
head2->next=p;
number2++;
returntrue;
}
boolCityManage:
:
ZDCZ(stringcityname)
{
CityNode*p;
p=newCityNode;
p=head->next;
while(p!
=NULL)
{
if(p->cityname==cityname)
{
Insert_CityNode_3(p->cityname,p->x,p->y);
returntrue;
}
p=p->next;
}
returntrue;
}
boolCityManage:
:
Search_CityNode(stringcityname)
//(通过城市名字查找)
{
CityNode*p;
p=newCityNode;
p=head->next;
while(p!
=NULL)
{
if(p->cityname==cityname)
{
cout<<"*****************************"<cout<<""<x<<","<y<<">"<cout<<"*****************************"<returntrue;
}
p=p->next;
}
cout<<"未发现此城市"<returnfalse;
}
boolCityManage:
:
Search_CityNode(floatx,floaty)
//(用过城市坐标查找)
{
CityNode*p;
p=newCityNode;
p=head->next;
while(p!
=NULL)
{
if(p->x==x&&p->y==y)
{
cout<cout<<"*****************************"<cout<<""<cityname<<"<"<x<<","<y<<">"<cout<<"*****************************"<cout<returntrue;
}
p=p->next;
}
cout<<"所在坐标下没有城市"<returnfalse;
}
voidCityManage:
:
IsExist(floatx,floaty,stringcityname,int&temp)
//(判断是否已经存在)
{
CityNode*k;
k=newCityNode;
k=head->next;
while(k!
=NULL)
{
if(k->x==x&&k->y==y||k->cityname==cityname)
{
cout<<"该城市已存在"<temp=1;
break;
}
k=k->next;
}
}
boolCityManage:
:
Delete_CityNode(stringcityname)
//(用过城市名字删除)
{
CityNode*p,*s;
p=newCityNode;
s=newCityNode;
s=head;
p=head->next;
while(p!
=NULL)
{
if(p->cityname==cityname)
{
s->next=p->next;
deletep;
cout<<"该城市已删除"<number--;
returntrue;
}
p=p->next;
s=s->next;
}
returnfalse;
}
boolCityManage:
:
Delete_CityNode(floatx,floaty)
//(通过城市坐标删除)
{
CityNode*p,*s;
p=newCityNode;
s=newCityNode;
s=head;
p=head->next;
while(p!
=NULL)
{
if(p->x==x&&p->y==y)
{
s->next=p->next;
deletep;
number--;
cout<<"该城市已删除"<returntrue;
}
p=p->next;
s=s->next;
}
returnfalse;
}
voidCityManage:
:
SaveAgain()
{
ofstreamfout("City.txt",ios:
:
out);
CityNode*p;
p=newCityNode;
p=head->next;
while(p!
=NULL)
{
SaveFile(p->cityname,p->x,p->y);
p=p->next;
}
}
floatCityManage:
:
Distance(stringcityname1,stringcityname2)
//(两城市间的距离)
{
CityNode*p,*s;
floatc1x,c1y,c2x,c2y,dis;
p=newCityNode;
s=newCityNode;
p=head->next;
s=head->next;
while(p!
=NULL)
{
if(p->cityname==cityname1)
{
c1x=p->x;
c1y=p->y;
break;
}
p=p->next;
}
//if(p->cityname!
=cityname1)
if(p==NULL)
{
cout<<"未找到您所输入的第一个城市"<return0;
}
while(s!
=NULL)
{
if(s->cityname==cityname2)
{
c2x=s->x;
c2y=s->y;
break;
}
s=s->next;
}
//if(s->cityname!
=cityname2)
if(s==NULL)
{
cout<<"未找到您所输入的第二个城市"<return1;
}
dis=sqrt((c1x-c2x)*(c1x-c2x)+(c1y-c2y)*(c1y-c2y));
cout<cityname<<""<<"<"<x<<","<y<<">"<<"到";
cout<cityname<<""<<"<"<x<<","<y<<">"<<"的距离为:
"<returndis;
}
boolCityManage:
:
Distance_In_Range(intnum,floatx,floaty)
//(一定范围内的城市)
{
CityNode*p;
intn=0;
p=newCityNode;
p=head->next;
while(p!
=NULL)
{
if(sqrt((pow(p->x-x,2)+pow(p->y-y,2)))<=num)
{
cout<cityname<<"<"<x<<","<y<<">"<n++;
}
p=p->next;
}
if(n==0)
{
cout<<"该范围内没有发现城市!
";
}
returntrue;
}
voidCityManage:
:
Clear()
{
CityNode*p;
p=newCityNode;
while(head2->next)
{
p=head2->next;
head2->next=p->next;
free(p);
number2--;
}
}
boolCityManage:
:
Travel_Edge()
//(将城市和坐标分别存在数组中,便于求最短路径)
{
CityNode*p,*s;
p=newCityNode;
s=newCityNode;
p=head2->next;
inta=0,b=0,c=0;
for(a=0;a<100;a++)
for(b=0;b<100;b++)
Weight[a][b]=100;
for(a=0;a{
s=p->next;
for(b=a+1;b{
Weight[b][a]=Weight[a][b]=sqrt(pow(abs(p->x-s->x),2)+pow(abs(p->y-s->y),2));
s=s->next;
}
p=p->next;
}
p=head2->next;
for(c=0;c{
citys[c]=p->cityname;
p=p->next;
}
returntrue;
}
boolCityManage:
:
Travel_Edge_ALL()
//(将城市和坐标分别存在数组中,便于求最短路径)
{
CityNode*p,*s;
p=newCityNode;
s=newCityNode;
p=head->next;
inta=0,b=0,c=0;
for(a=0;a<100;a++)
for(b=0;b<100;b++)
Weight[a][b]=100;
for(a=0;a{
s=p->next;
for(b=a+1;b{
Weight[b][a]=Weight[a][b]=sqrt(pow(abs(p->x-s->x),2)+pow(abs(p->y-s->y),2));
s=s->next;
}
p=p->next;
}
p=head->next;
for(c=0;c{
citys[c]=p->cityname;
p=p->next;
}
returntrue;
}
voidTravel(intNumber)//(求最短路径)
{
inti,j,k,l;
intS[100];//用于存储已访问过的城市//用于存储两个城市之间的距离
floatsum=0;//用于记算已访问过的城市的最小路径长度
floatDtemp;//保证Dtemp比任意两个城市之间的距离都大(其实在算法描述中更准确的应为无穷大)
intflag;////最为访问的标志,若被访问过则为1,从未被访问过则为0
/*初始化*/
i=1;//i是至今已访问过的