文章目录
前言
本系列为C语言菜鸟100道基础经典例题详解刷题系列。每天1题,点滴成长,一起逆袭。
一、题目描述
题目:输入某年某月某日,判断这一天是这一年的第几天?
二、题目分析
以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。
三、解题
(1)解题方法一—数组(推荐)
1. 思路
数组
2. 程序运行
#include<stdio.h>
int main()
{
int year, month, day,sumday=0;
int monthday[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
printf("请输入年、月、日,格式为:年,月,日(2015,12,10)\n");
scanf("%d,%d,%d",&year,&month,&day);
//判断闰年
if (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0))
{
monthday[1] =29;
}
//计算某月以前月份的总天数
for (int i = 0; i < month-1; i++)//数组下标从0开始
{
sumday += monthday[i];
}
sumday += day;
printf("%d\n",sumday);
return 0;
}
3. 程序运行结果
2015,12,10
344
(2)解题方法二—switch(常用)
1. 思路
2. 程序运行
//判断某年某日是第几天
# include <stdio.h>
int main()
{
int year,month,day,num=0;
printf("请输入一个日期:(年月日)");
scanf("%d %d %d",&year,&month,&day);
switch (month-1)
{
//必须case从大到小!!!1
case 11:
num += 30;
case 10:
num += 31;
case 9:
num += 30;
case 8:
num += 31;
case 7:
num += 31;
case 6:
num += 30;
case 5:
num += 31;
case 4:
num += 30;
case 3:
num += 31;
case 2:
{
if ((year % 4 == 0&&year % 100 !=0) ||(year %100 == 0))
{
num += 29;
} else num += 28;
}
case 1:
num += 31;
case 0:
num +=0;
break;
}
num += day;
printf("这是第%d天",num);
return 0;
}
(3)解题方法三—switch
1. 思路
2. 程序运行
#include <stdio.h>
int main() {
int day,month,year,sum,leap;
printf("\n请输入年、月、日,格式为:年,月,日(2015,12,10)\n");
scanf("%d,%d,%d",&year,&month,&day); // 格式为:2015,12,10
switch(month) { // 先计算某月以前月份的总天数
case 1:
sum=0;
break;
case 2:
sum=31;
break;
case 3:
if(year%400==0||(year%4==0&&year%100!=0)) {// 判断是不是闰年
sum+=60;
} else {
sum=59;//平年2月28天
}
break;
case 4:
sum=90;
break;
case 5:
sum=120;
break;
case 6:
sum=151;
break;
case 7:
sum=181;
break;
case 8:
sum=212;
break;
case 9:
sum=243;
break;
case 10:
sum=273;
break;
case 11:
sum=304;
break;
case 12:
sum=334;
break;
default:
printf("data error");
break;
}
sum=sum+day; // 再加上某天的天数
printf("这是这一年的第 %d 天。",sum);
printf("\n");
}
(4)解题方法三—函数
1. 思路
函数
2. 程序运行
#include<stdio.h>
//某月的天数
int getMonthDay(int month)
{
int day = 0;
switch(month){
case 2:
day = 28;
break;
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
day = 31;
break;
case 4:
case 6:
case 9:
case 11:
day = 30;
break;
}
return day;
}
//是否闰年
int isleap(int year)
{
if ( (year%4==0 && year%100!=0) || (year%400==0) ){
return 1;
}
return 0;
}
int main()
{
int year, month, day;
printf("请输入年月日:\n");
scanf("%d,%d,%d", &year, &month, &day);
int days = day, m;
// 计算某月以前月份的总天数
for(m=1; m<month; m++){
days += getMonthDay(m);
}
if (isleap(year)==1&&month>2) { // *如果是闰年且月份大于2,总天数应该加一天
){
days += 1;
}
printf("%d-%d-%d是这一年的第%d天", year, month, day, days);
return 0;
}
总结
每月天数口诀:
1,3,5,7,8,10,腊(12)31天永不差,平年2月28,闰年2月29.
判断是否为闰年:
if ( (year%4=0 && year%100!=0) || (year%400=0) )
能被4整除同时不能被100整除或者是能被400整除的数均为闰年