模拟储蓄罐

题目:
某个小朋友在自己某年生日(某年某月某日)时得到一个储蓄罐,从那天起小朋友有钱(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函数也行,不知道对不对)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值