#include<iostream>
#include<fstream>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iomanip>
#pragma warning(disable:4996)
#define _CRT_SECURE_NO_WARNINGS
using namespace std;
class City
{
int number;
char name[200];
int x; int y;
public:
City(int num = 0, char *n= NULL , int a = 0, int b = 0)
{
if (n)
strcpy(name, n);
else strcpy(name, " ");
number = num;
x = a;
y = b;
}
void show()
{
cout << number << '\t';
cout << name;
cout << '\t';
cout << x << '\t' << y << endl;
}
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* n) { strcpy(n, name); }
int getNum() { return number; }
int getX() { return x; }
int getY() { return y; }
};
class Map
{
City* cities;
int curCounter=0;
int maxCounter=0;
public:
Map(int maxc = 10)
{
curCounter = 0;
maxCounter = maxc;
if (maxc)
cities = new City[maxCounter];
else
cities = NULL;
}
Map(Map& m)
{
char* n = NULL;
if (m.maxCounter)
{
cities = new City[m.maxCounter];
for (int i = 0; i < m.curCounter; i++)
{
(*(cities + i)).setPosition((*(m.cities + i)).getX(), (*(m.cities + i)).getY());
((*(cities + i)).setNumber((m.cities + i)->getNum()));
(m.cities + i)->getName(n);
(*(cities + i)).setName(n);
}
}
else
cities = NULL;
}
~Map()
{
delete[] cities;
}
double Distance(int x1, int y1, int x2, int y2)
{
return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}
void AddCity(int num, char* na, int x, int y)
{
if (curCounter == maxCounter)
{
City* Newcities;
char* n = NULL;
Newcities = new City[maxCounter + 10];
for (int i = 0; i < curCounter; i++)
{
Newcities[i].setPosition(cities[i].getX(), cities[i].getY());
cities[i].getName(n);
Newcities[i].setName(n);
Newcities[i].setNumber(cities[i].getNum());
}
delete[] cities;
maxCounter += 10;
cities = Newcities;
}
cities[curCounter].setName(na);
cities[curCounter].setNumber(num);
cities[curCounter].setPosition(x, y);
curCounter++;
}
void Deletecity(int num)
{
for (int i = 0; i < maxCounter; i++)
{
if (cities[i].getNum() == num)
{
cities[i] = NULL;
break;
}
}
}
void SaveCity(char* fn)
{
ofstream out;
out.open(fn);
out << curCounter << endl;
for (int i = 0; i < curCounter; i++)
{
cities[i].getName(fn);
out << left << setw(10) << cities[i].getNum()<< left << setw(10) << fn << left << setw(10) << cities[i].getX() << left << setw(10) << cities[i].getY() << endl;
}
out.close();
}
void ReadCity(char* fn)
{
int num,x,y,cur;
char name[100] = { '\0' };
fstream in;
in.open(fn, ios::in);
if (!in)
{
cout << "can not open file" << endl;
exit(1);
}
in >> cur;
for (int i = 0; i < cur; i++)
{
in >> num >> name >> x >> y;
AddCity(num, name, x, y);
}
in.close();
}
void UpdateCity(int num)
{
int i = 0; int x, y; char* name=NULL;
for (i = 0; i < curCounter; i++)
{
if (cities[i].getNum() == num)
{
cout << "输入城市名字和坐标:" << endl;
cin >> name >> x >> y;
cities[i].setName(name);
cities[i].setPosition(x, y);
}
}
if (i = curCounter)
cout << "无信息!" << endl;
}
int FindCity(int num)
{
int i = 0;
for (i = 0; i < curCounter; i++)
{
if (cities[i].getNum() == num)
{
return num;
}
}
return i;
}
void ShowCities()
{
int i = 0;
for (i = 0; i < curCounter; i++)
{
cities[i].show();
}
}
int GetCurcounter()
{
return curCounter;
}
int GetPostionX(int num)
{
int i = 0;
for (i = 0; i < curCounter; i++)
{
if (cities[i].getNum() == num)
{
return cities[i].getX();
}
}
}
int GetPostionY(int num)
{
int i = 0;
for (i = 0; i < curCounter; i++)
{
if (cities[i].getNum() == num)
{
return cities[i].getY();
}
}
}
void ShowCity(int num)
{
int i = 0; char* name = NULL;
for (i = 0; i < curCounter; i++)
{
if (cities[i].getNum() == num)
{
cout << num << '\t';
cities[i].getName(name);
cout <<name<< '\t';
cout << cities[i].getX() << '\t' << cities[i].getY() << endl;
}
}
}
int MapGetPostionX(int i)
{
return cities[i].getX();
}
int MapGetPostionY(int i)
{
return cities[i].getY();
}
void MapShowCity(int j)
{
int i = 0; int num; char* name=NULL;
for (i = 0; i < curCounter; i++)
{
if (i==j)
{
num = cities[j].getNum();
cout << num << '\t';
cities[i].getName(name);
cout <<name<< '\t';
cout << cities[j].getX() << '\t' << cities[j].getY() << endl;
}
}
}
};
class Flight
{
int number;
char name[20];
int x; int y;
double weight;
public:
Flight(int num = 0, const char n[100]= "flight", int a=0, int b=0, float wei=0)
{
number = num;
strcpy(name, n);
x = a; y = b;
weight = wei;
}
void show()
{
cout << "number:" << number << '\t' << "name:" ;
cout << name;
cout << '\t';
cout << "coordinate:" << x << "," << y << '\t' << "weight:" << weight;
}
int CanBreak(double sp, double reDistance)
{
if (((weight * sp) / 5) < reDistance)
return 1;
return 0;
}
void RadarFind(double radarRadius, Map m)
{
for (int i = 0; i < m.GetCurcounter(); i++)
{
if (m.Distance(x, y, m.MapGetPostionX(i), m.MapGetPostionY(i)) <= radarRadius)
m.MapShowCity(i);
}
}
void SetFlight(int num, char* na, double w, int xpos, int ypos)
{
number = num;
strcpy(name, na);
weight = w; x = xpos; y = ypos;
}
int getNumber() { return number; }
int getX() { return x; }
int getY() { return y; }
double getWeight(){ return weight; }
void getName(char* na) { strcpy(na, name); }
};
class FlightList
{
Flight* flights;
int curCounter=0;
int maxCounter=0;
public:
FlightList(int maxc = 10)
{
curCounter = 0;
maxCounter = maxc;
if (maxc)
flights = new Flight[maxCounter];
else
flights = NULL;
}
FlightList(FlightList& m)
{
char* n = NULL;
if (m.maxCounter)
{
flights = new Flight[m.maxCounter];
for (int i = 0; i < m.curCounter; i++)
{
(m.flights + i)->getName(n);
(*(flights + i)).SetFlight((*(m.flights + i)).getNumber(),n, (*(m.flights + i)).getWeight(), (*(m.flights + i)).getX(), (*(m.flights + i)).getY());
}
}
else
flights = NULL;
}
~FlightList()
{
delete[] flights;
}
void AddFlight(int num, char* name, double weight, int x, int y)
{
if (curCounter == maxCounter)
{
Flight* Newflights;
char* n = NULL;
Newflights = new Flight[maxCounter + 10];
for (int i = 0; i < curCounter; i++)
{
Newflights[i] = flights[i];
}
delete[] flights;
maxCounter += 10;
flights = Newflights;
}
flights[curCounter].SetFlight(num, name, weight, x, y);
curCounter++;
}
void DeleteFlight(int num)
{
for (int i = 0; i < maxCounter; i++)
{
if (flights[i].getNumber() == num)
{
flights[i] = NULL;
break;
}
}
}
void UpdateFlight(int num)
{
int i = 0; int x, y; char* name=NULL; double w;
for (i = 0; i < curCounter; i++)
{
if (flights[i].getNumber() == num)
{
cout << "输入飞机名称、坐标和重量" << endl;
cin >> name >> x >> y>>w;
flights[i].SetFlight(num, name, w, x, y);
}
if (i = curCounter)
cout << "无信息!" << endl;
}
}
void ShowFlight()
{
int i = 0;
for (i = 0; i < curCounter; i++)
{
flights[i].show();
}
}
int GetCurCounter()
{
return curCounter;
}
int CanBreak(int num, double speed, double reD)
{
int i;
for ( i = 0; i < maxCounter; i++)
{
if (flights[i].getNumber() == num)
{
return flights[i].CanBreak(speed, reD);
break;
}
}
if (i == maxCounter)
return -1;
}
void RadarFind(int num,double rd, Map& m)
{
int x=0, y=0;
for (int i = 0; i < maxCounter; i++)
{
if (flights[i].getNumber() == num)
{
x = flights[i].getX();
y = flights[i].getY();
break;
}
}
for (int i = 0; i < m.GetCurcounter(); i++)
{
if (m.Distance(x,y,m.MapGetPostionX(i),m.MapGetPostionY(i))<=rd)
{
m.MapShowCity(i);
}
}
}
};
int menu_select()
{
const char* m[13] = { "1.appendCity",
"2.delCity",
"3.updCity",
"4.SaveToFile",
"5.ReadFromFlie",
"6.ShowAllCities",
"7.AddPlane",
"8.DeletePlane",
"9.ShowPlane",
"10.Brake",
"11.RadarFind",
"0.QUIT" };
int i, choice;
do {
system("cls");
for (i = 0; m[i]; i++)
cout << m[i] << endl;
cout << "请选择0~11中的任一功能:";
cin >> choice;
} while (choice < 0 || choice>11);
return(choice);
}
void appendCity(Map& mapObj)
{
int num, x, y; char* name=NULL;
cout << "输入城市信息" << endl;
cin >> num >> name >> x >> y;
mapObj.AddCity(num, name, x, y);
}
void delCity(Map& mapObj)
{
int num;
cout << "输入要删除的城市编号:" << endl;
cin >>num;
mapObj.Deletecity(num);
}
void updCity(Map& mapObj)
{
int num;
cout << "输入要更新的城市编号:" << endl;
cin >> num;
mapObj.UpdateCity(num);
}
void SaveToFile(Map& mapObj)
{
char* fn=NULL;
cout << "输入需要存入的文件名:" << endl;
cin >> fn;
mapObj.SaveCity(fn);
}
void ReadFromFile(Map& mapObj)
{
char* fn=NULL;
cout << "输入需要读取的文件名:" << endl;
cin >> fn;
mapObj.ReadCity(fn);
}
void ShowAllCities(Map& mapObj)
{
mapObj.ShowCities();
}
void AddFlight(FlightList& FlightObj)
{
int num, x, y; double weight; char* name=NULL;
cout << "输入航班信息:" << endl;
cin >> num >> name >> weight >> x >> y;
FlightObj.AddFlight(num, name, weight, x, y);
}
void DeleteFlight(FlightList& FlightObj)
{
int num;
cout << "输入要删除的飞机编号:" << endl;
cin >> num;
FlightObj.DeleteFlight(num);
}
void ShowFlight(FlightList& FlightObj)
{
FlightObj.ShowFlight();
}
void Break(FlightList& FlightObj)
{
double sp, reD; int num;
cout << "输入需要查询的航班编号、速度和剩余跑道长度" << endl;
cin >> num>>sp >> reD;
if (FlightObj.CanBreak(num, sp, reD) == 1)
cout << "可以刹车" << endl;
else if (FlightObj.CanBreak(num, sp, reD) == 0)
cout << "不可以刹车" << endl;
else cout << "无航班信息" << endl;
}
void RadarSearch(FlightList& FlightObj,Map&m)
{
int num; double rd;
cout << "输入航班编号和雷达半径" << endl;
cin >> num>>rd;
FlightObj.RadarFind(num, rd, m);
}
char Quit(Map& mapObj)
{
char li;
cout << "确认退出?(请输入y或者n)";
cin >> li;
if (li == 'y')
{
char fn[15] = "D:\\map.txt";
mapObj.SaveCity(fn);
return 'y';
}
else return 'n';
}
int main()
{
Map mapObj;
FlightList flObj;
int sel;
for (; ; )
{
switch (sel = menu_select())
{
case 1: appendCity(mapObj);
system("pause"); break;
case 2: delCity(mapObj);
system("pause"); break;
case 3: updCity(mapObj);
system("pause"); break;
case 4: SaveToFile(mapObj);
system("pause"); break;
case 5: ReadFromFile(mapObj);
system("pause"); break;
case 6: ShowAllCities(mapObj);
system("pause"); break;
case 7: AddFlight(flObj);
system("pause"); break;
case 8: (flObj);
system("pause"); break;
case 9: ShowFlight(flObj);
system("pause"); break;
case 10: Break(flObj);
system("pause"); break;
case 11: RadarSearch(flObj, mapObj);
system("pause"); break;
case 0:
if (Quit(mapObj) != 'y')
continue;
}
if (sel == 0) break;
}
return 0;
}