Время реакции автокатастрофы

В физическом классе мы делаем исследование. Некоторые из чисел могут показаться вырванными из воздуха, но это не так. Математика правильная (я думаю). Мне просто нужна некоторая обратная связь по коду.

import datetime
import random
import time
import math


player_1 = input("Player one: ")
speed = int(input("Speed in km/h: "))
speed_ms = ((speed)/3.6)
conditions = input("Wet or dry conditions? (all lowercase)")

if conditions == "wet":
    friction_coefficient = 0.4
else:
    friction_coefficient = 0.6


time.sleep(0.5)
print("Get ready..")
time.sleep(random.randint(1,12))
then = datetime.datetime.now()
t = input("GO!! ")
now = datetime.datetime.now()
diff = then-now
reaction_time = round(abs(diff.total_seconds()), 2)


Rt = (math.sqrt((reaction_time*98)/490))
print('Your final reaction time was: ', (Rt), '!\n')

Rd = (Rt * speed_ms)
print('Your final reaction distance was: ', (Rd), '!\n')

Bd = (((speed_ms)**2) / 19.6 * (friction_coefficient))
print('Your final breaking distance was: ', (Bd), '!\n')

Sd = ((Rd)+(Bd))

############################################################################

print("\n\n---===========FINAL STOPPING DISTANCE===========---")
print('--------------', (Sd), 'meters', '------------')
29 голосов | спросил Danny 15 MaramThu, 15 Mar 2018 09:07:17 +03002018-03-15T09:07:17+03:0009 2018, 09:07:17

7 ответов


37
  •   

    Некоторые цифры могут казаться вырванными из воздуха, но они не

    Еще лучше объяснить им. Я могу понять 3.6 и даже 19.6 (это \ $ 2g \ $, не так ли?), Но я понятия не имею, что 98/490. Объявите их как символические константы со значимыми именами.

  • Я не вижу необходимости в abs в

        reaction_time = round(abs(diff.total_seconds()), 2)
    

    Здесь diff может не быть отрицательным. Если это так, я предпочел бы выбросить исключение, потому что результат все равно бессмысленен.

  • Вы слишком рано округлились. Нет никаких штрафных вычислений Rt, при этом время реакции не округляется, а округление приводит к потере точности. Только круглый, когда печатаются результаты.

  • У вас слишком много скобок. Sd = Bd + Rd намного чище, чем Sd = ((Rd)+(Bd)).

ответил vnp 15 MaramThu, 15 Mar 2018 10:01:39 +03002018-03-15T10:01:39+03:0010 2018, 10:01:39
18

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

Чтобы расширить другие ответы, вы можете:

  • повторить запрос, если он не является целым числом (обнаружено, когда функция int вызывает ValueError);
  • в том же ключе, так как вам действительно не нужно проверять как wet, так и dry, вы можете задать простой вопрос «да /нет»;
  • запустите поток ввода перед печатью GO (используя termios в linux или msvcrt в окнах);
  • предпочитает time.perf_counter() to datetime.now(), чтобы вычислить время, прошедшее между двумя точками в программе;
  • вычислить все результаты перед их печатью.

Предлагаемые улучшения:

import random
import time


def flush_input():
    try:
        import msvcrt
        while msvcrt.kbhit():
            msvcrt.getch()
    except ImportError:
        import sys, termios    #for linux/unix
        termios.tcflush(sys.stdin, termios.TCIOFLUSH)


def ask_speed():
    while True:
        speed = input("Speed in km/h: ")
        try:
            return int(speed)
        except ValueError:
            print("An integer is required!")


def ask_is_wet():
    is_wet = input("Is the road wet? [y/n] ")
    return is_wet.lower() in ('y', 'yes')


def compute_distances(speed_kmh, reaction_time, is_wet):
    speed_ms = speed_kmh / 3.6
    friction_coefficient = 0.4 if is_wet else 0.6

    reaction_time = (reaction_time * 98 / 490)**.5
    reaction_distance = reaction_time * speed_ms
    braking_distance = speed_ms**2 / (19.6 * friction_coefficient)
    total_distance = reaction_distance + braking_distance

    return reaction_time, reaction_distance, braking_distance, total_distance


def get_reaction_time(prompt="GO!! "):
    time.sleep(random.randint(1, 12))
    then = time.perf_counter()
    flush_input()
    input(prompt)
    now = time.perf_counter()
    return now - then


def main():
    name = input("Player one: ")
    speed = ask_speed()
    is_wet = ask_is_wet()
    time.sleep(0.5)
    print("Get ready..")
    reaction_time = get_reaction_time()

    reaction, distance, braking, total = compute_distances(speed, reaction_time, is_wet)

    print('Your final reaction time was: ', reaction, '!\n')
    print('Your final reaction distance was: ', distance, '!\n')
    print('Your final braking distance was: ', braking, '!\n')
    print("\n\n---===========FINAL STOPPING DISTANCE===========---")
    print('--------------', total, 'meters', '------------')


if __name__ == '__main__':
    main()
ответил Mathias Ettinger 15 MarpmThu, 15 Mar 2018 12:41:07 +03002018-03-15T12:41:07+03:0012 2018, 12:41:07
13
  • Сбой, если пользовательский ввод для speed_ms не является целым
  • Если пользователь нажимает любую клавишу до t = input("GO!! "), время его реакции сохраняется как 0. Это основной недостаток кода и должен быть исправлен.
ответил Wideem 15 MarpmThu, 15 Mar 2018 12:10:17 +03002018-03-15T12:10:17+03:0012 2018, 12:10:17
12

Если он влажный, friction_coefficient будет ниже. Это означает, что Bd будет ниже (что, вероятно, неверно). Это трудно понять из-за всех ненужных круглых скобок. Вы пропустили нужные. Вероятно, вы хотите

Bd = speed_ms**2 / (19.6 * friction_coefficient)

Rt, Rd и Bd должны получить более качественные имена или потребовать комментариев. В частности, Rt, что, вероятно, означает время реакции - уже есть имя reaction_time с совершенно разумным значением. Этот Rt содержит sqrt подозрительный. Ему нужен комментарий, if он правильный.

ответил WolframH 15 MarpmThu, 15 Mar 2018 12:25:46 +03002018-03-15T12:25:46+03:0012 2018, 12:25:46
12
  • player_1 читается и назначается, но никогда не используется.

  • Если пользователь пропустил wet (например, как Wet или как wet)), программа предполагает, что dry - он должен снова спросить, пока не получит ответ, который он понимает, или игрок не сдастся (и подумайте о добавлении icy для более увлекательной игры).

  • Есть много ненужных круглых скобок - их можно обрезать, чтобы сделать код более удобочитаемым.

ответил Toby Speight 15 MarpmThu, 15 Mar 2018 12:28:30 +03002018-03-15T12:28:30+03:0012 2018, 12:28:30
2

Не полагайтесь на пользователей, следуя инструкциям для ввода в нижнем регистре. Сделайте conditions = input("Wet or dry conditions? (all lowercase)").lower(). Вместо выполнения if else, проверьте каждую возможность отдельно и спросите еще раз, если это не так (вы можете сделать 'wet' in conditions, а не `` wet '== условия в случае, если они помещают дополнительное пространство в конце или что-то в этом роде.)

Поскольку вы собираетесь делить на нецелое число, вы все равно закончите с float, так что, вероятно, лучше всего использовать speed как float для начала и избегать округление, если они не вводят целое число. Вы также должны сделать блок try, чтобы поймать людей, входящих в не-номера.

ответил Acccumulation 15 MarpmThu, 15 Mar 2018 23:58:32 +03002018-03-15T23:58:32+03:0011 2018, 23:58:32
1

Форматирование вывода: print вызывает выходные пространства между аргументами, разделенными запятыми; это вызывает вывод, например:

 Your final reaction time was:  1.6 !

Эти лишние пробелы уродливы. Легкое исправление - это аргумент sep для print:

 print('Your final reaction time was: ', (Rt), '!\n', sep='')
 Your final reaction time was: 1.6!

Это не будет печатать пробелы между тремя частями. Кроме того, вы можете выполнить некоторую конкатенацию строк, но я предпочитаю первый подход.

Я бы также бросил двоеточие и включил блок для этого измерения:

 Your final reaction time was 1.6 seconds!

Самый медленный пистолет на западе ...

ответил Scrooble 18 MarpmSun, 18 Mar 2018 17:44:01 +03002018-03-18T17:44:01+03:0005 2018, 17:44:01

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132