首页 > 解决方案 > 尝试构建一个 python 程序,在用户输入生日时呈现出生日期。当前的尝试就像一个循环

问题描述

我们都知道,在我们目前使用的公历中,一周中的随机一天可以是 7 个选项之一。

我的代码的意图是基于 Arthur Benjamin 的 Think Like A Math Genius (2006) 中的一段,您可以使用数学执行一个简单的派对技巧。使用代码(基本上是根据格里高利的模式实现快捷方式并在除以七后找到余数),可以快速准确地预测一周中的过去和未来几天。

我当前的尝试导致 PyCharm 过度计算并占用了大部分 CPU 活动。我认为这可能是因为我没有像限制“typedMonth”那样限制用户输入“Year”的范围。

这是原始代码:

print("Enter the full date: in dd/Month/yyyy")
Date = int(input("dd:"))
typedMonth = str(input("Month:"))
Year = int(input("yyyy: "))
while not int(Year) in range(0,3000):
    Year = int(input("Please enter year (yyyy) limited to [0 - 3000] : "))

if typedMonth in ['January']:
    Month = 3
    while int(Year) % 4 == 0:
        Month = 2
elif typedMonth in ['February']:
    Month = 6
    while int(Year) % 4 == 0:
        Month = 5
elif typedMonth in ['March', 'November']:
    Month = 6
elif typedMonth in ['April', 'July']:
    Month = 2
elif typedMonth in ['May']:
    Month = 4
elif typedMonth in ['August']:
    Month = 5
elif typedMonth in ['September', 'December']:
    Month = 1
elif typedMonth in ['October']:
    Month = 3
elif typedMonth in ['June']:
    Month = 0
else:
    Month = 0

remYear = Year%400

if 300 <= remYear <= 400:
    Year = Year + 1
elif 200 <= remYear <= 300:
    Year = Year + 3
elif 100 <= remYear <= 200:
    Year = Year + 5
else:
    Year = Year + 0

print(remYear)

Day = (Date + int(Month) + remYear) % 7
print(Day)

例如,独立测试表明前四行代码按预期工作(如果我只是 print typedMonth)。

在筒仓中,靠近末尾的段remYear= Year%400也可以按预期工作。

因此,在我未经训练的眼睛看来,“过度计算”可能是由于我用来修复来自用户输入字符串的 Month 变量的一段代码typedMonth。需要强调的是,Month 的初始输入以字符串开头typedMonth。然后我使用 while 语句将用户输入的字符串转换为整数值。该整数值归属于变量“Month”,因此可以进行整数“Date”、“Month”和“Year”的最终计算。余数将对应于星期几(例如 0 = 星期日、1 = 星期一、2 = 星期二等)。

这是更新的代码(第三次迭代)。感谢下面的评论,我现在可以输入大多数年份作为输入,程序将运行。逻辑错误仍然存​​在,尤其是分配给月份的代码。我将在未来的迭代中修复它们。

print("Enter the full date: in dd/Month/yyyy")
Date = int(input("dd:"))
typedMonth = str(input("Month:"))
Year = int(input("yyyy: "))
while not int(Year) in range(1,3000):
    Year = int(input("Please enter year (yyyy) limited to [0 - 3000] : "))

if typedMonth in ['January']:
    Month = 3
    while int(Year) % 4 == 0:
        Month = 2
elif typedMonth in ['February']:
    Month = 6
    while int(Year) % 4 == 0:
        Month = 5
elif typedMonth in ['March', 'November']:
    Month = 6
elif typedMonth in ['April', 'July']:
    Month = 2
elif typedMonth in ['May']:
    Month = 4
elif typedMonth in ['June']:
    Month = 0
elif typedMonth in ['August']:
    Month = 5
elif typedMonth in ['September', 'December']:
    Month = 1
elif typedMonth in ['October']:
    Month = 3


remYear = Year%400

if 300 <= remYear <= 400:
    Year = Year + 1
elif 200 <= remYear <= 300:
    Year = Year + 3
elif 100 <= remYear <= 200:
    Year = Year + 5
else:
    Year = Year + 0

calcYear = int(Year % 100)

Day=(Date + Month + calcYear) % 7
print("The date is %d"%Date)
print("The month is %d"%Month)
print("The calculated year is %d"%calcYear)
print("The code for day is %d"%Day) 

if Day in [0]:
    print("You were born on a Sunday")
elif Day in [1]:
    print("You were born on a Monday")
elif Day in [2]:
    print("You were born on a Tuesday")
elif Day in [3]:
    print("You were born on a Wednesday")
elif Day in [4]:
    print("You were born on a Thursday")
elif Day in [5]:
    print("You were born on a Friday")
elif Day in [6]:
    print("You were born on a Saturday")
print("~~End Of Program~~")

对于限制 Year 的计算范围(限制 Year 的用户输入并不能解决上述问题)或从初始字符串输入“typedMonth”重构变量 month 的值的建议将不胜感激。

PS1 也许我应该为这个项目使用其他软件?我刚开始使用 python,所以我不知道哪些应用程序更适合此类程序。如果您认为这可能是一个可行的解决方案,请推荐!

PS2取得进展!该程序适用于千禧一代婴儿(又名进入 2001 年之后),我仍然需要修复逻辑!

PS3 感谢下面的评论,我现在可以运行该程序。代码中仍然存在明显的逻辑错误。我努力在时间允许的情况下开始这个项目的工作。我会相应地更新这篇文章。感谢您加入我的学习之旅!

标签: pythonmathdate-arithmetic

解决方案


您问 Python 是否适合此类项目。是的,但如果你使用得当,它会更合适。换句话说,不要让问题变得不必要的困难。

我理解您为了适应编程而实施特定算法的冲动,但我不得不说这不是一个好的选择。日期算术通常很痛苦。如果您想使用计算快捷方式(并且应该),请查看 Python 编程环境提供的快捷方式。

例如:

>>> import datetime
>>> from dateutil import parser
>>> date = "25/December/1999"
>>> datetime.datetime.strftime(parser.parse(date), "%A")
'Saturday'

dateutil模块不是标准库的一部分,但值得安装。


推荐阅读