题目:
某个小朋友在自己某年生日(某年某月某日)时得到一个储蓄罐,从那天起小朋友有钱(0.1,0.2,0.5,1.0,5.0,10.0元面值)了就存起来。编写程序模拟存钱过程,计算至今日,小朋友各种不同面值的钱各有多少,总共存了多少钱。。
要求:利用 C+类与对象的知识进行编写程序。
假设每天都存一次,存钱面值是随机的。
思考:
钱的面值随机,用到随机函数rand(),可以利用产生的随机数对6求余,就可以得到1~6的随机数,分别代表6种不同面值的钱。每一天存的钱就是一个类的对象。
生日与当前日期的差值,可以先把两个日期都转换为天数,再相减。要注意闰年和平年的区别以及12个月份的不同天数
代码如下:
#include<iostream>
#include<cstdlib>
#include<ctime>
#include<vector>
using namespace std;
class Money
{
double m;
public:
static int n[6];//用于计算每种面值的钱的张数
Money();
};
class Date//日期
{
int year, month, day;
int chang_day();//转换日期
bool judge();//判断是否为闰年
public:
Date();
friend int operator-(Date& a, Date& b)//日期差
{
return(a.chang_day() - b.chang_day());
}
};
int Money::n[6] = { 0 };
Money::Money()
{
int a = rand() % 6;
double s[6] = { 0.1,0.2,0.5,1.0,5.0,10.0 };
m = s[a];//随机面值
n[a]++;//此面值钱加1
}
Date::Date()
{
int leap[12] = { 31,29,31,30,31,30,31,31,30,31,30,31 };//闰年
int unleap[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };//平年
cout << "年:";
cin >> year;
while (year <= 0)
{
cout << "输入的年份有误!请重新输入:\n";
cin >> year;
}
cout << "月:";
cin >> month;
while (month < 1 || month > 12)
{
cout << "输入的月份有误!请重新输入:\n";
cin >> month;
}
cout << "日:";
cin >> day;
while (judge() == 1 && (day > leap[month - 1] || day < 1))
{
cout << "输入的日期有误!请重新输入:\n";
cin >> day;
}
while (judge() == 0 && (day > unleap[month - 1] || day < 0))
{
cout << "输入的日期有误!请重新输入:\n";
cin >> day;
}
}
bool Date::judge()
{
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
return true;
else
return false;
}
int Date::chang_day()
{
int leap[12] = { 31,29,31,30,31,30,31,31,30,31,30,31 };//闰年
int unleap[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };//平年
int count = 0;
int ye = year;
count += day;
if (judge())//闰年
{
for (month-=1; month > 0; month--)
count += leap[month];
}
else
{
for (month-=1; month > 0; month--)
count += unleap[month];
}
for (year -= 1; year > 0; year--)
{
if (judge())
count += 366;
else
count += 365;
}
return count;
}
int main()
{
double s[6] = { 0.1,0.2,0.5,1.0,5.0,10.0 };
double total = 0;
cout << "请输入当前日期:\n";
Date a;
cout << "请输入此小朋友某年生日的日期:\n";
Date b;
int d= a - b;
cout <<"日期相差"<< d<<"天\n";
/*vector <Money> p;
p.resize(d);*/
Money* p = new Money[d];
for (int i = 0; i < 6; i++)
{
cout << "此小朋友面值为" << s[i] << "的钱有" << Money::n[i]<< "张\n";
total += s[i] * Money::n[i];
}
cout << "此小朋友总共存了" << total << "元\n";
delete p;
}
考试的时候,使用的编译器是vs,发现它不可以直接用变量定义对象数组的长度。后来找了2个方法。一个是动态申请内存空间,一个是利用STL的vector容器(我发现用它的resize函数也行,不知道对不对)。