总体描述:本程序实现了通过C++语言,实现了对于民航飞机以及地图等信息的简易管理。从txt文件中读取城市信息,通过此程序对于城市信息的增添、删除以及修改后,设置飞机信息,判断飞机是否可以降落,并查询飞机雷达半径中所有城市的信息。
按照实现菜单给出每个选项的功能:
1、增加城市信息
2、删除城市信息
3、修改城市信息
4、保存城市信息至文件
5、从文件读取城市信息
6、显示所有城市信息
7、设置飞机信息
8、显示飞机信息
9、判断起飞飞机是否可以刹车
10、查询飞机雷达半径内所有城市信息
0、询问用户是否确定退出
(1)void appendCity(Map& mapObj);//追加城市记录
实现:提示用户输入城市信息,然后通过mapObj对象调用AddCity()成员函数将输入的城市信息追加到线性表尾部。
(2)void delCity(Map& mapObj); // 删除城市记录
实现:提示用户输入城市编号,则通过mapObj对象调用FindCity()判断城市是否存在,若存在,则通过mapObj对象调用DeleteCity()成员函数删除对应的城市信息,否则显示信息:该城市不存在。
(3)void updCity(Map& mapObj);//修改城市记录
实现:提示用户输入城市编号,然后通过mapObj对象调用FindCity()成员函数查询到城市编号对应的数据存在后,首先显示该城市信息,提示输入新数据,然后修改对应的城市信息。
(4)void SaveToFile(Map& mapObj);//保存城市信息,写入磁盘文件
实现:提示用户输入磁盘文件名,通过mapObj对象调用SaveCity()成员函数,按照文件格式将所有城市信息写入该磁盘中。
(5)void ReadFroFile(Map& mapObj);//从磁盘文件读取城市信息
实现:提示用户输入磁盘文件名,通过mapObj对象调用ReadCity()成员函数,按照文件格式从磁盘文件读取城市信息,追加入地图信息列表中。
(6)void ShowAllCities(Map& mapObj);//显示全部城市信息
实现:判断若线性表中有城市,则通过mapObj对象调用ShowCities()成员函数,显示当前地图信息列表中所有的城市信息;否则显示:当前没有城市信息。
(7)void AddPlane(Plane& planeObj);//输入飞机信息
实现:提示用户输入飞机信息,通过planeObj对象调用SetPlane()成员函数将输入的信息写入飞机对象中。
(8)void ShowPlane(Plane& planeObj);//显示飞机信息
实现:通过planeObj对象调用show()成员函数,显示当前飞机对象中的各种信息。
(9)void Brake(Plane& planeObj);//判断起飞时是否可以刹车
实现:提示输入当前飞机的速度和剩余跑道长度,通过planeObj对象调用CanBrake()成员函数,该函数返回是否可以刹车的信息。根据返回值输出对应的结果,返回1显示可以刹车,返回0显示不可以刹车,返回-1显示没有飞机信息。
(10)void RadarSearch(Plane& planeObj, Map& mapObj);//计算所有城市的距离,小于飞机雷达范围内的城市,显示其城市信息
实现:提示输入雷达扫描半径,通过对象planeObj调用RadarFind()成员函数,显示距当前飞机在雷达扫描半径内所有的城市信息
(0)char Quit(Map& mapObj);//退出处理
实现:询问用户是否确定退出,用户可输入一个字符’y’或’n’,若用户回答’y’,则将通过mapObj对象调用SaveCity()成员函数将cities[]内容写入数据文件database.txt。本函数返回用户回答的字符’y’或’n。
文档名为map.txt
内容为
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cstring>
#include <cmath>
#include <bits/stdc++.h>
using namespace std;
class City //定义一个类City用于表示城市各种信息
{
private: //私有数据成员:城市的编号,名称,坐标
int number; //城市编号
char name[25]; //城市名称
int x,y; //城市坐标
public: //公有成员函数:如下
City(int num=1000,const char na[25]=" ",int xpos=0,int ypos=0) //构造函数,各参数均有缺省值
{
number=num;
strcpy(name,na);
x=xpos;y=ypos;
}
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 *);
int getNum() //读取城市编号
{
return number;
}
int getX() //读取城市x轴坐标
{
return x;
}
int getY() //读取城市y轴坐标
{
return y;
}
void show() //输出城市的编号,名称,坐标
{
cout.setf(ios::left,ios::adjustfield);
cout<<setw(8)<<number<<setw(10)<<name<<setw(5)<<x<<setw(5)<<y<<endl;
}
friend class Map; //定义Map为City的友元函数
};
void City::getName(char *na) //在类外定义,读取城市名称
{
strcpy(na,name);
}
class Map //定义一个类,地图信息记录
{
private: //私有数据成员
City *cities; //City类型指针,指向一个动态申请的对象数组,每一个元素是一个城市信息的记录,数组相当于cities【maxCounter】
int curCounter,maxCounter; //现有城市记录,线性表最大长度
public: //公有成员函数
Map(int maxc=10) //构造函数,初始化城市信息列表,即动态申请线性表空间
{
curCounter = 0;
maxCounter = maxc;
if (maxc)
cities = new City[maxCounter];
else
cities = NULL;
}
void ReadCity(char *filename) //将文件中的城市信息读取并追加到内存地图信 息列表里
{
fstream infile;
infile.open(filename,ios::in);
while(!infile.eof())
{
if(curCounter==maxCounter)
{
City *newcities;
newcities=new City[maxCounter+10];
for(int i=0;i<curCounter;i++)
{
newcities[i]=cities[i];
}
delete []cities;
maxCounter=maxCounter+10;
cities=newcities;
}
infile>>cities[curCounter].number>>cities[curCounter].name>>cities[curCounter].x>>cities[curCounter].y;
curCounter++;
}
infile.close();
}
void ImportDataBase() //判断若文件append.text存在,则调用ReadCity()函数将文件内容读入cities【】中,若文件不存在,不报错。
{
fstream infile;
infile.open("append.txt",ios::in);
if(infile)
{char* name=(char*)"append.txt";
ReadCity(name);
}
infile.close();
}
Map(Map &m) //拷贝构造函数
{
cities=new City[maxCounter];
for(int i=0;i<maxCounter;i++)
{
cities[i]=m.cities[i];
curCounter=m.curCounter;
maxCounter=m.maxCounter;
}
}
~Map() //析构函数,释放线性表空间
{
delete [] cities;
}
double Distance(int x1,int y1,int x2,int y2) //计算两坐标之间的距离
{
double d=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
d=sqrt(d);
return d;
}
void AddCity(int num,char *na,int x,int y)
//在地图信息列表的最后增加一个新的城市信息,参数是城市编号,城市数据 ,城市坐标
{
City city(num,na,x,y);
if(curCounter==maxCounter)
{
City *newcities;
newcities=new City[maxCounter+10];
for(int i=0;i<curCounter;i++)
{
newcities[i]=cities[i];
}
delete []cities;
maxCounter=maxCounter+10;
cities=newcities;
}
cities[curCounter++]=city;
}
void DeleteCity(int m) //根据城市编号删除城市信息
{
int n=0,i,j;
for( i=0;i<curCounter;i++)
if(cities[i].number==m)
for(j=i;j<curCounter-1;j++)
cities[j]=cities[j+1];
curCounter--;
}
void SaveCity(char *filename) //将城市地图信息列表cities【】中的信息存入文件filename中
{
fstream outfile;
outfile.open(filename,ios::out);
outfile<<curCounter<<endl;
for(int i=0;i<curCounter;i++)
{
outfile.setf(ios::left,ios::adjustfield);
outfile<<setw(8)<<cities[i].number<<setw(10)<<cities[i].name<<setw(5)<<cities[i].x<<setw(5)<<cities[i].y<<endl;
}
outfile.close();
}
void UpdateCity(int i,int num,char *na,int x,int y)
{
for(int j=0;j<curCounter;j++)
if(cities[j].number==i)
{
cities[i].number=num;
strcpy(cities[i].name,na);
cities[i].x=x;
cities[i].y=y;
}
}
int FindCity(int num) //根据城市编号查找城市信息,返回下标,若不存在则返回-1.
{
for(int i=0;i<curCounter;i++)
if(cities[i].number==num)
return i;
return -1;
}
void showCities() //显示全部城市信息
{
for(int i=0;i<curCounter;i++)
cities[i].show();
}
int GetCurCounter() //读取当前城市数量
{
return curCounter;
}
int GetPostionX(int i) //返回下标为i的城市坐标x
{
return cities[i].x;
}
int GetPostionY(int i) //返回下标为i的城市坐标y
{
return cities[i].y;
}
void ShowCity(int i) //显示下标为i的城市信息
{
cities[i].show();
}
};
class Plane //定于一一个类,飞机信息记录
{
private: //私有数据成员
int number; //飞机编号
char name[25]; //飞机名称
int x,y; //飞机坐标x,y
double weight; //飞机重量,吨
public: //公有成员函数
Plane(int num=1000,const char na[25]=" ",int xpos=0,int ypos=0,double w=0)
//构造函数,各参数均有缺省值
{
number=num;
strcpy(name,na);
x=xpos;y=ypos;
weight=w;
}
void show() //显示一架飞机的信息
{
cout.setf(ios::left,ios::adjustfield);
cout<<setw(10)<<"飞机编号"<<setw(10)<<"飞机名称"<<setw(10)<<"飞机坐标x"<<setw(12)<<"飞机坐标y"<<setw(11)<<"质量"<<endl;
cout<<setw(10)<<number<<setw(11)<<name<<setw(11)<<x<<setw(11)<<y<<setw(10)<<weight<<endl;
}
int CanBrake(double v,double reDistance) //判断飞机是否可以刹车,v为当前飞机速度,reDistance为剩余跑道长度
{
if(weight=0)
return -1;
if(weight*v/5<reDistance)
return 1;
else return 0;
}
void RadarFind(double radarRadius,Map mapObj) //根据飞机当前坐标以及雷达扫描半径,扫描地图信息,将半径以内的城市信息显示出来
{
int m=mapObj.GetCurCounter();
for(int i=0;i<m;i++)
{
int x1=mapObj.GetPostionX(i);
int y1=mapObj.GetPostionX(i);
if((x1-x)*(x1-x)+(y1-y)*(y1-y)<radarRadius)
mapObj.ShowCity(i);
}
}
void SetPlane(int num,char *na,double w,int xpos,int ypos) //设置飞机信息
{
number=num;
strcpy(name,na);
x=xpos;y=ypos;
weight=w;
}
};
int menu_select()
{
int num;
cout << "*****************************************"<<endl;
cout << "1.增加城市信息" << endl;
cout << "2.删除城市信息" << endl;
cout << "3.修改城市信息" << endl;
cout << "4.保存城市信息至文件" << endl;
cout << "5.从文件读取城市信息"<<endl;
cout << "6.显示所有城市信息\n";
cout << "7.设置飞机信息\n";
cout << "8.显示飞机信息\n";
cout << "9.判断起飞飞机是否可以刹车\n";
cout << "10.查询飞机雷达半径内所有城市信息\n";
cout << "0.退出\n";
cout << "*****************************************"<<endl;
do
{
cout << "请输入选择:";
cin >> num;
system("cls");
} while (num < 0 || num>10);
return num;
}
void appendCity(Map &mapObj) //追加城市记录
{
int num,x,y;
char na[25]={"\0"};
cout<<"请输入城市信息:";
cin>>num>>na>>x>>y;
mapObj.AddCity(num,na,x,y);
}
void delCity(Map &mapObj) //删除成城市纪录
{
int num;
cout<<"请输入城市编号:";
cin>>num;
if(mapObj.FindCity(num)!=-1)
{
char c;
cout<<"是否确定删除该城市(y/n):";
cin>>c;
switch(c)
{
case('y'||'Y'):
mapObj.DeleteCity(num);
default:break;
}
}
else
cout<<"该城市不存在"<<endl;
}
void updCity(Map &mapObj) //修改城市记录
{
int num,x,y;
char na[25]={"\0"};
cout<<"请输入城市编号:";
cin>>num;
int i=mapObj.FindCity(num);
if(i!=-1)
{
cout<<"请输入城市信息:";
cin>>na>>x>>y;
mapObj.UpdateCity(i,num,na,x,y);
}
else
cout<<"该城市不存在"<<endl;
}
void SaveToFile(Map &mapObj) //保存城市信息,写入磁盘文件
{
char name[25]={"\0"};
cout<<"请输入磁盘文件名:";
cin>>name;
mapObj.SaveCity(name);
}
void ReadFromFile(Map &mapObj) //从磁盘文件中读取当前城市信息
{
char name[25]={"\0"};
cout<<"请输入磁盘文件名:";
cin>>name;
mapObj.ReadCity(name);
}
void ShowAllCities(Map &mapObj) //展示所有城市信息
{
if(mapObj.GetCurCounter()>0)
mapObj.showCities();
else
cout<<"当前没有城市信息"<<endl;
}
void AddPlane(Plane &planeObj) //输入飞机信息
{
int num,x,y,w;
char na[25]={"\0"};
cout<<"请输入飞机信息:";
cout << "飞机编号:";
cin >> num;
cout << "飞机名称:";
cin >> na;
cout << "飞机重量(吨):";
cin >> w;
cout << "飞机坐标(x,y):";
cin >> x >> y;
planeObj.SetPlane(num,na,w,x,y);
}
void ShowPlane(Plane &planeObj) //显示飞机信息
{
planeObj.show();
}
void Brake(Plane &planeObj) //判断起飞时是否可以刹车
{
double reDistance,sp;
cout<<"请输入飞机的速度(km/h):"<<endl;
cin>>sp;
cout<<"剩余跑道的长度(m):"<<endl;
cin>>reDistance;
if(planeObj.CanBrake(sp,reDistance)==1)
cout<<"可以刹车"<<endl;
else if(planeObj.CanBrake(sp,reDistance)==0)
cout<<"不可以刹车"<<endl;
else
cout<<"没有飞机信息"<<endl;
}
void RadarSearch(Plane &planeObj, Map &mapObj) //显示planeObj与mapObj中所有的城市距离小于雷达半径的城市信息
{
double radarRadius=0;
cout<<"请输入雷达扫描半径(km):";
cin>>radarRadius;
planeObj.RadarFind(radarRadius,mapObj);
}
char Quit(Map &mapObj) //退出处理
{
char c;
cout<<"是否确定退出:";
cin>>c;
if(c=='y')
{char* name=(char*)"map.txt";
mapObj.SaveCity(name);
return 'y';
}
if(c=='n')
return 'n';
return 0;
}
int main() //主函数
{
Map mapObj; //定义地图对象
Plane planeObj; //定义飞机对象
int sel=0;
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: AddPlane(planeObj); //输入飞机信息
system("pause");break;
break;
case 8: ShowPlane(planeObj); //显示飞机信息
system("pause");
break;
case 9: Brake(planeObj); //判断飞机起飞是否可以刹车
system("pause");
break;
case 10:RadarSearch(planeObj, mapObj); //显示当前在飞机雷达扫描半径以内的所有城市信息
system("pause");
break;
case 0: if(Quit(mapObj)!='y') //退出处理
continue;
}
if(sel==0)
break;
}
return 0;
}
程序几乎可以运行,但是无法进行磁盘文件读取,就比如程序的"case5"无法显示文件内容,其他还有不合适的地方请指出来,谢谢
程序能够基本按照要求运行起来,可将修改后的程序发给我
不能大改
void ReadCity(char *filename) //将文件中的城市信息读取并追加到内存地图信 息列表里
{
fstream infile;
infile.open(filename,ios::in);
int cityC ;
infile>>cityC;
while(!infile.eof())
{
if(curCounter==maxCounter)
{
City *newcities;
newcities=new City[maxCounter+10];
for(int i=0;i<curCounter;i++)
{
newcities[i]=cities[i];
}
delete []cities;
maxCounter=maxCounter+10;
cities=newcities;
}
infile>>cities[curCounter].number>>cities[curCounter].name>>cities[curCounter].x>>cities[curCounter].y;
curCounter++;
}
infile.close();
}
用上面的替代你原来的就可以正确读取啦。
不过这仅仅是功能上的可用。
不过读取上的逻辑可能还有问题,因为重复读取同一个文件,会让数据持续增加,即存在重复城市数据。
我帮你看下
读取信息的格式和实际文件的格式不匹配:第一行内容只有一个数字,和第二行及之后的数据读取格式不同
你跟踪一下代码,看看void ReadCity(char *filename)有没有读到文件
(文件是否需要完整路径)