用python实现万年历,输入年份输出12个月的月历,输入年、月则输出该月月历,输入年月日则输出该天为星期几

用python实现万年历,输入年份输出12个月的月历,输入年、月则输出该月月历,输入年月日则输出该天为星期几

问题描述:

请为如下万年历程序进行自顶向下设计,画出模块图,并实现之。
它的功能是:用户输入某年、某月、某日,程序输出这一天是星期几;
用户输入某年、某月,程序输出该年该月的每一天是星期几;用户输入某年,
程序输出该年每一月的每一天是星期几。该程序的求解方案是:
为给定的年、月、日计算它距离1900年1月1日(星期一)的天数,从而得出是星期几(注意要考虑间隔年为闰年的情况)。

思路·

img

MonthDays_year=[31,28,31,30,31,30,31,31,30,31,30,31]
#平年每月天数
MonthDays_leapy=[31,29,31,30,31,30,31,31,30,31,30,31]
#闰年每月天数
twelfthMonth=[1,3,5,7,8,10,12]#为腊月的月份
week={0:'Monday',1:'Tuesday',2:'Wednesday',3:'Thursday',4:'Frindy',5:'Saturday',6:'Sunday'}
#星期对应字典方便输出结果

#判断闰年的函数
def leapyear(year):
    if year%4==0 and year%100!=0 or year%400==0:
        l=1
    else:
        l=0
    return l

#计算据输入年份第一天 到 标的日1900年1月1日前的总天数
def yeardays(year):
    day1=0
    if year>=1900:
        for i in range(1900,year):
            if leapyear(i)==1:
               day1+=366
            else:
               day1+=365
    else:
        for i in range(year,1900):
            if leapyear(i)==1:
               day1+=366
            else:
               day1+=365
    return day1

#计算输入月份 到 输入年份第一天的总天数
def monthdays(year,month):
    day2=0
    if leapyear(year)==1:
        for i in range(0,month):
            day2=day2+MonthDays_leapy[i]
    else:
        for i in range(0,month):
            day2=day2+MonthDays_year[i]
    return day2
#计算输入月份前一天 到 输入年份第一天的总天数
def monthdays1(year,month):
    day2=0
    if leapyear(year)==1:
        for i in range(0,month-1):
            day2=day2+MonthDays_leapy[i]
    else:
        for i in range(0,month-1):
            day2=day2+MonthDays_year[i]
    return day2
# 定义计算本月的天数
def thisMonthDays(year, month):
    if month in twelfthMonth:
        return 31
    elif leapyear(year)==1 and month == 2:
        return 29
    elif leapyear(year)==0 and month == 2:
        return 28
    else:
        return 30
    
#函数CaculateWeekDay(year,month,days),当用户输入的时年月日类型的数据时,输出该天是星期几
def CaculateWeekDay(year,month,days):
    m=0
    yeardays(year)
    monthdays(year,month)
    m=yeardays(year)+monthdays1(year,month)+days-1
    print('输入日期为:',week[(m%7)])

# 定义打印顶部标题栏函数
def printTitle(year, month):
    print("-" * 36, "%s年%d月"%(year,month), "-" * 36)
    s = ("星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六")
    for i in s:
        print("%-10s" % i, end="")
    print()


# 计算本月一号是星期几的函数
def week(year, month):
    thisDay = 0
    yDays = yeardays(year)
    mDays = monthdays1(year, month)
    # 计算出来年天数和月天数的总和
    if year >= 1900:
        sumDays = yDays + mDays
        thisDay = (sumDays % 7) +1
    else:
        sumDays = yDays - mDays
        thisDay = 7-(sumDays%7)
    return thisDay    
#当用户输入数据为某年某月时,利用Calendarmonth(year,month)
def Calendarmonth(year,month):
    printTitle(year, month)
    day1 = week(year, month)
    day2 = thisMonthDays(year, month)
    # 打印空白地方
    if day1 != 7:
        for i in range(1, day1 + 1):
            s = " "
            print("%-13s" % s, end="")
    # 打印其他地方
    for j in range(day1 + 1, day1 + day2 + 1):

        if j % 7 == 0:
            print("%-13d" % (j - day1))
        else:
            print("%-13d" % (j - day1), end="")

#当用户输入数据为某年时,打印该年所有月历
def Calendaryear(year):
    for i in range(1,13):
        Calendarmonth(year,i)
        print()
def Calendar():
    year=int(input('请输入要查询的年份:'))
    month=int(input('请输入要查询的月份,若仅查年请输入0:'))
    days=int(input('请输入要查询的日期,若仅查月历或年历输入0:'))
    
    if year!=0 and month!=0 and days!=0:
        CaculateWeekDay(year,month,days)    
    elif year!=0 and month!=0 and days==0:
        Calendarmonth(year,month)
    else:
        Calendaryear(year)

Calendar()