# 【程序設計】日期合法性
你已經和小渡一起看清了很多程序語言中的“是非”,這下,你又需要在沒有任何小渡的幫助下完成一個任務啦。
這次的題目也不是很難。測試程序將隨機給你一個格式為`-`連接了年、月、日的日期字符串(其中的數字都是沒有前導零的,也就是說`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循環的使用
- 【程序設計】一大波好玩兒的程序
- 《代碼能力快速提升》
- 《基礎數據結構》
- 《搜索入門》
- 《動態規劃基礎》
- 《數論和基礎數學》
- 《圖和數基礎》