鱼C论坛

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

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

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

截屏2023-01-07 12.14.11.png
前言
船上人从大楼把不二解救了,回船上
突然,船坏了!
原来就是一个零件
你想:就是个零件吗,有什么难的
高山派了你去修零件
没想到要改代码!
要求
下面代码是能画出一个月历的程序:
eachmonth = [0,31,28,31,30,31,30,31,31,30,31,30,31]
week = ['下标为0, 占个位', '星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']
from tkinter import *
root = Tk()
def is366(n):
    if (n % 4 == 0 and n % 100) or  n % 400 == 0:
        return True
    else:
        return False
def whatday(year, month, day):
    num366 = 0
    if year >= 2023:
        if year >= 2024:
            for each in range(2024, year+1, 4):
                if is366(each):
                    num366 += 1
            if is366(year) and month < 3:
                num366 -= 1
        deltday = (year - 2023)*365 + sum(eachmonth[:month]) + (day -1) + num366
        return (deltday-1) % 7 
    else:
        if year <= 2020:
            for each in range(year, 2023, 4):
                if is366(each):
                    num366 += 1
            if is366(year) and month >= 3:
                num366 -= 1
        deltday = (year - 2023)*365 + sum(eachmonth[:month]) + (day -1) - num366
        return (deltday-1) % 7
class Date:
    def __init__(self, y, m, d):
        self.y = y
        self.m = m
        self.d = d
        self.w = whatday(self.y, self.m, self.d)
        self.row = (self.d + bnum)//7 +2 if (self.d + bnum)%7 else (self.d + bnum)//7 +1
data = []
y = int(input('请输入年:'))
m = int(input('请输入月:'))
em = eachmonth[m]
bnum = whatday(y, m, 1)
if m == 2:
    if is366(y):
        em = 29
for i in range(1, em+1):
    data.append(Date(y, m, i))
Label(root, text=f'{y}年', fg='blue').grid(row=0, column=2)
Label(root, text=f'{m}月', fg='blue').grid(row=0, column=4)
i = -1
j = 0
while i < 6:
    while j < 7:
        i += 1
        j += 1
        Label(root, text=week[j], fg='red').grid(row=1, column=i)
for each in data:
    if each.w == 6 or each.w == 0:
        Label(root, text=str(each.d), fg='red').grid(row=each.row, column=each.w)
    else:
        Label(root, text=str(each.d)).grid(row=each.row, column=each.w)
mainloop()
要求改代码,代码,画出一个年历
若简单改成:
eachmonth = [0,31,28,31,30,31,30,31,31,30,31,30,31]
week = ['下表为0, 占个位', '星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']
month = ['下标为0, 占个位', '1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']

from tkinter import *
root = Tk()

def is366(n):
    if (n % 4 == 0 and n % 100) or  n % 400 == 0:
        return True
    else:
        return False

def whatday(year, month, day):
    num366 = 0
    if year >= 2022:
        if year >= 2024:
            for each in range(2024, year+1, 4):
                if is366(each):
                    num366 += 1
            if is366(year) and month < 3:
                num366 -= 1
        deltday = (year - 2023)*365 + sum(eachmonth[:month]) + (day -1) + num366
        return (deltday-1) % 7 
    else:
        if year <= 2020:
            for each in range(year, 2023, 4):
                if is366(each):
                    num366 += 1
            if is366(year) and month >= 3:
                num366 -= 1
        deltday = (year - 2023)*365 + sum(eachmonth[:month]) + (day -1) - num366
        return (deltday-1) % 7

class Month:
    def __init__(self, y, m, d):
        self.y = y
        self.m = m
        self.d = d
        self.w = whatday(self.y, self.m, self.d)
        self.row = (self.d + bnum) //7 +2 if (self.d + bnum)%7 else(self.d + bnum) // 7 +1
        

#以下为主程序
        
data = []
y = int(input('请输入年:'))
for i in range(1, 13):
    bnum = whatday(y, i, 1)
    em = eachmonth[i]
    if i == 2:
        if is366(y):
            em = 29
    for j in range(1, em+1):
        data.append(Month(y, i, j))

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

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 | 显示全部楼层

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


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


#2020-1-1日到11-18 周3经过多少天
for i in range(1,sourMonth):  
    days2020 += monthDays[i]
days2020 += rn(sourYear) + sourDay 
#print(days2020) #323
#输入分配年月日
year= int(input('请输入年:'))
month=1
date=1
root = Tk()
#year,month,date = int(lst[0]) , int(lst[1]) , int(lst[2])
if year == 2020:
      days = mtodays(month)- days2020
elif year > 2020:
        for y in range(2020,year):   #累加年数
            days += 365+rn(y)
        days += mtodays(month) #当年天数
        days =  days-days2020  #距离2020-11-18 周3经过多少天
else :
         for y in range(year,2020):   #累加年数
             days += 365+rn(y)
         days += days2020
         days = mtodays(month)-days  #距离2020-11-18 周3还需要经过多少天
wk=days%7 #先算7天的余数
wk=wk+sourweek #把周3加入再算
#print(week[wk%7],wk%7)
wk=wk%7
jj=wk
monthDays[2]=monthDays[2]+rn(year)

for m in range(1,13):
    em=monthDays[m]
    if m<=3:
        y=20
        x=m*10
    elif m<=6:
        y=40
        x=(m-3)*10
    elif m<=9:
        y=60
        x=(m-6)*10
    else:
        y=80
        x=(m-9)*10
    Label(root, text=f'{year}年', fg='blue',bg='Snow').grid(row=0+y,column=2+x)
    Label(root, text=f'{m}月', fg='blue',bg='Snow').grid(row=0+y, column=4+x)
    i=-1
    j=0
    rw=0
    while i < 6:
        while j < 7:
          
            Label(root, text=week[j], fg='green',bg='Snow').grid(row=1+y, column=i+x)
            i += 1
            j += 1
    Label(root, text="  ", fg='red').grid(row=1+y, column=i+x+2) #增加两个空格,更美观一些
    for ii in range(1, em+1):
        md=jj%7
        if md==0:
            if ii==1:   #如果该月首日为星期天,则不换行
                rw =rw+md//7 
            else:
                rw =rw+1+md//7 
        if md==0 or md==6:
            Label(root, text=str(ii), fg='red').grid(row=rw+y+10, column=jj%7+x-1)
        else:
            Label(root, text=str(ii), fg='blue').grid(row=rw+y+10, column=jj%7+x-1)
       
        jj +=1
        
   
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
因改成:
#coding=gbk
week = [ '星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']
#初始化12个月每个月各多少天,从下标1开始,下标0无意义
monthDays = [-1,31,28,31,30,31,30,31,31,30,31,30,31]
sourYear =2020
sourMonth = 11
sourDay = 18
sourweek=3
days=0
days2020=0
from tkinter import *

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


#2020-1-1日到11-18 周3经过多少天
for i in range(1,sourMonth):  
    days2020 += monthDays[i]
days2020 += rn(sourYear) + sourDay 
#print(days2020) #323
#输入分配年月日
year= int(input('请输入年:'))
month=1
date=1
root = Tk()
#year,month,date = int(lst[0]) , int(lst[1]) , int(lst[2])
if year == 2020:
      days = mtodays(month)- days2020
elif year > 2020:
        for y in range(2020,year):   #累加年数
            days += 365+rn(y)
        days += mtodays(month) #当年天数
        days =  days-days2020  #距离2020-11-18 周3经过多少天
else :
         for y in range(year,2020):   #累加年数
             days += 365+int(rn(y))
         days += days2020
         days = mtodays(month)-days  #距离2020-11-18 周3还需要经过多少天
wk=days%7 #先算7天的余数
wk=wk+sourweek #把周3加入再算
#print(week[wk%7],wk%7)
wk=wk%7
jj=wk
monthDays[2]=monthDays[2]+rn(year)

for m in range(1,13):
    em=monthDays[m]
    if m<=3:
        y=20
        x=m*10
    elif m<=6:
        y=40
        x=(m-3)*10
    elif m<=9:
        y=60
        x=(m-6)*10
    else:
        y=80
        x=(m-9)*10
    Label(root, text=f'{year}年', fg='blue').grid(row=0+y,column=1+x)
    Label(root, text=f'{m}月', fg='blue').grid(row=0+y, column=3+x)
    i=-1
    j=0
    rw=0
    while i < 6:
        while j < 7:
          
            Label(root, text=week[j], fg='red').grid(row=1+y, column=i+x)
            i += 1
            j += 1
    Label(root, text="  ", fg='red').grid(row=1+y, column=i+x+2)
    for ii in range(1, em+1):
        md=jj%7
        if md==0:
            if ii==1:
                rw =rw+md//7 
            else:
                rw =rw+1+md//7 
        if md==0 or md==6:
            Label(root, text=str(ii), fg='red').grid(row=rw+y+10, column=jj%7+x-1)
        else:
            Label(root, text=str(ii)).grid(row=rw+y+10, column=jj%7+x-1)
       
        jj +=1
        
   
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-6-18 03:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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