《python语言程序设计》(2018)第6章编程题 第32题发现替身变量在循环中的作用

文章讨论了在编程中使用Zeller公式计算特定日期是星期几的方法,批评了原题目的设计,并分享了简化代码的过程,强调了变量替换在循环中的重要性。作者通过示例代码展示了如何处理1月和2月的特殊情况,并提出了改进的循环实现。
摘要由CSDN通过智能技术生成

在这里插入图片描述

一、费解的题目

请问作者你这个脑回路是挺惊奇的。我既然能用Zeller直接算出具体星期几,我还需要用6-13里那么费劲的从1800年1月1日开始算吗? 你直接说把4.21题改成带函数的不就行了吗?还简化,简化什么??你是不知道该出什么题了吗???如果有一天我能看到作者本人。我一定亲自问问他书里那些让我发狂的问题。是在何时何地弄出来的

二、我今天的发现-不是我认为的6.32满意答案

我在按照脑回路十分惊奇的作者(简称惊奇大师)的要求来简化的过程中。发现了给变量制作替身的重要性。

下面是4.21题我做了第7遍后的代码

特别说明里面有关字典和列表的使用不是1到4章的内容。想参考纯粹前4章内容的朋友请回到之前的文章

第4章里没有循环的内容。所以我下面的代码是正确的,而且是很有效的,但是当我引入循环的时候问题出现了

h_dic = {0: "星期六", 1: "星期日", 2: "星期一", 3: "星期二", 4: "星期三", 5: "星期四", 6: "星期五"}
m_dic = {13: "一月", 14: "二月", 3: "三月", 4: "四月", 5: "五月", 6: "六月", 7: "七月", 8: "八月", 9: "九月",
         10: "十月", 11: "十一月", 12: "十二月"}

year_input = eval(input("Enter year:(e,g., 2008): "))
month_input = eval(input("Enter month: 1-12: "))
day_input = eval(input("Enter the day of the month: 1-31: "))

if month_input == 1 or month_input == 2:
    year_input -= 1
    month_input += 12
    k = year_input % 100
    j = year_input // 100
else:
    year_input = year_input
    month_input = month_input
    k = year_input % 100
    j = year_input // 100

h_method = (day_input + ((26 * (month_input + 1)) // 10) + k + (k // 4) + (j // 4) + 5 * j) % 7

print(f"Day of the week is {h_dic[h_method]}, month {m_dic[month_input]}, day {day_input}")

运行结果如下,不多多示范了。同学们可以自己截图

在这里插入图片描述

接下来我们利用for循环,我们先看直接引入的后果

好我们先看

在这里插入图片描述

首先 年份发生了变化Zeller的一致性,要求1月2月分别加12并且减去1年来计算。可是按原4.21的代码直接变成for循环不仅结果不对,整个年还出现了锐减的情况。

但当我建立了year_num和把month_input后。首先建立year_num他读取了year_input的值,然后让他来完成1月和2月的运算。然后将for 循环的i指向给month_input。让他随着i变化。而不打扰的i的运行。

代码如下:

h_dic = {0: "星期六", 1: "星期日", 2: "星期一", 3: "星期二", 4: "星期三", 5: "星期四", 6: "星期五"}
m_dic = {13: "一月", 14: "二月", 3: "三月", 4: "四月", 5: "五月", 6: "六月", 7: "七月", 8: "八月", 9: "九月",
         10: "十月", 11: "十一月", 12: "十二月"}
#
year_input = eval(input("Enter year:(e,g., 2008): "))
# # month_input = eval(input("Enter month: 1-12: "))
for i in range(1, 13):
    month_input = i
    year_num = year_input
    if month_input == 1 or month_input == 2:
        year_num -= 1
        month_input += 12
        k = year_num % 100
        j = year_num // 100
        h_method = (1 + ((26 * (month_input + 1)) // 10) + k + (k // 4) + (j // 4) + 5 * j) % 7
        print("1-2", month_input)
        print("year", year_input,year_num)
    else:
        year_input = year_input
        month_input = month_input
        k = year_input % 100
        j = year_input // 100
        h_method = (1 + ((26 * (month_input + 1)) // 10) + k + (k // 4) + (j // 4) + 5 * j) % 7
        print("3-12", month_input)
        print("year", year_input)
    print(f"Day of the week is {h_dic[h_method]}, month {m_dic[month_input]}, day 1")

这个介绍其实很基础,说的这里我翻看了我第5章第30题的解题步骤发现了别上面这个更简单循环代码。也是解答zeller的问题。只不过不是打印每个月的1日是星期几。仅供大家参考用

# distance day and month
month_dist = {13: "January", 14: "February", 3: "March", 4: "April", 5: "May", 6: "June", 7: "July", 8: "August",
              9: "September", 10: "October", 11: "November", 12: "December"}

week_dist = {2: "Monday", 3: "Tuesday", 4: "Wednesday", 5: "Thursday ", 6: "Friday", 0: "Saturday", 1: "Sunday"}

year_data, month_data, input_data = 2023, 1, 1
# condition for compute
year_data_type = year_data
after_years = year_data - 1

for i in range(month_data, 13):
    if i <= 2:
        i += 12
        year_data = after_years

    elif i >= 3:
        i = i
        year_data = year_data_type

    j = year_data // 100
    k = year_data % 100
    m1 = (26 * (i + 1)) // 10
    w_day = (input_data + m1 + k + (k // 4) + (j // 4) + (5 * j)) % 7
    print(month_dist[i], input_data, year_data_type, "is", week_dist[w_day])

结果如下:

在这里插入图片描述

谢谢观赏!多多点赞收藏!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

电饭叔

谢谢各位兄弟们的关注,谢谢破费

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值