趁着最近备战c++实习,通过以前帮朋友写的课设复习一下c++,后面附有各个模块的功能实现。
建议通过多文件封装各个类的功能。
一、程序功能
1.总体描述:本程序实现对民航飞行与地图管理系统的简单操作。
2.程序菜单功能:
地图记录是一个数据库列表,每一个记录包含一个城市的信息如城市编号、城市名称和 城市坐标等信息,如下表所示。
地图信息列表
城市编号 |
城市名称 |
城市坐标x |
城市坐标y |
城市之间的距离等…… |
1001 |
南京 |
50 |
60 |
|
1002 |
北京 |
40 |
10 |
|
1003 |
杭州 |
55 |
65 |
|
… |
1. 增加城市信息 2. 删除城市信息 3. 修改城市信息 4. 保存城市信息至文件 5. 从文件读取城市信息 6. 对城市排序 7. 显示所有城市信息 8. 添加航班信息 9. 删除航班信息 10. 显示航班信息 11. 判断起飞航班是否可以刹车 12. 查询航班雷达半径内所有城市信息 0. 退出 Input 1-12,0: |
主菜单如右图所示。程序执行过程:显示主菜单,用户在“请输入选择:”处输入选项(按照功能列表输入 1~11,0中的一个数字),按回车后,执行相应的功能。
各菜单项功能及内部实现如下:
|
- 增加城市信息
- 输入城市编号、城市名称、城市坐标等信息,在城市列表尾部追加一条记录。此功能用于建立地图数据,一次只能追加一个城市信息。
- 删除城市信息
- 输入一个城市的编号(城市编号是城市的唯一标识,即一个编号对应一个城市,不同的城市,编号不同),首先在地图列表中查询该城市是否存在,若存在,则显示该城市信息,并提问是否删除该城市,根据回答(y/n)确定是否删除该城市;若不存在,提示该城市不存在。
- 修改城市信息
- 输入一个城市的编号,在地图列表中查询该城市是否存在,若存在,则显示该城市信息。请用户输入新的城市编号、城市名称、城市坐标等信息,使用新的城市信息修改原来的城市信息。
- 保存城市信息至文件
- 提示用户输入一个文件名,如用户输入map.txt,然后系统自动将地图信息列表中全部城市的信息写入该正文文件,文件格式如下:第1行表示共有几个城市,从第 2 行开始,每行是一个城市的信息。
- 从文件读取城市信息
- 用户输入一个文件名,系统自动将该文件中的城市记录追加到地图信息列表中。本功能可实现一次性从数据文件追加多个城市的记录,而功能1一次只能追加一个城市的记录。
- 在执行本功能前,请准备好正文文件,文件名请自行给出如map.txt,文件格式如功能4所示,与导入文件格式相同,每行是一个城市的信息。
- 对城市排序
- 按照城市编号利用选择法对现有城市排序,排序后城市将按编号升序显示。
- 显示所有城市信息
- 显示地图信息列表中所有城市的信息,每行显示一个城市的信息。
- 设置航班信息
- 输入航班编号、飞机名称、飞机重量(吨)、飞机当前的坐标位置等信息。每次增加一架飞机的信息,可以同时存储多架飞机的信息,后续将使用飞机信息和地图信息进行综合计算。
- 删除航班信息
- 输入航班编号,如果对应的航班存在,则显示该航班的飞机信息,并提问是否删除该航班,根据回答(y/n)确定是否删除该航班;若不存在,提示该航班不存在。
- 显示航班信息。
- 在一行中显示当前飞机的所有信息,目前系统只存储一架飞机的信息。
- 判断起飞飞机是否可以刹车
- 用户输入当前航班编号,以及飞机的速度和跑道剩余距离,然后结合飞机自身的重量(来自航班信息)进行是否可以刹车的判断。如果可以则输出"可以刹车"否则输出"不可以刹车!",如果用户输入的飞机编号查询不到则输出"没有飞机信息!"。
- 查询飞机雷达半径内所有城市信息
- 输入航班编号,根据飞机当前的坐标位置,要求用户输入雷达的扫描半径,扫描地图信息列表中所有的城市坐标。计算出飞机坐标与每一个城市坐标之间的距离,距离小于雷达扫描半径的城市,显示城市的所有信息,每行显示一个城市的信息。
-
二、数据结构说明
(1)City类(表示一个城市的各种信息)
私有数据成员:
1)number //整型数组城市编号
2)name //字符数组城市名
3)x //整型的位置坐标x
4)y //整型的位置坐标y
公有成员函数:
1)City(int n=0,int x1=0,int y1=0,const char*na=NULL)//构造函数,参数为城市编号,坐标x、y,城市名
2)City(const City&c) //拷贝构造函数
3)void setNumber(int num) //设置城市编号
4)void setName(char*na) //设置城市名
5)void setPosition(int xpos,int ypos) //设置城市坐标
6)void getName(char*na) //读取城市名
7)int getNum() //读取城市编号
8)int getX() //读取城市x坐标
9)int getY() //读取城市y坐标
10)void show() //显示城市信息
-
(2)Map类(表示城市的信息记录)
-
私有数据成员:
1)City* cities; //城市线性表头指针
2)int curCounter; //整型的现有城市数
3)int maxCounter; //整型的最大城市数
公有成员函数:
1)Map(int maxc=10)//构造函数,参数(最大城市数)
2)Map(const Map &m)//拷贝构造函数
3)~Map()//析构函数
4)void ImportDataBase()//从文件database.txt中读入数据,调用ReadCity函数实现
5)double Distance(int x1, int y1, int x2, int y2)//计算两个坐标之间距离,参数(x、y)
6)void AddCity(int num,char* na,int x,int y)//增加城增加市信息,参数为新增城市编号、名称、坐标,当城市后长度越界,重新申请空间,赋值调用City的成员函数实现
7)void DeleteCity(int num)//根据城市编号删除城市信息
8)void SaveCity(char*filename)//将城市地图信息列表存入文件filename.txt中,参数为文件名指针
9)void ReadCity(char*filename)//将文件内容追加到内存城市地图信息列表cities[]中,参数(文件名指针),当增加城市后长度越界,重新申请空间,文件若不存在则输出提示信息
10)void UpdateCity(int i,int num,char* na,int x,int y)//修改下标为i的城市信息,参数(下标、修改后的编号、名、坐标)
11)int FindCIty(int num)//根据城市编号返回城市下标,参数为编号,返回值为该城市元素下标
12)void ShowCities()//显示全部城市信息
13)int GetCurCounter()//读取当前城市数量,无参数,返回值为当前城市数量
14)void ShowCity(int i)//显示下标为i的城市信息
15)void SortCities()//将城市按编号从小到大排序,利用选择排序法,城市编号为选择依据,排序对象为城市元素
-
(3)Plane 类(记录航班信息)
私有数据成员:
1)int number, x, y; //航班编号及坐标
2)char name[N]; //航班名
3)double weight; //航班重量
公有成员函数:
1)Plane(int num=0,int x1=0,int y1=0,double wei=0,const char*na=NULL)//构造函数
2)void SetPlane(int num,char* na,double w,int xpos,int ypos)//设置航班信息
3)void Show()//显示航班信息
4)int CanBrake(double sp,double reDistance)//判断是否可以刹车,参数(当前速度,剩余跑到距离)
5)void RadarFind(double radarRadius,Map mapobj)//显示雷达半径内城市信息,参数(雷达半径、地图对象mapobj)
6)int IfFlight()//判断当前是否有航班信息文章来源:https://www.toymoban.com/news/detail-475732.html
三、City、Maps、Plane类具体实现
1. City类:
class City//城市信息记录
{
private:
int number,x,y;//城市编号、城市位置坐标
char name[N];//城市名称
public:
City(int n=0,int x1=0,int y1=0,const char*na=NULL)//构造函数,n为编号,x、y为坐标,na为名称数组指针
{
number=n;
x=x1;
y=y1;
if(na)
strcpy(name,na);
else
strcpy(name," ");
}
City(const City&c)//拷贝构造函数 city guangzhou
{
number=c.number; //guangzhou.number
x=c.x;
y=c.y;
strcpy(name,c.name);
}
void setNumber(int num)
{
number=num;
}//设置城市编号
void setName(char*na)
{
strcpy(name,na);
}//设置城市名称
void setPosition(int xpos,int ypos)
{
x=xpos,y=ypos;
}//设置城市坐标
void getName(char*na)
{
strcpy(na,name);
}//读取城市名称
int getNum()
{
return number;
}//读取城市编号
int getX()
{
return x;
}//读取城市x坐标
int getY()
{
return y;
}//读取城市y坐标
void show()//显示城市信息
{
cout.setf(ios::left,ios::adjustfield);
cout<<"城市编号:"<<setw(8)<<number<<"城市名称:"<<setw(16)<<name<<"城市坐标:("<<x<<','<<y<<')' << endl;
}
friend class Map;//定义Map为友元类
};
2. Map类
class Map
{
private:
City* cities;//城市线性表头指针
int curCounter;//现有城市记录数
int maxCounter;//最大城市记录数
public:
Map(int maxc=10)//构造函数,参数为最大城市记录数
{
if(maxc!=0)
cities=new City[maxc];
else
cities=new City(0,0,0,NULL);
curCounter=0;
maxCounter=maxc;
}
Map(const Map &m)//拷贝构造函数
{
curCounter=m.curCounter;
maxCounter=m.maxCounter;
if(m.maxCounter!=0)
{
cities=new City[maxCounter];
for(int i=0;i<curCounter;i++)
cities[i]=m.cities[i];
}
else
cities=new City(0,0,0,NULL);
}
~Map()//析构函数
{
if(maxCounter!=0)
delete[] cities;
else
delete cities;
}
double Distance(int x1, int y1, int x2, int y2)//计算两个坐标之间距离,参数为两个点的x、y坐标
{
return sqrt(double(x1 - x2)*(x1 - x2)+(y1 - y2)*(y1 - y2));
}
void AddCity(int num,char* na,int x,int y)//增加城市信息,参数为新增城市编号、名称、坐标,当增加城市后长度越界,重新申请空间,赋值调用City的成员函数实现
{
if(curCounter==maxCounter)
{
City *newcities;
newcities=new City[maxCounter+maxCounter];
maxCounter*=2;
for(int i=0;i<curCounter;i++)
{
newcities[i]=cities[i];
}
delete[]cities;
cities=newcities;
}
cities[curCounter].setName(na);
cities[curCounter].setNumber(num);
cities[curCounter].setPosition(x,y);
curCounter++;
}
void DeleteCity(int num)//根据城市编号删除城市信息
{
int i;
for(i=0; i<curCounter;i++)// 寻找
{
if (cities[i].number==num)
break;
}
for(int j=i;j<curCounter-1;j++)// 删除
{
cities[j]=cities[j+1];
}
curCounter--;// xian'you'de减少一个
}
void SaveCity(char*filename)//将城市地图信息列表存入文件filename.txt中,参数为文件名指针
{
ofstream ofile;
ofile.open(filename,ios::out);//文件打开
ofile.setf(ios::left,ios::adjustfield);//控制文件的输入格式
if(ofile.fail()) //如果打开失败
{
cout<<"error!"<<endl;
exit(0); //结束程序
}
else //如果成功打开,将城市地图信息存入文件
{
ofile<<curCounter<<endl;//ofile《《相当于cout《《
for(int i=0; i<curCounter;i++)
{
ofile<<cities[i].number<<'\t'<<cities[i].name<<'\t'<<cities[i].x<<'\t'<<cities[i].y<<endl;
}
}
ofile.close(); //关闭文件,防止数据丢失
}
void ReadCity(char*filename)//将文件内容追加到内存城市地图信息列表cities[]中,参数为文件名指针,当增加城市后长度越界,重新申请空间。文件若不存在则输出提示信息
{
ifstream infile(filename,ios::in); //打开文件
if (infile) //文件打开成功
{
int filecurcounter;
infile>>filecurcounter;
if(maxCounter<filecurcounter+curCounter)
{
City*newcities;
newcities=new City[filecurcounter+curCounter];
maxCounter=filecurcounter+curCounter;
for(int i=0;i<curCounter;i++)
newcities[i]=cities[i];
delete[]cities;
cities=newcities;
}
for(int i=0;i<filecurcounter;i++)
{
infile>>cities[curCounter].number;
infile>>cities[curCounter].name;
infile>>cities[curCounter].x;
infile>>cities[curCounter].y;
curCounter++;
}
}
else //文件打开失败
{
cout<<"file error!"<<endl;
exit(0);
}
infile.close();
}
void UpdateCity(int i,int num,char* na,int x,int y)//修改下标为i的城市信息,参数为下标、修改后的编号、名称、坐标
{
cities[i].setName(na);
cities[i].setNumber(num);
cities[i].setPosition(x,y);
}
int FindCIty(int num)//根据城市编号返回城市下标,参数为编号,返回值为该城市元素下标
{
int i;
for(i=0;i<curCounter;i++)
{
if(cities[i].number==num)
break;
}
if(i<curCounter)
return i;
else return -1;
}
void ShowCities()//显示全部城市信息
{
cout.setf(ios::left, ios::adjustfield); //控制格式
for(int i=0;i<curCounter;i++) //循环输出城市信息
{
cout<<"城市编号:"<<setw(10)<<cities[i].number;
cout<<"城市名称:"<<setw(10)<<cities[i].name;
cout<<"城市坐标:("<<cities[i].x<<','<<cities[i].y<< ')'<<endl;
}
}
int GetCurCounter()
{
return curCounter;
}//读取当前城市数量,无参数,返回值为当前城市数量
int GetPositionX(int i)
{
return cities[i].x;
}//返回下标为i的x坐标
int GetPositionY(int i)
{
return cities[i].y;
}//返回下标为i的y坐标
void ShowCity(int i)//显示下标为i的城市信息
{
cout.setf(ios::left,ios::adjustfield);
cout<<"城市编号:"<<setw(10)<<cities[i].number;
cout<<"城市名称:" << setw(10) << cities[i].name;
cout<<"城市坐标:("<<cities[i].x<<','<<cities[i].y<<')'<<endl;
}
void SortCities()//将城市按编号从小到大排序,利用选择排序法,城市编号为选择依据,排序对象为城市元素
{
City ct;
int i,j,p;
for(i=0;i<curCounter-1;i++) //选择排序,自己背下来代码*****
{
p=i;
for(j=i+1;j<curCounter;j++)
{
if (cities[j].number<cities[p].number)
p=j;
}
if(p!=i)
{
ct=cities[i];
cities[i]=cities[p];
cities[p]=ct;
}
}
}
};
3.Plane类
class Plane
{
private:
int number, x, y;//飞机编号、飞机坐标
char name[N];//飞机名称
double weight;//飞机重量
public:
Plane(int num=0,int x1=0,int y1=0,double wei=0,const char*na=NULL)//构造函数,参数为编号、坐标、重量、名称
{
number=num;
x=x1;
y=y1;
weight=wei;
if(na)
strcpy(name,na);
else
strcpy(name," ");
}
void SetPlane(int num,char*na, double w,int xpos,int ypos)//设置一架飞机信息,参数为编号、名称、重量、坐标
{
number=num;
strcpy(name,na);
weight=w;
x=xpos;
y=ypos;
}
void Show()//显示一架飞机信息
{
cout<<"飞机编号:"<<number<<'\t'<<"飞机名称:"<<name<<'\t'<<"飞机重量:"<< weight<<'\t'<<"飞机坐标:("<<x<<','<<y<<')'<<endl;
}
int CanBrake(double sp,double reDistance)//判断是否可以刹车,参数为当前速度,剩余跑到距离,可以则返回真(1),不可以返回假(0),如果飞机信息未设置,返回-1
{
if(number==0)
return -1;
else
{
if(weight*sp/5<reDistance)
return 1;
else return 0;
}
}
void RadarFind(double radarRadius,Map mapobj)//显示雷达半径内城市信息,参数为雷达半径、地图对象mapobj
{
double r;
int num = mapobj.GetCurCounter(); //飞机编号等于城市的数量
for(int i = 0;i<num;i++)
{
r=mapobj.Distance(x,y,mapobj.GetPositionX(i),mapobj.GetPositionY(i));
if(r<radarRadius)
mapobj.ShowCity(i);
}
} //???
int IfPlane()//判断当前是否有飞机信息,无参数,如果有,返回1,否则返回0
{
if(number==0)
return 0;
else return 1;
}
};
四、主函数代码
为了防止照搬照抄代码,主函数完整代码就不放在该篇blog上了。最重要的对飞机、地图、城市类的实现基本已经讲解完全了,通过对类的实现,从而在主函数调用相应的函数并且能够完整实现对应的功能。其实对类理解完全了过后这个程序也就实现大半了~文章来源地址https://www.toymoban.com/news/detail-475732.html
到了这里,关于南京航空航天大学民航管理系统课程设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!