停车场计费系统的两道思考题

停车场计费系统的升级思考:(60分+10分
以课堂材料

#include <iostream>using namespace std;
double parkingFee(double);
int main()
{
Time arriveTime,leaveTime;
double parkingTime,Fee;
arriveTime.setTime();
arriveTime.showTime();
leaveTime.setTime();
leaveTime.showTime();
parkingTime=leaveTime.diff(arriveTime);
Fee=parkingFee(parkingTime);
cout<<"收费"<<Fee<<endl;return 0;}

给出的停车场系统为基础考虑(见附件),如果 停车收费规则改为:

1小时内免费;
1小时以上:
             超过15分钟不到30分钟按半小时收费; 
             超过30分钟不到1小时按1小时收费;
             超过1小时按每小时4元收费;
超过1天,每天按30元收费;停车超过1个月的,停车费打9折;超过1年的停车费打8折。

实验要求:
❶考虑修改Time的设计,改为DateTime,补充数据成员年、月、日,补充或者调整类内成员函数的设计,并实现它。采用你实现的新的DateTime进行停车收费的测试。并将完整的源代码和测试截图黏贴在下面。(30分)
源代码只需要黏贴类定义部分即可(DateTime的声明和实现)

❷考虑另一种程序调整模型,补充Date类,数据成员部分为:年、月、日;成员函数部分可以仿照原来Time类的功能设计。采用补充的新类Date和原来的Time类一起工作完成停车收费程序。(30分)
 

求大佬们赐教

以课堂材料给出的停车场系统为基础考虑(见附件)

===原来的系统需求都不知道啥样啊。

如果可以,请把附件发出来,这边一定给你个正确的解答。

加油

DateTime的写出来了,DateTime也是基于Date和Time来计算的,第二题就是把DataTime的diff中的内容放到main函数中计算,然后删除DateTime类,修改一下main中变量类型就可以了。

代码如下:

#include <iostream>
using namespace std;


double parkingFee(double);

class Time
{
private:
	int mHour;  //时
	int mMint;  //分
	int mSec;   //秒
public:
	Time(){}
	Time(int h,int m,int s):mHour(h),mMint(m),mSec(s){}
	void setHour(int h){mHour = h;}
	void setMint(int m){mMint = m;}
	void setSecond(int s){mSec = s;};
	int getHour(){return mHour;}
	int getMint(){return mMint;}
	int getSecond(){return mSec;}
	void showTime()
	{
		cout << mHour << ":" << mMint << ":" << mSec<< endl;
	}
	double diff(Time &t)
	{
		double d1 = mHour * 60 + mMint;
		double d2 = t.getHour() * 60 + t.getMint();
		return d1 - d2;
	}
};


class Date
{
public:
	int mYear;  //年
	int mMont;  //月
	int mDay;   //日
public:
	Date(){}
	Date(int y,int m,int d):mYear(y),mMont(m),mDay(d){}
	void setYear(int y){mYear = y;}
	void setMonth(int m){mMont = m;}
	void setDay(int d){mDay = d;}
	int getYear(){return mYear;}
	int getMonth(){return mMont;}
	int getDay(){return mDay;}
	bool isRunnian()
	{
		return isRunnian(mYear);
	}
	bool isRunnian(int year)
	{
		if(year%4==0 && year%100!=0 || year%400==0)
			return true;
		else
			return false;
	}
	double diff(Date &t)
	{
		double d1 = days2std(*this);
		double d2 = days2std(t);
		return d1 - d2;
	}
	void showTime()
	{
		cout << mYear << "-" << mMont << "-" << mDay <<endl;
	}
private:
	double days2std(Date& t)//以2000年1月1日为标准计算t距离该标准日期的天数
	{
		//以2000年1月1日为标准计算
		double d1 = 0;
		for (int i=2000;i<t.getYear();i++)
		{
			if(isRunnian(i))
				d1 += 365;
		}
		for (int i = 1;i<t.getMonth();i++)
		{
			if(1 ==i || 3==i || 5== i || 7==i || 8==i || 10 ==i || 12==i)
				d1 += 31;
			else if(4==i || 6 ==i || 9==i || 11==i)
				d1 += 30;
			else
			{
				if(isRunnian(t.getYear()))
					d1 += 29;
				else
					d1 += 28;
			}
		}
		d1 += t.getDay();
		return d1;
	}
	
};

class DateTime 
{
private:
	Time mTime;
	Date mDate;
public:
	DateTime(){}
	DateTime(int y,int m,int d,int h,int mm,int s)
	{
		mTime.setHour(h);
		mTime.setMint(mm);
		mTime.setSecond(s);
		mDate.setYear(y);
		mDate.setMonth(m);
		mDate.setDay(d);
	}
	DateTime(Date dd,Time tt)
	{
		mTime = tt;
		mDate = dd;
	}
	
	void setYear(int y){mDate.setYear(y);}
	void setMonth(int m){mDate.setMonth(m);}
	void setDay(int d){mDate.setDay(d);}
	int getYear(){return mDate.getYear();}
	int getMonth(){return mDate.getMonth();}
	int getDay(){return mDate.getDay();}

	void setHour(int h){mTime.setHour(h);}
	void setMint(int m){mTime.setMint(m);}
	void setSecond(int s){mTime.setSecond(s);};
	int getHour(){return mTime.getHour();}
	int getMint(){return mTime.getMint();}
	int getSecond(){return mTime.getSecond();}

	void setDate(Date &dd){mDate = dd;/*mDate.setYear(dd.getYear());mDate.setMonth(dd.getMonth());mDate.setDay(dd.setDay());*/}
	Date getDate(){return mDate;}
	void setTime(Time &tt){mTime = tt;}
	Time getTime(){return mTime;}


	double diff(DateTime &t)
	{
		double days = mDate.diff(t.getDate());
		double hours = mTime.diff(t.getTime());

		if (days > 0) //大于1天,按天收费
		{
			return days;
		}else
		{
			double hd = hours /60;
			double ds = hours - 60 * hd;
			if (ds>= 0 && ds <=30)
			{
				return hd/10.0 + 0.01; //0.01表示半小时
			}else
				return (hd +1)/10.0;  //小时占第一个小数点位(大于30分钟按1小时收费)
		}

	}
	void showTime()
	{
		cout << mDate.getYear() << "-" << mDate.getMonth() << "-" << mDate.getDay() << " " << mTime.getHour() << ":" << mTime.getMint() << ":" << mTime.getSecond() << endl;
	}
};
int main()
{
	//使用Data类

	DateTime arriveTime1,leaveTime1;
	double parkingTime,Fee;
	arriveTime1.setYear(2021);
	arriveTime1.setMonth(3);
	arriveTime1.setDay(23);
	arriveTime1.setHour(9);
	arriveTime1.setMint(10);
	arriveTime1.setSecond(20);
	arriveTime1.showTime();
	leaveTime1.setYear(2021);
	leaveTime1.setMonth(6);
	leaveTime1.setDay(15);
	leaveTime1.setHour(18);
	leaveTime1.setMint(2);
	leaveTime1.setSecond(10);

	leaveTime1.showTime();
	parkingTime=leaveTime1.diff(arriveTime1);
	Fee=parkingFee(parkingTime);
	cout<<"收费"<<Fee<<endl;
	return 0;
}

double parkingFee(double dd)
{
	int bs = 2;  //每半小时按2元收费(这个根据实际修改,题目中没写)
	if (dd>=365)
	{
		return 30 * dd * 0.8;//按8折收费
	}else if (dd >= 30 && dd < 365)
	{
		return 30 * dd * 0.9;//按9折收费
	}else if(dd >=1 && dd < 30)
	{
		return 30 * dd;  //按每天30收费
	}else 
	{
		int hh = dd * 10;            //多少个小时
		int mm = dd* 100 - hh * 100; //用于判断有没有半小时
		if (mm > 0)
			return hh * 4 + bs;
		else
			return hh * 4;
	}

}