Text
                    БИБЛИОТЕЧКА-КВАНТ-
ВЫПУСК 41
Г. А. ЗВЕНИГОРОДСКИЙ
ПЕРВЫЕ
УРОКИ
ПРОГРАММИРОВАНИЯ
И

БИБЛИОТЕЧКА -КВАНТ выпуск 41 Г. А. ЗВЕНИГОРОДСКИЙ ПЕРВЫЕ УРОКИ ПРОГРАММИРОВАНИЯ Под редакцией академика А П ЕРШОВА МОСКВА «НАУКА» ГЛАВНАЯ РЕДАКЦИЯ ФИЗИКО-МАТЕМАТИЧЕСКОЙ ЛИТЕРАТУРЫ 1985 Scan AAW
ББК 22.18 3-43 УДК 519.68 Редакционная котлегия Академик |и. К. Кикоин | (председатель), академик А. Н. Колмо- горов (заместитель председателя), профессор Л. Г. Асламазов (ученый секретарь), член-корреспондент АН СССР А. А. Абрикосов, академик Б. К. Вайнштейн, заслуженный учитель РСФСР Б. В. Воздвиженский, профессор С. П. Капица, академик С. П. Новиков, академик Ю. А. Оси- пьян, академик АПН СССР В. Г. Разумовский, академик Р. 3. Сагдеев, профессор Я. А. Смородинский, академик С. Л. Соболев, член-кор- респондент АН СССР Д. К. Фаддеев, член-корреспондент АН СССР |1 И. С. Шкловский Звенигородский Г. А. 3-43 Первые уроки программирования/Под ред. А. П. Ершова.—М.: Наука. Главная редакция фи- зико-математической литературы, 1985.— 208 с.— (Библиотечка «Квант». Вып. 41.)— 30 к. Цель книги — способствовать формированию у школьников умений и навыков, необходимых для взаимодействия с ЭВМ на языках высокого уровня. Даются конструкции таких языков и основные приемы прикладного программирования. Учащиеся знакомятся с современным уровнем и перспективами развития информа- тики и вычислительной техники. Текст книги в основном ориентирован на школьников 5 — 8 классов. 1702070000-107 ББК 22.18 Э----------------100-03 053(02)-85 518 © Издательство «Наука» Главная редакция физико-математической литературы, 1985
ПРЕДИСЛОВИЕ РЕДАКТОРА До самого последнего времени программи- рование для электронных вычислительных машин (ЭВМ) было занятием для взрослых. Это не значит, что о про- граммировании не писали для школьников. Тем не менее и несколько страниц учебника, и пособия для факульта- тивов, и популярные брошюры лишь приоткрывали заве- су над этим таинственным делом, а если материал изу- чался развернуто, то это делалось по-взрослому, реши- тельно выводя читателя за пределы школьной обстанов- ки. Книга Г. А. Звенигородского в этом смысле обладав! рядом особенностей. Во-первых, это первая известная мне книга по программированию, написанная специаль- но для подростков пятых — восьмых классов, то есть возрастной группы, с которой до сих пор серьезного разговора об ЭВМ и программировании не вели. Во- вторых, она описывает работу на ЭВМ так, как будто машина находится в постоянной доступности читателю и даже является чуть ли не персональным его партнерам. Все это еще пару лет назад побудило бы многих, особен- но из взрослых читателей, подумать, что и выбранный подход к изложению, да и сама книга в целом опере- жают свое время. Тем временем было опубликовано постановление о проведении школьной реформы*), в которой среди пя- ти важнейших направлений повышения качества учебно- воспитательного процесса было названо следующее: «— вооружать учащихся знаниями и навыками ис- пользования современной вычислительной техники, обес- печить широкое применение компьютеров в учебном процессе, создавать для этого специальные школьные и межшкольные кабинеты». Соответствие положениям школьной реформы при- дает большую актуальность этой книге. В ее основе ле- *) О реформе общеобразовательной и профессиональной шкр- лы. — М.: Политиздат, 1984. 1 * 3
жит исследование, начатое ее автором более десяти лет назад в харьковском Дворце пионеров и продолженное затем в Сибирском отделении Академии наук СССР. Целью этого перспективного исследования было найти формы и средства обучения основам программирования в условиях широкого внедрения ЭВМ в школьное обра- зование, имея в виду подготовку подрастающего поколе- ния к тому уже не очень далекому будущему, когда компьютеры станут принадлежностью практически каж- дого рабочего места. Через школу Г. А. Звенигородского прошла не одна сотня ребят всех школьных возрастов. Некоторые из них, невзирая на молодость, уже стали первоклассными про- граммистами. Тем не менее методологические положе- ния этой книги еще далеки от того, чтобы воспринимать- ся как незыблемая педагогическая доктрина. И поэтому, хотя обучение основам программирования средних и младших школьников уже в значительной степени под- готовлено развитием информатики и психологии обуче- ния, только практика и эксперимент смогут вооружить нас полным знанием, необходимым для реализации по- ложений школьной реформы при подготовке выпускни- ков общеобразовательной и профессиональной школы к широкому и повседневному применению современной вычислительной техники. Когда эта книга уже была подготовлена для сдачи в производство, ее автор, младший научный сотрудник Вычислительного центра Сибирского отделения АН СССР Геннадий Анатольевич Звенигородский, скончался на 33-м году жизни от внезапной тяжелой-болезни. Он не дожил нескольких месяцев до завершения возглавляемой им разработки системы Школьница, которая воплощает подход к программированию, описанный в этой книге. Хорошие книги переживают своих авторов. В данном случае это высказывание звучит трагически буквально. Хотел бы добавить, что эта публикация воплощает луч- шие черты таланта ее автора — способность к прямому и стимулирующему общению с учащейся молодежью, увлекательность, не грешащая против строгости, энту- зиазм в изложении новых фактов и явлений, неизбежно передающийся читателю и раскрывающий перед ним по- истине бескрайний мир программирования и решения за- дач на ЭВМ. А. П. Ершов
ОТ АВТОРА В основу этой книги положены материалы Заочной школы программирования, публиковавшиеся в журнале «Квант» начиная с № 9 за 1979 год, и учебного пособия «Основные понятия программирования», выпу- скавшегося Новосибирским университетом для районной школы юных программистов в 1978 и 1979 годах. Книга адресована прежде всего школьникам пятых — восьмых классов, желающим познакомиться с элемен- тарными основами современного программирования. Она может быть полезна и старшеклассникам, учащимся профессионально-технических училищ и межшкольных учебно-производственных комбинатов и другим катего- риям читателей. Для таких читателей стиль книги может показаться несколько упрощенным, а темп изложения — чересчур замедленным, за что автор заранее просит у них прощения. От читателя не требуется никаких специальных зна- ний и умений, выходящих за рамки программы первых четырех классов средней школы. Впрочем, некоторая доля игрового воображения может оказаться очень по- лезной, но на недостаток этого качества школьники жа- луются редко. Отдельные задачи, предназначенные только для стар- шеклассников, отмечены звездочкой. Вспомогательный материал, который при первом чтении можно пропу- стить, набран мелким шрифтом. Эта книга — не учебник, но она не предназначена и для развлекательного чтения. Возможно, дочитав по- следнюю главу этой книги, будут разочарованы те школьники, которые хотели бы сразу научиться соста- влять программы для решения школьных задач по мате- матике и по другим предметам. Для таких читателей нужна другая книга, которая помогала бы им сделать следующий шаг в освоении вычислительной /техники. А эта книга предназначена для тех, кто хочет на простых примерах подготовиться к решению настоящих, больших и сложных задач на современных вычислительных ма- 5
шинах. Книга может быть использована и для организа- ции кружковых занятий со школьниками любого возрас- та. Как показывает опыт Харьковской и Новосибир- ской Школ юных программистов, материал первых уро- ков доступен ученикам вторых — третьих классов, зани- мающихся под руководством преподавателя. Несколько замечаний для профессиональных про- граммистов и преподавателей программирования. Изло- жение в этой книге ведется на примере учебного языка Робик — одного из входных языков системы программи- рования Школьница,* разработанной автором в Вычисли- тельном центре Сибирского отделения АН СССР и ре- ализованной под его руководством на персональных ЭВМ Агат, предназначенных для использования в шко- лах и других учебных заведениях. Реализация системы в короткие сроки осуществлена молодежным коллективом, основу которого составили студенты Новосибирского университета Н. Г. Глаголева, Е. В. Налимов и В. А. Цикоза и школьники П. А. Земцов (9 класс) и Л. Р. Рабинович (7 класс). Все они учились программированию по методике, изложенной в этой книге. А всего по этой методике к началу 1984 года обучалось свыше трех тысяч школьников. На структуре этой книги сказались, разумеется, и тео- ретические концепции, которых придерживается автор, и его оценка тех или иных языков. Структура языка Робик и общая методика изложения, принятая в книге, подводят читателя к некоторой дисци- плине программирования, которую легко реализовать на таких языках, как Рапира и сетл, несколько труднее на паскале или алголе-68 и очень трудно на бейсике или фортране. Из разнообразных конструкций современных языков программирования на первый план выдвинуты процедуры, существенно позже излагаются циклы и вет- вления, полностью исключены из рассмотрения опера- торы перехода и блок-с^емы. Чтобы компенсировать некоторую потерю наглядно- сти, связанную с исключением блок-схем, подробно рас- сматриваются синтаксические диаграммы в качестве средства описания синтаксиса. Разумеется, на том же материале возможны и другие методические схемы: напримеру циклы и ветвления могут быть рассмотрены раньше процедур. Г. А. Звенигородский
ВВЕДЕНИЕ МИР РОБОТОВ И ВЫЧИСЛИТЕЛЬНЫХ МАШИН В середине двадцатого века произо- шли события, от которых начинается отсчет эры освоения космоса и мирного использования атомной энергии. 4 октября 1957 года по всем радиостанциям Советского Союза было передано сообщение ТАСС о запуске первого в мире искусственного спутника Земли. Наш космический первенец сразу же при- обрел такую популярность, что лингвисты отмети- ли редчайшее явление: буквально в течение одного дня в языки многих народов вошло новое слово русского происхождения — слово «спутник». 27 июня 1954 года в городе Обнинске Калужской области начала работать первая в мире атомная электростанция. Все газеты сообщали: энергия атомного ядра впервые обрела мирную профессию, и каждому было ясно, какие перспективы это от- крывает перед человечество^. А вот о событии, которое произошло 25 декабря 1951 года, известно меньше. Да и сегодня, навер- ное, только специалисты понимают, как много зна- чил этот день и для космонавтики, и для ядерной физики, и для многих других отраслей. В этот день в Институте электротехники Академии наук Украин- ской ССР вступила в строй МЭСМ — первая в СССР электронная вычислительная машина (ЭВМ), разработанная под руководством академи- ка Сергея Алексеевича Лебедева. Что она умела? Несмотря на скромное название (МЭСМ означает Малая Электронно-Счетная Машина), выглядела она довольно внушительно. Машина занимала площадь 50 м2 (как трехкомнат- ная квартира), потребляла электроэнергии 25 кВт, а радиоламп в ней было больше шести тысяч — неслыханное по тому времени количество. 7
И все это огромное сооружение могло выпол- нять арифметические действия над 5 — 6-значными числами со скоростью около 50 операций в секунду. Много это или мало? Попробуй проверить это сам. Отложи ненадолго книгу, возьми карандаш и бумагу, заметь время и попробуй сложить десяток-другой шестизначных чисел. Теперь несложно определить, сколько вре- мени ушло у тебя в среднем на одно сложение. Ско- рее всего, получится от 10 до 30 с. А умножение займет, вероятно, не меньше минуты. Получается, что первая наша машина считала примерно в полторы тысячи раз быстрее, чем чело- век, вычисляющий вручную. Вторая советская вычислительная машина — БЭСМ (Быстродействующая Электронно-Счетная Машина), вступившая в строй два года спустя, ра- ботала еще в двести раз быстрее. С ее помощью были решены многие задачи, которые еще в соро- ковые годы считались неразрешимыми из-за огром- ного объема вычислений. Среди первых советских программистов были: Президент Академии наук СССР, Главный теоретик космонавтики, академик Мстислав Всеволодович Келдыш и один из основателей Сибирского отделе- ния АН СССР, академик Михаил Алексеевич Лав- рентьев. И на первых наших ЭВМ рассчитывались траектории первых спутников и лунников. Можно представить, сколько времени и труда ушло бы на эти расчеты, если бы они выполнялись вручную. Уильям Шенке и другие. В 1873 году английский математик Уильям Шенке завершил титанический труд по вычислению семисот с лищним десятичных цифр числа я. До 1853 года это число было извест- но с точностью до 208 знака. За двадцать лет ра- боты Шенке получил 707 десятичных цифр. Если на- печатать их в этой книге, то они займут примерно треть страницы. По просьбе Шенкса эти цифры были изобра- жены на его надгробии. А впоследствии выясни- лось, что только 519 из них были определены пра- вильно. Математик ошибся при вычислении 520-й цифры, и поэтому все последующие тоже оказались неправильными. Тем не менее результат Уильяма Шенкса навсегда вошел в историю математики как 8
пример огромной вычислительной работы, как итог величайшего трудолюбия и настойчивости, предан- ности своему делу, скрупулезной точности расчетов. В 1’981 году девятиклассник из города Арзамаса Сергей Баталов вычислил более 50 тысяч знаков числа я, потратив на это немногим более часа. Ни- какой сенсации в научном мире этот результат не произвел. Дело в том, что Сергей пользовался для своих расчетов электронной вычислительной маши- ной БЭСМ-6, выполняющей более миллиона ариф- метических операций в секунду. Если бы Уильям Шенке попробовал вручную вычислить я с такой точностью, ему бы понадобилось не меньше двух- сот тысяч лет! Понятно, что до появления ЭВМ та- кая задача была абсолютно неразрешимой. Нетруд-* но подсчитать, что БЭСМ-6, решая эту задачу, работала в полтора миллиарда раз бы- стрее, чем один из самых квалифицированных ма- тематиков-вычислителей прошлого века. Уже самые первые вычислительные машины по- зволили получить две тысячи знаков я. А в 1961 го- ду было вычислено 100000 знаков (за 9 часов ра- боты ЭВМ), так что результат Сергея Баталова был интересен только тем, что эту сложную математи- ческую задачу впервые решил школьник, и притом совершенно самостоятельно (за эту работу Сергей был награжден дипломом первой степени на Все- союзном конкурсе школьных работ по программи- рованию). Сегодня уже известно свыше полумиллиона зна- ков числа я (больше, чем букв в этой книге), и ма- тематики знают, что в любой момент можно вы- числить новые знаки, если это понадобится. Итак, вычислительные машины способны очень быстро и точно выполнять арифметические рас- четы; самые мощные современные ЭВМ работают еще в сотни раз быстрее, чем БЭСМ-6. Но умение считать, вычислять — отнюдь не единственное и да- же не главное умение современных вычислительных машин. А что же еще они умеют делать? Для отве- та на этот вопрос отправимся на небольшую эк- скурсию туда, где работают эти машины. Билет оформляет система Сирена. Начнется наша экскурсия немножко неожиданно: вместо вычисли- тельного центра мы зайдем в билетную кассу Аэро- 9
Рис 1 Графический дисплей Рис. 2. Алфавитно-цифровой дисплей 10
флота. Как известно, современные самолеты могут в течение нескольких часов доставить нас в самую отдаленную точку нашей страны. А вот оформле- ние билета на самолет иногда занимает гораздо больше времени, чем сам полет. Особенно много времени уходит на бронирование мест, если пред- стоит пересаживаться на другой самолет в другом городе. Агентство Аэрофлота, в котором был зака- зан билет, отправляет телеграмму в пункт пересад- ки с просьбой забронировать место на таком-то рей- се. Диспетчер, отвечающий за этот рейс, откры- вает нужную таблицу, отмечает забронированное место и составляет ответную телеграмму, получив которую, кассир выписщвает билет. После этого кассир опять посылает телеграмму диспетчеру — подтверждение, что билет продан. Все это занимает три-четыре дня — это если ни один документ нигде не застрял и на нужном рейсе есть свободные места. Но если пересадка должна состояться в Москве, то оформление билетов, вероятнее всего, займет не больше двух-трех минут. Дело в том, что брониро- ванием авиабилетов в Москве занимается автомати- зированная система Сирена, основу которой соста- вляет мощная вычислительная машина. Специальные пункты для связи с этой ЭВМ — так называемые терминалы *) — установлены в боль- шинстве крупных городов нашей страны. На каж- дом пульте есть печатающее устройство с клавиату- рой как у обычной пишущей машинки и экраном, похожим на экран телевизора. Несколько слов о терминалах Вообгце-то терминалом на- зывают любое устройство для связи человека с ЭВМ. В шести- десятых годах в качестве терминалов довольно часто использо- вали электрические пишущие машинки и телеграфные аппараты — телетайпы В последние годы чаще применяют дисплеи — устройства с телевизионным экраном. Различают графические дисплеи, на экране которых можно нарисовать любой рисунок (рис. 1), и алфавитно-цифровые, которые могут показывать только тексты (рис. 2). Это слово происходит от английского «terminal» — конечный пункт. Терминал называется так потому, что он стоит в конце линии связи
Представь себе, что ты пришел, например, к но- восибирскому оператору системы Сирена с намере- нием приобрести несколько билетов до Харькова (с пересадкой в Москве). Оператор набирает текст за- проса, нажимая соответствующие клавиши на тер- минале, и через одну-две * секунды на экране появ- ляется ответ машины. В течение этих секунд вычисли- тельная машина, находящаяся за несколько тысяч километров от Новосибирска, просмотрела распи- сание, выбрала удобный для тебя рейс, определила, сколько на нем свободных мест, отвела места по твоему запросу и сообщила их номера новосибир- скому оператору — словом, проделала всю ту рабо- ту, на которую раньше уходило несколько дней. Если предложенные места тебя устраивают, опе- ратор набирает на пульте подтверждающее сообще- ние, и далекая ЭВМ запоминает, что места эти забронированы для пассажиров, которые таким-то рейсом прилетят из Новосибирска. А теперь прикинь, сколько пассажиров каждый день прилетает в московские аэропорты и улетает Рис. 3. Алфавитно-цифровое печатающее устройство 12
из них, и попробуй представить себе, сколько чело- век одновременно обращается к операторам Си- рены в разных городах. Тогда ты поймешь, какую огромную работу выполняет система. Первое прерывание Зачем Сирене ЭВМ? Попробуем разобраться, какую работу вы- полняет в системе Сирена вычислительная маши- на и что она должна уметь, чтобы справляться с этой работой. Первое, машина принимает запросы, по-1 ступающие от операторов, и отвечает на них, то есть ведет диалог с операторами. Умение вес- ти диалог с человеком, а возможно, и со мно- гими людьми одновременно — одно из важнейших качеств современных вычислительных машин. Для та- кого диалога предназначены разнообразные терми- налы, печатающие устройства и рисующие уст- ройства — графопостроители. На рис. 3, 4 изобра- жены различные печатающие устройства, а на рис. 5 — графопостроитель. Получив запрос с терминала, вычислительная машина должна подобрать подходящий для пасса- жира рейс и определить, сколько на нем свободных мест. Для этого ей нужно «помнить» расписание всех самолетов, вылетающих из Москвы, и точный перечень свободных и занятых мест на каждом самолете, по крайней мере, на две недели вперед. Иначе говоря, она должна хранить информацию о расписании и о распределении мест на самолетах. Умение хранить информацию — второе’ важнейшее качество вычислительных машин. Каж- дая ЭВМ имеет одно или несколько запоминающих устройств (ЗУ), которые часто называют памятью вычислительной машины. Обычно различают оперативные запоминающие устройства (ОЗУ) и долговременные (ДЗУ). Опера- тивные устройства — самые быстрые: найти нуж- ную информацию в ОЗУ машина может за мил- лионную долю секунды. Но в таком ЗУ можно хранить не так уж много сведений, и сохраняются 13
Рис. 4. Малогабаритное печатающее устройство Рис. 5. Графопостроитель
они только во время работы машины: если ЭВМ выключили хотя бы на долю секунды, вся информа- ция в ОЗУ пропадает (стирается). В ДЗУ можно хранить информацию как угодно долго, поэтому эти устройства и называют долго- временными, но зато и искать нужные данные там приходится гораздо дольше, чем в оперативной па- мяти. В качестве ДЗУ часто используют магнито- фоны и запоминающие устройства на магнитных дисках, похожих на грампластинку (рис. 6, 7). Информация в ОЗУ и ДЗУ не остается неизмен- ной: каждый раз, когда система оформляет очеред- ной авиабилет, какое-то свободное место становит- Рис. 6. Запоминающее устройство на магнитных лентах 15
ся занятым. Бывает и наоборот — когда пассажир сдает билет. Меняются расписания рейсов, выходят на авиалинии новые типы самолетов, и все эти из- менения нужно немедленно занести во все таблицы, хранящиеся в памяти ЭВМ. Умение обрабаты- вать информацию — третье и, пожалуй, самое важное качество современной ЭВМ. г Обработкой информации занимается процес- сор — «мозг и сердце» любой вычислительной си- стемы. Процессор управляет работой всей машины: он записывает информацию в память и читает ее из памяти, он принимает запросы от терминалов и вы- дает на терминалы свои сообщения, и он же выпол- няет все вычисления, изменения, исправления и дру- гие операции над информацией, хранящейся в памя- ти или поступающей с терминалов. Теперь мы можем перечислить важнейшие уме- ния современных вычислительных машин, то есть ответить на вопрос, сформулированный в начале параграфа: каждая ЭВМ должна уметь при- нимать, хранить, обрабатывать и вы- давать информацию. Мы ничего не сказали об умении вычислять. ‘Дело в том, что системе Сирена почти не приходится производить арифме- тические действия — разве что подсчитать стоимость детского билета или количество оставшихся свободных мест в самолете. Разумеется, существует немало других систем, в которых машинам приходится решать гораздо более серьезные вычисли- тельные задачи, и там их блестящие арифметические- способно- сти могут проявиться в полной мере. Но наш вывод об ос- новных умениях ЭВМ от этого не изменится: ведь числовая ин- формация — это всего лишь один из видов информации, а ариф- метические операции — один из видов ее обработки. Около 90% всей информации, обрабатываемой современными ЭВМ, соста- вляет информация нечисловая: тексты, рисунки, графики, раз- нообразные списки и таблицы, так что на долю арифметических вычислений приходится лишь десятая часть рабочего времени вычислительных машин. Правильнее было бы называть их не вычислительными, а информационными машинами (точнее, ма- шинами для обработки информации), но к старому названию уже давно привыкли и вряд ли стоит его менять. Итак, на вопрос «Что умеет делать вычисли- тельная машина?» мы, в основном, ответили. А те- перь продолжим нашу экскурсию. 16
Рис. 7. Запоминающие устройства на магнитных дисках: а) жесткие диски (~ 1 м)- б) портативное ДЗУ на гибких дисках (~ 0,2 м) 17
Система Бельчонок ведет поиск. Исследуя состав клеточной мембраны, биохимик обнаружил какой- то белок. Нужно было определить, какой это белок и что о нем уже известно. Для этого его расщепили с помощью специально подобранных химических реактивов — ферментов. Удалось установить, что среди образовавшихся «осколков» есть такая цепоч- ка аминокислот: аланин-валин-аланин (в сокра- щенных обозначениях AVA). Теперь исследователь должен отойти от лабораторного стола, взять с книжной полки толстые тома каталогов, в ко- торых перечислены структуры всех известных бел- ков, и начать кропотливый поиск: где в этих струк- турах встречается обнаруженная им цепочка. А белков — сотни, и в каждом — от двух-трех десят- ков до многих тысяч аминокислот... Еще несколько лет назад такая проверка отни- мала несколько дней, а иногда и недель. Сегодня на нее уходят минуты: биохимик просто подходит к терминалу и набирает свой запрос. И почти сразу же на экране появляется ответ ЭВМ: ЦЕПОЧКА AVA ВСТРЕЧАЕТСЯ В ТАКИХ БЕЛКАХ. НАЗВАНИЕ БЕЛКА ПОЗИЦИЯ S12.......................................8 S16.......................................3 S25.......................................512 Это работает система Бельчонок, созданная восьмиклассниками Таней Вайнштейн и Толей Ве- личко по заданию Новосибирского института орга- нической химии. Если ученый, получив такой ответ, заинтересуется более подробными сведениями об одном из белков, он может набрать новый запрос и получить такой, например, ответ: СПРАВКА ФУНКЦИЯ БЕЛКА-ФЕРМЕНТА ВАЛИЛ-ТРНК-СИНТЕТАЗЫ СОСТОИТ В УЗНАВАНИИ СПЕЦИФИЧЕСКОЙ АМИНОКИСЛОТЫ - ВАЛИНА, АКТИВИРОВАНИИ ЕВ С ПОМОЩЬЮ АЙ И В ПОСЛЕДУЮЩЕМ ПРИСОЕДИНИ™ ЭТОЙ АМИНОКИСЛОТЫ К СПЕЦИФИЧЕСКОЙ ТРАНСПОРТНОЙ РНК ВАЛИЛ-ТРНК. 18
Ты уже, конечно, понял, как смогла машина по- мочь биохимику: в ее запоминающем устройстве хранились каталоги всех белков. Огромная скорость обработки информации в ЭВМ позволила просмот- реть их в течение нескольких секунд, а затем ма- шина оформила свой ответ так, чтобы специалисту было удобно его читать, и выдала на экран тер- минала. И снова — никаких вычислений: вся информация о белках хранилась в ЗУ в виде текстов. Кстати, раз уж речь зашла о текстах, заглянем в учреждение, где постоянно имеют дело с текстами — в издательство. ЭВМ на столе у редактора. Гжатск получил но- вое название — город Гагарин. А в рязанской областной типографии еще не просохли гранки не- большой книги о родине первого космонавта. Ко- нечно, книгу нужно было переделать, но... легко сказать! Ведь слово «Гжатск» в разных формах и падежах встречалось чуть ли не на каждой стра- нице. И если бы можно было исправлять одно только это слово! Ведь новое название города на одну букву длиннее, значит, увеличится длина всей строки. Скорее всего, одну или несколько букв нуж- но будет перенести на следующую строку, значит, ее тоже предстоит исправлять, следующую за ней — тоже и так далее. В лучшем случае цепочка испра- влений потянется до конца абзаца, в худшем — поя- вится лишняя строка, а тогда нужно будет пере- делывать и следующую страницу... Конечно же, при таких переделках неизбежно возникают новые опечатки. А самое обидное, что в одном-двух местах наверняка останется старое на- звание. Понятно, что работникам издательства и типографии пришлось нелегко. Но если бы для редактирования этой книги ис- пользовалась ЭВМ, то никаких проблем не возник- ло бы. Машине достаточно нескольких. минут, чтобы просмотреть весь текст, сделать необхо- димые исправления, по-новому распределить строч- ки по страницам, переместить рисунки, расставить новые номера и выполнить любые другие замены. А если при переиздании книги понадобится изме- нить ее полиграфическое оформление, например, ис- , пользовать другой шрифт, то для этого не нужно 19
будет набирать в типографии весь текст заново — достаточно запросить из ДЗУ старый текст, внести, если нужно, исправления и сообщить машине все сведения о новом издании: каким шрифтом его нужно набирать, сколько букв должно быть в стро- ке, сколько строк на странице. Всю остальную ра- боту машина выполнит сама. Архитектор за терминалом. Нелегкая работа у архитектора. Ему приходится одновременно быть и художником, и инженером. Художник мечтает возвести изумительно красивые здания, а инженер должен ответить, можно ли такие здания по- строить. Он должен рассчитать усилия в каждом элементе задуманной художником конструкции, подобрать форму и размеры каждой детали. Его за- дача — обеспечить прочность, устойчивость и на- дежность всего сооружения, предусмотреть исполь- зование стандартных деталей всюду, где это воз- можно. И далеко не всегда воздушные замки, одетые в сборный железобетон, оказываются таки- ми, как хотелось художнику. Можно, конечно, по- пробовать немножечко изменить проект, поискать такой вариант, который удовлетворил бы и худож- ника, и инженера. Но расчет строительных кон- струкций — дело долгое и кропотливое. Если его повторять много раз, проектирование нового зда- ния может растянуться на десятки лет. Но вот на помощь архитектору приходит ЭВМ. Чертежную доску заменяет экран графического дис- плея. При помощи светового пера — устройства, Рис. 8. Изображения архитектурных сооружений на экране графи- ческого дисплея 20
Рис./9. Применение машинной графики в различных отраслях 21
позволяющего рисовать прямо на экране, можно изо- бразить любой рисунок, схему или чертеж. Теперь архитектор-художник может дать волю своей фантазии и нарисовать световым пером такое здание, которое он хотел бы видеть. Этот рисунок воспринимает вычислительная машина. За несколь- ко секунд выполнив инженерный расчет, она изо- бражает на экране свой вариант, соответствующий жестким требованиям строительной механики. Те- перь очередь за человеком. Если предложенный ма- шиной вариант его не устраивает, он может предло- жить какие-то изменения, и машина вновь повторит все расчеты уже для нового варианта. Архитектор может как угодно двигать и поворачивать здание на экране, чтобы проверить, как оно будет выглядеть с разных сторон, с разных расстояний (рис. 8). Но вот человек и машина пришли к соглашению. Те- перь нужно готовить рабочие чертежи, сметы, спе- цификации и множество других документов, без ко- торых нельзя начинать строительство. Все эти бу- маги оформляет ЭВМ почти без участия человека. Примерно так же — в режиме диалога с ЭВМ при помощи графического дисплея и светового пе- ра — работают сегодня авиа- и автоконструкторы, художники-модельеры, радиоинженеры и представи- тели многих других профессий (рис. 9). Второе прерывание Куда спрятался процессор? Рассказывая о рабочих местах касси- ров Аэрофлота и ученых-биохимиков, авиакон- структоров и архитекторов, мы упоминали только о терминалах, то есть об устройствах для связи с процессором вычислительной машины. А где же находится сам процессор? Заглянем еще раз в лабораторию биохимика или в рабочий кабинет редактора и присмотримся к их терминалам повнимательнее. Лет 10—15 назад мы, скорее всего, обнаружили бы кабель (линию связи) от терминала к процессору, который наверняка за- нимал бы целую комнату, может быть, соседнюю, а может быть, расположенную в другом городе (как в системе Сирена). 22
В течение многих лет, от появления первых ЭВМ до начала семидесятых годов, процессор и за- поминающие устройства были самыми большими, сложными и дорогими устройствами в составе вы- числительных машин. Поэтому конструкторы и программисты всячески старались увеличить ко- личество терминалов, подключенных к одному или нескольким процессорам, объединенным в вычисли- тельный комплекс. Например, комплекс из трех ЭВМ БЭСМ-6, установленных в Вычислительном центре Сибирского отделения Академии наук СССР (ВЦ СО АН СССР), обслуживает больше ста тер- миналов, находящихся не только в самом ВЦ, но и в других институтах Новосибирского Академго- родка и даже в других городах. Линию связи, ведущую к процессору, мы можем увидеть и сегодня, но она может оказаться очень короткой. Просто рядом с терминалом стоит коро- бочка, размером чуть больше школьного портфеля, в которой отныне свободно помещаются и процес- сор, и память, и другие устройства. Такую маленькую ЭВМ, которую свободно можно поставить на стол и которая предназначена для использования одним человеком на его рабочем месте или дома, часто называют персональной вы- числительной машиной. Вычислительные машины смогли стать такими миниатюрными, потому что сейчас вместо радио- ламп, транзисторов и других деталей традиционных радиосхем используются так называемые большие интегральные схемы (БИС). Одна такая БИС заме- няет сотни, а то и тысячи радиоламп, употребляв- щихся в первых ЭВМ. Сравнив рис. 10 и 11, можно получить некоторое представление о том, как изменился внешний облик вычислительных машин всего за двадцать лет. На первом рисунке изображена одна из лучших совет- ских ЭВМ начала пятидесятых годов — Стрела. Ра- ботала она со скоростью 2—3 тысячи операций в секунду, а оперативное запоминающее устройство позволяло хранить 2047 чисел или команд. На рисунке показаны шкафы с процессором и ОЗУ этой машины. Видно, что они занимают террито- рию, ненамного меньшую, чем школьный спорт- зал. 23
Рис. 10. Общий'вид ЭВМ Стрела Рис. 11. Интегральные микросхемы На втором рисунке показаны интегральные схемы: процессор с быстродействием больше 500 тысяч операций в секунду и запоминающее устрой- ство на 2 тысячи чисел. Площадь каждой такой схемы — около квадратного сантиметра, в спичеч- ном коробке их поместится несколько десятков. Легко видеть, что современные ЭВМ отличаются по размерам от своих предшественниц заметнее, чем муха от слона. Прочитав эти строки, ты можешь подумать, что большие ЭВМ теперь вообще не нужны. Конечно же, это не так: всегда существуют такие задачи, ко- торые нужно решать на самых быстрых и мощных 24
машинах, таких, как новая советская ЭВМ Эльбрус, выполняющая около 120 миллионов операций в се- кунду. Эти машины также делают на интегральных микросхемах, но их приходится брать не десятки, как для первых ЭВМ, а тысячи и даже де- сятки тысяч. По размерам такие машины будут на- много меньше Стрелы, но по своим возможностям они превосходят ее в миллионы раз. Во многих слу- чаях нельзя обойтись и без линий связи: понятно, что сведения о свободных местах в самолетах удоб- но хранить в каком-то одном запоминающем устройстве, а терминалы для оформления билетов иметь в каждой кассе Аэрофлота. Но все-таки боль- шинство задач, решаемых на вычислительных ма- шинах, вполне по силам современным персо- нальным ЭВМ. А если несколько персональных машин подключить к одной большой, то получится универсальная система: с маленькими задачами бу- дут справляться персональные ЭВМ, а для решения больших задач они обратятся к мощной централь- ной машине. Человек, работающий за терминалом, может не интересоваться тем, какая именно машина отвечает на его запрос: главное, что ответ приходит достаточно быстро. А теперь, познакомившись с возможностями со- временных ЭВМ, посмотрим, где еще ты можешь с ними встретиться. ЭВМ у нас дома. Появление крохотных и очень дешевых процессоров на одной интегральной схеме, так называемых микропроцессоров, открыло перед вычислительной техникой совершенно неожиданные перспективы. Оказалось, что микропроцессор мож- но вмонтировать прямо в станок, в научный прибор и даже... в кухонную плиту и другие домашние электроприборы. Посмотрим, с какой вычислитель- ной техникой скоро можно будет встретиться в обычной жилой квартире. Уже появились телефонные аппараты с микро- процессорным управлением. У них есть и оператив- ная, и долговременная память. В оперативной хра- нится тот номер, который мы только что набрали. Если с первого раза дозвониться не удалось (заня- то), то телефон будет повторять вызов, например, каждые пять минут. А самые нужные номера мож- но записать в ДЗУ. 25
Существуют и стиральные машины, в которые нужно только загрузить белье w засыпать поро- шок — все остальное машина сделает сама: нальет и нагреет, если нужно, воду, замочит белье, высти- рает, прополощет, отожмет и сольет воду — оста- нется только вынуть чистое белье. Есть электро- плиты, способные выполнить такое, например, за- дание. Включить духовку, нагреть ее до 180 °C и по- дать звуковой сигнал, чтобы хозяйка знала, что пирог пора ставить в духовку. Выпекать пирог 20 минут, затем снизить температуру до 100 °C, выдержать пирог еще 10 минут, потом выклю- чить духовку и снова подать звуковой сигнал. Все больше появляется микропроцессорных игрушек: их подключают к обычному телевизору и на экране появляется, например, мишень, на кото- рой можно потренироваться в спортивной стрельбе из светового пистолета, или полоса препятствий, че- рез которые нужно провести автомобиль. Есть и карманные игрушки, для которых телевизор не нужен. Почему бы, например, не поиграть в шах- маты или футбол? Впрочем, не только поиграть. Разработано уже немало миниатюрных устройств, которые могут помочь в изучении иностранного языка или в переводе статьи. А для школьников младших классов предназначен карманный трена- жер: машина при помощи синтезатора речи произ- носит слово, а ученик должен набрать его по бук- вам на клавиатуре. Если он ошибается, машина начинает пищать: «Пробуй снова, пробуй снова, ты не знаешь это слово». Наконец, в известных всем электронных наручных часах и карманных микро- калькуляторах тоже используются микропроцес- соры. Появляются в некоторых квартирах и персо- нальные ЭВМ. Подключенные к телевизору, теле- фону, электроплите, швейной и стиральной ма- шинам и к другой бытовой технике, такие ЭВМ берут на себя многие обязанности домашних робо- тов, давно уже кочующих по страницам фантастиче- ских произведений. В отсутствие хозяев домашняя ЭВМ может отве- чать на телефонные звонки, поддерживать в кварти- ре заданную температуру, поливать цветы, кормить 2б
в определенные часы рыбок в аквариуме. А к при- ходу хозяев она приготовит или разогреет обед, по- стирает и выгладит белье. Через персональную ЭВМ можно получить под- борку самых свежих новостей по любой заданной теме, заказать билет на поезд или самолет, просмо- треть на экране телевизора текст и рисунки из лю- бой книги, отправить письмо или телеграмму. А для самых маленьких членов семьи машина почи- тает вслух сказку и покажет заказанный мульт- фильм. Особенно полезна такая машина школьни- ку: с ее помощью можно получить любую справку, провести любые эксперименты по физике, химии и другим предметам, проверить свои знания, офор- мить домашнее задание. А дошкольник может на- учиться читать и писать с помощью той же ма- шины (уже известны случаи, когда трехлетние дети самостоятельно осваивали грамоту, играя с домаш- ней ЭВМ). Да и играть в шахматы персональная ЭВМ умеет не хуже, чем специализированный шах- матный микропроцессор. Третье прерывание Что нужно знать и уметь, чтобы работать с ЭВМ? В одном из своих выступлений акаде- мик А. П. Ершов ответил на этот вопрос так: «Программист должен обладать способностью пер- воклассного математика к абстракции и логическо- му мышлению, в сочетании с эдисоновским талан- том соорудить все, что угодно, из нуля и единицы. Он должен сочетать аккуратность бухгалтера с про- ницательностью разведчика, фантазию автора де- тективных романов с трезвой практичностью эконо- миста. А кроме того, программист должен иметь вкус к коллективной работе, понимать интересы пользователя и многое другое». Вычислительные машины используются всю- ду — в заводских цехах и лабораториях ученых, в школьном классе и жилой квартире, на земле, под водой и в космосе (например, на борту нового со- ветского космического корабля «Союз-Т» устано- влена микро-ЭВМ). Где бы ты ни работал, какую 27
бы профессию ни выбрал, рано или поздно ты встретишься с вычислительной машиной. И тогда очень многое будет зависеть от того, насколько ты готов к такой встрече. По словам А. П. Ершова, че- ловек, не умеющий работать с ЭВМ, может ока- заться в положении неграмотного в библиотеке: кругом столько всего интересного — а как про- чтешь? Во время нашей экскурсии ты мог убедиться, что ЭВМ выполняет самую разнообразную рабо- ту — от редактирования книг до управления поле- том межпланетных станций. Вычислительные ма- шины — наши верные помощники. Но если ты хочешь, чтобы они стали и твоими помощниками, ты должен научиться составлять задания на понят- ном для них языке. Запомни: задание для ЭВМ, написанное на по- нятном для нее языке, называется программой. Как нетрудно сообразить, человека, составляю- щего программы, называют программистом. Первые вычислительные машины понимали только язык цифр. Программы для них нужно было составлять из отдельных цифровых команд. Напри- мер, во многих ЭВМ команда 001 означала сложе- ние, 002— вычитание и так далее. Составление про- грамм из таких команд было очень кропотливым занятием и отнимало много времени, поэтому по- чти сразу после появления первых машин програм- мисты начали «учить» их другим языкам, более удобным для людей, чем цифровые команды. Первые такие языки появились в середине пятиде- сятых годов. Языки, предназначенные для составления про- грамм, называются языками программирова- ния. Сейчас в мире насчитывается несколько тысяч разнообразных языков программирования. Среди них есть очень мощные и универсальные: ПЛ/1, ал- гол-68, симула-67, ада, смоллток. Существует много специализированных языков, предназна- ченных для решения задач одного какого-нибудь 28
типа (например, для редактирования текстов (сно- бол) или для анализа музыкальных произведений (МИПЛ)). «Научить» машину новому языку очень непро- сто. Для этого нужно написать большую и слож- ную программу (часто с использованием цифровых команд), которая будет принимать с терминала или с другого устройства текст на языке программиро- вания и переводить его на понятный машине язык команд. Такая программа-переводчик называется транслятором (от английского слова translate — пе- реводить). Составление транслятора может потребовать не- скольких лет работы. Но зато после того, как он бу- дет готов, программисты могут забыть, что ма- шина на самом деле понимает только цифровые команды, и писать все свои программы на удобном для себя языке программирования. Конечно же, ни один программист не знает всех существующих языков, да это и не нужно. Для того чтобы успешно работать с любой ЭВМ, достаточно изучить один-два универсальных языка и, работая с ними, освоить важнейшие правила и приемы со- ставления программ. Разные языки программирова- ния имеют много общего, поэтому перейти от одного языка к другому обычно бывает не очень сложно. В начале этой главы мы несколько раз упоминали, что ин- формацию с терминалов принимает вычислительная машина, точнее говоря, ее процессор. А на этой странице, в конце треть- его прерывания, нДдисано, что текст с терминала принимает программа. Не ошибка ли это? Нет, не ошибка. Дело в том, что вычислительная машина всегда работает под управлением программы. Поэтому вопрос, кто же на самом деле ведет диалог с человеком: машина или управляющая этой машиной программа, строго говоря, не имеет смысла. По-разному можно отвечать и на вопрос о вычислительной машине и программе. Точнее всего было бы написать: «Вычис- лительная машина, работая по программе, составленной про- граммистом, сделала то-то и то-то», но это очень длинно и так обычно не пишут. Если же вычислительная машина управляет роботом, то дело запутывается еще больше: с одинаковым пра- вом можно сказать: «робот принял решение изготовить все де- 29
тали»... «ЭВМ приняла решение»... или «программа приняла ре- шение»... В этой книге будет употребляться то одно, то другое выражение, смотря по обстановке. Роботы становятся к станкам. В сборочном цехе автозавода кипела работа. Быстрые тонкие пальцы подхватили очередную деталь, повернули ее в воз- духе, установили на место. Несколько раз вспыхнул огонек электросварки и конвейер двинулся дальше... Обычная картина. Впрочем, не совсем обычная. Де- таль, которую йужно было установить на место, ве- сит несколько сотен килограммов. Поднимали, поворачивали и закрепляли ее, ко- нечно же, не человеческие пальцы, а металлические «пальцы» робота. И вообще в этом цехе нет ни одного человека: двери заперты на замок, у всех станков работают роботы. Еще несколько лет назад эти строки показались бы цитатой из научно-фантастической книжки. А се- годня в разных странах уже работают участки, цеха и целые предприятия, на которых все работы вы- полняются промышленными роботами. Роботы заменяют человека и там, где работать Тяжело и опасно: у печей и реакторов, на под- водных и подземных работах, и там, где приходит- ся выполнять однообразные повторяющиеся движе- ния (например, на сборочных конвейерах). «Мозг» каждого робота — это микропроцессор. Языки программирования для них почти не отли- чаются от обычных, только к привычным для вы- числительных машин действиям (сложить два чис- ла, заменить букву в слове, провести линию на рисунке и так далее) добавляются новые, для каж- дого робота свби: поднять деталь, установить ее на место, завернуть болт, опуститься под воду в задан- ной точке и многие другие. Общие правила соста- вления программ для роботов и для обычных ЭВМ одинаковы, так что если ты научишься программи- ровать на ЭВМ, то сможешь управлять и роботами. Терминалы в школьном классе. На рис. 12 пока- зана одна из терминальных комнат ВЦ СО АН СССР. Программисты и математики работают здесь над новыми языками и трансляторами, ре- шают на ЭВМ сложнейшие задачи геофизики, био- логии, метеорологии, физики океана. А в опреде- зо
Рис. 12. Юные программисты за работой ленные дни и часы эту комнату заполняют ученики школы юных программистов, работающей при ВЦ СО АН СССР и Новосибирском университете. Школьники, которые' изображены на этом снимке, начинали изучать программирование еще во 2 — 3 классе. В вычислительном центре СО АН СССР разра- ботаны учебные языки программирования Робик и Рапира, предназначенные для школьников разного 31
возраста, от второго до десятого класса. Уже напи- саны трансляторы с этих языков для советской пер- сональной ЭВМ Агат и для некоторых других ЭВМ. Эти трансляторы входят в систему, получившую на- звание Школьница. Кроме Робика и Рапиры, Школь- ница понимает и другие языки программирования, она умеет исполнять музыкальные произведения и рисовать. В состав этой системы входят и десятки программ, предназначенных для применения на уроках по различным школьным предметам, напри- мер, модель химической лаборатории, справочник по астрономии, тренажер для обучения умножению в столбик, русско-английский словарь и так далее. В одной из новосибирских школ оборудован вы- числительный кабинет, в котором на каждом столе установлена ЭВМ Агат, оснащенная системой Школьница. Сюда приходят школьники разных классов на уроки по программированию, математи- ке, физике, химий, биологии и другим предметам. Скоро такие кабинеты появятся во многих школах нашей страны. Если ты хочешь изучить программирование, а в твоей школе еще нет вычислительного кабинета, тебе могут помочь кружки программирования, ра- ботающие, сегодня во многих городах. С сентября 1979 года регулярно публикуются материалы для юных программистов в журнале «Квант». Можно начинать свое знакомство с программи- рованием и с этой книги. А теперь ты должен решить, как читать дальше. Если ты хочешь научиться составлять про- граммы для роботов и вычислительных машин, ос- воить важнейшие понятия, законы и приемы про- граммирования, подготовься к серьезной работе. Приготовь тетрадки в клеточку, ручку, карандаш, линейку. Лучше всего завести две тетради: рабо- чую — для решения задач и конспект, в который нужно выписывать основные правила и определения и перерисовывать важнейшие диаграммы, отмечен- ные на полях знаком / * \. Другим знаком — V отмечены новые слова. Их стоит выписать в сло- варик в конце конспекта. 32
На полях будут встречаться и другие «до- рожные» знаки. Вот что они означают: — трудный материал. Читай очень вниматель- /шг\ но и постарайся в нем разобраться. — дополнительный материал. При первом /т\ чтении это место можно пропустить. «место разворота». Нужно вспомнить ка- кой-то или из А если не смог вспомнить, стоит найти это место и прочитать его заново. — задача для самостоятельного решения. По- [STOP] старайся решить ее, прежде чем читать х__/ Дальше. л материал из школьной программы предыдущих глав этой книги. F- контрольные вопросы и задачи для повто- рения и закрепления материала. Звездочкой отмечены задачи, предназна- ченные только для старшеклассников, а дву- мя звездочками — задачи повышенной труд- ности. Следующие главы разделены на уроки и пере- мены. За один раз не стоит читать больше одного урока и одной перемены. Обязательно постарайся STOP решить все задачи, отмеченные знаком \ / , от- ветить на все контрольные вопросы и решить две- три задачи на закрепление (со знаком Вот первое контрольное задание: Вспомни и назови важнейшие умения вычисли- тельных машин. Если ты не собираешься заниматься програм- мированием всерьез, но хотел бы узнать подробнее об устройстве и работе роботов и ЭВМ, об их приме- нении в различных отраслях, можешь бегло про- смотреть следующие главы этой книги и сразу перейти к рекомендациям по дальнейшему чтению (с. 193). Наконец, если все, о чем говорилось в этой гла- ве, совсем тебя не заинтересовало (впрочем, это 2 Г. А. Звенигородский 33
маловероятно, раз уж ты дочитал до этого места), отложи эту книгу и попробуй вернуться к ней через го дик-другой. Теперь представь себе, что ты сидишь за партой в экспериментальном вычислительном кабинете. Правда, машина Агат пока еще выключена — с ней ведь еще нужно научиться работать. Внимание! Начинается первый урок!
ГЛАВА ПЕРВАЯ ИСПОЛНИТЕЛИ И ПРОГРАММЫ Первый урок Основные законы программирования и правила записи программ Вопросы, утверждения, предписания. Для того чтобы научиться составлять программы, нужно сначала изучить какой-нибудь язык програм- мирования. А для этого нужно, прежде всего, ра- зобраться, чем отличаются такие языки от обычных языков: русского, английского, японского и других. Программы на любых языках программирова- ния состоят из отдельных предложений — точно так же, как привычные для нас тексты, записанные по- русски. Но в таких текстах встречаются предложе- ния различных видов: повествовательные, вопроси- тельные и побудительные, а в большинстве языков программирования все предложения относятся к одному и тому же виду. Почему? Для ответа на этот вопрос вспомним, как разли- чаются виды предложений в естественных языках. Вот что об этом сказано в учебнике для четвер- того класса: По цели высказывания различаются повествова- тельные, вопросительные и побудительные предло- жения. Предложения, в которых мы сообщаем о чем- либо, называются повествовательными; предложе- ния, в которых содержится вопрос, — вопроси- тельными; предложения, в которых мы побуждаем кого-либо к действию, приказываем, просим, — по- будительными. На уроках программирования в этой книге мы будем интересоваться видами предложений гораздо чаще, чем интересуются ими в школе на уроках рус- ского языка. Поэтому вместо длинных названий 2* 35
(повествовательное предложение и так далее) будем V пользоваться более короткими: утверждение, во- проси предписание. Чтобы проще было отличать один вид предло- жений от другого, запомни такие правила: А Вопрос — это предложение, на которое можно ответить. Предписание — это предложение, которое можно исполнить. Утверждение — это предложение, которое можно проверить (оно может оказаться ис- тинным или ложным). Применяя эти правила, нужно помнить, что они относятся к буквальному смыслу предложения, а не к его переносному смыслу. Например, предложение «Витя, ты не мог бы сходить за мелом», если пони- мать его буквально, нужно считать вопросом. Строго говоря, нашими правилами не всегда можно вос- пользоваться: ведь не на всякий вопрос можно ответить, пред- писание «Взвейтесь кострами, синие ночи» вряд ли можно ис- полнить дословно, а утверждение «На этом холме отдыхал динозавр» трудновато будет проверить. Если хочешь, можно подобрать более точные формулировки этих правил, но тогда они станут и более длинными, например: Предписание — это такое предложение, к которому можно поставить вопрос: «Как его исполнить?» Впрочем, для того чтобы правильно решать задачи из этой книжки, вполне достаточно коротких формулировок. У \ Вот несколько примеров предложений раз- |5Т0Р]личных видов. Разберись, пожалуйста, где здесь во- >—/просы, где — утверждения и где — предписания. Какой он, этот слонопотам? Неужели очень злой? Идет ли он на свист? И, если идет, то зачем? Любит ли он поросят? И как он их любит? Хорошо живет на свете Винни-Пух! Позовите, пожалуйста, кота Матроскина к теле- фону. Кот Матроскин подойти к телефону не может. Он очень занят. Он на печи лежит. Во что бы то ни стало Мне надо выходить. 36
Нельзя ли у трамвала Вокзай остановить? Это что за остановка — Бологое иль Поповка? Первый закон программирования. Если ты лю- бишь читать научно-фантастическую литературу, то, конечно, помнишь, что роботы и вычисли- тельные машины понимают любое предложение буквально. Переносный смысл и намеки до них совершенно «не доходят». Вероятно, ты без труда сможешь припомнить несколько забавных, а иногда и неприятных ситуаций, возникавших из-за такой «непонятливости». Например, герой одного фанта- стического рассказа неожиданно выясняет, что ро- боты в течение трехсот лет знали решение задачи, над которой все эти годы безуспешно ломали го- ловы лучшие ученые Земли. Знали и молчали,-пото- му что их никто не догадался спросить... Наверное, ты уже понял, как ответить на вопрос, заданный в начале этого урока: почему в програм- мах для роботов и ЭВМ можно использовать толь- ко один вид предложений. Ведь программа —это задание,а любое задание нужно исполнять. Но если понимать каждое предложение букваль- но — а роботы и вычислительные машины пони- мают их именно так — то исполнить можно только предписания. Поэтому самостоятельными предложениями в языках программирования могут быть только предписания. Краткую формули- ровку этого правила мы будем называть первым за- коном программирования: Программы состоят из предписаний Утверждения и вопросы могут появляться в про- граммах только как подчиненные предложейия в со- ставе сложных предписаний. Например, роботу, ко- торый умеет выполнять арифметические действия и понимает русский язык, можно приказать: Вычислить, сколько будет дважды два. Результат отпечатать. Но бессмысленно спрашивать у него: Не знаешь ли ты, сколько будет дважды два? или сообщать ему: 37
Я хотел бы узнать, сколько будет дважды два. Он просто не будет знать, что ему с этими предло- жениями делать. Роботы умеют не все. В предыдущем параграфе упоминался робот, который понимает русский язык. Честно говоря, сегодня не существует таких робо- тов или ЭВМ, которые понимали бы какой-нибудь обычный язык полностью, то есть могли бы испол- нить любое предписание на этом языке. В бли- жайшем будущем тоже трудно ожидать появления таких понятливых машин. Нынешние вычислительные машины и роботы умеют понимать и исполнять только некоторые предписания, записанные по строгим правилам язы- ков программирования. Поэтому, если тебе понадо- билось составить программу для робота, ты снача- ла должен выяснить, какие предписания этот робот может исполнять и по каким правилам их нужно записывать. Перечень предписаний, которые понимает и умеет исполнять вычислительная машина или ро- V6ot, называется множеством предписаний (сокра- щенно — МП). В описаниях любых роботов и ЭВМ обязательно приводится их МП и перечисляются правила записи предписаний. В этой книге используются правила учебного языка программирования Робик: Д1. Каждое предписание записывается с новой строки. 2. После предписания ставится точка с запя- той. 3. Все слова в предписании пишутся прописны- ми (заглавными) буквами. 4. Если предписание не поместилось на одной строке, его можно перенести, но разрывать слова при этом нельзя и никакие знаки пере- носа не допускаются. Правило 3 обязательно только для печатных программ; если программа записывается от руки, можно писать заглавными только первые буквы предписаний. Остальные правила обязательны во всех случаях. ЗВ
Отметим, что правила расстановки знаков пре- пинания — запятых, тире, двоеточий и так далее — в предписаниях для роботов могут сильно отличаться от правил пунктуации в обычном языке. Поэтому при составлении программ нужно очень вниматель- но переписывать из МП не только все слова, но и все знаки препинания. Первая программа. А теперь попробуй выпол- нить небольшое задание. Нужно составить про- грамму для робота ДЕЖУРИК, который умеет вы- полнять обязанности дежурного по классу на перемене. Вот его МП: ЗАКРОЙ ОКНО СОТРИ с доски НАМОЧИ ТРЯПКУ ОТКРОЙ окно СЯДЬ НА МЕСТО На перемене ДЕЖУРИК должен проветрить класс и привести в порядок -доску. Сейчас он сидит рядом с тобой за партой. Урок подходит к концу. Вся доска исписана, тряпка совершенно сухая. Единственное в классе большое окно закрыто. Внимание! Звенит звонок. Робот ждет твоей программы. Попробуй составить программу сам. Здесь приведены пять программ, составленных юными программистами новосибирской школы на одном из первых занятий. Пожалуйста, сравни с ни- ми свою программу. Имей в виду, что не все про- граммы правильны! Найди среди них правиль- ные программы (если они есть) и перечисли все ошибки в остальных. Какие из этих программ робот не поймет? Какие поймет, но не сможет исполнить? Программа Миши: Открой окно. Намочи тряп- ку. Сотри с доски. Закрой окно. Сядь на место. Программа Ани: ЗАКРОЙ ОКНО; СОТРИ С ДОСКИ; НАМОЧИ ТРЯПКУ; ОТКРОЙ ОКНО; СЯДЬ НА МЕСТО; 39
Программа Наташи: ОТВОРИ ОКНО; НАМОЧИ ТРЯПКУ; ПОДМЕТИ ПОЛ; ВЫТРИ ДОСКУ; ЗАКРОЙ ОКНО; ВЕРНИСЬ НА МЕСТО; Программа Димы: ОТКРОЙ ОКНО; НАМОЧИ ТРЯПКУ; СОТРИ С ДОСКИ; ЗАКРОЙ ОКНО; СЯДЬ НА МЕСТО; Программа Толи: ОТКРОЙ ОКНО; СОТРИ С ДОСКИ; НАМОЧИ ТРЯПКУ; СЯДЬ НА МЕСТО, Решение. Робот не поймет и поэтому не смо- жет исполнить программы Миши и Наташи. Миша грубо нарушил правила записи предписаний: разме- стил в одной строке несколько предписа- ний (нарушено правило 1), в конце каждого из них вместо точки с запятой поставил точку (прави- ло 2), записал все слова строчными буквами вместо заглавных (правило 3) и, в довершение все- го, разорвал слово при переходе на новую строку и поставил знак переноса (правило 4). Словом, в одной крохотной программке он ухитрился нару- шить все четыре правила! Если же исправить эти ошибки, получится правильная программа (проверь это!). Наташа правил записи не нарушала, но полови- ну предписаний из ее программы ДЕЖУРИК не поймет и исполнить не сможет, потому что этих предписаний нет в его МП! В самом деле, предпи- сание ОТКРОЙ ОКНО есть в МП, поэтому робот его понимает и может исполнить, но предписание ОТВОРИ ОКНО ему неизвестно, и вряд ли ДЕЖУ- РИК сам догадается, что оно означает. То же самое можно сказать о предписаниях ВЫТРИ ДОСКУ и ВЕРНИСЬ НА МЕСТО. А подметать пол этот 40
робот, по-видимому, вообще не умеет: в его МП нет даже похожего предписания. Похоже, что Ната- ша писала свою программу «по памяти», совсем не заглядывая в МП. Начинающие юные програм- мисты поступают так довольно часто, но в резуль- тате обычно получаются неправильные программы. А вот Аня поступила наоборот: просто взяла и переписала все предписания из МП, не додумав- шись даже расставить их в нужном порядке. Только точки с запятой в конце добавила. Ее программу робот, конечно, поймет, но исполнить все равно не сможет: первое предписание — ЗАКРОЙ ОКНО, но ведь окно с самого начала было закрыто и закрыть его второй раз робот не сможет. Толину программу ДЕЖУРИК поймет и сможет исполнить до конца, но поведет себя при этом как очень рассеянный дежурный: откроет окно и оста- вит его открытым, сотрет с доски сухой тряпкой, так что эту программу тоже нельзя назвать пра- вильной. Правильную программу составил, Дима: текст каждого предписания в точности соответствует МП, записаны они строго по-правилам и расставлены в том порядке, в каком ДЕЖУРИК должен их выполнять. Итак, из пяти программ только одна оказалась правильной. В оправдание авторов остальных про- грамм можно сказать, что всем им было по восемь лет и это были первые в их жизни программы. Какие бывают ошибки? Вероятно, ты уже давно догадался, что четыре программы с ошибками по- пали в эту книгу не случайно. На этих примерах мы, познакомимся с основными типами ошибок, ко- торые встречаются в программах. Тебя, может быть, удивляет, что мы так много говорим об ошибках вместо того, чтобы заняться правильными программами. Дело -в том, что уме- ние быстро найти и исправить ошибки — одно из самых важных для программиста. В программиро- вании, как и в любой другой работе, не ошибается только тот, кто ничего не- делает. Считается, что опытный программист допускает, в среднем, одну ошибку на десять предписаний, а начинающий — го- раздо больше’, в чем ты только что убедился. По- этому, изучая программирование, нужно с самого 41
начала учиться не только составлять правильные программы, но и исправлять ошибки в непра- вильных программах. Для начала перечислим ос- новные типы таких ошибок: 1. Нарушение общих правил записи предписа- ний (программа Миши). 2. Использование предписаний, которых нет в МП (Наташа). 3. Программу невозможно выполнить, хотя каждое отдельное предписание записано правильно (Аня). 4. Программу можно исполнить, но она не со- ответствует заданию (Толя). Из школьного курса грамматики ты должен по- мнить, что правила записи предложений называют -----синтаксисом языка, поэтому ошибки первых двух Vтипов принято называть синтаксическими. Ошибки третьего и четвертого типов связаны не с синтакси- сом, а со смыслом предписаний. Поиск ошибок в сложной программе больше всего напо- минает работу Шерлока Холмса над запутанным делом или охо- ту на очень хитрого зверя. Программист по крупицам собирает «улики», выдвигает различные версии появления ошибки и орга- низует для их проверки «следственные» эксперименты, он под- страивает ошибкам ловушку за ловушкой, устраивает на них облавы, идет «по следам», выявляет подозрительные предписа- ния и придумывает для них проверки... Впрочем, все это тебе еще предстоит. Исполнители и второй закон программирования. Составляя и проверяя программы для ДЕЖУРИКа, мы совершенно не интересовались тем, как этот ро- бот выглядит, как он устроен, каким образом сти- рает с доски или открывает окно. Это может быть, например, симпатичный робот, изображенный на рис. 13. Впрочем, ДЕЖУРИК вполне может ока- заться и тяжеловесным сооружением на многоко- лесном шасси, напоминающем гибрид Лунохода и подъемного крана (рис. 14). Нам безразлично, как он выглядит, нам нужно знать только, какие пред- писания он может исполнять. И вообще, при соста- влении любой программы нам не обязательно знать, что (или кто) будет ее выполнять. Единствен- 42
Рис. 13. Робот ДЕЖУ РИК мог бы выглядеть так... ное, что нам нужно знать — это множество предпи- саний, которые понимает и умеет выполнять испол- нитель нашей программы. На следующих уроках мы не будем интересо- ваться устройством роботов или машин, исполняю- щих наши программы. Каждый раз мы будем гово- рить просто об исполнителе, для которого известног—7 множество предписаний исполнителя (сокращенно — \ / МПИ). v Возможно, исполнителем будет настоящий ро- бот, расхаживающий или разъезжающий по классу. Может быть, исполнителем окажется вычислитель- ная машина, воспроизводящая все действия робо- та на экране телевизора. Наконец, человек, прове- ряющий программу, может исполнить ее за робота (мысленно или по-настоящему). Тогда он сам ста- нет исполнителем. Правда, для этого он должен ве- сти себя в точности как робот и делать вид, что он не понимает смысла тех предписаний, которых нет в МПИ. Выполняя предыдущее задание и разбираясь с ошибками юных программистов, ты, наверное, уже понял, что в программе для любого исполните- ля можно употреблять те и только те предписания, которые входят в его МПИ. Разумеется, синтаксис всех предписаний в программе должен быть точно таким же, как в МПИ.. Нельзя менять ни единой буквы, ни одного знака препинания. И, конечно же, надо соблюдать общие правила записи предписа- 43
ний. Это правило мы и назовем вторым законом программирования: ДВ программе для любого исполнителя можно употреблять те и только те предписания, ко- торые записаны в его МПИ, в точности сохра- няя их синтаксис и соблюдая общие правила используемого языка программирования. Итак, на первом уроке ты познакомился с ос- новными законами программирования и с правила- ми записи программ на языке Робик, узнал, что та- кое исполнитель и его МПИ, выяснил, какие ошибки встречаются в программах. А сейчас — нем- ного отдохни. Первая перемена Твое рабочее место В промежутке между уроками познако- мимся поближе с твоим рабочим местом (как ты помнишь, мы договорились, что ты сидишь в вы- числительном кабинете). На столе перед тобой вы- числительная машина Агат. Рядом с ней обычный цветной телевизор, который может работать как универсальный терминал: на его экран машина мо- жет выдавать и текстовые сообщения, и рисунки. В небольшом корпусе машины, напоминающем по форме переносной магнитофон, размещаются: процессор, оперативное запоминающее устройство, маленький динамик и дисковод для гибких дисков (долговременное запоминающее устройство). К ма- шине постоянно подключены телевизор и клавиату- ра. Можно присоединить к ней и другую технику, например магнитофон или печатающее устройство. Клавиатура ЭВМ Агат почти такая же, как у пишу- щих машинок, но кроме букв русского алфавита на ней есть и латинские буквы (рис. 15). Длинная кла- виша в нижней части клавиатуры позволяет оста- влять промежутки (пробелы) между словами.'Для перехода на новую строчку предназначена клави- ша |-*1 , расположенная справа вверху. 44
Рис. 15. Клавиатура ЭВМ Агат
Когда машина выключена, клавиатуру можно надеть, как крышку, на переднюю стенку ее кор- пуса. Перемена подходит к концу. Пора приготовить- ся к лабораторной работе. Прежде чем включать машину, нужно вставить в дисковод гибкий диск с основными программами системы Школьница. Второй урок Диалог с исполнителем ДЕЖУРИК (Лабораторная работа) Первое задание нашей лабораторной работы — набрать на клавиатуре программу для ро- бота ДЕЖУРИК и проследить за ее исполнением. Вообрази, что робот сидит рядом с тобой за пар- той. Обстановка в классе примерно такая, какая бы- ла описана в задании на с. 39: вся доска исписана, тряпка сухая, вот только окно не закрыто. Перед тобой лежит листок бумаги с Диминой програм- мой. Ты поворачиваешь выключатель. Слышится тихий шелест и пощелкивание — это заработал ди- сковод. Экран телевизора слегка светлеет и на нем появляются слова: Пожалуйста, назовите себя! ? Вопросительный знак, изображенный машиной на следующей строке, означает, что она ждет отве- та на свой вопрос. Ты набираешь ответ: Юный программист — и нажимаешь клавишу перевода строки. Ответ машины появляется на экране мгновенно: Здравствуйте, юный программист? Я система "Школьница" Жду предписаний * На этот раз машина изобразила на новой строке звездочку. Это означает, что она ждет от тебя пред- писание и готова его исполнить. Для начала вклю- чим нужного исполнителя (не забудь, Что все пред- писания нужно набирать прописными буквами): 46
ВКЛЮЧИТЬ ИСПОЛНИТЕЛЯ ДЕЖУРИК; опять перевод строки и опять на экране появляется ответ машины: Исполнитель ДЕЖУРИК включен! ♦ Со стороны робота слышно легкое гудение: ма- шина его включила. Ну что ж, начинаем набирать программу: ОТКРОЙ ОККО; Робот не трогается с места, а на экране появля- ется сообщение системы: Не понимаю! ♦ В чем дело? Ах да, ты ведь набрал ОККО вместо ОКНО. Повторяешь сначала: открой окно Перевод строки — и... никакой реакции. Впрочем, все правильно: ты не набрал точку с запятой, и си- стема считает, что предписание еще не закончено*. Набери «;» на следующей строке: Робот поднимается с места, идет к окну и... за- стывает неподвижно, а на экране появляются слова: Не могу! ♦ Вероятно, ты уже понял, в чем дело. Если не по- нял, можешь набрать предписание ПОЯСНИ ОШИБКУ; и ответ машины не заставит себя долго ждать: Окно открыто! * Вот теперь все ясно! Конечно же, Димина про- грамма, правильная в одной ситуации, не подходит в другой. Нужно было просто вычеркнуть из нее первое предписание. Ну что ж, на ошибках учатся. Продолжим: СОТРИ С ДОСКИ; 47
Робот подходит к доске, берет тряпку... Стоп! А тряпка-то сухая! Ты набрал не то предписание! Пока робот водит по доске сухой тряпкой, попро- буем исправить ошибку: НАМОЧИ ТРЯПКУ; Машина реагирует молниеносно: Не мешай! д — и робот продолжает свою бессмысленную рабо- /у\ ту. Все верно: звездочки на экране не было и сейчас 2_=Аее тоже нет. Система не готова принимать новое предписание, пока не исполнено предыдущее. Оста- новить ее можно только специальным приказом: СТОП; — робот застыл с тряпкой в руке, а на экране воз- никает новый текст: Работа программы прервана! Исполнялось предписание СОТРИ С ДОСКИ * Теперь звездочка есть, и мы имеем полное право набирать то самое предписание, с которого и надо было начинать: НАМОЧИ ТРЯПКУ; Робот бежит к умывальнику и вскоре возвра- щается с мокрой тряпкой в руках. На экране возни- кает звездочка. СОТРИ С ДОСКИ; Робот бодро исполняет предписание. Снова звез- дочка! ЗАКРОЙ ОКНО; СЯДЬ НА МЕСТО; * На книжной странице текст очередного предпи- сания мы напечатали под звездочкой. На самом де- ле он набирается на той же строке. То же можно сказать о вопросительном знаке и других «пригла- шениях» машины. Поэтому после исполнения про- граммы нижние строки экрана будут выглядеть так: 48
♦ СОТРИ С ДОСКИ; ♦ ЗАКРОЙ ОКНО; ♦ СЯДЬ НА МЕСТО; Наберем теперь следующее предписание, последнее: ♦ ВЫКЛЮЧИТЬ ИСПОЛНИТЕЛЯ ДЕЖУРИК; Гудение механизмов робота затихает, и на экра- не появляется новый текст: Исполнитель ДЕЖУРИК выключен! Множество предписаний системы Школьница. А теперь посмотри на протокол диалога, остав- шийся на экране твоего телевизора и на бумаге пе- чатающего устройства. Вот он: Пожалуйста, назовите себя! ? Юный программист Здравствуйте, юный программист! Я система "Школьница" Жду предписаний ♦ ВКЛЮЧИТЬ ИСПОЛНИТЕЛЯ ДЕЖУРИК; Исполнитель ДЕЖУРИК включен! ♦ ОТКРОЙ ОККО; Не понимаю! ♦ ОТКРОЙ окно Не могу! ♦ ПОЯСНИ ОШИБКУ; Окно открыто! ♦ СОТРИ С ДОСКИ; НАМОЧИ ТРЯПКУ; Не мешай! СТОП; Работа программы прервана! Исполнялось предписание СОТРИ С ДОСКИ ♦ НАМОЧИ ТРЯПКУ; ♦ СОТРИ С ДОСКИ; ♦ ЗАКРОЙ ОКНО; ♦ СЯДЬ НА МЕСТО; ♦ ВЫКЛЮЧИТЬ ИСПОЛНИТЕЛЯ ДЕЖУРИК; Исполнитель ДЕЖУРИК выключен! Некоторые особенности поведения машийы во время диалога нуждаются в пояснениях. Во-первых, мы использовали несколько предписаний, которых не было в МПИ нашего робота. Вот они: 49
ВКЛЮЧИТЬ ИСПОЛНИТЕЛЯ ДЕЖУРИК ВЫКЛЮЧИТЬ ИСПОЛНИТЕЛЯ ДЕЖУРИК ПОЯСНИ ОШИБКУ стоп Не нарушен ли здесь второй закон программи- рования? Оказывается, нет: перечисленные предпи- сания входят в МП самой системы Школьница и их можно использовать во время работы с любым ис- полнителем. С другими предписаниями этой си- стемы ты познакомишься позже. Обрати внимание на форму предписаний. Кроме глаголов повелительного наклонения (СОТРИ, СЯДЬ) в них используют- ся глаголы в неопределенной форме (ВКЛЮЧИТЬ, ВЫКЛЮ- ЧИТЬ) и даже междометия (СТОП). Ты еще встретишься с предписаниями, которые выражены наречиями (ВВЕРХ, ВНИЗ и т. д.) и даже просто существительными в именительном паде- же (иногда даже сокращенными). Ничего странного в этом нет: такие предписания короче, их легче запоминать и быстрее наби- рать. А машину грамматическая форма интересует мало: для нее предписание — это предложение, которое есть в МПИ. Впрочем, и в русском языке есть подобные предписания: На старт! Внимание! Марш! Во время диалога ты уже, вероятно, понял, как реагирует система на различные ошибки. Синтакси- ческие ошибки вызывают сообщение НЕ ПОНИМАЮ! а смысловые — сообщение НЕ МОГУ! В обоих случаях ты можешь получить более подробное пояснение, воспользовавшись предписа- нием ПОЯСНИ ОШИБКУ. Но... не стоит делать это слишком часто — лучше попробовать самому разобраться, в чем состояла ошибка. Кстати, систе- ма регистрирует каждое обращение за помощью и сообщает преподавателю о тех ошибках, с ко- торыми ты не смог справиться сам. Наверное, тебе уже понятен смысл «приглаше- ний к диалогу» — значков, которые появляются' на экране в начале очередной строки: ? — означает, что машина задала вопрос и ждет ответа на него. * — машина ждет от тебя предписания. so
Внимание! Набирать предписание можно только после появления на экране звездочки! Предписание СТОП — единственное исключение. Вторая перемена МУРАВЕЙ и МАШИНИСТ Пока машина отдыхает, познакомимся с двумя исполнителями, с которыми тебе еще не раз предстоит встретиться в этой книге. Первый из них — МУРАВЕЙ. Он может ползать по клетчатой доске (обычно 10 на 10 клеток) и передвигать по ней кубики с различными надписями или ри- сунками. За один «ход» МУРА ВЕЙ сдвигается на одну клетку вверх, вниз, вправо или влево (но не по диагонали!). Если он наты- кается на кубик или на не- сколько кубиков, он будет толкать их перед собой, пока не изменит направление движения или не уп- рется в край доски. Считается, что края доски ограждены борти, ками; попытка толкать кубики Рис. 16. Начальная об- становка для исполнителя МУРАВЕЙ дальше вызывает сообщение об ошибке. За движениями исполнителя МУРАВЕЙ можно следить на экране телевизора. МПИ исполнителя МУРАВЕЙ: ВВЕРХ вниз ВПРАВО ВЛЕВО Если кубики на доске были расположены в виде буквы П (рис. 16), то после исполнения программы ВЛЕВО; ВНИЗ; ВНИЗ; ВВЕРХ; ВВЕРХ; ВПРАВО;
она превратится в Н, а МУРАВЕЙ возвратится на прежнее место. Исполнитель МАШИНИСТ управляет неболь- шим маневровым локомотивом, который сортирует вагоны и составляет поезда на товарной станции. Форма путей, на которых ему приходится работать, может быть различной. На рис. 17 изображена одна Рис. 17. Начальная обстановка для исполнителя МАШИНИСТ из простейших конфигураций с тремя путями (А, Б, В) и одной стрелкой (1). В отличие от предыдущего исполнителя, МАШИНИСТ может не только тол- кать, но и тянуть за собой вагоны, зато двигаться он может только в двух направлениях — вперед или назад. Вот его МПИ: ВПЕРЕД НАЗАД ПЕРЕВЕСТИ СТРЕЛКУ ПРИЦЕПИТЬ ВАГОН ОТЦЕПИТЬ ВАГОН Выполняя предписание ВПЕРЕД или НАЗАД, МАШИНИСТ будет двигаться до тех пор, пока не наткнется на тупик, вагон или стрелку, на которой можно выбрать направление движения. Предписание ПРИЦЕПИТЬ ВАГОН позволяет МАШИНИСТУ прицепить один вагон к своему локомотиву или добавить один вагон к тем, ко- торые уже были к нему прицеплены. Точно так же предписание ОТЦЕПИТЬ ВАГОН позволяет отце- пить один, самый дальний от локомотива вагон (впрочем, в тех редких случаях, когда вагоны прице- плены и спереди, и сзади, по этому предписанию будут отцеплены два вагона — по одному с каждой стороны). Прежде чем прицепить вагон, к нему, ко- нечно, нужно подъехать вплотную. Каждая стрелка перед локомотивом в обычном положении указывает* один какой-то путь (на рисун- 52
ке он отмечен сплошной линией). Чтобы проехать по ней на другой путь, нужно ее перевести. Сразу же после прохода поезда (локомотива) стрелка воз- вращается в прежнее положение! Двигаясь в обрат- ном направлении, локомотив проходит стрелку не останавливаясь, так как выбирать направление в этом случае не приходится. Например, чтобы перевести локомотив с пути-Б на путь А, нужно вы- полнить три предписания: ВПЕРЕД; ПЕРЕВЕСТИ СТРЕЛКУ; ВПЕРЕД; Выполнив первое предписание, локомотив оста- новится на стрелке, которая показывает йа путь В (рис. 18, а). После перевода стрелки можно вновь двигаться вперед, на этот раз локомотив остановит- ся, подъехав вплотную к вагонам. Рис. 18 53
Чтобы попасть с Б на В, достаточно двух предписаний: ВПЕРЕД; ВПЕРЕД; А для возвращения на путь Б с любого из остальных путей, независимо от положения стрел- ки, достаточно одного предписания НАЗАД; Пример программы. Пусть на пути А стоят три вагона: крытый грузовой вагон, ци- стерна и платформа (см. рис. 17). Необходимо пере- вести цистерну на путь В, а платформу (вместе с локомотивом) на путь Б- Это можно сделать, на- пример, так (справа от предписаний указаны номе- ра рисунков, на которых показаны положения локо- мотива и вагонов после исполнения этих предписа- ний) : ВПЕРЕД; ПЕРЕВЕСТИ СТРЕЛКУ; ВПЕРЕД; ПРИЦЕПИТЬ ВАГОН; ПРИЦЕПИТЬ ВАГОН; (рис. 18, б) НАЗАД; (рис. 18, в) ВПЕРЕД; ВПЕРЕД; ОТЦЕПИТЬ ВАГОН; (рис. 18, г) НАЗАД; (рис. 18, б) @А теперь попробуй составить несколько про- грамм для исполнителей МУРАВЕЙ й МАШИ- НИСТ. 1. МУРАВЕЙ находится на клетке с коорди- натами (3, 2) (рис. 19). На какой клетке он ока- жется после исполнения про- граммы ВВЕРХ; ВВЕРХ; ВВЕРХ; ВПРАВО; ВПРАВО; ВНИЗ; ВНИЗ; ВНИЗ; 54
Зарисуй путь исполнителя. Какая буква получи- лась? 2. Составь программу для перевода исполнителя МУРАВЕЙ с клетки (2, 4) на клетку (8, 6) (рис. 20) по пути, изображенному сплошной стрелкой. По пути, изображенному штриховой стрелкой. По самому ко- роткому пути. 3. МУРАВЕЙ находится на клетке с координатами (5, 5). Составь такую про- грамму, чтобы его путь был похож на букву П. На букву О. На какую-нибудь другую букву по твоему выбору. 4. На рис. 21 показана часть и положение исполнителя МУРА становку на этой части до- ски после исполнения та- ДОС1 ВЕР ки с 1 3; ку( арис >ика уй ( ми эб- кой программы. RRFPX- 019131 ZX , ВПРАВО; ГЪ Г“Т ТЧ А _____ ВПРАВО; ВНИЗ; [||^ ВНИЗ; ВЛЕВО; ВЛЕВО; ВВЕРХ; Рис . 21 5. На рис. 22 буквы на кубиках составляют сло- во КРАБ. Зарисуй положение кубиков после испол- нения программы ВВЕРХ; ВВЕРХ; ВЛЕВО; ВВЕРХ; ВПРАВО; ВПРАВО; ВПРАВО; ВВЕРХ; ВПРАВО; ВНИЗ; Какое слово получилось? 55
б. В условиях предыдущей задачи получить из слова КРАБ слова: БРА, БРАК, БАРК (барк — это тип парусного вооружения на корабле). 7. На пути А стоят: цистерна и крытый вагон (рис. 23). Зарисуй положение вагонов и локомотива после исполнения такой программы: Рис. 23 ВПЕРЕД; ВПЕРЕД; ПРИЦЕПИТЬ ВАГОН; НАЗАД; ВПЕРЕД; ПЕРЕВЕСТИ СТРЕЛКУ; ВПЕРЕД; ОТЦЕПИТЬ ВАГОН; НАЗАД; ВПЕРЕД; ВПЕРЕД; ПРИЦЕПИТЬ ВАГОН; НАЗАД; ВПЕРЕД; ПЕРЕВЕСТИ СТРЕЛКУ; ВПЕРЕД; ПРИЦЕПИТЬ ВАГОН; НАЗАД; ВПЕРЕД; ВПЕРЕД; ОТЦЕПИТЬ ВАГОН; ОТЦЕПИТЬ ВАГОН; НАЗАД; 8. На пути А стоят: крытый вагон, цистерна и платформа (рис. 17). Перевести их на путь В, со- хранив тот же порядок (рис. 24). Рис. 24 56
9. В условиях предыдущей задачи поменять ме- стами вагоны на пути А (поставить у тупика плат- форму, затем цистерну и затем — крытый вагон). Ответы. 1. МУРАВЕЙ окажется на клетке (5, 2). Его путь будет напоминать букву П. 2. Программа для пути, показанного сплошной стрелкой. ВВЕРХ; ВВЕРХ; ВВЕРХ; ВПРАВО; ВПРАВО; ВНИЗ; ВНИЗ; ВНИЗ; ВПРАВО; ВПРАВО; ВВЕРХ; ВВЕРХ; ВВЕРХ; ВПРАВО; ВПРАВО; ВНИЗ; 3. Для буквы П программа приведена в задаче 1. Впрочем, эту букву можно было изобразить раз- ными способами, так что твоя программа могла выглядеть и по-другому. 4. Положение на доске показано на рис. 25. 5. Получилось слово РАК. 7. Вагоны на пути А поменяются местами, а ло- комотив вернется на путь Б. 57
8. ВПЕРЕД; ПЕРЕВЕСТИ СТРЕЛКУ; ВПЕРЕД; Локомотив подъехал к вагонам ПРИЦЕПИТЬ ВАГОН; ПРИЦЕПИТЬ ВАГОН; ПРИЦЕПИТЬ ВАГОН; Прицепили все вагоны НАЗАД; ВПЕРЕД; ВПЕРЕД; Весь состав оказался на пути В ОТЦЕПИТЬ ВАГОН; ОТЦЕПИТЬ ВАГОН; ОТЦЕПИТЬ ВАГОН; Вагоны остаются на пути В НАЗАД; Локомотив вернулся на путь Б Пояснения, записанные в этой программе справа от предписаний, называются комментариями. О них мы поговорим на следующем уроке. 9. Указание. Можно перевести весь состав на путь В (задача 8), а затем возвращать вагоны на путь А по одному. Можно и наоборот: по одному перебросить вагоны на В, а затем вернуть обратно все вместе. Обрати внимание: если с одного пути на другой переводится состав из нескольких сцеп- ленных друг с другом вагонов, то порядок вагонов сохраняется. Если вагоны перебрасывать по одно- му, порядок меняется на обратный. Это наблюде- ние тебе пригодится при работе с текстами. А теперь перейдем к практическому занятию по составлению программ. Третий урок Как составлять программы (Практическое занятие) План. Попробуем решить такую зада- чу. Поменять местами три вагона, стоящие на пути А, если путь В — это маленький тупик, в котором может поместиться не больше одного вагона (рис. 26). Решать эту задачу можно, конечно, по-разному. Можно, например, рассуждать так. Если бы в тупике В помещалось хотя бы два ва- гона, то эта задача решалась бы точно так же, как 58
задача 9 из второй перемены (проверь это!). Но по- мещается только один вагон, значит, поменять ме- стами сразу три вагона мы не сможем. А вот два Рис. 26 вагона, наверное, можно поменять местами и с по- мощью короткого тупика. Попробуем, например, поменять местами крытый вагон и цистерну (точнее говоря, левый вагон со средним: от замены типа ва- гонов программа никак не изменится). Не будем пока составлять программу, просто прикинем, можно ли это сделать. Нарисуй начальную обста- новку на листе бумаги (если тебе трудно предста- вить себе все передвижения вагонов и локомотива, можно вместо нарисованных вагонов положить, на- пример, резинки и двигать их по рисунку). Подво- дим локомотив к вагонам, цепляем их все и перево- дим состав на путь Б. Теперь попробуем «втолк- нуть» вагоны в тупик В. Там помещается только крытый вагон. Оставим его там и вернем остальные на путь'А. Теперь цистерна стоит на нужном месте: возле тупика. Но рядом с ней должен быть крытый вагон, а стоит платформа. Впрочем, теперь уже видно, как поставить на место и крытый вагон: переводим платформу на путь Б, цепляем к ней крытый вагон и перегоняем получившийся состав обратно на А. Итак, менять местами два соседних вагона мы умеем (проверь это на другой паре вагонов). Мож- но ли при помощи таких перестановок решить зада- чу полностью? Убедись, что для этого хватит трех таких перестановок: можно, например, поменять левый вагон со средним (то есть крытый с цистер- ной), затем средний с правым (крытый с платфор- мой) и, наконец, снова левый со средним (то есть цистерну с платформой). (Нельзя ли решить эту за- дачу короче? Подумай!) Если бы МАШИНИСТ умел исполнять предпи- сание ПОМЕНЯТЬ МЕСТАМИ ВАГОНЫ (с указа- нием положения вагонов, которые нужно переста- 59
вить), то программа для решения нашей задачи могла бы выглядеть так: ПОМЕНЯТЬ МЕСТАМИ СРЕДНИЙ И ЛЕВЫЙ ВАГОНЫ; ПОМЕНЯТЬ МЕСТАМИ ПРАВЫЙ И СРЕДНИЙ ВАГОНЫ; ПОМЕНЯТЬ МЕСТАМИ СРЕДНИЙ И ЛЕВЫЙ ВАГОНЫ; Эти три предписания позволяют решить поста- вленную задачу — поменять местами все три ваго- на. Но назвать этот текст программой нельзя: ни одного из предписаний нет в МПИ МАШИНИСТа. VH все-таки эта цепочка предписаний будет для нас очень полезна: ведь это план программы. Любое серьезное и сложное дело-в том числе, ко- нечно, написание программы-нужно начинать с со- ____ставления плана. Собственно, программа — это тоже план, только записанный в строгом соответствии со вторым за- ----коном программирования и с правилами выбранно- го языка. Но вообще-то- планы обычно предназна- чаются для людей, а не для ЭВМ, поэтому соблю- дать второй закон программирования при их составлении не обязательно. Нужно только, чтобы все предписания были понятными и точными, чтобы в них не было никаких двусмысленностей и чтобы после выполнения любого из них было по- нятно, какое предписание выполнять следующим. Записывать планы, предназначенные для людей, можно по-разному. В этой книге мы будем записы- вать их по тем же правилам, что и программы. От плана-к программе. Чтобы перейти от плана к программе, нужно вместо каждого пункта плана записать последовательность предписаний, взятых из МПИ нужного исполнителя. Для сложных про- грамм это не всегда удается сделать сразу: часто приходится начинать с замены одного плана дру- гим, более подробным. Например, последователь- ность предписаний для исполнения первого пункта плана, приведенного выше, может выглядеть так: Подвести локомотив к вагонам; Прицепить все вагоны; Перевести на путь Б; Оставить левый вагон в тупике; 60
Перевести остальные вагоны на путь А; Оставить там средний вагон; Правый вагон — на путь Б; Прицепить к нему левый вагон; Вернуть оба на путь А; Поставить на место локомотив; Как видишь, это еще не программа, а просто бо- лее подробный план. Такие планы часто называют уточняющими, а план для решения всей задачи — общим. Теперь уже совсем нетрудно превратить уточняющий план в программу: ВПЕРЕД; Подводим локомотив к вагонам ВПЕРЕД; ПРИЦЕПИТЬ ВАГОН; Цепляем все вагоны. ПРИЦЕПИТЬ ВАГОН; ПРИЦЕПИТЬ ВАГОН; НАЗАД; Перевели на путь Б ВПЕРЕД; Оставляем левый вагон в тупике ПЕРЕВЕСТИ СТРЕЛКУ; ВПЕРЕД; ОТЦЕПИТЬ ВАГОН; НАЗАД; Переводим остальные вагоны на путь А ВПЕРЕД; ВПЕРЕД; ОТЦЕПИТЬ ВАГОН; Оставляем средний вагон на ; пути А НАЗАД; Правый вагон - на путь Б ВПЕРЕД; ПЕРЕВЕСТИ СТРЕЛКУ; ВПЕРЕД; ПРИЦЕПИТЬ ВАГОН; Цепляем к нему левый вагон НАЗАД; Возвращаем оба вагона на путь А ВПЕРЕД; ВПЕРЕД; ОТЦЕПИТЬ ВАГОН; ОТЦЕПИТЬ ВАГОН; НАЗАД; Ставим локомотив на место Вероятно, теперь тебе будет нетрудно составить уточняющий план для следующего пункта общего плана и написать по нему программу. Третий пункт в точности совпадает с первым, поэтому новую программу для него писать незачем — достаточно переписать дословно ту, которая только что была здесь напечатана. 61
Большая получилась программа. И не исключе- но, что, решая эту задачу и выписывая бесконечные ВПЕРЕД — НАЗАД, ты не раз подумал: «Неужели программирование — такое нудное занятие? А еще говорили, что машина освобождает нас от одно- образного труда!». Что ж, составление таких про- грамм — дело и впрямь довольно однообразное. Но очень скоро ты познакомишься с предписаниями языка* Робик, позволяющими передать машине всю «нудную» часть работы. Ты сможешь добавлять новые предписания к МПИ, «объяснив» системе, что ПРИЦЕПИТЬ 5 ВАГОНОВ — значит повто- рить 5 раз предписание ПРИЦЕПИТЬ ВАГОН; а ПОМЕНЯТЬ МЕСТАМИ СРЕДНИЙ И ЛЕВЫЙ ВАГОНЫ — значит сделать то-то и то-то. А пока приходится терпеть. Несколько слов о комментариях. В программах этого урока и в ответах к заданиям предыдущей перемены мы часто использовали комментарии: справа от предписания, после точки с запятой, за- писывали какой-то текст, поясняющий выполнение программы. Правила записи предписаний это по- зволяют: с точки зрения системы, предписание за- канчивается точкой с запятой, и то, что написано справа от нее, машину не интересует. Удобнее всего использовать в качестве комментариев отдельные пункты уточняющего плана — тогда программу лег- че составлять и читать. Тебя может удивить, что, составляя такую длин- ную программу, мы добавили к ней еще и коммен- тарии, так что общее количество слов возросло чуть ли не вдвое! Но программисты хорошо знают, что чем длиннее программа, тем нужнее в ней комментарии. Хороший комментарий — это мостик между пла- ном и программой, важнейший ориентир в лаби- ринтах предписаний, похожих друг на друга. При составлении программы он позволяет следить за тем, какой пункт плана превращается сейчас в про- грамму. Без такого ориентира мы рискуем сбиться со счета уже на десятом ВПЕРЕД. Если ты решил изменить план, комментарий позволит сразу найти в программе те участки, которые нужно при этом менять. Наконец, комментарий помогает разо- браться в чужой программе (да и в своей тоже). 62
Поэтому постарайся сразу приучить себя писать программы с подробными и точными комментария- ми. Помни, что твои программы должны быть по- нятны не только машинам, но и людям. Что входит в условие задачи по программирова- нию? Приступая к решению любой задачи, нужно сначала прочитать условие и разобраться в том, что дано и что требуется сделать. Впрочем, в задачах по программированию почти всегда требуется одно и то же - составить програм- му. Посмотрим, что же должно быть дано в таких задачах. Прежде всего, конечно, должен быть задан язык программирования, на котором нужно составить программу. В этой книге используется язык Робик, с общими правилами которого ты уже знаком. Иногда бывает задан не один язык, а набор языков, из которого программист должен выбрать наиболее подходящий. Кроме того, нужно знать МП испол- нителя, для которого составляется программа, или нескольких исполнителей. Но это не все! Решая задачи из этой главы, ты уже обратил внимание, что каждый исполнитель работает в определенной среде. Среда состоит из тех предметов, с которыми исполнитель можетГ 7 что-то делать во время исполнения програм- \ / мы и которые могут как-то повлиять на резуль- v тат ее исполнения. Для ДЕЖУРИКа средой был класс (точнее говоря, окно, тряпка и доска, осталь- ные предметы в классе и присутствующие там люди этого робота никак не интересовали). Сре- да для исполнителя МУРАВЕЙ — это клетчатая доска, для МАШИНИСТа — железнодорожные пу- ти. Если к системе Школьница не подключены ника- кие исполнители, у нее все равно есть своя среда: экран телевизора, бумага печатающего устройства, лента магнитофона, оперативное запоминающее устройство, клавиатура, гибкий даек. Работа исполнителя всегда начинается с какой- г 7 то начальной обстановки. Это может быть, напри- \/ мер, расположение кубиков на доске или вагонов на V путях. Не зная начальной обстановки, составлять программу, конечно, нельзя. Поэтому в условии за- дачи она обязательно должна быть задана. Бывает и так, что программа должна работать в несколь- 63
ких возможных обстановках — тогда все они дол? жны быть перечислены в условии. Работая по твоей программе, исполнитель будет как-то менять обстановку: проветривать класс, передвигать кубики на доске, выдавать сообщения на экран, вычерчивать рисунок на бумаге. Обычно цель его работы состоит в том, чтобы получить ка- кую-то конечную обстановку: расставить кубики определенным образом, нарисовать заданный рису- нок, выдать на экран результаты расчета и т. д. Ко- нечно, сам исполнитель об этой цели ничего не знает — он просто исполняет программу. А вот про- граммист, который эту программу составляет, обя- зательно должен знать цель — иначе и программу составлять незачем. Конечная обстановка не всегда известна заранее. Иногда в условии задачи указываются только тре- бования к ней. Например, расставить кубики так, чтобы получилось название породы собак, или переставить вагоны так, чтобы два одинаковых ва- гона не стояли рядом. Разумеется, в условиях программистских задач часто встречаются и какие-то дополнительные тре- бования к программам. Например, составить са- мую короткую программу для решения задачи или такую программу, которая работает -не больше двух минут. Но сейчас нас интересуют только обя- зательные элементы условия. Итак, условие задачи на составление программы должно включать: 1. Язык программирования, на котором нужно составлять программу, или список языков, из ко- торых можно выбирать. 2. Список исполнителей и МП каждого из ис- полнителей. 3. Описание среды для каждого исполнителя. 4. Описание начальной обстановки. 5. Требования к конечной обстановке, то есть цель составления программы. Конечно, не обязательно все это перечислять в условиях каждой задачи. Некоторые части усло- вия могут просто подразумеваться, как язык Робик или среда для системы Школьница в этой книге. Но программист всегда должен знать, что подразуме- вается, а что нужно задавать каждый раз.
Полезные советы (с чего начинать решение задачи и что делать дальше) Как составлять программу? В простей- ших случаях, когда нужная последовательность предписаний очевидна сразу, остается только вы- брать предписания из МПИ, расположить их в том порядке, в котором они будут исполняться, и на- брать на клавиатуре, не нарушая общих правил языка Робик. Впрочем, как видно из примеров, при- веденных на с. 39 — 40, начинающим программистам это удается далеко не всегда. А как быть, если нужная цепочка предписаний с первого взгляда не видна? Тогда попытайся соста- вить план из «укрупненных» предписаний, как это только что было сделано в задаче о перестановке вагонов. Для каждого пункта общего плана соста- вляется уточняющий план, затем уточняются все его пункты — и так до тех пор, пока не получится программа, в которой каждое предписание взято из МПИ. Такой прием позволяет р а з б и т ь боль- шую задачу на части — это особенно важно в крупных программах. Впрочем, это легко сказать: «Составить план». Ведь сделать это — значит решить задачу больше, чем наполовину! Составление плана — самый трудный, но зато и самый интересный этап решения любой программистской задачи. И здес$> невозмож- но привести какой-то универсальный рецепт, ко- торый позволил бы тебе без всяких размышлений составлять любые планы. Можно привести только самые общие рекомендации, которые помогут в трудных случаях. Если записать план сразу не удается, попробуй повозиться с задачей вручную: изобрази начальную обстановку на листе бумаги или даже сделай про- стейшую модель и постарайся подобрать нужный порядок действий, перебирая всевозможные ва- рианты. Как только получится нужная конечная обста- новка — постарайся записать найденный путь реше- ния в виде плана. Теперь нужно составить уточняю- щий план для каждого пункта и так далее. 3 Г. А. Звенигородский 65
Можно порекомендовать и такой прием: попро- буй придумать МПИ, в котором нужную програм- му было бы легко составить. Если это, получается — составь программу, используя предписания из тако- го МПИ. Полученную программу можно считать планом и дальше уточнять его в обычном порядке. Впрочем, если план составлен, не торопись сразу его уточнять. Всегда нужно сначала проверить, пра- вильно ли он составлен. Для этого попробуй вы- полнить его вручную (мысленно или, лучше, на бу- маге) от начала и до конца. Еще лучше, если это проделает кто-то из твоих друзей: как показывает практика, тот, кто участвовал в составлении плана или программы, допускает при их проверке больше ошибок, чем человек посторонний. Если выяснилось, что план составлен правильно, посмотри, нельзя ли его улучшить. Может быть, есть более простой путь решения, который позво- лит получить более короткую программу? Лучше уж повозиться лишних 10 минут с планом, чем пы- таться потом переделать программу длиной в не- сколько страниц. Между прочим, мы этого не сде- лали, составляя программу перестановки ваго- нов, — и напрасно! Для этой задачи можно подо- брать короткий общий план и получить программу ____в полтора раза короче! Если ты не заметил этого |до сих пор — вернись, пожалуйста, к началу этого урока и попробуй подобрать такой план. Но вот программа готова. Теперь ее нужно про- верить: ты вполне мог где-то ошибиться. Прове- рить синтаксис программы несложно: достаточно сравнить каждое предписание с МПИ и посмотреть, не нарушены ли где-нибудь правила языка. Смысл проверить сложнее. Один из самых распростра- ненных способов проверки программ и планов — Vручная прокрутка: ты вооружаешься карандашом и бумагой, снова рисуешь начальную обстановку и, играя роль исполнителя, выполняешь (на бумаге!) предписание за предписанием. Если получилась за- данная конечная обстановка, то программа, скорее всего, правильна. Правда, далеко не все программы можно прокрутить вручную, да и полной гарантии этот метод не дает: ты ведь мог ошибиться дважды — один раз, составляя программу, а второй раз — проверяя ее. Поэтому, если поблизости есть 66
ЭВМ — лучше запустить программу на машине, а она уж сама поможет найти и синтаксические, и смысловые ошибки. Такая проверка называетсяV 7 отладкой программы. \/ При первом же пробном запуске вычислительной машины v МЭСМ, о которой мы рассказывали во введении, произошел по- казательный случай. Первую программу для МЭСМ перед запу- ском прокрутили вручную два квалифицированных математика и получили одинаковые результаты. А машина выдала другой результат. Инженеры долго искали неисправность и не смогли ее найти. Тогда академик С. А. Лебедев, главный конструктор МЭСМ, сам взялся за ручную прокрутку. Проработав всю ночь, он обнаружил, что оба математика ошиблись в рдном и том же месте, а машина оказалась права! И в заключение перечислим еще раз основные этапы составления программы: / • \ 1. Изучение условия задачи. 2. Составление общего плана. 3. Проверка (прокрутка) и улучшение общего плана. 4. Составление уточняющих планов для каждого пункта общего. 5. Написание текста программы по каждому уточняющему плану (с комментариями). 6. Предварительная проверка программы (про- смотр и ручная прокрутка). 7. Проверка программы на машине (отладка). Домашнее задание. rgx 1. Убедись, что тебе понятно, в каком смысле г— здесь употреблены слова: вопрос, утверждение г------ предписание, исполнитель, МПИ, синтаксис, прото- кол диалога, план, комментарий, среда для исполни- теля, начальная и конечная обстановка в среде, руч- ная прокрутка, отладка. 2. Как формулируются первый и второй законы программирования ? 3. Перечисли основные правила записи предпи- саний в языке Робик. Где записываются коммента- рии и зачем они нужны? 4. Какие ты знаешь типы ошибок в програм- мах? 5. Какую клавишу нужно нажимать в конце каж- дого предписания (после комментария)? 6. Какие ты знаешь предписания из МП си- стемы Школьница? 3* 67
7. Какие сообщения системы об ошибках ты знаешь? В каких случаях они выдаются? 8. Перечисли, что должно входить в условие за- дачи на составление программы. 9. Перечисли основные этапы составления и проверки программы. 10. Составь программы для исполнителя МУ- РАВЕЙ: а) переставить кубики так, чтобы получился белый квадрат (рис. 27); б) переставить кубики так, чтобы из слова АПЕЛЬСИН получилось название породы собак (перед началом работы МУРАВЕЙ находится под буквой А); в) ** заменить один кубик, чтобы получилась правильная формула кислоты (рис. 28); г) поменять местами два кубика так, чтобы из слова КАРЕТА получилось другое осмысленное слово (МУРАВЕЙ находится под буквой К). 11. Локомотив и вагоны расположены так, как показано на рис. 29. Рис. 29 Составь программы для решения следующих задач: 68
а) собрать все цистерны на пути А, платформы — на пути Б, крытые вагоны — на пути В; б) собрать все девять вагонов-на пути А так, чтобы одинаковые вагоны не стояли рядом; в) переставить вагоны так, чтобы на каждом пу- ти у тупика стояла цистерна, затем — платформа, а справа — крытый вагон.
ГЛАВА ВТОРАЯ СИНТАКСИЧЕСКИЕ ДИАГРАММЫ Четвертый урок Гибкие описания МПИ Как описать множество предписаний? Создание нового исполнителя — дело не простое. Инженерам, математикам и программистам — раз- работчикам новых роботов и вычислительных ма- шин — приходится решать немало трудных задач. И одна из них состоит в том, чтобы... описать множество предписаний нового исполнителя. Казалось бы, что здесь сложного? Достаточно перечислить все предписания в инструкции — так, как это было сделано для исполнителей ДЕЖУ- РИК, МУРАВЕЙ и МАШИНИСТ. Но математи- кам хорошо известно, что перечисление — далеко не лучший способ описания больших множеств. Как, например, задать перечислением систему предписа- ний исполнителя ПЛЮСИК, умеющего склады- вать натуральные числа и печатать результат сложения. Предписания для этого исполнителя имеют вид СЛОЖИТЬ 12345 С 25131 И ОТПЕЧАТАТЬ РЕЗУЛЬТАТ; СЛОЖИТЬ 1983 С 198319841985 И ОТПЕЧАТАТЬ РЕЗУЛЬТАТ; Перечислить в инструкции все числа? Но их же бесконечно много! Может быть, написать в МПИ: СЛОЖИТЬ Л С В И ОТПЕЧАТАТЬ РЕЗУЛЬТАТ; и пояснить, что вместо А и В можно подставить любые натуральные числа? Но такое описание по- нятно человеку, а как растолковать его машине? С ее точки зрения все программы для ПЛЮСИ- Ка должны будут выглядеть одинаково: 70
СЛОЖИТЬ 4 С В И ОТПЕЧАТАТЬ РЕЗУЛЬТАТ; СЛОЖИТЬ А С В И ОТПЕЧАТАТЬ РЕЗУЛЬТАТ; и так далее. Никаких изменений в тексте предписания система не допустит: второй закон программирова- ния неумолим. Чтобы справиться с этим затруднением, нужно подобрать достаточно строгий, понятный для ЭВМ и в то же время удобный для человека способ опи- сания синтаксиса предписаний. Существует несколь- ко таких способов. В этой книге используется один __ из них, получивший название метода синтаксиче- \ / ских диаграмм. V Что такое синтаксическая диаграмма? Синтакси- д ческая диаграмма — это рисунок, объясняющий пра- вило построения некоторого множества текстов. Z • \ Диаграмма показывает, из каких частей складывается текст и в каком порядке эти части можно соединять. Состоит диаграмма из овальных и прямоугольных полей, связанных coedu-v—7 нителъными' линиями. На линиях проставляются стрелки, указывающие направление движения. * Каждое поле содержит часть текста (обычно — одно слово, число или символ), соединительные линии показывают, в каком порядке эти части мо- гут следовать друг за другом. Например, диаграм- ма для МПИ ПЛЮСИКа может выглядеть так: fXJ г ип^тХГНА ТУРАЛЬНОЁУХ—\ГНА ТУРАЛЬНОЕ^ХИ ОТПЕЧА ТА ТЬ\А ^СЛОЖНТЪ^ 4HCJlQ j\ РЕЗУЛЬТАТ Гх| Диаграмма 1 Треугольники с буквами Н и К обозначают на- чало и конец диаграммы. Чтобы получить текст по его синтаксической диаграмме, нужно двигаться по соединительным линиям от начала диаграммы к ее концу строго по направлению стрелок. Встретив по дороге прямо- угольник, нужно дословно выписать содержащийся д в нем текст на отдельный лист бумаги. Встретив /yi овал, также нужно выписать на бумагу текст, но не/w\ тот, который написан внутри овала, а другой! Ка- кой же? На диаграмме 1 овал с надписью НАТУРАЛЬНОЕ ЧИСЛО, очевидно, означает, что 71
на этом месте в тексте может стоять любое нату- ральное число. Но... это человеку очевидно, а для системы нужна еще одна синтаксическая диаграм- ма, объясняющая ей, что такое натуральное число. Ее составлением мы займемся позже, а пока запом- ним, что вместо овала нужно выписать текст, название которого записано в овале. На месте овальных полей могут появляться различные Vтексты, поэтому такие поля называют гибкими, в отличие от жестких прямоугольных полей, ко- торые всегда заменяются одним и тем же текстом. Текст, который подставляется вместо гибкого поля, называется значением этого поля (точно так же, как в алгебре значением переменной X назы- вается число, подставляемое в формулу вместо этой буквы). Так, выписывая содержимое 'жестких полей и подставляя значения гибких полей, мы будем по- степенно накапливать на листе бумаги нужный нам текст. Когда мы доберемся по соединительным ли- ниям до треугольника с буквой К, текст на бумаге будет выписан полностью. Диаграмма 2 Обычно от начала к концу диаграммы можно пройти разными путями, получая различные тексты. Таким образом, одна диаграмма позволяет описать синтаксис большого числа текстов, поэтому такие диаграммы удобно использовать для задания сложных МПИ. Но вообще-то их можно применять для описания структуры любых текстов, а не толь- ко предписаний. Например, диаграмма 2 описывает синтаксис одного из вариантов простого нераспро- страненного предложения в русском языке; а мате- матический термин «неравенство» можно пояснить при помощи такой диаграммы: Диаграмма 3 72
Ветвления и циклы. Обрати внимание,. что на диаграмме 3 от первого гибкого поля ко второму можно пройти четырьмя разными путями. Каждый путь соответствует одному из знаков >, <, >, <, которые могут стоять в неравенстве межДу арифме- тическими выражениями. Такая конструкция в диа- граммах называется ветвлением. Диаграммы можно использовать и для описания структуры отдельных слов или просто цепочек сим- волов. Например, по диаграмме 4. получают- ся «слова» любой дли- ны, составленные из од- Диаграмма 4 ной только буквы А: А, А АА, A AAA АА АААА АААААААААА и т. д. А диаграмма 5 позволяет получать любые цепочки из плюсов и минусов, разделенных точками. В начале и в конце цепочки обязательно стоит точка! Например, цепочки: . + . + + . — . + . + . — . — . — . И . + можно полу- чить по диаграмме 5, а цепочки 4-. — . — . — . + . — — нельзя. ~ Почему? И как нужно изменить диаграмму 5,[стпр| чтобы плюсы и минусы могли идти подряд в лю-Р^П бом количестве, но между плюсом и минусом обя- зательно стояла бы точка? Попробуй ответить на эти вопросы. Решение. Решением диаграммах 4 — 6 хорошо лучать тексты любой достаточно провести со- единительную линию назад так, чтобы по- лучился замкнутый путь. Если пройти по такому пути несколько раз, получится текст из Нескольких повторяю- щихся участков. Зам- кнутые пути называют будет диаграмма 6. На видно, как можно по- длини. Для этого Диаграмма 6 73
также циклами. В диаграммах 5, 6 циклы используются вместе с ветвлением, что поз- воляет получать более разнообразные тексты. Уточняющие диаграммы. Попробуем теперь со- ставить обещанную диаграмму для натурального чйсла. Запись натурального числа выглядит как по- следовательность цифр. На языке синтаксических диаграмм это утверждение можно записать так: Диаграмма 7 Форма этой диаграммы несколько отличается от предшествующих: слева от треугольника с буквой Н появилось еще одно гибкое поле, от которого проведена двойная линия к диаграмме. Ты уже, ве- роятно, понял, в чем дело: на этом рисунке изобра- жена уточняющая диаграмма, которая описывает возможные значения гибкого поля из какой-то диа- граммы. Это гибкое поле и нарисовано слева. А смысл двойной линии можно передать словами «описывается диаграммой». Тогда весь этот рису- нок можно заменить такой фразой: Гибкое поле НАТУРАЛЬНОЕ ЧИСЛО описы- вается диаграммой 8. Диаграмма 8 Впрочем, эта диаграмма уточняет значение гиб- кого поля не до конца: в ней содержится еще одно гибкое поле — ЦИФРА, которое, в свою очередь, ну- ждается в уточнении. Описать его значение можно, например, так: =[">—! ф ф фф фф ф ффф Диаграмма 9 74
В этой диаграмме все поля — жесткие, так что в дальнейших уточнениях она не нуждается. Как убрать лишний нуль? А теперь вернемся к диаграмме 7. На первый взгляд кажется, что придраться не к чему ? натуральное число — это последовательность цифр, а диаграмма 9 объясняет системе, что вместо гибкого поля ЦИФРА можно подставлять любой из символов 0, 1, ..., 9. Исполь- зуя одновременно эти диаграммы, можно получать любые натуральные числа, например 121, 120345678909987654321, и т. д. Ввсе правильно? Но ведь по этим диаграммам можно получить и такие числа: 0005, 07898876, 0000000 и просто 0 (проверь это!). С первыми двумя числами еще можно было бы согласиться, хотя в математике не принято записывать лишние нули перед первой цифрой числа. Но вот нуль явно не подходит: он ведь не является натуральным числом! Придется переделывать диаграмму 7 — опа не совсем точно объясняет, что такое «натуральное число». Чтобы построить правильную диаграмму, используем искусственный дрием: введем новое гиб- кое поле НЕНУЛЕВАЯ ЦИФРА, которое можно описать так: Диаграмма 10 Теперь можно несколько по-другому объяснить, что такое ЦИФРА: это либо НЕНУЛЕВАЯ ЦИ- ФРА, либо нуль: Диаграмма 11 75
Диаграмму для натурального числа можно те- перь изобразить так: Диаграмма 12 Можно обойтись без поля ЦИФРА, но тогда диаграмма станет громоздкой и прочесть ее будет труднее: Диаграмма 13 Основные обозначения. И в заключение приведем сводную таблицу обозначений, применяемых в син- таксических диаграммах. 76
Третья перемена Вспомним правила к формулы На следующем уроке ты будешь учиться составлять и читать синтаксические диа- граммы для описания текстов и формул, которые встречаются в программировании, математике, хи- мии, других школьных предметах и даже в быту. А сейчас, во время перемены, вспомни некоторые правила и обозначения, которые понадобятся тебе на уроке при разборе примеров. Начиная со следующего абзаца, здесь напеча- таны вопросы по различным разделам школьной программы. О Если на какой-то из этих вопросов ты не можешь ответить (потому что еще не изучал этого в школе), загляни на с. 78 — там приведены краткие указания, которых будет вполне достаточно для составления диаграмм. Но если ты проходил соответствующий раздел, не торопись заглядывать в указания. Сначала постарайся ответить на вопрос сам, в крайнем случае открой учебник. После этого загляни в указания и сверь с ними свои ответы. А потом постарайся сам составить синтаксическую диаграмму, описывающую ответ. □ Кстати, обрати внимание, что между знаками О и □ в этом абзаце записан план твоей работы во время этой пере- мены. Можешь приступить к его исполнению. Начнем с морфологии русского языка. 1. Из каких частей состоит слово? Какие части слова могут повторяться? Как записываются сложные слова? А теперь несколько вопросов по синтаксису и пунктуации: 2. Как расставляются знаки препинания при перечислении однородных предметов без использова- ния союзов? 3. Как выделяется на письме прямая речь в кон- це предложения? Перейдем к математике. Один математический пример — диаграмму для натурального числа — мы подробно рассмотрели на предыдущем уроке. 4. Как можно сформулировать правила записи любых целых чисел? 5. Как записываются действительные числа? 77
6. Что такое числовое выражение? 7. Как выглядит квадратное уравнение? И вообще в математике очень много конструкций, формул, правил, которые легко описать синтаксическими диа- граммами. Это и п'онятно: диаграммы позволяют описать лю- бое строгое и точное формальное правило записи текста, а строгость и точность в математике так же важны, как и в программировании. Несколько примеров из химии (для старшекласс- L.T \ ников): 8. Как выглядят общие формулы для кислот, ос- нований, солей? 9. Запишите общий вид уравнения реакции ней- трализации. А теперь несколько примеров, не относящихся к школьным предметам. Формы самых разно- образных таблиц, деловых бумаг и документов очень удобно описываются диаграммами. Многие такие документы сейчас оформляются на вычис- лительных машинах, так что составление этих диаграмм может пригодиться тебе при работе с ЭВМ. На рис. 30 изображено удостоверение участника Летней школы юных программистов, отпечатанное вычислительной машиной. На рис. 31 — авиабилет, оформленный системой Сирена. Подумай, как опи- сать их при помощи диаграмм? Как может выгля- деть диаграмма для обложки тетради, дневника? Для медицинской справки (рис. 32) и справки для покупки авиабилетов (рис. 33)? @И, наконец, вернемся к программированию. Подумай, какие предписания должны входить в МПИ таких исполнителей: ПОВАР и ШОФЕР. Как описать их МПИ с помощью синтаксических диаграмм? Указания. 1. Слово состоит из одной или нескольких основ и одного окончания (окончание может быть пустым). Если основ несколь- ко (сложные слова), то они записываются подряд (как в слове «амперметр») или соединяются буквами «о» или «е». В состав каждой основы может входить одна или несколько приставок (не обязательно), корень (обязательно) и один или несколько суффиксов (не обязательно). Количество приставок, суффиксов и основ в одном слове правилами не ограничивается. 78
УДОСТОВЕРЕНИЕ УЧАСТНИЦЫ 5 ВСЕСОЮЗНОЙ ЛЕТНЕЙ ШКОЛЫ КНЫХ ПРОГРАММИСТОВ ОР1КОМИТЕТ ВАЙНШТЕЙН АННА УЧЕНИЦА 4 КЛАССА ШКОЛЫ М 130 Г.НОВОСИБИРСКА НАУЧНЫЙ РУК-ТЕЛЬ ШКОЛЫ, ЧЛЕН-КОРР. АН СССР А.П.ЕРШОВ 25 ИЮЛЯ - ДИРЕКТОР ШКОЛЫ - 10 АВГУСТА К.Т.Н. 1980 ГОДА СНС Ю.А.ПЕРВИН Рис. 30. Удостоверение участника Летней Школы О АСУ ’’СИРЕНА” О О АЭРОФЛОТ о °АМ БИЛЕТ 213474 СЛУЖЕБНЫЕ ОТМЕТКИ ФАМИЛ I |ГОДЕН ДО 26.02.79 °Т%|О РЕЙС ОТПРАВЛЕНИЕ МЕСТО О число МЕСЯЦ] ЧАСЫ мин 9 2 7 26 02 119 50 01А ЛИТЕР ТБИЛИСИ КАССОВЫЙ НОМЕР 2 57531110 3 ZHIo о О О О Рис. 31. Билет системы Сирена 79
СПРАВКА Ребенок Петров Вадим, возраст 2,5 года, не посещал детский сад JE 210 по состоянию здоровья с 10.12.1981 по 15,12,1981. В на- стоящее время здоров и может посещать детское учреждение. Врач: Рис. 32. Медицинская справка СПРАВКА Выдана в том, что он действительно учится в классе школы № _____________________________района г. ______________ Дана для предъявления в кассу по продаже авиабилетов. ________________198_ г. Директор школы Рис. 33. Справка для покупки авиабилетов 2. Перед перечисляемыми словами ставится двоеточие, ме- жду ними — запятые, например: Предложения можно разделить на три вида: утверждения, вопросы, предписания. 3. Прямая речь записывается с заглавной буквы, заключает- ся в кавычки, перед ней ставится двоеточие. 4. Целое число — это нуль или последовательность цифр, которая начинается не с нуля. Перед целым числом может стоять + или -. 5. Действительное число может быть целым или дробным. Дробное число состоит из целой и дробной частей, которые раз- деляются запятой. Целая часть записывается так же, как целое число. Дробная часть — это последовательность цифр, которая заканчивается ненулевой цифрой, либо нуль. Примеры: 546; 129,45;. 0,6666; 3,5; 76,0. 80
6. Числовое выражение — это одно или несколько чисел, со- единенных правильно расставленными знаками арифметических действий и (для определенности) круглыми скобками. Примеры: 54,2 (25 + 3) х 231,15:85 + 81 ’ 45 х 80 7. Общее квадратное уравнение имеет вид ах2 + Ьх + с = 0, где а — действительное число, отличное от нуля, b и с — произ- вольные действительные числа. Вместо х может использоваться любая другая буква. Если b или с равны нулю, то соответствую- щий одночлен не пишется. 8. Общая формула кислоты: Нш А, где А — произ- вольный кислотный остаток, т — натуральное число (при т = 1 индекс не пишется). Примеры: HNO3, H2SO4. Общая формула основания: М (ОН)И, где М — ме- талл либо аммонийная группа NH4. При п = 1 скобки не ставятся и индекс не пишется. Общая формула соли: МШ(А)И 9. Формула для реакции нейтрализации: X • М(ОН)„ + Y • HWA = Z • Me(A)k + V • Н2О. Попробуй сам составить диаграммы для описа- ния всех текстов и формул, описанных во время этой перемены. Подумай над МПИ перечисленных на с. 78 исполнителей. Пятый урок Как составлять и читать диаграммы Линейные и ветвящиеся структуры. Проще всего составлять и читать диаграммы для таких текстов, которые всегда состоят из одних и тех же частей, расположенных в одном и том же порядке. Такие тексты часто встречаются в раз- личных документах. Например, структуру справки, изображенной на рис. 32, можно описать диаграм- мой 14. Структуру таких диаграмм называют линейной. В линейных диаграммах от начала к концу можно пройти только одним путем. Единственное, что мо- жет в них меняться — это значения гибких полей. Линейные участки встречаются почти в каждой диаграмме, но вся диаграмма очень редко бывает 81
Диаграмма 14 линейной, обычно в ней используется хотя бы не- сколько ветвлений. Например, диаграмма для обложки школьного дневника будет выглядеть так: ДНЕВНИК НАЗВАНИЕ ГОРОДА (СЕЛА) Диаграмма 15 82
Структуру диаграмм или участков диаграмм, в которых используется ветвление, называют ветвя- щейся. Машина* ставит оценку. Рассмотрим пример со- ставления диаграммы с линейными и ветвящимися участками. Сейчас в мире существует большое ко- личество программ для обучения и проверки знаний студентов и школьников. Программа для проверки знаний обычно работает так: на экране терминала появляется вопрос или задача. Учащийся набирает ответ на клавиатуре, машина его проверяет и за- дает новый вопрос (задачу). В конце работы ма- шина выставляет общую оценку и сообщает ее учени- ку и преподавателю. Разрабатывая обучающую программу, нужно, помимо всего прочего, предусмотреть форму ито- гового сообщения машины, которое она выдает в конце работы. Диаграмма для описания синтакси- са этого сообщения может иметь линейную струк- туру. Например, она может выглядеть так: РАБОТА\»\ОКОНЧЕНА^ ОцЕцКА Д° свидания! \ХЦ Диаграмма 16 Значение гибкого поля ОЦЕЙКА можно описать ветвящейся диаграммой: Диаграмма 17 Если ты используешь диаграммы 16, 17, то со- общения машины могут быть такими: РАБОТА ОКОНЧЕНА. ТВОЯ ОЦЕНКА 5. ДО СВИДАНИЯ! РАБОТА ОКОНЧЕНА. ТВОЯ ОЦЕНКА 4. ДО СВИДАНИЯ! и так далее — всего четыре варианта. Но если рабо- 83
тать с такой программой приходится много раз, то однообразные реплики машины в конце концов надоедают и даже начинают раздражать. Програм- мисты давно уже нашли противоядие от этого раз- дражения: предусматривается несколько разных ва- риантов итогового сообщения, и машина каждый раз выбирает один из них случайным образом. До- статочно предусмотреть четыре-пять вариантов, и диалог с машиной становится гораздо интереснее. Попробуем составить диаграмму для такого «многовариантного» сообщения. Начинать его можно всегда одними и теми же словами, например РАБОТА ОКОНЧЕНА. Ничего страшного в этом нет. А вот дальше нужно допу- стить некоторое разнообразие текстов: не только ТВОЯ ОЦЕНКА, но и СЕГОДНЯ ТЫ ПОЛУЧИЛ, СТАВЛЮ ТЕБЕ и просто ОЦЕНКА. Затем, как и в прежнем варианте, может идти оценка. Было бы очень хорошо, если бы машина после оценки доба- вляла несколько слов — своих для каждого вариан- та. Например, после пятерки: ОТЛИЧНО!, МОЛО- ДЕЦ!, ПОЗДРАВЛЯЮ!, Я ЗА ТЕБЯ ОЧЕНЬ РАДА!; после четверки: НЕПЛОХО, ХОРОШО, В СЛЕДУЮЩИЙ РАЗ ПОСТАРАЙСЯ ОТВЕ- ТИТЬ НА 5; после тройки: ПОСТАРАЙСЯ БЫТЬ ВНИМАТЕЛЬНЕЕ, СОВЕТУЮ ТЕБЕ ПОВТО- РИТЬ ЭТОТ МАТЕРИАЛ; наконец, после двойки: НЕ РАССТРАИВАЙСЯ! ХОРОШЕНЬКО ВСЕ ПОВТОРИ-И В СЛЕДУЮЩИЙ РАЗ ТЫ НА- ВЕРНЯКА ОТВЕТИШЬ ЛУЧШЕ. «Прощальные слова» в конце сообщения тоже могут звучать по- разному: ДО СВИДАНИЯ!, ДО НОВЫХ ВСТРЕЧ!, Я БУДУ ЖДАТЬ ТВОЕГО ПРИХОДА! и так далее. Вероятно, ты легко сможешь приду- мать и другие варианты всех этих текстов. Приступим к рисованию диаграммы. Начнем, разумеется, с начала: рисуем треугольник с буквой Н и идущую от него соединительную линию. Мы договорились, что все сообщения начинаются оди- наково, значит, начальный участок диаграммы имеет линейную структуру с одним жестким полем: Н РАБ0ТА ОКОНЧЕНА Диаграмма 18а 84
Дальше возможны разные варианты, поэтому нужно использовать ветвление: разделяем соедини- тельную линию на несколько ветвей — по числу вариантов: IX-J РАВ0ГА \ОКОНЧЕНА Диаграмма 186 Рисуем жесткие поля на каждой ветви: Диаграмма 18в Теперь нужно предусмотреть поля для оценки и для реплики машины по поводу оценки. Эта часть сообщения совершенно не зависит от того, какой вариант мы выбрали в начале, поэтому соедини- тельные линии от всех ветвей вновь сводим в одну. А сейчас может идти одна из четырех оценок, поэтому нужно снова применить ветвление. Конечно, путь на . этой развилке, в отличие от остальных, машина выберет не случайно, а в зави- симости от результатов работы ученика. Для каждой оценки, кроме двойки, предусмо- трены различные вари- анты реплик, поэтому часть соединительных линий вновь разветвля- ется (диаграмма 18 г): Остаются только «прощальные слова». Они опять-таки никак не зависят от остальной части сообщения, поэто- му можно снова свести Диаграмма 18г 85
ж
Диаграмма 18д
в одну все соединительные линии. Теперь пре- дусматриваем еще одно, последнее ветвление, опять сводим вместе все ветви и рисуем треугольник с буквой К. Диаграмма готова. Если ты внимательно следил за ее составлением, то тебе будет несложно ра- зобраться в ней и выписать несколько вариантов возможных сообщений по этой диаграмме. Телеграмма юного программиста. А теперь по- пробуй составить диаграмму для телеграммы, в ко- торой юный программист сообщает родителям о своем возвращении из Летней Школы. Текст вы- глядит так: ПРИЕДУ тогда-то САМОЛЕТОМ (или: ПОЕЗДОМ, АВТОБУСОМ), РЕЙС № ... (ПО- ЕЗД №..., ВАГОН №...). ЮНЫЙ ПРОГРАМ- МИСТ. Примеры: ПРИЕДУ 12 АВГУСТА В 10-30 САМОЛЕТОМ, РЕЙС № 181. ЮНЫЙ ПРОГРАММИСТ. ПРИЕДУ 14 АВГУСТА В 14-30 ПОЕЗДОМ № 4, ВАГОН № 12. ЮНЫЙ ПРОГРАММИСТ. ПРИЕДУ 13 АВГУСТА В 15-30 АВТОБУСОМ. ЮНЫЙ ПРОГРАММИСТ. Циклические структуры. Синтаксические диа- граммы часто приходится использовать для описа- ния текстов, состоящих из последовательности однотипных элементов, число повторений которых заранее неизвестно (или известно, но слишком вели- ко, чтобы его можно было задавать линейной структурой). Примерами могут служить числа и числовые выражения в математике, структурные формулы в органической химии, да и просто длинные тексты на русском языке, состоящие из не- скольких предложений. Ты уже, конечно, догадался, что для описания таких текстов удобно использовать циклы, о ко- торых говорилось на предыдущем уроке. Структуру диаграмм или участков диаграмм, в которых ис-V 7 пользуются циклы, называют циклической. \/ Как известно, текст на русском языке может со- v стоять из любого количества предложений. Это правило можно описать диаграммой 19, представ- ленной на с. 88. 87
ТЕНЕТНА РУССКОМ ЯЗЫКЕ. ПРЕДЛОЖЕНИЕ Диаграмма 19 А первый закон программирования можно запи- сать так: Диаграмма 2Q Если теперь вспомнить правила языка Робик, то эту диаграмму можно сделать более подробной: Диаграмма 21 Впоследствии мы еще вернемся к этой диаграм- ме, а пока отметим только, что комментарий — это любая последовательность символов: Диаграмма 22 И еще пример циклической структуры — диаграмма для описания морфологической структуры слова: Диаграмма 23 88
Убедись, что она в точности описывает правило, приведенное в указаниях к первому заданию (см. с. 78). А теперь просмотри указания к задачам 4 и. 5ZZZS и попробуй составить по ним диаграмму для описа-|ЬТ0Р| ния действительного числа. ' Ответ. Убедись, что по диаграмме 24 полу- чаются числа 123,56; 0,205; —456; +67,0, но не по- лучаются «числа»: 5,; ,67; 8 — 7; 7,670. Рекурсивные диаграммы. Попробуем составить диаграмму для описания числовых выражений, со- держащих только четыре знака арифметических операций: +, —, х и :. Казалось бы, ничего не- обычного в этом задании нет: выражение —это либо отдельное число, либо несколько чисел, связанных знаками операций. Диаграмма, описывающая это правило, выглядит так: 89
Все правильно? Да, ... если забыть о скобках! Но скобки в выражениях встречаются довольно ча- сто, поэтому кроме чисел в составе выражения мо- гут встречаться участки, заключенные в скобки: Гибкое поле, нарисованное между двумя скобка- ми, специально оставлено пустым. Подумай, что должно быть там написано. Что может стоять в скобках? Либо отдельное число, либо несколько чисел, соединенных знаками операций и скобками, то есть... опять-таки числовое выражение! Присмотрись повнимательнее к этой диаграмме. В уточняющей диаграмме используется то самое гибкое поле, которое она уточняет. И ведь все пра- вильно, убрать отсюда эту странную конструкцию нельзя: внутри числового выражения действительно 90
может стоять выражение в скобках, а в нем, в свою очередь, могут использоваться скобки — и так мо- жет продолжаться сколько угодно раз. Конечно же, какое-то выражение окажется самым внутренним и скобок в нем не будет (на диаграмме мы пойдем через гибкое поле ДЕЙСТВИТЕЛЬНОЕ ЧИСЛО). Пожалуйста, не поленись аккуратно проверить, что диаграмма 25в правильно описывает такое, напри- мер, выражение: 519 +(21-16 х 5 :(1981 + 365 х(24-28))-5 +(2 + 3)). Уточняющие диаграммы, в которых содержится само уточняемое гибкое поле, называются рекурсивными, а сам прием — рекурсией. С рекурсией в программи-V 7 ровании ты еще не раз встретишься. Четвертая перемена Вернемся к нашим диаграммам Если ты еще не составил диаграммы для описания формул, перечисленных во время предыдущей перемены, попробуй сделать это сей- час, а потом посмотри на приведенные здесь диа- граммы 26 — 30 и сравни их со своими. 91
Диаграмма 29 Шестой урок Элементарные конструкции языка Робик (Практикум по работе с синтаксическими диаграммами) На этом уррке мы познакомимся с не- которыми конструкциями, широко применяемыми в различных языках программирования, в том чис- ле и в языке Робик. При этом будут постоянно ис- пользоваться синтаксические диаграммы. 92
Числа. Начнем с чисел. Во всех языках програм- мирования, в том числе и в Робике, целые числа вы- глядят так же, как в математических текстах. Для их описания можно использовать диаграмму 28. А вот дробные числа записываются несколько иначе, чем это принято в математике. Вот диаграмма, описывающая гибкое поле ДРОБНОЕ ЧИСЛО: Сравни этот , рисунок с диаграммой 24. Бросает- ся в глаза, что целая часть отделяется от дробной с помощью точки, а не запятой, как в математиче- ских обозначениях. Например, 2.5, а не 2,5, 3.1415, а не 3,1415 и т. д. По словам А. Л. Брудно, автора одного из первых учебников по алголу-60: «Пре- имущество этого может оценить всякий, кому слу- чалось писать перечень десятичных дробей». Разберись, пожалуйста, какие из приведенных/ К здесь чисел записаны правильно. Какие из них [STOP] целые, а какие — дробные: 2, 3.1415, —245, +.0, 2,547, Z 2/3, -240.0, +0. Составь диаграмму для описания гибкого поля ЧИСЛО, значением которого может быть любое целое либо дробное число языка Робик. Ответы: целые числа: 2; —245; +0 дробные числа: 3.1415; —240.0 неправильно записаны: 2,547; 2/3; + .0 Гибкое поле ЧИСЛО описывается такой диа- граммой : 93
Имена. Во всех без исключения языках програм- мирования широко используются имена. Например, в Робике имена (или названия) есть у исполнителей: ДЕЖУРИК, МУРАВЕЙ, МАШИНИСТ. Для чего еще применяются имена, ты узнаешь на следующем уроке, а пока научись их правильно записывать. Во многих языках гибкое поле ИМЯ описывает- ся диаграммой 33. Из диаграммы видно, что любое имя может со- стоять из букв и цифр, причем первой обязательно должна быть буква. Значением гибкого поля БУК- ВА может быть любая заглавная буква русского или латинского алфавита. Нарисовать такую диа- грамму несложно, но места она займет довольно много, поэтому здесь мы ее не приводим. Вот примеры правильных имен: 1^1 UH| КРОКОДИЛ, ЛУНА2, СКОРОСТЬ, XI, В245ЛНЗ А в каждом из этих имен допущена ошибка. По- старайся найти ее сам: 1. 2. 3. 4. 5. ЛУНОХОД-2 СКОРОСТЬ СПУСКА 15А Х(1) al Ответы. 1. Знак «-» — это не буква и не цифра. 2. Это два имени, а не одно: пробел — это тоже не буква и не цифра. 3. Имя начинается не с буквы. 4. Скобки — не буквы и не цифры. 5. a — греческая буква, а использовать можно только русские и латинские. Обрати внимание, что имена из двух слов, раз- деленных пробелом, в Робике использовать нельзя. А такие имена иногда бывают очень нужны. Напри- мер, если при расчете космической траектории нужно 94
хранить в блоках памяти числа, означающие массу Солнца, массу Земли и массу Марса, то эти блоки удобнее всего так и называть: «Масса Солнца» и так далее. Для того чтобы можно было составить имена из нескольких слов, в Робике используется специальный символ — подчеркивание ( _). Напри- мер МАССА _ СОЛНЦА, УСКОРЕНИЕ _ СВО ВОДНОГО ____ПАДЕНИЯ и т. д. Подчеркивание — это не буква и не цифра, поэтому диаграмма для имен в Робике несколько отличается от диаграммы 33. Но и это еще не все. Диаграмма 34 описывает ПРОСТОЕ ИМЯ. Но, кроме простых, в Робике V [Л1 встречаются составные или, как их еще называют, индивидуальные имена. Чтобы разобраться с этой конструкцией, вернемся к предписанию ВКЛЮ- ЧИТЬ ИСПОЛНИТЕЛЯ, которое мы использовали в первой главе. Честно говоря, использовали мы его не совсем законно: ведь множества предписаний системы Школьница мы не описывали. К сожалению, сде- лать иначе было невозможно, и ты уже, вероятно, понял, почему. Дело в том, что в предписаниях ВКЛЮЧИТЬ ИСПОЛНИТЕЛЯ и выключить ИСПОЛНИТЕЛЯ употребляется название исполни- теля. Названия, могут быть разными, поэтому для описания МПИ системы нужно было бы использо- вать синтаксические диаграммы с гибкими полями. Но ведь тогда ты еще не был знаком ни с гибкими полями, ни с синтаксическими диаграммами вооб- ще! Пришлось пояснить эти предписания на приме- рах, без строгого описания их синтаксиса. Сейчас можно восполнить этот пробел. 95
Вот полная синтаксическая диаграмма: НАЗВАНИЕ ИСПОЛНИТЕЛЯ. ПРОСТОЕ ИМЯ Диаграмма 35 Легко видеть, что те предписания, которыми ты пользовался в первой главе (ВКЛЮЧИТЬ ИСПОЛ- НИТЕЛЯ ДЕЖУРИК, ВКЛЮЧИТЬ ИСПОЛНИ- ТЕЛЯ МАШИНИСТ и т. д.), правильно описы- ваются диаграммой. Но она позволяет нам уз- нать нечто новое об этом предписании. Прежде всего, слово ИСПОЛНИТЕЛЯ писать не обязатель- но (на диаграмме есть обходной путь). Например, можно писать ВКЛЮЧИТЬ МУРАВЕЙ. А Правда, это предписание не совсем правильно звучит по- 2\ русски, казалось бы, нужно писать ВКЛЮЧИТЬ МУРАВЬЯ. Но никакой ошибки здесь нет — предписание записано не на русском языке, а языке Робик, а в Робике имена не скло- няются! Ты уже давно мог заметить, что правила Робика не всегда совпадают с правилами русского языка, хотя и очень на них похожи. Впрочем, если тебе трудно к этому привыкнуть, можешь всегда записывать это предписание полностью — тогда никаких трудностей не будет. Но самое интересное в диаграмме 35 — это два поля в конце, о существовании которых ты и не подозревал. Оказывается, кроме названия у каждого исполнителя может быть еще и собственное имя. Это бывает необходимо в тех случаях, когда в про- грамме используется несколько одинаковых испол- нителей. Тогда для каждого из них нужно приду- мать собственное имя по обычным правилам Роби- ка. Например, если в задаче на перестановку ваго- нов можно применить два электровоза, то прихо- 96
дится включать двух исполнителей МАШИНИСТ. Имена им можно придумать любые, на твой вкус. Например, ПЕРВЫЙ и ВТОРОЙ или МИША и МАША. Включаются они так: ВКЛЮЧИТЬ МАШИНИСТ: МИША; ВКЛЮЧИТЬ МАШИНИСТ: МАША; Но недостаточно придумать имена и включить исполнителей — нужно еще суметь объяснить систе- ме, к какому исполнителю какое предписание отно- сится. Сделать это очень просто: перед предписа- нием Робика можно указать имя исполнителя, который должен это предписание выполнить. Как видно из диаграммы 36, после имени или названия исполнителя ставится двоеточие, а затем Диаграмма 36 записывается текст предписания. Например, для управления исполнителями МАШИНИСТ : МИША и МАШИНИСТ: МАША можно использовать та- кие предписания: МАША: ВПЕРЕД; МИША: ВПЕРЕД; МАША: ОТЦЕПИТЬ ВАГОН; и так далее. Предписание, перед которым указано имя или название исполнителя, называется индивидуальным предписанием. У некоторых исполнителей есть так называемые внутренние блоки памяти, каждый из которых имеет свое имя. Например, у исполнителя МУРА ВЕЙ в блоках памяти с именами X и Y ’хранятся координаты исполнителя на доске. Если таких ис- полнителей несколько (например, МУРАВЕЙ: МУ РА и МУРАВЕЙ: ШУРА), то и координаты у каждо- го из них будут, естественно, свои. Чтобы их различить, используют индивидуальные имена: 4 Г. А. Звенигородский 97
МУРА.Х, МУРА.У, ШУРАХ, ШУРА.У. Такие имена могут встречаться почти всюду, где можно употреблять обычные имена, поэтому гибкое поле ИМЯ в синтаксических диаграммах Робика может с одинаковым успехом обозначать и простое, и ин- дивидуальное имя. Вот теперь, наконец-то, можно нарисовать полные синтаксические диаграммы для гибкого поля ИМЯ в языке Робик. ВЫКЛЮЧИТЬ Диаграмма 37 В тех случаях, когда имя не может быть индивидуальным, в диаграммах употребляется гибкое поле ПРОСТОЕ ИМЯ. На- пример, для выключения исполнителя, имеющего собственное имя, незачем указывать название — достаточно указать это имя. Поэтому диаграмма для этого предписания имеет вид: j-pl ИСПОЛНИТЕЛЯХ Диаграмма 38 Понятно, что если собственного имени у исполнителя нет, то ПРОСТОЕ ИМЯ на диаграмме - это название ис- полнителя. Тексты. И еще одна конструкция, широко при- меняемая в программировании: тексты (иногда их называют строками). Текст в языке программиро- вания — это последовательность симво- лов, которые исполнитель должен без всяких изме- нений выдать на экран терминала или отпечатать на бумаге. В каком-то смысле текст напоминает прямую речь в русском языке. И записывается он очень похоже: в виде цепочки символов, заклю- ченной в кавычки. Примеры: "ЭТО ТЕКСТ", "РАБОТА ЗАКОНЧЕНА. ВАША ОЦЕНКА - ОТЛИЧНО". К сожалению, слово «текст» используется и в другом смысле, например, «текст программы», 98
«математический текст», «текст этой книги». Обыч- но это не вызывает затруднений: всегда можно по- нять, в каком смысле употреблено это слово. Но первое время будь внимателен. Диаграмма для описания текста: Диаграмма 39 Впрочем, эта диаграмма нуждается в одном уточнении: в тексте можно использовать любой символ, кроме самой кавычки. Выражения в Робике. На предыдущем уроке мы составляли диаграмму, описывающую числовое вы- ражение. В большинстве языков программирования диаграмма для описания синтаксиса выражения оказывается гораздо сложнее, чем диаграмма 25в. А вот в Робике все просто: —{ЦЕЛОЕ ЧИСЛОУ {выражениеУ=ж -{дробное числом ~{§Ы30В ПРОЦЕДУРЬГу Диаграмма 40 Прочитать это можно так: выражение в Роби- ке — это или число, или текст, или имя, или вызов процедуры (что это такое, ты узнаешь чуть позже). Пожалуйста, убедись, что тебе понятно, как вы- глядят в Робике следующие конструкции: целое чис- ло, дробное число, имя (простое имя, индивидуальное имя, название исполнителя), текст, выражение. На следующих уроках эти слова будут употребляться без дополнительных пояснений. И в заключение приведем несколько полезных советов по работе с синтаксическими диаграммами. Составление диаграмм. Составлением диаграмм мы занимались на предыдущем уроке. Здесь попро- 4* 99
буем записать нечто вроде общего плана. Итак, чтобы составить синтаксическую диаграмму для описания структуры какого-то текста, необходимо: — нарисовать треугольник с буквой Н; — если нужно, нарисовать слева от него уточ- няемое гибкое поле и соединить его с треугольни- ком двойной линией; — провести соединительную линию вправо от треугольника и нарисовать на ней стрелку; — рассмотреть первый элемент описываемого текста (символ, слово, словосочетание): — если текст всегда начинается с одного и того же элемента — изобразить его в виде жесткого или гибкого поля; — если какой-то элемент в начале текста может присутствовать, но не является обязательным — ис- пользовать обход; — если есть несколько вариантов начала — ис- пользовать ветвление и рассмотреть каждый ва- риант отдельно по тем же правилам; — если продолжение текста не зависит от перво- го элемента, свести все ветви в одну, если зави- сит — продолжать построение диаграммы для ка- ждой ветви отдельно; — если первый элемент текста может повторять- ся несколько раз — использовать цикл; — зарисовав первый элемент, строим по тем же правилам второй, третий и так далее; — если для какого-то участка диаграмма не по- лучается сразу — нужно обозначить этот участок гибким полем; — если построен участок диаграммы, описываю- щий последний элемент текста — нарисовать тре- угольник с буквой К и закончить построение диа- граммы. Составленную диаграмму обязательно нужно проверить: Во-первых, не осталось ли неоконченных ветвей (в правильной диаграмме от любого поля есть путь к концу диаграммы). Во-вторых, нет ли одинаковых участков (если они есть — их имеет смысл обозначить гибким по- лем — тогда диаграмма упростится). В-третьих, нет ли других возможностей упро- стить диаграмму. 100
Желательно сразу сделать «ручную прокрутку»: составить по диаграмме несколько текстов и посмо- треть, получается ли то, что нужно. Затем нужно составить уточняющие диаграммы для всех гибких полей и так далее. Чтение диаграмм и генерация текстов. Получение какого-либо текста по готовой диаграмме называет- ся генерацией текста. Генерация — задача неслож- ная: нужно просто «двигаться» по соединительным линиям, выбирая путь на каждой развилке слу- чайным образом и выписывая на лист бумаги до- словно содержимое всех встретившихся жестких полей. Встретив гибкое поле, нужно найти уточняю- щую диаграмму и таким же образом «пройтись» по ней от начала до конца. Работая с большими диа- граммами, желательно вести по ним кончиком ка- рандаша или указки, чтобы не сбиться. Несколько более сложная задача — анализ, или чтение, диаграммы. Читая диаграмму, нужно сфор- мулировать для себя то правило построения тек- стов, которое описано этой диаграммой. Например, если ты ничего не знаешь о морфологии, но имеешь перед глазами диаграмму 23, то ты вполне можешь рассуждать так: «От начала диаграммы соедини- тельная линия ведет к гибкому полю ПРИСТАВ КА, значит, слово начинается с приставки. Впро- чем, есть обходной путь, значит, приставка не обязательна: слово может начинаться с корня. Кроме того, приставок может быть несколько: есть соединительная линия, образующая цикл. Итак: в начале слова может стоять одна или несколько приставок, затем обязательно идет корень, дальше может появиться один или несколько суффиксов. Вся эта конструкция (приставки — корень — суф- фиксы) может повторяться несколько раз, причем конструкции эти записываются подряд или разде- ляются буквами Е или О. В конце слова может стоять окончание». Заметь, сколько понадобилось слов, чтобы опи- сать не такую уж сложную диаграмму! При чтении этой книги тебе еще много раз нуж- но будет разбираться с синтаксическими диаграм- мами, описывающими МПИ различных исполните- лей. Чтобы правильно их понимать, старайся первое время «расшифровывать» диаграммы слова- 101
ми, примерно так, как это только что было сдела- но. Скоро ты привыкнешь к диаграммам и на- чнешь понимать их без словесной расшифровки. Домашнее задание. ___•[ 1. Какие из перечисленных здесь имен записаны рУ по правилам языка Робик? Какие из них являются .!_____(индивидуальными ? А5, 6НЗП, К155РУ5, Е2Е4, Е2-Е4, Е2 - Е4, КРОКОДИЛ, ДВА КРОКОДИЛА, ДВА _ КРОКОДИЛА, 2 _ КРОКОДИ ЛА, ХВОСТ _ КРОКОДИЛА, КРОКОДИЛ.ХВОСТ, КРО КОДИЛ.ГЛАЗ, КРОКОДИЛ.ЗУБ, КРОКОДИЛ _ ХВОСТ. 2. Какие конструкции, приведенные здесь, мож- но назвать выражениями языка Робик? Какие из них являются целыми числами, какие — дрдбными числами, а какие — текстами: 2; 256.0; 314;: 3.1415; 2,5; -512; "КРОКОДИЛ"; КУРИЦА; "ДВА" ПЛЮС"ДВА"; "293.5"; "-293,5"; 3. Найди среди перечисленных здесь конструк- ций правильные выражения языка Робик: ВИННИ _ ПУХ, "ВИННИ-ПУХ", ВИННИЛУХ, 1981, "1982", ВИННИ ПУХ, ВИННИ, КОТЕНОК "ГАВ", "КОТЕ НОК ГАВ", "КОТЕНОК ПО ИМЕНИ ГАВ", "2 + 2",2 + 2. 4. На рис. 34 изображена схема железнодо- рожных путей, на которых работают два исполни- теля типа МАШИНИСТ. В тупике Б может Рис. 34 поместиться вагон, но не локомотив. Необходимо собрать все цистерны на пути В, а все платформы — на пути А. Составить программу. 5. Составить синтаксическую диаграмму для описания полного (бесконечного) текста стихотворе- ния. «У попа была собака» а) с использованием рекурсии; б) с использованием цикла. 102
6**. Алфавит белибердинского языка состоит из трех символов: £, X и # . На основе анализа мно- гочисленных надписей ученым удалось устано- 103
вить, что синтаксис языка описывается диаграм- мой 41. Смысл предложений языка не выяснен. На экс- пертизу в белибердоведческую лабораторию посту- пили две новые надписи (рис. 35). Предполагается, что Д# > ДДДД# Д>^ДАДД ft «ДД# ДДДД а) #Д>ДД#ДДДД#Д>=Д>Д>5Ь# #ДД >ДД#>>ДДДД#Х# Д>>ДДДД# Д^# # Д^=* ДДДДЛАДтЬ Д5>= АД# мкя 0 Рис. 35 одна из них содержит подлинный текст, а другая является подделкой. Постарайся провести эксперти- зу и обнаружить подделку, если она есть. Проведи синтаксический разбор подлинного текста и опреде- ли, сколько в нем приказов, сколько вопросов и сколько извинений.
ГЛАВА ТРЕТЬЯ РАБОТА С ПАМЯТЬЮ Седьмой урок Блоки памяти и их имена. Программирование диалога Предписание присваивания. Во время «экскурсии в мир роботов и ЭВМ» мы уже говори- ли о том, что роботы и вычислительные машины имеют память, в которой можно хранить разно- образную информацию. Например, система Сирена хранит в памяти расписание всех рейсов Аэрофлота, сведения о свободных и занятых местах и т. д. До сих пор ты не умел пользоваться этой способ- ностью машины. Теперь пришло время узнать, как работать с запоминающим устройством. ОЗУ машины Агат состоит из большого числа блоков, каждый из которых имеет свое имя. Что можно хранить в одном блоке? Во-первых, число (целое . или действительное). Во-вторых, текст. В-третьих, рисунок. В-четвертых, программу или часть программы. В-пятых... впрочем, «в пятых» может и подождать. Сначала разберемся с первыми четырьмя. Для начала заметим, что одно число требует для хранения гораздо меньше места, чем длинный текст или большая программа. Поэтому разные блоки памяти могут иметь разный размер. Для целых чи- сел, например, нужны совсем маленькие блоки. В ОЗУ хватает места на несколько тысяч таких бло- ков. А вот для программ иногда бывают нужны та- кие большие блоки, что они едва помещаются в ОЗУ. Впрочем, размерами блоков ты можешь не заниматься — пусть за ними следит система Школь- ница. Зато для тебя очень важно знать другое: как, работать с хранящейся в блоке информацией, иначе говоря, с содержимым блока. 105
Запомни! Содержимым блока памяти назы- вается хранящаяся в нем информация, то есть число, текст, рисунок и т. д. Чтобы работать с памятью, нужно, во-первых, уметь размещать информацию в блоках памя- ти; во-вторых, нужно иметь возможность как-то увидеть содержимое блока (например, на экране терминала). В-третьих, нужно обрабатывать информацию, то есть проверять содержимое разных блоков, сравнивать между собой и, если нужно, из- менять. Например, к числу можно прибавить дру- гое число или выполнить над ним еще какую-то арифметическую операцию. В тексте можно заме- нить какие-то слова или перенести на другое место не туда поставленную запятую. Рисунок можно по- вернуть, перенести на другое место, растянуть или сжать, добавить или убрать несколько линий. В программе тоже может понадобиться что-то исправить. В общем, обработка может быть самой различной. Как же выглядят в языке Робик предписания для размещения информации в памяти, для ее просмотра и обработки? Проще всего отве- тить на последнюю часть вопроса: н и к а к! В Робике нет никаких специальных предписаний для обработ- ____ки информации, хранящейся в памяти ЭВМ. Л Про читав эти строки, ты, наверное, подумал: «Вот тебе и раз! Столько говорили об этой обра- ----ботке, даже называли ее когда-то главным умением ЭВМ, а в Робике ее, оказывается, нет! Или здесь какой-то подвох?» Подвох, действительно, есть. Предписаний для обработки информации нет в языке Робик, но это не значит, что их нет в системе Школь- ница! Просто для каждого вида такой обработки есть свой исполнитель с подходящим МПИ. Напри- мер, для работы с числами можно включить испол- нителя КАЛЬКУЛЯТОР, умеющего складывать, вычитать, делить и умножать, а можно поработать и с другим исполнителем, под названием МАТЕ МАТИК, который немного знает тригонометрию и логарифмы. Есть свой исполнители для обработ- ки текстов и рисунков. С некоторыми из них ты по- 106
знакомишься на последних уроках в этой книге. А пока посмотрим, как сделать то, что можно сде- лать в Робике: разместить и просмотреть информацию. Чтобы поместить в блок памяти новое значение, используется предписание присваивания. Что такое выражение и имя, ты должен помнить (диаграммы 40 и 37). На диаграмме 42 хорошо видно, что это предпи- сание можно записывать по-разному: от очень Диаграмма 42 длинного, но зато понятного с первого взгляда варианта: ЗНАЧЕНИЕ ВЫРАЖЕНИЯ "КРОКОДИЛ" ПОМЕСТИТЬ В БЛОК ПАМЯТИ С ИМЕНЕМ ТЕРРАРИУМ _ ДЛЯ _ КРОКОДИЛА; до совсем короткого; 5 ПРИСВОИТЬ А; Первое время, пока ты не привык к этому пред- писанию, лучше записывать его в более или менее полной форме, а потом, когда ты с ним освоишься, можно будет перейти на сокращенную запись. Значения имен и выражений. Обрати внимание, что в записи предписания присваивания появилось новое для тебя сочетание слов: значение выражения. До сих пор мы говорили только о значениях гибких полей, так что здесь нужны некоторые пояснения. Как ты помнишь, выражение в Робике — это имя, текст, число или вызов процедуры. Запомни, что ес- а ли выражение — имя, то значением выражения на- зывается содержимое блока памяти с этим именем./ • \ 107
Если же выражение — текст или число, то этот текст или это число и называется значением выражения. О четвертом варианте — вызове процедуры — за- будь до девятого урока. Например, значением выражения "КРОКОДИЛ" будет сам текст "КРОКОДИЛ", значением выраже- ния 5 будет число 5, а вот значением выражения КРОКОДИЛ будет значение имени КРОКОДИЛ, то есть та информация, которая содержится в блоке памяти с именем КРОКОДИЛ. Итак, в результате исполнения предписания ЗНАЧЕНИЕ ВЫРАЖЕНИЯ 1981 ПОМЕСТИТЬ В БЛОК ПАМЯТИ С ИМЕНЕМ ГОД; имя год получит значение 1981 (то есть в блок па- мяти с именем ГОД будет помещено такое число). То же самое предписание можно записать короче: ЗНАЧЕНИЕ 1981 ПРИСВОИТЬ ИМЕНИ ГОД; В результате присваивания ЗНАЧЕНИЕ ТОД" ПРИСВОИТЬ ИМЕНИ КАЛЕНДАРЬ; имя КАЛЕНДАРЬ получит значение "ГОД", то есть текст "ГОД" будет помещен в блок с этим именем. А вот очень похожее присваивание ЗНАЧЕНИЕ ГОД ПРИСВОИТЬ ИМЕНИ КАЛЕНДАРЬ; выполняется совершенно по-другому: в этом случае имени КАЛЕНДАРЬ будет присвоено значение имени год, то есть то самое число 1981, которое хранит- ся в блоке с именем ГОД. Стоп! Прежде чем читать дальше, убедись, что тебе понятно, чем отличаются друг от друга эти два предписания и в чем разница ме- жду именем ГОД и текстом "ГОД". Читать значение любого имени можно много раз. Но если присвоить этому имени новое значение, то старое потеряется безвозвратно. Например, после выполнения предписаний: ЗНАЧЕНИЕ ГОД ПРИСВОИТЬ А; ГОД ПРИСВОИТЬ ИМЕНИ В; ГОД ПРИСВОИТЬ С; 108
имена А, В и С получат одно и то же значение — число 1981 и в блоке памяти с именем ГОД оста- нется такое же число. Но если набрать на термина- ле предписание "НОВЫЙ ГОД" ПРИСВОИТЬ ИМЕНИ ГОД; то значением этого имени вместо числа 1981 станет текст "НОВЫЙ ГОД". Определи, какие значения получат имена МУ ШКА, ЛЯГУШКА, УЖ, ЕЖ, ПЕРВЫЙ _ ТЕРЕ МОК, ВТОРОЙ _ ТЕРЕМОК, ТРЕТИЙ _ ТЕРЕ МОК после выполнения программы: ЗНАЧЕНИЕ 1981 ПРИСВОИТЬ ИМЕНИ МУШКА; ЗНАЧЕНИЕ "МУШКА" ПРИСВОИТЬ ИМЕНИ ЛЯГУШКА; ЗНАЧЕНИЕ ЛЯГУШКА ПРИСВОИТЬ ИМЕНИ УЖ; ЗНАЧЕНИЕ УЖ ПРИСВОИТЬ ИМЕНИ ЕЖ; ЗНАЧЕНИЕ ЕЖ ПРИСВОИТЬ ИМЕНИ ПЕРВЫЙ _ ТЕРЕМОК; ЗНАЧЕНИЕ "ЛЯГУШКА" ПРИСВОИТЬ ИМЕНИ УЖ; ЗНАЧЕНИЕ "УЖ" ПРИСВОИТЬ ИМЕНИ ЕЖ; ЗНАЧЕНИЕ "ЕЖ" ПРИСВОИТЬ ИМЕНИ ВТОРОЙ _ ТЕРЕМОК; ЗНАЧЕНИЕ МУШКА ПРИСВОИТЬ ИМЕНИ ТРЕТИЙ _ ТЕРЕМОК; ЗНАЧЕНИЕ ЛЯГУШКА ПРИСВОИТЬ ИМЕНИ ТРЕТИЙ _ ТЕРЕМОК; ЗНАЧЕНИЕ УЖ ПРИСВОИТЬ ИМЕНИ ТРЕТИЙ _ ТЕРЕМОК; ЗНАЧЕНИЕ ЕЖ ПРИСВОИТЬ ИМЕНИ ТРЕТИЙ _ ТЕРЕМОК; Ответ. Приведем таблицу значений имен: Имя Значение МУШКА ЧИСЛО 1981 ЛЯГУШКА текст "МУШКА" УЖ текст "ЛЯГУШКА" ЕЖ текст "УЖ" ПЕРВЫЙ ТЕРЕМОК текст "МУШКА" ВТОРОЙ ТЕРЕМОК текст "ЕЖ" ТРЕТИЙ ТЕРЕМОК текст "УЖ" 109
Что чему присваивается? Обрати внимание, что в предписании присваивания слово «присвоить» оз- начает то же самое, что «поместить в блок памяти». В газетах и журналах это слово очень часто употре- бляется в совершенно другом смысле (например, «Присвоить Новосибирскому университету имя Ле- нинского комсомола»). Начинающих программи- стов это иногда сбивает с толку и они путают, что чему присваивается. Например, предписание 1981 ПРИСВОИТЬ ГОД; иногда ухитряются прочесть так: «Числу 1981 при- своить имя ГОД». Запомни! В программировании значение при- сваивается имени, а не наоборот. Пока ты привыкнешь к такому употреблению этого слова, старайся не использовать самой корот- кой формы предписания присваивания: вместо 1970 ПРИСВОИТЬ ГОД _ РОЖДЕНИЯ пиши ЗНАЧЕНИЕ 1970 ПРИСВОИТЬ ИМЕНИ ГОД _ РОЖДЕНИЯ; — так труднее ошибиться. Откуда берутся имена. Вероятно, ты уже обра- тил внимание, что одни и те же имена в наших примерах получали различные значения - от коротких чисел до довольно длинных текстов. Возможно, тебя уже заинтересовал вопрос: не может ли длинный текст «переполнить» блок, в кото- ром раньше хранилось маленькое число или короткий текст. Оказывается, не может! В системе Школьница блоки памяти ведут себя как резиновые. Они могут менять размер и автоматически увеличиваться или уменьшаться в зависи- мости от того, какое значение в них нужно поместить. Как это сделано — отдельный и очень интересный вопрос, но в этой книге, к сожалению, нам не хватит места, чтобы подробно на него ответить. А кстати, откуда вообще берутся блоки памяти и их имена? Мы довольно смело использовали в примерах самые разные имена, не интересуясь ио
тем, есть ли в ОЗУ блоки с такими именами. Не- ужели в запоминающем устройстве заранее предус- мотрены блоки для всех имен, какие только можно придумать? Можешь считать, что так! Во всяком случае, какое бы имя ты не использовал в програм- ме, нужный блок всегда найдется. Конечно, не нужно думать, что в системе все вре- д мя существуют блоки с именами «на все случаи жизни». Наоборот, при включении машины почти все блоки/-3=-\ вообще не имеют имен, а содержимое у них у всех одинаковое: ПУСТО. Как только в твоей программе встречается новое имя, которому ты присваиваешь ка- кое-то значение, система сама заведет блок с этим именем и разместит в нем нужное значение. Если же ты по ошибке попытаешься прочесть значение имени, которому ничего еще не присваивал, то система и блока заводить не будет, а просто использует пустое значение. Так что ты можешь условно считать, что для любого придуманного и даже еще не придуманного тобой имени в системе за- ранее заготовлен блок, имеющий перед началом работы программы пустое содержимое (пустой блок, одним словом). Впрочем, есть и такие блоки, которые действительно всегда существуют в системе. Это, например, блок с именем ПУСТО, который всегда имеет пустое содержимое. Им можно воспользоваться, чтобы уничтожить содержимое любого блока памяти и освободить занимаемое им место. Например, после исполнения предписания ПУСТО ПРИСВОИТЬ ИМЕНИ ГОД; имя ГОД не будет иметь никакого значения, то есть система просто уберет этот блок из памяти, а освободившееся место можно будет использовать под другие блоки. Присвоить имени ПУСТО другое значение нельзя: такая попытка сразу вызовет сердитое сообщение системы. Подобные имена, которым нельзя присваивать новых значений, V 7 называются защищенными. С другими защищенными именами \ / системы Школьница ты познакомишься позже. Поговори со мной, система!* В первой главе при- водились примеры диалога с системой Школьница. Вспомни, как проходил диалог: ты набирал предпи- сания, система выдавала на экран свои соображения ill
и задавала вопросы, на которые ты отвечал. Про- грамму для этого диалога составили те, кто разра- батывал систему. Сейчас ты сможешь познакомить- ся с теми предписаниями языка Робик, которые позволяют программисту управлять диалогом. В начале этой книги уже говорилось о том, что для «разговора» с человеком система должна уметь выдавать сообщения на экран телевизора или на другие устройства и принимать сообщения, по- ступающие с различных устройств (например, с кла- виатуры). Для приема и выдачи сообщений в Роби- ке предусмотрено два предписания: ПРЕДПИСА- НИЕ ПРИНЯТЬ и ПРЕДПИСАНИЕ ВЫДАТЬ. Синтаксис последнего описан диаграммой 43. Диаграмма 43 На первый взгляд, диаграмма выглядит страш- новато, особенно, если учесть, что здесь она приве- дена не полностью! Ее изучение могло бы стать не- плохим упражнением к пятому уроку — в ней использованы чуть ли не все описанные там кон- струкции : линейные, ветвящиеся, циклические структуры, обходы, гибкие поля — нет только ре- курсии. Впрочем, присмотревшись повнимательнее, можно понять, что ничего страшного в диаграмме нет. Займемся для начала тем вариантом этого предписания, которое получится, если мы пройдем от Н к К по прямой, никуда не сворачивая. Подста- вляя разные значения гибкого поля ВЫРАЖЕНИЕ, мы можем получить по этой диаграмме такие, на- пример, предписания: ВЫДАТЬ НА ЭКРАН СООБЩЕНИЕ: "ЗДРАВСТВУЙТЕ!"; ВЫДАТЬ НА ЭКРАН СООБЩЕНИЕ: 1982; ВЫДАТЬ НА ЭКРАН СООБЩЕНИЕ: ГОД _ РОЖДЕНИЯ; 112
Скорее всего ты уже понял, как они будут вы- полнены: на экране телевизора появится сообщение, то есть текст или число. Легко сообразить, что на экран попадает значение указанного в предписа- нии выражения. Например, если имя ГОД __ РО Ж ДЕНИЯ по-прежнему имеет значение 1970 (с. ПО), то после выполнения трех этих предписаний изобра- жение на экране будет выглядеть так: ЗДРАВСТВУЙТЕ! 1982 1970 Обрати внимание, что кавычки не выводятся на экран! Это сделано для того, чтобы текст на экране легче было читать. Кстати, предписание ВЫДАТЬ можно использо- вать для того, чтобы просмотреть на экране значе- ние какого-то имени. Например, если тебя интере- сует значение имени ПЕРВЫЙ _ ТЕРЕМОК, ты можешь набрать такое предписание: ВЫДАТЬ НА ЭКРАН СООБЩЕНИЕ: ПЕРВЫЙ _ ТЕРЕМОК; Для полей НА ЭКРАН и СООБЩЕНИЕ предусмо- трены обходные пути, так что эти слова в предписа- нии можно не указывать: ВЫДАТЬ: ПЕРВЫЙ -ТЕРЕМОК; Сообщение может быть и более сложным: на диаграмме предусмотрен цикл, позволяющий за- писывать в одном предписании несколько выраже- ний через запятую. Если сделать так, то система выдаст на терминал значения всех этих выражений вплотную друг к другу, на одной строке, а затем переведет курсор на новую строку. Например, после исполнения предписаний ВЫДАТЬ: 1981, ГОД _ РОЖДЕНИЯ, 1983; ВЫДАТЬ: "ТЕРЕМОК УЖ, ЕЖ, МУШКА,; на экране появятся две строки: 1981 1970 1983 ТЕРЕМОКЛЯГУШКАУЖ 1981 Заметь, что перед каждым числом машина встав- ив
ляет один пробел, а вот тексты никак не разде- ляются на экране. Конечно, разбираться в таком месиве очень неудобно, поэтому программисты обычно используют такой прием: перед каждым именем, значение которого нужно напечатать, они вставляют в сообщение какой-нибудь текст,'чаще всего — несколько пробелов и то самое имя, значе- ние которого должно быть выдано на экран. На- пример : ВЫДАТЬ: 1981, "ГОД _ РОЖДЕНИЯ =", ГОД РОЖДЕНИЯ, " ", 1983; ВЫДАТЬ: "ТЕРЕМОК: ", УЖ, " ", ЕЖ, " ", МУШКА; Теперь сообщение на экране будет выглядеть так: 1981 ГОД _ РОЖДЕНИЯ = 1970 1983 ТЕРЕМОК: ЛЯГУШКА УЖ 1981 Пожалуйста, просмотри еще раз приведенные примеры. Убедись, что тебе понятно, для чего ис- пользованы тексты "ГОД____РОЖДЕНИЯ = " и "ТЕРЕМОК". Вспомни, в чем разница между именем УЖ и текстом "УЖ". Если попытаться выдать значение имени, кото- рому еще ничего не присвоено, то на экране появит- ся слово "ПУСТО" (Заметь, что это слово выдается в кавычках, в отли- чие от текста! А теперь потренируйся сам: попробуй выписать на отдельном листе бумаги сообщения, которые бу- дут появляться на экране терминала во время вы- полнения такой программы: ЗНАЧЕНИЕ ' СИНИЦА" ПРИСВОИТЬ ИМЕНИ ЖУРАВЛЬ; ЗНАЧЕНИЕ 25 ПРИСВОИТЬ ИМЕНИ ЧИСЛО _ ПТИЦ; ЗНАЧЕНИЕ ЖУРАВЛЬ ПРИСВОИТЬ В _ НЕБЕ; ВЫДАТЬ: "ЧИСЛО ПТИЦ:", ЧИСЛО_ПТИЦ, . ", А В НЕБЕ_", ЖУРАВЛЬ; "КУРИЦА" ПРИСВОИТЬ КУРЯТНИК; "ГУСЬ" ПРИСВОИТЬ КУРЯТНИК; "ИНДЮК" ПРИСВОИТЬ КУРЯТНИК; "ЛИСА" ПРИСВОИТЬ КУРЯТНИК; ВЫДАТЬ СООБЩЕНИЕ: "СЕЙЧАС В КУРЯТНИКЕ - ", КУРЯТНИК; 114
КУРИЦА ПРИСВОИТЬ КУРЯТНИК; ГУСЬ ПРИСВОИТЬ КУРЯТНИК; ВЫДАТЬ: "А СЕЙЧАС В КУРЯТНИКЕ - ", КУРЯТНИК; Ответ. ЧИСЛО ПТИЦ: 25, А В НЕБЕ - СИНИЦА СЕЙЧАС В КУРЯТНИКЕ - ЛИСА А СЕЙЧАС В КУРЯТНИКЕ - ' ПУСТО'" Сообщение можно выдать не только на экран, но и на бумагу. Как это сделать, видно из диа- граммы. Например, если набрать предписание ВЫДАТЬ НА БУМАГУ СООБЩЕНИЕ: "МОЙ ГОД РОЖДЕНИЯ - ", ГОД РОЖДЕНИЯ: то на бумажной ленте печатающего устройства по- явится сообщение МОЙ ГОД РОЖДЕНИЯ - 1970 Система принимает сообщение. Ты, конечно, по- мнишь, что во время диалога система не только вы- давала, но и принимала сообщения. Впрочем, не со всякого устройства можно принять сообщение: с клавиатуры и магнитофона — можно, а вот с печа- тающего устройства, конечно, нельзя. Для приема сообщений существует ПРЕД- ПИСАНИЕ ПРИНЯТЬ: ИПРИС воить Диаграмма 44 Например: ПРИНЯТЬ С КЛАВИАТУРЫ СООБЩЕНИЕ И ПРИСВОИТЬ ИМЕНИ: ОТВЕТ; 115
или просто ПРИНЯТЬ: ОТВЕТ; ПРИНЯТЬ: ГОД „РОЖДЕНИЯ; и так далее. Встретив в программе предписание ПРИНЯТЬ С КЛАВИАТУРЫ, система выдает на экран вопро- сительный знак и ждет, пока человек, работающий за пультом, наберет свое сообщение. Весь на- бранный текст — от начала строки до нажатия на клавишу - записывается в блок памяти с ука- занным именем. Например, если предписание вы- глядело так: ПРИНЯТЬ: ГОД__РОЖДЕНИЯ; а ты набрал такое сообщение: МОЙ ГОД РОЖДЕНИЯ - 1972 ГТ"Г А / • \то значением имени ГОД „РОЖДЕНИЯ станет текст 'МОЙ ГОД РОЖДЕНИЯ _ 1972" Заметь, что сам символ |-*^ в сообщение не входит, зато кавычки вокруг текста система под- ставляет сама. Если нужно присвоить имени числовое, а не тек- стовое значение, применяется другая£ форма этого предписания: принять число Сравни два примера: ПРЕДПИСАНИЕ: ПРИНЯТЬ: ОЦЕНКА; ПРИНЯТЬ ЧИСЛО: ОЦЕНКА; Система запрашивает: ? ? Человек набирает: Имя ОЦЕНКА получает 5 5 значение: "5" 5 Если нужно принять несколько чисел, располо- женных на одной строке, необходимо использовать вариант ПРИНЯТЬ ЧИСЛА 116
Например: ПРИНЯТЬ ЧИСЛА: ХИМИЯ, ФИЗИКА, ИСТОРИЯ, ЯЗЫК; Если теперь ты наберешь в строчку 2, 3, 5, 5* то имя ХИМИЯ получит значение 2, имя ФИЗИ- КА — значение 3, а остальные два имени — значе- ние 5. На этом уроке мы словно забыли, что кроме имен блоков памяти есть еще имена исполнителей (точнее, их названия). Впрочем, название исполнителя, это просто имя блока памяти, в котором хранится описание исполнителя. Описанием называет- ся программа, которая моделирует работу исполнителя или, ес- ли это настоящий робот, управляет его работой. Таким образом, в блоках памяти, кроме чисел, текстов и рисунков могут храниться еще и описания исполнителей — это и есть обещанное «в-пятых». Если исполнитель включен, то его имя, конечно, является защищенным: ему нельзя присвоить ника- кое другое значение. Если название или собственное имя исполнителя попадается в предписании ВЫ ДАТЬ, то выдается текст "ИСПОЛНИТЕЛЬ" Пятая перемена Ручная прокрутка В первой главе уже упоминалось! ручной прокрутке: чтобы проверить правильность ▼ | о плана или программы, нужно нарисовать на листе бумаги начальную обстановку, а затем «исполнять» предписания по одному, отмечая все изменения, происходящие при этом в среде. Важнейшая состав- ная часть среды в любой программе — запоминаю- щее устройство. Поэтому для ручной прокрутки нужно уметь изображать на бумаге начальную об- становку в ОЗУ и происходящие в нем изменения. Разумеется, нас интересуют не все блоки памяти, а только те из них, которые используются в про- грамме. Удобнее всего рисовать блоки и их значения ме- лом на школьной доске: ведь для того, чтобы поме- 117
стить в блок новое содержимое, нужно уничтожить (стереть) старое — на доске это сделать очень про- сто. Каждый блок можно рисовать в виде домика, на крыше которого записано имя блока, а внутри размещается содержимое. Например, на рИС зб изображен блок с именем ГОД и содержимым 1981. Защищенные имена 1981 на таком рисунке нужно как-то выделить (например, обвести их кружком или отме- тить цветными мелками). --------- Телевизор, магнитофон, дисковод и Рис. 36 другие устройства, входящие в состав системы, тоже составляют часть среды. Их тоже нужно как-то изобразить на доске. На- пример, для прокрутки программы, напечатан- Рис. 37 118
ЖУРАВЛЬ увело птиц В НЕВЕ КУРЯТНИК КУРИЦА ГУСЬ ЖУРАВЛЬ „синица" число птиц 25 В НЕВЕ „СИНИЦА" 1 КУРЯТНИК КУРИЦА ГУСЬ ЖУРАВЛЬ „СИНИЦА" число птиц 25 В НЕВЕ „СИНИЦА" 7 КУРЯТНИК КУРИЦА А > А ГУСЬ КУРЯТНИК ,ЧУР^ЦА“„гУсь“„т^Ю/<"„Л1^А“ t t КУРИЦА < - : ——ч ГУСЬ , а Рис. 38 ной на с. 109, можно заготовить такую картинку (рис. 37, а). Теперь можно «исполнять» программу. Чтобы присвоить значение любому имени, до- статочно поместить его в соответствующий блок, стерев, если нужно, прежнее содержимое. На рис. 31,6 показана доска после окончания прокрутки. Если доски нет, прокрутку можно вести и на бумаге. При этом таблицу блоков (имен) приходится изображать немножко по- другому, потому что стирать старые значения на бумаге неудобно, лучше их зачеркивать. Проследим, например, за прокруткой про- граммы со с. 114. Перед началом работы нарисуем 119
таблицу (рис. 38, а). После исполнения первых четы- рех предписаний таблица будет выглядеть так (рис. 38,6): Следующие четыре предписания работают с од- ним и тем же именем КУРЯТНИК, причем каждое новое значение стирает предыдущее. Поэтому пос- ле выполнения второго предписания ВЫДАТЬ вид таблицы изменится (рис. 38, в). Теперь хорошо видно, что имена КУРИЦА и ГУСЬ никаких значений не имеют (то есть имеют, пустые значения). После выполнения последних трех предписаний таблица примет вид, показанный на рис, 38, г (пересылки показаны стрелками). А теперь попробуй сделать такую же прокрутку для программы со с. 109 и убедись, что таблица дей- ствительно получается такой, как показано на рис. 37, 6. Восьмой урок Процедуры V Храните программы в ОЗУ! Мы уже много раз упоминали о программах, хранящихся в памяти ЭВМ. Такие программы называются про- цедурами. Имя блока, памяти, в котором хранится программа, называется именем процедуры. Обычно стараются выбирать такие имена, чтобы по ним можно было понять, для чего процедура предназна- чена. Чтобы хранящаяся в блоке памяти процедура начала выполняться, ее нужно вызвать. Для этого применяется такое предписание: Диаграмма 45 На диаграмме видно, что процедуру можно вы- звать двумя способами: написать перед именем 120
процедуры слово ВЫЗВАТЬ или поставить после имени процедуры круглые скобки, в которых могут быть указаны значения параметров (что это такое, ты узнаешь на следующем уроке). Например, если программа для робота ДЕЖУРИК, описанного в первой главе, хранится в блоке с именем ДЕЖУР СТВО, то вызвать ее можно такими способами: ВЫЗВАТЬ ПРОЦЕДУРУ ДЕЖУРСТВО; ВЫЗВАТЬ ДЕЖУРСТВО; ДЕЖУРСТВО ( ); А можно и так: ВЫЗВАТЬ ДЕЖУРСТВО ( ); Как запоминаются процедуры? Посмотрим те- перь, что нужно сделать, чтобы система запомнила процедуру. Проследим за работой юной програм- мистки Оли, набирающей на клавиатуре процедуру ДЕЖУРСТВО. Девочка только что включила машину. Система Школьница уже поздоровалась с ней и выдала на экран звездочку — приглашение к диалогу (если ты забыл, как происходит диалог с системой, вернись на с. 46). Сейчас Оля набирает новое для тебя пред- ▼] писание языка Робик: --- ЗАПОМНИТЬ ПРОЦЕДУРУ ДЕЖУРСТВО; Нажата клавиша перевода строки и с машиной начинают происходить странные вещи. Сначала на несколько секунд включается дисковод. Затем изо- бражение на экране телевизора мгновенно гаснет, раздается звуковой сигнал, на верхней строке по- является надпись РЕДАКТОР, а на следующей строке вместо привычной звездочки цифра 1. Что же произошло? Это включился РЕДАК- ТОР — один из исполнителей, входящих в состав системы Школьница. РЕДАКТОР предназначен для запоминания, просмотра и исправления различных текстов, в том числе текстов процедур. Этот испол- нитель имеет два режима работы: режим запомина- ния и режим исправления. Если включить этот ис- полнитель с помощью предписания ЗАПОМНИТЬ ПРОЦЕДУРУ, как это сделала Оля, то он начинает работать в режиме запоминания и каждое следую- щее предписание будет записывать в запоминаю- щее устройство вместо того, чтобы его исполнить. 121
В качестве приглашения в этом режиме используется номер очередной строки. После того как Оля наберет первые три предпи- сания, текст на экране телевизора будет выглядеть так: РЕДАКТОР 1 ОТКРОЙ ОКНО; 2 СОТРИ С ДОСКИ; 3 ЗАКРОЙ ОКНО; 4 Ты уже, наверное, понял, что заголовок и номера строк в этом тексте выдала система Школьница (точнее говоря, исполнитель РЕДАКТОР, входящий в состав этой системы), а все предписания набирала ДОля. Еще раз обрати внимание на то, что машина сейчас не исполняет и даже не проверяет эти пред- писания, а только запоминает их. Кстати, а для чегб нужны номера строк? Сейчас увидим. Вероятно, ты заметил, что Оля допустила /“\ошибку. Если не заметил, вернись и попробуй ее |5Т0Р|найти. Нашел? Конечно же, она пропустила предпи- —'сание НАМОЧИ ТРЯПКУ. Чтобы вставить его на место, придется перейти в другой режим — режим исправления. Для этого достаточно в ответ на оче- редное приглашение (в нашем примере — в ответ на номер 4) нажать на клавишу перевода строки, не набирая никакого предписания. При этом на экране появится другое приглашение — двоеточие. Это зна- чит, что РЕДАКТОР перешел в режим исправления и готов принять и исполнить любое предписание из своего МПИ. Оля набирает нужное предписание: ВСТАВИТЬ 2; Это значит, что перед второй строкой нужно вста- вить одно или несколько предписаний. Теперь РЕДАКТОР автоматически возвращается в режим запоминания и выдает на экран номер нужной строки: 2 Оля набирает НАМОЧИ ТРЯПКУ; и переводит строку. На экране появляется цифра 3, исполнитель ждет продолжения, но программистка 122
сразу переводит строку, тем самым переключая РЕ- ДАКТОР в режим исправления. На экране вновь появляется двоеточие. Теперь можно дописать по- следнее предписание процедуры. Для этого Оля переводит РЕДАКТОР в режим запоминания: ДОПИСАТЬ; На экране появляется цифра 5, Оля набирает предписание СЯДЬ НА МЕСТО; Появляется цифра 6, но Оля опять меняет режим, нажав клавишу перевода строки. Для контроля она решила просмотреть полный текст процедуры и для этого набирает новое предписание: ВЫДАТЬ; На экране появляется полный текст процедуры: О ПРОЦЕДУРА ДЕЖУРСТВО; 1 ОТКРОЙ ОКНО; 2 НАМОЧИ ТРЯПКУ; 3 СОТРИ С ДОСКИ; 4 ЗАКРОЙ ОКНО; 5 СЯДЬ НА МЕСТО; Обрати внимание, что номера предписаний СОТРИ С ДОСКИ и ЗАКРОЙ ОКНО автоматически увели- чились на единицу, когда Оля вставила перед ними новое предписание. А строчку с нулевым номером РЕДАКТОР добавил сам. Убедившись, что все правильно, Оля набирает еще одно, последнее предписание из МПИ РЕДАК- ТОРа: ЗАКОНЧИТЬ; Какую-то долю секунды ничего не происходит: си- стема просматривает текст процедуры в поисках ошибок. Не обнаружив ошибок, она запрашивает: Записывать на диск? Оля отвечает: ДА Вновь на секунду включается дисковод: теперь текст процедуры хранится на магнитном диске и не потеряется при случайном выключении машины. За- 123
тем раздается звуковой сигнал, гаснет надпись РЕ- ДА1СГОР, экран очищается и на нем появляется звездочка. Система выключила РЕДАКТОР и вер- нулась в обычный режим диалога. ♦ * * V Предписания, входящие в состав процедур, на- зывают операторами, а обычные предписания, ко- торые исполняются сразу, называют директивами. Почти все предписания из МПИ различных ис- * полнителей могут быть и операторами, и директи- вами. Такие предписания называют универсальными. / <»\Если ты набираешь универсальное предписание в обычном режиме, когда система выдает на экран звездочку, получится директива, которую система тут же исполнит (если, конечно, ты набрал ее без ошибок). А если такое же предписание набрать в режиме запоминания' процедуры, когда система выдает номер строки, получится оператор. {ОПЕРАТО^ ЗАКОНЧИТЬ)-С|ОПИСАНИЕ\--- Диаграмма 46 124
Некоторые предписания могут быть только ди- рективами, то есть их нельзя использовать в соста- ве процедур. К ним относятся известные тебе пред- писания из МПИ РЕДАКТОРа, предписание ЗА- ПОМНИТЬ ПРОЦЕДУРУ и некоторые другие. Полная синтаксическая диаграмма для процедуры приведена на с. 124 (диаграмма 46). Разговор о параметрах, внутренних именах и других непонятных участках этой диаграммы от- ложим до следующего урока. А сейчас еще несколь- ко слов о любых процедурах, в том числе и самых простых — без параметров и внутренних имен. Во-первых, заметим, что запоминание проце- дуры в каком-то смысле напоминает присваивание: некоторому имени (имени процедуры) присваивает- ся новое значение — текст этой процедуры. Если та- кое же значение нужно присвоить другому имени, можно использовать обычное присваивание. Напри- мер, предписание ЗНАЧЕНИЕ ДЕЖУРСТВО ПРИСВОИТЬ А. ИМЕНИ УБОРКА; /£\ позволит записать в блок с именем УБОРКА точно такое же описание процедуры. Теперь ты можешь с одинаковым успехом писать ВЫЗВАТЬ ПРОЦЕДУРУ ДЕЖУРСТВО; ИЛИ ВЫЗВАТЬ ПРОЦЕДУРУ УБОРКА; в обоих случаях робот ДЕЖУРИК начнет испол- нять одни и те же предписания. И все-таки имя процедуры — не совсем обычное имя! Это станет заметным, если ты попробуешь присвоить ему другое значение, например: ЗНАЧЕНИЕ 5 ПРИСВОИТЬ ИМЕНИ УБОРКА; Система исполнит такое предписание не сразу! Сперва она переспросит: Процедура УБОРКА: Стирать? Если на этот вопрос ответить ДА, то машина д исполнит предписание, если ответить НЕТ или на- брать любой другой ответ, предписание останется/ *.А неисполненным. Такой контроль предусмотрен для того, чтобы избежать случайных ошибок: ведь опи- 125
сание большой процедуры занимает много времени и было бы обидно из-за минутной забывчивости или описки уничтожить результат своего или, тем более, чужого труда. Таким образом, имена проце- V^yp частично защищенные: им можно присваивать другие значения, но только после некоторых «пере- говоров» с системой. Впрочем, во время исполнения процедуры ее имя будет уже не частично, а пол- ностью защищенным и его значение вообще нельзя будет изменить! Остановиться, оглянуться... А теперь стоп! Про- цедуры — это важнейшая конструкция современных ©языков программирования. Ты обязательно должен хорошо разобраться с тем, как их запоминать и как вызывать. Убедись, пожалуйста, что тебе понятно: — что такое процедура (приведем полное опре- деление) : А Процедура — это программа или часть про- граммы, которая предназначена для хранения в запоминающем устройстве и может быть вызвана по имени. — как запомнить и вызвать процедуру (начинаю- щие программисты иногда не понимают разницы между запоминанием и вызовом процедуры); Помни, что все операторы в процедуре будут исполняться только тогда, когда процедуру вызывают, а не тогда, когда ее запоминают. — что такое операторы и чем они отличаются от директив; — для чего нужны номера строк в процедуре; — в каких случаях система выдает на экран звез- дочку *, в каких — двоеточие (:), а в каких — номер строки; — что такое частично-защищенные и полностью защищенные имена. Если хотя бы один из этих вопросов тебе не со- всем понятен, вернись, пожалуйста, назад и посмо- три еще раз материал этого урока. ---- И еще одно маленькое замечание: хорошие ком- ментарии в процедурах еще важнее, чем в програм- ме
мах, состоящих из директив. Коммента'рии обяза- тельно нужно набирать вместе с операторами — тогда они будут храниться в ЗУ и их можно будет просмотреть вместе с текстом процедуры. Иногда комментарии получаются достаточно длинными (бывают такие процедуры, в которых они занимают в два-три раза больше места, чем предписания). Такие комментарии удобно записы- вать на отдельных строках. Сделать это очень про- сто: после номера очередного оператора сразу ста- вим точку с запятой, а затем записываем коммента- рий. Например: ЗАПОМНИТЬ ПРОЦЕДУРУ НОВОЕ__________ДЕЖУРСТВО; ; Эта процедура предназначена ; для управления исполнителем ; ДЕЖУРИК, убирающим класс ;на перемене ДЕЖУРИК проветривает ; класс и готовит доску к новому ;уроку. Начальная ситуация: ;окно закрыто, доска грязная, тряпка сухая. ОТКРЫТЬ ОКНО; ТОМ_____СОЙЕР красит забор. Если с процедурами тебе все понятно (или, по крайней мере, кажется, что понятно), попробуем провес- ти небольшую практичес- кую работу. Для этого нам понадобятся два исполните- ля : наш старый знакомый МАШИНИСТ и новичок- робот-маляр w по имени ТОМ_____СОЙЕР. В одной руке у него кисть, а в дру- гой — ведро с краской. Ко- нечно, настоящие роботы- маляры пользуются гораз- до более современным обо- рудованием, но для трени- ровки нам подойдет и такой робот (рис. 39). Рис. 39. Исполнитель ТОМ СОЙЕР 127
Вот его МПИ: ОБМАКНУТЬ ВВЕДРО ОКРАСКОЙ СТРЯХНУТЬ ЛИШНЮН)\*\ КРАСКУ\ *\ВПРАВО\— Диаграмма 47 ТОМ____СОЙЕР красит заборы, сделанные из досок разной ширины и различным расстоянием между ними. Высота всех досок одинакова, и робот с одного взмаха проводит кистью по доске сверху донизу. При этом кисть захватывает полосу шириной в 5 см. Перед каждым взмахом кисти ее нужно об- макнуть в ведро и стряхнуть лишнюю краску. Необходимо покрасить забор,, изображенный на рис. 40. Ширина большой доски 40 см, маленькой — 20 см, ширина промежутка между досками 10 см. Забор нужно покрасить в три слоя, причем сделать это «в три прохода»: сначала покрасить весь забор один раз слева направо, потом еще два раза в том 128
Можно, конечно, решить эту задачу без всяких процедур. Но тогда получится ужасно длинная про- грамма. Чтобы покрасить одну только большую доску в три слоя, нужно в общей сложности 24 взма- ха кисти и столько же перемещений робота, а на каждый взмах приходится три предписания! Значит, на каждую большую доску нужно 24 х 4 = 96 пред- писаний, на маленькую 48, а всего в программе бу- дет (с учетом интервалов между досками) 96 x54- 48 x 20 -1- 25 x3 = 1515 предписаний! Чест- ное слово, проще самому покрасить забор в десять слоев, чем писать такую программу! И самое обид- ное, что программа-то сплошь состоит из совер- шенно одинаковых кусочков: ОБМАКНУТЬ — СТРЯХНУТЬ - ПРОВЕСТИ, ОБМАКНУТЬ - СТРЯХНУТЬ - ПРОВЕСТИ... Раз такие участки в программе повторяются в точности, значит, имеет смысл их запомнить и назвать каким-то од- ним общим именем. Одним словом, нужно описать процедуру. Так и запишем: ЗАПОМНИТЬ ПРОЦЕДУРУ ОДИН___ВЗМАХ; ОБМАКНУТЬ КИСТЬ; СТРЯХНУТЬ ЛИШНЮЮ КРАСКУ; ПРОВЕСТИ ПО ДОСКЕ; ЗАКОНЧИТЬ; Уже проще. Теперь, чтобы покрасить маленькую доску в один слой, достаточно вызвать эту процеду- ру 4 раза, каждый раз сдвигая робота на 5 см впра- во. А таких досок двадцать. Внимание! Опять по- вторяющийся участок, только «более крупный». Что ж, опишем еще одну процедуру: ЗАПОМНИТЬ МАЛЕНЬКАЯ _ ДОСКА; ВЫЗВАТЬ ОДИН - ВЗМАХ; ВПРАВО НА 5 СМ; ВЫЗВАТЬ ОДИН _ ВЗМАХ; ВПРАВО НА 5 СМ; ВЫЗВАТЬ ОДИН _ ВЗМАХ; ВПРАВО НА 5 СМ; ВЫЗВАТЬ ОДИН _ ВЗМАХ; ЗАКОНЧИТЬ; Процедура окраски маленькой доски (ши- рина 20 см) в один слой. В начале работы ТОМ_____СОЙЕР сто- ит у левого края доски. В конце-у правого. Обрати внимание на комментарий: сведения обо всей процедуре расписаны по разным строчкам — так поступают довольно часто. 5 Г. А. Звенигородский 129
Теперь займемся большой доской. Можно было бы описать для нее такую же процедуру, только вдвое длиннее. Но зачем же повторяться — доста- точно два раз’а вызвать уже готовую процедуру МАЛЕНЬКАЯ _ДОСКА: ЗАПОМНИТЬ БОЛЬШАЯ____ДОСКА; МАЛЕНЬКАЯ _ ДОСКА ( ); ВПРАВО НА 5 СМ; МАЛЕНЬКАЯ _ ДОСКА ( ); ЗАКОНЧИТЬ; ДИтак, можно сформулировать для себя правило: если есть повторяющиеся участки, объединяй их в процедуру. Но ведь у нас есть еще один повто- ряющийся участок: «блок» из одной большой и четырех маленьких досок. Вывод ясен: ЗАПОМНИТЬ БЛОК; БОЛЬШАЯ _ ДОСКА ( ); ВПРАВО НА 15 СМ,; МАЛЕНЬКАЯ _ ДОСКА ( ); ВПРАВО НА 15 СМ; МАЛЕНЬКАЯ _ ДОСКА ( ); ВПРАВО НА 15 СМ; МАЛЕНЬКАЯ _ ДОСКА ( ); ВПРАВО НА 15 СМ; МАЛЕНЬКАЯ _ ДОСКА ( ); ВПРАВО НА 15 СМ; ЗАКОНЧИТЬ; А Предписание ВПРАВО НА 15 СМ повторяется после каждой процедуры. А нельзя ли его «спрятать» внутрь процедур? На- —•—^пример, добавить это предписание в конец процедуры МА ЛЕНЬКАЯ _ ДОСКА? Осторожно! Ведь тогда процедура .—.БОЛЬШАЯ _ ДОСКА сработает неправильно! Впрочем, не так |5Т0Р|уЖ сложно описать новую процедуру МАЛЕНЬКАЯ _ ДОСКА \/_____И___СДВИГ. Попробуй сделать это сам и заодно посмот- ри, как исправить процедуру БЛОК. Получилось? Итак, окраска всего забора в один слой: ЗАПОМНИТЬ ОДИН _ ПРОХОД; БЛОК ( ); БЛОК ( ); БЛОК ( ); БЛОК ( ); БЛОК ( ); ЗАКОНЧИТЬ; 130
Все хорошо? Не совсем: после каждого прохода роботу нужно возвращаться назад, так что это предписание имеет смысл поставить в конец проце- дуры ОДИН _ ПРОХОД: ДОПИСАТЬ; ВЛЕВО НА 845 СМ; ЗАКОНЧИТЬ; Теперь нам, пожалуй, описывать процедуру не понадобится. Оставшаяся часть программы состоит только из директив: ВКЛЮЧИТЬ ТОМ _ СОЙЕР; ВПРАВО НА 20 СМ; Заняли исходное положение ОДИН____ПРОХОД ( ); ОДИН____ПРОХОД ( ); ОДИН____ПРОХОД ( ); Остановились у левой доски ВЫКЛЮЧИТЬ ТОМ______СОЙЕР; Вместо полутора тысяч предписаний не больше пятидесяти. И, самое главное, почти нет одно- образных повторений (как избавиться от этого «по- чти» ты узнаешь на одном из следующих уроков). Новая встреча с рекурсией. Попробуем решить новую задачу. Забор состоит из очень большого ко- личества досок шириной 20 см. Сколько их — точно неизвестно, но, во всяком случае, йе меньше тыся- чи. В остальном сохраняются условия предыдущей задачи. Нужно составить программу для покраски такого забора в один слой. С первого взгляда вообще непонятно, как под- ступиться к такой задаче. Больше тысячи досок, да еще и неизвестно, сколько именно! Попробуем в лоб. Посмотрим, как будет выглядеть программа для покраски нескольких первых досок. Процедура МАЛЕНЬКАЯ _____ДОСКА уже описана, так что можно написать (но набирать пока не стоит) такие предписания: ВКЛЮЧИТЬ ТОМ _ СОЙЕР; ВПРАВО НА 20 СМ; МАЛЕНЬКАЯ _ ДОСКА ( ); ВПРАВО НА 15 СМ; МАЛЕНЬКАЯ _ ДОСКА ( ); ВПРАВО НА 15 СМ; 5* 131
Каждый раз после вызова процедуры МАЛЕНЬ КАЯ___ДОСКА повторяется одна и та же дирек- тива: ВПРАВО НА 15 СМ. Значит, имеет смысл превратить ее в оператор и добавить к описанию процедуры: ДОПИСАТЬ; ВПРАВО НА 15 СМ; ЗАКОНЧИТЬ; /у\ Вот й готово еще одно правило «для себя»: если- / после вызова процедуры или перед ним всегда ис- пользуются одни и те же предписания, то их, ве- роятно, стоит добавить к описанию процедуры... После вызова' исправленной процедуры МАЛЕНЬ А. КАЯ ____ДОСКА у нас опять-таки всегда стоит / • \ одно и то же предписание — вызов этой же проце- дуры! А нельзя ли и этот вызов добавить к описа- нию процедуры? ДОПИСАТЬ; ВЫЗВАТЬ МАЛЕНЬКАЯ _ ДОСКА; ЗАКОНЧИТЬ; Теперь эта процедура имеет вид ПРОЦЕДУРА МАЛЕНЬКАЯ _ ДОСКА; ВЫЗВАТЬ ОДИН____ВЗМАХ; Процедура окраски ВПРАВО НА 5 СМ; маленькой доски (ши- ВЫЗВАТЬ ОДИН____ВЗМАХ; рина 20 см) в один ВПРАВО НА 5 СМ; слой. В начале работы ВЫЗВАТЬ ОДИН—ВЗМАХ; ТОМ________СОЙЕР сто- ВПРАВО НА 5 СМ; ит у левого края доски, ВЫЗВАТЬ ОДИН_____ ВЗМАХ; в конце-у правого. ВПРАВО НА 15 СМ; ВЫЗВАТЬ МАЛЕНЬКАЯ ДОСКА; ЗАКОНЧИТЬ; Кстати, комментарий тоже нужно исправить - но с этим ты вполне можешь справиться сам. ---- Обрати внимание, что эта процедура вызывает сама себя! С такой ситуацией ты уже встречался во ----«второй главе, помнишь? Такую конструкцию мы называли рекурсией, так что тебя не должно уди- влять, что Процедуры, которые вызывают сами себя, на- зываются рекурсивными. 132
А теперь посмотрим, как будет выполняться та- кая процедура. Представь ч себе, что исполнитель уже включен и ты набираешь на клавиатуре тер- минала предписание ВЫЗВАТЬ МАЛЕНЬКАЯ____________ ДОСКА. ТОМ________СОЙЕР начинает работу. Он исполняет процедуру в порядке номеров: взмах — сдвиг, взмах — сдвиг и т. д. Вот он дошел до конца доски... сдвинулся на 15 сантиметров... вновь вызвал ту же самую процедуру и начал ис- полнять те же самые предписания: взмах — сдвиг, взмах — сдвиг... снова дошел до конца доски и все повторяется сначала. Похоже, что по такой про- грамме робот действительно выкрасит все доски, сколько бы их ни было, а потом... а что потом? До каких пор. бу дет работать ТОМ ___СОЙЕР? Если судить по программе, то он зациклится, то есть бу- дет работать до бесконечности. На самом деле, конечно, забор когда-нибудь да кончится, и робот не сможет выполнить очередное предписание (не будет доски, по которой можно бы- ло бы ПРОВЕСТИ КИСТЬЮ). Тогда робот оста- новится, и система выдаст сообщение об ошибке, а потом будет ждать следующего твоего предписа- ния. Рекурсивные процедуры можно использовать в тех случаях, когда одни и те же предписания мож- но повторять много раз подряд. Но делать это надо очень осторожно, чтобы программа не заци- клилась. Если робот работает медленно и програм- мист легко может за ним уследить, опасность не так уж велика. И все-таки для робота-водолаза, ко- торый должен снять с подводной части корабля двенадцать неисправных заклепок, рекурсивную программу писать не стоит. Такой робот может за- циклиться и начать разбирать весь корабль, а программист заметит это, только оказавшись в воде. Можно, однако, добиться, чтобы рекурсивная процедура сама следила за своей работой, чтобы не зациклиться. Об этом мы узнаем в следующей гла- ве. Там же будут описаны более удобные, чем ре- курсия, средства для программирования повто- ряющихся действий. Тогда мы сможем под- робнее обсудить и достоинства, и недостатки рекурсии. 133
Процедуры и планы. А теперь вернемся к про- ♦ грамме для МАШИНИСТа, которую мы составляли —-_>на третьем уроке (с. 61). Программа получилась до- вольно длинной, и мы обещали научить тебя, как сделать ее покороче. С первого взгляда видно, что в программе встречается много повторяющихся участков. А раз есть повторения, стоит посмотреть, не пригодятся ли нам процедуры. Можйо попробовать применить тот же прием, что для исполнителя ТОМ _ СОЙЕР: посмотреть, какие группы предписаний в программе повторяют- ся в точности, и превратить эти группы в проце- дуры. Для нашей программы это сделать несложно: она ведь уже написана и можно посмотреть, какие именно предписания повторяются. Но ведь не бу- дешь же каждый раз писать длинную программу только для того, чтобы посмотреть, как ее сокра- тить! Поэтому попробуй на минутку забыть, что программа уже составлена. Подумай, как бы ты на- чал писать ее теперь, зная о процедурах. Для исполнителя ТОМ _ СОЙЕР мы сразу об- наружили такие действия, которые наверняка будут много раз повторяться в программе: один взмах кисти, покраска одной доски и т. д. Может быть, и здесь можно так же? К сожалению, нет. Для МА- ШИНИСТа можно придумать чересчур много про- цедур и трудно предсказать, какие из них пригодят- ся. Может быть описать процедуру для перевода одного вагона в тупик? Или для перевода всего со- става на путь Б? Или что-нибудь еще? Можно, ко- нечно, сочийить процедуры на все случаи жизни, а потом посмотреть, какие из них и в самом деле понадобились. Но нетрудно сообразить, что это не самый лучший способ: уж больно много беспо- лезных процедур можно придумать. А нельзя ли догадаться заранее, какие процедуры нам будут нужны, а потом описывать только их? Можно! Для этого достаточно составить общий план* а затем описать процедуру для каждого его пункта. Посмотри на общий план, приведенный на с. 60. Если следовать ему, то для нужной нам перестанов- ки вагонов необходимо выполнить три предписа- ния. В МПИ МАШИНИСТа ни одного из них нет, поэтому на третьем уроке мы начали уточнять этот плай и только на последнем этапе уточнения соста- 134
вили по нему программу. А сейчас попробуем взглянуты на него несколько по-новому. Если бы у нас были описаны разные процедуры для перестановок вагонов, то пригодились бы из них только три — те, которые выполняли бы пункты этого алгоритма. Точнее говоря, даже две — первое и третье предписания одинаковы. Значит, не нужно описывать много процедур, достаточно описать эти две! Названия для них уже есть — это сами пункты общего плана (хотя можно их сделать чуть покоро- че). Порядок, в котором их нужно вызывать, изве- стен. Мы знаем названия процедур и порядок, в кото- А ром их надо вызывать. А нужно ли что-нибудь еще, чтобы превратить общий план в программу? В об-^— щем-то ничего! Нужно, конечно, запомнить эти процедуры, но это можно сделать и чуть позже. Правда, сейчас мы не сможем их вызвать, поэтому составлять такую программу из директив пока нель- зя-система все время будет отвечать НЕ ПО- НИМАЮ. А вот запомнить все это в виде проце- дуры можно уже сейчас, но вызовем мы эту процедуру только тогда, когда все будет описано: ЗАПОМНИТЬ ПРОЦЕДУРУ ПЕРЕСТАНОВКА______ ВАГОНОВ; ПОМЕНЯТЬ _ СРЕДНИЙ _ И _ ЛЕВЫЙ ( ); ПОМЕНЯТЬ _ ПРАВЫЙ _ И _ СРЕДНИЙ ( ); ПОМЕНЯТЬ _ СРЕДНИЙ _ И _ ЛЕВЫЙ ( ); ЗАКОНЧИТЬ; Этот текст уже можно набирать на терминале. А теперь опишем все вызываемые здесь процедуры. Начнем с процедуры ПОМЕНЯТЬ _ СРЕД НИЙ ___И ___ЛЕВЫЙ. Уточненный план для нее уже написан (с. €0). Можно применить тот же при- ем: сразу описываем эту процедуру, заменяя все предписания, которых нет в МПИ, вызовами новых процедур. Нужно только следить, чтобы одина- ковые предписания получали одинаковые имена: ЗАПОМНИТЬ ПРОЦЕДУРУ ПОМЕНЯТЬ___СРЕДНИЙ_____И____ЛЕВЫЙ; ПОДВЕСТИ____НА___А ( ); Подводим локомотив ПРИЦЕПИТЬ____ТРИ___ВАГОНА ( );к вагонам НАЗАД; Переводим на путь Б НА___ПУТЬ____В ( ); Оставляем левый вагон 135
ОТЦЕПИТЬ ВАГОН; НАЗАД; ПОДВЕСТИ___НА___ А ( ); ОТЦЕПИТЬ ВАГОН; НАЗАД; НА___ПУТЬ___В ( ); ПРИЦЕПИТЬ ВАГОН; НАЗАД; ПОДВЕСТИ___НА___А ( ); ЛОКОМОТИВ___НА____МЕ( ЗАКОНЧИТЬ; в тупике Переводим остальные на А Оставляем там средний вагон Правый вагон-на Б Цепляем к нему левый вагон Возвращаем оба вагона ( ); на путь А Осталось составить только несколько простых процедур. Приведем для примера - текст одной из них (с остальными ты без труда справишься сам): ЗАПОМНИТЬ ПРОЦЕДУРУ НА _ ПУТЬ _ В; ВПЕРЕД; ПЕРЕВЕСТИ СТРЕЛКУ; ВПЕРЕД; ЗАКОНЧИТЬ; Теперь осталось только описать уточняющие планы для остальных двух предписаний, превратить их в процедуры и описать все встретившиеся при этом новые процедуры (если такие будут). Сделай это, пожалуйста, сам. Вот и все, программа готова. Чтобы ее испол- нить, достаточно набрать одну-единственную ди- рективу: ВЫЗВАТЬ ПЕРЕСТАНОВКА _ ВАГОНОВ; ИЛИ ПЕРЕСТАНОВКА _ ВАГОНОВ ( ); Сверху вниз и снизу вверх. Ты уже заметил, ко- г нечно, что процедуры для робота-маляра и для МА- ПЩНИСТа мы описывали по-разному. Для маляра мы начинали с процедур нижнего уровня, то есть с таких, которые содержат только предписания из МПИ, без вызовов других процедур. От нижнего уровня мы перешли к процедурам для описания бо- лее сложных'действий (покраска маленькой доски, один проход и т. д.), а в самом конце составили 136
главную процедуру (процедуру верхнего уровня)X 7 Главная процедура соответствует общему плану ре- \ / шения задачи. v Такой способ программирования называют про- граммированием снизу вверх: от нижнего уров-г—7 ня — к верхнему, от простых предписаний — к более \ / сложным, от уточненного плана — .к общему. Про- грамма для МАШИНИСТа составлялась в обрат- ном порядке — сверху вниз: мы начали с общегоV 7 плана, сразу написали для него программу (глав- \ / ную процедуру), а затем стали описывать те про- V цедуры, вызов которых был предусмотрен в главной. Всякий велосипедист хорошо знает, что ехать сверху вниз быстрее и удобнее, чем снизу вверх. В программировании дело обстоит примерно так л же: сверху вниз писать программы удобнее, во- /j\ первых, потому, что программа пишется одновре-^ > менно с составлением плана и в точности ему со- ответствует и, во-вторых, потому, что при таком методе мы точно знаем, какие процедуры описы- вать. Но есть у этого метода и недостаток: на верх- нем уровне не Всегда видно, куда спускаться, то есть как разделить решение задачи на такие части, каждую из которых было бы легко описать отдель- ной процедурой. У опытных программистов выра- батывается своеобразное чутье: они сразу видят, ка- кие нужны процедуры, а новичкам иногда прихо- дится туго. Кроме того, отладку такой программы на машине обычно можно начинать только после того, как написана вся программа сверху донизу: ведь процедуры верхнего уровня не смогут рабо- тать, пока не описан весь нижний. Впрочем, суще- ствуют специальные приемы, позволяющие отла- живать большие программы св_ерху вниз еще до того, как будут составлены процедуры ниж- него уровня, но для маленьких программ эти приемы неудобны. Метод «снизу вверх», хотя и требует большого труда, бывает очень полезен на первых порах. Пусть даже половину составленных тобой процедур придется потом выбросить, но зато ты хорошо почувствуешь, какие процедуры для этого исполни- теля можно составить. Да и отлаживать каждую 137
Днаписанную процедуру можно сразу: ведь все, что «под ней», уже описано (а обычно-и отла- жено). Словом, любишь кататься сверху вниз- люби и саночки возить (в обратном направ- лении). Опытные программисты иногда применяют ме- тод «снизу вверх» для того, чтобы заранее загото- вить для каждого нового исполнителя набор проце- дур, которые могут понадобиться в различных за- дачах. Например, если предстоит много работы с исполнителем вроде ЧЕРТЕЖНИКа, который умеет только проводить прямые линии, то наверня- ка стоит заготовить процедуры для изображения прямоугольников, окружностей и других геометри- ческих фигур — по своему усмотрению. Таким спо- собом программист как бы расширяет МПИ, доба- вляя недостающие, по его мнению, предписания, приспосабливая исполнителя к определенной группе задач и к себе. К себе? Конечно ведь он выбирает такие процедуры и такие названия для них, с ко- торыми именно ему будет удобнее, привычнее, при- ятнее работать. Так что возить саночки приходится не только новичкам! Хорошо подобранный набор процедур нижнего уровня по- зволяет вообще забыть об МПИ: мы словно обучаем для себя нового, более умелого исполнителя, который может выполнять более сложные действия. Например, научили исполнителя ТОМ____СОЙЕР выполнять предписание ОДИН__ВЗМАХ () -и можно забыть про ведро с краской. Так что процедуры, помимо всего прочего, можно считать средством обучения исполнителей! Самое интересное, что мы сами учимся примерно так же! Когда в первом классе ты учился писать буквы, то, наверняка, хорошо помнил, в каком порядке нужно выписывать, например, букву А: сначала ставим ручку сюда... рисуем завитушку, те- перь наверх, теперь палочку, теперь перекладину. Но прошло совсем немного времени — и тебе уже не нужно было вспо- минать про все эти палочки и перекладины. Ты освоил новое предписание (написать букву А), и его составные части спрята- лись куда-то в запоминающее устройство. Похоже на запомина- ние процедуры, правда? Только система Школьница всегда может выдать текст лю- бой процедуры, которая хранится в ее запоминающем устрой- стве, а ты сейчас, наверное, не сможешь и вспомнить про палоч- ки и завитушки. 138
Итак, зачем нужны процедуры? Ответ. Использование процедур позволяет: 1. Запомнить программу (часть программы) у ч и вызывать ее всякий раз, когда она понадобится. [STOP] 2.. Обучать исполнителя новым предписаниям, то х есть расширять МПИ, приспосабливая его к набору задач и к себе. 3. Писать, проверять и отлаживать большую программу по частям, 4. Составлять программу сверху вниз, одновре- менно с планом и в точном соответствии с ним. 5. Избежать повторения одинаковых участков в программах: такие участки можно один раз опи- сать в виде процедуры, а затем каждый раз вызы- вать ее в нужном месте. 6. Переделывать программы и исправлять в них ошибки, не затрагивая тех частей программы, ко- торые остаются без изменений. На следующем уроке ты познакомишься с пара- метрами и внутренними именами процедур, и этот список можно будет дополнить. А пока — очередная перемена! Шестая перемена МАЛЫШ и ЧЕРТЕЖНИК Составим несколько программ для двух простых исполнителей, с которыми нам пред- стоит работать на следующем уроке. Один из них называется МАЛЫШ, а другой - ЧЕРТЕЖНИК. МАЛЫШ умеет считать — примерно на уровне середины первого класса. Его МПИ можно описать диаграммой 48. к ^СЛОЖИТЬ \^Ь!РАЖЕНИЕ){с\^ВЫРАЖЕНИЕУу ---- Epg •{ВЫЧЕСТЬ \^ЫРАШНИЕу\Йз\(ВЫРА>НЕНИЕ) ВВИТЬ Диаграмма 48 Как и полагается первокласснику, этот исполни- тель может работать только с целыми неотрица- тельными числами. Попробуем составить для него 139
простенькую программу. Пусть нам нужно вычис- лить, чему будет равно 531 — 250 + 48. Программа может выглядеть так: ВКЛЮЧИТЬ ИСПОЛНИТЕЛЯ МАЛЫШ; ВЫЧЕСТЬ 250 ИЗ 531 И ПРИСВОИТЬ ИМЕНИ А; 531-250-> А; СЛОЖИТЬ А С 48 И ПРИСВОИТЬ А; А + 48 - > А; ВЫДАТЬ: ' РЕЗУЛЬТАТ РАВЕН ", А; Проведи прокрутку этой программы и убедись, что она выдаст на экран именно то, что нужно. Обрати внимание на комментарий справа. Такую запись часто используют, чтобы легче было следить за составлением программы. Стрелка — >, состав- ленная из минуса и знака >, заменяет выражения «присвоить имени» или «поместить в блок памяти с именем». Еще одна задача. МАЛЫШ должен подсчитать, сколько лет исполнится сидящему за пультом школьнику в любом заданном году. Будем считать, что исполнитель уже включен, и попробуем запом- нить и вызвать процедуру, которая запросит у школьника год рождения и год, для которого нужно найти возраст, а затем отпечатает ответ: ЗАПОМНИТЬ ПРОЦЕДУРУ ОПРЕДЕЛИТЬ _ ВОЗРАСТ; ВЫДАТЬ: "В КАКОМ ГОДУ ТЫ РОДИЛСЯ?"; ПРИНЯТЬ ЧИСЛО: ГОД _ РОЖДЕНИЯ; ВЫДАТЬ: "КАКОЙ ГОД ТЕБЯ ИНТЕРЕСУЕТ?"; ПРИНЯТЬ ЧИСЛО: ЗАДАННЫЙ____ГОД; ВЫЧЕСТЬ ГОД___РОЖДЕНИЯ ИЗ ЗАДАННЫЙ___ГОД И ПРИСВОИТЬ ИМЕНИ ВОЗРАСТ; ВЫДАТЬ: "В", ЗАДАННЫЙ__ГОД, "ГОДУ ТЕБЕ ИСПОЛНИТСЯ"; ВОЗРАСТ, " ЛЕТ"; ЗАКОНЧИТЬ; Обрати внимание, что имена всех блоков памяти выбраны так, что. можно обойтись без коммента- риев: и так все понятно. Следующая задача. Нужно принять число, умно- жить его на 32 и отпечатать результат умножения. Может показаться, что решить такую задачу МАЛЫШ не сможет: он ведь не умеет умно- 140
жать. Но такой вывод был бы слишком по- спешным. Попробуй составить программу для решениям—к этой задачи. Постарайся использовать не больше [STOP] восьми-девяти предписаний. . \1_/ Решение. Если не стараться составить корот- кую программу, то решить задачу несложно: умно- жить число на 32 — значит, по определению, «взять его слагаемым» 32 раза.’ Для этого подойдет такая программа: ПРИНЯТЬ ЧИСЛО: X; ЗНАЧЕНИЕ О ПРИСВОИТЬ ИМЕНИ СУММА; СЛОЖИТЬ X С СУММА И ПРИСВОИТЬ ИМЕНИ СУММА; СЛОЖИТЬ X С СУММА И ПРИСВОИТЬ ИМЕНИ СУММА; и так далее 32 раза, . а в конце программы на- писать предписания: ЗНАЧЕНИЕ СУММА ПРИСВОИТЬ ИМЕНИ РЕЗУЛЬТАТ; ВЫДАТЬ НА БУМАГУ: РЕЗУЛЬТАТ; Но можно сделать программу немного короче, если заметить, что сложить число само с собой- значит, умножить его на два. Получается, что умно- жать на два МАЛЫШ умеет! ПРИНЯТЬ ЧИСЛО; X; ЗНАЧЕНИЕ X ПРИСВОИТЬ ИМЕНИ ПРОИЗВЕДЕНИЕ; СЛОЖИТЬ ПРОИЗВЕДЕНИЕ С ПРОИЗВЕДЕНИЕ И ПРИСВОИТЬ ИМЕНИ ПРОИЗВЕДЕНИЕ; СЛОЖИТЬ ПРОИЗВЕДЕНИЕ С ПРОИЗВЕДЕНИЕ И ПРИСВОИТЬ ИМЕНИ ПРОИЗВЕДЕНИЕ; СЛОЖИТЬ ПРОИЗВЕДЕНИЕ С ПРОИЗВЕДЕНИЕ И ПРИСВОИТЬ ИМЕНИ ПРОИЗВЕДЕНИЕ; СЛОЖИТЬ ПРОИЗВЕДЕНИЕ С ПРОИЗВЕДЕНИЕ И ПРИСВОИТЬ ИМЕНИ ПРОИЗВЕДЕНИЕ; СЛОЖИТЬ ПРОИЗВЕДЕНИЕ С ПРОИЗВЕДЕНИЕ И ПРИСВОИТЬ ИМЕНИ ПРОИЗВЕДЕНИЕ; ЗНАЧЕНИЕ ПРОИЗВЕДЕНИЕ ПРИСВОИТЬ ИМЕНИ РЕЗУЛЬТАТ; ВЫДАТЬ НА БУМАГУ: РЕЗУЛЬТАТ; 141
Можно, конечно, еще немного сократить эту программу. Например, с точки зрения системы со- вершенно необязательно использовать в ней три блока памяти (с именами X, ПРОИЗВЕДЕНИЕ И РЕЗУЛЬТАТ). Вполне хватило бы и одного бло- ка (например, с именем X). Тогда можно было бы выбросить из программы еще два предписания - второе и предпоследнее. Итак, еще два предписания и два блока памяти можно сэкономить, но... это тот случай, когда эко- номия может обойтись слишком дорого! Машине все равно, какие имена ты используешь в програм- ме. Но человеку, которому придется читать про- грамму и разбираться в ней, это далеко не все рав- но! На примере процедуры ОПРЕДЕЛИТЬ _ ВОЗ РАСТ ты только что мог убедиться, как легко читать программу с хорошо подобранными ймена- ми. А ведь и там можно было обойтись двумя име- нами вместо трех (проверь это!). Но тогда пони- мать программу было бы труднее*. Поэтому всегда старайся выбирать имена блоков памяти так, чтобы по ним можно было понять, что хранится в этих блоках. Нарушение этого правила иногда позволяет сэкономить несколько блоков “памяти, но обходит- ся это дорогой ценой: затрудняется чтение про- граммы, а это значит, что усложняется ее отладка, увеличивается количество возможных ошибок — од- ним словом, программа становится хуже. Начинающие программисты не всегда следуют этому правилу, потому что в тех простеньких про- граммах, которые составляются на первых занятиях по программированию, можно разобраться и без хороших имен. Но постепенно задачи становятся все труднее, программы-длиннее и сложнее, и раз- бираться в таких программах без комментариев и понятных имен становится просто невозможно. Тем программистам, которые предпочитают пи- сать программы без комментариев и называть все блоки памяти именами любимых киногероев, в конце концов приходится переучиваться. Поэтому еще раз напоминаем: составляй программу так, чтобы человеку было легко ее понять. А для этого составляй точные и краткие комментарии, под- 142
бирай понятные имена и не экономь на каждой букве. Задача. Составь программу для умножения числа, запрошенного с терминала, на 67. * * * Исполнитель ЧЕРТЕЖНИК имеет МПИ: ^\подввсти^\инструмент^\в пчку\ -^МДРтП^ЛУЧ^ДВ точки\ Диаграмма 49 ЧЕРТЕЖНИК умеет проводить отрезки прямых линий между заданными точками на экране телеви- зора или на бумаге. Например, по программе ВКЛЮЧИТЬ ИСПОЛНИТЕЛЯ ЧЕРТЕЖНИК; ПОДВЕСТИ ИНСТРУМЕНТ В ТОЧКУ (40, 40); точка А НАЧЕРТИТЬ ЛУЧ ДО ТОЧКИ (40, 10); отрезок АВ НАЧЕРТИТЬ ЛУЧ ДО ТОЧКИ (10, 10); отрезок ВС НАЧЕРТИТЬ ЛУЧ ДО ТОЧКИ (10, 40); отрезок CD НАЧЕРТИТЬ ЛУЧ ДО ТОЧКИ (25, 50); отрезок DE НАЧЕРТИТЬ ЛУЧ ДО ТОЧКИ (40, 40); снова в А (ЕА) НАЧЕРТИТЬ ЛУЧ ДО ТОЧКИ (10, 40); отрезок AD ВЫКЛЮЧИТЬ ЧЕРТЕЖНИК; будет нарисован домик, показанный на рис. 41. Стандартная единица масштаба на экране и на бумаге 1 мм, стандартный размер экрана (листа бумаги) 255 х 255 мм. Однако на экране масштаб можно немного менять, используя ручки настройки телевизора.
Инструменты, о которых идет речь в предписании ПОДВЕСТИ, могут быть различными для различных устройств. Чтобы рисовать на бумаге, нужна специаль- ная шариковая авторучка, а на экране рисует электрон- ный луч. Но при составле- нии программы это не имеет никакого значения. Вероятно, ты уже понял, как выполняются предписа- ния из МПИ ЧЕРТЕЖНИКа. На всякий случай приведем краткие пояснения. ПОДВЕСТИ ИНСТРУ МЕНТ. По этому предпи- санию , инструмент перево- дится в заданную точку, при этом никакого следа на бумаге (экране) не оста- ется (ручка поднята над бу- магой, луч погашен). НАЧЕРТИТЬ ЛУЧ. Ис- полняя предписание, ЧЕР 10 20 ЪО 40 50 X ТЕЖНИК проводит луч (точнее, отрезок прямой ли- нии) от точки, в которой Рис. 42 перед этим находился ин- струмент, до заданной точки. Задачи. 1. Составить программу для изображения ра- нг, показанной на рис. 42. 2. Составить программу для вычерчивания по одной букве слова КВАНТ. Девятый урок Процедуры с параметрами Параметры. Составляя программы для ЧЕРТЕЖНИКа, ты уже, вероятно, заметил, что они получаются громоздкими: во-первых, каждое его предписание само по себе довольно длинное, 144
во-вторых, у ЧЕРТЕЖНИКа нет предписаний для рисования фигур, вычерчивания букв и т. д. На- пример, чтобы написать текст КВАНТ, тебе при- шлось составлять каждую букву из отрезков и определять координаты всех нужных точек. Понятно, что буквы, треугольники, прямоуголь- ники, окружности, дуги и другие геометрические фигуры и линии могут встречаться едва ли не в каждом рисунке, то есть все эти конструкции ча- сто повторяются в различных программах. Ты уже знаешь, что повторяющиеся конструкции имеет смысл превращать в процедуры, чтобы не описы- вать их каждый раз заново. Но обычные проце- дуры, которыми мы занимались на предыдущем уроке, здесь не помогут. Для того чтобы их вы- звать, мы указывали только их имена, без всяких вспомогательных гибких полей. А в процедурах для ЧЕРТЕЖНИКа без таких полей не обойтись. Например, не так уж трудно составить програм- му для рисования прямоугольника высотой 20 и длиной 25 сантиметров, расположенного посере- дине экрана (координаты нижнего левого угла — (3, 28)). Очень легко превратить эту программу в процедуру, которую можно назвать ПРЯМ__1: ЗАПОМНИТЬ ПРОЦЕДУРУ ПРЯМ _ 1; ПОДВЕСТИ ИНСТРУМЕНТ В ТОЧКУ (3, 28); НАЧЕРТИТЬ ЛУЧ ДО ТОЧКИ (253, 28); НАЧЕРТИТЬ ЛУЧ ДО ТОЧКИ (253, 228); НАЧЕРТИТЬ ЛУЧ ДО ТОЧКИ (3, 228); НАЧЕРТИТЬ ЛУЧ ДО ТОЧКИ (3, 28); ЗАКОНЧИТЬ; Все хорошо, но... вряд ли во многих программах будут встречаться именно такие прямоугольники. А вот другие прямоуголь- ники, с разными размерами и координатами, могут встречаться очень часто. На рис. 43 изображен робот, сплошь составленный из них. Для того чтобы наша процедура стала по-настоя- щему полезной, требуется определить ее так, чтобы она годилась для любых 145 6 Г. А. Звенигородский
координат и размеров. Для этого нужно, прежде всего, заменить в тексте процедуры все конкретные числа именами блоков памяти и организовать вы- числение всех координат с использованием предпи- саний МАЛЫШа. Тогда для изображения конкрет- ного прямоугольника будет достаточно разместить в этих блоках его размеры и координаты, а затем вызвать процедуру. Текст новой процедуры ПРЯМ_____2 будет выглядеть так: ЗАПОМНИТЬ ПРЯМ _ 2; СЛОЖИТЬ ДЛИНА С X И ПРИСВОИТЬ ИМЕНИ XI; СЛОЖИТЬ ВЫСОТА С Y И ПРИСВОИТЬ ИМЕНИ Y1; ; Вычислили координаты всех крайних точек ПОДВЕСТИ ИНСТРУМЕНТ В ТОЧКУ (X, Y); НАЧЕРТИТЬ ЛУЧ ДО ТОЧКИ (X, YI); НАЧЕРТИТЬ ЛУЧ ДО ТОЧКИ (XI, Y1); НАЧЕРТИТЬ ЛУЧ ДО ТОЧКИ (XI, Y); НАЧЕРТИТЬ ЛУЧ ДО ТОЧКИ (X, Y}; ЗАКОНЧИТЬ; Чтобы теперь нарисовать прямоугольник высо- той 10 и длиной 15 сантиметров, начиная с точки (5,5), нужно выполнить такую программу: ЗНАЧЕНИЕ 5 ПРИСВОИТЬ ИМЕНИ X; ЗНАЧЕНИЕ 5 ПРИСВОИТЬ ИМЕНИ Y; ЗНАЧЕНИЕ 100 ПРИСВОИТЬ ИМЕНИ ВЫСОТА; ЗНАЧЕНИЕ 150 ПРИСВОИТЬ ИМЕНИ ДЛИНА; ВЫЗВАТЬ ПРЯМ _ 2; Вызов процедуры получился довольно неуклю- жим, а ведь в других процедурах для ЧЕРТЕЖНИ Ка может встретиться гораздо больше чисел, текстов или имен, от значений которых зависит форма, размер или цвет рисунка. Было бы куда удобнее, если бы мы могли при запоминании про- цедуры предусмотреть для них гибкие поля-такие же, как в предписаниях ЧЕРТЕЖНИКа ПОДВЕСТИ ИНСТРУМЕНТ и НАЧЕРТИТЬ ЛУЧ. Правила языка Робик позволяют предусмотреть во время запоминания процедуры одно или не- сколько имен, значения которых будут указаны во время ее вызова. Такие имена называются параме- трами процедуры. 146
Посмотри еще раз на синтаксические диаграммы для текста и вызова процедуры (диаграммы 45, 46). Упомянутые там гибкие поля ПАРАМЕТРЫ и ЗНАЧЕНИЯ ПАРАМЕТРОВ описываются так: Диаграмма 50 Например, текст процедуры с параметрами для рисования прямоугольника может выглядеть так: ЗАПОМНИТЬ ПРЯМ (X, Y, ДЛИНА, ВЫСОТА); СЛОЖИТЬ ДЛИНА С X И ПРИСВОИТЬ ИМЕНИ XI; СЛОЖИТЬ ВЫСОТА С Y И ПРИСВОИТЬ ИМЕНИ Y1; ПОДВЕСТИ ИНСТРУМЕНТ В ТОЧКУ (X, Y); НАЧЕРТИТЬ ЛУЧ ДО ТОЧКИ (X, Y1); НАЧЕРТИТЬ ЛУЧ ДО ТОЧКИ (XI, Y1); НАЧЕРТИТЬ ЛУЧ ДО ТОЧКИ (XI, Y); НАЧЕРТИТЬ ЛУЧ ДО ТОЧКИ (X, Y); ЗАКОНЧИТЬ; а ее вызов так: ПРЯМ (5,5,150,100); Заметь, что длинная цепочка присваиваний перед вызовом процедуры стала теперь ненужной: она «спрятана» в самом предписании вызова. < А сейчас сформулируем правила работы с пара- метрами, которыми мы воспользовались в этом примере и будем пользоваться в дальнейшем: 1. При запоминании процедуры после ее имени могут быть указаны параметры. 2. Параметры записываются в круглых скобках, через запятую. 3. При вызове такой процедуры после ее имени обязательно должны быть перечислены выражения (см. с. 99), значения которых будут присвоены па- раметрам процедуры. 6* 147
4. Выражения перечисляются в круглых скобках, через запятую (так же, как параметры при описании процедуры). 5. Исполнение такой процедуры начинается с то- го, что значения всех выражений, указанных в скоб- ках после имени процедуры, вычисляются и при- сваиваются параметрам в том порядке, в каком они ВЫЗЗА 7Ъ ПРОЦЕДУРУ ПРИМ f5,5,150,100); ЗАПОМНИТЬ ПРОЦЕДУРУ ПРЯМ(X,Y, ДЛИНА,ВЫСОТА) Рис. 44 указаны в описании процедуры, слева направо (рис. 44). 6. Все параметры являются внутренними имена- ми процедуры (что это такое, ты сейчас узнаешь). Задачи. 1. Описать процедуру ЛИНИЯ (XI, Yl, Х2, Y2) для изображения отрезка прямой линии, соединяю- щего точки (XI, Y1) и (Х2, Y2). Используя эту про- цедуру, составить программу для вычерчивания рис. 45. 2. Составить программу для вы- черчивания робота, изображенного на рис. 43, используя описанную выше процедуру ПРЯМ. Стандартные процедуры. Систе- ма Шйага. В системе Школьница, как и во многих других системах, Рис. 45 существуют обширные библиотеки процедур, пред- назначенных для решения самых распространенных задач. Составляют такие процедуры опытные про- граммисты, разрабатывающие систему, а пользо- ваться ими могут все, кто с системой работает. Та- кие библиотеки называют системными. Кроме системных, в Школьнице предусмотрены групповые и личные библиотеки процедур. В групповые библиотеки вклю- чаются те процедуры, которыми пользуются группы програм- мистов, например, все ученики одного класса. Личную библио- теку каждый программист создает для себя. Состав системных библиотек со временем ме- няется: добавляются новые процедуры, переделы- ваются некоторые старые, исключаются те, которые 148
оказались ненужными. Но существуют и такие про- цедуры, которые обязательно должны входить в co-v—7 став всех системных библиотек. Эти процедуры на- \ / зывают стандартными. Например, для получения V разнообразных рисунков, схем и чертежей в систем- ной библиотеке Школьницы предусмотрен большой комплект стандартных графических процедур, полу- чивший название Шпага. Системой Шпага можно пользоваться не только на Робике, Л но и на Рапире и других языках. В ее разработке активно уча- ствовали новосибирские школьники Ася Салихова (6 кд.), Ната-^- ша Соколова (7 кл.), Виталий Цикоза (8 кл.), Павел Земцов (6 кл.). Аня Филатова (8 кл.) и другие (возраст школьни- ков указан на Момент окончания их работы над системой). Каждая процедура Шпаги имеет два названия: полное и сокращенное. Полное используется для того, чтобы быстрее понять и запомнить смысл процедуры, а сокращенное-сделать программы не такими громоздкими. Начинающим Программи- стам можно посоветовать при составлении первых графических программ пользоваться полными на- званиями всех процедур, а потом постепенно пере- ходить на сокращенные названия. Перечислим важнейшие процедуры системы Шпага. ПОДВОД (X, Y) или П (X, Y). Процедура подво- дит рисующий инструмент в точку с координатами (X, Y), . то есть действует так же, как предпи- сание ПОДВЕСТИ ИНСТРУМЕНТ исполнителя ЧЕРТЕЖНИК. ЛУЧ (X, Y) или Л (X, Y). Проводит отрезок пря- мой линии от точки, в которой находился рисую- щий инструмент, до точки (X,Y). ТОЧКА (X, Y) или Т (X, Y). Изображается точка, с координатами (X, Y). ОКРУЖНОСТЬ (X, Y, R) или ОКР (X, Y, R). Изо- бражает окружность радиуса R с центром в точке (X, Y). После завершения рисунка инструмент остается в центре окружности. НАДПИСЬ (ТЕКСТ, X,Y) или НП (ТЕКСТ, X,Y). Вычерчивает на рисунке надпись, заданную значением имени ТЕКСТ. Параметры X и Y обо- значают координаты левого нижнего угла над- писи. После вычерчивания надписи инструмент 149
переводится в точку с координатами (X + Д, Y), то есть в правый нижний угол надписи. ДУГА (XI, Yl, Х2, Y2, ХЗ, Y3) или Д (XI, Y1, Х2, Y2, ХЗ, Y3). Процедура изображает дугу окруж- ности, соединяющую точки (XI, Y1) и (ХЗ, Y3) и проходящую через точку (X2,Y2). ЦВЕТ (НАЗВАНИЕ _ ЦВЕТА). Эта процедура не имеет сокращенного названия. Она позволяет установить цвет, которым будут вычерчиваться все линии и символы, заданные последующими вызова- ми процедур Шпаги. Если в программе не было ни одного обращения к этой процедуре, то линии ри- сунка будут иметь стандартный цвет: черный — для рисования на бумаге и белый — для экрана. Если нужно рисовать другим цветом, достаточно обра- титься к этой процедуре, указав в качестве значения параметра название нужного цвета, то есть один из следующих текстов: "БЕЛЫЙ", "КРАСНЫЙ", "ОРАНЖЕВЫЙ", "ЖЕЛТЫЙ", "ЗЕЛЕНЫЙ", "ГОЛУБОЙ", "СИНИЙ", "ФИОЛЕТОВЫЙ", "ЧЕРНЫЙ". Можно указывать и сокращенные названия, состоящие из одной буквы: "Б", "К", "О", "Ж", "3", "Г", "С", "Ф", "Ч". Заданный цвет будет сохраняться до следующего обраще- ния к этой процедуре или до конца про- граммы. Кроме перечисленных процедур в системе есть средства для изменения системы координат (перенос начала, поворот, изме- нение масштаба, переход от декартовых координат к полярным и обратно) и некоторые другие специальные процедуры. Под- робнее о системе можно прочитать в статье А. Салиховой и Н. Соколовой «Графическая система Шпага», опубликованной в журнале «Квант», № 1, 1980 г. Нужно иметь в виду, что в статье описан ранний вариант системы, поэтому названия не- которых процедур и состав их параметров могут отличаться от приведенных в этой книге. С использованием процедур системы Шпага было написано много графических программ. При- ©мер картинки, нарисованной с по- мощью одной из них, показан на рис. 46. На рис. 47-54 показаны примеры других изображений, полу- ченных на ЭВМ. Авторы всех соот- ветствующих графических про- ^77? я грамм — учащиеся школ Новоси- Рис. 46 бирска в возрасте от 8 до 17 лет.
графическая система «шпага» графическая система «шпага» lifP МШ СМОГ ВЕР.7 ЛИСТ 1 ДАТА 26.12.82 Б2 ВРЕМЯ 1(106.58 ШИФР 985558777700 СМОГ ВЕР.7 ЛИСТ 1' ДАТА 23.12.82 Б1 ВРЕМЯ H34.S Рис. 49 Рис. 50 151
экспериментальная Версия ГРАФИЧЕСКАЯ СИСТЕМА ШПАГА-5» ШИФР 211400000099 ДАТА 18.02Л2 Б1 _______________________________________________ PASCAL — Монитор. СМОГ ВЕР. 7 ЛИСТ 1 ВРЕМЯ 03.43.21 Рис. 51 152
графическая система «шпага.» Сагара кружок программистов ШИФР 200100000088 СМОГ ВЕР.7 ЛИСТ 1 ДАТА 22.12.81 Б2 ВРЕМЯ 08.2154 Рис. 53 Рис. 54 153
Линейная и точечная графика. Процедуры, перечисленные в предыдущем параграфе, позволяют получать рисунки, соста- вленные из отдельных линий. Такие рисунки можно выдать и на бумагу, и на экран. Впрочем, на телеэкране эти рисунки будут получаться несколько хуже, чем на бумаге. Дело в том, что изо- бражение на экране не сплошное. Оно состоит из отдельных светящихся точек, которые образуют так называемый растр. Изображения прямых и окружностей на экране приходится со- ставлять из точек растра, а это неминуемо искажает форму линий. На большинстве рисующих устройств каждая линия вычер- чивается, как уже говорилось, специальной шариковой авторуч- кой. Такой способ построения изображений называется линей- ным, в отличие от точечного способа, применяемого на дисплее. Рисунки, состоящие из отдельных линий, удобнее формиро- вать линейным способом. Но зато точечный способ хорошо подходит для построения рисунков, составленных из цветных геометрических фигур. В системе Шпага предусмотрены процедуры для построения цветных точечных изображений. Вот некоторые из таких проце- дур- ПРЯМОУГОЛЬНИК (X, Y, _Д, В) (сокращенно ПР). ТРЕУГОЛЬНИК (Xl,Yl,X2,Yi,X3,Y3) (сокращенно ТР). Параметрами процедуры — являются координаты вершин треугольника. КРУГ (X,Y,R) (сокращенно К). Параметры такие же, как у процедуры ОКР, но процедура КРУГ рисует цветной кружок целиком, тогда как процедура ОКРУЖНОСТЬ позволяет изо- бразить только его границу. СЕГМЕНТ (X1,Y1,X2,Y2,X3,Y3) (сокращенно СГ). Пара- метры имеют такой же смысл, как у процедуры ДУГА. Изоб- ражается окрашенный круговой сегмент, границами которого служат дуга, проведенная из точки (XI, Y1) в точку (ХЗ, Y3) через (Х2, Y2), и отрезок прямой, соединяющий концы этой дуги (хорда). СЕКТОР (XI, Y1,X2, Y2, ХЗ, Y3) (сокращенно СК). Смысл параметров здесь несколько иной: XI и Y1 — это координаты центра круга, из которого вырезается сектор, а Х2, Y2 и ХЗ, Y3 — координаты концов стягивающей его дуги. Сектор закраши- вается от точки (X2,Y2) к точке (X3,Y3) против часовой стрелки. МНОГОУГОЛЬНИК (X, Y, R, N) (сокращенно МНГ). Изо- бражает правильный многоугольник с горизонтальным основа- нием. X, Y, R — параметры описанной окружности, N — число сторон. 154
При работе с точечной графикой можно использовать и все линейные процедуры Шпаги. Точечные картинки могут засло- нять друг друга и участки линейных рисунков. Чтобы правиль- но выбрать последовательность построения такого рисунка, нужно руководствоваться простым правилом: каждый следую- д щий элемент рисунка заслоняет все, что было нарисовано на его /ч\ месте (создается впечатление, что новый элемент рисунка распо-Д..^. \ ложен ближе к зрителю, чем прежние). Например, вызов процедуры ПР (0,0,255,255); позволяет изобразить черный прямоугольник, заслоняющий все остальные изображения на экране. Этой процедурой можно пользоваться для того, чтобы стирать все изображения с экрана. Задания. 1. Придумай несколько линейных и точечных ри- / К сунков и составь программы для их построения с использова- STOP нием процедур системы Шпага. >—/ 2. С помощью процедур системы Шпага попробуй напи- сать программу, которая будет рисовать кота Леопольда. Внутренние имена. В этой книге уже несколько раз упоминалось, что многие исполнителе имеют свои собственные запоминающие устройства со своими блоками памяти. Эти блоки называют вну- тренними, а блоки памяти из общего ЗУ системы V 7 Школьница — общими. Точно так же различают вну- \/ тренние имена (имена внутренних блоков памяти) V и общие имена (имена общих блоков). Исполнители хранят во внутренних блоках памяти ту информа- цию, которая нужна им во время работы, так что содержимое этих блоков может оказаться* самым различным. Некоторые из внутренних имен могут случайно совпадать с общими именами, которые ты исполь- А. зуешь в своей программе. Но ничего страшного при/2\ этом не произойдет: ты даже не заметишь, что про- изошло такое совпадение. Как бы ни менялось во время работы программы содержимое блоков па- мяти в собственном ОЗУ исполнителя, от этого не могут измениться значения общих имен системы Школьница. Понятно, что значения имен, относя- щихся к блокам памяти из разных запоминающих устройств, никак не связаны между собой, дажетгс- ли эти имена случайно совпали. 155
Таким образом, внутренние имена, с которыми Д работает исполнитель, не связаны с общими имена- ми из основной программы — они, как говорят про- граммисты, локализованы внутри исполнителя. Параметры процедуры обладают тем же свой- Л ством: они локализованы внутри процедуры! По- /2\ЭТОМУ паРаметРы также называют внутренними ----^именами. Удобно представить себе это так, как будто каж- дая процедура имеет свое небольшое ОЗУ, в кото- ром размещено несколько блоков памяти для ее внутренних имен. Если в операторе процедуры встретилось какое-то имя, то она сначала попытает- Дся найти его значение в своем ОЗУ, и только потом обратится к общему запоминающему устройству. Это значит, что если какие-то общие имена в твоей программе случайно совпадут с параметрами про- цедуры, то значения этих имен не будут изменяться во время исполнения процедуры. Например, после выполнения программы ЗНАЧЕНИЕ 100 ПРИСВОИТЬ ИМЕНИ X; ПРЯМ (10, 10, 20, 20); Описание на с. 147. П значением общего имени X останется число 100, хо- тя в тексте этой процедуры был использован пара- метр X, который при вызове получил значение 10. Вероятно, ты понял, почему параметры проце- дуры обладают таким свойством. Если бы это было не так, то пользоваться процедурами было бы очень неудобно: нужно было бы знать, какие пара- метры используются в каждой процедуре и перед каждым вызовом проверять, не могут ли при вы- полнении процедуры измениться значения каких-ни- будь общих имен. А если программа большая и имен в ней много, то проверить это не так-то просто! Если бы в примере, приведенном на преды- дущей странице, значение имени X изменилось, это стало бы весьма неприятным сюрпризом для про- граммиста, вызвавшего процедуру ПРЯМ, — ведь из текста программы никак не следует, что это значе- ние может меняться! При составлении и проверке программы каждый А программист должен быть уверен, что значения любых имен могут изменяться только в том случае, Лесли он сам присвоил им новые значения. 156
Разумеется, внутренняя, память процедуры — это не какое-то отдельное устройство, а часть общего ЗУ, которую система Школьница отвела для ра- боты процедуры. Но сути дела это не меняет: блоки памяти в этой части ОЗУ никак не свя- заны с другими блоками, даже если их имена совпадают. При описании процедур, кроме параметров, ча- сто приходится использовать различные вспрмога-г—у тельные имена (например, для хранения промежу- \ / точных результатов вычислений).. Такие имена тоже V должны быть локализованы в процедуре по тем же причинам, что и параметры: чтобы случайно не ис- портить значения совпавших с ними имен из основ- ной программы. Чтобы завести блоки памяти для таких имен, применяется конструкция ВНУТРЕН НИЕ ИМЕНА (диаграмма 46). Например, текст процедуры СЛОЖИТЬ для исполнителя МАЛЫШ, которая вычисляет и выводит на экран сумму значений своих параметров, может выглядеть так: ЗАПОМНИТЬ ПРОЦЕДУРУ СЛОЖИТЬ (А, В); ВНУТРЕННИЕ ИМЕНА: СУММА; СЛОЖИТЬ А С В И ПРИСВОИТЬ ИМЕНИ СУММА; ВЫДАТЬ "А=", А, "В = ", В, "СУММА = ", СУММА; ЗАКОНЧИТЬ; Одно из неписаных правил, принятых среди профессиональных программистов, гласит: «Все имена в процедурах должны быть внутренними». Это значит, что в операторах процедур нужно ста- раться употреблять только параметры и те вспомо- гательные имена, которые объявлены внутренними в этой процедуре. Если это правило нарушено, процедура начинает вести себя как старуха Шапокляк, исподтишка под- страивая в разных местах программы мелкие гадо- сти. Рассмотрим небольшой пример. Юному программисту по имени Миша предложили две задачи. Задачи. 1. Точки с координатами и (150,200) отметить «птичками» (5,10), (25,50) шириной 10 мм 157
и высотой 5 мм (рис. 55). Как и положено юному программисту, Миша сразу заметил, что «птичку» нужно будет нарисовать три раза, и притом в точ- ках с различными координатами. Поэтому он со- вершенно правильно решил, что нужно описать процедуру, параметрами которой должны быть (х-5,у+5). (х+б'У+5) * Рис. 55 , координаты отмечаемой точки. Миша назвал свою процедуру ПТИЧКА, но мы приведем ее под дру- гим названием: ЗАПОМНЙТЬ ГЛУПАЯ _ ПТИЧКА (X,Y); СЛОЖИТЬ 5 С X И ПРИСВОИТЬ ИМЕНИ XI; ВЫЧЕСТЬ 5 ИЗ X И ПРИСВОИТЬ ИМЕНИ Х2; СЛОЖИТЬ 5 С Y И ПРИСВОИТЬ ИМЕНИ Y1; ПОДВОД (XI,Y1); , ЛУЧ (X,Y); ЛУЧ (Х2, Y1); ЗАКОНЧИТЬ; Теперь Мише было уже нетрудно составить основ- ную программу: ГЛУПАЯ _ ПТИЧКА (5,10); ГЛУПАЯ _ ПТИЧКА (25,50); ГЛУПАЯ _ ПТИЧКА (150,200); Работая по этой программе, система изобразила со- вершенно правильную картинку ^сделай прокрутку и убедись в этом!). Но тут Мише предложили сле- дующую задачу. 2. Составить программу, которая запросит с клавиатуры шесть чисел: X, Y,XI, Y1,X2, Y2 и на- рисует «птички» в точках (X, Y), (XI, Y1) и (X2,Y2). Разумеется, Миша решил воспользоваться гото- вой процедурой ГЛУПАЯ _ ПТИЧКА: ПРИНЯТЬ ЧИСЛА: X,Y,X1,Y1,X2,Y2; ГЛУПАЯ____ПТИЧКА (X, Y); ГЛУПАЯ ПТИЧКА (XI, Y1); ГЛУПАЯ ПТИЧКА (Х2, Y2); 158
Придраться не к чему: программа совершенно пра- вильная. Но на всякий случай Миша решил ее про- верить. Он вызвал программу и набрал на клавиа- туре числа 10, 5, 10, 15, 25, 15, уверенный в том, что на экране появятся три «птички», расположенные «уголком» (рис. 56, а). Наверное, он очень удивился, увидев совершенно другую картину (рис. 56, б). Вни- мательно просмотрев свою программу и не обнару- жив в ней никаких ошибок, он, скорее всего, решил, Рис* 56 что испортилась машина. А ты уже понял, в чем де- ло? Если еще нет — проведи ручную прокрутку Ми- шиной программы, положив перед собой текст про- цедуры ГЛУПАЯ __ ПТИЧКА. Все ясно? Эта «глупая птичка» спутала Мише все карты, незамет- но подменив значения имен XI, Y1 и Х2. Пра- вильное значение осталось только у имени Y2, но это уже ничего не дало. А сейчас попробуй описать процедуру/—< УМНАЯ _ ПТИЧКА (X, Y), которая будет ри-fSTOPj совать то же самое, но без изменения общих\1_/ имен. Ответ: ЗАПОМНИТЬ УМНАЯ_____ПТИЧКА (X, Y); ИМЕНА: X1,Y1,X2; СЛОЖИТЬ 5 С X И ПРИСВОИТЬ XI; ВЫЧЕСТЬ 5 ИЗ X И ПРИСВОИТЬ Х2; СЛОЖИТЬ 5 С Y И ПРИСВОИТЬ Y1; ПОДВОД (XI, YI); левое крыло ЛУЧ (X, Y);' ЛУЧ (Х2, Y1); правое крыло ЗАКОНЧИТЬ; 159
Глобальные имена и побочные эффекты. Если в процедуре все-таки использовано имя, которое не является параметром и не объявлено внутренним именем, то его называют гло- бальным именем. Обычно глобальное имя — это имя блока па- мяти из общей части ОЗУ. Однако, если одна процедура вызы- вает другую, то внутреннее имя из вызывающей процедуры может оказаться глобальным для вызываемой. Внимательно ознакомься с приведенным здесь участком программы. Определи, какие из имен, используемых в процеду- ре ТРУБА, внутренние, а какие — глобальные. Выполни ручную прокрутку этой программы и определи, что будет выдано на экран в результате ее работы. ЗАПОМНИТЬ ТРУБА (А); ВНУТРЕННИЕ ИМЕНА: Б; ВЫДАТЬ "А ", А, ",-Б", Б, ", И", И; "УПАЛО""ПРИСВОИТЬ ИМЕНИ А; "ПРОПАЛО" ПРИСВОИТЬ ИМЕНИ Б; "ОСТАЛОСЬ НА ТРУБЕ" ПРИСВОИТЬ ИМЕНИ И; ВЫДАТЬ: "А", А, ", Б", Б, ", И", И; ЗАКОНЧИТЬ; "НА ТРУБЕ" ПРИСВОИТЬ ИМЕНИ А; "НА МЕСТЕ" ПРИСВОИТЬ ИМЕНИ Б; "ВСЕ ВМЕСТЕ" ПРИСВОИТЬ ИМЕНИ И; ВЫДАТЬ: "А ", А, ", Б", Б, ", И", И; ТРУБА (Б); ВЫДАТЬ: "А", А, ", Б", Б, ", И", И; Ответ. В процедуре ТРУБА: имя А — локальное (параметр), имя Б — локальное (рбъявлено внутренним), имя И — глобальное. Вот что будет, выдано на экран: А НА ТРУБЕ, Б НА МЕСТЕ, И ВСЕ ВМЕСТЕ А НА МЕСТЕ, Б "ПУСТО", И ВСЕ ВМЕСТЕ А УПАЛО, Б ПРОПАЛО, И ОСТАЛОСЬ НА ТРУБЕ А НА ТРУБЕ, Б НА МЕСТЕ, И ОСТАЛОСЬ НА ТРУБЕ Обрати внимание на вторую и четвертую строки! .При вы- зове процедуры внутреннему имени А (параметру) присвоено значение глобального имени Б (то есть текст "НА МЕСТЕ"), а внутреннее (вспомогательное) имя Б имеет в это время пустое значение. После завершения процедуры значения общих имен А и Б остались без изменений, а значение имени И изменилось! Использование в процедуре глобальных имен не является синтаксической ошибкой и иногда оказывается полезным, но 160
опытные программисты пользуются глобальными именами только в случае крайней необходимости. Запомни: если в процедуре используются гло- бальные имена — это рискованно! Если проце- дура присваивает глобальному имени новое значение — это очень рискованно! Изменение значения глобального имени в результате ра- боты процедуры называют побочным эффектом процедуры, В этой книге можно было бы назвать такие эффекты и по- другому. Неплохо звучит, например, «эффект глупой птички». Но мы все-таки будем использовать общепринятое название. Иногда применение таких эффектов позволяет получить инте- ресные результаты и обойти некоторые ограничения, принятые в языке Робик. Но гораздо чаще оно приводит к неприятным и трудно обнаруживаемым ошибкам в программах. Поэтому повторим еще раз: постарайся обойтись в своих программах без побочных эффектов. Впрочем, из этого правила есть одно ис- ключение: при использовании вложенных вызовов процедур (то есть в тех случаях, когда одна процедура вызывает другую) иногда нельзя обойтись без использования в вызываемой проце- дуре имен из процедуры вызывающей. Многочисленные при- меры таких процедур будут приведены в следующей главе. Ра- зумеется, в этом случае в вызываемых процедурах появляются глобальные имена и правило, о котором говорилось выше, не- сколько усложняется. При использовании вложенных процедур рекомендуется: 1. В вызывающих процедурах «верхнего уров- ня» использовать только внутренние имена. 2. В вызываемых процедурах использовать в качестве глобальных только внутренние имена из вызывающей процедуры. 3. Ни в коем случае не использовать вызывае- мую процедуру отдельно от вызывающей. Функция и ее результат. Описывая и вызывая про- цедуру, программист всегда рассчитывает получить определенный результат. Таким результатом мо- жет быть изменение обстановки в среде (с. 63). Например, на экран выдается какой-то текст, ваго- ны на путях меняются местами или появляется но- вая линия на рисунке. Но довольно часто результат работы процедуры — это число или текст, которые 161
должны использоваться в основной программе. На- пример, для исполнителя МАЛЫШ пришлась бы очень кстати процедура УМНОЖИТЬ, которая перемножала бы значения своих параметров. Понят- но, что в результате работы должно быть получено число: произведение значений параметров. Это чис- ло нужно выдать в основную программу, то есть присвоить какому-то имени из общей части ОЗУ, чтобы продолжать с ним работу. Но... как это можно сделать? Ведь все имена, используемые в процедуре, должны быть внутренними, и их значе- ния никак не могут попасть в общую часть ОЗУ. Может быть, использовать глобальное имя? Но ты ведь знаешь, что этого делать не стоит. Так как же быть? Для того чтобы процедура могла передать ре- [зультат в общую часть ОЗУ, в языке Робик пред- усмотрена специальная разновидность предписания ----’ВЫДАТЬ. На диаграмме 46 видно, что оно обяза- тельно должно быть последним в описании про- цедуры. VB языке Робик процедура, в которой использует- ся предписание ВЫДАТЬ РЕЗУЛЬТАТ, называется функцией. Вызов функции может быть использован в ка- честве выражения (например, в предписании ПРИ- ТЧ СВОИТЬ или в вызове другой процедуры). Значени- /2\ем такого выражения будет результат функции, то есть значение выражения, указанного в предписании ВЫДАТЬ РЕЗУЛЬТАТ. Рассмотрим небольшой пример. Описание функ- ции СУММА для исполнителя МАЛЫШ может выглядеть так: ЗАПОМНИТЬ СУММА (А,В); ИМЕНА :РЕЗ; СЛОЖИТЬ А С В И ПРИСВОИТЬ ИМЕНИ РЕЗ; ВЫДАТЬ РЕЗУЛЬТАТ: РЕЗ; ЗАКОНЧИТЬ; Теперь при выполнении предписания СУММА (5,10) ПРИСВОИТЬ ИМЕНИ X; имя X получит значение 15. Сделай прокрутку и проверь, что это будет именно так! 162
Используя эту процедуру мы можем сложить четыре числа одним предписанием: СУММА (СУММА (20.40), СУММА (50.60)) ПРИСВОИТЬ ИМЕНИ Y; С функциями и другими разновидностями про- цедур ты еще встретишься в последней главе. А по- ка постарайся выполнить небольшое контрольно- тренировочное задание. 1. Убедись, что тебе понятно значение слов и словосочетаний: блок памяти и его содержимое, имя и его значение, присваивание, значение выраже- ния, сообщение, прием и выдача сообщений, пустое значение, процедура, параметр, внутреннее имя, ре- курсивная процедура, зацикливание, программирование сверху вниз и снизу вверх, стандартные процедуры, системные, групповые и личные библиотеки, линей- ная и точечная графика, функция и результат, гло- бальное имя, побочный эффект. 2. Перечисли основные правила работы с пара- р метрами процедур. 3. Опиши процедуру ЗВЕЗДОЧКА (X, Y), кото- рая нарисует в заданной точке звездочку шириной 10 мм (рис. 57). 4. Опиши процедуру ГРУЗОВИК (X, Y), кото- рая нарисует в заданном месте экрана, грузовик, изображенный на рис. 58. X и Y — это координаты верхней левой точки кабины, все размеры указаны на чертеже. 5. Опиши функцию ЧЕТЫРЕЖДЫ (X), резуль- татом которой будет значение имени X, умножен- ное на 4. Так, при исполнении директивы. ВЫДАТЬ ЧЕТЫРЕЖДЫ (ЧЕТЫРЕЖДЫ (8)); на экран должно быть выдано число 128.
ГЛАВА ЧЕТВЕРТАЯ ВЕТВЛЕНИЯ И ЦИКЛЫ В ПРОГРАММАХ Десятый урок Тринадцать задач, девять планов и три предписанья Задачи. Внимательно прочитай условия приведенных здесь задач, но не торопись их ре- шать! Задача 1. Составить программу для перевода исполнителя МУРАВЕЙ с клетки (1,1) на клетку (10,10) вдоль края доски. Кубиков на доске нет и ис- полнитель может двигаться по ней свободно. Задача 2. На пути А (рис. 17) стоит пассажир- ский состав из 16 вагонов. Необходимо его развер- нуть, то есть переставить вагоны так, чтобы первый вагон оказался на месте последнего, второй — на месте предпоследнего и т. д. Составить программу для исполнителя МАШИНИСТ, считая, что на каж- дом из путей А, Б и В молено разместить все 16 ва- гонов и локомотив. Задача 3. Исполнитель ТОМ _ СОЙЕР дол- жен покрасить в один слой забор, состоящий из 1984 досок шириной 15 сантиметров каждая. Шири- на промежутка между досками 10 сантиметров. Перед началом работы ТОМ _ СОЙЕР стоит у правого края забора. Составить программу. Задача 4. Составить программу для вычерчи- вания домика, показанного на рис. 59. Можно ис- пользовать все стандартные процедуры системы Шпага. Размеры указаны на рисунке. Задача 5. Несколько досок забора, описанного в задаче 3. заменили новыми некрашеными. ТОМ _ СОЙЕР должен их покрасить, не трогая остальных досок. Перед началом работы он стоит у левого края забора. Составить программу. 164
30 50 Задача 6. Описать для исполнителя МАЛЫШ функцию. ПРОИЗВЕДЕНИЕ (А,В), результатом ко- торой будет произведение значений ее параметров. Например, после выполнения директивы ПРОИЗВЕДЕНИЕ (5,25) ПРИСВОИТЬ ИМЕНИ РЕЗУЛЬТАТ; имя РЕЗУЛЬТАТ должно получить значение 125. Задача 7. Описать функцию ОСТАТОК (А, В), результатом которой будет остаток от деления А на В. Задача 8. Описать функцию ЧАСТНОЕ (А, В), вычисляющую частное от деления А на В. Задача 9. Описать процедуру ПЕРЕВОД (X, Y), которая, переведет исполнителя МУРАВЕЙ с любой клетки доски на клетку (X, Y) при условии, что-на доске нет кубиков, которые могли бы поме- шать движению исполнителя. Задача 10. Описать для исполнителя МАЛЫШ функцию ФАКТОРИАЛ (N), результа- том которой будет N!, то есть произведение всех натуральных чисел от 1 до N. Например, значение вызова ФАКТОРИАЛ (7) должно быть равно 5040 =1х2хЗх4х5х6х7. По определению, значение ФАКТОРИАЛ (0) равно 1. 165
Задача 11. Описать процедуру ОБМЕН (X 1, Х2) для исполнителя МУРАВЕЙ, позволяющую поменять местами два кубика на пятой горизонта- ли. Координаты клеток, на которые стоят эти куби- ки (XI, 5) и (Х2, 5), причем выполняются нера- венства 1 < XI < Х2 < 10. ~ Перед началом работы этой процедуры МУРАВЕЙ СТОИТ на клетке (1,5), после окончания работы он должен возвратиться на ту же клетку. Например, если из кубиков составлено слово БРАК, то превратить его в слово КРАБ можно одной директивой: ОБМЕН (2,5); ИЛИ ОБМЕН (5,2); Задача 12*. Описать функцию ФИБО (7V) для получения числа Фибоначчи с номером N (fN). По определению, /1 = /2 — h а ПРИ А > 2 справедливо равенство: /n =fN-\ +fN-2. Например: /3 = 2; /4 = 3; /5 = 5; /6 = 8; /7== 13... Задача 13*. Описать процедуру для построе- ния графика функции У = А^/128. Если использовать только те конструкции Роби- ка, о которых уже рассказывалось в этой книге, то программы для решения этих задач либо вообще нельзя будет составлять, либо они получатся очень громоздкими. Как, например, объяснить исполните- лю ТОМ_____СОЙЕР, что он должен красить только те доски, которые еще не покрашены? Об этом мы еще не рассказывали, поэтому программу для реше- ния задачи 5 ты сейчас составить не сможешь. А вот план для решения этой задачи составить можно и сейчас: приятно, что робот должен двигаться вдоль забора и проверять, окрашена ли каждая до- ска, и красить ее, если она окажется неокрашенной. Попробуй составить сейчас общие планы для реше- й^ния нескольких первых задач. Если какой-то план не Р 1иг|получится, посмотри на следующих страницах реше- х' ние (или указания), а потом вернись к задачам и обязательно постарайся самостоятельно составить следующий план. 166
Решение начинается с плана. К задаче 1. Для того чтобы с левой нижней клетки (1,1) попасть на правую верхнюю (10,10), нужно сделать 9 ходов вверх и 9 ходов вправо (или наоборот — сначала 9 ходов вправо, а потом 9 хо- дов вверх). Все остальные возможные маршруты (например: 4 хода вверх, 5 ходов вправо, 5 ходов вверх, 4 хода вправо) не соответствуют условию задачй, так как не проходят вдоль края доски. Общий план для одного из двух возможных путей можно записать так: ПОВТОРИТЬ 9 РАЗ: ВВЕРХ; ПОВТОРИТЬ 9 РАЗ: ВПРАВО; К задаче 2. Похожие задачи, хотя и для мень- шего количества вагонов, встречались в первой гла- ве, поэтому план подобрать нетрудно: нужно по одному перегнать все вагоны на путь В, а потом объединить их в один состав и перевести его обрат- но на А (или наоборот: перевести все вагоны с А на В и вернуть их обратно по одному): ПОВТОРИТЬ 16 РАЗ: ПЕРЕВОД ОДНОГО ВАГОНА С А НА В; ПРИЦЕПИТЬ 16 ВАГОНОВ К ЛОКОМОТИВУ; ПЕРЕВЕСТИ СОСТАВ С В НА А; ОТЦЕПИТЬ 16 ВАГОНОВ; ВЕРНУТЬ ЛОКОМОТИВ НА МЕСТО; Если ты не смог сразу составить этот план, по- пробуй сейчас записать план для разворота состава вторым способом (с А на В весь состав, а обратно по одному вагону). К задаче 3. ПОВТОРИТЬ 1984 РАЗА: ПОКРАСИТЬ ОДНУ ДОСКУ; ВЛЕВО НА 15 СМ; ПЕРЕХОД К СЛЕДУЮЩЕЙ ДОСКЕ; Рамкой обведены пункты, которые нужно повто- рять. К задаче 4. Рисунок состоит из нескольких линий, изображающих контуры стен и крыши (высота 167
крыши 20), и из пяти «этажей» по шесть окон в каж- дом. План можно записать так: НАРИСОВАТЬ КОНТУР ДОМИКА; ПОВТОРИТЬ 5 РАЗ: ПОДВЕСТИ ИНСТРУМЕНТ К НАЧАЛУ ЭТАЖА; НАРИСОВАТЬ ЭТАЖ; А НАРИСОВАТЬ ЭТАЖ — это, значит, нарисо- вать шесть окон. Перед изображением каждого ок- на нужно .подвести к нему инструмент. Тогда уточ- няющий план для предписания НАРИСОВАТЬ ЭТАЖ будет выглядеть так: ПОВТОРИТЬ 6 РАЗ: ПОДВЕСТИ ИНСТРУМЕНТ К НАЧАЛУ ОКНА; НАРИСОВАТЬ ОКНО; Можно и объединить эти два плана: НАРИСОВАТЬ КОЙТУР ДОМИКА; ПОВТОРИТЬ 5 РАЗ: ПОДВЕСТИ ИНСТРУМЕНТ К НАЧАЛУ ЭТАЖА; ПОВТОРИТЬ 6 РАЗ: ПОДВЕСТИ ИНСТРУМЕНТ К НАЧАЛУ ОКНА; НАРИСОВАТЬ ОКНО; Обрати внимание, что два пункта должны быть исполнены тридцать раз! К задаче 5. Чтобы выполнить такое задание, ТОМ____СОЙЕР должен отличать окрашенную дос- ку от неокрашенной. План может выглядеть, на- пример, так: ПОВТОРИТЬ 1984 РАЗА: ЕСЛИ ДОСКА НЕ ОКРАШЕНА, ТО ПОКРАСИТЬ ДОСКУ; ВПРАВО НА 15 СМ; А ЕСЛИ ДОСКА ОКРАШЕНА, ТО ВПРАВО НА 25 СМ; 168
Несколько слов о делении на нуль и о других особых случаях. Продолжим составление планов. На очереди несколько задач на составление проце- дур (точнее функций) для исполнителя МАЛЫШ. К задаче 6. Вспомним, что во время послед-г-тг- ней перемены мы уже сталкивались с необходи- 4] мостью заменить умножение сложением. Проде-1—1 лаем это снова, используя сокращенные обозначе- ния: ПРОЦЕДУРА ПРОИЗВЕДЕНИЕ (А, В); 0-> Р; ПОВТОРИТЬ А РАЗ: | Р + В->Р; | ВЫДАТЬ РЕЗУЛЬТАТ: Р; В большой рамке-пункты плана, которые долж- ны превратиться в текст процедуры; маленькая рамка показывает повторяемое предписание. Еще раз напоминаем, что это не программа, а только план, поэтому мы можем использовать любые понятные обозначения. Кзадаче 7. Деление натуральных чисел «с остатком» легко можно заменить вычитанием, точ- но так же, как умножение мы заменили сложением. Чтобы разделить А на В, нужно вычитать В из А до тех пор, пока оставшееся число не станет меньше, чем В — это и будет остаток, который нам нужно найти. Для решения этой задачи, как и для всех предыдущих, нужно несколько раз повторить какие-то действия. Разница только в том, что мы не знаем заранее, сколько раз нужно эти действия по- вторять. Вычитание нужно продолжать до тех пор, пока выполняется условие А > В. Запишем это в ви- де плана: ПРОЦЕДУРА ОСТАТОК (А, В); ДО ТЕХ ПОР ПОКА А > В ПОВТОРЯТЬ: А —В—> А; ВЫДАТЬ РЕЗУЛЬТАТ: А; 169
Проверим этот план. Для этого прокрутим его вручную. Попробуем, например, разделить 16 и 3: ОСТАТОК (16,3) ПРИСВОИТЬ ИМЕНИ ОСТ; При вызове процедуры ее параметры имеют та- кие значения: А = 16, В=3. Начинаем повторять вычитания. После первого повторения А = 13, В = 3, после второго — А = 10, В =3, наконец, после пято- го вычитания получим: А = 1, В = 3 и значение А станет меньше значения В, условие перестанет выполняться, повторения закончатся и процедура выдаст в качестве результата число 1 — а это как раз и есть нужный нам остаток. Кстати, заметим, что число повторений равно частному от деле- ния, хотя в этой задаче частное нас не ин- тересует. Итак, результат получается правильный, и легко сообразить, что любая другая пара положительных чисел тоже будет правильно «обработана» по этому плану. Получается, что план правильный? Не торо- пись! Для любых положительных чисел он подхо- дит, отрицательных чисел в программе для испол- нителя МАЛЫШ быть не может, но нули там вполне могут встретиться. Посмотрим, что сделает процедура, написанная в соответствии с нашим планом, если вызвать ее так: ОСТАТОК (5,0). Если следовать нашему плану, то МАЛЫШ дол- жен вычитать нуль из пяти до тех пор, пока резуль- тат не станет меньше нуля. Долго же ему придется работать! Ведь от вычитания нуля число, естествен- но, никак не изменяется, и значит, никогда не ста- нет отрицательным, даже если бы МАЛЫШ и умел работать с отрицательными числами. Очевидно, что случай деления на нуль нужно предусмотреть от- дельно. Можно договориться, например, что в этом случае результатом функции будет нуль, и одновре- менно на экран должно быть выдано сообщение: ВНИМАНИЕ! В ФУНКЦИИ «ОСТАТОК»- ПОПЫТКА ДЕЛЕНИЯ НА НУЛЬ. 170
Новый план будет выглядеть так: ПРОЦЕДУРА ОСТАТОК (А, В); ЕСЛИ В = 0, ТО О- > А; ВЫДАТЬ: АВАРИЙНОЕ __ СООБЩЕНИЕ; ИНАЧЕ ПОКА А > В Г А-В -> А; ЮВТОРЯТЬ: ВЫДАТЬ РЕЗУЛЬТАТ: А; К задаче 8. Вычисление частного отличается от определения остатка только тем, что нужно под- считать количество вычитаний. Сосчитать, сколько раз выполнилось предписание, очень просто: нужно завести специальный блок памяти, поместить в не- го нуль, а потом при каждом выполнении предписа- ния прибавлять единицу к содержимому этого бло- ка. К концу работы программы в нем накопится столько единиц, сколько раз исполнялось предписа- ние. План: ПРОЦЕДУРА ЧАСТНОЕ (А, В); О -> СЧЕТЧИК; ЕСЛИ В = 0, ТО ВЫДАТЬ: АВАРИЙНОЕ СООБЩЕНИЕ; ИНАЧЕ ПОКА А > В ПОВТОРЯТЬ: А —В—> А; СЧЕТЧИК 4-1 -> СЧЕТЧИК; ВЫДАТЬ РЕЗУЛЬТАТ: СЧЕТЧИК; 171
Сравни этот план с предыдущим и разберись во всех отличиях. К задаче 9. Чтобы перевести исполнителя МУРАВЕЙ на заданную клетку, нужно сначала определить, на какой клетке он находится. Потом необходимо выяснить, в какую сторону он должен двигаться, и подсчитать количество ходов, которые нужно сделать в каждом направлении. План: ПРОЦЕДУРА ПЕРЕВОД (X, Y); ОПРЕДЕЛИТЬ КООРДИНАТЫ КЛЕТКИ, НА КОТОРОЙ НАХОДИТСЯ МУРАВЕЙ: XT и YT; ЕСЛИ X > XT, ТО ПОВТОРИТЬ (Х-ХТ) РАЗ:| ВПРАВО; ИНАЧЕ ПОВТОРИТЬ (ХТ-Х) РАЗ:[ ВЛЕВО; ЕСЛИ Y > YT, ТО ПОВТОРИТЬ (Y-YT) РАЗ:| ВВЕРХ; ИНАЧЕ ПОВТОРИТЬ (YT-Y) РАЗ:| ВНИЗ; ’ Остальными задачами мы займемся на следую- щем уроке. А сейчас познакомимся с тремя новыми предписаниями, которые понадобятся нам при со- ставлении очень многих программ, в том числе программ для решения тринадцати задач, приве- денных в начале этого урока. Циклические предписания и предписания ветвле- ния. Конечно, ты уже заметил, что в девяти состав- ленных нами планах все время встречались три конструкции: ПОВТОРИТЬ столько-то РАЗ такое-то дей- ствие ПОКА выполняется такое-то условие ПОВТО- РЯТЬ то-то и то-то 172
ЕСЛИ выполняется условие ТО сделать это ИНАЧЕ сделать то Первые две конструкции использовались для то- го, чтобы повторить один или несколько пунктов плана столько раз, сколько нужно. Третья конструк- ция применялась там, где нужно было выбрать один из двух возможных вариантов (например, в за- даче 9 нужно было выбрать направление движения: вверх или вниз, вправо или •влево). Ты должен помнить, что на синтаксических диа-гу^ граммах для многократного повторения одного 4| и того же участка применялся цикл, а для выбора!--- одного варианта из нескольких возможных — вет- вление. Такие же названия используются для перечис- ленных конструкций в планах. Те пункты планов, в которых используются конструкции ПОВТОРИТЬ стодько-то РАЗ или ПОКА — ПОВТОРЯТЬ, назы- вают циклическими, а те, в которых используется ЕСЛИ — ТО — ИНАЧЕ и другие похожие конструк- ции, называют ветвящимися. Для того чтобы можно было составить про- граммы по ветвящимся и циклическим пунктам планов, в Робике предусмотрены три предписания: ПОВТОРИТЬ, ПОКА и ЕСЛИ. Их синтаксис описывается диаграммой 51. Диаграмма 51 Заметим, что предписание ЕСЛИ существует в двух вариантах-полном и сокращенном. В сокра- щенном варианте опускается ключевое слово ИНАЧЕ и следующее за ним предписание. 173
Уточняющая диаграмма для гибкого поля УСг ЛОВИЕ, встречающегося в предписаниях ЕСЛИ и ПОКА: Диаграмма 52 Вот несколько примеров условий: А>В ТЕКСТ = “КРОКОДИЛ". X/ =25 РАССТОЯНИЕ > =3.1415 Другие условия ты без труда сможешь составить / fc\caM. Только не забывай, что записываются они не по' правилам русского языка, а по правилам Роби- ка, а в этом языке ни имена, ни тексты, ни другие слова не изменяются. А теперь посмотри еще раз на диаграммы 51 и 52. Обрати внимание, что во всех трех предписаниях нет ни одного знака пре- пинания! Начинающих программистов обычно так и тянет поставить запятые перед ключевыми слова- ми ТО и ИНАЧЕ и двоеточие после ПОВТОРЯТЬ. Это приводит к синтаксическим ошибкам, которые д система сразу обнаруживает. И еще одна очень важ- /у. ная особенность этих диаграмм: после слов ТО, / ИНАЧЕ. ПОВТОРЯТЬ и РАЗ можно записывать только по одному предписанию. В планах к зада- чам 1 — 9 мы часто записывали после этих слов по нескольку предписаний, обводя их рамочками, чтобы не ошибиться. Но ведь в программе-то ра- д мочку не нарисуешь! А что же делать, если по смы- /|\ слу задачи нужно, например, повторять не одно, / * \я несколько предписаний? Нужно объединить их 174
в процедуру и вместо нескольких предписаний запи- сать вызов объединяющей их процедуры. Запомни это правило — оно пригодится нам еще не раз. А теперь разберемся с тем, как выполняются ци- клические и ветвящиеся предписания Робика. Предписание ПОВТОРИТЬ. Сначала система определяет значение выражения, записанного между словами ПОВТОРИТЬ и РАЗ. Если это значение — натуральное число, то предписание, указанное после слова РАЗ, будет выполнено соответствующее чис- ло раз. Например, если значением имени А будет число 8, то в результате исполнения директивы ПОВТОРИТЬ А РАЗ ВВЕРХ; исполнитель МУРАВЕЙ > сдвинется на 8 клеток вверх, а если набрать директиву ПОВТОРИТЬ 5 РАЗ ВПРАВО; то он сдвинется на 5 клеток вправо.. Если значением выражения будет нуль, то пред- писание, разумеется, не выполнится ни разу. И еще одно свойство предписания ПОВТОРИТЬ: если зна- чение указанного в нем выражения меняется при выполнении предписания, то это уже не влияет на число повторений. Запомни: значение выражения, указанного после слова ПОВТОРИТЬ, вычисляется машиной один раз и больше не про- веряется! Например, после выполнения предписаний ЗНАЧЕНИЕ 5 ПРИСВОИТЬ ИМЕНИ А; ПОВТОРИТЬ А РАЗ СЛОЖИТЬ А С 1 И ПРИСВОИТЬ ИМЕНИ А; имя А получит значение 10, потому что предписание СЛО ЖИТЬ будет исполнено 5 раз. Если бы система каждый раз проверяла значение имени А, эта программа зациклилась бы, потому что при каждом повторении значение А увеличивается на 1. Предписание ПОКА. Сначала система вычисляет значения обоих выражений, входящих в условие, и проверяет условие. Если оно ложно (то есть не выполнено), то предписание, записанное после сло- ва ПОВТОРЯТЬ, вообще не будет исполняться. Ес- ли условие истинно, то система исполняет это пред- писание и вновь проверяет условие. Дальше все проверяется в том же порядке: исполняем предписа- ние — проверяем условие — исполняем — прове- 175
ряем -ит. д., пока условие не станет ложным. По- сле этого выполнение цикла прекращается и на- чинают исполняться следующие за ним предписа- ния программы. Обрати внимание, что в цикле ПОКА, в отличие от цикла ПОВТОРИТЬ, условие проверяется каждый раз после очередно- го повторения. При этом предписание, повторяемое в цикле, обязательно должно как-то менять значение одного из выраже- ний, входящих в условие (или обоих сразу). Если это будет не так, программа зациклится! Зацикливание программы по этой причине — одна из самых распространенных ошибок у начинаю- щих программистов. Предписание ЕСЛИ. Исполнение начинается с проверки условия. Если оно истинно, будет выпол- нено предписание, стоящее после слова ТО, Если же условие ложно, будет выполнено предписание, запи- санное после слова ИНАЧЕ. Например, после вы- полнения предписания ЕСЛИ А БОЛЬШЕ В ТО А ПРИСВОИТЬ ИМЕНИ БОЛЬШЕЕ _ ЧИСЛО ИНАЧЕ В ПРИСВОИТЬ ИМЕНИ БОЛЬШЕЕ _ ЧИСЛО; значением имени БОЛЬШЕЕ _ ЧИСЛО станет большее из значений имен А и В (проверь это на нескольких конкретных примерах). ____ Таким образом, предписанйе ЕСЛИ позволяет Л выбрать один вариант из двух возможных, то есть ____осуществить в программах то самое ветвление, с которым мы много раз встречались на синтакси- ческих диаграммах. Впрочем, ветвление может быть и более сложным. Например, довольно часто нужно выбрать один вариант из трех-четЫрех возможных, а не из двух. Это можно сделать с помощью не- скольких предписаний ЕСЛИ, связанных в такую цепочку: ЕСЛИ-ТО- ИНАЧЕ ЕСЛИ-ТО- ИНАЧЕ ЕСЛИ-ТО- ИНАЧЕ Например, описание функции НАЗВАНИЕ _ 176
ОЦЕНКИ, которая по числовому обозначению школьной оценки выдает ее официальное название, может выглядеть так: ЗАПОМНИТЬ НАЗВАНИЕ____ОЦЕНКИ (ЧИСЛО); ИМЕНА: СЛОВО; ЕСЛИ ЧИСЛО = 1 ТО "ПЛОХО" ПРИСВОИТЬ ИМЕНИ СЛОВО ИНАЧЕ ЕСЛИ ЧИСЛО = 2 ТО "НЕУДОВЛЕТВОРИТЕЛЬНО" ПРИСВОИТЬ ИМЕНИ СЛОВО ИНАЧЕ ЕСЛИ ЧИСЛО = 3 ТО "УДОВЛЕТВОРИТЕЛЬНО" ПРИСВОИТЬ ИМЕНИ СЛОВО ИНАЧЕ ЕСЛИ ЧИСЛО = 4 ТО "ХОРОШО" ПРИСВОИТЬ ИМЕНИ СЛОВО ИНАЧЕ ЕСЛИ ЧИСЛО = 5 ТО "ОТЛИЧНО" ПРИСВОИТЬ ИМЕНИ слово ИНАЧЕ "НЕПРАВИЛЬНОЕ ОБОЗНАЧЕНИЕ" ПРИСВОИТЬ ИМЕНИ СЛОВО; ВЫДАТЬ РЕЗУЛЬТАТ: СЛОВО; ЗАКОНЧИТЬ; Простейший вариант ветвления — обход, встре- чающийся на синтаксических диаграммах, тоже можно выполнить с помощью предписания ЕСЛИ. Как видно из диаграммы 51, слово ИНАЧЕ и стоя- щее после него предписание можно не указывать. В этом случае предписание ЕСЛИ выполняется так: если условие истинно — исполняется предписание, стоящее после ТО, а если условие ложно, то это предписание не исполняется (как будто мы прошли по обходному пути на диаграмме). Например, если в какой-нибудь медицинской программе нужно проверить значение имени ТЕМПЕРАТУРА и выдать сообщение, если она по- вышена, то для этой цели можно использовать такое предписание: ЕСЛИ ТЕМПЕРАТУРА >37 ТО ВЫДАТЬ: "ТЕМПЕРАТУРА ПОВЫШЕННАЯ"; Если температура будет нормальной, то на экра- не не появится никакого сообщения. 7 Г. А. Звенигородский 177
Д Обрати внимание, что при записи условных и циклических- предписаний мы разбивали их на не- сколько строчек, так, чтобы слова ПОКА, ЕСЛИ, ИНАЧЕ, ПОВТОРЯТЬ были хорошо заметны. Ис- пользование такой записи входит в число непи- саных правил, принятых среди опытных програм- мистов. И еще одно такое правило. Не рекомендуется записывать сразу после слова ТО предписание ЕСЛИ. Правила языка это разрешают, но такая конструкция может привести к трудностям при чтении программы. Например, если ключевые слова расста- влены так: ЕСЛИ-TO ЕСЛИ-ТО-ИНАЧЕ- то с первого взгляда трудно сообразить, к какому ЕСЛИ отно- сится ИНАЧЕ — к первому или ко второму. По правилам Роби- ка, каждое следующее ИНАЧЕ относится к ближайшему из стоявших перед ним ЕСЛИ, для которого еще не было использо- вано слово ИНАЧЕ. Несмотря на короткую формулировку, пользоваться этим правилом довольно трудно, особенно в сложных конструкциях с большим числом ИНАЧЕ, ЕСЛИ и ТО. Поэтому старайся не писать подряд слова ТО и ЕСЛИ! Седьмая перемена Новое о знакомых исполнителях Для решения большинства задач, фор- мулировки которых были приведены в начале этой ----главы, нам понадобятся внутренние имена исполни- телей МУРАВЕЙ, МАШИНИСТ, ТОМ _ СОЙЕР ----и ШПАГА. Об этих именах мы уже неоднократно упоминали, а сейчас приведем полный перечень та- ких имен. Исполнитель МУРАВЕЙ. Внутренние имена X и Y. Значения этих имен-координать£ той клетки доски, на которой находится МУРАВЕЙ. Имена за- щищенные: новые значения им может присвоить только сам исполнитель во время движения по до- ске. В общих программах можно только читать зна- чения этих имен, чтобы узнать, на какой клетке до- ски находится МУРАВЕЙ. Исполнитель МАШИНИСТ. Внутренние имена: ЧИСЛО _ ВАГОНОВ _ СПЕРЕДИ, ЧИСЛО _ ВАГОНОВ _ СЗАДИ, ТИП _ НОВОГО _ ВА 178
ГОНА и ПРИЧИНА_________ОСТАНОВКИ. Значе- ния первых двух имен — числа, показывающие, сколько вагонов прицеплено к локомотиву спереди и сзади. Значение имени ТИП__НОВОГО____ВА- ГОНА — текст, соответствующий типу того вагона, который был прицеплен к локомотиву во время ис- полнения последнего предписания ПРИЦЕПИТЬ ВАГОН. Обрати внимание, что предписание ОТЦЕ ПИТЬ ВАГОН не влияет на значение этого имени. Возможные варианты значений: "КРЫТЫЙ", "ЦИСТЕРНА", "ПЛАТФОРМА", "ПАССАЖИР СКИЙ", "НЕИЗВЕСТНЫЙ", ПУСТО. Вариант ПУСТО возможен только в том.случае, если после включения исполнителя МАШИНИСТ еще ни разу не исполнялось предписание ПРИЦЕПИТЬ ВА ГОН. Значение имени ПРИЧИНА____ОСТАНОВКИ — один из следующих текстов: "СТРЕЛКА", "ВАГОНЫ", "ТУПИК". Значение может измениться только при выполнении одного из предписаний ВПЕРЕД или НАЗАД. Исполнитель ТОМ _ СОЙЕР. Внутренние име- на: СОСТОЯНИЕ _ ДОСКИ, КОЛИЧЕСТВО _ КРАСКИ. Имя СОСТОЯНИЕ _ ДОСКИ мо- жет иметь одно из трех значений: "ОКРА ШЕНА", "НЕ ОКРАШЕНА", ПУСТО. Пустое значение может быть в том случае, если перед ро- ботом нет доски, то есть он находится напротив промежутка между досками или вообще в стороне от забора. Значение имени КОЛИЧЕСТВО___КРА СКИ-это вещественное число, соответствую- щее количеству оставшейся в ведерке краски (в литрах). В системе ШПАГА предусмотрено много вну- тренних имен, но мы назовем сейчас только два из них: X и Y, их значения-дробные числа, опреде- ляющие текущие координаты рисующего инстру- мента. Все внутренние имена перечисленных исполните- — лей защищенные. Напоминаем, что в общих про- граммах использовать внутренние имена исполни-!—" телей можно только в виде индивидуальных имен, например: МУРАВЕЙ.Х, ШПАГА.Х или МАШИНИСТ. ПРИЧИНА_________ОСТАНОВКИ! 7* 179
Одиннадцатый урок Составление программ с ветвящейся и циклической структурой Обходчик отправляется в путь. Соста- вим несколько программ для исполнителя ОБХОДЧИК, который предназначен для проверки качества стыков между рельсами на железнодо- рожных линиях. Его МПИ очень напоминает мно- жество предписаний исполнителя МАШИНИСТ. МП исполнителя ОБХОДЧИК: ВПЕРЕД НАЗАД ПЕРЕВЕСТИ СТРЕЛКУ ПОКРАСИТЬ СТЫК Последнее предписание предназначено для того, чтобы ОБХОДЧИК мог отметить специальной кра- ской неисправные стыки — по этим меткам их легко сможет найти ремонтная бригада. Останавливается ОБХОДЧИК в тех же случаях, что и МАШИНИСТ, и, кроме того, на каждом сты- ке. Внутренние имена: ПРИЧИНА _____ ОСТАНОВ КИ (возможные значения: "СТРЕЛКА", "ВА ГОНЫ", "ТУПИК", "СТЫК"), СОСТОЯНИЕ _ ____СТЫКА ("ИСПРАВЕН" или "НЕИСПРАВЕН"). Все задачи, приведенные на этом уроке, относят- ся к одной и той же среде для работы ОБХОДЧИ ----КА: нужно проверить все стыки на длинной ветке, которая заканчивается тупиком. Ни стрелок, ни ва- гонов на ветке нет. Связь с ОБХОДЧИКОМ под- держивается по радио. Перед началом работы ОБ ХОДЧИК остановился у первого стыка новой ветки. Значение имени ПРИЧИНА _ ОСТАНОВ КИ равно "СТЫК". Задача 1. ОБХОДЧИК должен проверить все стыки на ветке и отметить краской неисправные стыки. Добравшись до конца ветки, он должен по- слать на терминал сообщение "ЛИНИЯ ПРОВЕРЕ НА ПОЛНОСТЬЮ". Описать процедуру ПРОВЕР КА___СТЫКОВ для решения этой задачи. Решение. Общий план очевиден: нужно по- вторять предписание ВПЕРЕД до тех пор, пока зна- чение имени ПРИЧИНА______ОСТАНОВКИ не ока- 180
жется равным тексту "ТУПИК". Каждый раз нужно проверять состояние стыка, перед которым остановился ОБХОДЧИК. Если стык оказался не- исправным, его нужно отметить краской. Перед на- чалом работы исполнитель уже остановился перед стыком, поэтому нужно сначала проверить этот стык, а затем уже двигаться дальше. План: ПРОЦЕДУРА ПРОВЕРКА _ СТЫКОВ; ПОКА НЕ ВСТРЕТИЛИ ТУПИК ПОВТОРЯТЬ ЕСЛИ СТЫК НЕИСПРАВЕН ТО | ПОКРАСИТЬ СТЫК | ВПЕРЕД ВЫДАТЬ СООБЩЕНИЕ Рамочки, использованные при записи алгоритма, позволяют сразу заметить, что в цикле ПОКА нуж- ▼ | но повторять два предписания (ЕСЛИ и ВПЕРЕД).’----- Следовательно, их нужно объединить в процедуру, которую можно назвать ПРОВЕРКА _ ОДНО ГО _ СТЫКА. Составлять программу будем, как мы уже при- выкли, сверху вниз: ЗАПОМНИТЬ ПРОВЕРКА___СТЫКОВ; ПОКА ОБХОДЧИК ПРИЧИНА _ ОСТАНОВКИ / = "ТУПИК" ПОВТОРЯТЬ ПРОВЕРКА _ ОДНОГО _ СТЫКА (); ВЫДАТЬ: "ЛИНИЯ ПРОВЕРЕНА ПОЛНОСТЬЮ"; ЗАКОНЧИТЬ; ЗАПОМНИТЬ ПРОВЕРКА___ОДНОГО____СТЫКА; ЕСЛИ ОБХОДЧИК СОСТОЯНИЕ - СТЫКА = "НЕИСПРАВЕН" ТО ПОКРАСИТЬ СТЫК; ВПЕРЕД; ЗАКОНЧИТЬ; Прокрутку этой программы сделай, пожалуйста, сам. Задача 2. ОБХОДЧИК должен сообщить, об- наружены ли на линии неисправные стыки. В остальном условия те же, что в задаче 1. 181
Решение. Посмотрим, как изменится план. Очевидно, что при обнаружении первого же неис- правного стыка нам нужно будет записать в какой- то блок памяти (назовем его РЕЗУЛЬТАТ) инфор- мацию об этом стыке. Можно, например, записать туда текст "ОБНАРУЖЕН НЕИСПРАВНЫЙ СТЫК". Если такое присваивание не будет выпол- нено ни разу за все время работы ОБХОДЧИКа, значит, неисправных стыков на линии нет. В этом случае в блоке с именем РЕЗУЛЬТАТ останется старое содержимое. Какое? Если этот блок еще не использовался в программе, то значение ПУСТО. Значит, в конце работы процедуры мы легко смо- жем проверить, попадались ли ОБХОДЧИКу неис- правные стыки: если они были, то в блоке памяти с именем РЕЗУЛЬТАТ будет храниться текст "ОБ НАРУЖЕН НЕИСПРАВНЫЙ СТЫК", а если их не было — там ничего не будет... Нехорошо! Пусть в этом случае там будет текст "НЕИСПРАВНЫХ /“^СТЫКОВ НЕ ОБНАРУЖЕНО". [STOP) Попробуй сам довести до конца решение этой >—< задачи. Ответ. ЗАПОМНИТЬ НОВАЯ___ПРОВЕРКА; ИМЕНА: РЕЗУЛЬТАТ; "НЕИСПРАВНЫХ СТЫКОВ НЕ ОБНАРУЖЕНО" ПРИСВОИТЬ ИМЕНИ РЕЗУЛЬТАТ; ПОКА ОБХОДЧИК. ПРИЧИНА ОСТАНОВКИ/ = "ТУПИК" ПОВТОРЯТЬ ПРОВЕРКА ОДНОГО СТЫКА (); ВЫДАТЬ: "ЛИНИЯ ПРОВЕРЕНА ПОЛНОСТЬЮ"; ВЫДАТЬ: РЕЗУЛЬТАТ; ЗАКОНЧИТЬ; ЗАПОМНИТЬ ПРОВЕРКА__ОДНОГО____СТЫКА; ЕСЛИ ОБХОДЧИК. СОСТОЯНИЕ__СТЫКА = "НЕИСПРАВЕН" ТО НЕИСПРАВНЫЙ___СТЫК ( ); ВПЕРЕД; ЗАКОНЧИТЬ ЗАПОМНИТЬ НЕИСПРАВНЫЙ___СТЫК; ПОКРАСИТЬ СТЫК; ЗНАЧЕНИЕ "ОБНАРУЖЕН НЕИСПРАВНЫЙ СТЫК" ПРИСВОИТЬ ИМЕНИ РЕЗУЛЬТАТ; ЗАКОНЧИТЬ; 182
л Обрати внимание, что в процедуре НЕИСПРАВНЫЙ_ СТЫК использовано имя РЕЗУЛЬТАТ. Это как раз тот случай, когда побочный эффект полезен и обойтись без него трудно (убедись в этом!). Если процедура НЕИСПРАВНЫЙ _ СТЫК используется только внутри процедуры НОВАЯ_ПРОВЕР КА, то ее побочный эффект не опасен, потому что имя РЕ ЗУЛЬТАТ в этой процедуре объявлено внутренним. И все-таки будь осторожен с этой процедурой! А теперь вернемся к тринадцати задачам, ко- торыми мы занимались на девятом уроке. Пожалуйста, постарайся составить программы^/ \ для решения тех девяти задач, для которых былиюТОР] приведены общие алгоритмы. х—< Ответы и указания к первым девяти задачам де- сятого урока. К задаче 1. ВКЛЮЧИТЬ ИСПОЛНИТЕЛЯ МУРАВЕЙ; ПОВТОРИТЬ 9 РАЗ ВВЕРХ; ПОВТОРИТЬ 9 РАЗ ВПРАВО; ВЫКЛЮЧИТЬ ИСПОЛНИТЕЛЯ МУРАВЕЙ; Во всех последующих программах мы не будем приводить предписания для включения и выключе- ния исполнителей. Будем считать, что все нужные исполнители включены. К задаче 2. ЗАПОМНИТЬ РАЗВОРОТ _ СОСТАВА; ПОВТОРИТЬ 16 РАЗ ПЕРЕВОД __ ОДНОГО _ ВАГОНА ( ); ВПЕРЕД; ВПЕРЕД; ПОВТОРИТЬ 16 РАЗ ПРИЦЕПИТЬ ВАГОН; НАЗАД; Переводим состав с В на А ВПЕРЕД; ПЕРЕВЕСТИ СТРЕЛКУ; ВПЕРЕД; ПОВТОРИТЬ 16 РАЗ ОТЦЕПИТЬ ВАГОН; НАЗАД; Возвращаем локомотив на место ЗАКОНЧИТЬ; ЗАПОМНИТЬ ПЕРЕВОД _ОДНОГО _ВАГОНА; ВПЕРЕД; 183
ПЕРЕВЕСТИ СТРЕЛКУ; ВПЕРЕД; ПРИЦЕПИТЬ ВАГОН; НАЗАД; ВПЕРЕД; ВПЕРЕД; ОТЦЕПИТЬ ВАГОН; НАЗАД; ЗАКОНЧИТЬ; ВЫЗВАТЬ РАЗВОРОТ____СОСТАВА; К задаче 4. При решении этой задачи самое трудное — организовать переход от одного окна к другому — и от одного этажа к другому. Сделать это можно разными способами. Например, можно использовать глобальные имена X и Y и после ка- ждого нарисованного окна увеличивать значение X, а после каждого нарисованного этажа-значение Y. Приведем другую программу, в которой использо- ваны внутренние имена системы Шпага: X и Y. ЗАПОМНИТЬ ДОМИК; ПОДВОД (140,90); Рисуем контур домика ЛУЧ (140,10); ЛУЧ (10,10); ЛУЧ (10,90); ЛУЧ (140,90); ЛУЧ (90,120); ЛУЧ (60,120); ЛУЧ (10,90); ПОДВОД (20,15); ПОВТОРИТЬ 5 РАЗ ЭТАЖ ( ); ЗАКОНЧИТЬ; ЗАПОМНИТЬ ЭТАЖ; ИМЕНА: НАЧАЛЬНАЯ______ВЫСОТА; КОНЕЧНАЯ______ ВЫСОТА; СЛОЖИТЬ ШПАГА. Y С 5 И ПРИСВОИТЬ ИМЕНИ НАЧАЛЬНАЯ _ ВЫСОТА; ПОДВОД (20, НАЧАЛЬНАЯ — ВЫСОТА)’, ; Подводим к началу этажа ПОВТОРИТЬ 6 РАЗ ОКНО ( ); СЛОЖИТЬ НАЧАЛЬНАЯ — ВЫСОТА С 10 И ПРИСВОИТЬ ИМЕНИ КОНЕЧНАЯ — ВЫСОТА; ПОДВОД (20, КОНЕЧНАЯ _ ВЫСОТА); ЗАКОНЧИТЬ; 184
ЗАПОМНИТЬ ОКНО; ИМЕНА: XI, Yl, Х2, Y2, ХЗ; ШПАГА. X ПРИСВОИТЬ XI; Определяем текущие ШПАГА-Y ПРИСВОИТЬ Y1; координаты СЛОЖИТЬ XI С 10 И ПРИСВОИТЬ Х2; СЛОЖИТЬ Yl С 10 И ПРИСВОИТЬ Y2; ЛУЧ (XI, Y2); Рисуем ЛУЧ (Х2, Y2); контур ЛУЧ (Х2, Y1); окна ЛУЧ (XI, Y1); СЛОЖИТЬ Х2 С 10 И ПРИСВОИТЬ ХЗ; ПОДВОД (ХЗ, Y1); Подвод в начальную точку Следующего окна ЗАКОНЧИТЬ; ВЫЗВАТЬ ДОМИК; Проведи полную ручную прокрутку этой про- граммы. Посмотри, нельзя ли улучшить процедуру ЭТАЖ. Постарайся обойтись одним сложением и одним подводом вместо двух. Напиши програм- му для решения этой задачи без использования внут- ренних имен системы Шпага. К задаче 5. Приведем только основную про- цедуру: ЗАПОМНИТЬ ОКРАСКА — ОТДЕЛЬНЫХ — ДОСОК; ПОВТОРИТЬ 1984 РАЗ ЕСЛИ ТОМ___СОЙЕР. СОСТОЯНИЕ___ДОСКИ = "НЕ ОКРАШЕНА" ТО ОКРАСКА___ОДНОЙ____ДОСКИ ( ) ИНАЧЕ ВПРАВО НА 25.СМ; ЗАКОНЧИТЬ; Как видишь, в этой процедуре всего один оператор. К задаче 6. ЗАПОМНИТЬ ПРОИЗВЕДЕНИЕ (А,В); ИМЕНА: РЕЗУЛЬТАТ; ЗНАЧЕНИЕ 0 ПРИСВОИТЬ ИМЕНИ РЕЗУЛЬТАТ; ПОВТОРИТЬ А РАЗ СЛОЖИТЬ РЕЗУЛЬТАТ С В И ПРИСВОИТЬ РЕЗУЛЬТАТ; ВЫДАТЬ РЕЗУЛЬТАТ: РЕЗУЛЬТАТ; ЗАКОНЧИТЬ; 185
Сравни эту процедуру с алгоритмом, приве- денным на с. 169. К задаче 7. ЗАПОМНИТЬ ОСТАТОК (А,в); ЕСЛИ В = О ТО ДЕЛЕНИЕ___НА____НУЛЬ ( ) ИНАЧЕ ПОКА А> =В ПОВТОРЯТЬ ВЫЧЕСТЬ В ИЗ А И ПРИСВОИТЬ ИМЕНИ А; ВЫДАТЬ РЕЗУЛЬТАТ: А; ЗАКОНЧИТЬ;, ЗАПОМНИТЬ ДЕЛЕНИЕ___НА____НУЛЬ; ЗНАЧЕНИЕ О ПРИСВОИТЬ ИМЕНИ А; ВЫДАТЬ: "ОШИБКА! ДЕЛЕНИЕ НА НУЛЬ"; ЗАКОНЧИТЬ; К задаче 8. ЗАПОМНИТЬ ЧАСТНОЕ (А,В); ИМЕНА: СЧЕТЧИК; ЗНАЧЕНИЕ О ПРИСВОИТЬ ИМЕНИ СЧЕТЧИК; ЕСЛИ В = О ТО ДЕЛЕНИЕ___НА____НУЛЬ ( ) ИНАЧЕ ПОКА А> =В ПОВТОРЯТЬ ОДНО___ВЫЧИТАНИЕ ( ); ВЫДАТЬ РЕЗУЛЬТАТ: СЧЕТЧИК; ЗАКОНЧИТЬ; ЗАПОМНИТЬ ОДНО____ВЫЧИТАНИЕ; ВЫЧЕСТЬ В ИЗ А И ПРИСВОИТЬ ИМЕНИ А; СЛОЖИТЬ СЧЕТЧИК С 1 И ПРИСВОИТЬ ИМЕНИ СЧЕТЧИК; ЗАКОНЧИТЬ; К задаче 9. ЗАПОМНИТЬ ПЕРЕВОД (X,Y); ЕСЛИ X > МУРАВЕЙ. X ТО ДВИЖЕНИЕ____ВПРАВО (Х,МУРАВЕЙ.Х) ИНАЧЕ ДВИЖЕНИЕ____ВЛЕВО (Х,МУРАВЕЙ.Х); ЕСЛИ Y > МУРАВЕЙ. Y ТО 186
ДВИЖЕНИЕ___ВВЕРХ (Y,МУРАВЕЙ.Y) ИНАЧЕ ДВИЖЕНИЕ___ВНИЗ (Y, МУРАВЕЙ.Y); ЗАКОНЧИТЬ; ЗАПОМНИТЬ ДВИЖЕНИЕ____ВПРАВО (Х,ХТ); ИМЕНА: РАЗНОСТЬ; ВЫЧЕСТЬ XT ИЗ X И ПРИСВОИТЬ ИМЕНИ РАЗНОСТЬ; ПОВТОРИТЬ РАЗНОСТЬ РАЗ ВПРАВО; ЗАКОНЧИТЬ; ЗАПОМНИТЬ ДВИЖЕНИЕ____ВЛЕВО (Х,ХТ); ИМЕНА: РАЗНОСТЬ; ВЫЧЕСТЬ X ИЗ XT И ПРИСВОИТЬ ИМЕНИ РАЗНОСТЬ; ПОВТОРИТЬ РАЗНОСТЬ РАЗ ВЛЕВО; ЗАКОНЧИТЬ; ЗАПОМНИТЬ ДВИЖЕНИЕ____ВВЕРХ (Y,YT); ИМЕНА. РАЗНОСТЬ; ВЫЧЕСТЬ YT ИЗ Y И ПРИСВОИТЬ ИМЕНИ РАЗНОСТЬ; ПОВТОРИТЬ РАЗНОСТЬ РАЗ ВВЕРХ; ЗАКОНЧИТЬ; ЗАПОМНИТЬ ДВИЖЕНИЕ____ВНИЗ (Y,YT); ИМЕНА; РАЗНОСТЬ; ВЫЧЕСТЬ Y ИЗ YT И ПРИСВОИТЬ ИМЕНИ РАЗНОСТЬ; ПОВТОРИТЬ РАЗНОСТЬ РАЗ ВНИЗ; ЗАКОНЧИТЬ; Последние четыре процедуры похожи как близ- нецы. Нельзя ли объединить их в одну? Проявим чуть-чуть изобретательности: ЗАПОМНИТЬ ДВИЖЕНИЕ (БОЛЬШАЯ _ КООРДИНАТА, МЕНЬШАЯ _ КООРДИНАТА, НАПРАВЛЕНИЕ); ИМЕНА: РАЗНОСТЬ; ВЫЧЕСТЬ МЕНЬШАЯ _ КООРДИНАТА ИЗ БОЛЬШАЯ _ КООРДИНАТА И ПРИСВОИТЬ ИМЕНИ РАЗНОСТЬ; ПОВТОРИТЬ РАЗНОСТЬ РАЗ ЕСЛИ НАПРАВЛЕНИЕ = "ВВЕРХ" ТО ВВЕРХ ИНАЧЕ ЕСЛИ НАПРАВЛЕНИЕ= 1»
"ВНИЗ" то вниз ИНАЧЕ ЕСЛИ НАПРАВЛЕНИЕ = "ВПРАВО" ТО ВПРАВО ИНАЧЕ ЕСЛИ НАПРАВЛЕНИЕ = "ВЛЕВО" ТО ВЛЕВО ИНАЧЕ ВЫДАТЬ: "ОШИБОЧНОЕ НАПРАВЛЕНИЕ"; ЗАКОНЧИТЬ; Теперь запишем новый вариант основной про- цедуры: ЗАПОМНИТЬ ПЕРЕВОД (X,Y); ЕСЛИ X > МУРАВЕЙ X ТО ДВИЖЕНИЕ (X, МУРАВЕЙ.Х, "ВПРАВО") ИНАЧЕ ДВИЖЕНИЕ (МУРАВЕЙ.Х,X, "ВЛЕВО"); ' ЕСЛИ Y > МУРАВЕЙ. У ТО ДВИЖЕНИЕ (Y, МУРАВЕЙ.Y, "ВВЕРХ") ИНАЧЕ ДВИЖЕНИЕ (MYPABEfl.Y,Y, "ВНИЗ"); ЗАКОНЧИТЬ; Рекурсия и цикл. Займемся задачей 10. В опреде- лении функции ФАКТОРИАЛ нет ничего необычно- го и общий план составить несложно: нужно при- своить какому-то имени значение 1, а затем N раз умножить его на последовательно возрастающие натуральные числа. Для того чтобы эти числа получить, нужно присвоить другому имени зна- чение 0 и каждый раз прибавлять к нему по единице. Итак: ПРОЦЕДУРА ФАКТОРИАЛ (N); ИМЕНА: Р, СЧЕТЧИК; 1 -> Р; 0 -> СЧЕТЧИК; ПОВТОРИТЬ N РАЗ СЧЕТЧИК + 1 -> СЧЕТЧИК; Р. СЧЕТЧИК - > Р; ВЫДАТЬ РЕЗУЛЬТАТ: Р; 188
Программу по этому плану составить нетрудно: ЗАПОМНИТЬ ФАКТОРИАЛ (N); ИМЕНА: Р, СЧЕТЧИК; ЗНАЧЕНИЕ 1 ПРИСВОИТЬ ИМЕНИ Р; ЗНАЧЕНИЕ О ПРИСВОИТЬ ИМЕНИ СЧЕТЧИК; ПРВТОРЯТЬ N РАЗ ОДИН____ШАГ (); ВЫДАТЬ РЕЗУЛЬТАТ: Р; ЗАКОНЧИТЬ; ЗАПОМНИТЬ ОДИН____ШАГ; СЛОЖИТЬ СЧЕТЧИК С 1 И ПРИСВОИТЬ ИМЕНИ СЧЕТЧИК; ПРОИЗВЕДЕНИЕ (Р, СЧЕТЧИК) ПРИСВОИТЬ ИМЕНИ Р; ЗАКОНЧИТЬ; А теперь обрати внимание, что при N > 1 ФАКТОРИАЛ (N) = N х ФАКТОРИАЛ (N- 1). Если учесть, что ФАКТОРИАЛ (0) = 1, то это д свойство вполне можно принять за определение факториала. По этой формуле значение функ- LJ* \ ций для некоторого N вычисляется через значе- ние этой же функции при меньшем N. Математики называют такие формулы рекуррентными, а про- граммисты вполне могли бы их назвать рекурсивны- ми : ведь если мы определяем функцию через ту же самую функцию, то это — типичная рекурсия. Но тогда, возможно, имеет смысл запрограммировать ее при помощи той же рекурсии? Попробуем: ЗАПОМНИТЬ ФАКТОРИАЛ (N); ИМЕНА: Р; ЕСЛИ N > 0 ТО ПРОИЗВЕДЕНИЕ (N, ФАКТОРИАЛ (РАЗНОСТЬ (N,l))) ПРИСВОИТЬ ИМЕНИ Р ИНАЧЕ 1 ПРИСВОИТЬ ИМЕНИ Р; ВЫДАТЬ РЕЗУЛЬТАТ: Р; ЗАКОНЧИТЬ; ЗАПОМНИТЬ РАЗНОСТЬ (Х,У); ИМЕНА: Р; ВЫЧЕСТЬ Y ИЗ X И ПРИСВОИТЬ ИМЕНИ Р; ВЫДАТЬ РЁЗУЛЬТАТ: Р; ЗАКОНЧИТЬ; л 189
Обязательно проведи прокрутку этой интересней- |5Т0Р1 1шей программы! '—' К задаче 13. ЗАПОМНИТЬ ГРАФИК; ИМЕНА: X; ЗНАЧЕНИЕ О ПРИСВОИТЬ ИМЕНИ X; ПОДВОД (X, ФОРМУЛА (X)); ПОВТОРИТЬ 255 РАЗ ОДИН _ УЧАСТОК _ ГРАФИКА ( ); ЗАКОНЧИТЬ; ' ЗАПОМНИТЬ ОДИН___УЧАСТОК___ГРАФИКА, СЛОЖИТЬ X С 1 И ПРИСВОИТЬ ИМЕНИ X; ЛУЧ (X, ФОРМУЛА (X)); ЗАКОНЧИТЬ; ЗАПОМНИТЬ ФОРМУЛА (X); ИМЕНА: Р; ЧАСТНОЕ (ПРОИЗВЕДЕНИЕ (Х,Х), 128) ПРИСВОИТЬ ИМЕНИ Р; ВЫДАТЬ РЕЗУЛЬТАТ: Р; ЗАКОНЧИТЬ; Подумай, нельзя ли переделать процедуру ГРАФИК так, чтобы с ее помощью можно оы- ----<ло построить график любой функции, способ вы- числения которой задан отдельной процедурой ФУНКЦИЯ (X). Восьмая и последняя перемена Еще два исполнителя Приведем краткие сведения о двух ис- полнителях, предусмотренных в системе Школьни- ца. Исполнитель МАТЕМАТИК позволяет выпол- нять арифметические операции с целыми и дробны- ми числами, работать с логарифмами и тригономе- трическими функциями. МАТЕМАТИК во многом напоминает систему Шпага: для этого исполнителя предусмотрен комплект стандартных процедур (точ- нее, функций), многие из которых имеют по два на- звания — полное и сокращенное. Значениями пара- метров всех функций могут быть только числа, попытка использовать другие значения вызывает 190
сообщение об ошибке. Перечислим важнейшие функции. СУММА (X,Y) (сокращенно СМ). РАЗНОСТЬ (X,Y) (сокращенно РЗ). ПРОИЗВЕДЕНИЕ (X,Y) (сокращенно ПРВ). ЧАСТНОЕ (X,Y) (сокращенно ЧС). Вычисляет Х/Y. Если Y = 0, система выдаст сообщение об ошибке и прекратит работу. СТЕПЕНЬ (X,Y) (сокращенно СТ). Вычисляет XY. Например, значение выражения СТ (5,2) равно 25, а значение СТ (4,0.5) равно 2. МОДУЛЬ (X) (сокращенно МД). Вычисляет мо- дуль (абсолютную величину) числа. Например: МД(25) = 25; МД (0) = 0; МД (-25) = 25; ЦЕЛАЯ _ ЧАСТЬ (X) (сокращенно ЦЧ). Ре- зультат этой функции — наибольшее целое N, удов- летворяющее неравенству N < =Х. Например: ЦЧ (5) = 5; ЦЧ (5.2) = 5; ЦЧ (5.9) = 5; ЦЧ (-5.2) =-6; Тригонометрические и обратные тригонометри- ческие функции: SIN (X), COS (X), TG (X), ARCSIN (X), ARC COS (X), ARCTG (X), ARCCTG (X). Логарифмы: LG (X) — десятичный логарифм, LN (X) — натуральный логарифм (по основанию е — 2.71828...). Параметры всех тригонометрических функций должны быть выражены в радианах (1 ра- диан « 57.256 градусов). Исполнитель КОРРЕКТОР предназначен для работы с текстами. Для него описаны три стан- дартные функции: ДЛИНА (ТЕКСТ). Эта функция позволяет опре- делить число символов в произвольном тексте. На- пример, значение выражения ДЛИНА ("КРОКО ДИЛ") равно 8. СЦЕПКА (ТЕКСТ _ 1, ТЕКСТ _ 2). Результат этой функции — текст, получающийся при сцепле- нии значений параметров (то есть в том случае, 191
если значения параметров записать подряд и счи- тать одним текстом). Например: СЦЕПКА ("КРОКО", "ДИЛ") = "КРОКОДИЛ" СЦЕПКА ("РАДИО", "МОНТЕР") = "РАДИОМОНТЕР" Эту операцию над текстами иногда называют приписыванием или конкатенацией. ФРАГМЕНТ (ТЕКСТ, НОМЕР _ 1, НО МЕР____2). Результат этой функции — текст, ко- торый получается, если из значения первого пара- метра «вырезать» заданный фрагмент. Параметр НОМЕР_____1 обозначает номер символа, с которо- го начинается вырезаемый фрагмент, а НО- МЕР ___2 — номер символа, которым он заканчи- вается. Например: ФРАГМЕНТ ("КРОКОДИЛ", 2,4)'= "РОК"; ФРАГМЕНТ ("КРОКОДИЛ", ,4,6) = "КОД"; ФРАГМЕНТ ("КРОКОДИЛ", 3,3) = "О"; Двенадцатый урок Продолжение следует Подведем итоги. Вот и заканчивается эта небольшая книга. На ее страницах ты познако- мился с основными законами . программирования и с правилами записи предписаний на языке Робик, с важнейшими приемами составления и проверки планов и программ. На уроках и переменах мы рас- сказали об основных конструкциях языков програм- мирования: процедурах, циклах, предписаниях при- сваивания и ветвления, о средствах для приема и выдачи сообщений, для описания синтаксиса предписаний. На протяжении всей книги мы знако- мили тебя с правилами, позволяющими писать кра- сивые и понятные программы, которые легко чи- тать, проверять и отлаживать. Довольно подробно обсуждались ошибки и способы их исправления. Словом, мы затронули в этой книге многие раз- делы современного программирования. Конечно, язык Робик, который использовался здесь,—это язык учебный. Его легко понять и освоить, но большие и сложные задачи решать с его помощью трудно, а то и вовсе невозможно. Для ре- 192
шения таких задач тебе нужно будет освоить какой- либо другой язык, например Рапиру или паскаль. Если ты внимательно прочитал эту книгу и выпол- нил несколько тренировочных заданий, то тебе бу- дет совсем нетрудно изучить другие языки: хотя способы записи программ на этих языках могут быть другими, но основные приемы и конструкции остаются такими же, как в Робике. И эта неболь- шая книга может послужить для тебя путе- водителем при изучении любого языка программи- рования. Просто ты должен будешь разобраться, чем отличается этот язык от Робика, каковы общие правила записи предписаний в этом языке, как за- писываются на нем числа, тексты, имена, выраже- ния, как описываются процедуры и функции, как выглядит предписание присваивания, какие предус- мотрены средства для выдачи и приема сообщений (их часто называют средствами ввода-вывода), где и как можно использовать комментарии, как выгля- дят циклические и условные предписания, какие есть средства для поиска и исправления ошибок. Разобравшись со всем этим, ты уже будешь знать структуру языка и сможешь составлять на нем программы для решения большинства задач — при этом приемы составления и проверки планов и программ останутся такими же, как в этой книге. Разумеется, производственные языки програм- мирования обладают гораздо большими возможно- стями, чем Робик. В них используется много кон- струкций, о которых мы ничего не говорили. Но, зная основную структуру языка, ты всегда сможешь разобраться с любыми новыми для тебя конструк- циями и предписаниями, которые встретятся в этом языке. Наши первые уроки заканчиваются. Но мы ве- рим, что твое знакомство с программированием только начинается. Желаем тебе удачи! Что читать дальше? Если ты хочешь научиться составлять программы на различных языках программирования, советуем тебе прочитать материалы Заочной школы программирования, которые опубликованы в журнале «Квант» с № 9 за 1979 г. На уроках Заочной, школы ты сможешь познакомиться с языками Рапира (№№ 1 — 3, 1980 г.) и паскаль (№№ 10 — 12, 1981 г.; 1—4, 1982 г.), с одной из версий системы Шпага (№ 1, 1980 г.) и с 193
различными приемами решения задач на ЭВМ. В журнале № 9 за 1980 г. рассказывается о применении циклического оператора, в номере 11 за тот же год обсуждаются задачи, связанные с обработкой текстов на ЭВМ. В других номерах журнала ты прочтешь о решении геометрических задач на ЭВМ с примене- нием полярной системы координат (№ 10, 1980 г.), об ассоциа- тивном поиске (№1, 1981 г.), решении уравнений (№ 2, 1981 г.), работе с графами (№ 3, 1981 г.) и о других задачах. Обзор языков программирования опубликован в № 9 за 1981 год. Свойства различных конструкций, используемых в языках программирования, обсуждаются в книге Д. Баррона «Введение в языки программирования» (М.: Мир, 1980). О разных структу- рах блоков памяти можно прочитать в книге П. Холла «Вычис- лительные структуры. Введение в нечисленное программирова- ние» (М.: Мир, 1978). Интересные примеры рекурсии приводят- ся в книге Д. Баррона «Рекурсивные методы в программирова- нии» (М.: Мир, 1974). О языке паскаль можно прочитать, помимо «Кванта», в книге Н. Вирта «Систематическое програм- мирование. Введение» (М.: Мир, 1977) или в книге П. Грогоно «Программирование на языке паскаль» (М.: Мир, 1982). Общие методы и приемы программирования, способы со- ставления алгоритмов и программ описываются в следующих книгах: 1. Нивергельт Ю., Фаррар Дж., Рейнголд Э. Машинный подход к решению математических задач.—М.: Мир, 1977; 2. Гудман С., Хидетниеми С. Введение в разработ- ку и анализ алгоритмов.—М.: Мир, 1981; 3. Кнут Д. Искусство программирования для ЭВМ. — М.: Мир, 1976, т. 1; 1977, т. 2; 1978, т. 3; 4. Е р ш о в А. П. Введение в теоретическое программиро- вание. Беседы о методе.—М.: Наука, 1977. Если тебя заинтересовала история появления вычислитель- ной техники, почитай книгу Р. С. Гутера и Ю. Л. По- лу но в а «От абака до компьютера» (М.: Знание, 1981). Более подробные сведения можно найти в книге И. А. Апокина и Л. Е. Майстрова «Развитие вычислительных машин» (М.: Наука, 1974). , Об устройстве вычислительных машин и принципах их ра- боты можно прочитать в статьях Ю. Первина и А. Сал- товского «Память ЭВМ» (Квант, 1980, № 4) и «Как работает процессор» (Квант, 1980, № 3); А. Салтовского «Организа- ция ввода и вывода в ЭВМ» (Квант, 1980, № 6); Ю. Первина «Трехадресные, одноадресные и... безадресные машины» 194
(Квант, 1981, № 4) и в других материалах раздела «Искусство программирования» в журнале «Квант». Можно порекомендо- вать и кЙигу Л. Н. Королева «Структуры ЭВМ и их.мате- матическое обеспечение» (М.: Наука, 1978). О применениях ЭВМ рассказывается в книгах А. Н. Тихонова и Д. П. Косто- марова «Рассказы о прикладной математике» (М.: Наука, 1984); Н. Н. Моисеева «Математика ставит эксперимент» (М.: Наука, 1979); В. М. Глушкова и В. Я. Валаха «Что такое ОГАС» (М.: Наука, 1981. — Библиотечка «Квант», вып. 10); в статье А. П. Е р ш о в а-«Программирование — вто- рая грамотность» (Квант, 1982, № 2). Созданию и применению микропроцессоров посвящена статья «Пришла пора оставить счеты» (Наука и жизнь, 1981, № 3,4). Приведенный список, разумеется, не может претендовать на полноту. Вычислительная техника и программирование разви- ваются очень быстро и каждый год появляются десятки книг и сотни статей по этой тематике. Задачи для самостоятельного решения. Задачи для исполнителя МАШИ НИСТ. Конфигурация путей соответствует рис. 29. Длина все$ путей считается неограниченной: 1. На путях А, Б и В стоит по одному вагону. Нужно определить тип каждого вагона и выдать со- ответствующее сообщение, например: НА ПУТИ А СТОИТ КРЫТЫЙ ВАГОН НА ПУТИ Б СТОИТ ЦИСТЕРНА и так далее. 2. На путях А, Б и В стоит по 10 вагонов. Необ- ходимо определить их типы и отпечатать на бумаге полный список вагонов, стоящих на каждом пути, с указанием типов.. 3. В той же начальной обстановке нужно под- считать количество вагонов каждого типа, исполь- зуя предписания исполнителя МАЛЫШ, и отпеча- тать результат на бумаге. 4* *. В условиях задачи 2 необходимо переста- вить вагоны так, чтобы на каждом пути стояли ва- гоны одного какого-нибудь типа. Задачи для исполнителей КОРРЕК ТОР и МАТЕМАТИК. 5. Описать функцию ПОДСЧЕТ____________БУКВ. (ТЕКСТ, БУКВА), которая подсчитывает, сколько 195
раз встречается определенная буква в тексте. На- пример, значение выражения ПОДСЧЕТ______БУКВ ("КУКАРЕКУ", "К") должно быть равно 3. 6. Описать функцию ЗАМЕНА___________БУКВЫ (ТЕКСТ, НОМЕР, БУКВА), заменяющую задан- ную букву в тексте. Например, вызов ЗАМЕНА __ БУКВЫ ("КРОКОДИЛ", 3, "Я") имеет значение "КРЯКОДИЛ". 7. Описать функцию ПОДСЧЕТ______ФРАГМЕН ТОВ (ТЕКСТ, ФРАГМЕНТ), которая подсчиты- вает, сколько раз встречается в тексте заданный фрагмент, то есть цепочка из нескольких букв. Например: ПОДСЧЕТ _ ФРАГМЕНТОВ ("КУКАРЕКУ", "КУ") = 2 8. Описать функцию РАЗВОРОТ (ТЕКСТ), ко- торая переставляет все буквы заданного текста в обратном порядке. Например, РАЗВОРОТ ("КРОКОДИЛ") = "ЛИДОКОРК" 9, Описать функцию ЗАМЕНА_____ФРАГМЕНТА (ТЕКСТ, СТАРЫЙ _ ФРАГМЕНТ, НОВЫЙ _ ФРАГМЕНТ), которая всюду в заданном тексте заменит одно сочетание символов на другое. Например, ЗАМЕНА __ ФРАГМЕНТА ("КУКАРЕКУ", "КУ", "МЯУ") = МЯУКАРЕМЯУ; 10 *. Используя функцию, составленную в задаче 9, исправить ошибку в математическом тексте tg (х) = cos (x)/sin (х), который является значением имени ФОРМУЛА. 11*. Решить ту же задачу для текста tg (х) = sin (x)/cos (s), который является значением имени ФОРМУ ЛА _ 2. 12**. Описать функцию ЧИСЛО (ТЕКСТ), ко- торая преобразует заданный текст в число. Напри- мер, значение выражения ЧИСЛО ("245") должно быть равно числу 245. 196
13**. Описать функцию ТЕКСТ для преобразо- вания числа в текст. 14**. Значением имени КНИГА является пол- ный текст некоторой книги. Необходимо’ отпеча- тать его на бумаге, разделив на строки (по 50 букв в строке) и на страницы (по 40 строк на странице). Между двумя страницами нужно пропускать по 6 строк. На переносы не обращать внимания. 15**. В условиях задачи 14 предусмотреть нуме- рацию страниц. 16**. В условиях предыдущей задачи обеспечить такое расположение текста, чтобы конец каждой строки совпадал с концом слова при сохранении длины строки (50 символов). Если это требование не соблюдается, нужно произвести выключку, то есть увеличить расстояние (количество пробелов) между словами в строке. 17*. Составить программу, проверяющую пра- вильность расстановки скобок в математической формуле (См. «Квант», 1980, № 11). Задачи для исполнителя МАТЕМА ТИК и системы Шпага. 18*. Составить программу для построения гра- фиков тригонометрических функций. 19. Описать функцию ЧЕТ (X), которая будет проверять, делится ли заданное число на 2. Резуль- татом должен быть текст "ДА", если значение име- ни X — четное, и "НЕТ" — если оно нечетное. 20. Описать функцию ДЕЛИМОСТЬ (X, Y), про- веряющую, делится ли X на Y без остатка. 21. Описать процедуру ДЕЛИТЕЛИ (X), кото- рая выдаст на терминал список всех делителей чис- ла X, включая единицу и само число. 22**. Составить программу, печатающую на бу- маге список всех простых чисел, не превосходящих 1000000. 23* . Закрасить на терминале красным цветом геометрическое место точек, удовлетворяющих фор- муле [х/8] + [у/8] = 2k, где [ ] обозначает целую часть числа, а к — про- извольное целое число. 24. Найти все натуральные числа X, не пре- восходящие 1000 000, которые удовлетворяют 197
уравнению Х4 -115X3 + 62 000X2 _66 500Х + 330 000 = 0; 25*. Вычислить с точностью до 0.01 все корни уравнения х2 — 25 sin2 х. + 12 = О, лежащие на отрезке [-100,100]. 26. Описать процедуру для изображения почто- вого индекса (форма цифр должна соответствовать стандарту, указанному на конверте). 27**. Составить программу для проверки тео- ремы Ферма на некотором конечном числовом множестве. 28**. Описать функцию для вычисления площа- ди под графиком любой заданной непрерывной функции на отрезке [-1,+ 1]. 29**. Изобразить траекторию движения в зем- ной атмосфере камня, брошенного под углом к горизонту. 30**. Изобразить траекторию движения в ат- мосфере самолета (с учетом подъемной силы и аэродинамического сопротивления).
ДОПОЛНЕНИЕ ЕСЛИ ТЫ ХОЧЕШЬ ДАЛЬШЕ ИЗУЧАТЬ ПРОГРАММИРОВАНИЕ (Краткое описание языка Рапира) Приведем краткое (и не строгое) описание Рапиры. Общие правила записи программ. Программа состоит из предписаний (и описаний процедур и функций), раз- деляемых точкой с запятой. На одной строке может располагаться несколько предписаний; одно предписание может занимать не- сколько строк (сравни с Робиком!). Комментарии можно ставить в любом месте — только не внутри слова. Они записываются в особых скобках: (* Это комментарий ♦) Объекты и операции над ними. Имена. Выражения. Объекты: целые числа, дробные (ве- щественные) числа, тексты, кортежи, множества, записи, процедуры, функции, файлы, ПУСТО. Далее в примерах нам понадобится предписание вывода. Его простейшая форма —«?»: ? 525 ; (♦ В Робике: ВЫДАТЬ: 525;») 525 Любой объект, можно присвоить имени: 999.9 - > СТРАННОЕ _ ИМЯ; (*999.9 ПРИСВОИТЬ СТРАННОЕ—ИМЯ; ») ? СТРАННОЕ —ИМЯ; 999.9 Если имя используется в программе впервые, то оно имеет значение ПУСТО: ? НОВОЕ —ИМЯ; .ПУСТО. Посмотреть список всех имен можно при помощи предписания КАТАЛОГ ИМЕН; 199
Над числами определены операции + , —, * (умно- жение), / (деление), *♦ (возведение в степень). ? 4+3*8 —2/2 + (—5)**2; 52 Разрешена запись вещественных чисел в экспоненциальной форме: 1Е20, 5.8Е —6. В Рапире выражением называется последовательность чисел, текстов и имен с правильно расставленными знаками операций и скобками. Над текстами определены такие операции: № (мощ- ность, или длина), + (конкатенация, или сцепка), [ ] (выборка) и [:] (вырезка). ? № "КРОКОДИЛ"; 8 ? "КРОК" + "ОДИЛ"; КРОКОДИЛ ? "КРОКОДИЛ" [4]; К ? "КРОКОДИЛ" [2:4]; РОК Составные объекты строятся с помощью операций формирования. Их элементами могут быть любые (в том числе и составное) объекты. Кортеж — упорядоченная совокупность элементов: ? <5, "ТЕКСТ", 8 + 8>; <5, "ТЕКСТ", 16> Множество — неупорядоченная совокупность попарно различных элементов: <*1,5,1,2*>—>А; ?А; <*2,1,5*> (*Внимание!*) Запись — совокупность именованных полей: ?<§ФАМИЛИЯ: "ПЕТРОВ", ВОЗРАСТ: 1985-1973 §>; <§ФАМИЛИЯ: "ПЕТРОВ", ВОЗРАСТ: 12 §> Операции над кортежами: № (мощность), + (кон- катенация), [] (выборка), [:] (вырезка). ?№<1,<2>,"КРОК">; 3 _?<1,2> + <3>; 200
<1ДЗ> ?<4,5,6>[2]; 5 ?<4,5,6>[2:3]; <5,6> ?<4,5,6>[2:2]; <5> (*Внимание !♦) Операции над множествами: № (мощность), + (объ- единение), ♦ (пересечение), — (разность). ?№<*3,<4>,<*5,6*>,1*>; 4 ?<*3,1*> + <*4,1,5*>; <*3,5,1,4*> ?<*3,1*>*<*4,1,5*>; <*Ь> ?<*3,1*> —<*4,1,5*>; <*3*> Над записью определена только операция доступа к полю: <§ЧИСЛО: 1, МЕСЯЦ: "СЕНТЯБРЬ"§>— >ДАТА; 7ДАТА.МЕСЯЦ; СЕНТЯБРЬ Основные предписания: присваивание, цикл, ветвление, вывод, ввод, вызов процедуры, включить и выключить, каталог, контроль, предписания файло- вой системы, предписания СТОП, ПУСК, ШАГ, ВЫХОД. Простейший вариант присваивания уже был показан выше. Кроме того, можно заменить часть текста, записи или кортежа, являющегося значением имени. Для этого в правой части присваивания надо использовать уточненное имя: "КРОКОНИЛ<К; "Д"—>К[6]; (*Только один символ!*) 7 К; КРОКОДИЛ <§ НАЗВАНИЕ: "А", КООРДИНАТЫ: <5,10>§> - > ТОЧКА; 5— > ТОЧК А.КООРД ИН АТЫ [2]; 7ТОЧКА; <§НАЗВАНИЕ: "А",КООРДИНАТЫ:<5,5>§> 201
<1,5,8,4>— >А; <"Б", "В">—>А [2:3]; («Длина кортежа в левой части присваивания*) («равна длине вырезки в правой части*) ?А; <1, "Б", "В", 4> Предписания ветвления — это предписания ЕСЛИ, ВЫБОР, ВЫБОР-ИЗ. Простое условие — это два выражения, соединенные знаком сравнения (=, /=,. >, <, >=, <=, ВИДА, ИЗ): <§А:5§>/=<§Б:5§> <1,2,3>/=<2,3,1> <«1,2,3*> = <*3,2,1,1,1*> "ВАГОН" [4:5] = "СЛОН"[3:4] 5 ИЗ <3,5> («Элемент из кортежа, *) <2>'ИЗ <*<2>,<3>*> («множества, *) "Я" ИЗ «КРЯКВА» («символ из текста *) <1> ВИДА <»Т","Т"> («Оба объекта - кортежи «) (Все приведенные условия истинны.) Сложное условие строится из простых с помощью операций И, ИЛИ, НЕ и круглых скобок: 2*2 = 4И 48.5 / = 56 НЕ (1 ИЗ <«4,5*» (1 <3 И 3<=5) ИЛИ (8=8) (Эти условия тоже истинны.) Предписания ветвления: ЕСЛИ А>В («В Робике после слов*) ТО А—>С; («ТО и ИНАЧЕ может») ?"ПЕРВОЕ" (« стоять лишь по од- ♦) ИНАЧЕ В—>С; («ному предписанию») ?"ВТОРОЕ" ВСЕ; ВЫБОР ИЗ ВЕТЕР <3; ?"СЛАБО"; О - >А! ВЕТЕР<7: ?"УМЕРЕННО";1—> А! ВЕТЕР<70: ?"ТРЕВОГА!";10—> А ИНАЧЕ ?"СКОРОСТЬ ВЕТРА ЗАДАНА НЕПРАВИЛЬНО!" ВСЕ; («Выполняется только одна ветвь, где условие истинно*) ВЫБОР ОЦЕНКА ИЗ 5: ?"ОТЛИЧНО"! 202
4: ^"ХОРОШО"! 3: ?"УДОВЛЕТВОРИТЕЛЬНО"! 2,1: ? "ПЛОХО" ИНАЧЕ ?"НЕПОНЯТНО" ВСЕ; (♦Это — другая запись для частного ♦) (♦случая ВЫБОРа - ИЗ. Сравни! ♦) Предписаний цикла в Рапире несколько: ПОВТОР 30 РАЗ:: (♦30 раз напеча-м) ?"Я НА СОЛНЫШКЕ ЛЕЖУ" ВСЕ; (♦тать эту фразу^) 1—>Х; ПОКА Х**2 < 1000:: (♦Печать всех целых+) ТХ**2; Х+1—>Х; ВСЕ; (♦чисел, меньших 10(ХЬ) (♦и являющихся квадрат) (♦тами натуральных.♦) ДЛЯ X ОТ 1 ДО 100 ШАГ 2 :: ?"Х = ", X, "Х*»2=", Х**2 ВСЕ; (♦Печать квадратов всех нечетных чисел^) (♦от 1 до 100 ♦) (♦Обрати внимание на разницу в задачах! ♦) Цикл ДЛЯ —ИЗ предназначен для поэлементной об- работки текстов, кортежей и множеств: О—>СЧ; ДЛЯ БУКВА ИЗ КНИГА:: (♦Подсчет количествам) ЕСЛИ БУКВА = "А" ТО СЧ + 1—>СЧ ВСЕ (♦букв А в тексте^) (♦с именем КНИГА^) ВСЕ; ?"В ТЕКСТЕ ""КНИГА'""', СЧ, " БУКВ "“А"""; Предписание вывода (его частные случаи). Вывод на экран: ВЫВОД: 1, 2, "И ЭТОТ ТЕКСТ"; 1 2 И ЭТОТ ТЕКСТ Это эквивалентно той форме, которой мы пользовались до сих пор: ?1, 2, " И ЭТОТ ТЕКСТ"; 203
Выводить можно не только на экран, например* ВЫВОД НА БУМАГУ: "ВАЖНОЕ СООБЩЕНИЕ"; Числа и тексты можно выводить по формату: ? 5:3, " ", 1/3 :5:2; 5 0.333 Предписание ввода. Самая простая форма: ВВОД: НОВЫЙ _ ТЕКСТ; («Принять новый ТЕКСТ;*) Можно вводить числа, кортежи и множества: ВВОД ДАННЫХ: (*Сравни с*) ЧИСЛО, КОРТЕЖ; (* "ПРИНЯТЬ ЧИСЛА"*) Пр оцедуры и функции. Пример процедуры: ПРОЦ ШИВОРОТ_ НАВЫВОРОТ; (♦Печать текста наоборот*) ИМЕНА: ТЕКСТ, И; (*Описание локальных имен*) ?"ВВЕДИТЕ ТЕКСТ"; ВВОД: ТЕКСТ; ДЛЯ И ОТ №-ТЕКСТ ДО 1 ШАГ - 1:: ВЫВОД БПС (*Без перевода строки*): ТЕКСТ [И] ВСЕ; ?; («Перевод строки*) КНЦ; Пример функции (аналог функции в Робике — про- цедура с результатом): ФУНК ФАКТ (N); (♦Вычисляет факториал числа N*) ИМЕНА :Ф; ЕСЛИ N = 0 ТО 1—>Ф ИНАЧЕ ФАКТ (N —1)*N—>Ф ВСЕ; РЕЗ: Ф; («Результат*) КНЦ; Вызов процедуры — это предписание, а вызов функ- ции — выражение (в этом случае вызов считается опера- цией над функцией и ее параметрами). Примеры вы- зовов: ШИВОРОТ _ НАВЫВОРОТ (); ВВЕДИТЕ ТЕКСТ 204
?НОС (*Этот "?" выдает ЭВМ!*) СОН ?ФАКТ(1+ 5) —ФАКТ(5); 600 У процедур допустимы входные, выходные и возвратные Параметры; у функций — только входные. Указание способа передачи: ПРОЦ ПРИМЕР (ВХОДНОЙ _ 1, => ВХОДНОЙ _ 2, ВЫХОДНОЙ=>, < = >ВОЗВРАТНЫЙ); КНЦ; Предусмотрены стандартные процедуры и функции: элемен- тарные математические, для работы с текстами, для работы с внешними устройствами, графические и другие. Редактор. (Экранный, основан на использовании функцио- нальных клавиш; в режиме меню — работа с файловой системой.) После слов "ПРОЦ ИМЯ_ПРОЦ ...;" ЭВМ пере- ходит в режим редактирования процедуры. Если процеду- ра с таким именем уже была в ОЗУ или ДЗУ, то ее текст появится на экране. (То есть конструкция "ПРОЦ ..." выполняет то, для чего в Робике исполь- зовалось два предписания: "ЗАПОМНИТЬ ПРО- ЦЕДУРУ ..." и "ИСПРАВИТЬ ПРОЦЕДУРУ ...".) Теперь можно набирать текст процедуры и редак- тировать его. Для того чтобы изменить часть текста, достаточно подвести курсор к тому месту на экране, где расположен этот текст, и внести исправления. (Можно вставлять символы, убирать, заменять их, вставлять и убирать строки, управлять курсором.) Точно так же редактируются функции. Чтобы посмотреть каталог всех процедур и функ- ций, хранящихся на диске (точнее, всех файлов на дис- ке), надо набрать предписание КАТАЛОГ; или КАТАЛОГ НА БУМАГУ; Файлы. Существуют текстовые файлы прямого доступа. Вывод (ввод) можно настроить на файл: везде, где в примерах стоит 205
"НА БУМАГУ", может стоять "В ФАЙЛ ИМЯ _ ФАЙЛА"; после слова "ВВОД" может быть указано "ИЗ ФАЙЛА ИМЯ__ФАЙЛА" Средства отладки. Автоматическая прокрутка имен: ВКЛ ПРОКРУТКУ ИМЕН: А, В; ВЫКЛ ПРОКРУТКУ; След вызовов процедур (функций): ВКЛ СЛЕД; След строк процедур (функций): ВКЛ СЛЕД СТРОК; Вывод протокола работы на внешнее устройство: ВКЛ ПРОТОКОЛ НА БУМАГУ; Изменение направления всего вывода (ввода)* ВКЛ ВЫВОД НА БУМАГУ; ВКЛ ВВОД ИЗ ФАЙЛА ИМЯ _ФАЙЛА; Полная или частичная защита имен по записи: ВКЛ ЗАЩИТУ: А, В; ВКЛ ЧАСТ ЗАЩИТУ: С, Д, Е; ВЫКЛ ЗАЩИТУ: В, Е; Контрольная точка: КОНТРОЛЬ: А = В; Приостанов выполнения процедуры: СТОП; В режиме приостанова можно посмотреть и изменить значение любого имени (изменить — если имя не защищено), продолжить выполнение процедуры (ПУСК;), прекратить выполнение процедуры и выйти из режима приостанова (ВЫХОД;), продолжить выполнение процедуры по одной строке (ШАГ;).
ОГЛАВЛЕНИЕ Предисловие редактора 3 От автора 5 Введение. МИР РОБОТОВ -И ВЫЧИСЛИТЕЛЬНЫХ МАШИН 7 Первое прерывание. Зачем Сирен’е ЭВМ? 11 Второе прерывание. Куда спрятался процессор? 22 Третье прерывание. Что нужно знать и уметь, чтобы рабо- тать с ЭВМ? 27 Глава первая. ИСПОЛНИТЕЛИ И ПРОГРАММЫ 35 Первый урок. Основные законы программирования и пра- вила записи программ 35 Первая перемена. Твое рабочее место 44 Второй урок. Диалог с исполнителем ДЕЖУРИК (лабора- торная работа) w 46 Вторая перемена. МУРАВЕЙ и МАШИНИСТ 51 Третий урок. Как составлять программы (практическое занятие) 58 Глава вторая. СИНТАКСИЧЕСКИЕ ДИАГРАММЫ 70 Четвертый урок. Гибкие описания МПИ 70 Третья перемена. Вспомним правила и формулы 77 Пятый урок. Как составлять и читать диаграммы 81 Четвертая перемена. Вернемся к нашим диаграммам 91 Шестой урок. Элементарные конструкции языка Робик (практикум .по работе с синтаксйческими диаграммами) 92 Глава третья. РАБОТА С ПАМЯТЬЮ 105 Седьмой урок. Блоки памяти и их имена. Программирова- ние диалога 105 Пятая перемена. Ручная прокрутка 117 Восьмой урок. Процедуры 120 Шестая перемена. МАЛЫШ и ЧЕРТЕЖНИК 139 Девятый урок. Процедуры с параметрами 144 Глав-а четвертая. ВЕТВЛЕНИЯ И ЦИКЛЫ В ПРО- ГРАММАХ 164 Десятый урок. Тринадцать задач, девять алгоритмов и три предписания 164 Седьмая перемена. Новое о знакомых исполнителях 178 Одиннадцатый урок. Составление программ с ветвящейся и циклической структурой 180 Восьмая и последняя перемена. Еще два исполнителя 190 Двенадцатый урок. Продолжение следует 192 Дополнение. ЕСЛИ ТЫ ХОЧЕШЬ ДАЛЬШЕ ИЗУЧАТЬ ПРОГРАММИРОВАНИЕ (Краткое описание языка Рапира) 199
Геннадий Анатольевич Звенигородский ПЕРВЫЕ УРОКИ ПРОГРАММИРОВАНИЯ Серия «Библиотечка «Квант»» Редактор Л. Г. Силкова Художественный редактор Т. Н. Кольченко Технический редактор Е. В. Морозова Корректоры Л. И. Назарова, И. Я. Кришталь ИБ № 12271 Сдано в набор 16.01.85. Подписано к печати 22.07.85. Т-16626. Формат 84 х 1081 /32• Бумага тип. № 3. Гарнитура тайме. Печать высокая. Усл. печ. л. 10,92. Усл. кр.-отт. 11,34. Уч.-изд. л. 10,67. Тираж 150000 экз. Заказ № 1786. Цена 30 коп. Ордена Трудового Красного Знамени издательство «Наука» Главная редакция физико-математической литературы 117071 Москва В-71, Ленинский проспект, 15 Ордена Октябрьской Революции, ордена Трудового Красного Знамени Ленин- градское производственно-техническое объединение «Печатный Двор» имени А. М. Горького Союзполиграфпрома при Государственном комитете СССР по делам издательств, полиграфии и книжной торговли. 197136 Ленинград П-136, Чкаловский пр., 15
30 коп.