# 【程序设计】日期合法性
你已经和小渡一起看清了很多程序语言中的“是非”,这下,你又需要在没有任何小渡的帮助下完成一个任务啦。
这次的题目也不是很难。测试程序将随机给你一个格式为`-`连接了年、月、日的日期字符串(其中的数字都是没有前导零的,也就是说`7`不会被写成`07`)。你将需要判断这个日期在我们的公历体系内是否真实存在。如果存在则输出`YES`,否则输出`NO`。
测试程序给出的测试输入数据中,年、月、日都是正整数(也就是大于零的整数),均不大于 5000。
已知,一年有 1 月~ 12 月,共 12个不同的月份;其中 1月、3 月、5月、7 月、8 月、101月、12 月有 31 个合法的日,分别为 1 日~ 31 日;4 月、6 月、9 月、11 月有 30 个合法的日,分别为 1 日~ 30 日。对于闰年,2 月有 29 个合法的日,分别为 1 日~ 29 日;对于平年(不是闰年的年称为平年),2 月有 28 个合法的日,分别为 1 日~ 28日。
闰年的判断则遵循如下依据:
* 非整百年,能被4整除的为闰年。
* 整百年,能被400整除的是闰年。
#### 样例输入
~~~
2016-2-29
~~~
#### 样例输出
~~~
YES
~~~
*****
提示:
要想做好这道题,你需要先思考一下,如何使用`cin`去接收一个指定了格式的字符串中的量(在这里就是`-`前后的正整数)。给你一个小贴士——有的时候对于某些变量,我们可以只对其进行接收,而并不需要实际处理它哦!
当然,如果你实在想不出怎么使用`cin`来处理这个输入的话,你也可以放弃`cin`,使用 C 风格的`scanf`函数——这里你可以自行上网搜索,也可以直接参阅这门课程的最后一章《历史的行程——C++ 的过去和未来》中的第一节《C 风格的格式输入输出函数》。相信在做过这个题之后,你会对 C++ 的特点有更进一步的认识。
之后呢,你需要做很多的判断,会用到我们已经学过的 `if... else...` 的嵌套结构。你将需要:
* 判断一下输入的年是不是闰年;
* 知道年份是不是闰年后,你还需要判断月份数字的合法性,是否月份数字不是一个合法的月份值;
* 知道月份后,你还要判断日的合法性(特别要注意,对于 222 月的日子数在闰年和平年的不同)。
如果你怕自己逻辑混乱,画一画具体的逻辑将很有帮助喔!
\*\*小贴士:\*\*对于 1 < x < 3 这样的情况判断一定要写成`1 < x && x < 3`喔。
*****
```
#include<bits/stdc++.h>
using namespace std;
int main(){
int year,month,day;
scanf("%d-%d-%d",&year,&month,&day);
if((year%4==0&&year%100!=0)||year%400==0){
if(month==2){
if(day>=1&&day<=29){
cout<<"YES";
}else{
cout<<"NO";
}
}else if(month==1||month==3||month==5||month==7||month==8||month==10||month==12){
if(day>=1&&day<=31){
cout<<"YES";
}else{
cout<<"NO";
}
}else if(month==4||month==6||month==9||month==11){
if(day>=1&&day<=30){
cout<<"YES";
}else{
cout<<"NO";
}
}else{
cout<<"NO";
}
}else{
if(month==2){
if(day>=1&&day<=28){
cout<<"YES";
}else{
cout<<"NO";
}
}else if(month==1||month==3||month==5||month==7||month==8||month==10||month==12){
if(day>=1&&day<=31){
cout<<"YES";
}else{
cout<<"NO";
}
}else if(month==4||month==6||month==9||month==11){
if(day>=1&&day<=30){
cout<<"YES";
}else{
cout<<"NO";
}
}else{
cout<<"NO";
}
}
}
```
```
#include<iostream>
using std::cin;
using std::cout;
using std::endl;
int f[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool is_leap(int y){
return y%400==0||(y%4==0&&y%100);
}
int main(){
int y,m,d;
char op;
cin>>y>>op>>m>>op>>d;
if(m==2){
f[m]+=is_leap(y);
}
if(m>=1&&m<=12&&d>0&&d<=f[m]){
cout<<"YES"<<endl;
}
else{
cout<<"NO"<<endl;
}
return 0;
}
```
- 教材介绍
- 《编程初学入门常识》
- 什么是程序语言
- 【知识精讲】编程与编程语言
- 【选择测试】编程语言分类
- 【知识精讲】高级语言分类
- 【选择测试】编译与解释
- 【选择测试】程序员笑话-Java
- 熟悉键盘上用于编程的键位
- 【知识精讲】认识你的键盘
- 【知识精讲】中文和英文字符
- 【匹配测试】识别中英文符号
- 【选择测试】中英文符号的影响
- 【伴随编程】不要使用中文引号
- 【伴随编程】不要使用中文分号
- 【伴随编程】正确地输入符号
- 【选择测试】找出程序中的错误
- 初始工程师思维
- 【知识精讲】二进制思想
- 【选择测试】程序员笑话-凑整
- 【知识精讲】闭合的逻辑
- 【选择测试】程序员笑话-条件
- 程序员职业与生活
- 【知识精讲】程序员的发展方向
- 【知识精讲】程序员的装备
- 【知识精讲】程序员的健康
- 【选择测试】做一名健康的程序员
- 《C++程序设计》
- 前言
- 【知识精讲】编程与计算机科学
- 【知识精讲】编程与软件工程
- 【知识精讲】如何学习编程
- 你好C++
- 【知识精讲】你好,C++
- 【知识精讲】C++程序是如何开发的
- 【知识精讲】成为一名Power User
- 【伴随编程】让我们一起说你好
- 【知识精讲】你的第一个C++语言程序
- 【伴随命令】编译、运行你的程序
- 【伴随编程】将变量流式输出
- 【选择测试】变量的作用域
- 【知识精讲】变量与数据类型
- 【匹配测试】C++语言的入门概念
- 【知识精讲】在程序中学会换行
- 【选择测试】正确地换行
- 简单数学运算
- 【知识精讲】重新认识基本运算
- 【选择测试】运算符的理解
- 【伴随编程】做一下简单的运算
- 【伴随编程】a 的 n 次方
- 【知识精讲】数学函数
- 【伴随编程】让C++语言变成计算器
- 【伴随编程】计算球的体积
- 【匹配测试】数学世界知多少
- 【知识精讲】在程序中添加注释
- 【选择测试】正确地写注释
- 从伴随输入到变量地址
- 【伴随编程】 一个数字复读机器
- 【选择测试】理解标准输入输出
- 【伴随编程】一个加法计算器
- 【程序设计】A+B+C问题
- 【伴随编程】简单的I/O格式控制
- 【知识精讲】地址与取地址符
- 【伴随编程】看看我们的地址
- 习题一:面积与周长
- 【程序设计】矩形面积与周长
- 【程序设计】三角形面积与周长
- 【程序设计】圆形面积与周长
- 程序中的是与非
- 【知识精讲】是非的表示与关系运算
- 【伴随编程】验一验关系运算式
- 【选择测试】关系运算式求值
- 【知识精讲】如果的意义
- 【伴随编程】分段函数求值
- 【知识精讲】如果之后的如果
- 【伴随编程】五则运算器
- 【选择测试】分支的嵌套
- 【伴随编程】问号表达式
- 【知识精讲】是非之间的逻辑组合
- 【伴随编程】判断闰年
- 【程序设计】日期合法性
- 【知识精讲】多路顺序结构
- 【知识精讲】在程序中学会缩进
- 【选择测试】正确的缩进
- C++程序中的苦力
- 【知识精讲】使用循环结构
- 【选择测试】对比两种循环
- 【伴随编程】使用while循环
- 【填空测试】理解循环结构
- 【知识精讲】自减和自增运算符
- 【伴随编程】使用自增运算符
- 【知识精讲】for循环
- 【选择测试】for循环的使用
- 【程序设计】一大波好玩儿的程序
- 《代码能力快速提升》
- 《基础数据结构》
- 《搜索入门》
- 《动态规划基础》
- 《数论和基础数学》
- 《图和数基础》