问题描述

通过键盘输入某年某月某日,判断这一天是这一年的第几天

分析

要想判断是当年的第几天,要知道这月前每个月的天数(可能和年份有关),然后加上当月的日期就可以了。
每月的天数随年份变化的,主要是涉及到二月,即闰年问题。
首先判断月份,如果是一月、二月,无需判断是不是闰年;三月及以后月份需要对年份判断,相应计算天数。

源程序

C语言

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int year,month,day,leap=0,days=0;
  5. printf("请输入年、月、日,中间以空格隔开:\n");
  6. /*
  7. //这样也可以
  8. scanf("%d",&year);
  9. scanf("%d",&month);
  10. scanf("%d",&day);
  11. */
  12. scanf("%d %d %d",&year,&month,&day);
  13. //判断是否为闰年,是的话多加一天
  14. if(month>2)
  15. if((year%400==0)||(year%4==0&&year%100!=0))
  16. leap = 1;
  17. switch(month)
  18. { case 1:days=0;break; //一月之前的天数为0
  19. case 2:days=31;break;
  20. case 3:days=31+28;break;
  21. case 4:days=31+28+31;break;
  22. case 5:days=31+28+31+30;break;
  23. case 6:days=31+28+31+30+31;break;
  24. case 7:days=31+28+31+30+31+30;break;
  25. case 8:days=31+28+31+30+31+30+31;break;
  26. case 9:days=31+28+31+30+31+30+31+31;break;
  27. case 10:days=31+28+31+30+31+30+31+31+30;break;
  28. case 11:days=31+28+31+30+31+30+31+31+30+31;break;
  29. case 12:days=31+28+31+30+31+30+31+31+30+31+30;break;
  30. }
  31. /*
  32. //这一部分是当时写程序时检查用的,可以不写
  33. printf("year = %d\n",year);
  34. printf("month = %d\n",month);
  35. printf("day = %d\n",day);
  36. printf("leap = %d\n",leap);
  37. printf("days = %d\n",days);
  38. */
  39. days = day+leap+days;
  40. printf("这一天是%d年的第%d天",year,days);
  41. return 0;
  42. }

其中主体部分如果不使用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()

https://blog.csdn.net/qq_42327755/article/details/95911080

#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)