Л.Ф.Штернберг
ПРОГРАММИРУЙТЕ С НАМИ
Урок первый
- Вадик! Мне сегодня нужна твоя
помощь, — с порога обратился сту-
дент Андрей к брату-семиклассни-
ку — мне уходить вечером, а еще
чертить надо и "расчетка : считать не
пересчитать.
- А калькулятор свой новенький
дашь?
- Конечно, дам. И работать на нем
научу.
- Тогда с удовольствием. — Ва-
дим достал программируемый мик-
рокалькулятор "МК-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.