1. 程式人生 > >python 編寫輸出日曆詳細解析

python 編寫輸出日曆詳細解析

python編寫萬年曆,輸入某一年某一月,顯示這個月的日曆 

執行如下:



主要是思想和方法,程式碼不是那麼的完美,因此不足之處敬請見諒。

我將它分成三個板塊分別是 年、月、周。你可能會有疑問,不是是“年月日”麼,為什麼成了年月周了,到後面就知道了。

   它的思想是從某一個起始年算起(這個“某一年”你可以自己定義),一直到你所輸入的年份的前一年(因為你輸入的這一年還沒有結束,只能計算之前經過的年份),輸入月份的前一個月(因為這一月也沒有結束,只能計算之前已經經過的月份),累計一共是多少天,然後計算出這個月第一個星期前面的空格數,從而進行輸出,比如我是從1900年算起,輸入 2018年 3 月 ,則會計算從1991--2017年以及2018年 1、2月的天數,如下所示 



前面有四個空格,然後迴圈輸入這一月的天數,逢7換行。這其中包括閏年的判斷,是不是閏月,每月是多少天。後面的程式碼我會詳細解釋加深理解。其實Java 、C 、C++ 都是這樣的原理。

為了減少程式碼的行數,我進行了一些精簡,不是很標準。

year = int(input("請輸入年份:"))
if((year %4 == 0 and year %100 != 0) or (year % 400 == 0)):run = True
else:run = False     #這行也可以不用寫
i = 1900
sum = 0
while i < year - 1:
    i += 1
    if((i % 4 == 0 and i % 100 != 0) or (i % 400 == 0)):sum += 366
    else: sum += 365
month = int(input("請輸入月份:"))
j = 1
while j < month:
    if((j == 1) or (j == 3) or (j == 5) or (j == 7) or (j == 8) or (j == 10) or (j == 12)):sum += 31
    elif j == 2:
        if run:sum += 29
        else: sum += 28
    else: sum += 30
    j += 1
week = (sum + 1) % 7
if ((month == 1) or (month == 3) or (month == 5) or (month == 7) or (month == 8) or (month == 10) or (month == 12)):day = 31
elif month == 2:               #二月的巢狀判斷,閏年二月29,平年28
    if run:day = 29
    else:day = 28
else:day = 30
print("日\t一\t二\t三\t四\t五\t六")
count = 0    #定義一個計數器,以便後面的換行
k = 0
while k <= week:   #每個月的開始第一週前面的空格數
    k += 1
    print("\t",end="")
    count += 1
    if (count % 7 == 0):print("\n")
   # count=7 進行換行
p = 1
while p <= day:    #顯示天數
    print(p,"\t",end="")     #列印  table 不換行
    p += 1
    count += 1
    if(count % 7 == 0):print("\n")        #count=7 進行換行



如果上面的程式碼都能看懂就ojbk了,沒啥大問題,自己可以去試試了。接下來我說一說主要吧,嘿嘿!

1. 閏年的判斷: 

四年一閏,百年不閏;四百年再閏。這是判斷閏年的口訣,也挺好記的。

就是 能被4整除但是不能被100整除的年份  或者   能直接被400 整除的。


判斷完之後定義一個全域性變數 run 後面進行閏月的判斷會用到。從這裡開始計數 定義 sum 閏年 sum + 366 否則 sum + 365

我定義的起始年是 1900,這個你可以隨意定義。因為計算的是前一年的 所以是year - 1 .i 是定義的年的計數變數,每迴圈一次就進行一次判斷,是否是閏年。這個 i 是變化的 。前面的 run 是 對這一年的判斷,所以在這裡不能用。

2. 接下來是月份的輸入和判斷 



定義一個變數 j 記錄月份的變化,逢1 3 5 7 8 10 12 月就對總天數 sum + 31 ,當是二月的時候進行巢狀判斷,在這裡就用到了前面定義的全域性變數 run ,如果是閏年的話就 sum + 29 ,否則就是 28。此外的其他月份都是30天。及得每次迴圈完之後要 就  j += 1,進入下一次迴圈,直到你輸入的這一月跳出迴圈。

3. 計算到這裡就得出了所有的天數,接下來就進行取餘,計算你所輸入月份的第一個星期前面的空格數,你可能會有疑問為什麼是  (sum + 1) % 7,而不是 sum % 7,其實這都是以前的程式設計師試出來的,沒有什麼原因,這是一個定則,不信你將 1 去掉,執行程式的話會少一個空格。包括Java 、c 、c++ 都是這樣的規矩。

4.進行本月天數的判斷,和上面月份的判斷一樣,不難理解。



5. 定義一個計數器 count 從 列印第一個空格開始計數,逢7 換行。定義變數 k ,從零開始計算,列印空格,和week 作比較,這裡注意是    k <= week,比如week=4,則後面會有5個空格 。空格判斷完之後就開始輸出這個月的天數,每輸出一個數,加一個空格,從本月的第一天開始累計,注意,這裡的 count 是承接上面的 count ,也要 + 1,同樣是逢7 換行。

好了到了這裡就結束了,盡我所能解釋了,看懂了最好,看不懂也沒關係,多看幾遍,最好自己敲一敲,注重思想和方法,瞭解了它的原理和方法,看起來也就很簡單了。