东华oj-5 银行存款到期日(输出年月日方法2-数组)

题目

银行存款有3个月、6个月定期等。从键盘输入一个日期(即为存款日期)以及定期的时间长度(单位为月,输入的时间长度可为小于等于60的任意正整数),请编程输出该定期存款的到期日期。 下面以3个月定期为例,说明定期的概念。

比如:

输入2014年4月30日,则到期日是2014年7月30日;

输入2014年3月31日,则到期日是2014年6月30日(6月没有31日,所以30日就到期);

输入2014年11月30日,则到期日是2015年2月28日;

输入2015年11月30日,则到期日是2016年2月29日。

自己代码(方法1:switch判断平润年)

#include<iostream>
#include <string>
#include<fstream>
using namespace std;
//Switch_days()输出到期月份最大天数函数---方法1:switch判断平润年
int Switch_days(int y,int m1) {
	int d1 = 0;
	switch (m1)
	{
	case 1:
	case 3:
	case 5:
	case 7:
	case 8:
	case 10:
	case 12:
		return 31;
		break;
	case 2:
		if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) {
			return 29;
		}
		else {
			return 28;
		}
		break;
	default:
		return 30;
		break;
	}
}
int main()
{
	int y, m, d, k, y1, m1, d1,d1max;
	cin >> y >> m >> d >> k;
	m1 = m + k;//到期月份
	if (m1 < 12) {//今年到期
		y1 = y;
		d1max = Switch_days(y, m1);//到期月份所在的总天数
		if (d > d1max) {
			d1 = d1max;
		}
		else {
			d1 = d;
		}
	}
	else {//明年到期
		y1 = y + 1;
		m1 -= 12;
		d1max = Switch_days(y1, m1);
		if (d > d1max) {
			d1 = d1max;
		}
		else {
			d1 = d;
		}
	}
	cout << y1 << " " << m1 << " " << d1;
	return 0;
}

反思 :以下的代码用了两次,并且仔细观察发现,可以采用C++ 条件运算符 ? :
改进前:

if (d > d1max) {
			d1 = d1max;
		}
		else {
			d1 = d;
		}

改进后:

d1 = (d > d1max) ? d1max : d;

借鉴网上大佬

#include<iostream>
#include <string>
#include<fstream>
using namespace std;
int main()
{
	int y, m, d, k, y1, m1, d1;
	int d1max[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };//平年每月的总天数

	cin >> y >> m >> d >> k;
	m1 = m + k;//“到期月份”
	if (m1 < 12) {
		y1 = y;
	}
	else {
		y1 = y + 1;
		m1 -= 12;
	}
	if ((y1 % 4 == 0 && y1 % 100 != 0) || y1 % 400 == 0)//润年
	{
		d1max[2] = 29;
	}
	d1 = (d > d1max[m1]) ? d1max[m1] : d;
	cout << y1 << " " << m1 << " " << d1;
	return 0;
}

还是不给过…
最后还是只能参考网上标准答案

#include <stdio.h>
int main(){
	int y, m, d, t;//year month day time
	int month[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
	while ((scanf("%d%d%d%d",&y,&m,&d,&t)!=EOF))
	{
		m += t;
		while (m > 12){
			m = m - 12;
			y++;
		}
		if ((y % 400 == 0) || (y % 4 == 0 && y % 100 != 0))
			month[2]++;
		printf("%d %d %d\n", y, m, d < month[m] ?  d:month[m]);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值