Вычислительная техника и её применение 1991-2 1991 г.

Л.Ф. Штернберг - программируйте с нами. Урок первый.


Л.Ф.Штернберг

ПРОГРАММИРУЙТЕ С НАМИ
Урок первый

- Вадик! Мне сегодня нужна твоя
помощь, — с порога обратился сту-
дент Андрей к брату-семиклассни-
ку — мне уходить вечером, а еще
чертить надо и "расчетка : считать не
пересчитать.

- А калькулятор свой новенький
дашь?

- Конечно, дам. И работать на нем
научу.

- Тогда с удовольствием. — Ва-
дим достал программируемый мик-
рокалькулятор "МК-54 . — Мы уже
на инженерных калькуляторах счита-
ли, а на твоем я знак = " найти не
могу.

- А его там и нет: он не нужен.

- А как же считать?

- Очень просто. Числа ты набирать
умеешь. Наоираешь число — оно
загорается на индикаторе — это чис-
ло заносится в так называемый ре-
гистр X. Теперь нажимаешь клавишу
"В f" — это число переписывается в
регистр У. Набираешь второе чис-
ло — оно записывается в X. Теперь
нажимаешь клавишу операции " +
или или "х", или "-г" — и опера-
ция выполняется: первое число бе-
рется из У, второе — из X, результат
виден на индикаторе и содержится в
X. Если теперь набирать новое число,
то оно появляется на индикаторе, а
результат старой операции уходит в
у — очень удобно выполнять цепо-
чечные вычисления. Понял?

- Да. Давай, что вычислять?

- Подожди. Есть еще одна полез-
ная особенность. На ваших инженер-
ных калькуляторах есть одна ячейка
памяти. А здесь их 14. Если нажать
клавишу "х-П" и клавишу с цифрой,
то содержимое X будет запомнено в
регистре памяти с заданным номе-
ром (пока ограничимся 10 регистра-
ми). Если нажать "П-х" и клавишу с
цифрой, то запомненное число из
этого регистра прочитается в X, а то,
что было в X, уйдет в У. Ясно? Ну,
начали. Вот таблица с исходными
данными. Сюда будешь писать ре-
зультаты. Действуй по моим коман-
дам.

Эта статья предназначена в помощь школьникам старших клас-
сов, изучающим информатику, и учителям, е* преподающим. А
также всем, кому удалось приобрести программируемый каль-
кулятор, и кто уже приступил к самостоятельному изучению ра-
боты на калькуляторе и изучению основ программирования.

Работа кипела. Андрей чертил и
командовал. Вадим работал с каль-
кулятором. Но вскоре стало ясно, что
все равно они не успевают до вре-
мени, когда Андрею надо уходить.

- Ладно, Андрей, ты иди, — ска-
зал Вадим. — Я дальше сам управ-
люсь:тут все повторяется одно и то
же, только с разными числами. Да-
вай только на всякий случай запишу
порядок действий, хотя я его уже и
так запомнил. Итак, пишу:
"Взять из колонки С, занести э РО...
Умножить на М..." ^ • ^

Тут в его записи заглянул отец.

- Вадик! Ну как ты пишешь?! А
еще шахматист! В шахматной записи
ты тоже пишешь "пойти пешкой с
третьего поля во втором ряду на
клетку вперед"?

- Нет, конечно. Там есть специаль-
ная краткая запись. А здесь как ко-
роче записать?

- Ну хотя бы так. — Отец взял
ручку:

Слева записаны действия, а справа
табличка: какие значения в каких ре-
гистрах хранятся.

- Хм! Действительно, здорово! Ко-
ротко и ясно. Только Т надо в РЗ хра-
нить.

- Почему? Не все ли равно, где?
Так ведь тоже можно.

В этот момент из школы пришла
Аня, ученица 11 класса.

- Здравствуйте! Чем это все муж-
чины заняты? — она зяглянула в за-
писи. — Вы никак тоже РАПИРой за-
нимаетесь?

- Какой рапирой? При чем тут
фехтование?

- Да не та рапира, которой фехту-
ют, а язык программирования РАПИ-
РА. Мы его на уроке информатики
учили. Хотя стоп: это вроде и не со-
всем РАПИРА, хотя очень похоже.

Ей объяснили, что к чему. Востор-
гу ее не было границ:

- Папа, ты же язык программиро-
вания изобрел! Почти как та РАПИРА,
с которой мы работаем на машинах
"Агат". Только там после каждого
действия надо точки с запятой ста-
вить, и писать "Ввод данных" вместо
"Занести" и "Вывод" вместо "Запи-
сать":

ВВОД ДАННЫХ: С,М;

ОМ + 2.5 —> Т;

...

ВЫВОД: Р-Н;

Звонок в дверь: появился друг
Андрея Виктор.

- Здравствуйте! Андрей, ты готов?
Пошли. Чертеж готов у тебя?

- И еще часть расчетной рабо-
ты — я помогал. — Похвалился Ва-
дим. И он рассказал, как он считал
под команду Андрея и все осталь-
ное.

Реакция Виктора была неожидан-
ной:

- Что же ты делаешь, несчастный!
У тебя же в руках
программируемый
калькулятор, а ты с ним работаешь,
как с ... — Виктор не мог найти под-
ходящего сравнения. — Выключи
немедленно. Вернемся, я покажу,
как с ним работать, — за полчаса
все пересчитаем — и Андрея, и
мое: я как раз на ваш калькулятор
рассчитывал.

Пока студенты в отлучке, попро-
буем разобраться, что происходило.
Знал ли Вадим, что он считает? Нет,
не знал. (Не знаем этого и
мы — формулы умышленно взяты
"с потолка"). Вадим работал как
формальный исполнитель, не заду-
мываясь, исполнял команды.
Алго-
ритм
— четкую однозначную после-
довательность нужных дейст-
вий — знал Андрей. Но дать коман-
ду "Выполни расчет" он не мог: Ва-
дим бы его не понял. Пришлось раз-
бить алгоритм на отдельные мелкие
команды, которые Вадим мог понять
(которые были в
системе команд ис-
полнителя) и подавать их по одной.
Вадим работал с калькулятором, ко-
торый также является
формальным
исполнителем:
калькулятор тоже не
знает, что на нем вычисляют. Вадим
"переводил" команды, поданные
ему, на язык, понятный калькулято-
ру, — т.е. в последовательность на-
жатий клавиш. Когда потребовалось
записать алгоритм, то выяснилось, что
писать его на русском языке неудоб-
но, пришлось изобрести специальную
систему записи —
алгоритмический
язык
(или язык программирова-
ния
— разница между этими поняти-
ями пока для нас несущественна).
Все языки программирования, изо-
бретенные для одинаковых или еди-
ных целей, похожи друг на друга: не
удивительно, что и наш язык оказался
похож на РАПИРУ. Освоивший этот
язык Вадим все равно остается фор-
мальным исполнителем — он не
знает, что он считает, но теперь он
более "разумный" исполнитель: те-
перь он понимает более сложные ко-
манды вида "С М+ 2.5 —> Т". Ко-
нечно, он может их исполнить и в
уме, но предпочитает переводить в
последовательность нажатий клавиш.

Задача. Записать алгоритм, кото-
рый по значениям диаметра и высоты
цилиндра считает его объем и пло-
щадь поверхности.

Урок второй

- Ну что, продолжим? Вадик, до-
ставай калькулятор. Показывай, Витя,
как ты собрался за полчаса все пере-
считать — и мое и твое.

- Смотрите, ребята. Как шла рабо-
та сначала? Андрей подавал команду,
а Вадим ее тут же исполнял — он
работал в
режиме интерпретации ко-
манд,
или в режиме вычислений. В
какой-то момент Андрей дал коман-
ду "Записывай!" и стал повторять за-
тем те же команды, что и ранее, и в
том же порядке, но Вадик их уже
не
выполнял,4 а записывал
— команда
"Записывай!" как бы переключила
его в
режим записи. Затем Андрей
дал команду что-то вроде "Конец за-
писи", и Вадик отложил в сторону ав-
торучку и снова взялся за калькуля-
тор, т.е.
вернулся к режиму вычисле-
ний.
Теперь ему можно задать ис-
ходные данные и сказать одно слово
"Вычисляй!", и он выполнит весь цикл
вычислений, ничего не спрашивая у
Андрея, а только поглядывая в свои
записи, так сказать,
"в автоматиче-
ском режиме".
Дальше Андрей дол-
жен задать новые исходные данные,
и снова Вадик будет считать сам. Так
вот, то же самое можно сделать и с
калькулятором. Команда "Записы-
вай!" подается нажатием клавиш "F"
и "ПРГ" — калькулятор переходит в
режим записи, который здесь назы-
вается
режим программирования, или
программный режим. Вадик, нажми.

- На индикаторе появились два ну-
ля где-то сбоку.

- Правильно. Калькулятор может
запомнить 98 команд, которые нуме-
руются с нулевой по 97. Номер ко-
манды еще называется ее
адресом.
Справа на индикаторе виден так на-
зываемый
счетчик адреса, где ото-
бражен номер очередной команды.
Нули означают, что сейчас будет за-
писываться команда номер ноль. Ка-
кая была первая команда, которую
ты выполнял на калькуляторе после
занесения данных?

- Вызов числа из РО: "П-х" "О".

- Нажимай эти клавиши. Что полу-
чается?

- На индикаторе "60 01". И
что это такое?

- "01" означает, что сейчас будем
писать команду № 1, так как команду
№ 0 уже записали. А "60" — это ко-
манда "взять число из РО". Словами
писать, как вы видели, долго, поэто-
му команды записываются
кода-
ми
— все коды есть в инструкции к
калькулятору. Что ты делал дальше?

- Умножал. Нажимаю клавишу
"х". На индикаторе "12 60 02'
Так: 02 — это номер следующей ко-
манды. "60", похоже, просто сдвину-
лось, а "12" — видимо, код коман-
ды "умножить". Да, по таблице в ин-
струкции так и есть. Дальше надо за-
писать результат в Р2. Нажимаю "х-
П" "2": на индикаторе "42 12 60
03" — все ясно — "42" код коман-
ды "записать в Р2", остальные коды
сдвинулись. А интересно, куда они
дальше двигаться будут — места на
индикаторе больше нет. Нажимаю
"2" — на индикаторе "02 42 12 04", а
"60" пропало.

- Оно не пропало. Просто сквозь
индикатор видны только три послед-
ние команды, так же как в тетради
видно только то, что на последней
странице записано, которая еще не
перевернута. Давай дальше: нажи-

. 4 н СП

май !> .

- Нажал: на индикаторе "05 02 42
05". Ой, мы точку нажать забыли.

Ничего страшного. Вот клавиша
"ШГ", нажми ее. Что вышло?

- На индикаторе "02 42 12 04".
Ага, вроде вернулись к тому, что бы-
ло раньше.

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

Нажали клавиши: ".", "5", " + ", "х-

П", "2", "F" "sin", "3", "х", П-х", "2",
"F", "cos", ''-", "х-П", "3".

- Ладно, хватит пока. Ограничимся
вычислением Р, чтоб было ясно, что к
чему, а дальше сам продолжить
сможешь. Заканчивать программу
надо командой "С/П", а то калькуля-
тор сам не поймет, где конец. Нажа-
ли ее: код у команды "50". Все, на-
жимаем "Р "АВТ", и на индикаторе
снова число — можно считать даль-
ше.

Нажмем "В/О" — это в счетчик
адреса заносится ноль, чтобы кальку-
лятор знал, откуда начинать выпол-
нять записанные команды. Заносим
исходные данные: С = 2. М = 3, "2",
"х-П", "О", "3", "х-П", Клавиша

"С/П" — это команда "считай по за-
помненным командам". Нажимаем
ее — индикатор мигает несколько
секунд и результат готов: 2.9974733.
Аргументы синусов и косинусов,
кстати, были в радианах, потому что
переключатель "Р-ГРД-Г" был в по-
ложении "Р". Результат на индикато-
ре, но он же хранится в РЗ, откуда
его можно прочитать командой "П-х"
"3". Теперь опять нажимаем "В/О",
заносим новые данные: сколько там
в таблице? С = 3,М = 6. Нажали "С/П"
и через несколько секунд получаем
очередной результат 3.0700535.

- Да, так действительно все за
полчаса пересчитаем.

- Выключи калькулятор, включи
его снова: программа в памяти стер-
лась. Теперь вводи команды в па-
мять снова, только теперь уже все, а
не только вычисление Р, и считай.

Вадим считает. А мы еще раз
вспомним нашу работу и сравним.

дикаторе ^два нуля. А теперь нажи-
маем "ШГ" — на индикаторе "60
01", еще раз "ШГ" — "12 60 02".
Что это?

- Команды, по которым мы счита-
ли.

- Правильно. Еще 5 раз "ШГ": на
индикаторе "1С 42 10 07" — вот и
появилась команда вычисления сину-
са. "ШГ" "F" "cos" — а вот я ее
заменил на вычисление косинуса. "F"
"АВТ" "В/О" — все, можешь считать
с измененной программой.

Задача. Просчитайте на калькуля-
торе данную в прошлом уроке зада-
чу с цилиндром для разных значений
диаметра и высоты.

Урок третий

- Вадик, у меня для тебя новая
работа появилась.

- Если с калькулятором, то "Всег-
да готов!".

- С калькулятором, с калькулято-
ром. Только расчет похитрее, чем в
прошлый раз. Смотри: Т и Н вычис-
ляешь по этим формулам — это те-

- Витя, я кончил. Выключать, вклю-
чать, и вводить твою программу?

- Не надо. Мой вариант отличается
только формулой: косинус вместо
синуса в одном месте и данными.
Смотри: "В/О", "F" "ПРГ" — на ин-
бе знакомо. А дальше надо чуть-
чуть думать: если Т оказалось мень-
ше, чем Т0, то тут начинается колеба-
тельный процесс...

- Стоп-стоп. Я, как мне объяснили
в прошлый раз, формальный испол-

нитель, и твой колебательный про-
цесс, равно как и вся прочая физика,
меня интересовать не должны. Ты
мне объясняй только то, что я дол-
жен вычислять, а смысл результа-
тов — это твоя забота.

- Ладно, ты прав. Итак, если Т
меньше Тс, то вычисляешь С по та-
кой формуле. После чего результат
вычисляется по этой формуле: обоз-
начим ее номером 4. Если же Т
больше либо равно TQ, то сначала на-
до вычислить Р — вот формула, те-
перь С вычисляется через Р вот та-
ким способом (
пишет формулу). А
далее результат по значению Р полу-
чается по той же формуле 4. И, как в
прошлый раз, все это надо вычислять
для разных исходных данных. Понял?

- Понял. А интересно, как это за-
писать "по-научному", чтобы было
коротко и ясно? Вычисления по фор-
мулам ясно, как писать. Как это Аня
называла —
команда присваивания,
так, что ли? А вот эти варианты: если
так, то считать по-одному, а если ина-
че, то по-другому — это как запи-
сать?

- Не знаю. Давай спросим у па-
пы — он что-нибудь изобретет.

- А тут и не надо ничего изобре-
тать — откликнулся папа, слышавший
весь разговор. — Запиши по-русски,
так как сказал. Пиши слово 'если",
теперь пиши "Т меньше Тс" — на-
деюсь, "меньше" ты не словом напи-
сал, а математическим значком? Те-
перь пиши "то" и формулу, по кото-

I рой надо считать в этом случае.

- А формулу писать с новой стро-
ки или в той же строке?

- Как хочешь — и так и так понят-
но. Дальше сам управишься? Пока-
жи, что получается.

Получилось вот что:

- Ну зачем ты второй раз выписы-
ваешь условие. Как ты говорил: "а
иначе считать по-другому"? Вот так и
запиши: "а" можно не писать, остает-
ся "иначе". Запятые перед "то" и
"иначе" можешь тоже не писать — и
так ясно.

- Как же не писать запятые? Пе-
ред "то" запятая нужна всегда.

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

- В этой записи мне ясно все, кро-
ме одного: как я понял, по послед-
ней формуле я получаю окончатель-
ный результат и по ней я должен ра-
ботать и в случае выполнения усло-
вия Т<Т0, и в другом случае, но от-
куда следует, что к слову "иначе" от-
носятся именно две формулы, а не
одна и не три?

- Н-да, действительно. Ну, по ло-
гике-то понятно, что надо взять две
формулы и все. А третья — это уже
общая формула для обоих случаев.

- Это тебе, Андрей, понятно, пото-
му что ты знаешь, что здесь вычисля-
ется. А я не знаю, да и знать-то мне
это как формальному исполнителю
не положено.

- Тогда давай запишем эти фор-
мулы в строку после "иначе", а
третью формулу -выделим в отдель-
ную строку.

- Можно, конечно, но мне это не
очень нравится: Аня говорила, что
присваивания можно и в строчку пи-
сать, и что главное, что их разделя-
ет — это точка с запятой, а не новая
строка.

- Тогда можно взять две форму-
лы в скобки.

- Тоже выход. Папа, а тебе как
больше нравится?

- Ни так и ни так. Как ты, Андрей,
сказал — "две формулы и все"? Вот
так и напиши: две формулы и слово
"все", а "и" можно не писать. Как
вам такой вариант нравится? А писать
можно хоть в строчку, хоть в столбик:
все понятно:

если Т<Т0 то —> С иначе а'Т —> Р;

sinP + cosP —> С все СР-(Т-Т0) R

И точки с запятой перед "иначе" и
"все" можно не писать — и так все
ясно.

- Вариант хорош. Но наши тоже
годятся. Вот Аня придет — спросим
у нее.

Аня подозрительно спросила:

- Папа, а ты правда никогда не за-
нимался программированием? То, что
ты предложил, — это точно то, что
есть в языке РАПИРА. Как ты так все
здорово угадываешь? Вся разница,
что в РАПИРЕ обычно пишут такие
слова, как "если", "то" и т.д. заглав-
ными буквами — такие слова назы-
ваются
ключевыми или служебными.

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

- Честное слово — никогда. Про-
сто, как я понял из наших разговоров,
все ваше программирование — это
просто очень много здравого смыс-
ла. И если у вас есть здравый смысл,
то все получится просто. А то, что я
угадал столь точно, — это случай-
ность. А ну-ка я сейчас позвоню сво-
ему приятелю — он програм-
мист — и задам ему один вопрос.

Приятель-программист подтвер-
дил, что абсолютно все, что пред-
лагали ребята, в языках програм-
мирования есть: и запись того, что
относится w к "иначе", в строку (в
языке БЕЙСИК), и взятие в скобки
(языки ПАСКАЛЬ, ПЛ/1, АЛГОЛ-
60) — только скобки там применяют
не круглые, а весьма специальные:
слова "начала" и "конец", но с со-
временных позиций вариант со сло-
вом "все" выглядит лучше.

- Ну ладно, — сказал Вадик, — с
теорией разобрались. Теперь перей-
дем к практике: как это считать? На-
верное, надо сначала вычислить Т, а
затем ввести либо программу вычис-
ления по одним формулам либо по
другим.

- И сколько же раз ты будешь
менять программу? Ведь нужно про-
вести вычисления для разных исход-
ных данных.

А интересно, — спросила
Аня, — нельзя ли ввести сразу 4
программы: вычисление Т, вычисле-
ние по формулам для случая Т<Т0,
вычисление для второго случая и вы-
числение итогового результата, а за-
тем запускать их в нужном порядке?

Язык программирования
ПРОЛОГ (PROLOG) создан
во Франции в Марсельском
университете в 1971 году,
tro разработал Ален Коль-
меро (Colmerauer — его фа-
милию по-разному перево-
дят на русский язык).

Название языку, как гово-
рят, дал коллега создате-
ля — Ф.Руссель или жена
последнего, хотя в дальней-
шем его стали расшифровы-
вать как "Программирование
в терминах лОГики"
(PROLOG — PROqramming in
LOGic). Язык ПРОЛОГ имел
непосредственного предше-
ственника.Вот что говорит
А.Кольмеро: "Риск, прису-
щий данному проекту (про-
екту создания ПРОЛОГа), за-
ключался в том, что мы мог-
ли создать язык высокого
уровня, который оказался бы
неэффективным. Но я од-
нажды уже рискнул и одер-
жал пооеду — так несколь-
ко лет назад был создан
язык SYSTEM-Q."

Разрабатывая новый язык
программирования для задач
анализа и понимания естест-
венных языков, А.Кольмеро
решил использовать язык
формальной логики, а точнее
логики предикатов первого
порядка (здесь ПРОЛОГ
имеет общие корни с реля-
ционными базами данных) и
метод автоматического до-
казательства теорем.

Язык ПРОЛОГ основан на
концепциях логического про-
граммирования, предложен-
ных профессором Лондон-
ского университета Робертом
Ковальским, и представляет
собой среду, ориентирован-
ную на рассуждения или де-
дукцию. "ПРОЛОГ часто пу-
тают с логическим програм-
мированием — пишет Р.Ко-
вальский. ПРОЛОГ базирует-
ся на логическом програм-
мировании почти в таком же
смысле, в каком ЛИСП бази-
руется на ламбда исчисле-
нии". То есть можно сказать,
что первым применением
логического программирова-
ния является язык ПРОЛОГ.
При логическом программи-
ровании, которое реализует-
ся на языке ПРОЛОГ, осуще-
ствляется обработка сим-
вольной информации (реше-
ние проблем), в ходе кото-
рой процесс доказательства
теорем интерпретируется
как процесс вычисления или
процесс выполнения про-
граммы. Соответствие про-
цесса доказательства тео-
рем и процесса выполнения
программы и было установ-
лено Р.Ковальским. А метод
автоматического доказатель-
ства теорем, называемый
методом резолюций,

разработал Дж. Робинсон в
середине 60-х годов.

Надо сказать, что попыт-
ка реализовать некоторые
идеи логического програм-
мирования были сделаны
при разработке малоизвест-
ных языков QA3 и QA4, а
также Хьюиттом и Зусманом
из Массачусетсского техно-
логического института при
создании языков мЛЭННЕР
(PLANNER) и МИКРО-ПЛЭН-
НЕР (MICRO-PLANNER).

До начала 80-х годов
ПРОЛОГ был уделом ученых,
работавших в основном в об-
ласти логического програм-
мирования и мало знаком
широкому кругу программи-
стов и пользователей компь-
ютеров (для многих непосвя-
щенных название языка ас-
социировалось с аналогич-
ным названием фирмы, про-
изводящей микропроцессор-
ную технику).

Ситуация стала меняться с
октября 1981 года, когда
Япония известила мир о про-
грамме создания вычисли-

• А еще интереснее, — сказал
пап а, — нельзя ли выбор варианта
хода вычисления поручить самому
калькулятору? Это было бы гораздо
удобнее.

- Придет Виктор, у него и спро-
сим. Все равно калькулятор у не-
го, — завершил разговор Андрей.

Задача. Написать алгорим, кото-
рый по значениям айв вычисляет
max {а, Ь} и min {а, Ь}.

Урок четвертый

- Вы интересуетесь, не может ли
калькулятор сам выбрать вариант ра-
боты? — спросил Виктор. — Может.
Для этого у него есть 4 команды, ко-
торые называются командами
услов-
ного перехода
(хотя правильнее бы-
ло бы назвать командами
условного
продолжения):
это команды "F X = О",
"F X Ф О", "F Х>0" и "F Х<0", и ко-
манда
безусловного перехода "БП".
Эти команды хитрые — вы таких
еще не видели: они занимают целых
2 ячейки в программной памя-
ти — сама команда занимает пер-
вую ячейку, а во второй находится
адрес какой-то другой команды. И
заносятся они в память в 3-4 нажатия
клавиши: первые 1-2 нажатия сама
команда, а затем нажимаем две
цифровые клавиши и заносим адрес.
Вот смотрите: включаем калькулятор
и нажимаем "F ПРГ". Теперь пусть
надо записать команду "БП" с адре-
сом 23: нажимаем "Би" — появился
код 51, теперь нажимаем "2" — ни-
чего не появилось, нажимаем
"3" — на индикаторе появился код

"23". Ясно?

- Пока не очень. Зачем это все
нужно?

- Сейчас увидите. Обычно коман-
ды калькулятор выполняет подряд. А

тельных машин пятого поко-
ления, в которой язык ПРО-
ЛОГ выбран в качестве базо-
вого языка программирова-
ния. На протяжении 80-х го-
дов ПРОЛОГ не сходит со
страниц многочисленных на-
учных журналов по вычисли-
тельной технике и публика-
ций в области искусственно-
го интеллекта.

Однако растущую попу-
лярность ПРОЛОГа, как от-
мечают венгерские специа-
листы В.Домелки и П.Сере-
ди, нельзя объяснять только
выбором авторов японского
проекта, здесь кроются бо-
лее глубокие причины.

1. При решении проблем
"кризиса программного

обеспечения", ПРОЛОГ мож-
но рассматривать как уни-
версальный язык сверхвысо-
кого уровня с хорошо опре-
деленной и логически обос-
нованной семантикой.
ПРОЛОГ, будучи языком ло-
гического программирова-
ния, не только изменяет
стиль программирования за-
дач (в смысле фон Нейма-
на), но и укоренившуюся (в
течение четырех поколений)
архитектуру вычислительных
машин. "Компьютеры, по су-
ществу, никогда не меня-
лись, они только станови-
лись меньше и мощнее, а
языки приспосабливались к
первоначальной архитекту-
ре, — замечает А.Кольме-
ро. — Когда мы писали
ПРОЛОГ, то буквально под-
дразнивали машину, застав-
ляя ее делать все, что нам
хотелось".

Программа на языке
ПРОЛОГ содержит две со-
ставные части: факты и пра-
вила. Факты представляют
собой данные, с которыми
оперирует программа, а со-
вокупность фактов составля-
ет оазу данных ПРОЛОГа, ко-
торая является не чем иным,
как реляционной базой. Ос-
новная операция, выполняе-
мая над данными, — это
операция сопоставления,
называемая также опера-
цией унификации или согла-
сования.
Правила состоят из
заголовка и подцелей. Вы-
полнение программы, напи-
санной на ПРОЛОГе начина-
ется с запроса и состоит в
доказательстве истинности
некоторого логического ут-
верждения в рамках задан-
ной совокупности фактов и
правил. Алгоритм этого до-
казательства (алгоритм логи-
ческого вывода) и определя-
ет принципы исполнения
программы, написанной на
ПРОЛОГе.

В отличие от программ,
составленных на языках про-
цедурного типа (БЕЙСИК,
ПАСКАЛЬ и др.), предписы-
вающих последовательность
шагов, которые должен вы-
полнить компьютер дпя ре-
шения задачи, в ПРОЛОГе
программист описывает фак-
ты, правила, отношения меж-
ду ними, а также запросы по
проблеме.

Первый интерпретатор
ПРОЛОГа, написанный на
ФОРТРАНе, разработан

А.Кольмеро и Ф.Русселем в
1973 году. Затем появипся
компилятор ПРОЛОГа, со-
зданный Д.Уорреном и
Ф.Перенра из Эдинбургского
университета для машины

DEC-10.

Большие успехи в разви-
тии и
распространении ПРО-
ЛОГа оыли достигнуты в Вен-
грии, там ученые начали за-
ниматься реализацией языка
с 1974 года. В 1975 году они
создали интерпретатор ПРО-
ЛОГа, написанный на языке
CDL. Основные работы по
совершенствованию языка
начиная с 1978 года велись в
Будапештском институте по
координации вычислитель-
ной техники, где в 1981-1982
годах создана модульная си-
стема ПРОЛОГ — М-ПРО-
ЛОГ на языке CDL-2. Там же
в 1982 году разработан Т-
ПРОЛОГ для моделирования
дискретных систем, а в 1985
году появились мини-ПРО-

нам нужно пропустить либо одну, ли-
бо другую часть команд. Вот эти ко-
манды переходов и помогут нам в
этом. Команда "БП" делает вот что:
после ее выполнения калькулятор
будет выполнять не следующую ко-
манду, а ту, которая записана в ячей-
ке с заданным командой "БП" адре-
сом. В нашем случае после команды
"БП 23", расположенной в ячейках
ноль и один, будет выполняться ко-
манда из ячейки с адресом 23. Гово-
рят, что "БП" выполняет
переход на
адрес
23. А команды условных пере-
ходов работают так: проверяется со-
держимое регистра X, если оно
удовлетворяет тому условию, кото-
рое записано в названии команды, то
далее выполняется следующая ко-
манда, а если нет — то происходит
переход к заданному в команде ад-
ресу. Например, команда "F Х = 0
33" будет сравнивать содержимое X
с нулем и переход к адресу 33 будет
выполняться, если содержимое X не
равно нулю. Ясно?

- Само по себе то, что ты расска-
зал, ясно. Но не ясно, что с этим де-
лать.

- А сейчас и это поймете. Итак,
нам нужно реализовать такой алго-
ритм:

если Т<ТС то —> С иначе а'Т —> Р;

sinP + cosP —> С все; СН*(Т-Т0) —> R.

Предположим, что наши перемен-
ные находятся в таких регистрах:

Т — в РО, Тп — в Р1, а — в Р2,
Р — в РЗ, С — в Р4, Н — в Р5,
R — в Р6. Перед этими вычисления-
ми нам нужно вычислить Т, это мы
записывать не стали, так как это мы
делать умеем. Вычисление Т займет
у нас... сейчас напишем... ага, 10 ко-
манд — с адреса 00 по адрес 09, С

ЛОГ для персональных ком-
пьютеров и Т/ТС-ПРОЛОГ
для моделирования дискрет-
но-непрерывных систем.
Версии, разработанные Буда-
пештским институтом, реали-
зованы на многих компьюте-
рах различных фирм (IBM,
Siemens, Tektronix, Motorola).

В начале 80-х годов фир-
ма Silogic Inc. (Лос-Андже-
лес) создала набор интерп-
ретаторов для разных типов
компьютеров — от машин
на базе микропроцессора Z
80 с ОС СР/М до машин
DEC-20 с ОС TOPS-20, а так-
же несколько компиляторов.

В последние годы наи-
большую популярность полу-
чили версии ПРОЛОГа, реа-
лизованные на персональных
компьютерах — сейчас в
мире их насчитывается око-
ло пятнадцати. Среди них та-
кие, как Эрити/ПРОЛОГ
(Arity/PROLOG), Микро-ПРО-
ЛОГ, ПРОЛОГ-86, ПРОЛОГ-В
(PROLOG-V), Пролог-2, АЛС
ПРОЛОГ (ALS PROLOG),
Квинтус ПРОЛОГ (Quintus
Prolog), Турбо-ПРОЛОГ и др.
Только три из перечислен-
ных — ПРОЛОГ-2, Эри-
ти/ПРОЛОГ и Турбо-ПРОЛОГ
имеют возможность компи-
ляции. ПРОЛОГ-2 фирмы
Expert Systems International
(ESI) превосходит в скорости
интерпретируемый ПРОЛОГ-
1 в 20 раз. Эрити/ПРОЛОГ
фирмы Arity (отделение
фирмы Lotus Advanced
Development Group) пред-
ставляет собой программную
среду, включающую все не-
обходимые средства разра-
ботки программ на ПРиЛиГе
(последняя версия 5.0). Фир-
ма Borland International в
1985 году выпустила пер-
вую версию компилятора
Турбо-ПРОЛОГ, которая

обеспечивает многооконный
интерфейс и графические
возможности. (К настоящему
моменту используется вер-
сия 2.0.)

На сегодняшний день не
существует стандарта на
язык программирования
ПРОЛОГ. В то же время счи-
тается, что версия двух про-
фессоров Эдинбургского
университета У.Клоксина и
К.Меллиша может быть при-
нята за стандартную [2].

Первая аппаратная реа-
лизация языка относится к

1984 году, когда Д.Уорреном
был разработан конвейерный
процессор языка ПРО-
ЛОГ —
SkI. Затем в рамках
реализации японского проек-
та машин пятого поколения в

1985 г. появился действую-
щий макет машины PSI
(Personal Sequential Inference
Machine — персональная
ЭВМ последовательного вы-
вода), а в 1986 году опытный
образец машины CHI
(Cooperative High — Speed
Inference Machine — парал-
лельная быстродействующая
машина вывода). Машина PSI
с производительностью 30
тыс. логических выводов в
секунду создавалась в каче-
стве средства разработки
программного обеспечения
всего японского проекта.

Усовершенствованный вари-
ант „PSI-Н имеет производи-
тельность 150 тыс.логических
выводов в секунду. Основ-
ной целью разработки CHI и
ее модификации CHI-II было
дальнейшее повышение про-
изводительности, которая
была доведена до 400 тыс.
логических выводов в секун-

ДУ-

В СССР работы по логи-
ческому программированию
ведутся с 60-х годов. В част-
ности, в ЛОМИ им. Стеклова
велись работы по автомати-
ческому доказательству тео-
рем. С.Ю.Масловым в рам-
ках этих работ был предло-
жен обратный метод выво-
да — на год раньше метода
резолюций. В.Б.Борщевым и
М.В.Хомяковым независимо
от зарубежных работ начиная
с 19/2 года разрабатывалась
версия логического програм-
мирования. К идеям логиче-
ского программирования
примыкают в этот период ра-
боты А.П.Ершова и А.С.Кле-
щева, а также работы
А.М.Степанова по описанию
абстрактной параллельной
машины для языков логиче-
ского программирования.

Впервые в нашей стра-
не язык ПРОЛОГ (базовый
входной язык системы ПРО-
ЛОГ-ЕС) был реализован в
конце 70-х годов сотрудни-
ками Института кибернетики
им.В.М.Глушкова АН УССР и
Рижского политехнического
института для ЕС ЭВМ с опе-
рационными системами ДОС
и ОС. Для написания основ-

адреса 10 программируем "если" Т
с 10 калькулятор сравнить не может,
поэтому запишем условие так: "если
Т-То<0 то...". Итак, вычисляем Т-Т0
и ставим команду условного перехо-
да "F Х<0":

Если X отрицательное число, т.е.
Т < TGf то далее будет выполняться
команда по адресу 15, и с этого мес-
та нужно разместить вычисление то-
го, что записано после "то11, а
в про-
тивном случае будет выполнен пере-
ход к заданному адресу: там надо
разместить вычисление того, что за-
писано после "иначе".

- А с какого адреса это нужно
разместить?

- Пока не знаю, поэтому адрес по-
ка оставим незаполненным и про-
граммируем "ветвь
то":

Теперь можно приступить к про-
граммированию "ветви
иначе". Пока
все ясно?

- Я, кажется, все понял, — сказал
Вадик, — и могу продолжить сам.
Теперь ясно, что ветвь
иначе можно

ных модулей системы ПРО-
ЛОГ-ЕС ислольэован язык
ФОРТРАН-IV, а в вод-вы вод
написан на АССЕМБЛЕРе.

В дальнейшем появились
версии: ПРОЛОГ-CM для ми-
ни-ЭВМ СМ-4, функциониру-
ющая под управлением опе-
рационной системы ОС РВ;
система программирования
Г1РОЛОГ-32, реализованная
на ЭВМ СМ-17О0 и работаю-
щая под управлением опера-
ционной системы ДЕМОС-32;
система программирования
Микро-ПРОЛОГ для персо-
нальных компьютеров ЕС-

1840, ЕС-184t, IBM PC/XT/AT,
функционирующая под уп-
равлением операционных си-
стем АЛЬФА ДОС И MS
DOS. В Институте программ-
ных систем АН СССР разра-
ботана версия ПРОЛОГа для
персонального компьютера
"Ямаха MSX". Интерпретато-
ры языка ПРОЛОГ созданы
для школьных компьютеров
отечественного производст-
ва — "Корвет", УКНЦ, БК-
0010.

Возможности применения
языка ПРОЛОГ весьма об-
ширны. Вот что пишет по
этому поводу Р.Ковальский:
"Сила и эффективность язы-
ка Пролог и его реализаций
оказались такими, что он на-
шел многочисленные и раз-
нообразные применения.
Среди наиболее извест-
ных — применение в симво-
лической математике, плани-
ровании, автоматизирован-
ном проектировании, постро-
ении компиляторов, базах
данных, обработке текстов
на естественных языках, ма-
шинной индукции, отладке и
экспертных системах".

Наверное, самое харак-
терное применение ПРОЛО-
Га — это экспертные систе-
мы (ЭС). Пролог вносит сво-
еобразный вклад в создание
ЭС, особенно для механизма
логического вывода. Модели
представления знаний в ЭС
включают систему продук-
ций, фреймы, семантические
сети, логику предикатов.
Разработанные языки пред-
ставления знаний часто зави-
сят от тех моделей пред-
ставления, которые они ис-
пользуют. Язык ПРОЛОГ
можно использовать для
применения любой модели,
его можно рассматривать и
как воплощение модели
представления знаний, и как
язык представления знаний.
Определение, данное Р.Ко-
вальским:

Алгоритм = Логина +
+ Управление
подтверждает это утвержде-
ние и помогает прояснить
термин "управление" в экс-
пертных системах. В этом
определении ЛОГИКА пока-
зывает, что является пробле-
мой (областью), а УПРАВЛЕ-
НИЕ — как эффективно ис-
пользовать логику для реше-
ния проблем.

Как утверждают созда-
тель языка и его коллеги,
"ПРОЛОГу суждено сыграть
одну из первых ролей в раз-
витии информатики", и в час-
тности, "при правильном
преподавании информатики
необходимо использовать та-
кой язык, который помогал
бы структурировать мышле-
ние. Сначала пользователей
взращивали на АЛГОЛе-бО,
затем на ПАСКАЛе. Лучше
их воспитывать на ЛИСПе, но
еще лучше — на ПРОЛО-
Ге".

Литература

1. Прикладная информа-
тика: Сб. статей. — Вып.1,

2. — М.: Финансы и стати-
стика, 1986.

2. Клоксин У., Меллиш К.
Программирование на языке
Пролог. — М.: Мир, 1987.

3. Логическое програм-
мирование/Пер. с англ. и
фр. — М.: Мир, 1988.

4. Дедков А.Ф. Логиче-
ское программирова-
ние. — М.: Знание, 1988.

5. Мир ПК, 1988, Ыя 2;
1990, Ыя 2, 3.

6. Доорс Д, Рейблейк
А.Р., Вадера С. Про-
лог — язык программирова-
ния будушего/Пер. с
англ. — М.: Финансы и ста-
тистика, 1990.

7. Стерлинг Л., Шапиро

3. Искусство программиро-
вания на языке Пролог/Пер.
с англ. — М.: Мир, 1990.

М.Малыхинл,
А.Частиков

начинать с адреса 21. Поэтому в про-
пущенный адрес можно записать
число 21 и продолжить с адреса 21:

21 П-х 2 а*Т Опять вызываем значение а,

22 ... ... и т.д.

Если окажется, что Т>ТС, то каль-
кулятор пропустит команды 15-20 и
сразу начнет с адреса 21. Так?

- Так. Но все же ты немного
ошибся. Если окажется, что Т<ТС, то
будут выполнены команды с адреса-
ми 15-20, а потом что?

- Потом калькулятор остановится.

- Интересно, почему это он вдруг
остановится? Чем команда по адресу
20 отличается от команды по адресу
19? Остановиться он может только по
команде "С/П". А без нее он начнет
выполнять команды по адресам 21,
22 и т.д.

- Точно. Надо добавить команду
"С/П", а потом программировать
ветвь
иначе.

- Идея заманчива, но... А вычис-
лять значение R ты будешь потом
вручную?

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

- Верно. А для этого надо поста-
вить не "С/П, а "БП" и опять же ад-
рес выяснится только тогда, когда
кончим программировать ветвь
ина-
че:

- Понял. Но есть вопрос: а если
бы в условии стояло не "Т<Т0", а
"Т<Т0 , что делать? Ведь команды

"F Х<0" нет.

- Тогда запишем "если То-Т>0 то
..." и все.

- Еще вопрос: а как калькулятор
отличает адрес "23" от кода "2д", ко-
торый имеет команда "F 1/х"?

- А как ты определяешь, что за-
пись "09/10-87" — это 9 октября, а
не 10 сентября?

- Я просто знаю, что сначала идет
день, а потом месяц.

- И он "знает", что после команд
переходов идет не код, а адрес.

- Ну ладно, я пошел считать.

Задача. Написать программу для

калькулятора, определяющую мини-
мум и максимум для двух чисел.

Урок пятый

Сегодня Вадик получает от Анд-
рея очередной "заказ":

- Вадик, не хочешь мне посчитать
несколько интегралов?

- ??? А думаешь, я знаю, что это
такое?

- Да ты не бойся, это только на-
звание страшное, а на самом деле
все просто. Дана функция f(x) и зна-
чения а и в, а также число N. Разби-
ваем отрезок [а, в] на N одинаковых
частей, каждая длиной Н = (в-а)/Ы.
Получаем N точек: х* =
а, Х2 = а + Н,
х3 = а + 2Н, х4 + а + З Н и т.д. А те-
перь считаем сумму f(x1)-H +
+ г(х2) Н + ... + f(xN)-H. Эта сумма да-
ет приближенное значение площади
фигуры, ограниченной графиком
функции, осью X, и прямыми у = а и
у - в. Площадь фигуры называется
определенным интегралом от функ-
ции f(x) на отрезке [а, в].
А так вы-
числяется его приближенное значе-
ние. Вот и все.

- И всего-то? А я-то думал: интег-
ра-а-ал!

- А в учебнике это называется
"площадь криволинейной трапе-
ции", — сказала Аня. — Только не
написано, зачем такие площади вы-
числять.

- Для многих целей. Например,
если f(x) — это зависимость скорости
от времени, то интеграл — это прой-
денный путь за время с момента а
до момента в. Если f(x) — расход
воды или топлива в момент х# то ин-
теграл — это общая затрата воды
или топлива с момента а до момента
в. Есть еще множество задач такого
типа.

- Понял. Пиши алгоритм.

- Алгоритм простой:

0 —> сумма; а —> х; (в-aJ/N —> Н;
сумма +f(x)eH —> сумма; х + Н —> х;
сумма +f(x)'H —> сумма; х + Н —> х;
и т.д.

Ясно?

- Отнюдь. Во первых, зачем каж-
дый раз умножать на Н: можно сна-
чала накопить сумму f(xj), а затем
умножить ее на Н. Так?

- Ты прав, можно.

• А во-вторых, как я должен про-
граммировать твое "и т.д."? Сколько
таких строк будет?

- N штук.

- А чему равно N?

- По-разному, где 20, а где 100.

- Так сколько же таких строк я
должен написать: 20 или 100? И кста-
ти, все равно программа в память
калькулятора не поместится ни при
20, ни тем более при 100 строках.
Аня, что в таких случаях делают?
- Сейчас я папу позову — мне инте-
ресно, что он придумает, хотя я знаю
решение: мы это в школе изучали.

- Подожги, — решительно сказал
Вадик. —
Сами справимся. Итак, де-
монстрируется фокус, — он подтя-
нул рукава жестом фокусни-
ка. — Сейчас я изобрету новую кон-
струкцию алгоритмической записи.
Что нам4 нужно? Одни и те же дейст-
вия надо повторить несколько раз.
Как это записать? Отвечаю: записать
надо
по-русски, пишем "повторять N
раз", затем пишем, что повторять, а
далее все остальное. Для красоты,
как учила Аня, и удобства чтения та-
кие специальные слова подчеркива-
ем. Получаем:

повторять N раз

сумма + f(x) —> сумма; х + Н —> х

сумма "Н —> сумма;

Фокус окончен. Аня, есть такая
штука в РАПИРЕ?

- Конечно, есть.

- Тогда все в порядке. Не слышу
аплодисментов.

- Фокус не кончен, поэтому апло-
дисментов нет. А откуда видно, что
надо повторять два присваивания, а
не три и не одно?

- Ты права. Но это мы уже прохо-
дили: добавим где надо слово
"все".

- "Все" нельзя, — сказал Анд-
рей. — Оно уже использовалось для
завершения
если...то...иначе.

- -Ну тогда... — Вадик задумал-
ся, — напишем "коточнапо".

- Чего-чего напишем?

- "коточнапо": КОнец ТОго, Что
НАдо ПОвторять. Чем плохо?

- Ну ты придумаешь! Ничего себе
словечко! А почему нельзя
"все"? — спросила Аня.

Ну как же! — сказал Анд-
рей. — А если у нас есть и
"если" и
повторять", тогда как определить,

какое "все"к чему относится? Вот так
например:

повторять ... раз
если ... то ... иначе ...
все все

- Очевидно: первое "все" закры-
вает
"если", а второе — относится к
"повторять". Только для удобства
чтения это пишут немножко не так, а
так, чтобы ясно было, что к чему от-
носится:

повторять...раз
если... то... иначе... все
все

и сразу ясно, что к чему относится.

- А если я хочу, чтобы первое
"все" закрывало "повторять", то на-
до так написать, что ли?
Пишет:

повторять...раз
если...то...
иначе...

все...
все

- Хотеть-то ты можешь, только что
бы это значило? В какой последова-
тельности должны выполняться отме-
ченные точками команды?

- Хм... действительно. В общем,
ясно: так пересекаться они не могут,
а могут быть только одна внутри
другой либо одна вслед за другой.
Аня, а что говорит по поводу
все"
наука?

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

- Ладно, пишем "кц". Получаем:

О —> сумма; а —> х; (e-a)/N —> Н;
повторять N раз

сумма + f(x) —> сумма; х + Н —> х
кц

сумма'Н —> сумма

Результат в переменной — сум-
ма.
Остается разобраться как это ре-
ализовать на калькуляторе. Тут есть
еще не использованные нами клави-
ши — наверняка они пригодятся.
Сейчас посмотрим в инструкции.

В инструкции обнаружили 4 ко-
манды: "F L0","F Lt", ? L2" и "F L3",

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

манде номером (т.е. РО, Р1, Р2 или
РЗ), и если в результате получился
ноль, то далее выполняется следую-
щая команда, а если нет, то происхо-
дит переход к заданному адресу. С
помощью этих команд все получает-
ся просто. Пусть
сумма — в Р1,
а — в Р2, в — в РЗ, х — в Р4,
Н — в Р5, в N — в Р6, РО оставили
для
счетчика числа повторений.

Задача. Дополните эту программу
нужными командами вместо много-
точий и вычислите площадь одной
дуги синусоиды, взяв N = 20. Должно
получиться приблизительно 2.

Задача. Напишите алгоритм и про-
грамму для калькулятора для вычис-
ления Г2-3#... (М-1)'М, где М — за-
данное число.

Урок шестой

- Папа, Аня, Андрей! Вот билеты
на выставку, а с ними задачка на со-
ставление алгоритма. Слушайте. За-
нял я очередь, а она длинная-длин-
ная, и пошел за Сашей, чтоб не скуч-
но было. Прихожу минут через
20 — никак не могу найти, где я сто-
ял. Что делать? Я тогда подхожу к
первому в очереди и спрашиваю,
давно ли он стоит. Он говорит: "Ми-
нут 50". Ага, думаю, значит, моя оче-
редь никак пройти не могла. Тогда я
подхожу к середине очереди и спра-
шиваю у кого-то то же самое — он
говорит: "Минут 15". Ясно, что он за-
нимал позже меня. Тогда я беру се-
редину от первой половины — там
говорят: "С полчаса". Тогда я беру
середину от второй половины первой
половины и т.д. В общем, когда рай-
он поиска сузился человек до 10, я
увидел того, за кем занимал.

Молодец, Вадик! — сказала
Аня. — То, что ты сочинил, называ-
ется "решение уравнения методом
деления пополам".

- Какого уравнения? — удивился
Вадик. — Какое может быть в оче-
реди уравнение?

- В очереди уравнения нет, —
сказал Андрей, — но
математиче-
ская модель
твоих действий — это и
есть решение уравнения. Время, ко-
торое человек стоит в очереди, есть
функция от номера этого человека. В
твоем случае f(1) = 50, т.е. первый
человек стоит 50 минут, a f(М) = 0, т.е.
последний, М-й человек стоит ноль
минут. Тебе надо найти того, кто стоит
около 20 минут, т.е. найти х такой, что
f(x)»20, т.е. решить уравнение f(x)-
20 = 0, разумеется, решить прибли-
женно. И ты с этим прекрасно спра-
вился.

- Здорово! Никогда бы не поду-
мал, что математику можно приме-
нить к стоянию в очереди. А интерес-
но, как записать этот алгоритм?

- Математику можно применять в
очень многих случаях. И то, что в са-
мых непохожих случаях получаются
одинаковые мЪдели. Прежде чем
писать алгоритм, надо разобраться с
моделью.
У нас имеется функция
ф(х) такая, что Ф(а)>0, Ф(в)<0, и на
отрезке [а, в] функция уоывает» Яс-
но?

- Не совсем, — сказал Вадик. —
Вроде, была f(x), и она всегда поло-
жительна.

- Нет, Ф(х) это не то же, что f(x). В
нашем случае, Ф(х) — это время, на
которое человек N9 х стоит в очереди
дольше тебя, т.е. Ф(х) = f(x)-20.

- Вот теперь ясно.

- В общем, опуская строгую мате-
матику (на интуитивном уровне и так
все ясно), можем решать это уравне-
ние. Обычно точный ответ и не ну-
жен, задают некоторое £ , и как толь-
ко найдем корень с точностью £ ,
считаем, что этого достаточно. У тебя
6ыло£= 10, т.е. тебе надо было найти
нужное место плюс-минус 10 чело-
век. Если обозначить левый конец от-
резка через лев, а правый через
прав, то один шаг алгоритма можно
записать так:

(прав + лев)/2 —> х;

•спи Ф(х)>0 то х —> пев иначе

х —>> прав see

#

т.е. на каждом шаге либо левая либо
правая граница отрезка сдвигается к
середине и отрезок
[лев, прав] со-
кращается вдвое. Теперь достаточно
организовать цикл и все.

- Андрей, а как ты организуешь
цикл? В прошлой задаче было ясно,
сколько раз он должен выполняться,
а здесь как быть? Повторять эти шаги
надо до сужения отрезка в достаточ-
ной степени, а сколько раз — это
неизвестно. Я что-то не соображу,
что нужно делать.

- Ну, если ты не сообразишь,
спросим Аню. Или лучше папа сейчас
изобретет что-нибудь новенькое. А,
папа?

- А что тут изобретать? У вас был
цикл с заранее известным числом по-
вторений:
повторять М раз. А теперь
нужен другой цикл, где число повто-
рения заранее не известно. Пишем
его, как всегда, самым простым и
обычным способом:

повторять то, что надо повторять
до, условие завершения.

В вашем случае алгоритм прини-
мает вид:

1 —> лев; M —> прав;
повторять

(прав + лев)/2 —> х;

если Ф(х)>0 то х -> лев иначе х прав все
до
прав — лев <6 ;

Когда прав-лев станет меньше t ,
то повторение шагов закончится, а в х
будет значение корня. Ясно?

Аня скептически посмотрела на
эту запись:

- Папа, на сей раз ты изобрел что-
то не то: нет такого ни в учебнике, ни
в РАПИРе. с которой мы работаем на
машинах Агат".

Теперь уже удивился папа:
- Не может оыть! Такая естественная
запись! Где-нибудь что-то подобное
обязательно есть. Впрочем, сейчас
спросим у специалистов. — И он
взялся за телефонную трубку.

- Все логично, как я и ожи-
дал, — продолжал папа, закончив
разговор. — Есть, конечно же, такой
цикл — в языке ПАСКАЛЬ, напри-
мер. А у вас в учебнике, наверное,
другой вариант, тоже не менее ло-
гичный

пока условие повторять
то, что надо повторять кц

Так, что ли?

- Да, — сказала Аня. — Только
вместо
"повторять" мы пишем нц,
т.е. "начало цикла", но это уже ме-
лочи. А этот алгоритм в учебнике за-
писан так:

1 —>лев; M —> прав;
пока прав-лев повторять

(прав + лев)/2 —> х;
если ф(х)>0 то лев-» х иначе прав-» х все
кц

- Можно и так, это одно и то
же, — сказал Вадик.

- Не совсем, — сказал папа. Во
втором варианте если с самого нача-
ла
прав-лев было меньше L , то шаг
вычислений не будет выполняться ни
разу. Впрочем, пока что этой разни-
цей можно пренебречь.

- А как это сделать на калькулято-
ре, — спросил Вадик. — Наверное,
есть специальные команды?

Зачем? — ответил Анд-
рей. — Команд условного перехода
вполне достаточно. Запрограммиру-
ем, например, первый вариант. Пусть
М будет в РО, гюав — в Р1, лев — в
Р2, х — в РЗ,
с в Р4. Программа бу-
дет иметь вид:

- Понятно, — сказал Вадик. — А
как вариант с
пока сделать, я и сам
соображу: все аналогично. Оказыва-
ется, иногда полезно и в очереди по-
стоять.

Задание. Попробуйте полностью
выписать программу для калькулято-
ра для какой-либо конкретной функ-
ции и провести по ней вычисления.

Урок седьмой

Сегодня Вадим опять программи-
рует очередной алгоритм для Анд-
рея с Витей. ПМК уже освоен до-
вольно неплохо, и Вадим справляется
с большинством проблем сам. Но
иногда возникают вопросы.

- Андрей, и где ты только такую
константу могучую раздо-
был — 6.02252x10^*?

- Хорошая константа, называется
числом Авогадро. Это количество
атомов в одном литре газа. А чем
она тебе не нравится?

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

- Ну набери один раз и запиши в
регистр, а потом вызывай из него.

- Регистры все заняты. А покоро-
че ее набрать нельзя — не все де-
сятичные цифры?

- Очень нежелательно: точность
расчета потеряется.

- Что же делать? Хорошо с кон-
стантой — есть для нее специаль-
ная клавиша. Жаль, на все константы
клавиш не напасешься. Вот бы где-то
в одном месте написать команды на-
бора этой константы, а потом сказать
ПМК: "А ну-ка, выполни их".

- Ну и скажи, в чем пробле-
ма? — спросил Виктор. — Как he-
рейти с одного места программы в
другое ты знаешь.

- Как перейти, знаю: командой
"БП", а вот как назад вернуться не
знаю. Переходить-то надо будет из
трех разных мест, откуда ПМг( будет
знать, куда надо вернуться?

- Если переходить командой "БП",
то, конечно, назад не вернешься, но
есть еще одна команда перехода
"ПП", которая отличается от "БП"
только тем, что, кроме перехода, она
запоминает в специальном регистре
(который увидеть никак нельзя) еще
и адрес следующей команды, т.е.
как раз то место, куда надо вернуть-
ся. А чтобы вернуться, есть еще одна
команда "В/О", которая выполняет
переход по адресу, записанному в
этом регистре. А теперь пусть с ад-
реса, скажем 80, мы поместили ко-
манды набора нашей константы:

6.02252 ВП 23 В/О

в конце записали команду "В/О", а
теперь где-то в программе написали
команду "ПП 80", скажем, по адре-
сам 10 — 11. Что получится? После
выполнения этой команды будет вы-
полнен переход на адрес 80, а в спе-
циальном регистре будет запомнен
адрес следующей команды, т.е. 12.
Дальше начнут выполняться коман-
ды, записанные по адресам 80, 81 и
т.д., которые занесут в регистр X так
не понравившуюся тебе константу, а
затем будет выполнена команда
"В/О", которая выполнит переход по
запомненному адресу, т.е. к ячейке
12, и можно работать дальше с зане-
сенной в X константой.

- Здорово! Получается, что мы
как-бы научили ПМК новой команде,
которой у него раньше не было:
ведь теперь команда "ПП 20" мало
чем отличается от команды "F пи".

- Действительно так. Эта штука на-
зывается подпрограммой. Команда
"ПП" расшифровывается как Пере-
ход к Подпрограмме, а "В/О" —
Возврат/Обнуление (дробь в назва-
нии показывает, что эта команда по-
разному работает в программе и в
автономном режиме). Как теперь пи-
сать программу, понятно?

- Да, программа получается такой:

- Все прекрасно, — сказал Ва-
дик, — теперь программа хоть с
трудом, но в память поместится.

- Я только вот что не пойму: отку-
да у тебя 3 раза встретилось занесе-
ние этой константы — там ведь одна
и та же функция. Ты запрограммируй
ее один раз и все.

- Я бы с удовольствием, но один
раз эту функцию надо вычислять от
аргумента а, второй раз — от Ь, тре-
тий — от х, а они все в разных реги-
страх хранятся, и результаты надо
опять же в разные регистры класть.
Вот, кстати, интересно: надо сделать
одинаковые действия, но с разными
регистрами. Жаль, что нельзя заста-
вить ПМК это сделать, но чтоб эти
действия писать один раз, а не не-
сколько.

- Ну почему же нельзя? А как ты
заставляешь команду сложения ра-
ботать с разными числами, хранящи-
мися в разных регистрах.

- Никак. Просто пересылаю нуж-
ные числа в стек, а команда сложе-
ния сама знает, что данные всегда
надо брать из стека и результат ос-
тавлять там же. Стоп! Кажется, по-
нял. Надо данные заслать в какое-то
заранее оговоренное место, откуда
подпрограмма их будет брать и в ка-
ком-то заранее оговоренном месте
она должна оставлять результат.

- Точно. И какое-же место ты вы-
берешь? Только его желательно вы-
брать так, чтобы можно было дого-
вориться раз и навсегда, и чтобы вы-
бор был логичен. Вспомни, что мы
как бы научили ПМК новой команде.

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

- Абсолютно верно. Итак, у нас
там функция

f(x) = 6.02252x1023-х2 + 1,

а вычислять ее надо один раз от а,
второй раз от Ь, а третий от х, кото-
рый вычисляется. Как это програм-
мировать?

- Единственное данное — это ар-
гумент функции, его, судя по тому,
что ты сказал, надо заслать в стек и
перейти к подпрограмме, она долж-
на все вычислить и оставить результат
в стеке же. А после возврата с этим
значением в регистре X мы можем
делать, что хотим. Пусть подпрог-
рамма размещается с того же адре-
са 80. Головная часть тогда должна
иметь вид:

- Да, так конечно программа стала
куда как короче и со всех сторон
удобнее. А интересно, этот трюк, ко-
торый мы проделали с ПМК, можно
как-то записать на алгоритмическом
языке? Аня, у вас в учебнике есть
что-нибудь подобное?

- Тебе уже папа объяснял, что ес-
ли что-то очень логично, то оно обя-
зательно есть там, где надо. Естест-
венно, что ситуация, когда надо один
раз объяснить человеку или ПМК
действия, а потом много раз их вы-
полнять, может быть, с еще какими-
то вариациями, не у нас первых воз-
никла. Идея-то крайне проста: снача-
ла объясняешь алгоритм действия{ а
потом говоришь: "Давай, выполняй!"

- Ну и как это сказать?

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

алг название(арг аргументы, рез
результаты )

нач

тело алгоритма

кон

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

алг функ(арг вещ х, рез вещ у)

нач

у: = 6.02252x1023-х2 + 1

кон

- Это означает, что алгоритм назы-
вается "функ", в качестве исходных
данных он получает одно значение:
вещественную переменную, которую
называет х, и выдает он тоже один
результат, который называет у. А
кроме этого алгоритма, можно напи-
сать другой алгоритм, в который
включается имя первого алгоритма, и
задается то, с чем он должен рабо-
тать и куда положить результат. Для
этого надо просто написать имя на-
шего алгоритма и в скобках написать
конкретные числа или переменные.
Например,

функ (7.3,t)
означает "выполнить алгоритм функ,
взяв в качестве-х значение 7.3, а ре-
зультат положить в переменную t".
Такой алгоритм, к которому обраща-
ются из другого алгоритма, называет-
ся вспомогательным, а тот. который
обращается, — главным. Кстати, ес-
ли алгоритм еще имеет какие-то пе-
ременные, кроме аргументов и ре-
зультатов, то эти переменные надо
описать после слова "нач". Понял?

- Итак, у нас имеется два алгорит-
ма: основной — наш старый знако-
мый — вычисление площади криво-
линейной трапеции, или, по-научному,
интеграла, который теперь написан не
для конкретной функции, а для неко-
торой, которая называется F, и сам
алгоритм вычисления этой некоторой

функции, который показывает, как ее
надо вычислять:
алг площадь;

нач вещ a.b,x,cyM,yfh цел N
ввод a,b,N;

сум: = 0; h: = (b-a)/N; х: = а
для i от 1 до N-1 нц

х: = х + h; F(x,y); сум: = сум + у;
кц;

F(a,y); сум: = сум + у/2; F(b,y);
сум: = сум + у/2;
вывод сум"Ь
кон

алг F(apr вещ х, рез вещ у )
нач

у: = 6.02252х1023 х2 +1

кон

- Андрей, а почему у тебя алго-
ритм вычисления интеграла отличает-
ся от того, который ты мне давал
раньше?

- Это просто немного другой ме-
тод, он точнее результат дает, хотя
формулы чуть-чуть сложнее: тот на-
зывается "метод прямоугольников",
а этот "метод трапеций", но это сей-
час не важно. Ну что, все проблемы
решили?

- Да я бы не сказал, что все. Мне
этот вспомогательный алгоритм как-
то не нравится: какая-то запись не-
естественная. Папа говорил, что все,
что естественно пишется, должно и
писаться нормально, а тут все-таки
некоторая ненормальность есть. Мы
ведь формулы для накопления сум-
мы вычисления итогового значения
как писали? Математически:

сум = сум + f(x)
S = h((f(a) + f(b))/2 + s)

Хотелось бы и в алгоритме так же
написать, а тут какой-то (у) во вспо-
могательном алгоритме, которого в
формулах совсем нет. И алгоритм
получился совсем не похожий на ма-
тематическую запись.

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

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

алг площадь;

нач вещ а,Ь,х,сум,у,Ь цел N
ввод a,b,N;

сум: = 0; h: = (b-a)/N; х: = а
для i от 1 до N-1 нц

х: = х + h; сум: = сум + F(x);
кц;

сум: = ((F(a) + F(b))/2 + сум)"Н
вывод сум
кон

- Отлично! Теперь сообрази, как
записать вспомогательный алгоритм.

- Записать надо как-то так же, как
и было, но вот только чему присвоить
результат? Так что ли записать?

алг F(apr вещ х )
нач

у: = 6.02252х1023 х2 + 1

кон

- Так нельзя: у тебя (у) не описан,
а значит, когда начнешь писать про-
грамму для ПМК, то не будешь
знать, какой регистр для него взять.

- Ладно, давай опишем у.
алг F(apr вещ х )

нач вещ у

у: = 6.02252x1023-х2 + 1

кон

- Так, конечно, можно, но при
этом ты на ПМК отведешь для (у)
регистр, подпрограмма зашлет туда
значение функции и на сем удовлет-
ворится. А интересно, как его оттуда
достанет главная программа?

- Да, здорово получается: ты го-
воришь вспомогательному алгоритму
"давай выполняйся", он отвечает "я
завершился", а результат оставляет
при себе.

- Ладно вам хихикать, как же
здесь записать?

Ты в формуле что пи-
шешь? — спросил Андрей. — Сум
плюс что?

- Плюс F от икс.

- Вот именно что F. Так чему надо
присвоить результат?

- Имени алгоритма F, что ли?

- А почему бы и нет? Так и запи-
сать:

алг F(apr вещ х )

нач F: = 6.02252x1023 х2+1

кон

В итоге имя F получает значение и
его, т.е. имя, можно использовать в
сложении, умножении и других дей-
ствиях так, как это сделано в основ-
ном алгоритме. Папа, как идея?

- Хм, вообще-то тоже ничего, хотя
я, честно сказать, думал по-другому.
Вадик, ты как спрашивал: чему бы
присвоить значение результата? Так?
Ну, так и напиши:

результат: = 6.02252x1023 х2 + 1
Получается, что нам нужно новое
служебное слово "результат", вот и
все. Аня, а ну-ка, проведи эксперти-
зу-

- Папа, у тебя просто какое-то
чутье! В учебнике написано ну просто
то же самое, только вместо слова
"результат" используют слово "знач"
да и перед словом 'алг" в этом слу-
чае зачем-то пишут слово "вещ", а
слово "арг" почему-то разрешается
опускать.

вещ алг Р(вещ х )

нач знач: = 6.02252x1023 x^+1

кон

И называется все это "алгоритм
вычисления значения функции", хотя
разницу и смысл я не совсем пони-
маю.

- А я, пожалуй, объясню. Тзкой
способ организации вспомогательного
алгоритма пройдет только тогда, ког-
да алгоритм имеет только один ре-
зультат, и тогда не надо писать, что
для него аргументы, а что — ре-
зультаты: все — аргументы. А кро-
ме того теперь имя алгоритма F иг-
рает две роли: во-первых, оно имя
алгоритма, а во-вторых, оно как бы
переменная, так как получает значе-
ние функции. Именно это значение
мы и используем, когда пишем

сум: = сум + F(x).

Вот поэтому мы и описываем F и
как заголовок алгоритма и как про-
стую переменную. А вариант, кото-
рый Вадик предложил, тоже ниче-
го — наверняка он где-нибудь
встречается. (И действительно встре-
чается: в языках ФОРТРАН и ПАС-
КАЛЬ, например.) Ну что, теперь все
ясно?

- Теперь все, можно писать про-
грамму.

Задание. Напишите вспомогатель-
ный алгоритм, который вычисляет
длину отрезка на плоскости по коор-
динатам (х1,у1) и (х2,у2). Напишите
головной алгоритм, который вводит
координаты вершин треугольника и с
помощью трех обращений к вспомо-
гательному алгоритму получает пе-
риметр треугольника. Напишите соот-
ветствующую программу для ПМК и
проверьте ее работу.

Урок восьмой

- Вадик! Ну, как успехи в освоении
программирования? — спросил, за-
ходя в комнату наш главный консуль-
тант — папин сотрудник, програм-
мист.

- Ничего, уже изобрели ветвления,
циклы, а вчера еще и подпрограммы
изобрели.

- Молодцы! Вы уже изобрели все
программирование.

- Как все?

- А так: в музыке есть семь нот, и
все состоит из них, а в программиро-
вании ноты всего четыре: простое
действие (вычисление, ввод, вывод),
ветвление, цикл и подпрограм-
ма — все. Больше в нем ничего нет.
В музыке все ноты комбинируются
всего двумя способами: последова-
тельное звучание и одновремен-
ное — аккорд, и в программирова-
нии всего два: следование и вложе-
ние.

- Так что, мне больше изучать в
программировании нечего, что ли?

- А в музыке как? Ноты освоил
и больше изучать нечего? Нет, ос-
тается еще малость — научиться
играть. Так что и здесь малость
осталась — научиться программи-
ровать; тут совершенствоваться
можно до бесконечности. Но с
первой ЭВМ — калькулято-
ром — ты уже вполне прилично по-
знакомился.

- Владимир Михайлович, я только
что-то никак не пойму: калькуля-
тор — это ЭВМ или нет? Я тут Анин
учебник читал — так там устройство
ЭВМ ДВК-2 описано, ну, абсолютно
не похоже на ПМК. Какая-то двоич-
ная система счисления, биты, байты,
кодировка — ничего не ясно и абсо-
лютно все не похоже на ПМК. А вы с
Витей меня уверяли, что ПМК — это
ЭВМ, но только маленькая.

- Говоришь, не похоже... Ну-ка,
смотри: что это?

- Это? Самолет, разумеется. —
Да. А это? — Тоже самолет, только
другой: истребитель.

- Ну если одно — самолет, то
второе — не самолет: они же не по-
хожи.

- Ну да, не похожи, скажешь то-
же!

- Смотри сам. Нос похож? Нет.
Крылья похожи? Нет! Двигатели по-
хожи? Тоже нет. А что похоже?

- Хм... Действительно. Вроде все
по отдельности не похоже, а вместе
похоже, и сразу видно, что и то и
другое — самолет.

- Ну вот так же и с ЭВМ — все по
отдельности не похоже, а вместе и то
и то — ЭВМ. Ну-ка, давай прочтем,
что там написано в учебнике. Так, во-
первых ЭВМ состоит из процессора,
выполняющего программу, памяти,
хранящей программу и данные, и ус-
тройств ввода и вывода. Процессор
на ПМК есть?

- Есть, по-видимому, хотя его сна-
ружи и не видно: что же в нем вы-
полняет программу.

- Хорошо. Память есть?

- Есть и даже несколько видов:

регистры стека, адресуемые регист-
ры и программная память.

- Это уже детали. Главное, что
есть. Устройства ввода и вывода
есть?

- Ну разве что клавиатура и инди-
катор. Тоже мне устройства! Индика-
тор же только цифры и выводит.

- Это уже второй вопрос. А чем
тебе индикатор плох — нигде же не
написано, что именно это устройство
должно выводить. Итак, как видишь,
по определению ЭВМ калькулятор
вполне проходит как ЭВМ. Ну а те-
перь давай смотреть детали. Что там
первое не похоже?

- Во-первых, данные представля-
ются в какой-то двоичной системе и
состоят сплошь из нулей и единиц. Я
не совсем понял, что это такое и по-
чему именно двоичная система. А на
ПМК все пишется как обычно.

Ну почему двоичная система,
объяснить легко: очень просто коди-
ровать. Там ведь всего два символа:
ток есть — это единица, тока
нет — ноль. Или намагниченность в
ту или другую сторону — это ноль
или один. А на ПМК все, кстати,
тоже кодируется в той же двоич-
ной системе. Смотри, вот у тебя сим-
вол на индикаторе — он состоит из
семи светящихся сегментов. Зануме-
руем сегменты как угодно. Теперь
для того, чтобы "объяснить" индика-
тору, какую цифру надо зажечь,
ему надо передать, какие сегмен-
ты должны засветиться. Чтобы высве-
тить цифру 'Г надо зажечь сегменты
1 и 2 и потушить остальные. По-
лучаем код цифры 'Г — 1100000,

т.е. единички на местах номер 1 и 2
показывают, что сегменты 1 и 2 дол-
жны гореть, а на остальных местах
нолики, т.е. сегменты должны быть
потушены. Точно так же можно вы-
писать коды и для остальных
цифр. Причем, обрати внимание, ес-
ли по-разному нумеровать сегмен-
ты, то получатся разные коды. По-
нял?

- Вроде да. А в учебнике код
из восьми цифр. Ну это уже мелочи.

Но числа кодируются совсем не так.

- Там числа кодируются так, что-
бы их удобнее было складывать,
умножать и т.д. А при выводе на
индикатор как не нумеруй сегмен-
ты рисунка, цифры не получишь.
Но большим ЭВМ это и не надо.
Кстати, и на ПМК номер регистра
А выглядит на индикаторе как ми-
нус, а не как буква "А". А вооб-
ще про двоичную систему, равно как
и про другие, можешь почитать
книжку Фомина "Системы счисле-
ния". Что дальше в учебнике напи-
сано?

- Каждый символ требует для
хранения 1 байт — это такая единица
памяти из 8 битов. А каждые 2 байта
образуют слово, которое может хра-
нить команду.

- Ну здесь вообще все один к
одному, как на ПМК. Цифра — это 1
байт, только из 7 битов, но это тебя,
надеюсь, не смущает. Ячейка про-
граммной памяти — это слово, те
же 2 байта, и может хранить коман-

- Смотри-ка, действительно, все
очень похоже. Так, что там дальше?
Регистры — есть! Только на ЭВМ их
8, а на ПМК — 15.

Счетчик адреса команд на
ПМК — это программный счетчик на
ЭВМ.

- Только на ПМК это совсем осо-
бый регистр, а на ЭВМ его теоретиче-
ски можно использовать как обычный
регистр, хотя никто этого не делает.
Надеюсь, тебя не смущает, что на
ЭВМ регистры и ячейки памяти одной
длины, а на ПМК ячейки программ-
ной памяти короткие, а регистры
длинные?

- Это меня не смущает, а вот ко-
манды на ЭВМ ну какие-то совсем не
похожие на команды ПМК.

- Они не похожи не более, чем
крылья биплана на крылья истреби-
теля. Просто на ДВК-2 двухадресные
команды, т.е. в каждой команде за-
дано два места: откуда брать данные
и куда класть результат, а на ПМК
команды либо одноадресные, либо
вообще безадресные, т.е. задано
только одно место, а второе ПМК
знает сам: это всегда стек. Куда пе-
ресылает число команда "П-х"? В
стек. А откуда брать число — это ей
указано. А команда " + " вообще ад-
ресов не имеет: данные всегда в сте-
ке и результат там же. Давай срав-
ним программы для ДВК-2 и для

ПМК.

- Ну как, похоже?

- Вообще похоже. Но только ко-
манды какие-то странные — пока
напишешь — устанешь: "переслать
слово ...", на ПМК все же как-то
проще.

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

MOV R0,R2

Слово "MOV" — это сокращение
от английского "move" — "пере-
слать". Так как, похоже?

- Ну так совсем похоже. Ладно,
тогда пошли дальше. Там для срав-
нения чисел какие-то биты N и Z ис-
пользуются. Это что такое?

- Бит N — это просто знак "ми-
нус" на индикаторе. Когда резуль-
тат отрицателен, то этот знак го-
рит, т.е. соответствующий этому зна-
ку бит равен единице. А вот бит Z на
ПМК не виден, хотя он тоже есть.
Команда ПМК "F X = 0" как раз и
проверяет этот бит и выполняет пе-
реход, если он потушен, т.е. нуле-
вой. А команды "F Х>=0" и "F
Х<0" проверяют бит N. Ну что, срав-
ним программы для ДВК и ПМК? Вот
программа, определяющая мини-
мальное из чисел, хранящихся в R1 и
R2, и циклическая программа, вычис-
ляющая

К + (К-1) + (К-2) + ... + 1.

(Обе программы взяты из школьного
учебника.)

- Да, похоже и весьма. Только ко-
манды перехода какие-то плохие:
неудобно считать, на сколько слов
переход надо сделать. Зачем такую
хитрость сделали?

- А ты видишь, что в программе

для ПМК адреса мы написали услов-
но? Почему?

- Но они ведь зависят от того, с
какого адреса написана программа.

- Верно. А что изменится в про-
грамме для ДВК, если ее написать с
другого адреса?

- А-а, понял! В программе для
ДВК ничего не меняется, с какого ад-
реса ни помести этот кусок.

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

- Ладно, сдаюсь. Действительно
получается, что - калькулятор — это
ЭВМ. Так, значит, освоив программи-
рование на ПМК, можно очень легко
освоить программирование на любой

ЭВМ?

- И ты только сейчас это понял?
Ладно, хорошо что понял вообще.
Конечно, ПМК не идет ни в какое
сравнение с большими ЭВМ, но прин-
ципы в них заложены те же. И тот,
кто освоил ПМК, безусловно, сделал
огромный шаг к компьютерной гра-
мотности.

ПРИНИМАЕТ ЗАКАЗЫ

на поставку персо-
нальных компьютеров
ПК 8020 "Корвет".
Компьютер предназна-
чен для решения науч-
но-технических, плано-
во-экономических и

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

Завод при необходи-
мости обеспечит уста-
новку компьютеров и
обучение пользовате-
лей.

Компьютер имеет следующие
технические характеристики:

1) быстродействие процесса 625 тысяч коротких операций в
секунду;

2) емкость ОЗУ пользователя 64 Кбайт;

3) клавиатура с алфавитно-цифровыми, управляющими и
программируемыми функциональными клавишами;

4) отображение на экране видеоконтрольного устройства
(ВНУ) алфавитно-цифровой информации в формате 16 строк по

64 знака и графической информации в формате 512x256 точен
(с наложением алфавитно-цифровой информации) шестнад-
цатью градациями яркости;

5) возможность подключения до четырех накопителей на
гибких магнитных дисках (НГМД) диаметром 133 мм, емкость не
менее 500 Кбайт каждый;

6) возможность печати 80 знаков в строке с шагом 2^4 со
скоростью до 160 знаков в секунду (см. примечание 2);

7) возможность подключения кассетного накопителя (одно-
временная работа кассетного накопителя и НГМД не допускает-
ся);

8) возможность включения в локальную сеть;

9) возможность подключения дополнительных периферий-
ных устройств по последовательному каналу типа ИРПС (токовая
петля);

10) возможность подключения адаптеров дополнительных
внешних устройств через параллельный интерфейс;

11) возможность подключения цветного ВКУ.

Цена от 9 до 11 тыс. руб. в зависимости от комплектации по
требованию заказчика,

Обращаться по телефону 535-35-53.




  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
От авторов - Редакция.
Кто там кодит? - Работаем с MS-DOS: Ms-Dos дискеты - описание структуры Ms-Dos диска.
Ликбез - Аккумуляторы. Практическое применение различных типов.
Застрял ? - Новелла-проходилка по игре "48 Утюгов" часть 4.
Assembly - отчет Петра Соболева с буржуйского пати Assembly 1999 (Часть 3).

В этот день...   28 марта