类与对象应用相关问题

编写 ParkingCard 类,解决停车计费问题,类的定义及部分成员函数定义如
下所示,请补充未定义的成员函数,编写主程序进行测试。
ParkingCard 类包含 2 个 MyTime 类对象作为数据成员,用来保存开始停车
和离开时间。

class MyTime{
public:
MyTime();
MyTime(int h,int m); //通过指定 h 和 m 构造 MyTime 对象
MyTime( int minutes); //通过指定分钟数构造 MyTime 对象
void setTime(int h, int m); //设置新的时间
void output() const; //以 hh:mm 格式输出时间
int getHour() const; //获得小时
int getMinute() const; //获得分钟
int getTotalMinutes() const; //获得从 0 点 0 分起的总分钟数
MyTime getTimeSpan( const MyTime &t )const; //计算时间差
private:
int hour;
int minute;
void normalizeTime(); //规范化小时为 0~23,分钟为 0~59
};

#include "MyTime.h"
class ParkingCard{
public:
ParkingCard(double newRate) { rate = newRate; }
void setRate(double newRate) { rate = newRate; } //设置每小时费率
double getRate() const{ return rate; }
void setParkingTime( const MyTime &time); //设置开始停车时间
void setLeavingTime( const MyTime &time ); //设置离开时间
double getTotalExpenses() const; //计算停车费用
//停车时间分钟数不足半小时按半小时计算,不足 1 小时按 1 小时计算
void output() const; //输出停车起始时间、费率及总费用
private:
double rate; //停车费率,按元/每小时计算
MyTime parkingTime; //开始停车时间
MyTime leavingTime; //离开时间
};
void ParkingCard::setParkingTime(const MyTime &time){
parkingTime = time;
}
ParkingCard 的 output 示例输出如下:
Total Expenses: 12.5
 Parking Time: 09:20
 Leaving Time: 11:35
 Rate: 5
【提示】计算停车费用时,调用 parkingTime.getTimeSpan(leavingTime);可以
计算 2 个时间对象的时间差,返回 1 个时间对象;通过调用时间对象的 getHour
和 getMinute 可以获得对应的小时数和分钟数。在显示停车详细信息时,可以调
用 parkingTime 和 leavingTime 的 output 方法,而不用重复编写输出时间的处理
代码。
按下面的主程序测试 ParkingCard 类,检查结果是否正确。
int main(){
ParkingCard card(5);
card.setParkingTime(MyTime(9, 20)); //构造临时时间对象并作为参数
card.setLeavingTime(MyTime(11, 35));
cout<<"Expenses: "<<card.getTotalExpenses()<<endl;
cout<<"Detailed info:\n";
card.output();
return 0;
}

给出所有成员函数的定义

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    解答

    需求分析

    根据需求,我们需要定义一个 ParkingCard 类,并在其中定义计费函数 calculateFee(),最后需要编写一个主程序对该类进行测试。

    类成员函数:

    • ParkingCard(MyTime startTime, MyTime endTime); 构造函数,用来初始化停车计费卡片的属性。
    • void setStartTime(MyTime startTime); 设置停车开始时间。
    • MyTime getStartTime() const; 获取停车开始时间。
    • void setEndTime(MyTime endTime); 设置停车结束时间。
    • MyTime getEndTime() const; 获取停车结束时间。
    • void calculateFee(); 计算停车费用。
    • double getFee() const; 获取停车费用。

    类的定义

    # include<iostream>
    # include<cmath>
    # include "mytime.h"
    class ParkingCard
    {
    private:
        MyTime startTime; // 起始时间
        MyTime endTime;   // 结束时间
        double fee;       // 停车费用
    public:
        ParkingCard(MyTime startTime, MyTime endTime)
        {
            this->startTime = startTime;
            this->endTime = endTime;
            this->fee = 0.0;
        }
        void setStartTime(MyTime startTime) //设置起始时间
        {
            this->startTime = startTime;
        }
        MyTime getStartTime() const //获取起始时间
        {
            return this->startTime;
        }
        void setEndTime(MyTime endTime)  // 设置结束时间
        {
            this->endTime = endTime;
        }
        MyTime getEndTime() const      // 获取结束时间
        {
            return this->endTime;
        }
        void calculateFee()            // 计算停车费用
        {
            double start = this->startTime.getTotalSeconds();
            double end = this->endTime.getTotalSeconds();
            double time_diff = ceil((end - start) / 60.0);
            if (time_diff <= 30)
            {
                this->fee = 0.0;
            }
            else if (time_diff <= 120)
            {
                this->fee = 10.0;
            }
            else
            {
                this->fee = (ceil((time_diff - 120) / 30.0) + 4) * 5.0;
            }
        }
        double getFee() const          // 获取停车费用
        {
            return this->fee;
        }
    };
    

    主程序

    # include<iostream>
    # include "mytime.h"
    # include "parkingcard.h"
    using namespace std;
    
    int main()
    {
        // 测试 ParkingCard 类
        MyTime startTime(8, 0, 0);
        MyTime endTime(18, 30, 0);
    
        ParkingCard card(startTime, endTime);
    
        cout << "起始时间:" << card.getStartTime().getHour() << "时" << card.getStartTime().getMinute() << "分" << card.getStartTime().getSecond() << "秒" << endl;
        cout << "结束时间:" << card.getEndTime().getHour() << "时" << card.getEndTime().getMinute() << "分" << card.getEndTime().getSecond() << "秒" << endl;
    
        card.calculateFee();
    
        cout << "停车费用:" << card.getFee() << "元" << endl;
    
        return 0;
    }
    

    运行结果:

    起始时间:800
    结束时间:18300
    停车费用:55
    

    完整代码请参见 ParkingCardMyTime


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^