【C++】6-5 停车场收费问题 (20 分)

本文介绍了一个基于C++实现的停车场收费系统案例。该系统通过面向对象的方法定义了不同类型的车辆及其停车费用计算规则,并利用虚拟函数实现了多态。此外,还提供了一个简单的用户交互界面来演示系统的运行。
部署运行你感兴趣的模型镜像

在这里插入图片描述
裁判测试程序样例:

#include <iostream>
#include <string>
using namespace std;
const float Car_Price= 8;
const float Bus_Price= 10;
const float Truck_Price=15;
class Vehicle{
    protected:
        float price;
        int minute;
    public:
       virtual float computeFee(){return 20.0f*minute/60;};
       virtual string getType(){return "unknow"; };
       float getPrice();
       void setPrice(float _price);
       int getMinute();
       void setMinute(int _minute);
       Vehicle(float _price,int _minute); 
       Vehicle(){
       };
};
/* 你的代码将被嵌入这里 */
int main(){
    int n,minute; //停车辆次,时长 
    char type;
    Vehicle *vp;
    Parker p;
    cin>>n;

    for(int i=1;i<=n;i++){
        cin>>type>>minute;
        switch(type){
            case 'c':vp=new Car(minute);break;
            case 't':vp=new Truck(minute);break;
            case 'b':vp=new Bus(minute);break;
            default: vp=new Vehicle();vp->setMinute(minute);
        }
        cout<<"type:"<<vp->getType() <<" minute:"<<vp->getMinute()<<" fee:"<<vp->computeFee()<<endl;
        p.park(vp);
        delete vp;
    }
    cout<<"sum:"<<p.getSum()<<endl;
    return 0;
}

输入样例:
输入的第一行为进入停车场的车辆总数n. 接下来有n行输入,每行为一辆车的类型及停车时长,时长单位为分钟,类型’c’代表Car,类型’b’代表Bus,类型’t’代表Truck,其他字符则为未知类型。

3
c 40
t 5
b 40

输出样例:
输出为n+1行,前n行输出每辆车的类型,停车时长,收取的费用,最后一行输出目前停车场得到的停车费总额。

type:car minute:40 fee:8
type:truck minute:5 fee:15
type:bus minute:40 fee:10
sum=33

偷懒
直接测试程序copy到vs,要补充的自动划上线了(doge)

  1. 先是补完 Vehicle类 里面的函数
  2. 定义 Parker类 用于得出停车费总额
  3. 定义 Car,Truck,Bus类继承 Vehicle类

代码:

//补充 Vehicle类的函数
float Vehicle::getPrice() { return price; }
void Vehicle::setPrice(float _price) { price = _price; }
int Vehicle::getMinute() { return minute; }
void Vehicle::setMinute(int _minute) { minute = _minute; }
Vehicle::Vehicle(float _price, int _minute) { price = _price; minute = _minute; }

//停车场类
class Parker
{
    double sum=0;
public:
    void park(Vehicle* v) { sum += v->computeFee(); }
    double getSum() { return sum; }
};

//轿车类
class Car :public Vehicle
{
public:
    Car(int m) :Vehicle(Car_Price, m) {};
    virtual string getType() { return "car"; }
    virtual float computeFee()
    {
        if (minute <= 30) price = 0;
        else
        {
            int times = (minute - 30) / 60 + 1;
            price = times * Car_Price;
            return price;
        }
    }
};

//货车类
class Truck :public Vehicle 
{
public:
    Truck(int m) :Vehicle(Truck_Price, m) {};
    virtual string getType() {return "truck";}
    virtual float computeFee() 
    {
        int hour = minute / 60;
        if (hour * 60 < minute) hour += 1;
        return hour * price;
    }
};

//客车类
class Bus :public Vehicle 
{
public:
    Bus(int m) :Vehicle(Bus_Price, m) {};
    virtual string getType() { return "bus"; }
    virtual float computeFee() 
    {
        int hour = minute / 30;
        if (hour * 30 < minute) hour += 1;
        return hour * price / 2;
    }
};

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

<think> 嗯,用户这次聚焦在车型差异化收费的具体实现方法上,看来ta对停车场系统的运营细节很关注。结合之前讨论的PLC系统架构,用户可能实际在规划一个需要区货车和轿车收费的立体车库项目。 用户特意提到轿车和货车两种车型,说明ta的停车场可能有物流车辆混杂停放的情况。这种场景常见于商业综合体或工业园区的配套停车场。货车通常占用更多空间且对地面压力更大,收费更高是合理的。 关于技术实现,需要从三个维度展开: 首先是检测环节,光靠单一传感器不够可靠。地感线圈+激光测距的组合最实用,比如在入口处安装两组不同高度的激光扫描仪,通过高度差判断车型。PLC编程时可以用比较指令处理高度数据,比如当车辆高度$h>1.8\text{m}$且轴距$L>3.5\text{m}$时标记为货车。 计费策略部要特别注意时段的灵活性。比如商场可能希望夜间对货车加倍收费(考虑噪音影响),而住宅区可能完全禁止货车夜间进入。可以在PLC里用MOV指令动态加载不同的收费标准表,通过时钟指令自动切换。 支付环节的联动很关键。当系统识别为货车时,PLC不仅要计算更高费用,还要在显示屏醒目位置标注车型类依据(比如显示"货车:4.2米"),避免纠纷。最好在出口道闸增加延时,给收费员留出核查时间。 突然想到用户没问但可能关心的问题:如何防止货车冒充轿车?这需要在识别环节设置冗余校验。比如当激光扫描判断为货车但IC卡登记为轿车时,PLC应触发声光报警并暂停道闸,通过RS485通知管理员终端核查。 最后补充的环境适应性也很重要。东北地区的用户可能需要关注激光扫描仪的防冻设计,而华南用户更在意PLC本身的防潮保护。三菱FX5U的-20~55℃工作范围基本覆盖绝大多数地区,但配套传感器要特别注明防护等级。 </think> 以下是PLC停车场收费系统实现轿车/货车差异化收费的具体方法及技术细节: --- ### 一、车型识别技术(核心前提) 1. **多传感器融合检测** - **激光/超声波测高仪**:在入口处垂直安装,测量车顶高度(货车通常$h>2.5\text{m}$)[^3] - **地感线圈+轮轴检测器**:识别轴数与轮距(货车常为$6$轴,轿车$2$轴) - **双光电管宽度扫描**:水平布置光电管对,计算车身宽度(货车常$W>2.2\text{m}$) *PLC通过比较器指令处理传感器数据,例如三菱PLC的`CMP`指令判断$ \text{height} > 2.5$ → 标记为货车* 2. **车牌/IC卡预绑定** - 固定用户通过登记系统预存车型信息(如绑定货车IC卡) - 临时车通过车牌识别系统调取车辆数据库信息[^4] --- ### 二、PLC差异化计费逻辑设计 1. **费率结构存储** ```ladder |--[MOV K50 D100]----| //轿车基础费存入D100 |--[MOV K80 D101]----| //货车基础费存入D101 |--[MOV K5 D102]----| //轿车单位费率(元/小时) |--[MOV K8 D103]----| //货车单位费率(元/小时) ``` *注:D寄存器存储差异化费率参数[^3]* 2. **阶梯计费公式实现** - 轿车费用模型: $$ \text{Fee}_{\text{car}} = \text{Base}_{\text{car}} + \left\lceil \frac{T - T_{\text{free}}}{T_{\text{unit}}} \right\rceil \times \text{Rate}_{\text{car}} \quad (T>\text{免费时长}) $$ - 货车费用模型(含额外附加费): $$ \text{Fee}_{\text{truck}} = \text{Base}_{\text{truck}} + \left\lceil \frac{T}{T_{\text{unit}}} \right\rceil \times \text{Rate}_{\text{truck}} + K\cdot\text{Weight} \quad (K=\text{吨位系数}) $$ *PLC通过浮点运算指令(如三菱的`DEADD`/`DEMUL`)实现公式计算[^4]* 3. **控制程序流程** ```plaintext 车辆进入 → 传感器采集数据 → PLC车型类 → 启动对应定时器(Tcar/Ttruck) ↓ 车辆离开 → 调用计量子程序 → 按车型选择费率寄存器 → 计算费用 → 上传至收费终端 ``` --- ### 三、硬件联动设计 1. **差异化提示系统** - 入口LED屏显示车型判定结果(如“货车-A类”) - 出口费屏自动高亮显示货车加价明细(如“吨位附加费:¥XX”)[^3] 2. **道闸控制策略** - 货车离场需额外重量复核(地磅数据通过RS485传至PLC) - 超宽货车触发防撞光电管时延迟关闸($ \text{T}_{\text{close}} = \text{默认值} + 5\text{s} $)[^2] --- ### 四、抗干扰与可靠性措施 | 风险 | PLC对策 | |---------------------|----------------------------------| | 传感器误判车型 | 三冗余投票机制(两路一致才生效) | | 费率参数丢失 | 备份至FRAM存储器[^4] | | 极端天气误检 | 安装防护罩+加热模块(-30℃~70℃) | > 某商业综合体实测数据:采用差异化收费后,货车平均停留时间缩短27%(因费用敏感度高),车位周转率提升19%[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值