網站首頁 編程語言 正文
一、題目描述
A:先輸出提示語句,并接受用戶輸入的年、月。
B:根據用戶輸入的年,先判斷是否是閏年。
C:根據用戶輸入的月來判斷月的天數。
D:用循環計算用戶輸入的年份距1900年1月1日的總天數。
E:用循環計算用戶輸入的月份距輸入的年份的1月1日共有多少天。
F:相加D與E的天數,得到總天數。
G:用總天數來計算輸入月的第一天的星期數。
H:根據G的值,格式化輸出這個月的日歷!
二、解析
1、分析
根據題目的八個要求,可以看出有些功能是重復或者說需要相互調用的,所以可以用模塊的思想將每個要求封裝成函數;
2、功能
①判斷是否是閏年函數
根據閏年的判斷規則,如果年是4的倍數,但不是100的倍數則是閏年或者是400的整數倍也是閏年,所以函數需要傳入一個參數(年份)
#判斷閏年
def B(year):
if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
return True
return False
②判斷輸入月的天數的函數
除了2月份會根據平年和閏年發生變化以外, 每月的天數是已經確定好的;所以此時需要調用已經定義好的判斷閏年的函數才能確定二月的天數;所以函數需要傳入兩個參數(月份和年份)
此時有兩個小技巧,一個是判斷月份是那月,最開始用的是用相等加上or去判斷是否滿足條件,其實可以將大月或者小月的月份寫到一個列表中,然后再通過in去判斷;第二個是在確定天數時,可以先定義好一個常用值,然后根據月份去修改其值,最后返回常用值即可,這樣就少了幾行的賦值以及返回的代碼
def C(year,month):
days = 31 #31天居多,設置為默認值
if month == 2 : #2月份要判斷是否是閏年
if B(year):
days=29
else:
days=28;
elif month in [4,6,9,11]: #判斷小月,只有30天
days=30
return days
③計算年份距離1900的總天數的函數
因為平年跟閏年的天數不一樣,所以要調用判斷閏年的函數,確定其一年的總天數;
總天數也就是相當于求每年的天數之和即可;所以需要去遍歷每年的天數求其總和即為結果;所以函數需要傳入一個參數(年份)
#某年到1900年的天數
def D(year:int):
day = 0
for i in range(1900,year):
if B(i):
day +=366
else:
day +=365
return day
④ 月份距離1月1日的天數的函數
距離1月1日的天數也就是每月天數的總和,此時就先需要確定其每月的天數,也就是需要調用之前定義的函數,還需要知道的是其年份判斷是否閏年,所以函數需要傳入兩個參數(年份和月份)
遍歷每月的天數(通過調用函數而來),然后將其求和,得到的就是需要的結果
#某月到1月1號的天數
def E(year:int,month:int):
days = 0
for i in range(1,month):
days += C(year,i)
return days
⑤確定星期幾的函數
首先通過調用求年份距離的天數和月份的天數得到其天數總和,所以函數需要傳入兩個參數(月份和年份)
然后將總和加一(因為得到的是月份,而算天數時要獎當日計算再內),然后對7求余即為星期幾
#確定星期幾
def G(year:int,month:int):
total_day = D(year) + E(year,month) + 1
week = total_day % 7
return week
⑥格式化輸出日歷函數
輸出有兩種格式,一種是星期日在第一天,一種是星期日在最后一天;
第一種方式:星期日在第一天,根據得到的星期幾函數(也就是當月1號的星期幾函數),可以確定第一天的位置(也就是1的位置);
日歷也就是輸出1到總天數(根據月份確定)在對應的位置(星期幾),由于1號的位置已經確定,而一號前面的則為空,所以單獨遍歷輸出空格,然后再輸出日歷;
一周對應的是七天,也就是每七天進行一次換行,所以還需要定義一個計數器
第二種方式:也就是星期日在最后一天,其他邏輯都是一樣的,只是在確定1號的位置不一樣;
本來周日的位置為第一個,但是現在變成了最后一個,也就是位置向后移了6位,所以只需要計算位置的時候先將其加上,然后再求余即可
#格式化輸出
def my_print(total:int):
# iCount = 0
# print("日\t一\t二\t三\t四\t五\t六")
# for i in range((G(year, month) % 7)):
# print(end='\t')
# iCount += 1
# for i in range(1, C(year, month) + 1):
# print(i, end='\t')
# iCount += 1
# if iCount % 7 == 0:
# print('')
iCount = 0
print('一\t二\t三\t四\t五\t六\t日\t')
for i in range(((G(year,month) + 6) % 7)):
print(end='\t')
iCount +=1
for i in range(1,C(year,month) + 1):
print(i,end='\t')
iCount +=1
if iCount % 7 == 0:
print('')
三、源碼
# -*- coding: utf-8 -*-
from datetime import date
import calendar
# def B(year):
# if year/4==0 and year/400 !=0:
# return True
# elif year/100 == 0 and year/400 ==0 :
# return True
# else:
# return False
#判斷閏年
def B(year):
if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
return True
return False
# def C(year:int,month:int):
# days = 30
# if month in [1,3,5,7,8,10,12]:
# days = 31
# elif month == 2:
# if B(year):
# days = 29
# else:
# days = 28
# return days
#每月的天數
def C(year,month):
days = 31 #31天居多,設置為默認值
if month == 2 : #2月份要判斷是否是閏年
if B(year):
days=29
else:
days=28;
elif month in [4,6,9,11]: #判斷小月,只有30天
days=30
return days
#某年到1900年的天數
def D(year:int):
day = 0
for i in range(1900,year):
if B(i):
day +=366
else:
day +=365
return day
#某月到1月1號的天數
def E(year:int,month:int):
days = 0
for i in range(1,month):
days += C(year,i)
return days
#確定星期幾
def G(year:int,month:int):
total_day = D(year) + E(year,month) + 1
week = total_day % 7
return week
#格式化輸出
def my_print(total:int):
# iCount = 0
# print("日\t一\t二\t三\t四\t五\t六")
# for i in range((G(year, month) % 7)):
# print(end='\t')
# iCount += 1
# for i in range(1, C(year, month) + 1):
# print(i, end='\t')
# iCount += 1
# if iCount % 7 == 0:
# print('')
iCount = 0
print('一\t二\t三\t四\t五\t六\t日\t')
for i in range(((G(year,month) + 6) % 7)):
print(end='\t')
iCount +=1
for i in range(1,C(year,month) + 1):
print(i,end='\t')
iCount +=1
if iCount % 7 == 0:
print('')
if __name__ == '__main__':
year = int(input('請輸入年:'))
month = int(input('請輸入月'))
my_print(G(year,month))
四、經驗?
因為函數多,而且計算的結果不方便去口頭的驗算其結果,也就是說當結果不對時不知道是那出現的問題時,系統提供的
from datetime import date
import calendar
兩個模塊中有方法可以得出其天數以及星期幾的結果,這樣就可以查找到底是哪一步出現的問題了;也可以通過print去驗證單個的函數是否正確;
總結
原文鏈接:https://blog.csdn.net/qq_41404557/article/details/124820965
相關推薦
- 2022-05-25 C#多線程實現異步接口_C#教程
- 2023-01-15 React報錯Too?many?re-renders解決_React
- 2022-10-05 linux查看服務器開放的端口和啟用的端口多種方式_Linux
- 2023-11-17 Linux CentOS如何修改root用戶密碼
- 2022-07-08 C#之Socket(套接字)通信_C#教程
- 2022-01-30 composer 安裝包,提示找不到對應的包,很奇怪的問題,備忘
- 2022-08-20 Django細致講解多對多使用through自定義中間表方法_python
- 2022-10-26 python的django寫頁面上傳文件及遇到的問題小結_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支