案例目的
某公交公司有车辆若干。现在,需要存储这些公交的编号、名称、类型、起点站和终点站,并显示全部信息。 类型包括普通车、空调车、双层车等。
案例覆盖技能点
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(); }