用Python打印某年日歷


【純文本教程】大學專科的Python基礎開發課——【實訓項目】打印某年日歷

用Python打印某年日歷

項目目標:

    日歷程序可以打印出任何一年的日歷,程序運行后輸入一個年份,例如2017,或者是2020,打印出全年的日歷,示例可以參考Windows操作系統自帶的日歷。

項目設計(思路):

 

第一步,閏年的判斷

【常識·閏年的定義】判斷年份y是否是閏年,需要滿足兩個條件之一:

    (這里有一個沒有明說的前提條件——“閏年”是在“公元元年”之后,而“公元前”的年份不參與閏年、平年的判斷;就像“質數”與“合數”是在大於1的正整數中一樣。當然,公歷的年份默認是整數就不說了。)

    一是400的正整數倍數

    二是4的正整數倍數中的非整百數

這里再強調一遍“閏年判斷函數”

def isLeap(y):
 return y%400==0 or y%4==0 and y%100!=0#在這里面,“and”的優先級要高於“or”,因此是先計算后面的“and”,再計算前面的“or”。

 

第二步,某月最大天數的判斷

【常識·歷法·公歷】某個月份的最大天數:

    大月(1、3、5、7、8、10、12)是31天;

    2月特殊(平年28天,閏年29天)

設計“最大天數判斷函數”(返回y年m月的最大天數)

def maxDays(y,m):
 if m==1 or m==3 or m==5 or m==7 or m==8 or m==10 or m==12:
  d = 31
 elif m==2:
  d = 29 if isLeap(y) else 28
 return d

 

第三步,判斷某月1日是星期幾

計算y年m月d日是當年的第幾天,然后才能夠配合星期,正確顯示

def countDays(y,m,d):
 days = d
 if m>=2:
  days+=31
 if m>=3:
  days+=29 if isLeap(y) else 28
 if m>=4:
  days+=31
 if m>=5:
  days+=30
 if m>=6:
  days+=31
 if m>=7:
  days+=30
 if m>=8:
  days+=31
 if m>=9:
  days+=31
 if m>=10:
  days+=30
 if m>=11:
  days+=31
 if m>=12:
  days+=30
 return days

m=5的時候,就累加前4個月的天數——31+(28 or 29)+31+30

    關於某天是星期幾,有一個公式:((y-1)+(y+1)//400+(y-1)//4-(y-1)//100+countDays(y,m,1))%7,除以七取余數,就能夠知道這一天是星期幾;然后再進行設置——為了省事兒,0是星期日(余數是幾,就對應星期幾)。

def countWeek(y,m):#計算y年的元旦是星期幾
 w = ((y-1)+(y+1)//400+(y-1)//4-(y-1)//100+countDays(y,m,1))
 return w%7

 

第四步,打印1月的日歷/打印一個月的日歷?

    設計每個日期占輸出寬度6個字符,一個“單元”是6個位置,則7個日期占42字符寬度,計算y年m月1日是星期w,然后通過:

for i in range(w):
 print(“%-6s”%d,end=””)
#顯示w個空“單元”,然后使用
 for d in range(1,md+1):#這個“md”是什么?
  print(“%-6s”%d,end=””)
  w = w + 1
  if w%7 == 0:
   print()#當w是7的倍數的時候,換行,打印下一個星期(哎?等等,不是設置了0到6了嗎,為什么會有7?)

 

第五步,打印當年的日歷——最終代碼

    必須要先正確打印1月的日歷,然后才能夠正確打印每個月的日歷。

完整代碼如下:

'''
 程序用途:【實訓項目】打印某年日歷
 編寫日期:2020年5月6日
 所需知識:Python流程控制、Python函數
'''
def isLeap(y):#第一個函數是閏年判斷
 return y%400==0 or y%4==0 and y%100!=0

 

def maxDays(y,m):#第二個函數是判斷每個月的最大天數
 d = 30
 if m == 1 or m == 3 or m == 5 or m == 7 or m == 8 or m == 10 or m == 12:
  d = 31
 elif m == 2:
  d == 29 if isLeap(y) else 28
 return d

 

def countDays(y,m,d):#第三個函數是判斷星期幾
 days = d
 if m>=2:
  days+=31
 if m>=3:
  days+=29 if isLeap(y) else 28
 if m>=4:
  days+=31
 if m>=5:
  days+=30
 if m>=6:
  days+=31
 if m>=7:
  days+=30
 if m>=8:
  days+=31
 if m>=9:
  days+=31
 if m>=10:
  days+=30
 if m>=11:
  days+=31
 if m>=12:
  days+=30
 return days

 

def countWeek(y,m):# 第四個函數是計算y年的元旦是星期幾
 w = ((y-1)+(y+1)//400+(y-1)//4-(y-1)//100+countDays(y,m,1))
 return w%7

 

def printMonth(y,m):# 第五個函數是逐月顯示
 w = countWeek(y,m)
 md = maxDays(y,m)
 print("%-6s%-6s%-6s%-6s%-6s%-6s%-6s" % ("Sun","Mon","Tue","Wed","Thu","Fri","Sat"))
 for i in range(w):
  print("%-6s" % "", end="")
 for d in range(1, md+1):
  print("%-6d" % d, end="")
  w = w + 1
  if w % 7 == 0:
   print()

 

#自定義函數到此結束,然后進入主程序
y = int(input("輸入年份:"))
for m in range(1, 13):#從1月份打印到12月份
 print()
 print("--------------",y,"年",m,"月--------------")
 printMonth(y, m)
 print()


    本頁面屬於系列“【純文本教程】大學專科的Python基礎開發課”里面的第一個相對完整的項目,此系列的其它網頁,我還在對Word版課堂筆記進行校對,敬請期待!

    “Python基礎開發”算是本人大二第二學期最重要的一門課程了,課程表上是2020年4月21日~6月12日學習理論知識,2020年6月15日~7月3日進行“校內集中實訓”。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM