Вычислительная техника и её применение 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.




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

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



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

Похожие статьи:
News - Новости, старости: Chaos Construction 2001 состоялся, Pussy стала freeware, новое бумажное издание на спектруме, Raver покинул ряды Phantasy, новая версия эмулятора спектрума Real Speccy, Assembly 2001, новый коммандер Real Commander 2.0, Delirium Tremens уходят со спектрума...
Вступление - содержание номера.
заключение - авторы и т.д.
Тусовка - И от рейва мне не спрятаться, не скрыться. Каждый вид имеет свой прикид.
Тема - Enlight'97 - глазами очевидца.

В этот день...   7 июля