c++实验 继承与派生(停车场程序)

16 篇文章 1 订阅
1 篇文章 0 订阅

实验七 继承与派生

实验目的

学习继承与派生的相关理论,熟悉不同继承方式下对基类成员的访问方式,包括以下几个方面:
(1)学习声明和使用类的继承关系,声明派生类;
(2)熟悉不同继承方式下,对基类成员的访问控制;

2 实验内容

2.1 停车场程序
(1)问题描述
请根据题目要求完成简单的停车场管理程序。
1.停车场(Park)有 N 个停车位(space),每个停车位可以停放不同类型的
汽车(Automobile),包括卡车(Truck)、轿车(Car)、公交车(Bus),但同一时刻一个停车位只能停放 0 或 1 辆汽车。如果没有空余停车位,显示提示信息,但不会为车辆安排停车位。
2.程序模拟车辆停车的情况:新来车辆时如果有空位,按顺序为该车分配停车位;车辆开走时,应交纳停车费。
3.停车场可以显示当前停放的车辆的车牌号码,以及当前的全部停车费收入(income)。
4.定义汽车基类 Automobile,包括车牌号码(字符串)成员数据。
5.定义派生类 Truck、Car、Bus。这些车辆除了拥有车牌号码之外,还各自拥有不同的属性。Truck 还包括载重量属性(浮点数,单位吨);Car 还拥有品牌属性(字符串),Bus 还包括核定载员数量(整型)。此外,每个派生类中要实现 pay()函数,用于显示车辆信息并交纳停车费。其中,Truck 收费 3 元/次,Car 收费 1 元/次,Bus 收费 2 元/次。

class Automobile {}; // 汽车类
class Park {}; // 停车场类
int main() {
cout << "请输入停车位数量:";
cin >> N;// 输入停车位数量,此处输入2
Park *park = new Park(N);// 创建一个停车场对象
Car car1("鲁B-12345","奥迪A6"); // 创建轿车对象
car1.enter(park); // car1进入停车场,分配停车位
Truck truck("鲁B-23456", 15); // 创建卡车对象
truck.enter(park); // truck进入停车场,分配车位
car1.leave(park); // car1离开停车场,缴纳停车费
Bus bus("鲁B-34567", 50); // 创建公交车对象
bus.enter(park); // bus进入停车场,分配车位
/* 显示当前停放的车辆的车牌号码,以及当前的全部停车费收入*/
park->showInfo();
Car car2("鲁B-45678","宝马320"); // 创建轿车对象
car2.enter(park); 
// car2进入停车场,分配停车位。因为没有空余停车位,所以无法分配
bus.leave(park); // bus离开停车场,缴纳停车费
truck.leave(park); // truck离开停车场,缴纳停车费
/* 显示当前停放的车辆的车牌号码,以及当前的全部停车费收入*/
park->showInfo();
delete park;
return 0;
} 

程序结果

程序执行结果如下:
请输入停车位数量:2 鲁B-12345进入停车场,分配停车位
鲁B-23456进入停车场,分配停车位
鲁B-12345离开停车场,缴纳停车费1元
鲁B-34567进入停车场,分配停车位
停车场目前停放了2辆汽车:鲁B-23456,鲁B-34567,共收入1元停车费
无法为鲁B-45678分配停车位
鲁B-34567离开停车场,缴纳停车费2元
鲁B-23456离开停车场,缴纳停车费3元
停车场目前停放了0辆汽车,共收入6元停车费
提示:停车场的停车位要用Automobile的指针数组表示。

Automobile **spaces;
spaces = new Automobile*[N];
spaces[i] = &car1;
delete[] spaces;
#pragma once
#include <string>
#include <iostream>
class Automobile;//前向引用说明!
class Park
{
public:
 Park(int n);
 ~Park();
 void showInfo();
 void registerPark(Automobile * car);
 void payMent(Automobile * car, int charge);
private:
 int n;
 int incomes;
 Automobile** spaces;//采e用数组指针来创建新的停车位!
 int freeNum;
};
class Automobile
{
public:
 Automobile(std::string);
 void enter(Park &p);
 virtual void leave(Park &p);
 void pay(int charge);
 std::string getPlate();
private:
 std::string numberPlate;
};
//基类Automobile的几个派生类!
class Truck :public Automobile
{
public:
 Truck(std::string inumberPlate, float iweight);
 void leave(Park & p);
private:
 float weight;
 const int truckFee = 3;
};
class Car :public Automobile
{
public:
 Car(std::string inumberPlate, std::string brand);
 void leave(Park & p);
private:
 std::string brand;
 const int carFee = 1;
};
class Bus :public Automobile
{
public:
 Bus(std::string inumberPlate,int passenger );
 void leave(Park & p);
private:
 int passenger;
 const int busFee = 2;
};
#include "parkManager.h"
//构造函数!
Park::Park(int n) 
 : n(n), incomes(0), freeNum(0)
{
 spaces = new Automobile *[n];//用指针数组创建车位!
 //不要忘记指针的初始化!
 for (int i = 0; i < n; i++)
 {
  spaces[i] = NULL;
 }
}
/*Park::Park(int n)
{
    this->n = n;
 spaces = new Automobile *[n];//用指针数组创建车位!
 //不要忘记指针的初始化!
 for (int i = 0; i < n; i++)
 {
  spaces[i] = NULL;
 }
 incomes = 0; 
 
}*/
Park::~Park()
{
 delete[] spaces;
}
void Park::registerPark(Automobile * p)
{
 int i = 0;
 for (i = 0; i < n; i++)
 {
  if (spaces[i] == NULL)
  {
   spaces[i] = p;
   freeNum++;
   std::cout << p->getPlate() << "进入停车场,分配停车位" << std::endl;
   return;
  }
 }
 if (freeNum >= n)
 {
  std::cout << "无法为" << p->getPlate() << "分配停车位!" << std::endl;
  return;
 }

}
void Park::payMent(Automobile * p, int charge)
{
 for (int i = 0; i < n; i++)
 {
  if (spaces[i] == p)
  {
   spaces[i] = NULL;
   freeNum--;
   incomes += charge;
   p->pay(charge);
   //std::cout << p->getPlate() << "离开了停车场,缴纳停车费" << charge << "元" << std::endl;
   return;
  }
 }
 std::cout << "车牌号为:" << p->getPlate() << "的汽车不存在!" << std::endl;
 return;
}
void Park::showInfo()
{
 std::cout << "停车场目前停放了" << freeNum << "辆汽车:";
 for (int i = 0; i < n; i++)
 {
  if (spaces[i] != nullptr)
  {
   std::cout << spaces[i]->getPlate() << ",";
  }
 }
 std::cout << "共收入" << incomes << "元停车费" << std::endl;
}
Automobile::Automobile(std::string numPlate) 
 : numberPlate(numPlate){}
std::string Automobile::getPlate()
{
 return numberPlate;
}
void Automobile::enter(Park &p)
{
 p.registerPark(this);
}
void Automobile::pay(int charge)//汽车离开停车场时,需要缴纳的车费!
{
 std::cout <<this->getPlate() << "离开了停车场,缴纳停车费" << charge << "元" << std::endl;
}
void Automobile::leave(Park & p)
{
 //p.payMent(this);//函数重载的的时候,要求没有像虚函数那样的严格!
}
Truck::Truck(std::string inumberPlate,float iweight)
 :Automobile(inumberPlate),weight(iweight) {}
 void Truck::leave(Park & p)
{
 p.payMent(this, truckFee);
}
Car::Car(std::string inumberPlate, std::string brand)
 :Automobile(inumberPlate),brand(brand){}
void Car::leave(Park& p)
{
 p.payMent(this, carFee);
}
Bus::Bus(std::string inumberPlate, int ipassengerr)
 :Automobile(inumberPlate),passenger(ipassengerr){}
void Bus::leave(Park &p)
{
 p.payMent(this, busFee);
}

main.cpp

#nclude"parkManager.h"
int main()
{
 int n = 0;
 std::cout << "请输入停车位数量:";
 std::cin >> n;// 输入停车位数量,此处输入2
 Park p(n);// 创建一个停车场对象
 Car car1("鲁B-12345", "奥迪A6");  // 创建轿车对象
 car1.enter(p);    // car1进入停车场,分配停车位
 Truck truck("鲁B-23456", 15);  // 创建卡车对象
 truck.enter(p);   // truck进入停车场,分配车位
 car1.leave(p);   // car1离开停车场,缴纳停车费
 Bus bus("鲁B-34567", 50);  // 创建公交车对象
 bus.enter(p);   // bus进入停车场,分配车位
 /* 显示当前停放的车辆的车牌号码,以及当前的全部停车费收入*/
 p.showInfo();
 Car car2("鲁B-45678", "宝马320");  // 创建轿车对象
 car2.enter(p);
 // car2进入停车场,分配停车位。因为没有空余停车位,所以无法分配
 bus.leave(p);  // bus离开停车场,缴纳停车费
 truck.leave(p);  // truck离开停车场,缴纳停车费
 /* 显示当前停放的车辆的车牌号码,以及当前的全部停车费收入*/
 p.showInfo();
 std::cin.get();
 return 0;
}
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值