Попытка построить программу на Python, которая отображает день рождения, когда пользователь вводит день рождения. Текущая попытка действует как петля - PullRequest
0 голосов
/ 25 апреля 2018

Мы все знаем, что в григорианском календаре, который мы используем в настоящее время, случайный день недели может быть одним из 7 вариантов.

Цель моего кода основана на фрагменте из книги Артура Бенджамина «Мыслящий математик» (2006), в которой вы можете выполнить простой трюк на вечеринке с использованием математики. Используя коды (в основном, реализуя ярлыки на основе григорианских шаблонов и находя остатки после деления на семь), можно быстро и точно предсказать прошлые и будущие дни недели.

Моя текущая попытка приводит к перегрузке PyCharm и съедает большую часть активности процессора. Я считаю, что это может быть потому, что я не ограничил степень ввода пользователем 'Year' так же, как я ограничил 'typedMonth'.

Это оригинальный код:

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)

Изолированное тестирование показывает, что первые четыре строки кода работают, как задумано (например, если я просто напечатаю typedMonth).

В бункере сегмент ближе к концу от remYear= Year%400 также работает как задумано.

Следовательно, на мой неопытный взгляд, «чрезмерное вычисление», вероятно, связано с натяжкой кода, который я использую для исправления переменной Month из пользовательской строки ввода typedMonth. Подчеркнем, что начальный ввод для Месяца начинается со строки typedMonth. Затем я использую операторы while для преобразования пользовательского ввода строки в целочисленное значение. Это целочисленное значение относится к переменной «Месяц», чтобы можно было выполнить окончательное вычисление целых чисел «Дата», «Месяц» и «Год». Остаток будет соответствовать дню недели (например, 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 не устраняет вышеуказанные проблемы) или реструктуризации значения для переменной month из начального строкового ввода typedMonth будет принята с благодарностью.

P.S.1 Возможно, мне следует использовать другое программное обеспечение для этого проекта? Я только начал с Python, поэтому я не знаю, какие приложения будут более подходящими для таких программ. Рекомендую, если вы считаете, что это может быть жизнеспособным решением!

П.С.2 Достигнут прогресс! Эта программа работает для тысячелетних младенцев (иначе, год после 2001), мне все еще нужно исправить логику!

P.S.3 Благодаря комментариям ниже, я теперь могу запустить программу. В коде все еще есть явные логические ошибки. Я стараюсь начать работу над этим проектом, когда позволит время. Я буду обновлять этот пост соответственно. Спасибо, что присоединились ко мне в моем учебном путешествии!

1 Ответ

0 голосов
/ 25 апреля 2018

Вы спросили, является ли Python подходящим инструментом для такого рода проектов. Это так, но гораздо лучше, если вы используете его правильно. Другими словами, не усложняйте задачу.

Я понимаю ваш импульс к реализации определенного алгоритма, чтобы освоиться с программированием, но я должен сказать, что это не очень хороший выбор. Арифметика даты - обычно боль. Если вы хотите использовать вычислительные ярлыки (и вам следует), посмотрите на ярлыки, которые предлагает среда программирования Python.

Например:

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

Модуль dateutil не является частью стандартной библиотеки, но его стоит того, чтобы его установить.

...