编程题#4:Tomorrow never knows?
来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)
注意: 总时间限制: 1000ms 内存限制: 65536kB
描述
甲壳虫的《A day in the life》和《Tomorrow never knows》脍炙人口,如果告诉你a day in the life,真的会是tomorrow never knows?相信学了计概之后这个不会是难题,现在就来实现吧。
读入一个格式为yyyy-mm-dd的日期(即年-月-日),输出这个日期下一天的日期。可以假定输入的日期不早于1600-01-01,也不晚于2999-12-30。
输入
输入仅一行,格式为yyyy-mm-dd的日期。
输出
输出也仅一行,格式为yyyy-mm-dd的日期
样例输入
2010-07-05
样例输出
2010-07-06
提示
闰年的标准:
(1)普通年能被4整除且不能被100整除的为闰年。(如2004年就是闰年,1901年不是闰年)
(2)世纪年能被400整除的是闰年。(如2000年是闰年,1100年不是闰年)
可以利用一个字符变量吃掉输入的短横线(减号),输出时请活用setfill和setw 控制符。
//
// main.cpp
// test
//
// Created by SpyThree on 16/9/16.
// Copyright © 2016年 SpyThree. All rights reserved.
//
#include <iostream>
#include <iomanip>
using namespace std;
int day, month, year;
int day_Initial, month_Initial, year_Initial;
char slash;
int get_Day();
int get_Month();
int get_Year();
bool odd_OrNot();
int main(){
cin >> year_Initial >> slash >> month_Initial >> slash >> day_Initial;
year = get_Year();
month = get_Month();
day = get_Day();
cout << year << slash << month << slash << day << endl;
}
int get_Day(){
if (month_Initial == 2 && day_Initial == 28) {
if (odd_OrNot() == true) {
day = 29;
}else if (month_Initial == 2)
day = 1;
}else
switch (month_Initial) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
if (day_Initial == 31) {
day = 1;
}else{
day = day_Initial + 1;
}
break;
case 4:
case 6:
case 9:
case 11:
if (day_Initial == 30) {
day = 1;
} else {
day = day_Initial + 1;
}
break;
case 2:
if (day_Initial == 29)
day = 1;
break;
default:
break;
}
return day;
}
int get_Month(){
if (month_Initial == 2 && day_Initial == 28) {
if (odd_OrNot() == true) {
month = 2;
}else if ( month_Initial == 2)
month = 3; //这里不太严谨,因为如果是2-29则依然判断为2月,此处在后面switch处作了覆盖
}else
switch (month_Initial) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
if (day_Initial == 31) {
month = month_Initial + 1;
}else{
month = month_Initial;
}
break;
case 4:
case 6:
case 9:
case 11:
if (day_Initial == 30) {
month = month_Initial + 1;
} else {
month = month_Initial;
}
break;
case 12:
month = 1;
break;
case 2:
if (day_Initial == 29)
month = 3;
break;
default:
break;
}
return month;
}
int get_Year(){
if (month_Initial == 12 && day_Initial == 31)
year = year_Initial + 1;
else
year = year_Initial;
return year;
}
bool odd_OrNot(){
if (year_Initial % 4 == 0 && year_Initial % 400 != 0) {
return true;
} else {
return false;
}
}
很重要的一点是,编程时一定要跟着正常思维一步一步走,正常情况我们怎么判断下一点是几号,写程序就照此分类写条件。