问题描述
分析
要想判断是当年的第几天,要知道这月前每个月的天数(可能和年份有关),然后加上当月的日期就可以了。
每月的天数随年份变化的,主要是涉及到二月,即闰年问题。
首先判断月份,如果是一月、二月,无需判断是不是闰年;三月及以后月份需要对年份判断,相应计算天数。
源程序
C语言
#include<stdio.h>
int main()
{
int year,month,day,leap=0,days=0;
printf("请输入年、月、日,中间以空格隔开:\n");
/*
//这样也可以
scanf("%d",&year);
scanf("%d",&month);
scanf("%d",&day);
*/
scanf("%d %d %d",&year,&month,&day);
//判断是否为闰年,是的话多加一天
if(month>2)
if((year%400==0)||(year%4==0&&year%100!=0))
leap = 1;
switch(month)
{ case 1:days=0;break; //一月之前的天数为0
case 2:days=31;break;
case 3:days=31+28;break;
case 4:days=31+28+31;break;
case 5:days=31+28+31+30;break;
case 6:days=31+28+31+30+31;break;
case 7:days=31+28+31+30+31+30;break;
case 8:days=31+28+31+30+31+30+31;break;
case 9:days=31+28+31+30+31+30+31+31;break;
case 10:days=31+28+31+30+31+30+31+31+30;break;
case 11:days=31+28+31+30+31+30+31+31+30+31;break;
case 12:days=31+28+31+30+31+30+31+31+30+31+30;break;
}
/*
//这一部分是当时写程序时检查用的,可以不写
printf("year = %d\n",year);
printf("month = %d\n",month);
printf("day = %d\n",day);
printf("leap = %d\n",leap);
printf("days = %d\n",days);
*/
days = day+leap+days;
printf("这一天是%d年的第%d天",year,days);
return 0;
}
其中主体部分如果不使用break语句也可以这样去写:
switch(month)
{ case 12:days+=30; //11月的天数
case 11:days+=31;
case 10:days+=30;
case 9:days+=30;
case 8:days+=31;
case 7:days+=30;
case 6:days+=31;
case 5:days+=30;
case 4:days+=31;
case 3:days+=28;
case 2:days+=31;
case 1:days+=0;
}
python
使用python编程的思路和上面一致,同样的代码结构
#coding:gbk
while True:
#用户输入相关信息
year = int(input("请输入年份:"))
month = int(input("请输入月份:"))
day = int(input("请输入几号:"))
#当月份在二月后时,判断是否闰年
if month>2:
if (year%400 == 0) or (year%100 != 0 and year % 4 ==0):
leap = 1
else:
leap = 0
#使用伪switch语句
def case1():
return 0
def case2():
return 0+31
def case3():
return 0+31+28
def case4():
return 0+31+28+31
def case5():
return 0+31+28+31+30
def case6():
return 0+31+28+31+30+31
def case7():
return 0+31+28+31+30+31+30
def case8():
return 0+31+28+31+30+31+30+31
def case9():
return 0+31+28+31+30+31+30+31+31
def case10():
return 0+31+28+31+30+31+30+31+31+30
def case11():
return 0+31+28+31+30+31+30+31+31+30+31
def case12():
return 0+31+28+31+30+31+30+31+31+30+31+30
def default():
return 100000
switch ={1:case1,
2:case2,
3:case3,
4:case4,
5:case5,
6:case6,
7:case7,
8:case8,
9:case9,
10:case10,
11:case11,
12:case12
}
days = switch.get(month,default)()
print("这一天是此年的第%d天"%(day+leap+days))
延伸
1.改进(数组的使用)
从上面两个程序可以看出,在计算每个月的天数时重复了很多次,而对于月份来说,每个月的天数是固定的。因此可以考虑将12个月份的天数存储在一个列表中(对于C语言来说是一维数组),使代码变得整洁一些。
#coding:gbk
while True:
#用户输入相关信息
year = int(input("请输入年份:"))
month = int(input("请输入月份:"))
day = int(input("请输入几号:"))
#当月份在二月后时,判断是否闰年
if month>2:
if (year%400 == 0) or (year%100 != 0 and year % 4 ==0):
leap = 1
else:
leap = 0
#计算之前月份的天数,先按平年进行计算
dayslist = [0,31,28,31,30,31,30,31,31,30,31,30]
days = 0
for mon in range(1,month):
days += dayslist[mon]
days = leap + days + day
print(str(leap))
print("这一天是此年的第%d天"%days)
#include<stdio.h>
int main()
{
while(1)
{
int year,month,day,leap=0,days=0;
int dayslist[] = {0,31,28,31,30,31,30,31,31,30,31,30};//平年时每个月份之前每月的天数,使用一维数组存储
printf("请输入年、月、日,中间以空格隔开:\n");
scanf("%d %d %d",&year,&month,&day);
//判断是否为闰年,是的话多加一天
if(month>2)
if((year%400==0)||(year%4==0&&year%100!=0))
leap = 1;
int mon;
for(mon=0;mon<month;mon++)
{
days += dayslist[mon];
}
days = day+leap+days;
printf("这一天是%d年的第%d天\n",year,days);
}
return 0;
}
2.如何判断某一天是第几周、周几?
算出天数后与七相除,商反映周数,余数反映周几
下面利用python讲解
https://blog.csdn.net/weixin_43625577/article/details/85102433
#coding:gbk
#已知2020年6月24日为周三,随机输入日期,计算出星期几
while True:
#用户输入相关信息
print("已知2020年6月24日为周三.输入日期,计算出星期几")
year = int(input("请输入年份:"))
month = int(input("请输入月份:"))
day = int(input("请输入几号:"))
#定义一个判断是否为闰年的函数
def getleap(year,month):
leap0 = 0
if month>2:
if (year%400 == 0) or (year%100 != 0 and year % 4 ==0):
leap0 = 1
return leap0
#定义一个计算输入日期,当年的月份之前总天数的函数
def getdays(month):
dayslist = [0,31,28,31,30,31,30,31,31,30,31,30]
days = 0
for mon in range(1,month):
days += dayslist[mon]
return days
#根据年份不同分别计算距离2020年6月24日的总天数
#利用之前的程序可以计算出2020年6月24日是2020年的第176天
def get_total_day(year,month,day):
if year == 2020:
if month>6:
total_day = getleap(2020,month)+getdays(month)+day-176
elif month==6 and day<24:
total_day = 24-day
else:
total_day = -getleap(2020,month)-getdays(month)-day+176
total_leap = 0
if year>2020:
for y in range(2020,year):
total_leap += getleap(y,12)
total_day = -(365*(year-2020)+total_leap + getdays(month) + day-176)
if year<2020:
for y in range(year,2020):
total_leap += getleap(y,12)
total_day =176 + 365*(2020-year)-(total_leap + getdays(month) + day)
return total_day
def get_what_day(totalday):
weekday = totalday%7
if weekday ==0:
what_day = "周三"
elif weekday ==1:
what_day = "周二"
elif weekday ==2:
what_day = "周一"
elif weekday ==3:
what_day = "周日"
elif weekday ==4:
what_day = "周六"
elif weekday ==5:
what_day = "周五"
elif weekday ==6:
what_day = "周四"
return what_day
total_day = get_total_day(year, month, day)
print("距离2020年6月24日的天数为:%d"%total_day)
what_day = get_what_day(total_day)
print("{}年{}月{}日是{}".format(year,month,day,what_day))
3.python中查询周几的快捷方法
python中提供了查询周几的函数strftime()
#coding:gbk
import datetime
import time
weekday=time.strftime("%w") #当前的日期
print(weekday)
date_str = input("请输入查询的日期(yyyy-mm-dd):")
weekday = datetime.datetime.strptime(date_str, '%Y-%m-%d').strftime("%w")
print(weekday)