南京航空航天大学民航管理系统课程设计

这篇具有很好参考价值的文章主要介绍了南京航空航天大学民航管理系统课程设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

趁着最近备战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中的一个数字),按回车后,执行相应的功能。

各菜单项功能及内部实现如下:

  1. 2                                                
  2. 1004    北京   55   30       
  3. 1005    上海   60   52
  • 增加城市信息
  • 输入城市编号、城市名称、城市坐标等信息,在城市列表尾部追加一条记录。此功能用于建立地图数据,一次只能追加一个城市信息。
  • 删除城市信息
  • 输入一个城市的编号(城市编号是城市的唯一标识,即一个编号对应一个城市,不同的城市,编号不同),首先在地图列表中查询该城市是否存在,若存在,则显示该城市信息,并提问是否删除该城市,根据回答(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()//判断当前是否有航班信息

三、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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包