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 换行。
好了到了这里就结束了,尽我所能解释了,看懂了最好,看不懂也没关系,多看几遍,最好自己敲一敲,注重思想和方法,了解了它的原理和方法,看起来也就很简单了。