案例目的
某公交公司有车辆若干。现在,需要存储这些公交的编号、名称、类型、起点站和终点站,并显示全部信息。 类型包括普通车、空调车、双层车等。
案例覆盖技能点
a) C++基本语法和常用算法
b) 文件操作
c) 面向对象的使用
案例需求
1)公交编号在生成公交车信息时同时生成,每输入一辆公交车信息编号顺序加1。
2)能按名称或者编号显示、查找、增加、删除和保存各类公交的信息。
功能列表:
1)添加车辆
添加车辆由键盘输入进行。输入时,程序会自动判断输入信息是否重复,若输入值不符合要求,则提示无法录入
2)增加车辆信息
在类中包含了增加车辆信息的函数,可以将录入的车辆信息增加到信息总表中。
3)删除车辆信息
删除车辆信息,这个车辆之后的车辆编号会减一。
4)查找车辆信息
查找车辆可以由编号、名称的方式完成。
5)显示所有车辆信息以表格格式显示。
code:
#include <iostream>
#include <cstdlib>
#include <string.h>
#include <stdio.h>
#include<iomanip>
#include <fstream>
using namespace std;
#define N 20 //公交车最多辆数
class Bus
{
/*
Bus类,用来描述车辆属性,包括number()
name()、type()、start()、terminal()
*/
public:
int number; //编号
char name[10]; //名称(即路线)
char type[10]; //车型
char start[10]; //起点站
char terminal[10];//终点站
/*
默认构造函数,将对象所有属性赋初值0或空字符串
*/
Bus()
{
number=0;
name[0]='0';
type[0]='0';
start[0]='0';
terminal[0]='0';
}
Bus(int number1,char *name1,char *type1,char *start1,char *terminal1)
{
number=number1;
strcpy(name,name1);
strcpy(type,type1);
strcpy(start,start1);
strcpy(terminal,terminal1);
}
~Bus(); //析构函数
};
class Company
{
/*
拥有指向Bus类的对象数组指针,和所有的车辆信息处理函数
*/
public:
int size;
Bus *bus[N];
Bus *bus1;
Company();
~Company();
void welcome(); //欢迎界面
void Keyboard_entry(); //键盘录入主菜单
void AddBus(); //增加车辆
bool AddBus1(int number,char *name,char *type,char *start,char *terminal); //增加车辆
void DeleteBus(); //删除车辆
bool DeleteBus2(int number);
void FindBusNum();
bool FindBusNum1(int number); //判断车辆信息是否存在,按序号查找车辆
void FindBusNam();
bool FindBusNam1(char *name1); //判断车辆信息是否存在,按名称查找车辆
void FindBusStart();
bool FindBusStart1(char *start1); //判断车辆信息是否存在,按始发站查找车辆
void FindBusterminal();
bool FindBusterminal1(char *terminal1); //判断车辆信息是否存在,按终点站查找车辆
void DispAll(); //显示全部车辆
void show(); //用于删除车辆的显示全部车辆
void Check_station(); //查看所有车站
void Save_file(); //存储到文件
void File_input(); //从文件读取
};
Company::Company() //Company类构造函数,初始化bus类
{
size=0;
for(int i=0; i<N; i++)
{
bus[i]=NULL;
}
}
Company::~Company() {} //Company类析构函数
void Company::welcome() //欢迎界面,主菜单
{
int choose;
cout<<"------------------------------"<<endl;
cout<<" 欢迎使用公交车管理系统 "<<endl;
cout<<"------------------------------"<<endl<<endl;
cout<<"请选择数据来源:"<<endl;
cout<<"1、从文件输入"<<endl;
cout<<"2、键盘录入"<<endl;
cin>>choose;
if(choose==1)
{
File_input(); //从文件读取信息
}
else if(choose==2)
{
Keyboard_entry(); //键盘录入信息
}
else
{
cout<<"输入有误!请重新输入"<<endl;
welcome();
}
}
void Company::Keyboard_entry() //键盘录入,主菜单
{
int order;
cout<<"请选择您要进行的操作:"<<endl;
cout<<" 1、添加车辆"<<endl;
cout<<" 2、删除车辆"<<endl;
cout<<" 3、显示全部车辆"<<endl;
cout<<" 4、查找车辆"<<endl;
cout<<" 5、查看所有车站"<<endl;
cout<<" 6、存储到文件"<<endl;
cout<<" 7、退出程序"<<endl;
cin>>order;
switch(order)
{
case 1:
AddBus(); //增加车辆
break;
case 2:
DeleteBus(); //删除车辆
break;
case 3:
DispAll(); //显示全部车辆
break;
case 4:
cout<<"请选择查找车辆的方式:"<<endl;
cout<<"1、按名称查找"<<endl;
cout<<"2、按编号查找"<<endl;
cout<<"3、按始发站查找"<<endl;
cout<<"4、按终点站查找"<<endl;
cin>>order;
if(order==1)
FindBusNam(); //判断车辆信息是否存在,按名称查找车辆
else if(order==2)
FindBusNum(); //判断车辆信息是否存在,按序号查找车辆
else if(order==3)
FindBusStart(); //判断车辆信息是否存在,按始发站查找车辆
else if(order==4)
FindBusterminal(); //判断车辆信息是否存在,按终点站查找车辆
else
cout<<"输入错误!退出程序..."<<endl;
exit(1);
break;
case 5:
Check_station(); //查看所有车站
break;
case 6:
Save_file(); //存储到文件
break;
case 7:
cout<<"您已退出程序!"<<endl;
exit(1);
default:
cout<<"输入错误,请重新输入"<<endl;
Keyboard_entry();
}
}
void Company::File_input()
{
// 需要运用读入文件知识实现,
int i=0;
Bus *BB;
ifstream infile("GJ.txt",ios::in);
//以输入方式打开磁盘文件
if(!infile)
{
cerr<<"open error!"<<endl;
exit(1);
}
for(i=0; i<size; i++)
{
BB=bus[i];
infile>>BB->number>>BB->name>>BB->start>>BB->terminal;
cout<<"添加公交车"<<BB->name<<"成功"<<endl;
}
cout<<"读取到"<<i<<"组数据"<<endl;
cout<<"请按任意键继续..."<<endl;
fflush(stdin);
getchar();
Keyboard_entry(); //读入文件后返回键盘录入
}
bool Company::AddBus1(int number,char *name,char *type,char *start,char *terminal)
{
int i;
Bus *bb;
bb= new Bus(number,name,type,start,terminal);
for(i=0; i<size; i++)
{
bus1=bus[i];
if(strcmp(bus1->name,name)==0)
{
if(strcmp(bus1->type,type)==0)
{
if(strcmp(bus1->start,start)==0)
{
if(strcmp(bus1->terminal,terminal)==0)
{
cout<<"此公交车信息已存在,录入失败!"<<endl;
return false;
}
}
}
}
}
if(i==size)
{
bus[size]=bb;
size++;
cout<<"车辆信息录入成功!"<<endl;
return true;
}
else
return false;
}
void Company::AddBus() //增加车辆
{
/*
Company类的函数,用于判断输入的车辆信息是否重复,并将没有重复的信息增加到信息总表中去
*/
int number22; //编号
char name22[10]; //名称(即路线)
char type22[10]; //车型
char start22[10]; //起点站
char terminal22[10];//终点站
int type;
char ty[10];
cout<<"-->>添加车辆"<<endl;
cout<<"您正在增加车辆"<<endl;
cout<<"请输入车辆编号:"<<endl;
cin>>number22;
cout<<"请输入车辆名称:"<<endl;
cin>>name22;
cout<<"请输入车辆类型:"<<endl;
cout<<"0.其他 1.普通车 2.空调车 3.双层车"<<endl;
cin>>type;
switch(type)
{
case 0:
strcpy(ty,"其他类型");
strcpy(type22,ty);
break;
case 1:
strcpy(ty,"普通车");
strcpy(type22,ty);
break;
case 2:
strcpy(ty,"空调车");
strcpy(type22,ty);
break;
case 3:
strcpy(ty,"双层车");
strcpy(type22,ty);
break;
default:
cout<<"输入有误!"<<endl;
AddBus();
}
cout<<"请输入车辆起点:"<<endl;
cin>>start22;
cout<<"请输入车辆终点:"<<endl;
cin>>terminal22;
AddBus1(number22,name22,type22,start22,terminal22);
cout<<"请按任意键继续..."<<endl;
fflush(stdin);
getchar();
Keyboard_entry();
}
bool Company::DeleteBus2(int number)
{
int i;
for(i=0; i<size; i++)
{
bus1=bus[i];
if(bus1->number==number)
{
for(int j=i; j<size; j++)
{
bus1=bus[j];
(bus1->number)--;
bus[j]=bus[j+1];
if(j==size-1)
number=bus1->number ;
}
cout<<"该车信息已删除!"<<endl;
size--;
return true;
}
}
if(i==size)
{
cout<<"未找到该车信息,无法删除!"<<endl;
return false;
}
return false;
}
void Company::DeleteBus() //删除车辆
{
/*
Company类的函数,根据用户输入的车辆名称判断车辆信息是否存在,
若存在,查找并显示所有此名称的车辆,再提示用户根据显示出的车辆信息选择要删车的车辆
*/
int num;
cout<<"-->>删除车辆"<<endl;
show();
cout<<"请选择要删除的车辆的编号:"<<endl;
cin>>num;
DeleteBus2(num);
cout<<"请按任意键继续..."<<endl;
fflush(stdin);
getchar();
Keyboard_entry();
}
bool Company::FindBusNum1(int number)
{
int i;
for(i=0; i<size; i++)
{
bus1=bus[i];
if(bus1->number==number)
{
cout<<bus1->number<<"号公交车的信息为:"<<endl;
cout<<setiosflags(ios::left)<<" * "<<setw(8)<<"编号"<<setw(8)<<"名称"<<setw(8)<<"类型"<<setw(8)<<"起点站"<<setw(8)<<"终点站"<<"*"<<endl;
cout<<setiosflags(ios::left)<<" * "<<setw(8)<<bus1->number<<setw(8)<<bus1->name<<setw(8)<<bus1->type<<setw(8)<<bus1->start<<setw(8)<<bus1->terminal<<setw(8)<<"*"<<endl;
return true;
}
}
if(i==size)
{
cout<<"无该车任何信息!"<<endl;
return false;
}
return false;
}
void Company::FindBusNum() //判断车辆信息是否存在,查找车辆
{
int account;
cout<<"请输入要查找的车辆编号:";
cin>>account;
FindBusNum1(account);
cout<<"请按任意键继续..."<<endl;
fflush(stdin);
getchar();
Keyboard_entry();
}
bool Company::FindBusNam1(char *name1)
{
for(int i=0; i<size; i++)
{
bus1=bus[i];
if(strcmp(bus1->name,name1)==0)
{
cout<<"路线名称为"<<bus1->name<<"的公交车的信息为:"<<endl;
cout<<setiosflags(ios::left)<<" * "<<setw(8)<<"编号"<<setw(8)<<"名称"<<setw(8)<<"类型"<<setw(8)<<"起点站"<<setw(8)<<"终点站"<<"*"<<endl;
cout<<setiosflags(ios::left)<<" * "<<setw(8)<<bus1->number<<setw(8)<<bus1->name<<setw(8)<<bus1->type<<setw(8)<<bus1->start<<setw(8)<<bus1->terminal<<setw(8)<<"*"<<endl;
return true;
}
if(i==size)
{
cout<<"无该车任何信息!"<<endl;
return false;
}
return false;
}
}
void Company::FindBusNam() //判断车辆信息是否存在,查找车辆
{
char name11[10];
cout<<"请输入要查找车辆的名称:"<<endl;
cin>>name11;
FindBusNam1(name11);
cout<<"请按任意键继续..."<<endl;
fflush(stdin);
getchar();
Keyboard_entry();
}
bool Company::FindBusStart1(char *start1)
{
for(int i=0; i<size; i++)
{
bus1=bus[i];
if(strcmp(bus1->start,start1)==0)
{
cout<<"始发站为"<<bus1->start<<"的公交车的信息为:"<<endl;
cout<<setiosflags(ios::left)<<" *"<<setw(8)<<"编号"<<setw(8)<<"名称"<<setw(8)<<"类型"<<setw(8)<<"起点站"<<setw(8)<<"终点站"<<"*"<<endl;
cout<<setiosflags(ios::left)<<" *"<<setw(8)<<bus1->number<<setw(8)<<bus1->name<<setw(8)<<bus1->type<<setw(8)<<bus1->start<<setw(8)<<bus1->terminal<<setw(8)<<"*"<<endl;
return true;
}
if(i==size)
{
cout<<"无该车任何信息!"<<endl;
return false;
}
return false;
}
}
void Company::FindBusStart() //判断车辆信息是否存在,查找车辆
{
char start11[10];
cout<<"请输入要查找车辆的始发站:"<<endl;
cin>>start11;
FindBusStart1(start11);
cout<<"请按任意键继续..."<<endl;
fflush(stdin);
getchar();
Keyboard_entry();
}
bool Company::FindBusterminal1(char *terminal1)
{
for(int i=0; i<size; i++)
{
bus1=bus[i];
if(strcmp(bus1->terminal,terminal1)==0)
{
cout<<"终点站为"<<bus1->terminal<<"的公交车的信息为:"<<endl;
cout<<setiosflags(ios::left)<<" *"<<setw(8)<<"编号"<<setw(8)<<"名称"<<setw(8)<<"类型"<<setw(8)<<"起点站"<<setw(8)<<"终点站"<<"*"<<endl;
cout<<setiosflags(ios::left)<<" *"<<setw(8)<<bus1->number<<setw(8)<<bus1->name<<setw(8)<<bus1->type<<setw(8)<<bus1->start<<setw(8)<<bus1->terminal<<setw(8)<<"*"<<endl;
return true;
}
if(i==size)
{
cout<<"无该车任何信息!"<<endl;
return false;
}
return false;
}
}
void Company::FindBusterminal() //判断车辆信息是否存在,按终点站查找车辆
{
char terminal11[10];
cout<<"请输入要查找车辆的终点站:"<<endl;
cin>>terminal11;
FindBusterminal1(terminal11);
cout<<"请按任意键继续..."<<endl;
fflush(stdin);
getchar();
Keyboard_entry();
}
void Company::DispAll() //显示全部车辆
{
cout<<setiosflags(ios::left)<<" * "<<setw(8)<<"编号"<<setw(8)<<"名称"<<setw(8)<<"类型"<<setw(8)<<"起点站"<<setw(8)<<"终点站"<<"*"<<endl;
for(int i=0; i<size; i++)
{
bus1=bus[i];
cout<<setiosflags(ios::left)<<" * "<<setw(8)<<bus1->number<<setw(8)<<bus1->name<<setw(8)<<bus1->type<<setw(8)<<bus1->start<<setw(8)<<bus1->terminal<<setw(8)<<"*"<<endl;
}
cout<<endl;
cout<<"请按任意键继续..."<<endl;
fflush(stdin);
getchar();
Keyboard_entry();
/*
Company类的函数,输出所有车辆信息
*/
}
void Company::show() //显示车辆信息,用于删除车辆
{
cout<<setiosflags(ios::left)<<" * "<<setw(8)<<"编号"<<setw(8)<<"名称"<<setw(8)<<"类型"<<setw(8)<<"起点站"<<setw(8)<<"终点站"<<"*"<<endl;
for(int i=0; i<size; i++)
{
bus1=bus[i];
cout<<setiosflags(ios::left)<<" * "<<setw(8)<<bus1->number<<setw(8)<<bus1->name<<setw(8)<<bus1->type<<setw(8)<<bus1->start<<setw(8)<<bus1->terminal<<setw(8)<<"*"<<endl;
}
cout<<endl;
}
void Company::Check_station() //查看所有车站
{
cout<<"所有公交车站有:"<<endl;
for(int i=0;i<size;i++)
{
bus1=bus[i];
cout<<bus1->start<<", "<<bus1->terminal<<" ";
}
cout<<endl<<endl;
cout<<"请按任意键继续..."<<endl;
fflush(stdin);
getchar();
Keyboard_entry();
}
void Company::Save_file() //存储到文件
{
ofstream outfile("GJ.txt",ios::out);
if(!outfile)
{
cerr<<"open error!"<<endl;
exit(1);
}
for(int i=0; i<size; i++)
{
outfile<<bus[i]<<endl;
}
outfile.close();
cout<<"读入文件成功"<<endl<<endl;
cout<<"请按任意键继续..."<<endl;
fflush(stdin);
getchar();
Keyboard_entry(); //读入文件后返回键盘录入
}
int main()
{
Company bus;
bus.welcome();
}