Главная страница «Первого сентября»Главная страница журнала «Информатика»Содержание №19/2008


В мир информатики
Школа программирования

Проверка скорости реакции человека

Составим программу, которая определяет скорость реакции человека. Идея такой проверки заключается в следующем. “Испытуемый” человек сидит перед компьютером, положив обе руки на край стола. На экране появляется надпись “Старт!”, после чего он должен нажать любую символьную клавишу на клавиатуре. Определяется время реакции, которое после нескольких попыток усредняется.

В программе (на школьном алгоритмическом языке [1]) используем следующие основные величины:

н — количество попыток;

старт — момент времени, когда на экране появляется надпись “Старт!”; этот момент характеризуется значением, которое возвращает функция время — число сотых долей секунды, прошедших с начала суток;

финиш — момент времени, когда участник нажимает клавишу; здесь также можно применить функцию время;

время_реакции — промежуток времени между двумя указанными только что моментами времени;

общее_время — сумма значений время_реакции для всех попыток.

Прежде чем представлять программу, заметим, что в ней:

1) промежуток времени между появлением на экране надписей “Старт!” задается случайным образом [2];

2) для проверки факта нажатия клавиши применяется функция inkey (аналогичная функция имеется и в других языках программирования).

алг Определение_времени_реакции

нач цел н, старт, финиш, i, j, k,

вещ время_реакции, общее_время

вывод нс, "Задайте количество попыток"

ввод н

общее_время := 0

нц для i от 1 до н

|Пауза разной продолжительности

нц для j от 1 до 104

нц для k от 1 до int(rnd(30000))

¦

кц

кц

вывод нс, "Старт!"

старт := время

|Ждем нажатия символьной клавиши

нц

¦

кц_при inkey <> ""

финиш := время

время_реакции := (финиш - старт)/100

общее_время := общее_время + время_реакции

кц

вывод нс, "Среднее время реакции: "

вывод общее_время/н, " сек."

кон

Однако приведенная программа позволяет “испытуемому” нажать любую клавишу до появления очередной надписи “Старт!” (не выдержали нервы? попытка перехитрить машину?), в результате чего время реакции будет необоснованно уменьшено. За это можно “наказывать” своего рода штрафом — включать во время реакции дополнительное значение, например, за каждое такое нажатие добавлять 0,2 секунды5. Соответствующий фрагмент имеет вид:

общее_время := 0

штраф := 0

нц для i от 1 до н

если inkey <> ""

то |Клавиша нажата раньше времени

штраф := штраф + 0.2

все

|Пауза разной продолжительности

— а результаты “испытаний” могут быть оформлены следующим образом:

общее_время := общее_время + время_реакции

вывод нс, "Среднее время реакции: "

вывод общее_время/н, " сек."

вывод нс, "Штраф: ", штраф, " сек."

вывод нс, "Среднее время реакции с учетом

'штрафа': "

вывод общее_время/н + штраф, " сек."

кон

Можно также усовершенствовать программу — вместо слова “Старт!” выводить на экран одну из цифр 0, 1, …, 9. Участник должен нажать соответствующую клавишу. Какие изменения необходимо внести в программу в этом случае (кроме описания новых величин: цифра — число, появляющееся на экране, и с — символ, который нажмет участник)? Таких изменений два:

1) при каждой попытке необходимо выбрать случайным образом цифру [2] и вывести ее на экран;

2) вместо функции inkey следует использовать функцию getkey — это позволит определить, нажал ли “испытуемый” соответствующую клавишу (проверив код нажатой клавиши).

Новый фрагмент (вместо фрагмента, начинающегося с оператора, который выводит на экран слово “Старт!”) имеет вид:

цифра := rnd(10)

вывод нс, цифра

старт := время

нц

¦ с := getkey

кц_при цел(с) - 48 = цифра

|Далее программа не меняется

финиш := время

Примечания.

1. Функция цел возвращает ASCII-код символа, являющегося ее аргументом.

2. 48 — ASCII-код цифры 0.

Задание для самостоятельной работы

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

Литература

1. Почему школьный алгоритмический? / “В мир информатики” № 38 (“Информатика” № 39/2004).

2. Случайные числа в программах. / “В мир информатики” № 33 (“Информатика” № 34/2004).


4 В программах на школьном алгоритмическом языке максимально возможное число повторений тела оператора цикла с параметром ограничено, поэтому приходится использовать вложенный цикл (цикл в цикле). В программах на других языках программирования для задания интервала времени между появлением на экране надписей “Старт!” может быть использован “обычный” оператор цикла с параметром.

TopList