#14+朱晓杰+简单的车位管理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计报告
课程:面向对象程序设计
学号:10262014
姓名:朱晓杰
班级:10计31班
教师:张文斌
徐州师范大学
计算机科学和技术学院
课程设计名称:简单的车位管理
1.设计内容:
随着家庭购买汽车的增加,停车场车位紧张的问题越来越突出。
请根据题目要求完成简单的车位管理程序。
1.1.停车场有若干停车位(为说明问题,假定为3个),每个位置可以存放不同种类的的汽车,包括卡车Truck,客车Carriage和小轿车Car,但同一时刻一个位置只能存放0或1辆汽车。
1.2.管理系统模拟实际车辆停车的情况:新来车辆时如果有空位,按顺序为该车分配停车位;车辆开走时,交纳相应停车费;统计各类车辆的数量。
1.3.定义描述停车场的类Park,其中有3个位置用于存放各类车辆。
1.4.定义基类Automobile,至少包括纯虚函数Pay用于显示车辆信息并交纳相应停车费。
1.5.定义派生类Truck,Carriage和Car,这些车辆除了拥有车牌号(字符串)、车辆已使用年数(整数)之外,Truck还拥有载重量(浮点数,单位吨)属性,Carriage还拥有乘坐人数(整数,单位人)属性,Car还拥有排气量(浮点数,单位L)属性。
具体实现上述纯虚函数Pay,显示每类车辆的相应信息,并给出计价提示,其
中Truck收费2元/小时,Carriage收费1.5元/小时,Car收费1元/小时。
1.6.重载输入“>>”操作符,使得可以通过cin直接读入每类车辆的相应信息。
1.7.编写main函数,测试上述所要求的各种功能,即根据菜单命令为新来车辆分配停车位、开走车辆(输入车位编号)时付费、显示停车场中各类车辆的数量。
2.设计目的和要求:
2.1设计目的:
达到熟练掌握C++语言的基本知识和技能;
基本掌握面向对象程序设计的基本思路和方法;
能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。
2.2设计要求:
要求利用面向对象的方法以及C++的编程思想来完成系统的设计;
要求在设计的过程中,建立清晰的类层次;
在系统的设计中,至少要用到面向对象的一种机制。
3设计环境或器材、原理和说明:
3.1主要知识点
运算符重载增加了C++语言的可扩充性。
运算符的重载实际上就是一种函数调用的形式,可以用成员函数重载运算符,就是将运算符重载定义为一个类的成员函数的形式;也可以用友元函数重载。
用友元重载运算符的友元函数是独立于类以外的一般函数。
友元函数的运用使不同类之间有了共享机制,方便程序的编辑。
运用析构函数完成撤销对象占用内存之前的清理工作。
3.2关键技术
共设计了5个类。
虚基类Automobile,派生类Truck,Carriage 和Car及类Park。
具体定义如下所示:
(1)基类Automobile
类Automobile中,成员变量*Number表示车牌,year表示车已使用年数,time表示停车时间。
纯虚成员函数pay()表示取车时应付的费用,另有一个纯虚函数quche()。
(2)类Truck
类Truck中,成员变量zzl表示载重量,trucksum表示目前这一时刻停车场内的卡车数量,truckcount表示到目前为止停过的卡车数量总和。
成员函数pay()表示取车时所付的费用,quche()用来表示取车后停车场内的卡车数,number()用来返回目前停车场内的卡车数,count()用来返回停车场内一共停过的卡车数,用友元函数重
载>>运算符,以及构造函数Truck()和析构函数~Truck()。
(3)类Carriage
类carriage中,成员变量chairs表示乘坐人数,carriagesum 表示目前这一时刻停车场内的客车数量,carriagecount表示到目前为止停过的客车数量总和。
成员函数pay()表示取车时所付的费用,quche()用来表示取车后停车场内的客车数,number()用来返回目前停车场内的客车数,count()用来返回停车场内一共停过的客车数,用友元函数重载>>运算符,以及构造函数Carriage()和析构函数~Carriage()。
(4)类Car
类car中,成员变量air表示排气量,carsum表示目前这一时刻停车场内的小轿车数量,carcount表示到目前为止停过的小轿车数量总和。
成员函数pay()表示取车时所付的费用,quche()用来表示取车后停车场内的小轿车数,number()用来返回目前停车场内的小轿车数,count()用来返回停车场内一共停过的小轿车数,用友元函数重载>>运算符,以及构造函数Car()和析构函数~Car()。
(5)类Park
类park中,定义Automobile类的对象指针*park。
成员函数Tingche(int n,Automobile *automobile),表示不同车辆的停车安排,quche(int n)表示选择要取的车的车位号,并查询相应车位上是否有车并。
如果有车,输出需要交的费用,Zhuangtai()用来统计整个停车场的停车状态,Tongji()用来统计所停过的各类车的数量,友元函数Judge(int n,Park p)用来判断对应车位上是否有车。
3.3基本功能要求
(1)功能选择可以用菜单来实现
例如:
请选择您的计算内容:
请选择(1--4):
1:停车
2:取车交费
3:车辆状态
4:停车总计
用户通过输入不同的数字进入不同的菜单,次级菜单主要显示本程序的功能:
例如:
当选择1(停车)时,则会让程序员输入车辆的相关信息。
当选择2(取车交费)时,则会输出所取车辆的相关信息。
当选择3(车辆状态)时,则会输出停车场目前所停各种车辆的
数量。
当选择4(停车总计)时,则会输出停车场所停各种车的总量。
(2)运行时给出明确的提示信息。
比如,停车时会给出车辆的第一个需要输入的信息(例如:车辆类型),然后再给出下一个要输入的信息(例:车牌号)……当输入数据不对时,会自动给出错误提示并让用户重新输入!
4.
5
{
public:
virtual void pay()=0; //取车付的费用
virtual void quche()=0;
virtual ~Automobile(){};
protected:
char *Number; //车牌号
int year; //已使用年数
float time; //停车时间
};
class Truck:public virtual Automobile
{
public:
Truck();
void pay();
void quche();
static int number();
static int count(); //统计数量
friend istream& operator >> (istream&,Truck&);
~Truck(){};
protected:
float zzl; //载重量
static int trucksum; //现在这一时刻停车场内卡车的数量static int truckcount; //统计停过的卡车的数量
};
class Carriage:public Automobile
{
public:
Carriage();
void pay();
void quche();
static int number(); //返回此刻停车场内客车的数量static int count(); //返回统计停过的客车的数量
friend istream& operator >> (istream&,Carriage&);
~Carriage(){};
protected:
int chairs; //乘坐人数
static int carriagesum; //此刻停车场内客车的数量
static int carriagecount; //统计停过的客车的数量
};
class Car:public Automobile
{
public:
Car();
void pay();
void quche();
static int number();
static int count();
friend istream& operator >> (istream&,Car&);
~Car(){};
protected:
float air; //小轿车的排气量
static int carsum; //此刻停车场内小轿车的数量
static int carcount; //统计停过的小轿车的数量
};
class Park
{
public:
Park();
int Tingche(int n,Automobile *automobile); //停车
void quche(int n); //取车
void Zhuangtai(); //整个停车场停车的状态
void Tongji(); //统计各类车的数量
friend int Judge(int n,Park p); //判断对应车位上是否为空,空为0,有车为1
Automobile *park[3];
};
//Park.cpp
#include"Park.h"
int Truck::trucksum=0;
int Truck::truckcount=0;
Truck::Truck()
{
Number=new char[20];
trucksum++;
truckcount++;
}
void Truck::pay()
{
cout<<"*********************************"<<endl;
cout<<"车辆类型:卡车"<<endl;
cout<<"车牌号:"<<Number<<endl;
cout<<"卡车的载重量为:"<<zzl<<"吨"<<endl;
cout<<"卡车的收费标准为每小时2元." <<endl;
cout<<"停车的时间为:"<<time<<endl;
cout<<"所需费用为:"<<2*time<<endl;
cout<<"*********************************"<<endl;
void Truck::quche()
{
trucksum--;
}
int Truck::number()
{
return trucksum;
}
int Truck::count()
{
return truckcount;
}
istream& operator >> (istream& input,Truck& truck) {
cout<<"该卡车车牌号为:";
cin>>truck.Number;
cout<<"该卡车已使用年数(年):";
cin>>truck.year;
cout<<"该卡车的载重量为(吨):";
cin>>truck.zzl;
cout<<"该卡车停车时间(小时):";
cin>>truck.time;
return input;
}
int Carriage::carriagesum=0;
int Carriage::carriagecount=0;
Carriage::Carriage()
{
Number=new char[20];
carriagesum++;
carriagecount++;
}
void Carriage::pay()
cout<<"*********************************"<<endl;
cout<<"车辆类型:客车"<<endl;
cout<<"车牌号:"<<Number<<endl;
cout<<"客车可以乘坐的人数:"<<chairs<<"吨"<<endl;
cout<<"客车的收费标准为每小时1.5元." <<endl;
cout<<"停车的时间为:"<<time<<endl;
cout<<"所需费用为:"<<1.5*time<<endl;
cout<<"*********************************"<<endl;
}
void Carriage::quche()
{
carriagesum--;
}
int Carriage::number()
{
return carriagesum;
}
int Carriage::count()
{
return carriagecount;
}
istream& operator >> (istream& input,Carriage& carriage) {
cout<<"该客车车牌号为:";
cin>>carriage.Number;
cout<<"该客车已使用年数(年):";
cin>>carriage.year;
cout<<"该客车可以乘坐的人数:";
cin>>carriage.chairs;
cout<<"该客车停车时间(小时):";
cin>>carriage.time;
return input;
}
int Car::carsum=0;
int Car::carcount=0;
Car::Car()
{
Number=new char[20];
carsum++;
carcount++;
}
void Car::pay()
{
cout<<"*********************************"<<endl;
cout<<"车辆类型:小轿车"<<endl;
cout<<"车牌号:"<<Number<<endl;
cout<<"小轿车的排气量:"<<air<<"L"<<endl;
cout<<"小轿车的收费标准为每小时1元." <<endl;
cout<<"停车的时间为:"<<time<<endl;
cout<<"所需费用为:"<<1*time<<endl;
cout<<"*********************************"<<endl; }
void Car::quche()
{
carsum--;
}
int Car::number()
{
return carsum;
}
int Car::count()
{
return carcount;
}
istream& operator >> (istream& input,Car& car)
{
cout<<"该轿车车牌号为:";
cin>>car.Number;
cout<<"该轿车已使用年数(年):";
cin>>car.year;
cout<<"该轿车的排气量:";
cin>>car.air;
cout<<"该轿车停车时间(小时):";
cin>>car.time;
return input;
}
Park::Park()
{
for(int i=0;i<3;i++)
park[i]=NULL;
}
int Park::Tingche(int n,Automobile *automobile) {
int flag=1;
if(park[n]!=NULL)
{
cout<<"第"<<n<<"个车位上已经有车了!"<<endl; flag=0;
return flag;
}
else
{
park[n]=automobile;
return flag;
}
}
void Park::quche(int n)
{
if(park[n]==NULL)
cout<<"第"<<n<<"个车位上没有车!"<<endl;
else
{
park[n]->pay();
park[n]->quche(); //车的数量减一
delete park[n]; //释放掉多余的空间
park[n]=NULL;
cout<<"取车成功!"<<endl;
}
}
void Park::Zhuangtai() //停车状态函数
{
cout<<"目前停车场有:"<<Truck::number()<<"辆卡车,"<<Carriage::number()<<"辆客车,"<<Car::number()<<"辆小轿车!"<<endl;
}
void Park::Tongji()
{
cout<<"当天停车场一共停放了:"<<Truck::count()<<"辆卡车,"<<Carriage::count()<<"辆客车,"<<Car::count()<<"辆小轿车!"<<endl;
}
int Judge(int n,Park p)
{
if (p.park[n]!=NULL)
{
cout<<"第 "<<n<<" 个停车位已经有车!"<<endl;
return 0;
}
else
return 1;
}
//main.cpp
#include"Park.h"
int main()
{
Park *park=new Park;
Truck *truck;
Carriage *carriage;
Car *car;
int n,k;
int i=0;
char kind;
while(1)
{
cout<<"***************************************"<<endl;
cout<<"---------------------------------------"<<endl;
cout<<"* *"<<endl;
cout<<"* "<<"欢迎进入停车场交费管理系统"<<" *"<<endl;
cout<<"* *"<<endl;
cout<<"---------------------------------------"<<endl;
cout<<"***************************************"<<endl;
cout<<endl;
cout<<"请选择(1--4):"<<endl;
cout<<" "<<"1:停车"<<endl;
cout<<" "<<"2:取车交费"<<endl;
cout<<" "<<"3:车辆状态"<<endl;
cout<<" "<<"4:停车总计"<<endl;
cin>>i;
while(i<1||i>4)
{
cout<<"错误输入!"<<endl;
cout<<"请重新输入(1-4)选择相应的功能: ";
cin>>i;
}
switch(i)
{
case 1:
cout<<"请输入车位号(0~2):";
cin>>n;
while (n>2||n<0)
{
cout<<"请重新输入0-2之间的数字进行功能选择: "; cin>>n;
}
if(!Judge(n,*park)) break;
cout<<"a:卡车 b:客车 c:轿车"<<endl;
cout<<"请选择你车辆的类型:";
cin>>kind;
while (kind!='a'&&kind!='b'&&kind!='c')
{
cout<<"你输入的车辆种类不正确,请重新从a,b,c选择车辆类型: ";
cin>>kind;
}
switch(kind)
{
case 'a':
truck=new Truck;
cin>>*truck;
park->park[n]=truck;
cout<<"\n停车成功!"<<endl;
break;
case 'b':
carriage=new Carriage;
cin>>*carriage;
park->park[n]=carriage;
cout<<"\n停车成功!"<<endl;
break;
case 'c':
car=new Car;
cin>>*car;
park->park[n]=car;
cout<<"\n停车成功!"<<endl;
break;
}
break;
case 2:
cout<<"请输入车位号(0~2):";
cin>>n;
park->quche(n);
break;
case 3:
park->Zhuangtai();
break;
case 4:
park->Tongji();
break;
}
cout<<"是否继续?Yes(1)/No(0) ";
cin>>k;
if(!k) return 0;
cout<<endl<<endl<<endl;
}
}
6.设计结果和分析:
图1为程序运行时,首先出现的主界面菜单,由用户进行功能选择,选择不同的数字,进入不同的功能区。
图1
选择1,则显示次级菜单,进入“停车”界面,如图2.1和2.2所示。
图2.1
图2.2
如果选择的车位号已经有车,则会给出提示,让用户选择继续,重新输入车位号。
如图3
图3
用户重新输入车位号,然后再继续输入所要停放车辆的相关信息,如
图4
图4
选择2,则显示次级菜单,进入“取车交费”界面。
输入所要取的车辆的车位号,则会显示所取车辆的相关信息,以及所要支付的停车费用。
如图5.1和5.2所示。
图5.1
图5.2
如果输入的车位上没有车辆,则会给出提示,让用户重新输入。
如图6
图6
选择3,则显示次级菜单,进入“车辆状态”界面。
显示目前停车场
所停各种车的数量,如图7
图7
选择2,再次输入所取车辆车位号,取出车辆,输出所取车辆的相关信息,如图8
图8
取车之后再次选择3,显示该时刻停车场所停各种车的数量,如图9
图9
选择4,则显示次级菜单,进入“停车总计”界面。
输出当天停车场一共停放的各类车的总量,如图10
图10
7.设计体会
在为期近四周的C++课程设计中,我体会颇多,学到了很多东西。
这次课程设计加强了我对面向对象程序设计这门课程的认识,并且复习了自己以前学习到的知识,自己的逻辑思考能力也得到了提高。
这些都使得我对计算机语言的学习有了更深入的认识!通过本次课程设计,我相信会为自己以后的学习和工作带来很大的好处。
最重要的是这次课程设计激发了我编程的兴趣和热情,让我学习将理论知识使用
于实践,编写一些小程序。
虽然在程序设计中出现了很多错误,但这从另一方面也给了我学习的机会,通过向大二的学长请教一些不太懂的问题,让我找出自己的不足。
而且这也锻炼了我的耐心,锻炼我遇到困难冷静处理的能力。
总之这次课程设计让我学到了很多书本上学不到的东西,锻炼了我各方面的能力,让我看到了自己身上的不足,为我接下来专业知识的学习找到了着重点。
8.参考书目
《C语言程序设计》第二版
《C程序设计(第三版)》谭浩强编著
《C++面向对象程序设计》谭浩强编著
设计成绩:教师签名:
年月日。