停车场计费系统的升级思考:(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;
}
}