鱼C论坛

 找回密码
 立即注册
查看: 9815|回复: 25

每周一练 第二十九期/梦想护卫舰 第七关 改变代码队2 年历

[复制链接]
发表于 2023-1-7 12:04:06 | 显示全部楼层 |阅读模式
本帖最后由 hveagle 于 2023-1-10 09:56 编辑

截屏2023-01-07 12.14.11.png
前言
船上人从大楼把不二解救了,回船上
突然,船坏了!
原来就是一个零件
你想:就是个零件吗,有什么难的
高山派了你去修零件
没想到要改代码!
要求
下面代码是能画出一个月历的程序:
  1. eachmonth = [0,31,28,31,30,31,30,31,31,30,31,30,31]
  2. week = ['下标为0, 占个位', '星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']
  3. from tkinter import *
  4. root = Tk()
  5. def is366(n):
  6.     if (n % 4 == 0 and n % 100) or  n % 400 == 0:
  7.         return True
  8.     else:
  9.         return False
  10. def whatday(year, month, day):
  11.     num366 = 0
  12.     if year >= 2023:
  13.         if year >= 2024:
  14.             for each in range(2024, year+1, 4):
  15.                 if is366(each):
  16.                     num366 += 1
  17.             if is366(year) and month < 3:
  18.                 num366 -= 1
  19.         deltday = (year - 2023)*365 + sum(eachmonth[:month]) + (day -1) + num366
  20.         return (deltday-1) % 7
  21.     else:
  22.         if year <= 2020:
  23.             for each in range(year, 2023, 4):
  24.                 if is366(each):
  25.                     num366 += 1
  26.             if is366(year) and month >= 3:
  27.                 num366 -= 1
  28.         deltday = (year - 2023)*365 + sum(eachmonth[:month]) + (day -1) - num366
  29.         return (deltday-1) % 7
  30. class Date:
  31.     def __init__(self, y, m, d):
  32.         self.y = y
  33.         self.m = m
  34.         self.d = d
  35.         self.w = whatday(self.y, self.m, self.d)
  36.         self.row = (self.d + bnum)//7 +2 if (self.d + bnum)%7 else (self.d + bnum)//7 +1
  37. data = []
  38. y = int(input('请输入年:'))
  39. m = int(input('请输入月:'))
  40. em = eachmonth[m]
  41. bnum = whatday(y, m, 1)
  42. if m == 2:
  43.     if is366(y):
  44.         em = 29
  45. for i in range(1, em+1):
  46.     data.append(Date(y, m, i))
  47. Label(root, text=f'{y}年', fg='blue').grid(row=0, column=2)
  48. Label(root, text=f'{m}月', fg='blue').grid(row=0, column=4)
  49. i = -1
  50. j = 0
  51. while i < 6:
  52.     while j < 7:
  53.         i += 1
  54.         j += 1
  55.         Label(root, text=week[j], fg='red').grid(row=1, column=i)
  56. for each in data:
  57.     if each.w == 6 or each.w == 0:
  58.         Label(root, text=str(each.d), fg='red').grid(row=each.row, column=each.w)
  59.     else:
  60.         Label(root, text=str(each.d)).grid(row=each.row, column=each.w)
  61. mainloop()
复制代码

要求改代码,代码,画出一个年历
若简单改成:
  1. eachmonth = [0,31,28,31,30,31,30,31,31,30,31,30,31]
  2. week = ['下表为0, 占个位', '星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']
  3. month = ['下标为0, 占个位', '1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']

  4. from tkinter import *
  5. root = Tk()

  6. def is366(n):
  7.     if (n % 4 == 0 and n % 100) or  n % 400 == 0:
  8.         return True
  9.     else:
  10.         return False

  11. def whatday(year, month, day):
  12.     num366 = 0
  13.     if year >= 2022:
  14.         if year >= 2024:
  15.             for each in range(2024, year+1, 4):
  16.                 if is366(each):
  17.                     num366 += 1
  18.             if is366(year) and month < 3:
  19.                 num366 -= 1
  20.         deltday = (year - 2023)*365 + sum(eachmonth[:month]) + (day -1) + num366
  21.         return (deltday-1) % 7
  22.     else:
  23.         if year <= 2020:
  24.             for each in range(year, 2023, 4):
  25.                 if is366(each):
  26.                     num366 += 1
  27.             if is366(year) and month >= 3:
  28.                 num366 -= 1
  29.         deltday = (year - 2023)*365 + sum(eachmonth[:month]) + (day -1) - num366
  30.         return (deltday-1) % 7

  31. class Month:
  32.     def __init__(self, y, m, d):
  33.         self.y = y
  34.         self.m = m
  35.         self.d = d
  36.         self.w = whatday(self.y, self.m, self.d)
  37.         self.row = (self.d + bnum) //7 +2 if (self.d + bnum)%7 else(self.d + bnum) // 7 +1
  38.         

  39. #以下为主程序
  40.         
  41. data = []
  42. y = int(input('请输入年:'))
  43. for i in range(1, 13):
  44.     bnum = whatday(y, i, 1)
  45.     em = eachmonth[i]
  46.     if i == 2:
  47.         if is366(y):
  48.             em = 29
  49.     for j in range(1, em+1):
  50.         data.append(Month(y, i, j))

  51. for each in data:
  52.     if each.w == 6 or each.w == 0:
  53.         Label(root, text=str(each.d), fg='red').grid(row=each.row, column=each.w)
  54.     else:
  55.         Label(root, text=str(each.d)).grid(row=each.row, column=each.w)

  56. mainloop()
复制代码

是不对的
本期算法:就是要靠你的思维!
只有60分以上才能修好零件
答案
游客,如果您要查看本帖隐藏内容请回复
[/hide]
奖励区
名次第1名第2名第3名第4名第5名
等待着变成王者登上宝座~
语言
几楼
奖励展示+8荣誉7鱼币2贡献1技术值最佳答案展示+4荣誉4鱼币展示+3荣誉3鱼币展示+2荣誉展示

评分
单选投票, 共有 9 人参与投票
77.78% (7)
22.22% (2)
0.00% (0)
0.00% (0)
0.00% (0)
0.00% (0)
您所在的用户组没有投票权限

评分

参与人数 1荣誉 +2 鱼币 +3 贡献 +3 收起 理由
高山 + 2 + 3 + 3 鱼C有你更精彩^_^

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-7 12:28:08 | 显示全部楼层
顶顶顶~

评分

参与人数 1荣誉 +1 收起 理由
hveagle + 1 无条件支持楼主!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-7 13:31:54 | 显示全部楼层
不错,支持支持

评分

参与人数 1荣誉 +1 收起 理由
hveagle + 1 无条件支持楼主!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-7 13:45:49 | 显示全部楼层

评分

参与人数 1荣誉 +1 收起 理由
hveagle + 1 无条件支持楼主!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-7 16:45:56 | 显示全部楼层
1923年6月1日你算出来是星期2,实际应该星期5
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-1-7 16:47:20 | 显示全部楼层
chinajz 发表于 2023-1-7 16:45
1923年6月1日你算出来是星期2,实际应该星期5

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-1-7 16:47:59 | 显示全部楼层
chinajz 发表于 2023-1-7 16:45
1923年6月1日你算出来是星期2,实际应该星期5

哦,我懂了,去年编写的代码,所有2022还是2022呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-7 22:52:01 | 显示全部楼层
本帖为密码帖 ,请输入密码 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-8 21:34:51 | 显示全部楼层
代码太长,直接看答案了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-9 15:10:56 | 显示全部楼层
本帖最后由 chinajz 于 2023-1-9 15:18 编辑

升级后,终于可以发图了,纪念一下:

2023年历

2023年历
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-1-9 15:20:48 | 显示全部楼层
chinajz 发表于 2023-1-9 15:10
升级后,终于可以发图了,纪念一下:

代码?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-9 16:34:37 | 显示全部楼层

  1. #coding=gbk
  2. week = [ '星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']
  3. #初始化12个月每个月各多少天,从下标1开始,下标0无意义
  4. monthDays = [-1,31,28,31,30,31,30,31,31,30,31,30,31]
  5. sourYear =2020
  6. sourMonth = 11
  7. sourDay = 18
  8. sourweek=3
  9. days=0
  10. days2020=0
  11. from tkinter import *


  12. #闰年判断
  13. def rn(year):
  14.     if year%4 ==0 and year%100!=0 or year%400==0:
  15.         return 1
  16.     else:
  17.         return 0
  18. #当年的天数
  19. def mtodays(monthd):
  20.     j=0
  21.     for i in range(1,monthd):  #累加月数.input输入那年过掉的月数总天数,如果是1月则(1,1)不循环不计算
  22.             j += monthDays[i]
  23.     if monthd > 2:
  24.             j+= rn(year)
  25.     j +=  date
  26.     return j


  27. #2020-1-1日到11-18 周3经过多少天
  28. for i in range(1,sourMonth):  
  29.     days2020 += monthDays[i]
  30. days2020 += rn(sourYear) + sourDay
  31. #print(days2020) #323
  32. #输入分配年月日
  33. year= int(input('请输入年:'))
  34. month=1
  35. date=1
  36. root = Tk()
  37. #year,month,date = int(lst[0]) , int(lst[1]) , int(lst[2])
  38. if year == 2020:
  39.       days = mtodays(month)- days2020
  40. elif year > 2020:
  41.         for y in range(2020,year):   #累加年数
  42.             days += 365+rn(y)
  43.         days += mtodays(month) #当年天数
  44.         days =  days-days2020  #距离2020-11-18 周3经过多少天
  45. else :
  46.          for y in range(year,2020):   #累加年数
  47.              days += 365+rn(y)
  48.          days += days2020
  49.          days = mtodays(month)-days  #距离2020-11-18 周3还需要经过多少天
  50. wk=days%7 #先算7天的余数
  51. wk=wk+sourweek #把周3加入再算
  52. #print(week[wk%7],wk%7)
  53. wk=wk%7
  54. jj=wk
  55. monthDays[2]=monthDays[2]+rn(year)

  56. for m in range(1,13):
  57.     em=monthDays[m]
  58.     if m<=3:
  59.         y=20
  60.         x=m*10
  61.     elif m<=6:
  62.         y=40
  63.         x=(m-3)*10
  64.     elif m<=9:
  65.         y=60
  66.         x=(m-6)*10
  67.     else:
  68.         y=80
  69.         x=(m-9)*10
  70.     Label(root, text=f'{year}年', fg='blue',bg='Snow').grid(row=0+y,column=2+x)
  71.     Label(root, text=f'{m}月', fg='blue',bg='Snow').grid(row=0+y, column=4+x)
  72.     i=-1
  73.     j=0
  74.     rw=0
  75.     while i < 6:
  76.         while j < 7:
  77.          
  78.             Label(root, text=week[j], fg='green',bg='Snow').grid(row=1+y, column=i+x)
  79.             i += 1
  80.             j += 1
  81.     Label(root, text="  ", fg='red').grid(row=1+y, column=i+x+2) #增加两个空格,更美观一些
  82.     for ii in range(1, em+1):
  83.         md=jj%7
  84.         if md==0:
  85.             if ii==1:   #如果该月首日为星期天,则不换行
  86.                 rw =rw+md//7
  87.             else:
  88.                 rw =rw+1+md//7
  89.         if md==0 or md==6:
  90.             Label(root, text=str(ii), fg='red').grid(row=rw+y+10, column=jj%7+x-1)
  91.         else:
  92.             Label(root, text=str(ii), fg='blue').grid(row=rw+y+10, column=jj%7+x-1)
  93.       
  94.         jj +=1
  95.         
  96.    
  97. root.mainloop()

复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-9 16:36:56 | 显示全部楼层
本帖最后由 chinajz 于 2023-1-9 16:38 编辑


我8楼按你要求设置了密码,你看不到?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-1-9 16:48:52 | 显示全部楼层

2个毛病:
1.星期一到星期五是黑色非蓝色,去掉fg='blue'
2.我月历程序年月是在星期二和星期四上的,你是星期三和星期五上的,我猜你是把下表为0删掉了,所以因该是1+x和3+x
因改成:
  1. #coding=gbk
  2. week = [ '星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']
  3. #初始化12个月每个月各多少天,从下标1开始,下标0无意义
  4. monthDays = [-1,31,28,31,30,31,30,31,31,30,31,30,31]
  5. sourYear =2020
  6. sourMonth = 11
  7. sourDay = 18
  8. sourweek=3
  9. days=0
  10. days2020=0
  11. from tkinter import *

  12. #闰年判断
  13. def rn(year):
  14.     if year%4 ==0 and year%100!=0 or year%400==0:
  15.         return 1
  16.     else:
  17.         return 0
  18. #当年的天数
  19. def mtodays(monthd):
  20.     j=0
  21.     for i in range(1,monthd):  #累加月数.input输入那年过掉的月数总天数,如果是1月则(1,1)不循环不计算
  22.             j += monthDays[i]
  23.     if monthd > 2:
  24.             j+= rn(year)
  25.     j +=  date
  26.     return j


  27. #2020-1-1日到11-18 周3经过多少天
  28. for i in range(1,sourMonth):  
  29.     days2020 += monthDays[i]
  30. days2020 += rn(sourYear) + sourDay
  31. #print(days2020) #323
  32. #输入分配年月日
  33. year= int(input('请输入年:'))
  34. month=1
  35. date=1
  36. root = Tk()
  37. #year,month,date = int(lst[0]) , int(lst[1]) , int(lst[2])
  38. if year == 2020:
  39.       days = mtodays(month)- days2020
  40. elif year > 2020:
  41.         for y in range(2020,year):   #累加年数
  42.             days += 365+rn(y)
  43.         days += mtodays(month) #当年天数
  44.         days =  days-days2020  #距离2020-11-18 周3经过多少天
  45. else :
  46.          for y in range(year,2020):   #累加年数
  47.              days += 365+int(rn(y))
  48.          days += days2020
  49.          days = mtodays(month)-days  #距离2020-11-18 周3还需要经过多少天
  50. wk=days%7 #先算7天的余数
  51. wk=wk+sourweek #把周3加入再算
  52. #print(week[wk%7],wk%7)
  53. wk=wk%7
  54. jj=wk
  55. monthDays[2]=monthDays[2]+rn(year)

  56. for m in range(1,13):
  57.     em=monthDays[m]
  58.     if m<=3:
  59.         y=20
  60.         x=m*10
  61.     elif m<=6:
  62.         y=40
  63.         x=(m-3)*10
  64.     elif m<=9:
  65.         y=60
  66.         x=(m-6)*10
  67.     else:
  68.         y=80
  69.         x=(m-9)*10
  70.     Label(root, text=f'{year}年', fg='blue').grid(row=0+y,column=1+x)
  71.     Label(root, text=f'{m}月', fg='blue').grid(row=0+y, column=3+x)
  72.     i=-1
  73.     j=0
  74.     rw=0
  75.     while i < 6:
  76.         while j < 7:
  77.          
  78.             Label(root, text=week[j], fg='red').grid(row=1+y, column=i+x)
  79.             i += 1
  80.             j += 1
  81.     Label(root, text="  ", fg='red').grid(row=1+y, column=i+x+2)
  82.     for ii in range(1, em+1):
  83.         md=jj%7
  84.         if md==0:
  85.             if ii==1:
  86.                 rw =rw+md//7
  87.             else:
  88.                 rw =rw+1+md//7
  89.         if md==0 or md==6:
  90.             Label(root, text=str(ii), fg='red').grid(row=rw+y+10, column=jj%7+x-1)
  91.         else:
  92.             Label(root, text=str(ii)).grid(row=rw+y+10, column=jj%7+x-1)
  93.       
  94.         jj +=1
  95.         
  96.    
  97. root.mainloop()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-9 17:16:40 | 显示全部楼层
hveagle 发表于 2023-1-9 16:48
2个毛病:
1.星期一到星期五是黑色非蓝色,去掉fg='blue'
2.我月历程序年月是在星期二和星期四上的,你 ...

OK
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-9 18:15:01 | 显示全部楼层
谁让你发的(算了我也很感谢你)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-9 18:18:26 | 显示全部楼层
高山 发表于 2023-1-9 18:15
谁让你发的(算了我也很感谢你)

楼主,过程比结果重要。

点评

我没让他发帖(轮班没轮到他——)  发表于 2023-1-9 19:13
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-9 18:27:54 | 显示全部楼层
啊,还有GUI,楼主,你好狠
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-9 19:04:01 | 显示全部楼层
咱就是说

可不可以多出些普适性的题目,比如说正常的输入输出那种题,或者其他的那些各种语言都可以做的,
因为考虑到部分的鱼油嘛,是吧,他们可能只学了一种语言,那做题的机会就少了
(个人观点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-10 19:00:47 | 显示全部楼层
还是苹果系统的好看些,按照楼主要求修改后的截屏:
年历.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-22 12:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表