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