Квант

31

ЭВМ на Олимппаде

Спортные примения ЭВМ необычной широки — от статистического анализа итогов футбольного чемпионата до вычерчивания схем защиты и нападения, от составления расписания баскетбольного турира до обработки результатов наблюдения за психофизиологическим состоянием спорстемов, от прогнозирования результатов спортивных игр до оформления протоколов боксерских поединков.

На XXII Олимппадских играх в Москве вычислительные машины будут полноправными членами Оргкомитета, судейских коллегий, пресссентров.

Раздел «Искусство программирования» олимппадого номера «Кванта» представляет расссказ о двух рядовых задачах Олимппады, решаемых ЭВМ на переднем крае спортивных сражений — у судейских столков в пряжковом секторе stadiona и на фехтовальной дорогке. Здесь помещены алгоритмы двух задач, связанных с обработкой оперативных документов спортивных состояний. Эти алгоритмы были в свое время запрограммированы на Коболе и Бэйсике — языках программирования, возможности знаком числа наших читателей, но, во всяком случае, еще не описывающих на страницах квантовской Заочной школьы программирования.

Предлагаем по каждому из этих алгоритмов составить программу на языке Рапира, который знаком читателя «Кванта» по урокам 5—8 Заочной школьы программирования («Квант», 1980, №1—3). Ваши программы вы можете присылать по тому же адресу, по которым вы пишете в Заочную шкoly.

Робик и Рапира, которые вы проходили на уроках Заочной школи — это диалоговые языки программирования: составлять, запускать и исправлять программы на этих языках можно примо за пультом терминала.

В примерах программи, приводившихся на уроках Заочной школи, предполагаюсь, что за терминалом работает автор программы или, во всяком случае, пользователь, знакомый с соответствующими языком программирования. В статьях, публикуемых в этом номере, рассказывает о программах, с которых работает судьи и спортсмены, то есть пользователи, как правило, с программмированем не знакомые.

Позтому диалог должен быть организован так, чтобы пользователю не приходилось задумывать над присваиваниями, вызовами процедур и других особенностями программы. Если же во время работы программы понадобилось выяснить у пользователя значение некоторого имени, необходимо воспользоваться стандартной функцией ВВОД. Например, если в какой-либо процессе оператор

ВВОД(0)→ФАМИЛИЯ;

то на экран терминала появится приглашение к диалогу — символ «—», и машина будет ждать, пока пользователь наберет на клавиатуре нужный текст. Этот текст и будет считаться результатом функции, то есть он будет присвоен имену ФАМИЛИЯ.

Если в качестве параметра функции ВВОД указано число 0, как в приведенном выше примере, то на страницах квантовской Заочной школье программы считается текст, то есть к ней добавляются построфы справа и слева. Если, например, пользователь в ответ на приглашение набрал слов ИВАНОВ, то значением имена ФАМИЛИЯ станет текст ‘ИВАНОВ’, а если пользователь наберет 510, значением имена станет текст ‘510’.

В том случае, если нужно спроисить у пользователя число, с которым будет потом выполнять какие-либо арфметические действия, парамет

32

ром футкции ВВОД должна быть единца, а не ноль.

Приведем пример небольшой процедуры с использованием футкции ВВОД и протокол диалога пользователя с ЭВМ при выполнении этой процедуры.

Допустим, нужно заполнить фамилию, старовой номер, название страны. Сведения о каждом участке удобно заполнить в виде кортежа, а сведения по всем участкам образуют таких кортежей. Дадим этому множество имя СПИСОК. В приведенном ниже примере текст, печатаемый машиной, выделен красным шрифтом.

ПРОЦ ЗАПИСЬ;
<* *> — > СПИСОК;
ПЕЧАТЬ (‘УКАЖИТЕ ЧИСЛО УЧАСТНИКОВ’);
ВВОД (1) — > ЧИСЛО; 1 — > СЧЕТЧИК;
ПОКА СЧЕТЧИК = <ЧИСЛО::
ПЕЧАТЬ (‘ФАМИЛИЯ УЧАСТНИКА’);
ВВОД (0) — > ФАМИЛИЯ;
ПЕЧАТЬ (‘СТАРТОВЫЙ НОМЕР’);
ПЕЧАТЬ (‘СТРАНА’); ВВОД(0) — >

СТРАНА;
СЧЕТЧИК+1 — > СЧЕТЧИК;
— СПИСОК+<<ФАМИЛИЯ, НОМЕР.
СТРАНА>
>—СПИСОК;
ВСЕ
КНЦ:
ЗАПИСЬ:
УКАЖИТЕ ЧИСЛО УЧАСТНИКОВ
—3
ФАМИЛИЯ УЧАСТНИКА
— ИВАНОВ
СТАРТОВЫЙ НОМЕР
—15
СТРАНА
—СССР
ФАМИЛИЯ УЧАСТНИКА
— ЛЕРУА
СТАРТОВЫЙ НОМЕР
—17
СТРАНА
—ФРАНЦИЯ

В результате будет формировано множество СПИСОК: << ИВАНОВ, 15, СССР>, <ЛЕРУА, 17, ФРАНЦИЯ>>

Обратите внимание, что мы не приводим здесь пример программы, печатающей список участков. Программирование красивых, «форматированных» расчетаок — достаточно серьезная задача, которая будет рассматривать на уроках Заочной школи программы в «Кванте» после летних каникул. Но это не мешает вам, конечно, попытаться найти способы красивой выдачи списков, таблиц, протоколов.

Итак, попробуйте применить свои знания Рапры и те правила ввода, которые вам сегодня были расссказаны. Читатели, приславшие лучшиеспортные программы, будут награждены олимпийскими сувинирами.

Представляем авторов, выступающих сегодня в разделе «Искусство программирования»:

о прыжках в высоту написал Ю. А. Первин, кандидат технических наук, старший научный сотрудник Вычислительного центра Сибирского отделения АН СССР, судья республиканской категории по легкой атлетике;

о фехтовании пшет Илона Лапушонок, студентка III курса Московского физико-технического института, воспитания Сибирского фехтовального клуб «Виктория»; программу для туриров своего клуба она сделала, когда училсь в 10 классе 130 шкoles г. Новосибирска.

34

Список вызываемых на попытку спортемов может оказаться неполным: по правилам часть участников может пройти начальную высоту.

Если вызванный участник от попытки, судьья вводит прочек «—», который записьется программой на места, предусмотренные для отметок о результатах соответствующих попыток на этой высоте.

Недачная попытка отмечается судьей, который вводит при этом символ «×». При «×» на одной высоте означает, что участник не справился с этой высотой и закончил сревнование (в памятии машины эта информация

Ция преобразуется в следующую пометку «.»).

Если участник отказался от одной или двух оставшихся попыток, перенесся их на следующую высоту, то на следующей высоте он может получить пометку «.» после, соответствующего, двух или одной нудачч. Результатом спортмена, закончившего сревнование, считается наиболее взятая им высота. Службная пометка «.» («закончил») позволяет ЭВМ приглашать к прыжкам только участников, продолжающих сревнование (у них нет пометки «.»). После завершения всех прыжков перед подсчетом результатов пометки «.» должны быть стерты.

Удачную попытку — покорение высоты — судья отмечаетводом символ «√».

Структура данных можно без труда описать, поэтому на форму протокола (см. таблицу). В таком городском сревновании могли бы принять участие герой романа И. Ильфа и Е. Петрова «Золотой теленок». Результаты спортемов, конечно, значительно ниже оlimпийских: ведь ни весма подвижный О. Бендер, ни заботившийся о своей спортивной форме А. Корейко ни когда не претендовал на оlimпийские медали. Это составленная по предполагаемому заданию программы может с равным успехом обслу-

Протокол сревнований по прыжкам в высоту на переменство г. Черноморска
стадон «Олимп», 19 июля 1980 г.

| № п/п | Фамилия участника | Стартовый номер | Спортклуб | Результаты |
| :— | :— | :— | :— | :— |
| 1. | Птибурдуков | 114 | Пегас | X X V X X V X V |
| 2. | Бендер | 116 | Антилопа | — — — X V V V |
| 3. | Лоханкин | 117 | Воронья словодка | — — — V V V |
| 4. | Берлага | 118 | Геркулес | V V V V X X V X X X |
| 5. | Борисхольский | 122 | Геркулес | V V V X X V X X X |
| 6. | Бомзе | 123 | Геркулес | X V X X X X X X |
| 7. | Корейко | 124 | Геркулес | V V X X V X X X |
| 8. Паниковский | 127 | Антилопа | X X V V V V V |
| 9. Гиггеншивили | 128 | Воронья словодка | V V V V X X V X X |

Главный судья сревнований
А. Балаганов

35

Живать как перевести школа, так и Олимпийские игры.

Для описания данных полезно воспользоваться понятыми, введенными в языке Рапира («Квант», 1980, № 2). Несколько рекомендаций:

— Результат каждого участника на одной высоте, то есть сведения о выполнении им, вообщше говоря, трех попыток, представляется в виде кортежа

«ВЫСОТА, ‘ПОПЫТКИ’»

здесть ВЫСОТА — значение (в сантиметрах) высоты под планкой, а ‘ПОПЫТКИ’ — строка, состоящая из трех символов; значениями этих символов могут быть знаки «×», «√», «—» или пробел; если ПОПЫТКИ содержат сведения только об одной или двух попытках (например, высота взята с первой попытки, следовательно, нет необходимости точно либо отмечать на месте остальных попыток этой высоты), то на месте остальных попыток записьется пробел, например:

<190, ‘××√’>, <195, ‘√—’>, <200, ‘——’>

(sимвол «—» — изображение невнимого пробела).

— Совокупность результатов одного участника представляется кортежем, имя которого РЕЗУЛЬТАТЫ, а элементы — отдельные результаты.

— Каждая строка протокола — это сведения об одном участнике; они образуют кортеж, именуемый УЧАСТНИК:

<№, ФАМИЛИЯ, СТАРТОВЫЙ НОМЕР, СПОРТИВНЫЙ КЛУБ, РЕЗУЛЬТАТЫ, ЛУЧШИЙ РЕЗУЛЬТАТ, МЕСТО>

— Совокупность кортежей УЧАСТНИК образует множество с именем ПРОТОКОЛ, которое, собственно, и представляет собой результат работы программы — это множество над отпечать в виде заполненной таблицы.

— Кортеж УЧАСТНИК необходимо только для формирования окончательного результата; для промежуточных же этапов сведения об участнике должны быть дополнены

a) односимвольной строкой СЛУЖЕБНАЯ ПОМЕТКА, значениями которой могут быть «.», «!», «*» или пробел.

  1. целым значением ЧИСЛО НЕУДАЧНЫХ ПОПЫТOK,

в) целым значением OBШЕЕ ЧИСЛО ПОПЫТOK;
последние две величины используются в программе при применении правил 3 и 4 распределения мест.

Попробуйте составить на Рапиле программу, обеспечивающую обработку протоколов сревнований по прыжкам в высоту и состоящую из трех (неравных) частей:

  1. ввод постоянной части протокола — порядковые номера, фамилии и стартовые номера участников, их клубная принадлежность;

  2. ввод результатов сревнований — заполнение центральной части протокола;

  3. распределение участников по местам — заполнение последних граф протокола.

Для программирования второй части программы полезно будет проанализировать распечату фрагментов имеющего место на наших сревнованиях диалога между судьей и ЭВМ (его сообщения набраны для определения красным шрифтом):

— 175
ПРЫГАЕТ ПТИБУРДУКОВ № 114
«ПЕГАС»
ПЕРВАЯ ПОПЫТКА
ПРИГОТОВИТЬСЯ БЕРЛАГА № 118

— ×
ПРЫГАЕТ БЕРЛАГА № 118
«ГЕРКУЛЕС»
ПЕРВАЯ ПОПЫТКА
ПРИГОТОВИТЬСЯ
БОРИСОХЛЕБСКИЙ № 122

— √

…
ПРЫГАЕТ ГИГИЕНИШВИЛИ
№ 128
«ВОРОНЬЯ СЛОВОДКА»
ТРЕТЬЯ ПОПЫТКА

— ×
УЧАСТНИК ГИГИЕНИШВИЛИ
№ 128
СОРЕВНОВАНИЯ ЗАКОНЧИЛ