Текст
                    Ф. УОТТЕНБЕРГ
• *• •' • ,* • •" ""*• . . *• • • <•♦•••••
•* • * •*	*• \ *• -••******••••
*• • • * t 4 f • ' * • >. • # • ... * ■ £ 4 * *	* <
ПРОГРАММИРОВАНИЕ
ДЛЯ ПЕРСОНАЛЬНОГО
КОМПЬЮТЕРА Эпл ?
•. •• *»• ••
. •. *. .• .•• 		••
•» * *. •* .* ••* ••• ••••«••• *•, * *• , •»•••••**
% .• •• ••. •• •• *•. 	•'
•• • • «• .• ,• .«•• •••, ’ • !••••••«
• •• •• .• •• ..•••••. •. .. >.
• .• • • • • .• • • •	•	.	•	• ♦.
•• • •• •* •• .• •/ ••	*.	\
•• .* • •• .• .• • .•• •.	•.	•-	•.	•••»».:
•’ •• •• *•. • —”•••.
.• .*	•	•* .	•	••	.*•	••	•	.ЛмТ..,.	•.
.• /’ .•* •’ •• * ‘ •• ’•, • ••.,
•’ •• •’ «••••• •*•. •• •.
У ...•••”••••• чл	*’••.	’••	••<•••
..•••,о-.. ••• •.
.•? ••• ’• •, ' •
••• .•••• •■••••. ••.
,••••—••. ••• •• ’• •. • ••
• ’’•. •• • •• ’• .* •• .*


ПРОГРАММИРОВАНИЕ ДЛЯ ПЕРСОНАЛЬНОГО КОМПЬЮТЕРА Эпл
Your Apple II Needs You: 30 Programming Projects for the Apple II FRANK WATTENBERG UNIVERSITY OF MASSACHUSETTS Prentice-Hall, Inc., Englewood Cliffs, New Jersey 1984
Ф. УОТТЕНБЕРГ ПРОГРАММИРОВАНИЕ ДЛЯ ПЕРСОНАЛЬНОГО КОМПЬЮТЕРА Эпл Перевод с английского канд. техн, наук В. И. Гуревича, канд.техн, наук В. П. Руковчука, И. Я. Штейнцайга под редакцией канд. техн, наук В. К. Потоцкого Москва «Мир» 1988
ББК 32.97 У 65 УДК 681.3 Уоттенберг Ф. У 65 Программирование для персонального компьютера Эпл: Пер. с англ.— М.: Мир, 1988.— 372 с., ил. ISBN 5—03—000571—4 (русск.) Книга американского ученого представляет собой пособие для изучающих основы информатики, вычислительной техники и осваивающих методы составления и отладки рабочих программ в диалоговом режиме на персональном компьютере, в котором используется язык Бейсик. Приводятся 29 алгоритмов решения мате¬ матических и физических задач, для которых составлены программы. Для пользователей персональных ЭВМ — от школьников старших классов до специалистов со средним и высшим образованием. У 2405000000-047 041 (01)-88 200-88, ч. 1 ББК 32.97 Редакция литературы по информатике и робототехнике ISBN 5—03—000571—4 (русск.) © 1984 by Prentice-Hall, Inc. ISBN 0—13—977975—2 (англ.) © перевод на русский язык, с изме¬ нениями и дополнением, «Мир», 1988
ПРЕДИСЛОВИЕ РЕДАКТОРА ПЕРЕВОДА Если последнюю четверть века по праву называют эрой вычислитель¬ ной техники, то 80-е гг.— десятилетием массового распространения персо¬ нальных ЭВхЧ (вычислительных машин индивидуального пользования). Информатика и вычислительная техника становятся в наши дни неотъемле¬ мыми составными частями всеобщего среднего образования. В настоящее время трудно себе представить область науки или техники, отрасль на¬ родного хозяйства или сферу обслуживания, где бы в той или иной форме не применялись средства вычислительной техники. ЭВМ стремительно проникают в наш быт, требуя не телько от инженера и техника, но и от студента и школьника владения навыками программирования. Безуслов¬ но, что хорошее учебное пособие, опирающееся на фундамент общеобразо¬ вательной подготовки и увлекательно написанное, может существенно по¬ мочь в преодолении того барьера, который нередко возникает между по¬ тенциальным пользователем персональной ЭВМ и эффективными, но тре¬ бующими навыка применения средствами, предоставляемыми машиной для решения самых разнообразных задач (математики, физики, техничес¬ ких дисциплин, экономики, организации производства и т. д.). Предла¬ гаемую читателю книгу можно отнести именно к таким пособиям. Ориенти¬ рованная на начинающего программиста и юного читателя, она может ув¬ лечь не только ясностью и простотой изложения техники алгоритмизации и программирования типовых по содержанию, часто оригинальных по фор¬ мулировке задач общеобразовательных дисциплин (физики, математики и даже биологии), но и предложением освоить процесс разработки, отладки и использования программ, реализующих на ЭВ^М так называемые элек¬ тронные игры (с отображением’’игрового поля” на экране дисплея и при¬ менением клавиатуры ЭВМ или специального пульта управления игрой). Содержание книги ориентировано на использование персональной ЭВМ Apple II и языка программирования Бейсик (называемого APPLESOFT II BASIC). Предполагается, что читатель знаком с основными принципами алгоритмизации задач, подлежащих решению на ЭВМ, и техникой про¬ граммирования на языке высокого уровня типа Бейсик. Чтобы облегчить читателю освоение излагаемого материала и ознакомить с основами и некоторыми особенностями диалекта языка Бейсик (APPLESOFT II BASIC), русский перевод книги дополнен неформальным описанием основ этого языка. Книга носит практический характер: переходя от задачи к задаче (все изложение построено в форме следующих одна за другой задач), читатель вместе с автором каждый раз проделывает весь’’путь” разработки програм¬ мы от анализа поставленной задачи с целью ее формализации до составле¬ ния алгоритма ее решения на ЭВМ, от схемы алгоритма до последующей его записи на языке программирования, т. е. до окончательного формирования текста программы. Однако автор не стремится навязать читателю готовое решение. Сначала приводится запись на языке Бейсик только наиболее сложных фрагментов алгоритма и предлагается самостоятельное написа¬ ние текста всей программы. И только в тех случаях, когда читателю это
6 Предисловие редактора перевода оказывается пе по силам, ему предоставляется возможность ’’заглянуть” в приложение и ознакомиться с полным текстом завершенной программы. Правомочным следует признать вопрос о целесообразности освоения техники программирования на языке Бейсик ЭВМ типа Apple II и уни¬ версальности получаемых при этом знаний. Ответ на этот вопрос является утвердительным, поскольку современным средствам вычислительной тех¬ ники присуща определенная стандартизация как аппаратных средств, так и программного обеспечения. Нередко после сравнительно небольших из¬ менений в программе пользователю ЭВ?Л удается ’’перейти” из одной ’’вы¬ числительной среды” в другую, сохраняя практически неизменными логику функционирования и язык программирования разработанной программы (тем более если это язык Бейсик — язык начинающего программиста). Перечисленное выше дает основание надеяться, что книга, ориентиро¬ ванная на одну из наиболее массовых моделей персональных ЭВМ за рубе¬ жом и на самый популярный среди начинающих программистов язык программирования, окажется своевременным и нужным учебным пособием для многочисленных пользователей ЭВМ в нашей стране, и прежде всего начинающих программистов, школьников старших классов и студентов младших курсов вузов. Перевод выполнен И. Я. Штейицайгом (гл. 1, 5, 7, 8), каид. техн, наук В. И. Гуревичем (гл. 2, 6) и каид. техн, наук В. П. Рукавчуком (гл. 3, 4). В. К, Потоцкий
Эта книга посвящена моей жене Джулии и моим детям Марти и Алине. Работа над книгой во многом носила семей¬ ный характер: все трое читали отдельные части рукописи и высказали много предложений по улучшению ее содержа¬ ния. Марти заслуживает особых благодарностей: он не только потрудился над всем объемом книги (некоторые задачи были изъяты при формировании окончательного варианта рукописи),: но и ответствен за материал, излагаемый в задачах 6 и 28. Джу¬ лия также принимала участие в работе над всеми разделами книги и внесла в текст очень много поправок, существенно улучшивших ее читабельность. Кроме того, она отпечатала два варианта рукописи. Вот почему с глубоким чувством призна¬ тельности им за помощь и за то, что они сделали работу над рукописью книги не только заслуживающей внимания, но приятной и увлекательной, я посвящаю эту книгу Джули н, Марти и Алине ПРЕДИСЛОВИЕ ЭВМ прогнозируют для нас погоду. С их помощью пилотируют авиа¬ лайнеры и начисляют налоги. Они же развлекают нас играми, следят за состоянием денежных вкладов в банках, докучают напоминаниями о по¬ купках, сделанных в кредит. Несмотря на общепринятость этих утвержде¬ ний, все это неверно! Вычислительные машины выполняют упомянутые операции не в большей мере, чем молотки сколачивают мебель, а кисти создают полотна — шедевры живописи. ЭВМ относятся к чрезвычайно быстродействующим и высокопроизводи¬ тельным инструментам, однако они совершенно беспомощны без людей, программирующих их работу. Можно приобрести программное обеспече¬ ние для персональной ЭВМ, позволяющее реализовать большие возмож¬ ности машины, но чтобы действительно воспользоваться ими, необходимо самостоятельно составить программу, которая заставит ЭВМ выполнять именно то, что необходимо. В этой книге рассказывается, как составлять программы для ЭВМ. Книга предназначена для тех, кто уже познакомился с руководством по программированию на ЭВМ типа Apple II с использованием программного обеспечения Applesoft, кто владеет основами алгоритмизации и програм¬ мирования и кто хотел бы воспользоваться всем этим ’’богатством” для составления новых и зачастую удивительных программ. В данной книге рассматривается решение 30 задач Х), программируе¬ мых для реализации на ЭВМ: некоторые носят вполне серьезный харак¬ тер, другие представляют собой игры; и те и другие читатель найдет ин¬ тересными и даже увлекательными. Уже беглый взгляд иа перечень наз¬ ваний этих задач в оглавлении может дать представление о разнообразии рассматриваемых проблем. Каждая задача анализируется во всех дета¬ лях — от формулировки цели решения до написания отдельных операто¬ ров разрабатываемой для ЭВМ программы. Все неординарные приемы программирования тщательно обсуждаются. Результаты решения задачи нередко представлены не одним, а несколькими вариантами законченной программы, пригодной для выполнения на ЭВМ типа Apple (Apple Не, Apple 11+ с объемом оперативной памяти 48К или Apple II при использо¬ вании средств программного обеспечения Applesoft). Для большинства программ приемлемый объем оперативной памяти составляет 48К. Одна задача изъята,— Прим, ред<
8 Предисловие Если читатель ознакомился с руководством по программированию с использованием средств Applesoft и располагает возможностью обратиться к этим материалам в случае необходимости, излагаемое в данной книге не потребует от него обращения к каким-либо другим литературным источ¬ никам по программированию 1}. Глава 1 посвящена программированию на ЭВМ различных игр. Наря¬ ду с этим описываются принципы и техника моделирования на ЭВМ слу¬ чайных событий, использование графических возможностей машины, ор¬ ганизация диалога между ЭВМ и пользователем (интерактивный режим работы). Разработка программ в этой главе ведется детально, с.описанием каждого очередного оператора. Короткая гл. 2 содержит некоторые общие характеристики процесса программирования и техники отладки программ. В последующих главах описываются решения задач, отличающихся как формулировками требо¬ ваний к ЭВМ, так и реализацией поставленных целей программными сред¬ ствами. Хотя при рассмотрении каждой задачи излагается общий ход ее решения, разработка структуры программы и ее отдельных неординарных фрагментов, а также составление текста полной завершенной программы возлагаются па читателя. (Тексты готовых программ приводятся в при¬ ложении.) Содержание любой главы, следующей за первыми двумя, как правило, носит самостоятельный характер и не зависит от излагаемого в других главах. Поэтому, ознакомившись с гл. 1 и 2, можно приступать к рассмот¬ рению задач любой главы. Если же для решения конкретной задачи тре¬ буется знать, как решаются какие-либо предыдущие задачи, то на это яс¬ но указывается при постановке данной задачи (под рубрикой ’’Специфи¬ ческие предпосылки успешной разработки”). И наконец, последнее замечание. Программы, предлагаемые автором,- не идеальны. Каждая из них может быть улучшена с целью получения не только большего количества результатов, но и их представления в более элегантной форме. Некоторые программы можно выполнять с большей ско¬ ростью и приблизить их к идеалу, который существует в представлении того или иного программиста. Автор действительно считал бы цель, по¬ ставленную при написании книги, достигнутой, если бы читателю уда¬ лось выполнить подобные усовершенствования предлагаемых решений. Фрэнк Уоттенберг Русский перевод книги содержит дополнение, призванное воспол¬ нить недостаток информации, содержащейся в упомянутом руководстве,— Прим, ред.
I ИГРЫ И ИНТЕРАКТИВНОЕ ПРОГРАММИРОВАНИЕ Отличительными признаками современных микроЭВМ яв¬ ляются не только низкая цена и небольшие размеры, но и раз¬ нообразие способов их взаимодействия с человеком. Первые ЭВМ ’’общались” с человеком при помощи длинных колонок цифр. Современные вычислительные машины способны опери¬ ровать словами, графическими изображениями и даже подавать звуковые сигналы. В некоторых случаях для определенных целей ЭВМ может заменить книгу. МикроЭВМ способна созда¬ вать на экране изображение движущихся объектов и отвечать на вопросы или реагировать на определенные действия пользо¬ вателя. Все перечисленные выше свойства микроЭВМ позволяют говорить о появлении систем человек-машина. Эти возмож¬ ности являются одной из причин частого использования вычис¬ лительных машин как средства реализации игр. Подобные системы человек-машина позволяют решать многие серьезные задачи, сочетая интеллект человека со способностью ЭВМ вести продолжительные, сложные вычисления. Программирование работы ЭВМ в неразрывном взаимодей¬ ствии с человеком называют интерактивным программировани¬ ем х). В данной главе рассматриваются принципы и техника такого программирования и реализация с их помощью игр на ЭВМ. Помимо интересных игр здесь разрабатывается несколько задач, иллюстрирующих технику интерактивного программи¬ рования, а именно: Задача 1. Программируется игра ’’Быстрее, Макс!”, требую¬ щая от одного или нескольких участников быстроты реакции на сообщение, появляющееся на экране дисплея. Задача 2. Осваивается использование дисплея ЭВМ’’Apple II” в графическом режиме с низкой разрешающей способностью. Техника программирования, описываемая при решении этой Речь идет о так называемом интерактивном режиме работы ЭВМ — режиме диалога, при котором имеет место активный обмен сообщениями между пользователем и ЭВМ, вычислительная машина осуществляет прием, обработку и выдачу сообщений в реальном масштабе времени.— Прим. ред.
10 Глава 1 задачи, применяется во многих последующих задачах этой книги. Решение задачи 1 является предпосылкой успешного решения данной задачи. Задача 3. Программируется увлекательная игра ’’Гонки по ла¬ биринту”, в которой играющий управляет ’’гоночным автомоби¬ лем”, движущимся по лабиринту. Решение задачи 2 является необходимой предпосылкой для успешного составления этой программы. Задача 4. Составляется программа, выполняющая функции генератора лабиринтов случайной конфигурации, такие лаби¬ ринты обычно используются в качестве игрового поля, воспроиз¬ водимого на экране дисплея. Включение этой программы как про¬ цедуры в программу задачи 3 ’’Гонки по лабиринту” делает последнюю еще более увлекательной, поскольку трасса гонок в каждом новом сеансе игры принимает другую конфигурацию. Необходимой предпосылкой успешного решения данной задачи является знакомство с решением задачи 2. Задача 5. Программируется игра ’’Собачьи бега”, требующая от играющего быстроты реакции и хорошей координации движе¬ ний при управлении движением ’’бегущей собаки”. В игре учиты¬ вается скорость прохождения дистанции, а также точность коор¬ динации движений. Один неверный шаг в сторону — и собака сходит с дистанции, забег проигран. Единственным необходимым условием успешного составления этой программы является решение задачи 2. Задача 6. Программируется игра ’’Пилотирование самолета под огнем зенитных батарей”, требующая от играющего быстрой реакции. Единственной предпосылкой успешного программиро¬ вания этой игры является решение задачи 1. Задача 7. Осваивается использование дисплея ЭВМ ’’Apple II” в графическом режиме с высокой разрешающей способностью. Техника программирования, применяемая при решении этой за¬ дачи, широко используется в программах последующих задач. Специфические условия, необходимые для успешного решения этой задачи, отсутствуют. Задача 1. ’’Быстрее, Макс!” Назначение разрабатываемой программы: использование в качестве игры, достижение успеха в которой зависит от скорости реакции играющего. Специфические предпосылки успешной разработки: отсутст¬ вуют. Пояснения программисту: разрабатываемая программа весьма проста и в то же время содержит три специфических приема, особенно полезных при программировании игр. Перечислим их.
Игры в интерактивное программирование 11 1. Использование так называемой встроенной функции RND, выполняющей в программе роль генератора случайных чисел и позволяющей внести в игру элемент случайности. 2. Применение циклов задержки для снижения скорости выполнения программы до скорости реакции человека. 3. Обеспечение активного обмена сообщениями между ЭВМ и пользователем посредством клавиатуры и пульта управления игрой (реализация интерактивного режима работы машины). Подлежащая разработке программа должна предоставить в распоряжение пользователя ЭВМ простую игру, в которую могут играть один или несколько человек. Достижение успеха зависит от скорости реакции играющего. Как и в большинстве задач этой книги, читателю предлагается начать с составления относительно простого варианта программы. Далее программу можно модифицировать, с тем чтобы сделать игру более увле¬ кательной. Единственное, что требуется от играющего,— бы¬ строта реакции. Предположим, что играющий сидит перед эк¬ раном дисплея, имея возможность манипулировать клавишами управления игрых). Внезапно, без всякого предупреждения, на экране появляется сообщение ’’БЫСТРЕЕ, MAKCI”. Играю¬ щий должен нажать кнопку на пульте управления игрой как Программа ’’Быстрее, Макс!” может быть составлена в двух вариан- тах, первый ориентирован на применение специального пункта управле¬ ния игрой, второй — клавиатуры ЭВМ. В данной задаче рассматривают¬ ся оба варианта.
12 Глава 1 можно быстрее. ЭВМ сообщает о времени реакции игрока, по¬ бедителем объявляется игрок, добившийся наилучшего резуль¬ тата. Приступая к программированию этой игры, прежде всего необходимо обеспечить вывод на экран мерцающего сообщения '’БЫСТРЕЕ, МАКС!” в произвольные, случайные моменты времени. Современные ЭВМ располагают возможностью выбора числа из некоторого потока случайных чисел. Используя в программе на языке Бейсик функцию RND(l), можно получить случайное число в диапазоне 0—1, например 0,6137 или 0,0572. Представим себе по¬ добный генератор случайных чисел в виде волчка (рис. 1.1). Каждый раз при исполь¬ зовании функции RND(l) вол¬ чок приводится в движение и останавливается, указывая случайное число в пределах 0—1. Для демонстрации это¬ го средства языка Бейсик можно воспользоваться сле¬ дующей небольшой програм¬ мой: 100 НО 120 FOR 1 = 1 ТО 20 PRINT RND (1) NEXT I Используем функцию RND(l) при составлении про¬ момента времени вывода на экран цедуры выбора случайного сообщения ’’БЫСТРЕЕ, МАКС!”. На рис. 1.2 представлена схема алгоритма этой процедуры. Функция RND служит для выбора случайного числа R в диапазоне 0—1. Если R^0,9, выводится сообщение ’’БЫСТРЕЕ, МАКС!”. Если 7?<О,9, управление передается в начало процедуры для выбора нового значения R. В зависимости от значения R осуществляется вывод сообщения ’’БЫСТРЕЕ, МАКС!” или возврат управления первому опе¬ ратору этой процедуры для получения еще одного случайного значения R. Выполнение процедуры повторяется до тех пор, пока не будет выбрано случайное число, большее или равное 0,9. Затем выводится сообщение ’’БЫСТРЕЕ, МАКС!”. В приведенной ниже программе на языке Бейсик реализован алгоритм 1}, схема которого изображена на рис. 1.2, Алгоритм представляет собой поэтапный метод решения задачи*
Игры в интерактивное программирование 13 130 R = RND (1): REM ВЫБОР СЛУЧАЙНОГО ЧИСЛА 140 IF R < .9 THEN 130: REM ЕСЛИ ПОЛУЧЕННОЕ ЧИСЛО МЕНЬШЕ ЧЕМ 0.9, ТО ВЫБОР НОВОГО СЛУЧАЙНОГО ЧИСЛА 150 PRINT ’’БЫСТРЕЕ, МАКС!”: REM ЕСЛИ ЧИСЛО БОЛЬШЕ ЧЕМ 0.9, ТО ВЫВОД СООБЩЕНИЯ ’’БЫСТРЕЕ, МАКС!” При каждом пуске программы сообщение ’’БЫСТРЕЕ, МАКСИ появляется на экране практически мгновенно. Это объясняется очень большой скоростью работы ЭВМ, эквивалентной тысячам оборотов волчка в минуту. Чтобы понизить эту скорость, в программу включают циклы задержки. Такова, например, про- грамма 100 К - ЮО: REM ЗНАЧЕНИЕ ПЕРЕМЕННОЙ К ОПРЕДЕЛЯЕТ ДЛИТЕЛЬНОСТЬ ЗАДЕРЖКИ 110 FOR DLY = 1 ТО К: REM ЦИКЛ ЗАДЕРЖКИ 120 NEXT DLY 130 R - RND (1): REM ВЫБОР СЛУЧАЙНОГО ЧИСЛА 140 IF R < .9 THEN1 110: REM ЕСЛИ ПОЛУЧЕННОЕ ЧИСЛО МЕНЬШЕ ЧЕМ 0.9, ТО ВЫБОР НОВОГО СЛУЧАЙНОГО ЧИСЛА 150 PRINT ’’БЫСТРЕЕ, МАКС!”: REM В ПРОТИВНОМ СЛУЧАЕ — ВЫВОД СООБЩЕНИЯ ’’БЫСТРЕЕ, МАКС!” Операторы в строках НО—120 программы не выполняют ни¬ каких иных полезных действий, кроме задержки во времени процесса выполнения программы. Однако если сообщение ’’БЫ¬ СТРЕЕ, МАКС!” все же появляется слишком быстро, можно порекомендовать замену значения верхнего предела параметра цикла К= ЮО па К=200, тем самым еще более замедлив выпол¬ нение программы. Если же сообщение появляется слишком медленно, следует попытаться заменить /<=100 на /<=50. При¬ емлемое значение К можно найти, проделав ряд подобных экс¬ периментов. При этом следует учитывать, что интервал време¬ ни с момента пуска программы до вывода сообщения” БЫСТРЕЕ, М А КС!” является случайным. Как только указанное сообщение появляется на экране, играющий должен ответить нажатием клавиши. Машина под¬ считывает время, затраченное играющим на подобный отклик. Возможны два варианта технического решения процедуры обмена сообщениями между пользователем и ЭВМ: 1. Использование специализированного пульта управления игрой. Имеется ряд конструкций подобного пульта [к которым относится, например, джойстик (joystick)], используемого в ЭВМ типа ’’Apple II”. Типовой набор подобных средств, постав¬ ляемый вместе с ЭВМ, включает для пульта управления игрой два комплекта органов управления, каждый из которых имеет кнопку-клавишу и ручку-регулятор потенциометра. Если для
14 Г лава 1 игры ’’Быстрее, Макс!” воспользоваться таким пультом х), то в ответ на появление сообщения ’’БЫСТРЕЕ, МАКС!” необхо- димо нажать расположенную на нем кнопку. 2. Использование клавиатуры ЭВМ. В этом случае в ответ на появление сообщения ’’БЫСТРЕЕ, МАКС!” пользователю до¬ статочно нажать любую клавишу. Поскольку оба способа используются довольно часто, вторая часть рассматриваемой программы разрабатывается в двух ва¬ риантах: с применением пульта управления игрой и с исполь¬ зованием клавиатуры ЭВМ. При наличии пульта управления игрой рекомендуется реализовать оба варианта программы. Если такого устройства нет, следует ограничиться вариантом, использующим клавиатуру. Вариант программы с использованием пульта управления игрой При выполнении программы определенная часть аппаратных средств машины периодически опрашивает состояние пультов управления игрой и клавиш клавиатуры с целью выяснения, были ли нажаты какие-либо кнопки пультов или клавиши. Связь указанных аппаратных средств с выполняемой програм¬ мой осуществляется через определенные области оперативной памяти ЭВМ, куда эти аппаратные средства помещают соот¬ ветствующие сообщения. Информация о состоянии кнопки пульта 0 помещается в байт оперативной памяти с адресом —16 287. Если кнопка пульта 0 нажата, содержимое этого байта больше или равно 128. Если кнопка не нажата, соответствующее значение меньше 128. Программное обеспечение ’’Applesoft” ЭВМ типа ’’Apple” предусматривает при программировании на языке Бейсик воз¬ можность использования функции РЕЕК, при помощи которой программа может ’’прочесть” содержимое любого байта оператив¬ ной памяти. Функция РЕЕК (—16 287) позволяет извлечь зна¬ чение байта оперативной памяти с адресом — 16 287, и поэтому ее можно использовать для определения состояния кнопки пульта 0. Попытайтесь выполнить пуск следующей простой программы: 100 IF РЕЕК ( — 16 287) > 127 THEN PRINT ’’КНОПКА НАЖАТА” 110 IF РЕЕК ( - 16 287) < 128 THEN PRINT’’КНОПКА НЕ НАЖАТА” 120 GOTO 100 1} Задачи, рассматриваемые в дайной книге, предполагают подключе¬ ние к персональной ЭВМ одного или двух подобных пультов управления игрой. Для того чтобы ЭВМ могла различать сигналы, поступающие с того или иного пульта, последним присваиваются условные номера 0 и 1. При использовании только одного пульта его условный номер — 0.— Прим» ред.
Игры в интерактивное программирование 15 В процессе выполнения этой программы можно нажимать и отпускать кнопку управления игрой произвольное число раз. Как только программа, реализующая описываемую игру, выдает сообщение ’’БЫСТРЕЕ, МАКС!”, она (согласно схеме алгоритма на рис. 1.3) переходит к выполнению цикла ожидания Рис. 1.3. нажатия кнопки. Переменная СТ выполняет роль счетчика числа повторений цикла, имевших место до момента нажатия кнопки пульта 0. Ниже приведена процедура, соответствующая схеме алгоритма на рис. 1.3. Попытайтесь выполнить пуск этой процедуры. 100 СТ = 0: REM СТ — СЧЕТЧИК ЧИСЛА ПОВТОРЕНИЙ ЦИКЛА НО IF РЕЕК (— 16 287) > 127 THEN 200; REM ПРОВЕРКА, НАЖАТА ЛИ КНОПКА 120 СТ = СТ + 1: REM ЕСЛИ НЕТ, УВЕЛИЧЕНИЕ НА ЕДИНИЦУ СОДЕРЖИМОГО СЧЕТЧИКА ЧИСЛА ПОВТОРЕНИЙ ЦИКЛА 130 GOTO НО: REM И ПОВТОРНОЕ ВЫПОЛНЕНИЕ ЦИКЛА 200 PRINT ’’СЧЕТЧИК = ”; СТ: REM ВЫВОД ЗНАЧЕНИЙ СОДЕРЖИМОГО СЧЕТЧИКА ЧИСЛА ПОВТОРЕНИЙ ЦИКЛА Выждите некоторое время после пуска программы, а затем нажмите кнопку пульта управления игрой. Повторите подобные действия несколько раз для того, чтобы привыкнуть к работе с подобным пультом. Игра ’’Быстрее, Макс!” была бы увлекательнее, если бы со¬ общение о времени реакции играющего выдавалось в секундах. Прежде чем внести в программу соответствующие изменения, следует провести эксперимент с имеющейся в вашем распоря¬ жении ЭВМ и установить, сколько времени необходимо для выполнения описанного выше цикла ожидания нажатия кнопки
16 Глава 1 пульта управления игрой. Скорость выполнения цикла можно определить, например выждав 100 с с момента пуска программы, прежде чем нажать кнопку 0 пульта. Появляющееся на экране число соответствует числу повторений цикла ожидания за 100 с. На своей ЭВМ автор получил число около 7000, т. е. цикл вы¬ полнялся примерно 7000/100=70 раз/с. Чтобы получить время реакции играющего в секундах, необходимо разделить значение переменной СТ на 70, как это делается в строке 200 приводимой ниже процедуры. 100 СТ = 0: REM СТ - СЧЕТЧИК ЧИСЛА ПОВТОРЕНИЙ ЦИКЛА 110 IF РЕЕК ( — 16 287) > 127 THEN 200: REM ПРОВЕРКА, НАЖАТА ЛИ КНОПКА 120 СТ = СТ + 1: REM ЕСЛИ НЕТ, УВЕЛИЧЕНИЕ НА ЕДИНИЦУ СОДЕРЖИМОГО СЧЕТЧИКА ЧИСЛА ПОВТОРЕНИЙ ЦИКЛА 130 GOTO ПО: REM И ПОВТОРНОЕ ВЫПОЛНЕНИЕ ЦИКЛА 200 SEC - СТ / 70: REM ЕСЛИ ДА, ТО ОПРЕДЕЛЯЕТСЯ ВРЕМЯ РЕАКЦИИ ИГРОКА (В СЕКУНДАХ) 210 PRINT ’’ВАМ ПОТРЕБОВАЛОСЬ ”;SEC;” СЕК” Разумеется, на ЭВМ, имеющейся в распоряжении читателя, вместо 70 будет получено иное значение. Теперь все необходимые процедуры известны, и можно приступить к написанию первоначального варианта программы ’’Быстрее, Макс!”. Схемы алгоритмов отдельных процедур объ¬ единены в единую схему на рис. 1.4. Читателю рекомендуется Попытаться самостоятельно составить первоначальный вариант программы. Ниже приводится текст такой программы, состав¬ ленной автором. В конце данного раздела после рассмотрения варианта программы с использованием клавиатуры ЭВМ фор¬ мулируется ряд предложений по усовершенствованию этой программы. "Быстрее, Макс!" (Вариант программы с использованием пульта управления игрой) 100 К = ЮО: REM К — ОПРЕДЕЛЯЕТ ПРОДОЛЖИТЕЛЬНОСТЬ РАБОТЫ ЦИКЛА ЗАДЕРЖКИ 110 FOR DLY = 1 ТО К: REM ЦИКЛ ЗАДЕРЖКИ 120 NEXT DLY 130 R = RND (1): REM ПОЛУЧЕНИЕ СЛУЧАЙНОГО ЧИСЛА 140 IF R < .9 THEN 110: REM ЕСЛИ ПОЛУЧЕННОЕ ЧИСЛО МЕНЬШЕ ЧЕМ 0.9, ТО ПОЛУЧЕНИЕ НОВОГО ЧИСЛА 150 PRINT ’’БЫСТРЕЕ, МАКС!” 160 СТ = 0: REM ОЧИСТКА СЧЕТЧИКА ЧИСЛА ПОВТОРЕНИЙ ЦИКЛА 170 IF РЕЕК ( — 16 287) > 127 THEN 200: REM ПРОВЕРКА, НАЖАТА ЛИ КНОПКА 0 УПРАВЛЕНИЯ ИГРОЙ 180 СТ = СТ + 1: REM ЕСЛИ НЕТ, СОДЕРЖИМОЕ СТ УВЕЛИЧИВАЕТСЯ НА ЕДИНИЦУ 190 GOTO 170: REM И СНОВА ПРОВЕРЯЕТСЯ СОСТОЯНИЕ КНОПКИ 200 SEC = СТ / 70: REM ЕСЛИ ДА, ТО ОПРЕДЕЛЯЕТСЯ ВРЕМЯ РЕАКЦИИ ИГРОКА (В СЕКУНДАХ) 210 PRINT ’’ВАМ ПОТРЕБОВАЛОСЬ ”;SEC;” СЕК”
Игры в интерактивное программирование 17 Качало Рис. 1.4.
18 Глава 1 Вариант программы с использованием клавиатуры ЭВМ Для ввода информации с клавиатуры ЭВМ программное обеспечение Applesoft предусматривает возможность исполь¬ зования в языке Бейсик операторов GET и INPUT. При про¬ граммировании многих игр, в том числе и игры ’’Быстрее, Макс!”, оператор GET оказывается чрезвычайно полезным. Выполнение оператора вида GET Х$ происходит в три этапа: 1. Если ни одна из клавиш не была нажата, выполнение программы останавливается, а на экране появляется мерца¬ ющий курсор, символизирующий ожидание машиной ввода с клавиатуры. 2. При нажатии какой-либо клавиши переменной при¬ сваивается значение соответствующего символа. 3. После выполнения операций п. 2 происходит подготовка клавиатуры к вводу следующего символа. Для разрабатываемой программы ’’Быстрее, Макс!” остановки ее выполнения с целью ожидания ввода с клавиатуры не требу¬ ется. Выполнение программы прекращаться не должно, по¬ скольку при этом прерывается процедура подсчета времени между моментом появления на экране сообщения ’’БЫСТРЕЕ, МАКС!” и ответным нажатием клавиши. Во время выполнения программы определенная часть ап¬ паратных средств машины периодически опрашивает состояние пультов управления игрой и клавиш клавиатуры с целью вы¬ яснения, были ли нажаты какие-либо кнопки пультов или клавиши. Связь указанных аппаратных средств с выполняемой программой осуществляется через определенные области опе¬ ративной памяти ЭВМ, куда эти аппаратные средства помещают соответствующие сообщения. Информация о состоянии клавиа¬ туры помещается в байт оперативной памяти с адресом — 16 384. Как только какая-либо из клавиш оказывается нажатой, в указанную область памяти записывается число, большее 127. С помощью функции РЕЕК можно ’’прочесть” содержимое любой области оперативной памяти. Например, функция РЕЕК (—16 384)' обеспечивает доступ к содержимому байта оперативной памяти с адресом — 16 384. Следовательно, с помощью оператора вида 100 IF РЕЕК ( — 16 384) > 127 THEN 200 можно проверить, была ли нажата какая-либо из клавиш кла¬ виатуры. Используя в строке 200 программы оператор 200 GET Х$ можно присвоить переменной значение символа, соответ¬ ствующего нажатой клавише, и вернуть клавиатуру в состояние готовности к вводу следующего символа.
Йгры в йнтёрактивное программирование 19 Продемонстрировать работу операторов РЕЕК (—16 384) и GET можно с помощью следующей небольшой программы. 100 IF РЕЕК ( - 16 384) > 127 THEN 200: REM ПРОВЕРКА, БЫЛА ЛИ НАЖАТА КАКАЯ-ЛИБО КЛАВИША ПО СТ = СТ + 1: REM ЕСЛИ НЕТ, ТО СОДЕРЖИМОЕ СЧЕТЧИКА ЧИСЛА ПОВТОРЕНИЙ ЦИКЛА УВЕЛИЧИВАЕТСЯ НА ЕДИНИЦУ 120 GOTO 100 200 GET Х$: REM ЕСЛИ ДА, ТО ПРИСВОЕНИЕ ПЕРЕМЕННОЙ Х$ ЗНАЧЕНИЯ ВВЕДЕННОГО СИМВОЛА И ПОДГОТОВКА КЛАВИАТУРЫ К ВВОДУ СЛЕДУЮЩЕГО СИМВОЛА 210 PRINT ”СТ = ”;СТ;” НАЖАТА КЛАВИША = ”;Х$ 220 СТ =0: REM ОЧИСТКА СЧЕТЧИКА ЧИСЛА ПОВТОРЕНИЯ ЦИКЛА 230 GOTO 100 Нажатие различных клавиш на клавиатуре ЭВМ после приводит к появлению на экране дисплея пуска программы строк вида ]RUN СТ = 82 СТ = 38 СТ = 42 СТ = 44 СТ = 47 СТ = 41 СТ = 46 СТ = 44 СТ = 49 СТ = 48 СТ = 47 СТ = 42 СТ = 73 СТ = 47 НАЖАТА КЛАВИША: F НАЖАТА КЛАВИША: О НАЖАТА КЛАВИША: U НАЖАТА КЛАВИША: R НАЖАТА КЛАВИША: НАЖАТА КЛАВИША: S НАЖАТА КЛАВИША: С НАЖАТА КЛАВИША: О НАЖАТА КЛАВИША: R НАЖАТА КЛАВИША: Е НАЖАТА КЛАВИША: НАЖАТА КЛАВИША: А НАЖАТА КЛАВИША: N НАЖАТА КЛАВИША: D Цикл, образованный операторами в строках 100—120, назы¬ вают циклом ’’ожидания”, поскольку выполнение операторов этого цикла происходит снова и снова до тех пор, пока поль¬ зователь не нажмет какую-либо клавишу на клавиатуре ЭВМ. При этом значение переменной СТ указывает число повторений цикла до нажатия клавиши. Функционирование подобного цикла точно соответствует требованиям разрабатываемой про¬ граммы. Игра ’’Быстрее, Макс!” становится интереснее, если снабдить соответствующую программу процедурой вывода сообщения о времени реакции играющего в секундах. Для составления такой процедуры необходимо определить, сколько времени тре¬ буется имеющейся в вашем распоряжении ЭВМ на выполнение операторов цикла ожидания. Для этого следует выполнить пуск программы и через 100 с нажать какую-либо клавишу. Выведенное на экран значение переменной СТ указывает число повторений выполнения операторов цикла ожидания за 100 с.
20 Глава 1 Например, значение СТ составляет примерно 7000 (у различных ЭВМ эти числа могут несколько отличаться друг от друга). Это означает, что цикл ожидания выполняется 7000/100=70 раз/с. В общем случае для определения времени ожидания необходимо разделить значение переменной СТ на 70, как это делается в приводимой ниже программе (читателю при составлении подоб¬ ной программы потребуется деление на некоторое другое число, отличное от 70 и полученное в результате эксперимента, анало¬ гичного описанному выше): 100 СТ = 0: REM ОЧИСТКА СТ - СЧЕТЧИКА ЧИСЛА ПОВТОРЕНИЯ ЦИКЛА ОЖИДАНИЯ НО IF РЕЕК ( — 16384) > 127 THEN 200: REM ПРОВЕРКА, БЫЛА ЛИ НАЖАТА КАКАЯ-ЛИБО КЛАВИША 120 СТ = СТ + 1: REM ЕСЛИ НЕТ, УВЕЛИЧЕНИЕ НА ЕДИНИЦУ СОДЕРЖИМОГО СЧЕТЧИКА ЧИСЛА ПОВТОРЕНИЙ ЦИКЛА ОЖИДАНИЯ 130 GOTO ПО: REM И ПРОДОЛЖЕНИЕ ВЫПОЛНЕНИЯ ЦИКЛА ОЖИДАНИЯ 200 GET Xg: REM ЕСЛИ ДА, ТО ПРИСВОЕНИЕ ПЕРЕМЕННОЙ Х$ ПОЛУЧЕННОГО СИМВОЛА И ПОДГОТОВКА КЛАВИАТУРЫ К ВВОДУ СЛЕДУЮЩЕГО СИМВОЛА 210 SEC - СТ / 70: REM ОПРЕДЕЛЕНИЕ ВРЕМЕНИ РЕАКЦИИ ИГРОКА (В СЕКУНДАХ) 220 PRINT ’’ВАМ ПОТРЕБОВАЛОСЬ ”;SEC;” СЕК” Теперь все подготовлено для написания программы ’’Быст¬ рее, Макс!”, схема алгоритма которой приведена на рис. 1.5. Пользуясь этим, читателю рекомендуется самостоятельно со¬ ставить программу. Текст подобной программы, составленной автором, приводится ниже. ” Б ыстрее, Л4 акс! ” (Вариант программы с использованием клавиатуры ЭВМ) 100 К = ЮО: REM ЗНАЧЕНИЕ ПЕРЕМЕННОЙ К ОПРЕДЕЛЯЕТ ДЛИТЕЛЬНОСТЬ ЗАДЕРЖКИ 110 FOR DLY -1 ТОК: REM ЦИКЛ ЗАДЕРЖКИ 120 NEXT DLY 130 R = RND (1): REM ПОЛУЧЕНИЕ СЛУЧАЙНОГО ЧИСЛА 140 IF R < .9 THEN 110: REM ЕСЛИ ПОЛУЧЕННОЕ ЧИСЛО МЕНЬШЕ ЧЕМ 0.9, ТО ПОЛУЧЕНИЕ НОВОГО СЛУЧАЙНОГО ЧИСЛА 150 PRINT ’’БЫСТРЕЕ, МАКС!” 160 СТ = 0: REM ОЧИСТКА СЧЕТЧИКА ЧИСЛА ПОВТОРЕНИЙ ЦИКЛА 170 IF РЕЕК ( — 16 384) > 127 THEN 200: REM ПРОВЕРКА, БЫЛА ЛИ НАЖАТА КАКАЯ-ЛИБО КЛАВИША 180 СТ = СТ + 1: REM ЕСЛИ НЕТ, СОДЕРЖИМОЕ СТ УВЕЛИЧИВАЕТСЯ НА ЕДИНИЦУ 190 GOTO 170: REM И ПРОВЕРКА СОСТОЯНИЯ КЛАВИАТУРЫ 200 GET Х$: REM ПОЛУЧЕНИЕ СИМВОЛА И ПОДГОТОВКА КЛАВИАТУРЫ К ВВОДУ СЛЕДУЮЩЕГО СИМВОЛА
Игры в интерактивное программирование 21 Начало Рис. 1.5.
22 Глава f 210 SEC = СТ / 70: REM ОПРЕДЕЛЕНИЕ ВРЕМЕНИ РЕАКЦИИ ИГРОКА (В СЕКУНДАХ) 220 PRINT ’’ВАМ ПОТРЕБОВАЛОСЬ ”;SEC;” СЕК” Рекомендации по улучшению первоначального варианта программы Можно надеяться, что, следуя предыдущим рекомендациям, читатель справился с задачей составления программы. После нескольких сеансов игры возникает, по-видимому, желание внести в программу определенные усовершенствования. Ниже формулируется несколько предложений по усовершенствова¬ нию первоначального варианта программы. 1. Вместо вывода только сообщения о времени реакции иг¬ рающего предпочтительнее выводить на экран дополнительные комментарии, используя операторы вида 230 IF SEC > .5 THEN PRINT ”HE ЗЕВАЙ, МАКС!” 240 IF SEC < .3 THEN PRINT ’’ОТЛИЧНАЯ РЕАКЦИЯ, МАКС!” 2. Нечестный игрок может нажать кнопку пульта управ¬ ления игрой (или клавишу клавиатуры) до появления сообще¬ ния ’’БЫСТРЕЕ, МАКС!”. Читателю рекомендуется добавить несколько строк в текст программы для исключения возмож¬ ности подобных действий. 3. А что если ваше имя не Макс? Включение в текст программы нескольких строк, подобных приводимым ниже, позволит об¬ ращаться к играющему по имени. 80 PRINT ’’ВАШЕ ИМЯ?” 90 INPUT NM$ 100 PRINT ’’БЫСТРЕЕ,”;NM§ 4. Можно использовать звуковой сигнал для извещения поль¬ зователя о начале игры. Руководства по эксплуатации ЭВМ содержат необходимую информацию для программирования подачи звукового сигнала. 5. Можно изменить программу, предоставив играющему пять попыток в каждом сеансе игры с выдачей сообщения о среднем времени его реакции. Можно даже определить макси¬ мальное и минимальное значения времени реакции. 6. Перед началом игры можно вывести на экран дисплея ее правила, это позволило бы вашему приятелю подключиться к игре. 7. Можно модифицировать программу так, чтобы вместо сообщения ’’БЫСТРЕЕ, МАКС!” на экране появлялся текст ’’СПРАВА, МАКС!” или ’’СЛЕВА, МАКС!”. Если появляется сообщение ’’СПРАВА, МАКС!”, пользователь должен нажать
Игры в интерактивное программирование 23 клавишу ”Р”, при появлении сообщения ’’СЛЕВА, МАКС!” — клавишу ”Q” на клавиатуре ЭВМ. При использовании пульта управления игрой роль клавиш ”Р” и ”Q” клавиатуры выпол¬ няют соответственно кнопки 0 и 1 пульта управления игрой. При программировании работы с кнопкой 1 следует использо¬ вать такие же операторы, как и в случае кнопки 0 пульта, учи¬ тывая только, что информация о ее состоянии регистрируется байтом оперативной памяти ЭВМ, имеющим адрес — 16 286. Чтобы проверить, была ли нажата кнопка 1 пульта, достаточно воспользоваться оператором IF РЕЕК ( — 16 286) > 127 THEN 8. Можно изменить игру так, чтобы одновременно могли играть двое, причем каждый использовал бы одну клавишу на клавиатуре ЭВМ или одну кнопку пульта управления игрой. Задача 2. Использование графического режима низкой разрешающей способности Назначение разрабатываемой программы: освоение возмож¬ ностей использования дисплея ЭВМ в графическом режиме низ¬ кой разрешающей способности (режим высокой разрешающей способности рассматривается в задаче 7). Специфические предпосылки успешной разработки: знакомство с решением задачи 1. Пояснение программисту: здесь рассматриваются возмож¬ ности получения статических (неподвижных) и движущихся изображений на экране дисплея средствами указанного режима. Возможности работы дисплея в графическом режиме низкой разрешающей способности, реализуемые микроЭВМ ’’Apple II”, очень хорошо согласуются с требованиями к ЭВМ, возникаю¬ щими при программировании игр. Однако такой режим работы дисплея находит широкое применение при необходимости пред¬ ставления в наглядной графической форме результатов рас¬ четов разнообразных задач более серьезного назначения. В режиме низкой разрешающей способности экран дисплея ЭВМ делится на 1600 адресуемых областей, называемых блоками (элементами разложения): поле экрана представляется в виде 40 рядов по 40 блоков в каждом. Каждый блок может иметь любой из 16 цветов. В программах данной задачи используются лишь два цвета для построения изображений: белый и черный. Ряды блоков нумеруются сверху вниз, верхний ряд имеет номер 0, нижний — номер 39. В каждом ряду (строке) блоки нуме¬ руются числами 0—39 слева направо. Положение любого блока
24 Глава 1 на экране указывается парой чисел: С и R. Первое число С определяет номер колонки, в которой находится блок, а второе R — номер строки. Значение С называют х-координатой блока, значение R— у-координатой. На рис. 2.1 представлены не¬ которые блоки на экране дисплея вместе с их координатами. Программное обеспечение Applesoft позволяет использовать в программе на языке Бейсик следующие шесть команд, обес¬ печивающие построение изображения на экране дисплея в графическом режиме низкой разрешающей способности: 1. GR 2. COLOR = X С помощью этой команды дисплей переводится в графический режим низкой разрешающей способ* ности, экран дисплея очищается и все блоки ста¬ новятся черными, в нижней части поля экрана резервируется небольшая область для размещения четырех строк текста, курсор помещается в начало этой области, позволяя осуществлять вывод текста По этой команде устанавливается цвет блоков используемый при построении изображений с по¬ мощью команд PLOT, HLIN, VLIN; X — это целое число от 0 до 15, позволяющее выбрать цвет вос¬ производимого изображения, а именно: 0 —черный ° ”— -”Л 1 — красный 2 —темно-синий 3 —пурпурный 4 —темно-зеленый 5 — серый 8 —коричневый 9 —оранжевый 10 —серый 11 — розовый 12 —зеленый 13 —желтый
Игры в интерактивное программирование 25 3. PLOT X, Y 4. HLINX1,X2 АТУ 5. VLIN У1,У2 AT X 6. SCRN (X, У) 6 —синий 14 —аквамариновый 7 — голубой 15 — белый По этой команде один блок поля с координатами X, У окрашивается цветом, который был задан последней из команд COLOR, предшествующей дан¬ ной команде PLOT При использовании этой команды отрезок горизон¬ тальной линии, расположенный в строке У и за¬ нимающий позиции XI—Х2, окрашивается цветом, задаваемым последней из команд COLOR, которая предшествует данной команде HLIN При использовании этой команды отрезок верти¬ кальной линии, расположенный в столбце X и за¬ нимающий позиции У1—У2, окрашивается цветом, задаваемым последней из команд COLOR, которая предшествует данной команде VLIN Эта команда служит для определения цвета блока, координатами которого являются значения пере¬ мещенных X и У. Оператор вида 100 IF SCRN (X, У) = 15 THEN PRINT ’’БЕЛЫЙ” позволяет проверить, является ли цвет блока с ко¬ ординатами X и У белым Изображение, полученное на экране дисплея в результате выполнения некоторых команд графического режима с низкой разрешающей способностью, показано на рис. 2.2. Если читатель еще не вполне освоил возможности дисплея в графическом режиме с низкой разрешающей способностью, 0 5 10 15 20 25 30 35 0 5 10 15 20 25 30 35 ~ П I Г| 1 I I п ГП 1 ГГ П I 1 11 11 1111 I 11! 11 I ГБ С □ PLOT 15,5 Z С l 1 HLIH5,14 АТ 19 Z ~ *VL№ 2д,35АТ 15 f л II I I I I I I I I I 1 I I I I 1 1 1 I 1 I 1 I I I I I 1 I I I I I I I I Г 0 5 10 15 20 25 30 35 Рис. 2.2.
26 Глава 1 ему можно рекомендовать проведение ряда экспериментов по построению различных изображений на экране посредством описанных выше команд. Можно, например, попытаться полу¬ чить изображения фигур, показанных на рис. 2.3, выбрав для отображения любой допустимый цвет. Приводимая ниже про¬ грамма демонстрирует возможное решение этой задачи. GR: REM ГРАФИЧЕСКИЙ РЕЖИМ С НИЗКОЙ РАЗРЕШАЮЩЕЙ СПОСОБНОСТЬЮ COLOR = 15: REM ЦВЕТ БЕЛЫЙ МАЛОГО КРЕСТА 100 110 120 REM СТРОИТСЯ ИЗОБРАЖЕНИЕ 130 HLIN 4,6 AT 5 140 VLIN 4,6 AT 5 150 REM СТРОИТСЯ КРЕСТА ИЗОБРАЖЕНИЕ 160 HLIN 22,28 AT 5 170 VLIN 2,8 AT 25 180 REM СТРОИТСЯ КРЕСТА ИЗОБРАЖЕНИЕ 190 HLIN 2,7 AT 14 200 HLIN 2,7 AT 15 210 VLIN 12,17 AT 4 220 VLIN 12,17 AT 5 230 REM СТРОИТСЯ ИЗОБРАЖЕНИЕ 240 HLIN 24,24 AT 13 250 HLIN 24,25 AT 14 260 HLIN 24,26 AT 15 270 HLIN 24,27 AT 16 280 REM X ’’ЛЕСТНИЦЫ” длинного тонкого КОРОТКОГО ЖИРНОГО
Игры в интерактивное программирование 27 290 300 310 320 FOR I = 0 ТО 6 PLOT 13 + 1,21 + I PLOT 13 + 1,27 — I NEXT I Используя быстродействие ЭВМ, можно сформировать на экране дисплея движущиеся изображения. Примером решения подобной задачи является следующая программа: 100 REM ДЕМОНСТРАЦИЯ ДВИЖЕНИЯ ИЗОБРАЖЕНИЯ НА ЭКРАНЕ ДИСПЛЕЯ ПО REM 120 GR: REM УСТАНОВКА ГРАФИЧЕСКОГО РЕЖИМА С НИЗКОЙ РАЗРЕШАЮЩЕЙ СПОСОБНОСТЬЮ 130 COLOR = 15: REM ЦВЕТ ИЗОБРАЖЕНИЯ БЕЛЫЙ 140 PLOT 0,10: REM ДВИЖЕНИЕ ОБЪЕКТА НАЧИНАЕТСЯ ОТ ЛЕВОГО КРАЯ ПОЛЯ ЭКРАНА 150 FOR I = 0 ТО 38 160 FOR DLY = 1 ТО 100: NEXT DLY: REM ЦИКЛ ЗАДЕРЖКИ 170 COLOR = 0: PLOT 1,10: REM СТИРАНИЕ ИЗОБРАЖЕНИЯ БЛОКА В СТАРОЙ ПОЗИЦИИ 180 COLOR = 15: PLOT 1 + 1,10: REM ПОСТРОЕНИЕ ИЗОБРАЖЕНИЯ БЛОКА В НОВОЙ ПОЗИЦИИ 190 NEXT I При работе этой программы на экране можно наблюдать изображение блока, движущегося слева направо. Ключевой частью этой небольшой программы является цикл вида FOR. . . NEXT (строки 150—190). Строка 160 представляет, в сущности, цикл задержки выполнения программы, в то время как собст¬ венно формирование движущегося изображения осуществляется строками 170 и 180. Чтобы обеспечить перемещение блока слева направо из положения с координатами (/, 10) в положение g координатами (/+1,10), оператор в строке 170 обеспечивает стирание изображения блока в предшествующем положении, а оператор в строке 180 — построение изображения блока в следующем. Стирание осуществляется путем установки черного цвета блока в соответствующем месте экрана. В программе задачи 3 ’Тонки по лабиринту” изображение движущегося блока используется для обозначения гоночного автомобиля, ведомого играющим сквозь лабиринт. Во многих играх используется движение объекта, управляемого, подобным образом. Оба способа активного обмена сообщениями человека с ЭВМ, рассмотренные в задаче 1, можно использовать при про¬ граммировании игр. Ниже рассматривается управление движе¬ нием объекта с использованием клавиатуры ЭВМ. Позже будет рассмотрен другой вариант этой же программы, использующий Для управления движением объекта пульт управления игрой. В обоих вариантах программы центральной частью является один и тот же основной цикл, реализующий перемещение объ¬ екта.
28 Глава 1 Основной цикл Обратимся к рис. 2.4. Допустим, что гоночный автомобиль изображается на экране в виде блока черного цвета в позиции с координатами (3,2). Требуется составить программу, представ¬ ляющую возможность пользователю управлять перемещением О 1 2 3 4 5 ® © н Рис. 2.4. ’’автомобиля” в четырех направлениях: 1 — вверх, в позицию с координатами (3,1), 2 — вправо, в позицию с координатами (4,2), 3 — вниз, в позицию с координатами (3,3), 4 — влево, в позицию с координатами (2,2). Используем четыре переменные для управления движением гоночного автомобиля: X и Y для хранения текущих координат автомобиля (на рис. 2.4 Х=3, У=2), SX и SY ддя. указания изменений координат, необходимых для перемещения изображения. Значения, которые должны прини¬ мать переменные SX и SY, определяются требуемым направ¬ лением движения, а именно: SX = 0, 1 SX=1, sr = o SX = 0, sy=l SX =—1, sy = o при движении вверх, при движении вправо, при движении вниз, при движении влево. Значения координат новой позиции перемещаемого объекта могут быть определены следующим образом: X = X + SX Новое значение X t Старое значение X Y = Y + SY t Новое значение Y t Старое значение Y Следующие три строки программы на языке Бейсик позво¬ ляют произвести необходимые вычисления для перемещения
Игры в интерактивное программирование 29 изображения автомобиля на одну позицию в соответствующем направлении: 990 COLOR = 0: PLOT X, Y: REM СТИРАНИЕ ИЗОБРАЖЕНИЯ БЛОКА В СТАРОЙ ПОЗИЦИИ 9,0 х = X + SX : Y = Y + SY: REM ВЫЧИСЛЕНИЕ КООРДИНАТ НОВОЙ ПОЗИЦИИ БЛОКА 940 COLOR = 15: PLOT X, Y: REM ФОРМИРОВАНИЕ ИЗОБРАЖЕНИЯ БЛОКА В НОВОЙ ПОЗИЦИИ Оставшаяся часть этой программы написана в двух вариан¬ тах: с применением пульта управления игрой и с использова¬ нием клавиатуры ЭВМ. Вариант программы с использованием клавиатуры ЭВМ В этом варианте рассматриваемой программы четыре клавиши клавиатуры ЭВМ используются для управления движением ’’гоночного автомобиля”: Клавиша Направление движения К J М I Вправо Влево Вниз Вверх При нажатии любой другой клавиши автомобиль останавли¬ вается. Строки 250 и 300—360 приводимого ниже текста про¬ граммы служат для определения состояния клавиатуры ЭВМ и присвоения переменным SX и SV соответствующих значений. 250 IF РЕЕК(— 16384) > 127 THEN 300: REM ПРОВЕРКА, ВЫДАЛИ НАЖАТА КАКАЯ-ЛИБО КЛАВИША 300 REM ПРОЦЕДУРА ИЗМЕНЕНИЯ НАПРАВЛЕНИЯ ДВИЖЕНИЯ В СООТВЕТСТВИИ С ТЕМ, КАКАЯ КЛАВИША БЫЛА НАЖАТА 310 GET Х$: REM ПЕРЕМЕННОЙ Х$ ПРИСВАИВАЕТСЯ ЗНАЧЕНИЕ СИМВОЛА НАЖАТОЙ КЛАВИШИ 320 IF Х$ = "К” THEN SX = 1 : SY = 0: GOTO 210: REM ПРИ НАЖАТИИ КЛАВИШИ ”К” ДВИЖЕНИЕ ВПРАВО 330 IF Х$ = ”J” THEN SX = — 1 : SY = 0: GOTO 210: REM ПРИ НАЖАТИИ КЛАВИШИ ”J” ДВИЖЕНИЕ ВЛЕВО 340 IF Х$ = ”М” THEN SX = 0 : SY = 1: GOTO 210: REM ПРИ НАЖАТИИ КЛАВИШИ ”M” ДВИЖЕНИЕ ВНИЗ 350 IF Х$ = ”1” THEN SX = 0 : SY = — 1: GOTO 210: REM ПРИ НАЖАТИИ КЛАВИШИ ”1” ДВИЖЕНИЕ ВВЕРХ 360 SX = 0: SY = 0: GOTO 210: REM ПРИ НАЖАТИИ ЛЮБОЙ ДРУГОЙ КЛАВИШИ ПОЛОЖЕНИЕ ОБЪЕКТА НЕ МЕНЯЕТСЯ Теперь читатель должен попытаться самостоятельно соста¬ вить программу, предоставляющую пользователю возможность управлять посредством клавиатуры движением блока на экране
30 Глава 1 дисплея при условии, что цвет блока — белый, а исходная позиция имеет координаты (20,20). При возникновении затруд¬ нений в процессе написания программы моЖно обратиться к тексту приводимой ниже программы. 100 GR : REM УСТАНОВКА ГРАФИЧЕСКОГО РЕЖИМА С НИЗКОЙ РАЗРЕШАЮЩЕЙ СПОСОБНОСТЬЮ .110 X = 20: Y = 20: REM УСТАНОВКА КООРДИНАТ ИСХОДНОЙ ПОЗИЦИИ ОБЪЕКТА 120 SX = 0 : SY = 0: REM В НАЧАЛЕ ПРОГРАММЫ ОБЪЕКТ НЕПОДВИЖЕН 200 REM ОСНОВНОЙ ЦИКЛ ИМИТАЦИИ ДВИЖЕНИЯ ОБЪЕКТА '210 FOR DLY = 1 ТО 100: NEXT DLY: REM ЦИКЛ ЗАДЕРЖКИ 220 COLOR = 0: PLOT X, Y: REM СТИРАНИЕ ИЗОБРАЖЕНИЯ БЛОКА В СТАРОЙ ПОЗИЦИИ 230 X = X + SX : Y = Y + SY: REM ВЫЧИСЛЕНИЕ ЗНАЧЕНИЙ КООРДИНАТ НОВОЙ ПОЗИЦИИ БЛОКА 240 COLOR = 15: PLOT X, Y: REM ФОРМИРОВАНИЕ ИЗОБРАЖЕНИЯ БЛОКА В НОВОЙ ПОЗИЦИИ 250 IF РЕЕК (— 16 384) > 127 THEN 300: REM ПРОВЕРКА, БЫЛА ЛИ НАЖАТА КАКАЯ-ЛИБО КЛАВИША 260 GOTO 210: REM ЕСЛИ НЕТ, ПОВТОРЕНИЕ ВЫПОЛНЕНИЯ ЦИКЛА ЗАДЕРЖКИ 300 REM ПРОГРАММА ИЗМЕНЕНИЯ НАПРАВЛЕНИЯ ДВИЖЕНИЯ В СООТВЕТСТВИИ С ТЕМ, КАКАЯ КЛАВИША БЫЛА НАЖАТА 310 GET Х$: REM ПЕРЕМЕННОЙ Х$ ПРИСВАИВАЕТСЯ ЗНАЧЕНИЕ СИМВОЛА НАЖАТОЙ КЛАВИШИ 320 IF Х$ = ”К” THEN SX = 1 : SY = 0: GOTO 210: REM ПРИ НАЖАТИИ КЛАВИШИ ”К” ДВИЖЕНИЕ ВПРАВО 330 IF Х$ = ”J” THEN SX = — 1 : SY = 0: GOTO 210: REM ПРИ НАЖАТИИ КЛАВИШИ ”J” ДВИЖЕНИЕ ВЛЕВО 340 IF Х$ = ”М” THEN SX = 0 : SY = 1: GOTO 210: REM ПРИ НАЖАТИИ КЛАВИШИ ”M” ДВИЖЕНИЕ ВНИЗ 350 IF Х$ = ”1” THEN SX = 0 : SY = — 1: GOTO 200: REM ПРИ НАЖАТИИ КЛАВИШИ ”1” ДВИЖЕНИЕ ВВЕРХ 360 SX = 0: SY = 0: GOTO 210: REM ПРИ НАЖАТИИ ЛЮБОЙ ДРУГОЙ КЛАВИШИ,ПОЛОЖЕНИЕ ОБЪЕКТА НЕ МЕНЯЕТСЯ Рекомендуется несколько раз повторить пуск разработан- . ной программы, чтобы приобрести опыт манипулирования со¬ ответствующими клавишами. Скорость движения блока можно менять, модифицируя максимальное значение параметра цикла задержки в строке 210. Отметим, что попытка вывести блок за пределы экрана вызывает жоявление на экране дисплея сообще¬ ния ILLEGAL QUANTITY ERROR (недопустимая величина). Вариант программы с использованием пульта управления игрой Рассмотрим реализацию возможности управления движением объекта с помощью пультов управления игрой. В этом случае управление движением блока на экране дисплея осуществ¬ ляется в соответствии со следующими правилами:
Игры в интерактивное программирование 31 1) если обе кнопки управления игрой не нажаты, блок дви¬ жется вниз, 2) если обе кнопки управления игрой нажаты, блок движется вверх, 3) если нажата только кнопка 0, блок движется вправо, 4) если нажата только кнопка 1, блок движется влево. Вариант программы, ориентированный на использование пульта управления игрой, во многом подобен варианту, пред¬ полагающему использование клавиатуры ЭВМ. Тексты обеих программ отличаются лишь строками 250—260, содержащими операторы управления движением. Схема алгоритма на рис. 2.5 описывает функционирование этой части рассматриваемого ва¬ рианта программы. Рис. 2.5. Читатель может попытаться, используя схему алгоритма на рис. 2.5, модифицировать предыдущий вариант программы для обеспечения управления движением блока с помощью пульта управления игрой. В случае каких-либо затруднений можно обратиться к тексту приводимой ниже программьь
32 Глава 1 100 GR: REM УСТАНОВКА ГРАФИЧЕСКОГО РЕЖИМА С НИЗКОЙ РАЗРЕШАЮЩЕЙ СПОСОБНОСТЬЮ 110 X = 20: Y = 20: REM УСТАНОВКА КООРДИНАТ ИСХОДНОЙ ПОЗИЦИИ ОБЪЕКТА 120 SX = 0: SY = 0: REM В НАЧАЛЕ ПРОГРАММЫ ОБЪЕКТ НЕПОДВИЖЕН 200 REM ОСНОВНОЙ ЦИКЛ ИМИТАЦИИ ДВИЖЕНИЯ ОБЪЕКТА 210 FOR DLY = 1 ТО 100: NEXT DLY:REM ЦИКЛ ЗАДЕРЖКИ 220 COLOR =0: PLOTX,Y: REM СТИРАНИЕ ИЗОБРАЖЕНИЯ БЛОКА В СТАРОЙ ПОЗИЦИИ 230 X = X + SX: Y = Y + SY: REM ВЫЧИСЛЕНИЕ ЗНАЧЕНИЙ КООРДИНАТ НОВОЙ ПОЗИЦИИ БЛОКА 240 COLOR = 15: PLOT X, Y: REM ФОРМИРОВАНИЕ ИЗОБРАЖЕНИЯ БЛОКА В НОВОЙ ПОЗИЦИИ 250 IF РЕЕК ( — 16 286) > 127 THEN 300: REM ПРОВЕРКА, НАЖАТА ЛИ КНОПКА 1 УПРАВЛЕНИЯ ИГРОЙ 260 IF РЕЕК ( — 16 287) > 127 THEN 280: REM ПРОВЕРКА, НАЖАТА ЛИ КНОПКА 0 УПРАВЛЕНИЯ ИГРОЙ 270 SX = 0: SY = 1: GOTO 210: REM ОБЪЕКТ ДВИЖЕТСЯ ВНИЗ 280 SX = 1:SY = 0: GOTO 210: REM ОБЪЕКТ ДВИЖЕТСЯ ВПРАВО 300 IF РЕЕК ( — 16 287) > 127 THEN 320: REM ПРОВЕРКА, НАЖАТА ЛИ КНОПКА 0 УПРАВЛЕНИЯ ИГРОЙ 310 SX = —1: SY = 0: GOTO 210: REM ОБЪЕКТ ДВИЖЕТСЯ ВЛЕВО 320 SX = 0: SY = —1: GOTO 210: REM ОБЪЕКТ ДВИЖЕТСЯ ВВЕРХ Рекомендуется несколько раз повторить пуск разработанной программы, чтобы приобрести навык в манипулировании кноп¬ ками пультов управления игрой. Решения, предлагаемые для данной задачи, можно применить при разработке многих других программ, реализующих игры на ЭВМ. Одна из таких игр, на¬ званная ’’Гонки по лабиринту”, рассматривается в следующей задаче. Задача 3. «Гонки по лабиринту» Назначение разрабатываемой программы: использование в качестве игры, предоставляющей возможность управлять ’’ав¬ томобилем”, который движется по лабиринту. Специфические предпосылки успешной разработки: знаком¬ ство с решением задачи 2. Пояснения программисту: большая часть разрабатываемой программы уже рассмотрена в задаче 2. В кажущуюся весьма простой игру, подобную описываемой ниже, зачастую довольно трудно играть. В данном случае иг¬ рающий управляет ’’автомобилем”, движущимся по лабиринту. Необходимо провести ’’автомобиль” через лабиринт, избежав столкновения со стенами. ’’Гоночный автомобиль” движется с постоянной скоростью, и играющий имеет возможность управ¬
Игры в интерактивное программирование 33 лять только направлением движения. Хотя условия игры могут показаться очень простыми, судить о трудности достижения поставленной цели можно, лишь испытав свои возможности на практике. Первая задача, возникающая при составлении реализующей игру программы,— выбор конфигурации лабиринта и построе¬ ние его изображения на экране дисплея. Для формирования такого изображения используем дисплей в графическом режиме с низкой разрешающей способностью. На рис. 3.1 показан один из возможных вариантов лабиринта. Проходы в лабиринте имеют ширину, равную трем блокам, чтобы обеспечить некоторое пространство для возможных ма¬ невров автомобиля между стенками. Этот вариант лабиринта привлекателен тем, что в нем имеется несколько вариантов пути различной сложности. Читатель может использовать иные, более сложные варианты лабиринта по мере овладения искус¬ ством вождения автомобиля. Процедура формирования на экране дисплея изображения лабиринта состоит в основном из 2 № 989
34 Глава 1 набора команд типа VLIN и HLIN. Читателю следует попытаться составить такую процедуру самостоятельно. Процедура форми¬ рования изображения лабиринта, приведенного на рис. 3.1, имеет следующий вид: 100 GR : REM УСТАНОВКА ГРАФИЧЕСКОГО РЕЖИМА С НИЗКОЙ РАЗРЕШАЮЩЕЙ СПОСОБНОСТЬЮ ПО COLOR =±= 15: REM ИСПОЛЬЗУЕМЫЙ ДЛЯ ПОСТРОЕНИЯ ИЗОБРАЖЕНИЯ ЦВЕТ—БЕЛЫЙ 120 VLIN 0,36 АТ 0: REM ПОСТРОЕНИЕ ИЗОБРАЖЕНИЯ ЛАБИРИНТА (СТРОКИ 120 — 440) 130 VLIN 0,16 АТ 4 140 VLIN 20,24 АТ 4 150 VLIN 28,32 АТ 4 160 VLIN 4,20 АТ 8 170 VLIN 0,8 АТ 12 180 VLIN 12,24 АТ 12 190 VLIN 28,32 АТ 12 200 VLIN 8,12 АТ 16 210 VLIN 16,28 АТ 16 220 VLIN 8,12 АТ 20 230 VLIN 28,32 АТ 20 240 VLIN 8,12 АТ 24 250 VLIN 16,32 АТ 24 260 VLIN 8,12 АТ 28 270 VLIN 16,32 АТ 28 280 VLIN 4,36 АТ 32 290 VLIN 0,36 АТ 36 300 HLIN 4,36 АТ 0 310 HLIN 16,32 АТ 4 320 HLIN 12,20 АТ 8 330 HLIN 24,28 АТ 8 340 HLIN 16,20 АТ 12 350 HLIN 24,28 АТ 12 360 HLIN 16,20 АТ 16 370 HLIN 24,28 АТ 16 380 HLIN 16,20 АТ 20 390 HLIN 8,12 АТ 24 400 HLIN 16,20 АТ 24 410 HLIN 12,16 АТ 28 420 HLIN 4,20 АТ 32 430 HLIN 24,28 АТ 32 440 HLIN 0,32 АТ 36 Если подобный текст уже сформирован на экране дисплея, необходимо записать его на хранение в память, чтобы впослед¬ ствии не набирать на клавиатуре заново. Работоспособность процедуры, подобной рассматриваемой, желательно сразу же проверить, выполнив ее пуск. При наличии процедуры форми¬ рования лабиринта, а также процедуры управления движением объекта на экране дисплея, полученной при решении задачи 2, можно считать, что разработано уже 90% текста программы игры ’Тонки по лабиринту”. Недостающие 10% необходимы для выполнения следующего:
Игры в интерактивное программирование 35 1. Программа должна проверять, не грозят ли текущее по¬ ложение и направление движения ’’автомобиля” столкновением со стеной лабиринта. Поскольку для изображения стен лаби¬ ринта используется белый, а для изображения проходов — чер¬ ный цвет, эту проверку легко осуществить; используя функцию SCRN следует просто проверять, не является ли цвет блока (элемента разложения) экрана с координатами, соответствую¬ щими новому положению автомобиля, белым. Так, оператор 620 IF SCRN (X, Y) > 0 THEN 700 проверяет цвет блока с координатами (X, Y) и, если его цвет отличен от черного (т, е. блок принадлежит одной из стен ла¬ биринта), передает управление оператору, расположенному в строке 700 программы. 2. В программе следует предусмотреть проверку, успешно ли ’’автомобиль” закончил гонку. При использовании предло¬ женного варианта лабиринта гонка считается успешно завершен¬ ной, если ’’автомобиль” достиг любой позиции поля с коорди¬ натой У=36. Такую проверку выполняет, например, оператор 630 IF Y = 36 THEN 800 При достижении ’’автомобилем” финиша (У=36)' управление передается оператору, находящемуся в строке 800 программы. 3. Движение ’’автомобиля” всегда должно начинаться из точки с координатами (2,0). В программе, предусматривающей использование клавиатуры ЭВМ, в момент старта ’’автомобиль” начинает двигаться вниз (SX=0, Sy=l). Читателю рекомендуется попытаться самостоятельно соста¬ вить программу ’’Гонки по лабиринту”, используя результаты решения задачи 2 и схему алгоритма на рис. 3.2. Для управления движением ’’автомобиля” пригодны как клавиатура ЭВМ, так и пульт управления игрой, В первом случае в процессе игры программа не должна допускать остановки ’’автомобиля”, так как очень легко управлять автомобилем, который можно на некоторое время остановить. В случае возникновения каких-либо затруднений при на¬ писании программы следует обращаться к помещенным ниже текстам ее двух вариантов (о использованием клавиатуры ЭВМ и применением пульта управления игрой соответственно). Оба варианта программы практически идентичны, за исключением строк 510—590. При использовании клавиатуры ЭВМ в момент старта автомобиль начинает движение вниз (строка 510 про¬ граммы). При применении пульта управления игрой движение вниз соответствует ситуации, когда ни одна кнопка на пульте Управления игрой не нажата, т. е. происходит автоматически. 2*
Начало Рис.
Игры в интерактивное программирование 37 Программа "Гонки по лабиринту" (использование клавиатуры ЭВМ) 100 GR : REM УСТАНОВКА ГРАФИЧЕСКОГО РЕЖИМА С НИЗКОЙ РАЗРЕШАЮЩЕЙ СПОСОБНОСТЬЮ ПО COLOR = 15: REM ИСПОЛЬЗУЕМЫЙ ДЛЯ ПОСТРОЕНИЯ ИЗОБРАЖЕНИЯ ЦВЕТ—БЕЛЫЙ 120 VLIN 0,36 АТ 0: REM ПОСТРОЕНИЕ ИЗОБРАЖЕНИЯ ЛАБИРИНТА (СТРОКИ 120 — 440) 130 VLIN 0,16 АТ 4 140 VLIN 20,24 АТ 4 150 VLIN 28,32 АТ 4 160 VLIN 4,20 АТ 8 170 VLIN 0,8 АТ 12 180 VLIN 12,24 АТ 12 190 VLIN 28,32 АТ 12 200 VLIN 8,12 АТ 16 210 VLIN 16,28 АТ 16 220 VLIN 8,12 АТ 20 230 VLIN 28,32 АТ 20 240 VLIN 8,12 АТ 24 250 VLIN 16,32 АТ 24 260 VLIN 8,12 АТ 28 270 VLIN 16,32 АТ 28 280 VLIN 4,36 АТ 32 290 VLIN 0,36 АТ 36 300 HLIN 4,36 АТ 0 310 HLIN 16,32 АТ 4 320 HLIN 12,20 АТ 8 330 HLIN 24,28 АТ 8 340 HLIN 16,20 АТ 12 350 HLIN 24,28 АТ 12 360 HLIN 16,20 АТ 16 370 HLIN 24,28 АТ 16 380 HLIN 16,20 АТ 20 390 HLIN 8,12 АТ 24 400 HLIN 16,20 АТ 24 410 HLIN 12,16 АТ 28 420 HLIN 4,20 АТ 32 430 HLIN 24,28 АТ 32 440 HLIN 0,32 АТ 36 500 X =2: Y = 0: REM УСТАНОВКА НАЧАЛЬНЫХ КООРДИНАТ ’’АВТОМОБИЛЯ” 510 SX = 0:SY = 1: REM СТАРТУЯ, ’’АВТОМОБИЛЬ” ДВИЖЕТСЯ ВНИЗ 520 PLOT X, Y: REM ФОРМИРОВАНИЕ ИЗОБРАЖЕНИЯ ’’АВТОМОБИЛЯ” НА ЭКРАНЕ 530 FOR DLY = 1 ТО 40: NEXT DLY: REM ЦИКЛ ЗАДЕРЖКИ 540 IF РЕЕК ( — 16384) < 128 THEN 600: REM ПРОВЕРКА, БЫЛА ЛИ НАЖАТА КАКАЯ-ЛИБО КЛАВИША 550 GET Х$ 560 IF XS = ”К” THEN SX = 1:SY = 0 570 IF XS = "J” THEN SX = — 1: SY = 0 580 IF Xs = ”M” THEN SY = 1: SX = 0 590 IF XS = ”1” THEN SY = — 1: SX = 0 600 COLOR = 0: PLOT X, Y: REM СТИРАНИЕ ИЗОБРАЖЕНИЯ В СТАРОЙ ПОЗИЦИИ
38 Глава 1 610 X - X + SX:Y = Y + SY: REM ВЫЧИСЛЕНИЕ КООРДИНАТ НОВОЙ ПОЗИЦИИ ’’АВТОМОБИЛЯ” 620 IF SCRN (X, Y) > 0 THEN 700: REM ПРОВЕРКА, HE ВРЕЗАЛСЯ ЛИ ’’АВТОМОБИЛЬ” В СТЕНУ 630 IF Y = 36 THEN 800: REM ПРОВЕРКА, УСПЕШНО ЛИ ’’АВТОМОБИЛЬ” ЗАКОНЧИЛ ГОНКУ 640 COLOR = 15: GOTO 520: REM УСТАНОВКА БЕЛОГО ЦВЕТА 700 VTAB (21): FOR К = 1 ТО 4: REM ПОЗИЦИОНИРОВАНИЕ КУРСОРА В ТЕКСТОВУЮ ОБЛАСТЬ ЭКРАНА 710 PRINT АВАРИЯ! *****”: NEXT К: GOTO 100: REM АВТОМОБИЛЬ ПОТЕРПЕЛ АВАРИЮ 800 VTAB (21): FOR К = 1 ТО 4: REM ПОЗИЦИОНИРОВАНИЕ КУРСОРА В ТЕКСТОВУЮ ОБЛАСТЬ ЭКРАНА 810 PRINT ”***** ПОЗДРАВЛЯЮ! s****”: NEXT К: REM ГОНКА УСПЕШНО ЗАВЕРШЕНА Программа "Гонки по лабиринту" (использование пульта управ¬ ления игрой) Строки 100—500, 600—630 и 700—810 этого варианта тек¬ ста программы точно совпадают с текстом предыдущего вари¬ анта и повторно не приводятся. Представленный ниже фрагмент программы заменяет строки 510—590 и 640 варианта программы с использованием клавиатуры ЭВМ. 510 PLOT X, Y: REM ФОРМИРОВАНИЕ ИЗОБРАЖЕНИЯ ’’АВТОМОБИЛЯ” НА ЭКРАНЕ 520 FOR DLY = 1 ТО 40: NEXT DLY: REM ЦИКЛ ЗАДЕРЖКИ 530 IF РЕЕК ( — 16 286) > 127 THEN 570: REM ПРОВЕРКА, НАЖАТА ЛИ КНОПКА 1 УПРАВЛЕНИЯ ИГРОЙ 540 IF РЕЕК ( — 16 287) > 127 THEN 570: REM ПРОВЕРКА, НАЖАТА ЛИ КНОПКА 0 УПРАВЛЕНИЯ ИГРОЙ 550 SX = 0: SY = 1: GOTO 600: REM ЕСЛИ ОБЕ КНОПКИ НЕ НАЖАТЫ, ’’АВТОМОБИЛЬ” ДВИЖЕТСЯ ВНИЗ 560 SX = 1: SY = 0: GOTO 600: REM ЕСЛИ НАЖАТА ТОЛЬКО КНОПКА 0, ’’АВТОМОБИЛЬ” ДВИЖЕТСЯ ВПРАВО 570 IF РЕЕК ( — 16 287) > 127 THEN 590: REM ПРОВЕРКА, НАЖАТА ЛИ КНОПКА 0 УПРАВЛЕНИЯ ИГРОЙ 580 SX = 1:SY = 0: GOTO 600: REM ЕСЛИ ТОЛЬКО КНОПКА 1 НАЖАТА, ’’АВТОМОБИЛЬ” ДВИЖЕТСЯ ВЛЕВО 590 SX = 0:SY = — 1: REM ЕСЛИ НАЖАТЫ ОБЕ КНОПКИ, ’’АВТОМОБИЛЬ” ДВИЖЕТСЯ ВВЕРХ 640 COLOR = 15: GOTO 510: REM ВОЗВРАТ К БЕЛОМУ ЦВЕТУ Рекомендации по улучшению первоначального варианта программы 1. Включить в текст программы операторы, вызывающие подачу звукового сигнала и мерцание изображения в случае аварии (автомобиль врезался в стену) или при успешном завер¬ шении гонки. 2. Добавить к тексту программы процедуру подсчета вре¬ мени, затрачиваемого играющим на прохождение автомобилем трассы гонки.
Игры в интерактивное программирование 39 3. Дополнить программу процедурой выбора играющим ско¬ рости автомобиля. (Для этого достаточно модифицировать про¬ должительность выполнения цикла задержки.) Задача 4. Генератор лабиринтов Назначение разрабатываемой программы: генерирование изоб¬ ражения лабиринта случайного вида. Специфические предпосылки успешной разработки: знаком¬ ство с методами получения случайных чисел и работой дисплея в графическом режиме с низкой разрешающей способностью. По¬ лучение и использование последовательностей случайных чисел рассмотрено в задаче 1, а возможности дисплея в графическом режиме с низкой разрешающей способностью — в задаче 2. Пояснения программисту: во многих играх для ЭВМ использу¬ ются лабиринты. Разрабатываемая программа создает лабирин¬ ты случайным образом. Она может быть использована как часть более сложных программ, реализующих игры на ЭВМ. В част¬ ности, разрабатываемая программа может быть включена в программу задачи 3 ’’Гонки по лабиринту” так, что в каждом новом сеансе игры будет использоваться новый лабиринт. Разрабатываемая программа имеет примерно тот же уро¬ вень сложности, что и программа задачи 3 ’’Гонки по лабиринту”. Единственной особенностью является использование функции INT, значение которой равно целой части аргумента. Многие игры, программируемые на ЭВМ, используют поле дисплея для построения изображения лабиринтов. Разрабаты¬ ваемая программа обеспечивает формирование лабиринтов слу¬ чайной конфигурации. Способ формирования лабиринта на экране дисплея в разрабатываемой программе такой же, как и в программе игры ’’Гонки по лабиринту”, причем дисплей исполь¬ зуется в графическом режиме с низкой разрешающей способ¬ ностью. Это обеспечивает простое решение проблемы объеди¬ нения возможностей обеих программ. Выполнение программы начинается с построения на экране Дисплея сетки вертикальных и горизонтальных полос (рис. 4.1). Заметим, что 10 вертикальных и 10 горизонтальных полос сетки лабиринта делят все поле экрана на 81 квадрат, в каждом из 9 рядов находится 9 квадратов. Разрабатываемая программа предназначена для получения изображения ’’канонического” лабиринта^ когда имеется один и только один проход между каждыми двумя соседними квад¬ ратами. (Лабиринт, используемый в программе ’’Гонки по ла¬
40 Глава 1 биринту”, не является каноническим 1}.)' Лабиринт строится путем удаления барьеров между смежными квадратами исход¬ ной сетки. В результате на экране получается изображение 0 4 8 12 16 20 24 26 32 36 '□□□□□□□□□ ;□□□□□□□□□ □□□□□□□□□ □□□□□□□□□ 36 Рис. 4.1. Рис. 4.2. Рис. 4.3. лабиринта, подобное представленному на рис. 4.2. Заметим, что у лабиринта нет ни входа, ни выхода, необходимость в наличии которых вполне очевидна. До начала работы над упомянутой программой автор не знал о су¬ ществовании такого термина, как ’’канонический” лабиринт,
Игры в интерактивное программирование 41 Для большей наглядности процесса формирования лабиринта поместим точку в центр каждого квадрата и соединим между собой отрезками прямых линий такие точки, барьеры между которыми удалены. Полученные таким способом линии указы¬ вают возможные пути перемещения по лабиринту от одного квадрата к другому (рис. 4.3). Изображение путей перемещения называют ’’деревом” лабиринта. Отметим, что ветви дерева достигают центра каждого исходного квадрата. Теперь можно говорить о том, что алгоритм построения ла¬ биринта по существу описывает процесс роста дерева лабиринта. Сначала случайным образом выбирается квадрат, в который помещается ’’саженец”. Затем начинается рост дерева произ¬ вольным образом до тех пор, пока его ветви не проникнут во все квадраты. Всякий раз, когда ветвь дерева проникает в новый квадрат, она пересекает барьер, разделяющий два соседних квадрата: старый и новый,— этот барьер подлежит удалению. В результате получается лабиринт. Напомним, что построение лабиринта начинается с создания сетки вертикальных и горизонтальных полос, которые делят все поле экрана дисплея на 81 квадрат; всего в поле 9 рядов, в каж¬ дом ряду 9 квадратов. Для хранения информации о том, принад¬ лежат или нет эти квадраты той или иной ветви дерева, исполь¬ зуется массив, резервируемый оператором DIM /WZ (9,9). Значе¬ ние элемента M.Z (/, </) этого массива равно +1, если J-й квад¬ рат в 1-м ряду не принадлежит ни одной ветви дерева строя¬ щегося лабиринта, и равно —1 в противном случае. Построение дерева начнем с произвольно выбираемого квад¬ рата (куда помещается ’’саженец” будущего дерева). На каждом шаге построения лабиринта один из барьеров удаляется и один из квадратов присоединяется к ’’растущему” дереву. После удаления 80 барьеров все квадраты (81) оказываются присоеди¬ ненными к дереву лабиринта. На рис. 4.4 представлена схема алгоритма построения ла¬ биринта описанным способом. Рассмотрим ее подробнее. Блок ®: Назначение этого шага очевидно. Блок Случайный выбор координат квадрата для разме¬ щения ’’саженца” осуществляется присвоением переменным I и J произвольно выбираемых значений 1 <7^9 и 1^J^9. После этого соответствующему элементу массива A4Z(7, J) присваи¬ вается значение— 1. По мере построения лабиринта присоеди¬ нение очередного квадрата к строящемуся дереву фиксируется присвоением соответствующему элементу массива MZ значе¬ ния — 1. Для успешного решения задачи необходимо иметь возмож¬ ность выбора случайных целых чисел в пределах 1—9. Функция RND позволяет получать случайные числа вещественного типа.
42 Глава 1 Начало Рис, 4,4<
Игры в интерактивное программирование 43 лежащие в интервале 0—1, например 0,1362 или 0,7131. Ио пользуя оператор R = 9* RND(l) можно присваивать переменной R случайные значения вещест¬ венных чисел, лежащие в интервале 0—9, т. е. 0^/?<9. Однако в рассматриваемой задаче требуется случайный выбор целого числа, принадлежащего этому интервалу. Это можно было бы сделать, отбрасывая дробную часть любого положительного вещественного числа. Программное обеспечение ’’Applesoft” предоставляет в распоряжение программирующего на языке Бейсик функцию INT, решающую именно такую задачу, На¬ пример, INT (2.12)=2, a INT(.98)=0, Поэтому с помощью опе¬ ратора R = INT (9 * RND (1)) переменной R можно присвоить следующие целочисленные значения: 0, если 0^9* RND (1) < 1 1, если 1<9^ RND (1) < 2 ■ 8, если 8 < 9 RND (1) < 9 Используя оператор R = 1 + INT (9 * RND(l)) можно присваивать той же переменной случайно выбираемое значение 1, 2, 3, ... или 9. Блок ®: С помощью средств машинной графики в режиме низкой разрешающей способности формируются 10 вертикаль¬ ных полос (в точках с координатами Х=0, 4, 8, , . 36) и 10 горизонтальных полое (в точках с координатами У=0, 4, 8, . . 36). Отметим, что количество как горизонтальных, так и вертикальных линий 10, а не 9. Блок ®: С этого блока схемы алгоритма начинается наиболее интересная часть программы. Строго говоря, блоки ®, ® и ® должны быть представлены на схеме алгоритма в двух вариан¬ тах: для описания процедуры удаления горизонтального барь¬ ера и процедуры удаления вертикального барьера при форми¬ ровании лабиринта из исходной сетки. На первом шаге соответствующей части программы случай¬ ным образом выбирается вертикальный или горизонтальный барьер, подлежащий удалению. Это выполняет оператор 300 IF RND (1) <. 5 THEN 410: REM ЕСЛИ ЗНАЧЕНИЕ ФУНКЦИИ RND МЕНЬШЕ ЧЕМ 0,5, ТО УДАЛЯЕТСЯ ВЕРТИКАЛЬНЫЙ ИЛИ ГОРИЗОНТАЛЬНЫЙ БАРЬЕР
44 Глава 1 В тексте программы решения рассматриваемой задачи, при¬ водимой ниже, строки 310—370 содержат процедуру удаления вертикального барьера, а строки 410—470 — процедуру уда¬ ления горизонтального барьера. Рассмотрим процедуру удаления вертикального барьера (строки 310—370). Прежде всего необходимо выбрать верти¬ кальный барьер из числа возможных. Заметим, что в каждом ряду квадратов имеется ряд вертикальных барьеров, число барьеров в каждом таком ряду равно 8. Поэтому требуется выбрать случайное целое число, принадлежащее диапазону 1—8. Выбранное число определит номер удаляемого в данном ряду барьера. Эту задачу решает следующий оператор: 310 X = 1 + INT (8 * RND(l)) Число рядов вертикальных барьеров равно 9. Поэтому на следующем шаге необходимо выбрать номер ряда, в котором подлежит удалению выбранный ранее барьер. Этот номер — случайное целое число, принадлежащее диапазону 1—9. Выбор такого числа осуществляет оператор 320 Y = 1 + INT (9 * RND (1)) Таким образом, значения переменных X и Y определяют координаты вертикального барьера, подлежащего удалению. Так, если Х=4, а У=7, то удаляется барьер, выделенный чер¬ ным цветом на рис. 4.5. Блок ®: На этом этапе требуется определить, отделяет ли выбранный для удаления барьер квадрат, уже принадлежащий дереву лабиринта, от квадрата, ему не принадлежащего. Если квадрат еще не входит в состав лабиринта, то указанный барьер удаляется и этот квадрат присоединяется к лабиринту. В про¬ тивном случае требуется выбрать другой барьер, подлежащий удалению. Заметим, что квадрат слева от барьера (X, Y) имеет коор¬ динаты (X, У), а квадрат справа от этого барьера — коорди¬ наты (Х+1, У). Если оба значения элементов массива MZ(Xt Y) и A4Z(X+1, У) равны +1 (т. е. оба квадрата принадлежат ла¬ биринту) или —1 (т. е. эти квадраты лабиринту не принадле¬ жат), то управление в программе передается оператору с но¬ мером 300, осуществляющему выбор другого барьера, подле¬ жащего удалению. Если же одно из этих значений равно +1, а другое —1, то выбранный барьер удаляется. Указанную про¬ верку выполняет следующий оператор: 330 IF MZ(X, Y) * MZ(X + 1,Y) > 0 THEN 300 Блок ®: Предыдущие операции определяют действия на данном этапе: ранее не принадлежавший лабиринту квадрат
Игры в интерактивное программирование 45 помечается как входящий в состав лабиринта, а изображение соответствующего барьера удаляется с экрана дисплея (сти¬ рается). Эти функции выполняют операторы 340 MZ(X, Y) = — 1: MZ(X + 1, Y) = — 1 350 VLIN 4 * Y — 3,4 * Y — 1 AT 4 * X Примечание 1. С помощью оператора в строке 340 проще пометить принадлежащими лабиринту оба квадрата, чем пред¬ варительно определять, какой из них не принадлежит еще лабиринту, а затем помечать только его, О 4 8 12 16 20 24 28 32 36 О 4 8 12 16 20 24 28 32 36 □OOOQOOOD □®о □□□□□□□ DC □□□□□□□ □«□□□□□□□ □с□□□□□□□ DD □□□□□□□ □С□□□□□□□ Рис. 4.5. Примечание 2. При удалении изображения барьера с помо¬ щью оператора в строке 350 подразумевается, что черный цвет был установлен ранее (посредством оператора вида COLOR =0). Блок ®: Удаление 80 барьеров осуществляется посредством Цикла, реализуемого в программе на языке Бейсик конструк¬ цией вида FOR , . . NEXT. Читателю рекомендуется составить программу построения лабиринтов самостоятельно. При необходимости можно обра¬ титься к тексту программы, приводимому ниже.
46 100 НО 120 130 140 150 160 170 180 200 210 220 230 240 250 290 300 310 320 330 340 350 360 370 410 420 430 440 Глава 1 REM ГЕНЕРАТОР ЛАБИРИНТОВ REM DIM MZ (9,9): REM РЕЗЕРВИРОВАНИЕ ПАМЯТИ ДЛЯ ХРАНЕНИЯ ИНФОРМАЦИИ О КВАДРАТАХ С КООРДИНАТАМИ (I. J) FOR I = 1 ТО 9: FOR J = 1 ТО 9 MZ(I, J) = 1: REM ПЕРВОНАЧАЛЬНО ЗНАЧЕНИЕ КАЖДОГО ЭЛЕМЕНТА МАССИВА РАВНО 1, Т. Е. СООТВЕТСТВУЮЩИЙ КВАДРАТ НЕ ПРИНАДЛЕЖИТ ДЕРЕВУ ЛАБИРИНТА NEXT J: NEXT I I = 1 + INT (9 * RND (1)): REM ВЫБОР ПРОИЗВОЛЬНОГО КВАДРАТА ДЛЯ ’’САЖЕНЦА” ЛАБИРИНТА J = 1 + INT (9 * RND (1)): REM ПРИСВОЕНИЕ ЭЛЕМЕНТУ МАССИВА MZ, СООТВЕТСТВУЮЩЕМУ ВЫБРАННОМУ КВАДРАТУ, ЗНАЧЕНИЯ —1 MZ (I, J) = — 1 GR : COLOR = 15: REM УСТАНОВКА ГРАФИЧЕСКОГО РЕЖИМА С НИЗКОЙ РАЗРЕШАЮЩЕЙ СПОСОБНОСТЬЮ, ЦВЕТ —БЕЛЫЙ FOR X = 0 ТО 36 STEP 4: REM ПОСТРОЕНИЕ СЕТКИ ДЛЯ ЛАБИРИНТА HLIN 0,36 AT X VLIN 0,36 AT X NEXT X COLOR = 0: REM УСТАНОВКА ЧЕРНОГО ЦВЕТА ДЛЯ УДАЛЕНИЯ БАРЬЕРОВ FOR СТ = 1 ТО 80: REM ПРОИЗВОДИТСЯ СТИРАНИЕ 80 БАРЬЕРОВ ДЛЯ ОДНОЗНАЧНОГО СОЕДИНЕНИЯ ВСЕХ КВАДРАТОВ IF RND (1) < .5 THEN 410: REM ЕСЛИ ЗНАЧЕНИЕ ФУНКЦИИ RND МЕНЬШЕ ЧЕМ 0.5, ТО УДАЛЯЕТСЯ ГОРИЗОНТАЛЬНЫЙ БАРЬЕР X = 1 + INT (8 * RND (1)) : REM ПРОЦЕДУРА УДАЛЕНИЯ ВЕРТИКАЛЬНОГО БАРЬЕРА Y = 1 + INT (9 * RND (1)) : REM ВЫБОР БАРЬЕРА В КАЧЕСТВЕ ’’КАНДИДАТА” НА УДАЛЕНИЕ IF MZ(X,Y) * MZ(X + 1,Y) > 0 THEN 300: REM УДАЛЕНИЕ БАРЬЕРА, ЕСЛИ ЭТО ПРИВОДИТ К ДОБАВЛЕНИЮ НОВОГО КВАДРАТА К ЛАБИРИНТУ MZ(X,Y) =— 1::MZ(X + 1,Y) =— 1: REM НОВЫЙ КВАДРАТ ПОМЕЧАЕТСЯ КАК ПРИНАДЛЕЖАЩИЙ ДЕРЕВУ ЛАБИРИНТА VLIN 4 * Y — 3,4 * Y — 1 АТ 4 * X: REM СТИРАНИЕ ИЗОБРАЖЕНИЯ БАРЬЕРА NEXT СТ: REM ВОЗВРАТ К ПОВТОРЕНИЮ ВЫПОЛНЕНИЯ ЦИКЛА END X = 1 + INT (9 * RND (1)): REM ПРОЦЕДУРА УДАЛЕНИЯ ГОРИЗОНТАЛЬНОГО БАРЬЕРА - Y = 1 + INT (9 * RND (1)): REM ВЫБОР БАРЬЕРА В КАЧЕСТВЕ ’’КАНДИДАТА” НА УДАЛЕНИЕ IF MZ(X,Y) * MZ(X,Y + 1) > 0 THEN 300: REM УДАЛЕНИЕ БАРЬЕРА, ЕСЛИ ЭТО ПРИВОДИТ К ДОБАВЛЕНИЮ НОВОГО КВАДРАТА К ЛАБИРИНТУ MZ(X,Y) =— 1:MZ(X,Y + I) == — 1: REM НОВЫЙ КВАДРАТ ПОМЕЧАЕТСЯ КАК ПРИНАДЛЕЖАЩИЙ ДЕРЕВУ ЛАБИРИНТА
Игры в интерактивное программирование 47 450 HLIN 4 * X — 3,4 * X — 1 АТ 4 * Y: REM СТИРАНИЕ БАРЬЕРА 460 NEXT СТ 470 END Дополнителъное задание Попытайтесь включить написанную программу в программу задачи 3 ’’Гонки по лабиринту”. В этом случае игра становится интереснее, поскольку ’’трасса” гонок играющему заранее не известна. Задача 5. Собачьи бега Назначение разрабатываемой программы: использование в качестве игры, подобной ’’Гонкам по лабиринту”. (Играющий управляет бегом собаки по дорожке, успех зависит от быстроты его реакции и точности координации движений.) Специфические предпосылки успешной разработки: знаком¬ ство с решением задачи 2. Пояснения программисту: для решения поставленной задачи не требуется использование каких-либо новых приемов техники программирования, однако разрабатываемая программа сложнее программы четырех предыдущих задач. Представим игрока, сидящего перед дисплеем, на экране которого линия старта, беговая дорожка и гончая собака за¬ мерла в готовности к рывку вперед (рис. 5.1). Вдруг раздается звуковой сигнал начала забега. Играющий нажимает клавишу ”К”. Собака рывком бросается вперед, распластав свои длинные лапы (рис. 5.2), Теперь следует нажать клавишу ”J”. Сильные мышцы сокращаются, готовые к новому рывку вперед, а тело собаки устремляется к линии финиша (рис. 5.3). Нажимая как можно быстрее попеременно клавиши ”К” и ”J”, играющий управляет бегом собаки к линии финиша, Однако необходимо быть внимательным: при нажатии на любую другую клавишу, кроме ”К” или ”J”, либо на одну из этих клавиш дважды собака спотыкается, падает на дорожку и проигрывает забег (рис, 5.4). Если играющему удастся заставить собаку пробежать всю дистанцию до финиша без падения (а это гораздо труднее, чем кажется на первый взгляд), на экране дисплея появится сооб¬ щение о затраченном времени, Удастся ли кому-нибудь заста¬ вить собаку преодолеть дистанцию быстрее 4 с? Разработку программы такой игры начнем g построения схемы алгоритма., Предполагается, что на беговой дорожке собака может быть в трех состояниях: готовности к рывку впе¬ ред, бега или падения (рис. 5.5). Если читатель рисует лучше
48 Глаза 1 q г г J L Рис ZL . 5.1. □ Рис :. 5.2. Рис. 5.4. Готовность к рывку вперед (Р) Падение (F) □ 1 р 1 НР ч . —■ 1 Е J L □Г Рис. 5.5,
Игры в интерактивное программирование 49 Рис. 5.6.
50 Глава I автора и обладает более богатым воображением, то при желании изобразить кенгуру или жирафа ему необходимо тщательно продумать формы представления трех состояний животного на дистанции. Обратимся теперь к алгоритму на рис, 5.6. Продвигаясь по нему шаг за шагом, можно преобразовать предписываемые им действия в соответствующие операторы программы на языке Бейсик. Читателю рекомендуется именно так и поступать, прежде чем знакомиться с текстом приводимой ниже программы, составленной автором. Первый блок алгоритма имеет вид: Построение изображения беговой дорожки; формиро¬ вание изображения собаки (Р) на старте; показание секундомера: 7=0 На экране экрана рис. 5.7 представлено изображение, возникающее на дисплея перед началом забега. У правого края поля линия финиша обозначена серым цветом (COLOR = 1), 25 П 39 Рис. 5.7. остальные линии обозначены белым цветом (COLOR = 15). Фраг¬ мент программы, соответствующий этому блоку схемы алго¬ ритма, имеет следующий вид: 100 GR : REM ГРАФИЧЕСКИЙ РЕЖИМ С НИЗКОЙ РАЗРЕШАЮЩЕЙ СПОСОБНОСТЬЮ 110 НОМЕ 120 G$ = ” REM СИМВОЛ CTRL-G ДЛЯ ПОДАЧИ ЗВУКОВОГО СИГНАЛА 130 COLOR = 15: REM ЦВЕТ БЕЛЫЙ 140 PLOT 0,25: REM ФОРМИРОВАНИЕ ИЗОБРАЖЕНИЯ СОБАКИ У ЛИНИИ СТАРТА 150 VLIN 26,29 АТ 1 160 HLIN 2,4 АТ 26 170 HLIN 2,4 АТ 27 180 VLIN 24,29 АТ 5 190 VLIN 25,26 АТ 6 200 VLIN 25,26 АТ 7 210 А = 0: REM УСТАНОВКА КООРДИНАТЫ НАЧАЛЬНОГО ПОЛОЖЕНИЯ СОБАКИ
Игры в интерактивное программирование 51 220 230 240 250 260 Т = 0: REM УСТАНОВКА НУЛЕВОГО ПОКАЗАНИЯ СЕКУНДОМЕРА HLIN 0,39 АТ 30 COLOR = 1: REM ЦВЕТ - СЕРЫЙ ДЛЯ ИЗОБРАЖЕНИЯ ЛИНИИ ФИНИША VLIN 25,29 АТ 39: REM ПОСТРОЕНИЕ ИЗОБРАЖЕНИЯ ЛИНИИ ФИНИША COLOR = 15: REM ВОЗВРАТ К БЕЛОМУ ЦВЕТУ Содержимое строки 120 программы требует пояснения. Ввод с клавиатуры ЭВМ управляющего символа CTRL-G ото¬ бражения на экране не находит. Многие программисты, поме¬ щают строку, подобную строке Не отображаемый на экране символ CTRL-G I 120 GS = ” ”:• REM СИМВОЛ CTRL-G ДЛЯ ПОДАЧИ ЗВУКОВОГО СИГНАЛА в начале программы. Выполнение последующего оператора программы PRINT G$ вызывает подачу звукового сигнала. Это же действие можно выполнить, задавая подачу звукового сигнала менее наглядным способом: Не отображаемый на экране символ CTRL-G I PRINT ” ” Для хранения значения координаты текущего положения собаки используется переменная А. Перед началом очередного забега (старта) полагают А=0 (строка 210). Выбор случайного момента стар - х та; сообщение „ МАРШ!* Этот фрагмент программы во многОаМ подобен первым несколь¬ ким строкам игры ’’Быстрее, Макс!”. Однако имеются и отличия. Приводимый ниже фрагмент дополнен проверкой (строка 280)f имел ли место ’’фальстарт” (т. е. случай, когда пользователь нажимает клавишу до подачи стартового сигнала). Если ’’фаль¬ старт” имеет место, выполняются операторы в строках 800— 830, обеспечивающие подачу звукового сигнала, вывод сооб¬ щения ’’ФАЛЬСТАРТ” и переход к новому сеансу игры.
52 Глава 1 270 FOR DLY = 1 TO 25: REM ЦИКЛ ЗАДЕРЖКИ 280 IF PEEK (— 16 384) > 127 THEN 800: REM ПРОВЕРКА, ИМЕЛ ЛИ МЕСТО "ФАЛЬСТАРТ” 290 NEXT DLY 300 IF RND (1) < .9 THEN 270: REM ВЫБОР СЛУЧАЙНОГО МОМЕНТА ВРЕМЕНИ ДЛЯ СТАРТА 310 PRINT G$; ”МАРШ!” 800 PRINT G$; ФАЛЬСТАРТ 810 PRINT "ДЛЯ ПРОДОЛЖЕНИЯ НАЖМИТЕ ЛЮБУЮ КЛАВИШУ” 820 GET W$: GET W$: REM ПАУЗА ПЕРЕД НОВЫМ СЕАНСОМ ИГРЫ 830 GOTO 100 Эта часть алгоритма достаточно проста для программиро¬ вания. 320 IF РЕЕК ( — 16 384) < 128 THEN Т = Т + 1: GOTO 320: REM ОЖИДАНИЕ НАЖАТИЯ ЛЮБОЙ КЛАВИШИ 330 GET Х$: REM ПРИСВОЕНИЕ ПЕРЕМЕННОЙ Х$ ЗНАЧЕНИЯ СИМВОЛА НАЖАТОЙ КЛАВИШИ 340 1F Х$ < > "К” THEN 670: REM ПРИ НАЖАТИИ НЕДОПУСТИМОЙ КЛАВИШИ СОБАКА СПОТЫКАЕТСЯ JL Перемещение изо¬ бражения собаки (S) на один шаг вправо
Игры в интерактивное программирование 53 Чтобы лучше понять, как составляется этот фрагмент про¬ граммы, необходимо последовательно сформировать на экране изображения собаки, готовой к рывку вперед (Р), и бегущей собаки (S), сдвинутой на один шаг х) вправо, как показано на рис. 5.8. Блоки поля экрана, заполненные точками относятся к старому изображению собаки и подлежат стиранию. Заштрихованные блоки относятся к новому изображению собаки и подлежат воспроизведению на экране. Таким образом, можно переместить изображение собаки на один шаг вправо, одновременно изменив ее состояние ”Р” на ”S”. Воспользуемся для этого следующим фрагментом программы: 350 PLOT А + 1,25: REM ФОРМИРОВАНИЕ ИЗОБРАЖЕНИЯ РАСПЛАСТАВШЕЙСЯ В БЕГЕ СОБАКИ 360 PLOT А + 2,28 370 VLIN 24,28 АТ А + 6 380 PLOT А + 7,29 390 VLIN 25,26 АТ А + 8 400 COLOR = 0: REM УСТАНОВКА ЧЕРНОГО ЦВЕТА ДЛЯ СТИРАНИЯ ЭЛЕМЕНТОВ ИЗОБРАЖЕНИЯ 410 PLOT А,25 420 VLIN 26,28 АТ А + 1 430 VLIN 24,25 АТ А + 5 440 VLIN 28,29 АТ А + 5 450 COLOR = 15: REM ВОЗВРАТ К БЕЛОМУ ЦВЕТУ 460 А = А + 1: REM ПЕРЕМЕЩЕНИЕ ИЗОБРАЖЕНИЯ СОБАКИ НА ОДИН ШАГ ВПРАВО Отметим, что переменная А используется для хранения зна¬ чения координаты левого края изображения собаки. При фор¬ мировании изображения собаки в новой позиции можно посту- Под шагом следует понимать блоки, из которых на экране формирует* сяупобое изображение при работе дисплея в графическом режиме с низ¬ кой разрешающей способностью,— Прим, ред9
54 Глава 1 пать не так, как описано выше, а именно: стирать полностью старое изображение собаки, а затем формировать новое. Чита¬ телю рекомендуется составить соответствующий фрагмент про¬ граммы. При этом может возникнуть мерцание изображения, однако программа получается более простой. Функционирование части алгоритма вполне очевидно и уже рассматривалось выше. 470 IF РЕЕК ( — 16 384) < 128 THEN Т = Т + 1: GOTO 470: REM ОЖИДАНИЕ НАЖАТИЯ ЛЮБОЙ КЛАВИШИ 480 GET Х$: REM ИЗВЛЕЧЕНИЕ ЗНАЧЕНИЯ НАЖАТОЙ КЛАВИШИ 490 IF Х$ < > ”J” THEN 670: REM ПРИ НАЖАТИИ НЕДОПУСТИМОЙ КЛАВИШИ СОБАКА СПОТЫКАЕТСЯ I Перемещение изображения собаки (Р) На орин шаг вправо I В этом фрагменте программы необходимо преобразовать изображение бегущей собаки (S) в изображение собаки, готовой к рывку вперед (Р), но сдвинутой на один шаг вправо. На рис. 5.9, аналогичном рис. 5.8, приведены оба изображения собаки. Как и в предыдущем случае, заполненные точками части рисунка отмечают блоки, подлежащие удалению, а заштрихованные —• добавляемые к изображению. Переменная А используется для
Игры в интерактивное программирование 55 хранения значения координаты левой стороны изображения собаки. 500 PLOT А + 1,25: REM ВЫВОД ИЗОБРАЖЕНИЯ СОБАКИ ПЕРЕД РЫВКОМ ВПЕРЕД 510 VLIN 28,29 АТ А + 2 520 PLOT А + 6,24 530 VLIN 27,28 АТ А + 6 540 VLIN 25,26 АТ А + 8 550 COLOR = 0: REM УСТАНОВКА ЧЕРНОГО ЦВЕТА ДЛЯ СТИРАНИЯ ЭЛЕМЕНТОВ ИЗОБРАЖЕНИЯ 560 VLIN 25,29 АТ А 570 VLIN 26,28 АТ А + 1 580 VLIN 24,25 АТ А + 5 590 PLOT А + 5,28 600 COLOR = 15: REM ВОЗВРАТ К БЕЛОМУ ЦВЕТУ 610 А = А + 1: REM ПЕРЕМЕЩЕНИЕ ИЗОБРАЖЕНИЯ СОБАКИ НА ОДИН ШАГ ВПРАВО Так как длина изображения собаки составляет 8 блоков, то, когда нос собаки достигает финиша (Х=39), левый край ее изображения совпадает с координатой Х=32. 620 IF А < 32 THEN 320: REM ЕСЛИ ФИНИШ НЕ ДОСТИГНУТ, ИГРА ПРОДОЛЖАЕТСЯ 630 PRINT GS;”** ДИСТАНЦИЯ ПРОЙДЕНА ЗА ”;Т / 25;” СЕКУНД” 640 PRINT ’’ДЛЯ ПРОДОЛЖЕНИЯ ИГРЫ НАЖМИТЕ ЛЮБУЮ КЛАВИШУ” 650 GET W$: GET W$: REM ПАУЗА ПЕРЕД НОВЫМ СЕАНСОМ ИГРЫ 660 GOTO 100: REM ИГРА ВОЗОБНОВЛЯЕТСЯ ПРИ НАЖАТИИ ЛЮБОЙ КЛАВИШИ На ЭВМ, имевшейся в распоряжении автора, значение Т/25 грубо соответствовало времени в секундах. Оператор GET в строке 650 заставляет ЭВМ ожидать нажа¬ тия клавиши до начала новой игры (нового забега). В программе автора использованы два оператора GET подряд, поскольку играющие в азарте часто нажимают лишний раз на клавишу. Если бы использовался лишь один оператор GET, то при на¬ жатии на клавишу еще раз немедленно начинался бы новый забег (строки 820 и 780).
56 Глава 1 Вывод сообщения „ПАДЕНИЕ! i вывод изображения собаки F; новый забег В этой завершающей части программы стирается старое изображение собаки и формируется новое (F). 6?Э PRINT G$;’’ПАДЕНИЕ!” 680 COLOR = 0: REM УСТАНОВКА ЧЕРНОГО ЦВЕТА ДЛЯ СТИРАНИЯ СТАРОГО ИЗОБРАЖЕНИЯ СОБАКИ 690 FOR Y = 24 ТО 29: HLIN А,А + 7 AT Y: NEXT Y 700 COLOR = 15: REM ВОЗВРАТ К БЕЛОМУ ЦВЕТУ 710 PLOT А 4-5,25 720 HLIN А 4- 5,А 4- 7 АТ 26 730 HLIN А,А 4- 7 АТ 27 740 HLIN А + 1,А 4- 5 АТ 28 750 HLIN А,А 4- 1 АТ 29 760 HLIN А 4- 5,А 4- 6 АТ 29 770 PRINT ’’ДЛЯ НАЧАЛА НОВОГО СЕАНСА ИГРЫ НАЖМИТЕ ЛЮБУЮ КЛАВИШУ” 780 GET WS: GET W$: REM ПАУЗА ПЕРЕД НАЧАЛОМ НОВОГО ТУРА ИГРЫ 790 GOTO 100: REM НОВЫЙ СЕАНС ИГРЫ НАЧИНАЕТСЯ СРАЗУ ПОСЛЕ НАЖАТИЯ КЛАВИШИ Рекомендации по улучшению первоначального варианта программы 1. Включить в текст программы вывод дополнительных сообщений, комментирующих действия играющего. 2. Оштрафовать игрока на 1 с, если собака споткнулась, и продолжать забег. 3. Игрокам, знающим правила пользования пультом управ¬ ления игрой, можно рекомендовать модифицировать программу для игры вдвоем, когда каждый игрок управляет движением ’’своей” собаки с помощью своего пульта управления игрой. Задача 6. Пилотирование самолета под огнем зенитной артиллерии Назначение разрабатываемой программы: использование в качестве игры, требующей определенной ловкости. (Играющий выполняет функции пилота, пытающегося прорваться сквозь огонь зенитной артиллерии.) Специфические предпосылки успешной разработки: знаком¬ ство с решением задачи 1.
Игры в интерактивное программирование 57 Пояснения программисту: разрабатывается небольшая, но весьма замысловатая программа, использующая подпрограмму на машинном языке для воспроизведения на экране дисплея ин¬ формации в режиме ’’рулон”. ЭВМ обладает весьма большими возможностями. Однако при выполнении программы на языке Бейсик значительная часть ресурсов машины расходуется на преобразование про¬ граммы, написанной на этом языке, в соответствующую после¬ довательность команд машинного языка. Бейсик относится к так называемым интерпретируемым ~ такое преобразование необходимо оператора Бейсик-программы. • А языкам. Это означает, при выполнении ЧТО каждого * А А А А А • А 3 А А А А А А А А 8 S 3 А А А А А А X А А А А х А А А А А А А А А А А А А А А А А Рис. 6.1. А А Программы сложных игр поглощают значительную часть вычислительной мощности ЭВМ, поэтому программируют по¬ добные игры, хотя бы частично, на машинном языке. Описание такого языка могло бы явиться предметом отдельной книги. Здесь же мы только воспользуемся процедурами, написанными на машинном языке, что позволит существенно повысить ско¬ рость выполнения программы, остальную часть программы составим на языке Бейсик. Требуемые в данном случае проце¬ дуры на машинном языке имеются в составе программного
58 Глава 1 обеспечения ЭВМ, задача заключается лишь в их использова¬ нии. Начнем рассмотрение с описания игры. Играющий выпол¬ няет функции пилота самолета, пролетающего над вражеской территорией. Зенитная артиллерия противника ведет непрерыв¬ ный заградительный огонь. Задача играющего — провести са¬ молет невредимым сквозь огонь вражеских зенитных батарей. Управление движением самолета осуществляется с помощью клавиатуры ЭВМ. Самолет может двигаться вправо и влево вдоль верхнего края поля экрана. Нажатие клавиши ”L” вызы¬ вает движение самолета вправо, нажатие клавиши ”J” — дви¬ жение влево. Нажатие другой клавиши (обычно ”К”) прекра¬ щает движение самолета. В процессе игры изображение на экране выглядит подобно рис. 6.1. Выпущенные вражескими батареями снаряды пред¬ ставлены символами ”Л”, самолет—символом ’’звездочка” (*), а знаки двоеточия (:) используются для ограничения игрового поля. Снаряды заградительного огня перемещаются по экрану снизу вверх непрерывно, а самолет, маневрируя вправо и влево, пытается избежать прямого попадания в него. Для успешного составления этой программы необходимо отчетливо представлять себе работу дисплея в режиме воспро¬ изведения текста. Каждый символ, воспроизводимый на экране дисплея, представляется внутри ЭВМ некоторым числом. На¬ пример: Символ Число * 170 : 186 Л 222 Пробел 160 Руководства, прилагаемые к ЭВМ, содержат полный перечень воспроизводимых на экране символов и их числовые эквивален¬ ты. Оперативная память ЭВМ с адресами 1024—2047 представ¬ ляет собой ’’карту”, отображающую состояние экрана дисплея в режиме воспроизведения текста. Каждый байт п этой области памяти соответствует одной позиции на экране дисплея. На¬ пример: Адрес основной памяти Позиция на экране дисплея 1024—1063 Строка 1 позиции 1—40 2000—2039 Строка 24 позиции 1—40 Х) Легко заметить, что «карта» насчитывает 1024 байт, тогда как на экране имеется всего 24X40=960 позиций. Фактически, 64 байт в области основной памяти, именуемой «картой» экрана, при работе дисплея в ре¬ жиме воспроизведения текста не используются.
Игры в интерактивное программирование 59 Справочное руководство по ЭВМ содержит таблицу, описываю¬ щую соответствие каждого байта этой ’’карты” позициям на экране дисплея. Специальные схемы ЭВМ формируют по данным ’’карты”' видеосигнал для воспроизведения символов в соответствующих позициях на экране дисплея. Отобразить символ в некоторой позиции экрана можно, помещая код этого символа в соответствующий байт ’’карты” при помощи команды РОКЕ. Пусть, например, требуется вос¬ произвести символ ’’звездочка” (*) в 24-й позиции первой строки экрана дисплея. Код этого символа равен 170, а указанной позиции экрана дисплея соответствует байт с адресом 1047. В этом случае команда РОКЕ 1047, осуществляет необходимые действия. Если этой команде предшествует команда НОМЕ, то перед отображением символа выполняется очистка экрана от содержащейся на нем информации. Начинающему програм¬ мисту небесполезен опыт в получении указанным способом изображения различных символов в разных позициях экрана дисплея. Так, чтобы заполнить верхнюю и нижнюю строки экрана символом ”Д”, можно воспользоваться следующей про¬ граммой: 100 REM *** ДЕМОНСТРАЦИЯ РАБОТЫ С ’’КАРТОЙ” ЭКРАНА ДИСПЛЕЯ *** 110 REM *** В РЕЖИМЕ ВОСПРОИЗВЕДЕНИЯ ТЕКСТА *** 120 НОМЕ : REM ОЧИСТКА ЭКРАНА 130 FOR I = 1 ТО 40 140 РОКЕ 1023 4- 1,222: REM ВОСПРОИЗВЕДЕНИЕ СИМВОЛА ” /ч ” ВО ВСЕХ ПОЗИЦИЯХ ПЕРВОЙ СТРОКИ ЭКРАНА 150 РОКЕ 1999 + 1,222: REM ВОСПРОИЗВЕДЕНИЕ СИМВОЛА ” й ВО ВСЕХ ПОЗИЦИЯХ ПОСЛЕДНЕЙ СТРОКИ ЭКРАНА 160 NEXT I Используя ’’карту” экрана дисплея и функцию РЕЕК, можно также узнать, какой символ воспроизводится в данный момент в той или иной позиции экрана. Например, с помощью оператора IF РЕЕК(1047) = 160 THEN осуществляется проверка, находится ли символ ’’пробел” в 24-й позиции первой строки экрана дисплея. В разрабатываемой программе используются также две так называемые встроенные процедуры, написанные на машинном языке: n 1. Процедура организации работы экрана дисплея в режиме рулон” позволяет сдвинуть изображение на экране дисплея вверх на одну строку. При этом строка, бывшая верхней на экране до начала операции, теряется, а новая, нижняя строка содержит пробелы во всех позициях. Программное обеспечение
60 Глава 1 ’’Applesoft” позволяет программирующему на языке Бейсик посредством команды вида CALL —912 обратиться к этой процедуре. В разрабатываемой программе эта процедура используется для получения эффекта движения Напало Рис. 6.2. потока снарядов, выпущенных вражеской артиллерией навстречу самолету, т. е. снизу вверх по полю экрана дисплея. 2. Процедура очистки экрана дисплея обеспечивает частич¬ ную или полную его очистку. Обращение к этой процедуре осуществляется с помощью команд, предоставляемых программ-
Игры в интерактивное программирование 61 ним обеспечением Applesoft в распоряжение пользователя языка Бейсик VTAB 18: НТАВ 1 CALL —958 В этом частном случае очистке подвергается часть экрана, на¬ чиная с первой позиции 18-й строки до 40-й позиции 24-й строки (т. е. до конца экрана). В разрабатываемой программе эта про¬ цедура используется для очистки нижней части экрана дисплея по окончании сеанса игры. Очищенная область используется для отображения результатов, достигнутых в процессе' игры. Теперь можно приступить непосредственно к составлению программы. Используем переменную Р для хранения инфор¬ мации о местоположении самолета на первой строке экрана. Самолет стартует в середине первой строки экрана дисплея (т. е. Р=20). Значение символьной переменной Х$ указывает направ¬ ление движения самолета в каждый момент времени. Если =”L”, самолет движется вправо, если X$=”J” — влево. За¬ дание любого другого значения переменной Х$ заставляет самолет оставаться в прежнем положении. В начале игры Х$= =”/<”, т. е. самолет не движется. На рис. 6.2 показана схема алгоритма программы, а ниже поясняется назначение отдельных блоков этой схемы. Блок ©: Функции его очевидны и реализуются следующим фрагментом программы: 100 REM ПИЛОТИРОВАНИЕ САМОЛЕТА ПОДОГНЕМ Ч" ч* н* ПО REM ЗЕНИТНЫХ БАТАРЕЙ Ф 4* Ф $ 200 Р = 20: REM В НАЧАЛЕ ИГРЫ ИЗОБРАЖЕНИЕ САМОЛЕТА В СЕРЕДИНЕ ВЕРХНЕЙ СТРОКИ ЭКРАНА 210 НОМЕ : REM ОЧИСТКА ЭКРАНА 220 Х$ = ”К” : REM ПЕРВОНАЧАЛЬНО САМОЛЕТ НЕПОДВИЖЕН Блок Аналогичен подобным блокам в предыдущих за¬ дачах, 230 IF РЕЕК (—16 384) > 127 THEN GET Х$: REM ЕСЛИ КЛАВИША НАЖАТА, ТО ЗНАЧЕНИЕ СООТВЕТСТВУЮЩЕГО ЕЙ СИМВОЛА ПРИСВАИВАЕТСЯ ПЕРЕМЕННОЙ XS 240 IF Х$ = ”L” THEN Р = Р + 1 : REM ПРИ НАЖАТИИ ”L” ДВИЖЕНИЕ ВПРАВО 250 IF Х$ = ”J” THEN Р = Р — 1: REM ПРИ НАЖАТИИ ”J” ДВИЖЕНИЕ ВЛЕВО Блок ©: Осуществляется проверка, не был ли самолет сбит или не натолкнулся ли он на ограничительную линию у правого или левого края поля экрана. 200 IF РЕЕК (1023 + Р) < > 160 THEN 420: REM ПРОВЕРКА, НЕ БЫЛ ЛИ САМОЛЕТ СБИТ
62 Глава 1 Блок ®: Используется процедура на машинном языке для очистки области в нижней части поля экрана, затем осуществ¬ ляется вывод значения числа набранных в процессе игры очков. 400 REM ПРОЦЕДУРА ЗАВЕРШЕНИЯ ИГРЫ, ЕСЛИ САМОЛЕТ СБИТ 410 REM 420 VTAB 18: НТАВ 1: REM ПОЗИЦИОНИРОВАНИЕ КУРСОРА ДЛЯ ВЫВОДА ЗАВЕРШАЮЩЕГО СООБЩЕНИЯ 430 CALL — 958: REM ОЧИСТКА НИЖНЕЙ ЧАСТИ ЭКРАНА 440 PRINT CHR$ (7) ; REM ПОДАЧА ЗВУКОВОГО СИГНАЛА 450 PRINT ’’САМОЛЕТ СБИТ И 1” 460 PRINT 470 PRINT ”ВЫ НАХОДИЛИСЬ ПОД ОГНЕМ СТ — 24; ” СНАРЯДОВ, НО ИЗБЕЖАЛИ ПОПАДАНИЯ” Блок ®: Используется набор команд РОКЕ для изображения на экране самолета, ограничительных символов ’’двоеточие” и новых снарядов. Обращение к процедуре организации ото¬ бражения информации в режиме ’’рулон” на экране дисплея используется для имитации движения потока снарядов на¬ встречу самолету. При помощи этой процедуры изображение на экране сдвигается вверх, при этом прежнее изображение самолета в верхней строке экрана исчезает и заменяется новым. 270 РОКЕ 1023 + Р, 170: REM ОТОБРАЖЕНИЕ НА ЭКРАНЕ СИМВОЛА ”*” ДЛЯ ОБОЗНАЧЕНИЯ ПОЛОЖЕНИЯ САМОЛЕТА 280 РОКЕ 2000,186: REM ПОСТРОЕНИЕ ЛЕВОЙ ГРАНИЦЫ ИГРОВОГО ПОЛЯ 290 РОКЕ 2039,186: REM ПОСТРОЕНИЕ ПРАВОЙ ГРАНИЦЫ ИГРОВОГО ПОЛЯ 300 РОКЕ 2001 + INT (19 * RND (1) ),222: REM ФОРМИРОВАНИЕ ИЗОБРАЖЕНИЯ СНАРЯДА ЗЕНИТНОЙ АРТИЛЛЕРИИ 310 РОКЕ 2020 + INT (19 * RND (1) ),222: REM ФОРМИРОВАНИЕ ИЗОБРАЖЕНИЯ ВТОРОГО СНАРЯДА- 320 CALL — 912: REM ОБРАЩЕНИЕ К ПРОЦЕДУРЕ, РЕАЛИЗУЮЩЕЙ ПРОДВИЖЕНИЕ СОДЕРЖИМОГО ЭКРАНА НА ОДНУ СТРОКУ ВВЕРХ ПЕРЕВОДОМ ДИСПЛЕЯ В РЕЖИМ ’’РУЛОН” 330 СТ = СТ + 1: REM УВЕЛИЧЕНИЕ НА ЕДИНИЦУ СОДЕРЖИМОГО СЧЕТЧИКА СНАРЯДОВ ПРОТИВНИКА, ПРОШЕДШИХ МИМО ЦЕЛИ 340 GOTO 230 Полный текст программы приведен ниже. 100 REM ***** ПИЛОТИРОВАНИЕ САМОЛЕТА ПОД ОГНЕМ ***** 110 REM ***** ЗЕНИТНЫХ БАТАРЕЙ ****8Е4 200 Р = 20: REM В НАЧАЛЕ ИГРЫ ИЗОБРАЖЕНИЕ САМОЛЕТА В СЕРЕДИНЕ ВЕРХНЕЙ СТРОКИ ЭКРАНА 210 НОМЕ ; REM ОЧИСТКА ЭКРАНА 220 Х$ = ”К” : REM ПЕРВОНАЧАЛЬНО САМОЛЕТ НЕПОДВИЖЕН 230 IF РЕЕК ( « 16 384) > 127 THEN GET Х$: REM ЕСЛИ
Игры в интерактивное программирование 63 КЛАВИША НАЖАТА, ТО ЗНАЧЕНИЕ СООТВЕТСТВУЮЩЕГО ЕЙ СИМВОЛА ПРИСВАИВАЕТСЯ ПЕРЕМЕННОЙ X.S 240 if XS = ”L” THEN Р = Р 4- 1: REM ПРИ НАЖАТИИ ”L” ДВИЖЕНИЕ ВПРАВО 250 if XS = ”J” THEN Р = Р — 1: REM ПРИ НАЖАТИИ ”J” ДВИЖЕНИЕ ВЛЕВО 260 IF РЕЕК (Ю23 + Р) < > 160 THEN 420: REM ПРОВЕРКА, НЕ БЫЛ ЛИ САМОЛЕТ СБИТ 270 РОКЕ 1023 + Р, 170: REM ОТОБРАЖЕНИЕ НА ЭКРАНЕ СИМВОЛА ДЛЯ ОБОЗНАЧЕНИЯ ПОЛОЖЕНИЯ САМОЛЕТА 280 РОКЕ 2000,186: REM ПОСТРОЕНИЕ ЛЕВОЙ ГРАНИЦЫ ' ИГРОВОГО ПОЛЯ 290 РОКЕ 2039,186: REM ПОСТРОЕНИЕ ПРАВОЙ ГРАНИЦЫ ИГРОВОГО ПОЛЯ 300 РОКЕ 2001 + INT (19 * RND (1) ),222: REM ФОРМИРОВАНИЕ ИЗОБРАЖЕНИЯ СНАРЯДА ЗЕНИТНОЙ АРТИЛЛЕРИИ 310 РОКЕ 2020 + INT (19 * RND (1)),222: REM ФОРМИРОВАНИЕ ИЗОБРАЖЕНИЯ ВТОРОГО СНАРЯДА 320 CALL — 912: REM ОБРАЩЕНИЕ К ПРОЦЕДУРЕ, РЕАЛИЗУЮЩЕЙ ПРОДВИЖЕНИЕ СОДЕРЖИМОГО ЭКРАНА НА ОДНУ СТРОКУ ВВЕРХ ПЕРЕВОДОМ ДИСПЛЕЯ В РЕЖИМ ’’РУЛОН” 330 СТ = СТ + 1: REM УВЕЛИЧЕНИЕ НА ЕДИНИЦУ СОДЕРЖИМОГО СЧЕТЧИКА РАКЕТ ПРОТИВНИКА, ПРОШЕДШИХ МИМО ЦЕЛИ 340 GOTO 230 400 REM ПРОЦЕДУРА ЗАВЕРШЕНИЯ ИГРЫ, ЕСЛИ САМОЛЕТ СБИТ 410 REM 420 VTAB 18: НТАВ 1: REM ПОЗИЦИОНИРОВАНИЕ КУРСОРА ДЛЯ ВЫВОДА ЗАВЕРШАЮЩЕГО СООБЩЕНИЯ 430 CALL — 958: REM ОЧИСТКА НИЖНЕЙ ЧАСТИ ЭКРАНА 440 PRINT CHR$ (7) : REM ПОДАЧА ЗВУКОВОГО СИГНАЛА 450 PRINT ’’САМОЛЕТ СБИТ! 11” 460 PRINT 470 PRINT ”ВЫ НАХОДИЛИСЬ ПОД ОГНЕМ”; СТ — 24; ’’СНАРЯДОВ, НО ИЗБЕЖАЛИ ПОПАДАНИЯ” Задача 7. Формирование изображений на экране дисплея ЭВМ с использованием графического режима высокой разрешающей способности Назначение разрабатываемой программы: освоение возмож¬ ностей использования дисплея в подобном графическом режиме для построения различных фигур и графиков функций. Специфические предпосылки успешной разработки: отсутст¬ вуют. Пояснения программисту: рассматривается ряд коротких программ для демонстрации техники программирования при использовании дисплея в графическом режиме с высокой раз¬ решающей способностью.
64 Глава 1 Одной из наиболее привлекательных возможностей ЭВМ Apple являются графические средства, позволяющие формиро¬ вать на экране дисплея различные рисунки. Поскольку ЭВМ оперируют исключительно числами, необходим способ опи¬ сания произвольных изображений с помощью чисел. В матема¬ тике такой способ известен давно и называется описанием в декартовой системе координат. На листе бумаги выбирается произвольная точка, называемая в дальнейшем началом коор¬ динат. Через нее проводятся две взаимно перпендикулярные прямые. Положение каждой точки задается относительно на¬ чала координат. При этом горизонтальная прямая, проходящая через начало координат, называется осью X или осью абсцисс. Вертикальная прямая, проходящая через начало координат, называется осью у, или осью ординат (рис. 7.1). Далее выбирается единица длины для измерения расстоя¬ ний. Ось X делится на отрезки, равные выбранной единице длины, вправо и влево от начала координат, Точки деления
Игры в интерактивное программирование 65 помечаются подобно тому, как показано на рис. 7.2. Таким же образом наносятся деления на ось у (рис. 7.3). 4 3 - 2 1 О - -2 - -4 - Рис. 7.3. 5 4 - 3 2 _ 1 1 1 i i i 1 1 - 1 1 . I 1 I 1 S 1 3 U3-2--'./ R -2 0 12 3 4 5 1 1 1 ~3 -4 —4 Рис. 7.4. Положение произвольной точки Р на графике можно о пи* сать с помощью пары чисел, называемых координатами. Первая координата, называемая координатой х, указывает, на каком расстоянии влево или вправо от начала координат находится 7 с. 2 О 5 4 1 3 3 2 •1 7 I I I i 4 1■.1 I . 1 2 3 4 5 6 7 Рис. 7.5. 1. отрезок из точки (2, 1) в точку (2, 6); 2. отрезок из точки (2, 6) в точку (6, 6); 3. отрезок из точки (6, 6) в точку (6, 1); 4. отрезок из точки (6, 1) в точку (2, 1). точка пересечения с осью х перпендикуляра, опущенного на эту ось из точки Р. Вторая координата, называемая координатой у, Указывает, на каком расстоянии вверх или вниз от начала 3 № 939
66 Глава 1 координат находится точка пересечения с осью у перпендику¬ ляра, опущенного на эту ось из точки Р. На рис. 7.4 точка Р имеет координаты (1,3), точка Q — (2,-3), точка R — (—4,—1), а точка S — (5,0). Координата х всегда указывается перед координатой у. Декартову систему координат можно использовать для опи¬ сания различных изображений. Например, прямоугольник, Рис. 7.6. представленный на рис. 7.5, можно построить, используя список образующих его отрезков. Читателю рекомендуется, исполь¬ зуя декартовы координаты, описать каждую из фигур, показан¬ ных на рис. 7.6. Порядок действий, предписываемый каждой процедурой, неоднозначен и поэтому может отличаться от при¬ водимого ниже. Правильность той или иной процедуры можно проверить, выполнив предписываемые ею построения и затем сравнив получившиеся фигуры с исходными. Для фигур, изоб¬
Игры в интерактивное программирование 67 раженных на рис. 7.6, можно использовать следующие проце¬ дуры. а) отрезок из точки (—3,1) в точку (3,1), отрезок из точки (3,1) в точку (0,4), отрезок из точки (0,4) в точку (—3,1); б) отрезок из точки (3,3) в точку (—3,—3), отрезок из точки (3,-3) в точку (—3,3); в) отрезок из точки (2,0) в точку (2,4), отрезок из точки (2,4} в точку (7,4), отрезок из точки (7,4) в точку (4,7), отрезок из точки (4,7) в точку (5,7), отрезок из точки (5,7) в точку (2,10), отрезок из точки (2,10) в точку (3,10), отрезок из точки (3,10)’ в точку (0,13), отрезок из точки (0,13) в точку (—3,10), от¬ резок из точки (—3,10) в точку (—2,10), отрезок из точки (—2,10) в точку (—5,7), отрезок из точки (—5,7) в точку (—4,7), отрезок из точки (—4,7) в точку (—7,4), отрезок из точки (—7,4) в точку (—2,4); отрезок из точки (—2,4) в точ¬ ку (—2,0). Рассмотрим изображение ромба на рис. 7.7 и его описание в декартовых координатах. Пусть требуется построить изоб¬ ражение ромба, подобного приведенному на рисунке, но вдвое большего размера. Это можно выполнить, умножив значения всех координат исходной фигуры на 2 (рис. 7.8). Центры обоих ромбов совпадают с началом координат. Пусть теперь необхо¬ димо переместить первый ромб так, чтобы его центр оказался в точке с координатами (2,4)_. Это достигается сдвигом в соот¬ ветствующем направлении каждой точки фигуры, т. е. прибав¬ лением числа 2 к значению каждой координаты х и числа 4 к Рис. 7.7. 1. отрезок из точки (3, 0) в точку (0, 3); 2. отрезок из точки (0, 3) в точку (—3, 0); 3. отрезок из точки (—3, 0) в точку (0, —3); 4. отрезок из точки (0, —3) в точку (3, 0). значению каждой координаты у изображаемой фигуры (рис. 7.9). Этот способ перемещения изображения реализуется в приводи¬ мой ниже программе, позволяющей получить 25 изображений ромба. Читателю рекомендуется выполнить эту программу на ЭВМ. 100 HGR НО HCOLOR = 7 120 FOR X = 10 ТО 50 STEP 10 130 FOR X = 10 ТО 50 STEP 10 140 HPLOT X + 3,Y TO X,Y + 3 B*
68 Глава 1 150 HPLOT X,Y + 3 ТО X — 3,Y 160 HPLOT X — 3,Y TO X,Y — 3 170 HPLOT X,Y — 3 TO X + 3,Y 180 NEXT Y 190 NEXT X 200 PRINT ’’ЗАДАНИЕ ВЫПОЛНЕНО” Поясним назначение некоторых операторов этой программы. Команда HGP переводит дисплей в графический режим с вы¬ сокой разрешающей способностью (см. руководство, по эксплуа- 1. отрезок из точки (6, 0) в точку (0, 6); 2. отрезок из точки (0, 6) в точку (—6, 0)? 3. отрезок из .точки (—6, 0) в точку (0, —6); 4. отрезок из точки (0, —6) в точку (6, 0). тации ЭВМ). Затегл при необходимости возврата дисплея в режим воспроизведения текстовой информации достаточно восполь¬ зоваться командой TEXT. Команда HCOLOR=7 указывает Рис. 7.9. 1. отрезок из точки (5, 4) в точку (2, 7); 2. отрезок из точки (2, 7) в точку (—1 , 4); 3. отрезок из точки (—1, 4) в точку (2, l)j 4. отрезок из точки (2, 1) в точку (5, 4). на использование белого цвета при построении изображения (проведении линий контура ромба). Если бы была задана ко¬ манда HCOLOR=0, формирование изображения выполнялось
Игры в интерактивное программирование 69 бы линиями черного цвета. Обычно такая команда используется для стирания изображения с экрана дисплея. При работе дисп¬ лея в графическом режиме с высокой разрешающей способностью чаще всего используется команда HPLOT, имеющая следующие четыре формы представления: 1) HPLOT А,В: на экране в позиции с координатами (А,В) воспроизводится точка; 2) HPLOT А,В ТО C,D: проводится отрезок прямой между точками с координатами (А,В) и (C,D); 3) HPLOT ТО C,D: проводится отрезок прямой между по¬ следней воспроизведенной на экране точкой и точкой с коор¬ динатами (G,D). Например, последовательность операторов 200 HPLOT 100,100 210 HPLOT ТО 200,200 создает на экране изображение отрезка прямой, соединяющего точки с координатами (100,100) и (200,200); 4) HPLOT А,В ТО C,D ТО E,F: на экране проводятся два отрезка прямой: один между точками с координатами (А,В) и (C,D), а другой — между точками с координатами (C,D) и (E,F). 60 40 30 20 10 -ооооо -ооооо -ооооо ооооо -ооооо 1 1 1 1 1 ООООО ооооо ооооо ооооо ооооо А -10 _ Ю 20 30 40 50 У а б Рис. 7.10. Если в программе построения изображения 25 ромбов использо¬ вать последнюю форму записи команды. HPLOT, то текст этой программы можно сократить, заменяя строки 140—170 перво¬ начального варианта строкой вида 140 HPLOT X + 3,Y ТО X,Y + 3 ТО X — 3,Y ТО X,Y — 3 ТО X + 3,Y Наблюдая внимательно за выполнением рассматриваемой программы, можно заметить некоторое несоответствие между ожидаемым и воспроизводимым изображениями. В программе
70 Глава f описывается процедура построения изображения 25 ромбов, которые должны располагаться в поле экрана согласно рис. 7.10, а. В действительности же на экране возникает изображе¬ ние, подобное приведенному на рис. 7.10, б. Кроме того, хотя про¬ грамма требует построения изображений ромбов слева направо и снизу вверх, на экране они воспроизводятся слева направо, но сверху вниз. Этот эффект связан с тем, что ЭВМ устанавливает начало координат на экране дисплея, используемого в графи¬ ческом режиме с высокой разрешающей способностью, в левом верхнем углу. При этом ось х проходит вдоль верхнего края поля экрана, а величина единицы масштаба (элемента разло¬ жения поля представления изображений), используемого для адресации позиций поля, зависит от размера экрана использу¬ емого дисплея. Ширина поля экрана составляет 279 единиц. Таким образом, точка, координата х которой составляет 140, оказывается примерно посередине между правым и левым кра¬ ями экрана. Размер экрана по высоте составляет 159 единиц масштаба х), причем нулевому значению координаты соответст¬ вуют точки самой верхней ’’строки”, а значению 159 — самой нижней. На рис. 7.11 показаны некоторые точки полиэкрана с соответствующими значениями координат. Описание изображений для их построения на экране дисп¬ лея, используемого в графическом режиме с высокой разреша¬ ющей способностью, во многом подобно приведенному выше Х) При работе дисплея в графическом режиме с высокой разрешающей способностью в нижней части поля экрана резервируется область для раз¬ мещения четырех строк текста. Однако при построении изображений не исключается возможность использовать все поле экрана. В таком случае вдоль оси у укладывается 191 единица масштаба. Применение такого ре¬ жима работы рассматривается ниже.
Игры в интерактивное программирование 71 описанию изображений для построения в декартовой системе координат (рис. 7.12). Читателю рекомендуется составить программу для пост¬ роения изображения какой-либо несложной фигуры на экране 100 HGR 110 HCOLOR=7 120 HPLOT 100,40 ТО 200,40 ТО 180,60 ТО 180,100 130 HPLOT ТО 1 20,100 ТО 120,60 ТО 100,40 дисплея, используемого в графическом режиме о высокой раз¬ решающей способностью; разумеется, эту фигуру следует пред¬ варительно нарисовать на бумаге. Движущееся изображение, на экране дисплея можно полу¬ чить быстрой сменой ряда статических неподвижных изображе< ний, возникающий при этом визуальный эффект создает иллю¬ зию движения. Этот способ получения движущихся изображений используется в кино и телевидении. Подобное решение реали¬ зует следующая программа: 100 HGR 110 FOR I = 10 ТО 270 120 HCOLOR = 7 130 HPLOT I — 5,50 ТО I + 5,60 140 HPLOT I — 5,60 ТО I + 5,50 150 HCOLOR = 0 160 HPLOT I — 5,50 ТО I + 5,60 170 HPLOT I — 5,60 ТО I + 5,50 180 NEXT I 200 PRINT ’’ЗАДАНИЕ ВЫПОЛНЕНО” В процессе выполнения этой программы на экране форми¬ руется изображение, напоминающее по очертаниям букву ”Х”, затем оно стирается и снова воспроизводится, но уже несколько смещенным вправо. Процесс циклически повторяется, создавая У наблюдателя иллюзию движения изображения буквы ”Х” ПО полю экрана. Операторы, расположенные в строках 120—140, служат для формирования данного изображения, а операторы
Глава 1 в строках 150—170 — для его стирания (стирание осуществ¬ ляется повторным формированием изображения с помощью черного цвета). Масштабирование изображения на экране дисплея Пусть на экране дисплея ЭВМ необходимо графически ото¬ бразить данные, приведенные в табл. 7.1. Используем ось абс¬ цисс (ось х) для указания величины радиуса орбиты планет Таблица 7.1 Планета Радиус орбиты, млн. миль Период обращения, годы Меркурий 36,00 0,24 Венера 67,27 0,62 Земля 93,00 1,00 Марс 141,71 1,88 Юпитер 483,88 11,86 в миллионах миль. Поскольку наименьшее из перечисленных значение радиуса составляет 36 млн. миль, а наибольшее 483,88 млн. миль, естественно при построении графика ограни¬ читься изменениями значений координаты х в диапазоне а I 1 О 500 8 I— 0 —к— 1ОО 1 200 —1 ЗОО —I— 400 —I 500 Машинные координаты в 0 1 56 I 112 I 167 I 223 I 279 I 0 100 200 ЗОО 400 500 Миллионы миль Рис. 7.13. 0—500 млн. миль (рис. 7.13, а). График оказывается более удоб¬ ным для чтения, если на ось абсцисс нанести деления (масштаб¬ ные метки) через каждые 100 млн. миль и указать соответствующие им значения (рис. 7.13, 6).
Игры в интерактивное программирование 73 Рассмотрим подробнее процесс построения изображения оси абсцисс и нанесения на нее меток при использовании дисп¬ лея в графическом режиме с высокой разрешающей способно¬ стью. В этом случае все элементы разложения (единицы мас¬ штаба) поля экрана описываются ’’машинными” координатами, значения которых вдоль оси х изменяются в пределах 0—279. Следовательно, 1 млн. миль соответствует 279/500 машинных единиц элементов разложения (рис. 7.13, в). Заметим, что пре¬ образование значения абсциссы, выраженного в миллионах миль, в значение в машинных единицах осуществляется умно¬ жением первого значения на 279/500. Например, расстоянию в 100 млн. миль соответствует значение абсциссы, равное 100 X X279/500=55,8 машинной единицы, или, округляя до целого, получаехМ приближенное значение, равное 56. Такое преобра¬ зование масштаба легко выражается формулой х) X = 279/500 где X — значение абсциссы, выраженное в машинных единицах (элементах разложения) экрана дисплея, а М — значение той же абсциссы в миллионах миль. Эта формула многократно используется в последующих программах, и повторять ее запись в тексте программы было бы по меньшей мере утомительно. К счастью, программное обес¬ печение Applesoft предоставляет пользователю простое решение подобных проблем. Оператор DEF FN позволяет программисту описывать свои собственные функции, применение которых далее в тексте программы ничем не отличается от обращения к так называемым встроенным функциям (например, SQR, SIN. ABS и т. д.). С помощью оператора DEF FN DB(X) = 2«X ИЛИ DEF FN DB(T) = 2*T описывается функция, обращение к которой осуществляется с помощью функции DB. Переменная X в первом случае и пере¬ менная Т во втором называются формальным параметром функ¬ ции DB. Первый приведенный оператор можно ’’прочитать”, например, следующим образом: ’’При вычислении функции DB Х) Команда HPLOT, используемая при работе дисплея в графическом режиме с высокой разрешающей способностью, автоматически преобразу¬ ет вещественное значение координаты в целое посредством так называемой встроенной функции INT. Однако график получается более точным, если использовать оператор Х=М*279/500 + .5 вместо оператора Х= =М*279/500, поскольку в первом случае при преобразовании производится округление, тогда как во втором случае дробная часть в процессе преоб¬ разования отбрасывается.
74 Глава 1 произвольного значения аргумента (назовем его X) значением функции становится удвоенное значение аргумента”. Второй оператор можно интерпретировать следующим образом: ”Прц вычислении функции DB произвольного значения аргумента (назовем его Т) значением функции становится удвоенное зна¬ чение аргумента”. После того как функция описана, к ней можно обращаться в любом месте программы, например: 200 А = FN DB(4) 210 B = FNDB(8) + 1 220 С = FN DB(A) В строке 200 производится вычисление функции DB(4) с после¬ дующим присвоением полученного значения переменной А. В строке 210 значение 17 присваивается переменной В. В строке 220 значение переменной А умножается на 2 и полученный результат присваивается переменной С. Для более детального ознакомления с возможностями оператора DEF можно обратиться к ’’Справочному руководству по языку Бейсик ЭВМ Apple II” 1}. Отметим лишь, что до обращения к каждой используемой в программе функции она должна описываться в операторе DEF. В разрабатываемой программе функция FN X служит для преобразования миллионов миль пройденного расстояния в значения координаты X, выраженные в машинных единицах: 100 DEF FN Х(М)=М * 279 / 500 Этот оператор является составной частью приводимой ниже небольшой программы, выполняющей построение на экране дис¬ плея изображения оси х с нанесением на нее меток. 100 DEF FN Х(М) = М * 279 / 500: REM ФУНКЦИЯ ПРЕОБРАЗОВАНИЯ РАССТОЯНИЙ В МИЛЛИОНАХ МИЛЬ В ЗНАЧЕНИЯ МАШИННОЙ КООРДИНАТЫ X ПО HGR : REM УСТАНОВКА ГРАФИЧЕСКОГО РЕЖИМА С ВЫСОКОЙ РАЗРЕШАЮЩЕЙ СПОСОБНОСТЬЮ 120 HCOLOR = 7 : REM ЦВЕТ БЕЛЫЙ 130 HPLOT 0,159 ТО 279,159 : REM ПОСТРОЕНИЕ ОСИ X 140 FOR Т = 0 ТО 500 STEP 100 : REM НАНЕСЕНИЕ НА ОСЬ МЕТОК ЧЕРЕЗ КАЖДЫЕ 100 МИЛЛИОНОВ МИЛЬ 150 HPLOT FN Х(Т),159 ТО FN Х(Т),156: REM НАНЕСЕНИЕ ОДНОЙ МЕТКИ 160 NEXT Т Замечания: 1. В приведенной программе ось х размещается в нижней части поля экрана и имеет машинную координату у, равную 159 элементам разложения (по вертикали поля экрана). 1) См. также дополнение’’Неформальное описание основ языка про¬ граммирования Бейсик ЭВМ Apple II” в конце книги,— Прим, pedt
Игры в интерактивное программирование 75 2. Метки, наносимые на ось х, представляют собой верти* кальные отрезки прямых высотой 3 элемента разложения (зна¬ чения координаты у этих элементов 156—159). Можно исполь¬ зовать метки другого размера. Теперь необходимо рассмотреть построение изображения оси у. Эта ось используется для. указания значений периода обращения планет. Поскольку период обращения заданных небесных тел не выходит за пределы диапазона значений от 0,24 (у Меркурия) до 11,86 (у Юпитера) лет, представляется целесообразным всю воспроизводимую на экране часть оси у использовать для значений периода 0—12 лет, нанося деления т 72 т 12 -I Г0 л- 9- &- 7- Б ~ Годы /Пашинные координаты s- 4- 3- 2- 1- о J о- - 159 0- Рис. 7.14. Рис. 7.15. Рис. (метки) через интервалы, соответствующие 1 году (рис. 7.14). Как и при построении оси х, отсчеты вдоль оси у должны быть выражены в машинных единицах (элементах разложения по вертикали). На рис. 7.15 показано соответствие значений пе¬ риода обращения планет машинным координатам. Поскольку по вертикали поля экрана укладывается 159 элементов раз¬ ложения (что соответствует периоду обращения, равному 12 лет), то интервалу на оси у, равному 1 году, соответствуют 159/12 машинных единиц. На первый взгляд представляется возможным выразить функцию масштабирования в виде Y = YR * 159/12 Для преобразования значения периода обращения, выражен¬ ного в годах, в значения машинных координат по оси у. Однако такая форма записи функции масштабирования была бы допу¬ стима, если бы отсчет машинной ординаты (отсчет вдоль оси у) проводился от нижнего края поля, экрана к верхнему, как по¬
76 Глава 1 казано на рис. 7.16. В действительности это не так. Поэтому требуемая функция масштабирования должна иметь следующий вид: Y = 159 — YR * 159/12 Читателю рекомендуется попытаться составить программу построения на экране изображения оси у с нанесением на нее меток. При возникновении затруднений можно обратиться к тексту подобной программы, приводимой ниже: 170 DEF FN Y(R) = 159 - YR * 159 / 12: REM ФУНКЦИЯ ПРЕОБРАЗОВАНИЯ ПЕРИОДА ОБРАЩЕНИЯ В ГОДАХ В ЗНАЧЕНИЯ МАШИННОЙ КООРДИНАТЫ Y 180 HPLOT 0,159 ТО 0,0: REM ПОСТРОЕНИЕ ОСИ Y 190 FOR YR = 0 ТО 12: REM НАНЕСЕНИЕ НА ОСЬ Y МЕТОК ЧЕРЕЗ 1 ГОД 200 HPLOT 0, FN Y(YR) ТО 3, FN Y(YR): REM НАНЕСЕНИЕ ОДНОЙ МЕТКИ НА ОСЬ Y 210 NEXT YR Следующая проблема — ввод исходных данных в память ЭВМ. Простейшим является следующее решение: 220 DIM RD(5) : REM RD(I) — РАДИУС ОРБИТЫ I-Й ПЛАНЕТЫ 230 DIM PR(5) : REM PR(I) — ПЕРИОД ОБРАЩЕНИЯ I-Й ПЛАНЕТЫ 240 RD(1) = 36:PR(1) = .24: REM ДАННЫЕ ДЛЯ МЕРКУРИЯ 250 R D(l) = 67.27:PR(2) = .62: REM ДАННЫЕ ДЛЯ ВЕНЕРЫ 260 RD(3) = 93:PR(3) = 1: REM ДАННЫЕ ДЛЯ ЗЕМЛИ 270 R D(4) = 141.71:PR(4) =1.88: REM ДАННЫЕ ДЛЯ МАРСА 280 R D(5) = 483.88:PR(5) = 11.86: REM ДАННЫЕ ДЛЯ ЮПИТЕРА - Чтобы нанести одну точку на график, достаточно восполь¬ зоваться ранее определенными функциями в операторе вида HPLOT FN X (RD(1)), FN Y(PR(1)) Для нанесения на график точек, представляющих все шесть планет, следует повторить эти действия в цикле вида FOR. . . NEXT. Читателю рекомендуется составить эту процедуру са¬ мостоятельно. FN X(RD(1D. FN Y(PR(1>) - 1 FN X (RD(1)) L FN Y(PR(1)) FN X (RD(1)h FN Y(PR(1)) FN X (RD(1)| + 1, FN Y <PR(1>y FN X (RD(1)h FN Y(PR(1)| +1 График можно сделать более наглядным, если положение каждой воспроизводимой точки помечать небольшим крести¬ ком, изображенным на рис. 7.17, Читателю следует попытаться
Игры в интерактивное программирование 77 модифицировать программу с учетом этого пожелания. При возникновении затруднений можно обратиться к помещенному ниже фрагменту. 290 FOR I = 1 ТО 5: REM ФОРМИРОВАНИЕ ТОЧЕК ДАННЫХ 300 HPLOT FN X (RD(I)) — 1, FN Y(PR(I)) ТО FN X(RD(I)) + 1, FN Y(PR(I)):REM ФОРМИРОВАНИЕ ИЗОБРАЖЕНИЯ КРЕСТИКА ДЛЯ КАЖДОЙ ТОЧКИ ДАННЫХ 310 HPLOT FN X(RD(I)), FN Y(PR(I)) — 1 ТО FN X(RD(I)), FN Y(PR(I)) + 1 320 NEXT I Итак, полностью, фрагмент за фрагментом, рассмотрена вся программа построения несложного графика на экране дисплея ЭВМ. Ниже приводится текст этой программы 100 110 120 130 140 150 160 170 180 190 200 210 220 230 240 250 260 270 280 290 300 310 320 DEFFN X(М) = М * 279/ 500: REM ФУНКЦИЯ ПРЕОБРАЗОВАНИЯ РАССТОЯНИЯ В МИЛЛИОНАХ МИЛЬ В ЗНАЧЕНИЯ МАШИННОЙ КООРДИНАТЫ X HGR:REM УСТАНОВКА ГРАФИЧЕСКОГО РЕЖИМА С ВЫСОКОЙ РАЗРЕШАЮЩЕЙ СПОСОБНОСТЬЮ HCOLOR = 7:REM ЦВЕТ БЕЛЫЙ HPLOT 0,159 ТО 279,159:REM ПОСТРОЕНИЕ ОСИ X FOR Т = 0 ТО 500 STEP 100: REM НАНЕСЕНИЕ НА ОСЬ МЕТОК ЧЕРЕЗ КАЖДЫЕ 100 МИЛЛИОНОВ МИЛЬ HPLOT FN Х(Т),159 ТО FN Х(Т),156: REM НЕНЕСЕНИЕ ОДНОЙ МЕТКИ NEXT Т DEF FN Y(YR) = 159 — YR * 159 I 12: REM ФУНКЦИЯ ПРЕОБРАЗОВАНИЯ ПЕРИОДА ОБРАЩЕНИЯ В ГОДАХ В ЗНАЧЕНИЯ МАШИННОЙ КООРДИНАТЫ Y HPLOT 0,159 ТО 0,0: REM ПОСТРОЕНИЕ ОСИ Y FOR YR = 0 ТО 12: REM НАНЕСЕНИЕ НА ОСЬ Y МЕТОК ЧЕРЕЗ 1 ГОД HPLOT 0, FN Y(YR) ТО 3, FN Y (YR): REM НАНЕСЕНИЕ ОДНОЙ МЕТКИ НА ОСЬ Y NEXT YR DIM RD(5): REM RD(I) — РАДИУС ОРБИТЫ I-Й ПЛАНЕТЫ DIM PR(5):REM PR(I) — ПЕРИОД ОБРАЩЕНИЯ I-Й ПЛАНЕТЫ RD(1) = 36:PR(1) = .24: REM ДАННЫЕ ДЛЯ МЕРКУРИЯ RD(2) = 67.27:PR(2) = .62: REM ДАННЫЕ ДЛЯ ВЕНЕРЫ RD(3) = 93:PR(3) = 1: REM ДАННЫЕ ДЛЯ ЗЕМЛИ RD(4) = 141.71:PR(4) = 1.88: REM ДАННЫЕ ДЛЯ МАРСА RD(5) = 483.88:PR(5) = 11.86: REM ДАННЫЕ ДЛЯ ЮПИТЕРА FOR I = 1 TO 5: REM ФОРМИРОВАНИЕ ТОЧЕК ДАННЫХ HPLOT FN X(RD(I)) — 1, FN Y(PR(I)) TO FN X(RD(I)) + 1, FN Y(PR(I)):REM ФОРМИРОВАНИЕ ИЗОБРАЖЕНИЯ КРЕСТИКА ДЛЯ КАЖДОЙ ТОЧКИ ДАННЫХ HPLOT FN X(RD(I)), FN Y(PR(I)) — 1 TO FN X(RD(I)), FN Y(PR(I)) + 1 NEXT I Третий закон Кеплера Иоганн Кеплер (1571—1630) впервые сформулировал три закона движения небесных тел (задача 24). Согласно третьему закону Кеплера, у планет с круговой орбитой период обращения
78 Главд f описывается формулой р=л*Кяз, где Р — период обращения, R — радиус орбиты, а Д' — неко¬ торая константа. Поскольку величина К одинакова для всех планет, ее значение можно определить, используя данные для какой-либо планеты. Например, рассматривая движение Земли, находим 1=/С*К(93) 3=Д#К804,357=К*896,85 952. Отсюда /<=1/896,85 952=0,001 115. Следовательно, третий закон Кеплера можно выразить функ¬ циональной зависимостью вида Р-0,001 115*/^. Теперь остается только дополнить предыдущую программу процедурой построения графика полученной функции, чтобы выяснить, насколько третий закон Кеплера согласуется с дан¬ ными, полученными в результате астрономических измерений. ЭВМ не имеет возможности строить точное изображение кривых линий на экране дисплея. При возникновении такой необходимости строится ломаная линия из множества неболь¬ ших отрезков прямых так, что результирующая линия вы¬ глядит почти гладкой. При построении графика функции Р=^ =0,001 Иб*/^5 для получения приемлемого изображения достаточно использовать около 100 отрезков. Ниже перечислена последовательность действий, необходи¬ мых для добавления этой кривой к полученному ранее графику, 1. Начать построение в точке с координатами (0,0). 2. Последовательно присваивая переменной R значения от 5 до 500 с шагом 5: а) вычислить значение Р=0,001 115*К^8; б) построить отрезок прямой, соединяющий текущую точку с точкой, имеющей координаты (R,P). Соответствующая последовательность операторов на языке Бейсик имеет вид 330 HPLOT FN Х(0), FN Y(0): REM НАЧАЛО ФОРМИРУЕМОЙ КРИВОЙ В ТОЧКЕ С КООРДИНАТАМИ (0,0) 340 FOR R = 5 ТО 500 STEP 5: REM ПОСТРОЕНИЕ КРИВОЙ В ВИДЕ 500 ТОЧЕК, СОЕДИНЕННЫХ ОТРЕЗКАМИ ПРЯМЫХ 350 Р = .001115 * SQR (R * R *R): REM ВЫЧИСЛЕНИЕ ПЕРИОДА ОБРАЩЕНИЯ В СООТВЕТСТВИИ С ТРЕТЬИМ ЗАКОНОМ КЕПЛЕРА 360 HPLOT ТО FN X(R), FN Y(P)t REM ПРОВЕДЕНИЕ ОТРЕЗКА ПРЯМОЙ ОТ ТЕКУЩЕЙ ТОЧКИ К НОВОЙ 370 NEXT R Ртметим, что рассмотренные выше функции масштабирования FN X и FN У по-прежнему пригодны для преобразования зна-
Игры в интерактивное программирование 79 Машинные координаты 159 18. чений координат, выраженных в милях и годах, в значения машинных координат в элементах разложения (машинных единицах). Читателю рекомендуется добавить соответствующие операторы к рассматриваемой программе и убедиться в этом. Программа должна работать почти идеально. Однако при анализе результатов ее выполне- ния можно все же обнаружить 1,5 12 ■ некоторые неточности. 1. Кривая не точно проходит через все нанесенные точки, хотя отклонения относительно невели¬ ки. Это может быть вызвано ошиб¬ ками округления или тем, что op- биты планет на самом деле явля¬ ются эллиптическими, а не кру- 5 говыми. Во всяком случае, вели¬ чина ошибки достаточно мала, что¬ бы ею можно было пренебречь. (Исключение составляет, напри¬ мер, случай использования подоб- о ных данных для прокладки курса Рис космического корабля, когда таки¬ ми ошибками пренебречь нельзя.) 2. В конце процедуры построения графика на экране появ¬ ляется сообщение об ошибке ’’ILLEGAL QUANTITY ERROR” (НЕДОПУСТИМАЯ ВЕЛИЧИНА). Причину возникновения ошибки понять легко. При 2?=500 период обращения, вычис¬ ленный в соответствии с третьим законом Кеплера, составляет Р = 0,001 115*/5003= 12,46. Однако 12,46 находится вне интервала возможных значений координаты у, отображаемых на экране: эта величина не попа¬ дает в интервал 0—12 лет. Исправить подобную неточность можно увеличением интервала отображаемых значений у до 12,5, т. е. изменив соответствующим образом строку программы 170 DEF FN Y(YR)=.il Чтобы яснее представить себе, как модифицировать этот опе¬ ратор, следует обратиться к рис. 7.18 или еще раз вернуться к описанию функции масштабирования FN Y(YR) Упражнение: Поскольку третий закон Кеплера представляется вполне корректным, читатель может в качестве упражнения использовать этот закон для вычисления периодов обращения Сатурна, Урана, Нептуна и Плутона на основании следующих Данных:
80 Глава 1 Планета Радиус Период орбиты обращения Сатурн Уран Нептун Плутон 887,14 — 1783,98 — 2795,46 — 3675,27 — Ответ: Фактически наблюдаемые астрономами значения перио¬ дов обращения планет составляют: У Сатурна 29,458 года, у Урана 84,013 года, у Нептуна 164,794 года, у Плутона 248,430 года. (Примечание: орбита Плутона представляет собой сильно вытя¬ нутый эллипс.) Примеры программ, использующих дисплей в графическом режиме с высокой разрешающей способностью Погоня мух друг га другом Предположим, что имеются четыре мухи, расположенные в углах некоторого квадрата. “ дая устремляется к соседней, Пусть, начиная движение, каж- выбор которой определяется тре¬ бованием полета мух против часовой стрелки, как показано на рис. 7.19. Требуется соста¬ вить программу воспроизведения на экране дисплея изображения траекторий полета мух. В этой программе использу¬ ется так называемый полнофор¬ матный графический режим с высокой разрешающей способ¬ ностью п. В предыдущих про¬ граммах машинная координата у поля экрана принимала значе¬ ния 0—159, при этом в нижней части экрана оставалось про¬ странство для четырех строк тек¬ ста. В полноформатном графическом режиме это пространство в нижней части поля экрана также используется для построения изображений, а значения координаты у могут изменяться в пределах 0—191. Использование этого дополнительного про- В этом режиме, именуемым сокращенно HGR2, все доступное ЭВМ поле экрана используется для построения изображения.— Прим, перев.
Игры в интерактивное программирование 81 странства часто оказывается весьма удобным. Перевод дисплея в полноформатный графический режим осуществляется с по¬ мощью команды РОКЕ-16 302,0. На рис. 7.20 показаны система координат, используемая для построения изображения траекторий полета мух и соот¬ ветствие ее машинным координатам. -90 О 90 50 МО 230 Рис. 7.20. Текст программы должен начинаться с описания функции масштабирования для выбранных координат х и у. Читателю рекомендуется самостоятельно составить такое описание, ис¬ пользуя рис. 7.20. При возникновении затруднений можно обра¬ титься к строкам 120 и 130 программы 7.1, помещенной в при¬ ложении. При выполнении программы следят за положением каждой мухи. В действительности, необходимо знать не только текущее положение каждой мухи, но и следующее ее положение. Для этой цели удобны четыре индексированные переменные: 140 DIM Х(5), Y(5): REM ТЕКУЩИЕ ЗНАЧЕНИЯ КООРДИНАТ X И Y ПОЛОЖЕНИЯ МУХ 150 DIM NX(4), NY(4): REM СЛЕДУЮЩИЕ ЗНАЧЕНИЯ КООРДИНАТ X И Y ПОЛОЖЕНИЯ МУХ Заметим, что в программе 7.1 посредством оператора DIM. Х(5), У(5) для этой информации резервируются массивы из пяти эле¬ ментов каждый, в то время как следовало ожидать использо¬
82 Глава f вания четырехэлементных массивов. Причина этого станет ясна несколько позже. Начальное положение каждой из четырех мух задается следующим образом: 160 Х(1) = —90:Y(l) = —90: REM КООРДИНАТЫ НАЧАЛЬНОГО ПОЛОЖЕНИЯ 1-й МУХИ 170 Х(2) = 90:У(2) =—90: REM КООРДИНАТЫ НАЧАЛЬНОГО ПОЛОЖЕНИЯ 2-Й МУХИ 180 Х(3) = 90:Y(3) = 90: REM КООРДИНАТЫ НАЧАЛЬНОГО ПОЛОЖЕНИЯ 3-Й МУХИ 190 Х(4) = —90:Y(4) = 90: REM КООРДИНАТЫ НАЧАЛЬНОГО ПОЛОЖЕНИЯ 4-Й МУХИ При этом мухи нумеруются против часовой стрелки, причем первая находится в левом нижнем углу экрана. Рассмотрим движение мухи 1. Она летит по направлению к мухе 2. Чтобы достичь мухи 2, муха 1 должна двигаться так, чтобы изменить значения своей координаты х на величину Х(2) — Х(1), а координаты у — на величину У(2) — У(1), поскольку Х(2) = Х(1) + (Х(2)-Х(1)), У(2) = У(1) + (У(2)-У(1)). Но пока муха 1 летит по направлению к мухе 2, последняя также перемещается, и если муха 1 будет двигаться, не меняя направления, в нижний правый угол исходного квадрата, то к тому моменту, когда она кажется в этом углу, муха 2 уже покинет его. Таким образом, каждая муха должна двигаться к своей цели, непрерывно изменяя направление своего движе¬ ния. Вычислим значения координат следующего положения мухи 1 по прошествии небольшого промежутка времени следу¬ ющим образом: NX (1) = X (1) + 0,02 * (X (2)—X (1)), NX (1) = Y (1) + 0,02 * (У (2) — У (1).). Теперь можно построить изображение первого сегмента траектории полета мухи 1: HPLOT X(l), Y(l) ТО NX(1), NY(.l) Выполнение рассмотренной процедуры для описания по¬ лета каждой из четырех мух осуществляется посредством цикла 330 FOR I = 1 ТО 4:REMLWIQI РАСЧЕТА ТРАЕКТОРИЙ ПОЛЕТА МУХ 340 NX(I) = X (1)+ .02 * (X(I + 1) — Х(1)) 350 NY(I) = Y(I) + .02 * (Y(l + 1) — Y (1)) 360 NEXT I 370 FOR I = 1 TO 4: REM ЦИКЛ ФОРМИРОВАНИЯ ТРАЕКТОРИЙ ПОЛЕТА МУХ
Игры в интерактивное программирование 83 380 HPLOT FN X(X(I)), FN Y (Y(I)) ТО FN X(NX(I)), FN Y(NY(I)) 390 X(I) = NX(I):Y(I) = NY(I); REM ИЗМЕНЕНИЕ КООРДИНАТ ПОЛОЖЕНИЯ МУХИ 400 NEXT I В приведенном фрагменте программы отметим следующее: 1. При значении параметра цикла 1=4 операторы в строках 340 и 350 имеют вид NX (4) = X (4) + 0,02 * (X (5) — X (4)), NY (4) = Y (4) + 0,02 * (У (5) —У (4)). Однако в этом случае условия задачи требуют использования формул NX (4) = X (4) + 0,02 * (X (1)—X (4)), NY (4) = Y (4) + 0,02 * (У (1)—У (4)). Для удовлетворения этого требования необходимо, во-первых, значение параметра I цикла FOR. . .NEXT изменять лишь в пределах 1—3 и, во-вторых, операторы, реализующие две при¬ веденные выше формулы, выполнять после завершения ука¬ занного цикла. Однако более простое и изящное решение до¬ стигается включением в текст программы перед основным цик¬ лом следующей единственной строки: 320 Х(5) = X (1): Y(5) = Y(l): REM ОПЕРАТОРЫ, УПРОЩАЮЩИЕ СТРУКТУРУ ОСНОВНОГО FOR.i4 NEXT ЦИКЛА 2. В конце рассматриваемой процедуры значения координат следующего положения мух присваиваются переменным, пред¬ Рис. 7.22. назначенным для хранения текущих значений координат. Этот прием позволяет выполнять эту процедуру вновь и вновь, мо¬ делируя движение мух.
84 Глава 1 Читателю следует попытаться самостоятельно завершить составление программы. При возникновении затруднений мож¬ но обратиться к программе 7.1, помещенной в приложении. На рис. 7.21 показано изображение, формируемое на экране дисплея при выполнении этой программы. Формирование узора на экране дисплея Две небольшие модификации рассмотренной выше программы позволяют получить на экране дисплея изображение, представ¬ ленное на рис. 7.22. Узор вряд ли имеет какое-либо практиче¬ ское применение, однако производит приятное впечатление. Рассмотрим изменения программы 7.1, позволяющие фор¬ мировать на экране подобный узор. 1. Необходимо удлинить отрезок прямой линии, определя¬ ющий величину дискретного смещения мухи при каждом сле¬ дующем повторении цикла ее движения. Строки 340 и 350 про¬ граммы 7.1 подлежат замене на строки 340 NX(I) = Х(1) + .1 * (Х(1 + 1) — Х(1)) 350 NY(I) = Y(I) + .1 * (Y(I + 1) — Y(I)) 2. При построении на экране каждого отрезка, соответст¬ вующего перемещению мухи, необходимо продолжить его до точки, в которой в данный момент находится муха, за которой ’’гонится” данная. Это достигается заменой строки 380 про¬ граммы 7.1 на строку 380 HPLOT FN Х(Х(1)), FN Y(Y(I)) ТО FN Х(Х(1 + 1)), FN Y(Y(I + 1)) Читателю следует попытаться осуществить описанные мо¬ дификации программы 7.1 самостоятельно. Можно также попы¬ таться формировать на экране и другие узоры. Интересным представляется, например, изображение траекторий трех мух, которые пытаются догнать друг друга, начиная движение из вершин треугольника.
2 НЕСКОЛЬКО РЕКОМЕНДАЦИЙ ПО НАПИСАНИЮ И ОТЛАДКЕ ПРОГРАММ Документирование программы Этот раздел следовало бы озаглавить ’’Перед тем как вы начнете работу над программой, после того как ее закончите, а также в процессе работы над ней”. Нередко под документиро¬ ванием программы понимают ее описание с целью хранения в форме файла, а также для облегчения ее понимания будущими пользователями. В действительности же документирование про¬ граммы может оказаться очень полезным в процессе ее написа¬ ния и отладки. Первой составной частью документирования программы яв¬ ляется описание того, что она выполняет, какие исходные дан¬ ные ей требуются и что представляют собой результаты ее вы¬ полнения. Если ожидаемые результаты программы не триви¬ альны по форме представления (например, это графики и срав¬ нительно сложные изображения на экране дисплея, подобные календарю в задаче 14), приступая к работе над программой, безусловно целесообразно описать форму представления ре¬ зультатов. Вторая составная часть документирования программы — описание процесса выполнения ею поставленной задачи. Во всех случаях, которые представляются неординарными или могут вызвать затруднения в формулировке предлагаемых решений, следует описывать алгоритм решения не только гра¬ фически, но и словесно. Это рекомендуется дополнять соот¬ ветствующими комментариями при записи текста программы. Наконец, целесообразно составить список имен используемых переменных с указанием их функционального назначения. Организация программы Программа с хорошо организованной структурой обычно •легко читается, она проще в отладке и требует меньше машин¬ ного времени по сравнению с плохо организованной программой. Важнейшим показателем степени организованности программы является тщательность разработки алгоритма ее функциони¬ рования (наличие схем алгоритмов, их описания и т. д.), при¬
85 Глава 2 чем его разработка должна быть закончена прежде, чем вы приступаете к фактическому написанию текста программы. Кроме того, полезно знание некоторых основных правил струк¬ турирования программы. А. Инициализация: ’’холодный” и ’’горячий” пуск Рассмотрим приводимую ниже программу, выполняющую ввод списка фамилий студентов и перечня полученных ими эк¬ заменационных оценок, вычисление показателя средней успе¬ ваемости (среднеарифметической оценки) и вывод результатов в форме списка фамилий студентов, получивших оценки выше средней. 100 DIM NM$(100),SC(100) по т = о 120 INPUT ’’УКАЖИТЕ ЧИСЛО СТУДЕНТОВ” 130 IF N > 100 THEN PRINT ’’ЧИСЛО СТУДЕНТОВ НЕ ДОЛЖНО БЫТЬ БОЛЬШЕ 100”; GOTO 120 140 FOR К = 1 ТО N 150 PRINT: INPUT ’’ВВЕДИТЕ ИМЯ СТУДЕНТА”; NMg(K) 160 INPUT ’’ВВЕДИТЕ ЭКЗАМЕНАЦИОННУЮ ОЦЕНКУ”; SC(K) 170 Т = Т + SC(K) 180 NEXT К 190 AVG = Т / N 200 PRINT : PRINT ’’СРЕДНЕЕ АРИФМЕТИЧЕСКОЕ ОЦЕНОК РАВНО”; AVG 210 PRINT : PRINT ’’СТУДЕНТЫ, ПОЛУЧИВШИЕ ОЦЕНКИ ВЫШЕ, СРЕДНЕГО;” 220 FOR К = 1 ТО N 230 IF SC(K) > = AVG THEN PRINT NM$(K) 240 NEXT К 250 PRINT: PRINT ’’МОЖНО ВВОДИТЬ НОВЫЙ СПИСОК СТУДЕНТОВ”: GOTO ПО Эту программу можно использовать для обработки серии указанных выше списков. При первом пуске программы ее вы¬ полнение начинается с оператора в строке 100. Такое выпол¬ нение программы можно условно назвать ’’холодным” пуском. Для обработки последующих списков фамилий студентов и соответствующих списков экзаменационных оценок управление передается оператору в строке 110 (посредством оператора без¬ условной передачи управления GO ТО 110 в строке 250). По¬ добное (повторное) выполнение программы можно условно назвать ’’горячим” пуском. Термины ’’холодный” и ’’горячий” пуск программы характеризуют этап ее работы, именуемый инициализацией, В первичной инициализации программы (’’хо¬ лодный” пуск) среди прочих участвуют операторы, выполняемые в процессе работы программы только один раз. К ним отно¬ сятся такие операторы, как DIM (описание массивов), DEF FN (определение функций), Р1=3.1 415 297 (определение кон¬
Несколько рекомендаций по написанию и отладке программ 87 стант) и т. д. В повторной инициализации программы („горячий”' пуск) используются операторы, которые необходимо выпол¬ нять при каждом пуске программы. Примером может служить оператор в строке НО. Если при повторном пуске программы его не выполнить, то сумма всех экзаменационных оценок пре¬ дыдущего списка студентов окажется добавленной к формиру¬ емой сумме оценок студентов текущего (обрабатываемого) спи¬ ска. Необходимо уделять особое внимание процессу „горячего’* пуска программы. Если в приводимом выше примере проверку работоспособности программы проводить по результату обра¬ ботки первого списка студентов, не будет обнаружена ошибка, вызываемая пропуском оператора в строке ПО при повторном „горячем” пуске программы. В программе с хорошо организо¬ ванной структурой за процедурой „холодного” пуска непосред¬ ственно следует процедура „горячего” пуска. Б. Подпрограммы Большинство программистов предпочитает все подпрограммы, используемые в данной программе, располагать в каком-нибудь одном ее месте. Автор размещает их в конце книги. Некоторые программисты располагают их в начале. В любом случае реко¬ мендуется придерживаться одного и того же правила разме¬ щения подпрограмм, тогда их легко найти в программе. Итак, структуру хорошо организованной программы можно пред¬ ставить следующим рисунком: Инициа¬ лизация Отладка программы Наиболее важным условием успешного проведения процесса отладки является наличие хорошо спланированной, организо¬ ванной и документированной программы. За усилия, потрачен¬
^88 Глава 2 ные на планирование программы, составление схемы ее алго¬ ритма и запись перечня переменных с указанием их функцио¬ нального назначения, программист, как правило, бывает воз¬ награжден более быстрым проведением процесса отладки. Отладка программ может вызывать не только чувства раз¬ дражения и досады, но и ощущения развлечения и забавы. Ав¬ тор книги всегда чувствует себя немного Шерлоком Холмсом, когда прослеживает шаг за шагом те операции, которые при¬ водят в результате к ошибкам. При этом важно отметить, что у программиста имеется одно важное преимущество по срав¬ нению с детективом-криминалистом: пользователь ЭВМ может заставить своих ’’преступников” повторить их преступления, еще раз ’’оставляя отпечатки пальцев” и даже делая паузы в процессе совершения преступления. Это может оказаться осо¬ бенно полезным при отладке больших программ. Рассмотрим приводимую ниже программу и первый этап ее отладки (первую проверку с целью выявления возможных юо т = о НО INPUT ’’ВВЕДИТЕ N”; N 120 FOR К = 1 ТО N 130 Х0 = К * К 140 Т == Т + Х0 150 NEXT К 160 PRINT ’’СУММА РАВНА”; Т ]RUN ВВЕДИТЕ N 10 СУММА РАВНА 0 ошибок)'. Программа предназначена для вычисления суммы вида 12+22+32+. . .+N2. При N=10 значение искомой суммы составляет 1+4+9+. . . + 100=385. Однако результат работы программы при N = 10 равен 0. Следовательно, в программе ошибка! Чтобы найти эту ошибку, в программу можно включить операторы вывода на печать промежуточных результатов. На¬ пример, можно воспользоваться операторами 135 PRINT ”Х0 = Х0 145 PRINT ”Т=”; Т Если попытаться выполнить такую программу 100 Т = 0 по INPUT ’’ВВЕДИТЕ N”; N 120 FOR К = 1 ТО N 130 Х0 = К * К 135 PRINT ”Х0 = Х0 140 т = т + ХО 145 PRINT ”Т = ”; Т 150 NEXT К 160 PRINT ’’СУММА РАВНА”; Т
Несколько рекомендаций по написанию и отладке программ 89 то результаты ее работы предстанут в следующем виде: JRUN ВВЕДИТЕ N 10 Х0 = 1 Т = 0 ХО = 4 Т = 0 ХО = 9 Т = 0 Х0 = 16 Т = 0 Х0 = 25 Т = О ХО = 36 т = О ХО = 49 т = О ХО = 64 Т = О ХО = 81 Т = О ХО = 100 т = о СУММА РАВНА О Полученное позволяет локализовать ошибку. В самом деле, цикл FOR. . .NEXT выполняется корректно, оператор в строке 130 правильно вычисляет К2 и единственным возможным ис¬ точником ошибки является оператор в строке 140, вычисляющий значение Т. Анализируя этот оператор, можно заметить, что в строке 130 определяется значение переменной Х0=К*К, а в строке 140 при вычислении Т=Т+ХО используется перемен¬ ная ХО 1}. Отметим, что при отладке программ, содержащих много опе¬ раторов или выполняющих много сложных операций, вывод промежуточных результатов на печать может оказаться слишком нерациональным и даже дорогостоящим решением. Достоверность работоспособности программы Одной из наиболее трудных проблем программирования является установление факта корректного, достоверного реше¬ ния задачи, выполняемого на ЭВМ. Именно трудностями в подтверждении факта достоверности требуемой работоспособ- В строке 130 имя переменной составлено из буквы ”Х” и цифры ”0”, а в строке 140 — из букв”Х” и ”0”. Кроме того, следует помнить, что при программировании ЭВМ типа Apple на языке Бейсик исходные значения всех переменных, используемых в программе, равны нулю.— Прим. pedt
Глава 2 ?0 ности программ объясняется наличие в настоящее время боль¬ шого количества программ, предоставляемых в распоряжение пользователям, однако не выполняющих ожидаемых от них функций. В таких программах обычно отсутствуют ошибки, не дающие о себе знать при рутинном использовании программы, однако имеются ошибки, выявляющиеся в экстраординарных обстоятельствах. Неоспоримым требованием является тщательная- проверка разрабатываемой программы. Необходимо убедиться, что функ¬ ционирование каждой части программы проходит корректно при любых возможных условиях. Следует обязательно выпол¬ нить программу с теми исходными данными, которые можно использовать для аналогичных вычислений вручную. Напри¬ мер, предположим, что требуется найти сумму первых 100 не¬ четных чисел, а именно: 1+3+. . . + 199. Для этого можно использовать следующую программу: 100 FOR к = 1 то 100 ПО Т = Т + 2* К+1 120 NEXT К 130 PRINT Т ]RUN 10 200 Приведенный результат (10 200) представляется правдоподоб¬ ным, но верен ли он? Трудно выполнить проверку этого резуль¬ тата вручную. Однако можно рекомендовать проверку кор¬ ректности работы программы, воспользовавшись следующей модификацией ее исходного текста: 90 INPUT ’’ВВЕДИТЕ N”; N 100 FOR К = 1 ТО N НО Т = Т + 2 * К +1 120 NEXT К 130 PRINT Т Эта программа позволяет складывать любые первые N нечет¬ ных чисел, а значит, и такое количество, которое легко сумми¬ руется вручную. При N=5 искомая сумма 1 +3+5+7+9=25. Сопоставим этот результат с решением этой же задачи на ЭВМ. JRUN ВВЕДИТЕ N 35 Результат выполнения программы равен 35. В программе ошиб¬ ка! Может ли читатель найти ее? Ниже приводится исправлен¬ ный текст последнего варианта программы, а также результаты ее пуска при N=5 и N=100. 90 INPUT ’’ВВЕДИТЕ N”; N 100 FOR К = 1 ТО N 110 Т = Т + 2*К — 1
Несколько рекомендаций по написанию и оТладкё программ 91 120 NEXT К 130 PRINT Т □ RUN ВВЕДИТЕ N 5 25 □ RUN ВВЕДИТЕ N 100 10 000 Операторы РЕЕК и РОКЕ Вычислительные машины содержат в памяти различные программы, написанные на машинном языке. Ряд таких программ участвует в выполнении программы пользователя. Чтобы про* граммист мог самостоятельно подключать программы, написан¬ ные на машинном языке и хранящиеся в памяти ЭВМ, необхо¬ димы средства взаимосвязи подобных программных модулей, обеспечивающие требуемые коммуникации между ними. Одним из способов „общения” таких модулей является запись сооб¬ щений в оперативную память. Сообщение может быть ’’остав¬ лено” в ней посредством оператора РОКЕ и ’’прочитано” с помощью функции РЕЕК. Оператор CALL Программное обеспечение ЭВМ типа Apple позволяет по¬ средством оператора CALL использовать подпрограммы, напи¬ санные на машинном языке. Так оператор CALL 1234 вызывает выполнение подпрограммы, представляющей собой процедуру из машинных команд и расположенную в области памяти с начальным адресом 1234. В руководстве по программированию на языке Бейсик ЭВМ типа Apple (Applesoft II BASIC Pro* gramming Reference Manual) приведено описание операторов CALL, используемых для вызова подобных подпрограмм, вы¬ полняющих типовые процедурых). Программист, владеющий машинным языком, может присоединять к программе на языке Бейсик свои подпрограммы, написанные на машинном языке, с помощью операторов РОКЕ и CALL. Ниже приводятся два примера подобного использования указанных подпрограмм. 1} Например, с помощью оператора CALL-922 можно обратиться я подпрограмме, реализующей при работе устройства воспроизведения ин¬ формации (например, дисплея) процедуру перехода на следующую строку,— Прим. ред.
92 Глава 2 400 REM ЗВУК ЛАЗЕРА 410 REM 420 POKE 768,162:REM ИЗВЛЕЧЕНИЕ ИЗ ОПЕРАТИВНОЙ ПАМЯТИ МАШИННЫХ КОМАНД 430 РОКЕ 769,255 440 РОКЕ 770,173 450 РОКЕ 771,48 460 РОКЕ 772,192 470 РОКЕ 773,138 480 РОКЕ 774,168 490 РОКЕ 775,136 500 РОКЕ 776,208 510 РОКЕ 777,253 520 РОКЕ 778,202 530 РОКЕ 779,208 540 РОКЕ 780,245 550 РОКЕ 781,96: REM КОНЕЦ НАБОРА МАШИННЫХ КОМАНД 560. REM 570 FOR I = 1 ТО 10 580 CALL 768 590 FOR J = 1 ТО 1000: NEXT J 600 NEXT I 100 REM ЗВУКОВОЙ ТОН ПРОИЗВОЛЬНО ВЫБИРАЕМОЙ ВЫСОТЫ 110 REM 120 POKE 782,162: REM СТРОКИ 120 —250 СОДЕРЖАТ ОПЕРАТОРЫ, ИЗВЛЕКАЮЩИЕ ИЗ ОПЕРАТИВНОЙ ПАМЯТИ МАШИННЫЕ КОМАНДЫ 130 РОКЕ 783,255 140 РОКЕ 784,173 150 РОКЕ 785,48 160 РОКЕ 786,192 170 РОКЕ 787,160 180 РОКЕ 788,255 190 РОКЕ 789,136 200 РОКЕ 790,208 210 РОКЕ 791,253 220 РОКЕ 792,202 230 РОКЕ 793,208 240 РОКЕ 794,245 250 РОКЕ 795,96: REM КОНЕЦ НАБОРА МАШИННЫХ КОМАНД 260 REM 270 Р = 128 + INT(128 * RND(l)) 280 POKE 788,Р: REM НАЧАЛЬНАЯ УСТАНОВКА ЗВУКОВОГО ТОНА 290 CALL 782: REM ВЫЗОВ ПРОЦЕДУРЫ МАШИННЫХ КОМАНД ГЕНЕРАЦИИ ТОНА 300 Р = 1 + INT(300 » RND(l)): REM СЛУЧАЙНЫЙ ВЫБОР ВЫСОТЫ ТОНА 310 FOR I = 1 ТО Р: NEXT I: REM ЦИКЛ ЗАДЕРЖКИ ПО ВРЕМЕНИ СЛУЧАЙНОЙ ДЛИТЕЛЬНОСТИ 320 GOTO 270 В каждой из этих программ операторы РОКЕ осуществляют ввод в оперативную память ЭВМ процедуры на машинном языке. Поясним назначения обеих программ.
Несколько рекомендаций по написанию и отладке программ 93 Программа 1. Звук лазера Подпрограмма, написанная на машинном языке, генерирует звуковой сигнал, подобный используемому в играх с ’’лазером”. Оператор CALL 768, предоставляемый в распоряжение програм¬ миста программным обеспечением Applesoft, осуществляет вы¬ зов процедуры, составленной из машинных команд, которая генерирует звуковой сигнал. В данной программе звуковой сигнал повторяется десятикратно. Программа 2. Звуковой тон произвольно выбираемой высоты Подпрограмма, написанная на машинном языке, генерирует звуковой тон, высота которого определяется содержимым об¬ ласти оперативной памяти с адресом 788. В этой области раз¬ мером 1 байт содержится целое число, принадлежащее диапа¬ зону значений 0—255. Если это число равно 0, то генерируется продолжительный очень низкий тон. Если указанное число принадлежит диапазону 1—255, то подпрограмма создает ко¬ роткие высокие тона при небольших значениях числа и долгие низкие тона при больших значениях. Для вызова подпрограммы используется оператор CALL 782. Приведенная выше программа генерирует серии случайных по составу и высоте звучания тонов (с помощью оператора РОКЕ, извлекающего из области памяти с адресом 788 случай¬ ное число в диапазоне 128—255), причем случайный характер носят и паузы между этими сериями. Трудновыявляемые типовые ошибки А. Ошибки округления Объем памяти вычислительной машины ограничен. Это яв¬ ляется одной из причин ограниченных размеров области па¬ мяти, предоставляемой для размещения одного числа. В ЭВМ типа Apple дробь 1/3 может быть представлена в виде 0,3333 либо 0,333 333, либо 0,3 333 333 333. Однако ни одно из этих чисел точно не равно 1/3. Эта проблема усложняется еще и тем, что внутри ЭВМ числа представляются в двоичной системе счисления, и поэтому программист часто даже может и не осо¬ знавать, что какое-то конкретное число представлено несколько неточно. Например, дробь 1/5 точно представляется в десятич¬ ной системе счисления как 0,2, а в двоичной системе как 0,0011 001 100110 011... . Поэтому при вычислении значения Дроби 1/5 в ЭВМ необходимо выполнить округление результата.
94 Глава 2 Ошибки округления могут создавать определенные про- блемы. Рассмотрим две приводимые ниже программы с соот¬ ветствующими результатами их выполнения. 100 FOR К = 1 ТО 25 110 А = К * (1/К) 120 PRINT ”К = К;” К * (1/К) = А; 130 НТАВ 30 140 IF А = 1 THEN PRINT ”ДА” 150 IF А < > 1 THEN PRINT ’’НЕТ” 160 NEXT К J RUN К = 1 К * (1/К) = 1 ДА К = 2 К * (1/К) = 1 ДА К = з К * (1/К) = 1 ДА К = 4 К * (1/К) = 1 ДА К = 5 К * (1/К) = 1 ДА К = 6 К * (1/К) == 1 ДА К = 7 К* (1/К) = 1 ДА К = 8 К * (1/К) = 1 ДА К = 9 К * (1/К) = 1 ДА К = ю К * (1/К) = 1 ДА К = 11 К * (1/К) = 1 НЕТ К = 12 К * (1/К) = 1 ДА К = 13 К * (1/К) = 1 ДА К = 14 К * (1/К) = 1 ДА К = 15 К * (1/К) = 1 ДА К = 16 К * (1/К) = 1 ДА К = 17 К * (1/К) = 1 ДА К = 18 К * (1/К) = 1 ДА К = 19 К * (1/К) = 1 ДА К = 20 К * (1/К) = 1 ДА К = 21 К * (1/К) = 1 ДА К = 22 К * (1/К) = 1 НЕТ К = 23 К * (1/К) = 1 ДА К = 24 К * (1/К) = 1 ДА К = 25 к * (1/К) = 1 НЕТ 100 FOR X = 1 ТО 3 STEP 1/5 110 PRINT X 120 NEXT X 999 END □ RUN 1 1.2 1.4 1.6 1.8 2 2.2 2.4 2.6 2.8 Работа с этими программами может оказаться настоящим ^кошмаром” для пользователя. В первой программе вычисли-
Несколько рекомендаций по написанию И отладке программ 95 ются значения выражения Л*(1/К) при Л=1, 2, 3, . . ., 25. Эти значения выводятся в виде цифры 1 (как результат умно¬ жения целого числа на обратное ему). Однако программой предусматривается также вывод слова ”ДА”, если Д*(1/К) = 1, и слова ’’НЕТ” в противоположном случае. Согласно приведен¬ ным выше результатам выполнения этой программы, при /С равном 11, 22 и 25 выводится слово ’’НЕТ”. Причиной этого является появление ошибок округления. Поясним это утверж¬ дение примером вычисления значения выражения 3*(1/3) с точностью до восьми цифр после запятой. В соответствии g этим условием 1/3=0,33 333 333, а 3* (1/3)=0,99 999 999. Сле¬ довательно, 3* (1/3)=т^= 1. То же самое происходит при выпол¬ нении вычислительной машиной операций двоичной арифме¬ тики при определении значения выражений 11*(1/11), 22*(1/22) и 25* (1/25). Однако естественно возникновение вопроса: по¬ чему ЭВМ выводит цифру 1 в качестве результата вычисления выражения 11* (1/11)? Объяснение этого факта следует искать в особенностях работы процедуры вывода, инициируемой опе¬ ратором PRINT, а именно: эта процедура самостоятельно вы¬ полняет определенные операции округления выводимых чис¬ ловых данных. Однако результаты подобных округлений, как видно из данного примера, труднопредсказуемы, что в свою очередь может приводить к непредвиденным последствиям. Вторая из рассматриваемых программ короче и по внешнему виду проще, ожидаемые результаты ее работы имеют вид: 1 1.2 1.4 1.6 1.8 2 2.2 2.4 2.6 2.8 3 Так, выполнение цикла FOR. . .NEXT прекращается перед выводом цифры 3, являющейся верхним пределом значений параметра цикла. И снова перед нами проблемы, вызываемые ошибками округления. Следует помнить, что выполнение опе¬ раций цикла FOR. . .NEXT повторяется до тех пор, пока зна¬ чение параметра цикла меньше или равно верхнему пределу. Например, выполнение программы 100 FOR к = I ТО 8 STEP 2 НО PRINT К 120 NEXT К 999 END
96 Глава 2 3 RUN 1 3 5 7 прекращается после /<=7, поскольку на следующем шаге К=* =7+2=9, т. е. больше значения верхнего предела, равного 8. Это же происходит при выполнении второй из приведенных выше программ из-за ошибки округления. Значение дроби 1/5 в двоичной системе счисления нельзя представить' точно, и поэтому в машине выполняется округление, причем в сторону увеличения (до ближайшей большей величины). В результате сумма 2,8+1/5 оказывается больше 3 и выполнение цикла пре¬ кращается. Подводя итоги анализа ошибок округления обеих программ, можно сделать вывод, что в подобных ситуациях ЭВМ ведет себя как ’’близорукий собиратель битов (двоичных цифр)”, доставляя неопытному программисту вычислительной машины немало хлопот. Б. Ошибки, порождаемые дефицитом оперативной памяти Оперативная память персональной ЭВМ служит для хра¬ нения разнообразной информации: программы пользователя, перечня переменных, так называемой карты битов при исполь¬ зовании графических средств в режиме высокой разрешающей способности и т. д. Иногда возможны конфликтные ситуации между подобными ’’пользователями” оперативной памятью в случае ее нехватки (дефицита). Наиболее вероятны такие си¬ туации при работе с большими программами (или такими, в которых много переменных). В этих случаях использование дисплея в режиме высокой разрешающей способности экрана может привести к разрушению части программы пользователя или некоторых переменных этой программы. Следствием этого может быть непредсказуемое ’’поведение” программы в процессе выполнения. Если возникает подозрение, что нечто подобное происходит с программой пользователя, ему можно рекомен¬ довать включение в программу оператора LOMEM (см. допол¬ нение ’’Неформальное описание основ языка программирования Бейсик ЭВМ Apple II”). В. Ошибки некорректного использования одного и того же имени для различных переменных Чаще всего такие ошибки возникают по следующим причи¬ нам: 1) хотя имена переменных (например, JK1 и JK2) и пред¬ ставляются программисту различными, согласно правилам языка
Несколько рекомендаций по написанию и отладке программ 97 (Бейсик Applesoft II), они одинаковы, поскольку идентификация переменных ведется по первым двум буквам имени; 2) в программе и подпрограмме используются переменные с одинаковыми именами; 3) дополняя текст программы, ее разработчик использует имя существующей переменной для обозначения новой пере¬ менной. Г. Ошибки из-за невыполнения инициализации значений переменных Первоначально при пуске программы значения всех пере¬ менных равны нулю. Это используется, например, при написании текста программы вычисления суммы lfe+2^+3/e+4fe+5ft. 100 PRINT : INPUT К 110 FOR N = 1 ТО 5 120 SUM = SUM + N * К 130 NEXT N 140 PRINT SUM 150 GOTO 100 □ RUN ?2 55 ?3 280 Первое выполнение всех операторов программы осуществ¬ ляется корректно, поскольку исходное значение переменной SUM равно нулю. Однако результат их повторного выполнения ошибочен (сумма 13+23+З3+43+53 реально составляет 225), поскольку перед началом выполнения цикла FOR. . .NEXT значение переменной SUM равно 55, а не 0, как этого требует алгоритм решения задачи. Подобные ошибки особенно непри¬ ятны, так как не ’’дают о себе знать” при первом выполнении операторов программы. 4 ЛЪ 989
3 ЗАКОНЫ случайных событии Случай играет значительную роль в нашей жизни. Законы вероятности действуют подчас очень странным и удивительным образом. Эффективным средством изучения законов теории вероятностей и случайных событий являются вычислительные машины, и, в частности, персональные ЭВМ. Данная глава содержит пять задач по теории вероятностей. Если читатель не является специалистом в этой области, некоторые резуль¬ таты, полученные в приведенных задачах, могут показаться ему весьма неожиданными (например, результат опыта 3 за¬ дачи 10). Знания, полученные в данной главе, могут оказаться по¬ лезными для тех, кто хочет глубже разобраться в закономер¬ ностях случайных событий, а также в множестве ситуаций, в которых велика роль случая. Ниже приводится краткая ха* рактеристика рассматриваемых в данной главе задач. Задача 8. Бросание монеты. Вероятно, это наиболее типич¬ ная форма испытания случая. Большинство из нас очень часто прибегает к помощи монеты, чтобы сделать выбор между двумя возможностями. В данной задаче исследуются основные ста¬ тистические свойства случайных событий, каковыми являются результаты бросания моменты. Для решения этой задачи не требуется никаких предварительных специфических сведений. Задача 9. Вычисление факториалов. Численное значение записи вида 4! (читается ’’четыре факториал”), согласно опре¬ делению факториала, равно 1x2x3x4=24. Значение 10! равно 1 Х2Х... X 10=3 628 800. В общем случае значение записи вида N\ определяется как 1х2х. . .XN. Факториалы играют важную роль в теории вероятностей. Данная задача хороша еще и тем, что может быть решена и на калькуляторе, и по¬ этому читатель может обратиться к ней, когда вычислительная машина по какой-либо причине ему недоступна. Единственной предпосылкой успешного решения данной задачи являются знания, полученные читателем в результате решения задачи 8. Задача 10. Одномерные случайные блуждания. Термин ’’слу¬ чайные блуждания” используется в теории вероятностей для обозначения поведения объектов, движущихся по случайным
Законы случайных событий 99 законам. Такие ’’случайные блуждания” встречаются весьма часто, и поэтому их изучение имеет большое значение. Напри¬ мер, теория случайных блужданий используется для предска¬ зания возможных результатов игр, в основу которых положены те или иные закономерности случайных событий. Данная за¬ дача сводится к исследованию одномерных случайных блуж¬ даний. Решив ее, читатель узнает довольно удивительные факты о подобных играх. Знакомство с методикой решения задачи 8 и ее результатами может оказаться полезным, но не обязательно для решения данной задачи. Задача 11. Двумерные случайные блуждания. Условия и методика решения этой задачи являются развитием условий и методики решения задачи 10. Задача 12., Проверка статистических гипотез. Статистиче¬ ские закономерности играют значительную роль в нашей жизни. Они являются важным средством диагностики различных за¬ болеваний и определения эффективности методов их лечения. Статистика используется в юриспруденции для установления доказательств виновности или невиновности обвиняемых. Дан¬ ная задача посвящена статистическим методам определения степени достоверности данных. Для ее успешного решения не¬ обходимы сведения, полученные при решении задач 8 и 9. Задача 8. Бросание монеты Назначение разрабатываемой программы: изучение статистики результатов бросания монеты (например, какова вероятность того, что при 10-кратном бросании монеты 5 раз выпадет ’’орел” и 5 раз ’’решка”). Специфические предпосылки успешной разработки: отсутст¬ вуют J). Пояснения программисту: решение этой задачи не слишком сложно и включает в себя несколько коротких программ. Каждый из нас ’’знает”, что если бросать монету 10 раз, то следует ожидать, что 5 раз выпадет орел (О) и 5 раз — решка (Р). Безусловно, мы не слишком удивимся, если орел выпадет 4 раза, а решка — 6 раз. Но если орел выпадет все 10 раз, мы начнем подозревать что-то неладное. Целью данной задачи является исследование закономерностей этих событий. Рас¬ смотрим три подхода к оценке возможных результатов этих событий. Х) Начиная с этой задачи предполагается, что читатель знаком с тех¬ никой программирования, изложенной в гл. 1< 4*
100 Главе 3 1. Метод статистического моделирования» С помощью ЭВМ можно очень просто имитировать процесс бросания десяти монет. Таким путем можно быстро провести 103 и даже 104экс- периментов и выяснить их результаты. 2. Метод прямых вычислений (метод ”грубой силы”). Можно методично выписать полный список возможных исходов. На¬ пример, если бросать монету 3 раза, то получим 8 следующих равновероятных исходов: Первое бросание I р р р р о о о о Второе бросание I р р о о р р о о Т ретье бросание I р о р о р о р о Анализируя данные восемь различных исходов троекратного бросания монеты, можно заметить следующее: три орла выпадают 1 раз, что составляет 1/8 от общего числа возможных исходов, два орла'выпадают 3 раза, т. е. 3/8 от общего числа возмож¬ ных исходов, один орел выпадает 3 раза, т. е. 3/8 от общего числа возмож¬ ных исходов, нуль орлов выпадает один раз, что составляет 1/8 от об¬ щего числа исходов. При бросании монеты 10 раз полный список возможных комбинаций насчитывает 1024 различных исхода, и поэтому метод прямых вычислений (недаром называемый методом ’’гру¬ бой силы”) слишком утомителен для подсчета результатов по¬ добных экспериментов. Однако это достаточно просто осущест¬ вить с помощью вычислительной машины. 3. Теоретические методы. В данной задаче рассматривается несколько теоретических подходов к предсказанию результа¬ тов опытов по бросанию монет. Эти методы гораздо более эф¬ фективны, чем метод прямых вычислений. Метод статического моделирования Введем следующие условные обозначения: 0, если резуль¬ татом бросания монеты является решка; 1, если результат бросания — орел. Например, в результате выполнения опе¬ ратора F = 1NT(2 * RND(l))
Законы случайных событий 101 переменной F присваивается значение 0 или 1 с равной вероят¬ ностью. Так просто решается задача моделирования на ЭВМ процесса бросания монеты. Если Fl, F2, F3 — результаты подобного троекратного ’’бросания монеты” Fl = INT (2 * RND (1)) F2 = INT (2 * RND (1)) F3 = INT (2 * RND (1)) то число выпаданий орла составляет сумму F1+F2+F3. Задачу бросания монеты 10 раз и подсчет, числа выпаданий орла можно выполнить с помощью следующей короткой программы:- 110 СТ = 0 НО FOR I = J ТО 10 120 СТ = СТ + INT (2 * RND (1)) 130 NEXT I 140 PRINT СТ Испытайте ее работоспособность. Выполните на ЭВМ программу 20 раз, а результаты сведите в таблицу следующего вида: Число возможных Число реальных выпаданий выпаданий орла из 10 орла из 10 бросаний монеты бросаний монеты (по результатам 20 опытов) 0 0 1 0 2 0 3 2 4 4 5 8 6 3 7 2 8 1 9 0 10 0 Очевидно, проще использовать ЭВМ для подсчета этих сумм. Для хранения полученных результатов введем 11 пере¬ менных, обозначив их /7(0), /7(1), . . Н (10). При помощи оператора Н (СТ) = Н (СТ) + 1 будем добавлять 1 к соответствующей сумме. Теперь необхо¬ димо написать программу бросания десяти монет 1000 раз, которая вела бы соответствующие подсчеты и осуществляла вывод (регистрацию) текущих результатов. (Если это кажется затруднительным, обратитесь к программе 8.1 приложения.)’ Результаты выполнения программы, написанной читателем, могут несколько отличаться от приводимых ниже результатов выполнения программы 8.1
102 Глава 3 0 орлов выпало 2 раза 1 орел выпал 7 раз 2 орла выпали 40 раз 3 орла выпали 122 раза 4 орла выпали 191 раз 5 орлов выпали 262 раза 6 орлов выпали 206 раз 7 орлов выпали 111 раз 8 орлов выпали 49 раз 9 орлов выпали 9 раз 10 орлов выпали 1 раз Применение ЭВМ для проведения многочисленных подобных экспериментов может оказаться очень эффективным при изучении основ теории вероятностей и математической статистики. По¬ добное моделирование физических процессов и явлений широко используется в физике, экономике и многих других областях знаний. Дополнительные задания 1. Определите частоту появления 2, 3, 4, . . 12 очков при бросании двух игральных костей. Напишите программу, ими¬ тирующую 1000-кратное бросание двух игральных костей (ку¬ биков) с шестью гранями, которая ведет подсчет и выводит количество очков, регистрируемых при одновременном бросании двух игральных костей (2, 3, 4, . . 12 очков). В помощь начинающему программисту: для моделирования на ЭВМ процесса бросания двух игральных костей, имеющих 6 граней, с одновременным подсчетом ’’выпадающих” очков достаточно воспользоваться оператором Т = INT(1 + 6 * RND(l)) + INT (1 + 6 * RND(l)) который существенно отличается от оператора Т = 2 * INT(1 + 6 * RND(l)) имитирующего бросание одной кости с последующим удвоением полученных результатов. 2. Выполните предыдущее задание для трех игральных костей (представляет особый интерес для играющих в игру «Дра¬ коны и клетки”). Метод прямых вычислений При бросании монеты 10 раз существует 1024 (210)' различных комбинаций. После первого бросания может выпасть 0 или I (решка или орел), после второго — также 0 или 1 и т. д. С по¬ мощью ЭВМ можно систематично перебрать все возможные
Законы случайных событий 103 уации, используя 10 циклов типа FOR...NEXT следующим азом: DIM Н (10) : REM Н (СТ) — СЧЕТЧИК ЧИСЛА 10-КРАТНЫХ БРОСАНИЙ МОНЕТЫ С ВЫПАДАНИЕМ ОРЛА. СТ РАЗ FOR T1 = 0 TO 1 FOR T2 = 0 TO 1 FOR T3 = 0 TO 1 FOR T4 = 0 TO 1 FOR T5 = 0 TO 1 FOR T6 = 0 TO 1 FOR T7 = 0 TO 1 FOR T8 = 0 TO 1 FOR T9 = 0 TO 1 FOR TO = 0 TO 1 СТ = Т1 + Т2 + ТЗ + Т4 + Т5 + Тб + Т7 + Т8 + T9 + ТО Н (СТ) = Н (СТ) + 1 NEXT : NEXT : NEXT: NEXT : NEXT : NEXT : NEXT : NEXT : NEXT : NEXT FOR CT = 0 TO 10: REM ВЫВОД РЕЗУЛЬТАТОВ PRINT СТ; ’’ОРЛОВ ВЫПАЛО”; H (СТ); ’’РАЗ” NEXT СТ END дцествите пуск программы, и вы будете удивлены тем, что память вашей весьма не дешевой персональной ЭВМ ока- гся полностью использована столь короткой программой, ичина возникшей проблемы проста: программа содержит Бло¬ чные циклы FOR. . .NEXT с глубиной вложения, равной 10. залось бы, причина не в этом, поскольку, согласно ру- юдству по программированию на языке Бейсик ЭВМ Apple- 1 II, такая глубина вложения циклов допустима. Однако справедливо, если наиболее глубоко вложенный цикл не ержит никаких неординарных операций. Данная программа шостью использует ту часть оперативной памяти, которая едена под так называемый ’’стек”, и поэтому выдается со¬ ление об ошибке вида ’’OUT OF MEMORY” (’’ПЕРЕПОЛ¬ НИВ ПАМЯТИ”). Однако не стоит отчаиваться! При столкновении с трудной дчей используйте кредо математиков: найти более легкую дчу и решить ее вместо трудной! В данном случае весьма >сто найти более легкую задачу. Вместо программирования >сания монеты 10 раз, требующего 10 вложенных циклов R. . .NEXT, можно ограничиться бросанием монеты 9 раз, юрое реализует следующая программа: DIM Н (10) : REM Н (СТ) — СЧЕТЧИК ЧИСЛА 10-КРАТНЫХ БРОСАНИЙ МОНЕТЫ С ВЫПАДАНИЕМ ОРЛА СТ РАЗ FOR Т1 = 0 ТО 1 FOR Т2 = 0 ТО 1 FOR ТЗ = 0 ТО 1 FOR Т4 = 0 ТО 1 FOR Т5 = 0 ТО 1
104 Глава 3 160 FOR T6 = 0 TO 1 170 FOR T7 = 0 TO 1 180 FOR T8 = 0 TO 1 190 FOR T9 = 0 TO 1 200 СТ Т1 + Т2 + ТЗ + Т4 + Т5 + Тб + Т7 + Т8 + T9 210 Н (СТ) = Н (СТ) + 1 220 NEXT : NEXT : NEXT : NEXT : NEXT : NEXT : NEXT I NEXT : NEXT 230 PRINT : REM ПРОПУСК СТРОКИ 240 FOR CT = 0 TO 9 : REM ВЫВОД РЕЗУЛЬТАТОВ 250 PRINT СТ; ’’ОРЛОВ ВЫПАЛО”; H (СТ); ’’РАЗ” 260 NEXT CT 270 END □ RUN 0 ОРЛ. 1 ОРЛ. 2 ОРЛ. 3 ОРЛ. 4 ОРЛ. 5 ОРЛ. 6 ОРЛ. 7 ОРЛ. 8 ОРЛ. 9 ОРЛ. ВЫПАЛО ВЫПАЛО ВЫПАЛО ВЫПАЛО ВЫПАЛО ВЫПАЛО ВЫПАЛО ВЫПАЛО ВЫПАЛО ВЫПАЛО 1 РАЗ 9 РАЗ 36 РАЗ 84 РАЗ 126 РАЗ 126 РАЗ 84 РАЗ 36 РАЗ 9 РАЗ 1 РАЗ После решения более простой задачи можно снова вернуться к решению исходной задачи — десятикратному бросанию монеты. Пусть приведенные выше 9 вложенных циклов FOR. . .NEXT обеспечивают описание девятикратного бросания монеты. Что же касается двух возможных исходов десятого бросания монеты, то для его описания добавим несколько операторов внутрь наиболее глубоко вложенного цикла. 100 DIM Н(10) : REM Н(СТ) — СЧЕТЧИК ЧИСЛА 10-КРАТНЫХ БРОСАНИЙ МОНЕТЫ С ВЫПАДАНИЕМ ОРЛА СТ РАЗ 110 FOR Т1 = 0 ТО 1 120 FOR Т2 = 0 ТО 1 130 FOR ТЗ = 0 ТО 1 140 FOR Т4 = 0 ТО 1 150 FOR Т5 = 0 ТО 1 160 FOR Тб = 0 ТО 1 170 FOR Т7 = 0 ТО 1 180 FOR Т8 = 0 ТО 1 190 FOR T9 = 0 ТО 1 200 СТ = Т1 + Т2 + ТЗ + Т4 + Т5 + Тб + Т7 + Т8 + T9 : REM СТ — ЧИСЛО ВЫПАДАНИЙ ОРЛА, ЕСЛИ РЕЗУЛЬТАТ ДЕСЯТОГО БРОСАНИЯ — РЕШКА 210 Н(СТ) = Н(СТ) + 1 215 СТ = СТ + 1 : REM ТЕПЕРЬ СТ — ЧИСЛО ВЫПАДАНИЙ ОРЛА, ЕСЛИ РЕЗУЛЬТАТ ДЕСЯТОГО БРОСАНИЯ — ОРЕЛ 16 Н(СТ) = Н(СТ) + 1 220 NEXT : NEXT : NEXT : NEXT : NEXT 230 NEXT : NEXT : NEXT : NEXT 240 FOR CT = 0 TO 10: REM ВЫВОД РЕЗУЛЬТАТОВ
Законы случайных событий 105 250 PRINT СТ;” ОРЛ. ВЫПАЛО ”;Н(СТ);” РАЗ” 260 NEXT СТ 270 END JRUN 0 ОРЛ. ВЫПАЛО 1 РАЗ 1 ОРЛ. ВЫПАЛО 10 РАЗ 2 ОРЛ. ВЫПАЛО 45 РАЗ 3 ОРЛ. ВЫПАЛО 120 РАЗ 4 ОРЛ. ВЫПАЛО 210 РАЗ 5 ОРЛ. ВЫПАЛО 252 РАЗ 6 ОРЛ. ВЫПАЛО 210 РАЗ 7 ОРЛ. ВЫПАЛО 120 РАЗ 8 ОРЛ. ВЫПАЛО 45 РАЗ 9 ОРЛ. ВЫПАЛО 10 РАЗ 10 ОРЛ. ВЫПАЛО 1 РАЗ Теперь можно сравнить эти данные с результатами, получен¬ ными ранее путем моделирования. Заметим, что поскольку из 1024 10-кратных бросаний монеты 4 раза орел выпадал в 210 случаях, то из 1000 10-кратных бросаний следует ожидать появление орла в (210/1024)*-1000=205 случаях. Метод прямых вычислений весьма полезен, но его возмож< ности ограничены. Так, результаты 30-кратных подобных бро¬ саний монет измеряются величиной 230, превышающей мил¬ лиард, что слишком много для анализа вероятности возможных ситуаций указанным образом. По этой причине метод модели¬ рования и различные теоретические методы используются гораздо чаще, чем метод прямых вычислений. Дополнительные задания 3. Выполнить дополнительное задание 1 методом прямых вычислений (см. программу 8.2). 4. Выполнить дополнительное задание 2 методом прямых вычислений. Теоретические методы Первым рассмотрим так называемый метод треугольника Паскаля. В следующей задаче 9 используется другой теоре¬ тический метод. Сначала составим большую таблицу треуголь¬ ного вида (табл. 8.1), форма которой частично объясняет на¬ звание данного метода. В этой таблице третья строка пред¬ ставляет результаты трехкратного бросания монеты. Здесь возможны 8 исходов:
106 Глава 3 р Р р 0 орлов р Р О 1 орел р О р 1 орел р О О 2 орла О р р 1 орел О р О 2 орла О О р 2 орла О О О 3 орла из которых в одном случае орел не выпал, в трех случаях он выпал только 1 раз, в трех других случаях — 2 раза и в одном случае — 3 раза. Именно это описывает третья строка треуголь¬ ника Паскаля. Таблица 8.1 * Число бросаний монеты 1 Число выпаданий орла J 0 1 2 3 4 1 1 1 2 1 2 1 3 1 3 3 1 4 1 4 6 4 1 Существует очень быстрый способ вычисления значений элементов треугольника Паскаля. Зарезервируем массив DIM Т(30, 30) для хранения этих элементов. Элементам 1-й строки треуголь¬ ника соответствуют индексированные переменные Т(1,0), Т(1,1). Т(1,1), 1 1 1 2 1 1 3 3 1 1 4 6 4 1 t t t t t Т(4, 0) Т(4, 1) Т(4, 2) Т(4, 3) Г(4, 4) Таким образом, переменная ИЛЛ указывает количество слу- чаев выпадания орла J раз при /-кратном бросании монеты. Вычислим значения элементов этой таблицы строка за строкой, начиная с первой: 7(1, 0)= 1:7(1, 1)=1. Предположим теперь, что значения элементов третьей строки определены и необходимо вычислить значения элементов чет¬ вертой строки, Попытаемся найти элемент 7(4,2), т. е. выяс¬
Законы случайных событий 107 нить, сколько существует различных комбинаций выпадения орла дважды при 4-кратных бросаниях. Таких возможностей две: либо при первых 3 бросаниях орел появляется дважды, а при четвертом бросании — решка, либо при первых 3 бро¬ саниях орел появляется только 1 раз, а затем еще раз — при четвертом бросании. Следовательно, 7(4,2) = 7 (3,2) + 7 (3,1) = 3 + 3 = 6 Число выпаданий двух Число выпаданий одного орлов при 3 бросаниях орла при 3 бросаниях Указанный прием справедлив также для вычисления зна¬ чений Т (4,1) и 7(4,3): 7(4,1) = 7(3,1) +7(3,0) = 3+ 1 = 4, Т (4,3) = Т (3,3) + Т (3,2) =1 + 3 = 4. Существует только один случай, когда орел не появляется ни разу, следовательно, 7(4,0) = 1 и один случай выпадания орла при всех бросаниях, следовательно, 7(4,4) = 1. Теперь, используя найденные приемы, можно получить значения элементов пятой строки таблицы: 7(5,0)=1 7 (5,1) = 7 (4,1)+ 7 (4,0)=4 + 1=5 7 (5,2) = 7 (4,2) + 7 (4,1) = 6 + 4 = 10 7 (5,3) = 7 (4,3) + 7 (4,2) = 4 + 6=10 7 (5,4) = 7 (4,4) + 7 (4,3) = 1 + 4 = 5 7(5,5)=1 Итак, если известны значения элементов 7-й строки, то, используя описанный метод, можно определить значения эле¬ ментов (1+1) строки. Т(1 + 1,0) = 1 FOR J = 1 ТО I Т (I + 1,J) = T(I,J) + T(I,J - 1) NEXT J T(I + 1,1 + 1) = 1 Читателю предлагается написать программу вычисления значений элементов 1—30-й строк треугольной таблицы Паскаля. Проверку программы можно осуществить, сравнив элементы десятой строки с аналогичными результатами метода прямых вычислений. (Если возникнут трудности, следует обратиться к программе 8.3.)
108 Глава 3 Сравнение теоретических предсказаний с результатами моделирования Последней программой рассматриваемой задачи является состоящая из двух частей программа построения графика для сравнения результатов, полученных теоретическими расчетами и методом статистического моделирования. Требования к программе: 1) построение гистограммы результатов расчета всех 1024 возможных исходов 10-кратного бросания монеты; численные значения этих результатов получены ранее и имеют следующий вид: Число выпаданий орла при 10-кратном бросании Число 10-кратных бросаний 0 1 2 3 4 5 6 7 8 9 10 1 10 45 120 210 252 210 12G 45 10 1 Примечание: наличие приведенных выше данных позволяет ограничиться только их графическим представлением в виде гистограммы; 2) моделирование на ЭВМ 1024 10-кратных бросаний монеты с выводом результатов в форме графика. Примечание: для создания этой части программы достаточно внести небольшие изменения в программу 8.1 (заменив 1000 10-кратных бросаний числом 1024) и дополнить ее операторами построения графика. Для этой программы следует предусмотреть использование дисплея в режиме высокой разрешающей способности. На рис. 8.1 показан пример представления гистограммы в таком режиме. Она содержит 11 пар полос: верхняя пара соответст¬ вует количеству 10-кратных бросаний из общего числа 1024, завершившихся выпаданием только решки; следующая пара — количеству 10-кратных бросаний с появлением орла только один раз и т. д. В каждой паре нижняя жирная линия отобра¬ жает результаты моделирования, а верхняя тройная линия — теоретические предсказания. Проще всего сформировать левый край такого графика (ось ординат): HPLOT 0,0 ТО 0,159
Законы случайных событий 109 Нижний край (ось абсцисс) формируется тоже просто: HPLOT 0,159 ТО 279,159 Для удобства чтения гистограммы на ось абсцисс нанесены деления, ’’расстояние” между двумя соседними делениями рав¬ но 10. Одно (первое) деление можно нанести с помощью опе¬ ратора HPLOT 10,159 ТО 10,156 а все остальные — используя цикл FOR. . .NEXT. (Если по¬ явятся затруднения при составлении программы формирования осей абсцисс и ординат и нанесения делений, следует восполь¬ зоваться строками 240—290 программы 8.4.) Для построения полос гистограммы разделим вертикальную ось (ось ординат) на 11 отрезков, как показано на рис. 8.2. Заметим, что отрезок для отображения I выпаданий орла на¬ чинается в точке 14*1 и заканчивается в точке 14*1 + 13. Каж¬ дый отрезок имеет 14 линий, назначение которых показано на рис. 8.3. В программу можно включить полученные ранее теоретиче¬ ские результаты посредством следующих операторов: 100 DIM ТН(10) : REM РЕЗУЛЬТАТЫ РАСЧЕТОВ 120 ТН(0) = 1 130 ТН(1) = 10 220 ТН(10) = 1 Теперь можно изобразить графически теоретические резуль¬ таты с помощью цикла FOR. . .NEXT FOR I = 0 ТО 10 HPLOT 0,14 * I TO TH(I), 14 * I
110 Глава 3 HPLOT 0,14 * I + 2 ТО TH(I), 14 * I + 2 HPLOT 0,14 * I + 4 TO TH(I), 14 * I + 4 NEXT I или с помощью двух циклов FOR. . .NEXT (строки 300—340 программы 8.4). Читателю рекомендуется самостоятельно написать всю эту часть программы и проверить ее работоспособность. (При не¬ обходимости можно обратиться к программе 8.4.) О орлов 1 орел 2 орла б орла 4 орла 5 орлов 6 орлов 7 орлов б орлов 9 орлов 70 орлов о Рис. 8.2. Теперь следует изобразить графически результаты модели¬ рования. Уже написана программа вычисления результатов 1000 10-кратных бросаний монеты. После небольших изменений программа для 1024 10-кратных бросаний принимает следующий вид: 350 FOR J = 1 ТО 1024 ;REM ПРОГРАММА ДЛЯ 1024 ИСПЫТАНИЙ 360 СТ = 0 370 FOR 1 = 1 ТО 10: REM ДЕСЯТИКРАТНОЕ БРОСАНИЕ 380 CT = CT4-INT(2 * RND(l) ) : REM БРОСАНИЕ МОНЕТЫ С ДОБАВЛЕНИЕМ 1 К ЗНАЧЕНИЮ СТ ПРИ ВЫПАДАНИИ ОРЛА 390 NEXT I 400 ЕХ(СТ) = ЕХ(СТ) = 1 : REM УВЕЛИЧЕНИЕ СООТВЕТСТВУЮЩЕЙ СУММЫ НА 1 420 NEXT J Чтобы до некоторой степени разнообразить наблюдения за построением гистограммы на экране дисплея, можно заста¬ вить программу добавлять к изображаемому графику очередные результаты 10 бросаний монеты тотчас же по их получении.
Законы случайных событий 111 В программе 8.4 это достигнуто включением в приведенный выше цикл FOR. . .NEXT оператора 410 HPLOT ЕХ(СТ)? 14 * СТ + 7 ТО ЕХ(СТ), 14 * СТ + 9 : REM Теперь можно попытаться составить всю программу целиком, обращаясь при необходимости к программе 8.4 приложения. Выполните на ЭВМ полученную программу несколько раз и наблюдайте результаты. Данные моделирования обычно не¬ сколько отличаются от теоретически предсказываемых значений. Вопрос: согласны ли вы на пари при 10-кратном бросании монеты заплатить 2 долл., если орел выпадет ровно 5 раз, и в противном случае получить 1 долл.? Дополнительное задание 5. Измените программу 8.4 так, чтобы выполнить 10240 10-кратных бросаний монеты, и измените график, отображаю¬ щий результаты моделирования так, чтобы цена каждого де¬ ления возросла в 10 раз. Тогда внешний вид графика останется прежним. В этом случае можно будет заметить, что результаты моделирования и теоретических предсказаний больше подобны друг другу. Чем больше число испытаний, тем точнее метод моделирования. Задача 9. Вычисление факториалов Назначение разрабатываемой программы: вычисление фак¬ ториала. Эта процедура широко используется в задачах теории вероятностей и математической статистики. Специфические предпосылки успешной разработки: знаком¬ ство G решением задачи 8. Пояснения программисту: для решения данной задачи не обязательно располагать вычислительной машиной, достаточно воспользоваться обычным калькулятором. Данная задача довольно проста, она эффективно решается с помощью обычного калькулятора, хотя при желании чита¬ тель, конечно, может воспользоваться своей персональной ЭВМ. Если же у калькулятора имеется клавиша вычисления факто¬ риала, то с его помощью задача решается даже проще, чем на ЭВМ. Цель рассматриваемой задачи — помочь читателю ус¬ воить некоторые основные понятия теории вероятностей. Допустим, что в аудитории имеется 10 стульев, на которых необходимо разместить 10 студентов. Для удобства обозначим студентов буквами А, В, С, D, Е, F, G, Н, I и J. Требуется
112 Глава 3 определить, сколько существует вариантов размещения ука- занных студентов на 10 стульях. Первого студента А можно разместить на любом стуле, поэтому для него имеется 10 возможных вариантов размещения (рис. 9.1). При каждом из 10 вариантов размещения первого hhhkhhhhhh Рис. 9.1. студента остается 9 свободных стульев для студента В, т. е. всего 10*9=90 вариантов (рис. 9.2). При любом из этих 90 вариантов размещения первых двух студентов для студента С остается 8 свободных мест, что составляет 10*9*8=720 ва¬ риантов. Рассуждая далее аналогичным образом, получим, что при каждом размещении предыдущих студентов для студента D остается 7 свободных мест, для студента Е — 6, для студента F — 5, для студента G — 4, для студента Н — 3, для студента I — 2 и, наконец, для студента J — только одно свободное место. Следовательно, общее число вариантов размещения 10 студентов на 10 стульях составит 10*9*8*7*6*5*4*3*2*1=; = 3 628 800. Это число называют ’’десять факториал” и обо¬ значают 10! Hhhhhkhhhh Рис. 9.2. Теперь, используя эту методику, можно решить любую аналогичную задачу, например найти число возможных разме¬ щений 25 студентов на 25 стульях, для чего достаточно вычис¬ лить соответствующий факториал: 25! = 25 * 24 * 23 *... .*3*2*1. Читателю рекомендуется самостоятельно написать про¬ грамму вычисления АЛ для значений N в диапазоне 1—50 (при необходимости можно обратиться к программе 9.1, приводи¬ мой в приложении). Значения этих факториалов оказываются довольно большими. Факториал числа 10! превышает 3 млн., а величина 34! составляет около 2,9* 1038, т. е. значение, пре¬ вышающее возможности ЭВМ Apple представлять числовые величины. Поэтому при попытке вычислить значение 34! вы¬
Законы случайных событий 113 1 2 3 4 5 6 7 8 9 числительная машина этого типа выдаст сообщение об ошибке OVERFLOW (ПЕРЕПОЛНЕНИЕ). Среди существующих мо¬ делей калькуляторов можно найти такую, которая позволяет вычислять величины вплоть до 69!, что соответствует примерно 1,7*1098. Значения от 70! и больше выходят за пределы вычи¬ слительных возможностей известных автору калькуляторов. Упражнение. В аудитории имеется 25 стульев. Требуется найти общее число возможных вариантов размещения на них 20 студентов. Решение. Введем условные обозначения для всех 20 участ¬ вующих в опыте студентов: А, В, С, D, . . ., S, Т, U. Студент А может занять любой из 25 стульев. В каждом из 25 вариантов размещения первого студента останется 24 свободных стула для студента В и т. д. Для студента U останется 6 свободных мест, поскольку 19 студентов уже размещены. В этом случае общее число вариантов размещения составляет 25*24*23*. . .*6= =25!/5!. Рассмотрим еще одну задачу. Пусть необходимо покрасить стену, разделенную на 9 квадратов, которые пронумерованы согласно рис. 9.3. Предположим, что име¬ ется краска красного цвета, которой до¬ статочно для закрашивания лишь трех из девяти квадратов. Сколько различных вариантов рисунков можно получить, по¬ крывая краской три квадрата? Начало решения этой задачи аналогич¬ но приведенной выше. Приступая к рабо¬ те, имеем девять вариантов выбора. После закрашивания любого из выбранных квад¬ ратов остается восемь незакрашенных квадратов, что соответствует 9*8=72 вари¬ анта закрашивания двух квадратов. Наконец, краску, остав¬ шуюся на один квадрат, можно затратить на любой из семи не¬ закрашенных квадратов. Казалось бы, имеется всего 9*8*7=* =504 варианта. Однако подождем с выводами! Предположим, что при решении этой задачи в понедельник сначала краской покрывается квадрат с номером 2, затем с номером 9 и, нако¬ нец, с номером 3 (как показано на рис. 9.4). Во вторник первым закрашивается квадрат с номером 9, затем с номером 2 и, на¬ конец, с номером 3 (как показано на рис. 9.5). Нетрудно заме¬ тить, что полученный в результате рисунок — один и тот же, т. е. порядок закрашивания квадратов не имеет значения. Отметим, что любой из рисунков можно получить шестью различными способами, поскольку три квадрата можно закра¬ шивать в любой последовательности. Вначале имеются три возможных варианта выбора. После закрашивания первого
114 Глава 3 квадрата остаются два варианта выбора, после закрашивания двух квадратов — единственная возможность покрыть краской Рис. 9.4. Аналогичные рассуждения применимы при оценке возмож¬ ных исходов бросания монеты (задача 8). Пусть выполняются 10-кратные бросания монеты. Число различных комбинаций, получаемых при бросании, составляет 210=1024. Требуется определить количество таких бросаний, в каждом из которых орел выпадает 4 раза. 1е броса¬ ние ' 2-е бро¬ сание 3-е бро¬ сание 4-е бро¬ сание 5-е бро¬ сание 6-е бро¬ сание 7е бро ¬ сание д-е бро¬ сание 9-е бро¬ сание ' 10-е бро¬ сание Рис. 9.6. В каждой комбинации имеется десять возможных ’’позиций” для размещения монет (рис. 9.6). Появление четырех орлов в этих позициях будем рассматривать как задачу о раскраши¬ вании в красный цвет четырех из десяти квадратов. Тогда ис¬ комое число комбинаций при 10-кратных бросаниях монеты.
Законы случайных событий 115 в которых орел выпадает 4 раза, составляет 10*9*8*7 о 1 п 4! Упражнения 1. Используя описанный выше способ, вычислите резуль¬ таты 1024 опытов 10-кратного бросания монеты. Сравните эти результаты с данными, полученными при решении задачи 8. 2. При игре в бридж четырем игрокам раздается по 13 карт. Определите число различных вариантов раздачи 52 карт. 3. При игре в покер игроку сдается 5 карт. Требуется найти число возможных комбинаций при их раздаче. Решения 2. Для составления колоды карт имеется 52! возможных варианта. При сдаче каждый игрок получает по 13 карт, т. е. существует 13! возможных комбинаций карт у каждого игрока. Поскольку в игре — 4 участника, искомое число можно опре¬ делить следующим образом: 52! 52! (13!) (13!) (13!) (13!) — (13!)* > что составляет приблизительно 5,4* 1028. 3. Представим раздачу 5 карт игроку как закрашивание пяти позиций. Тогда искомое число различных комбинаций соответствует 52 * 51 * 50 * 49 * 48 5! 2 598 960. Задача 10. Одномерные случайные блуждания Назначение разрабатываемой программы: изучение статисти¬ ческих свойств поведения объектов, движущихся по случайным законам. (В теории вероятности подобное движение называют '’случайным блужданием”. Теория случайных блужданий нахо¬ дит применение в таких областях знаний, как физика, математи¬ ка, техника, а также при анализе закономерностей игр, бази¬ рующихся на использовании характеристик случайных событий.) Специфические предпосылки успешной разработки: знаком¬ ство с решением задачи 8 (желательно, но не обязательно). Пояснения программисту: данная задача предполагает разра¬ ботку нескольких коротких программ.
116 Глава 3 В этой задаче рассматриваются основы одного из наиболее интересных и важных разделов теории вероятностей — теории случайных блужданий. Случайные блуждания встречаются пов¬ семестно. Автор книги, проживая в детстве в Детройте, нередко принимал участие в детской игре ’’случайные блуждания”. Дети отправлялись гулять по улицам города и на каждом перекрестке с помощью 1- и 5-центовой монет решали, куда идти дальше. Если выпадали два орла — шли прямо, если две решки — шли назад. Если у 1-центовой монеты выпадал орел, а у пятицентовой —« решка, поворачивали налево, если наоборот — направо. На следующем перекрестке процесс принятия решения повторялся. В шутку эту игру называли ’’прогулкой пьяницы”. В 1827 г. английский ботаник Р. Броун, рассматривая в микро¬ скоп споры растений, обнаружил, что они беспорядочно движут¬ ся. Такое движение впоследствии было названо ’’броуновским”. Первое удовлетворительное объяснение этому явлению было дано А. Эйнштейном в 1905 г. Оказывается, обнаруженное дви¬ жение спор растений, возникающее вследствие столкновений с молекулами воды, также, как процесс бросания монеты и упомя¬ нутые прогулки в произвольных направлениях, можно описать с помощью теории случайных блужданий. Шумовой фон, слыши¬ мый из радиоприемников и телевизоров, является следствием физических процессов, также носящих характер случайных блужданий. Наглядным изображением процесса случайных блужданий могут служить некоторые длинные молекулы полимеров, сос¬ тоящие из множества цепочек, называемых мономерами. Эти цепочки похожи на отрезки пути при случайных блужданиях. Такой тип случайных блужданий называют невозвратными блуж¬ даниями, так как мономеры в общей молекуле не могут пересе¬ каться (рис. 10.1). Именно благодаря такой сложной структуре непересекающихся мономеров в каждой молекуле резина обла¬ дает высокой эластичностью.
Законы случайных событий 117 Случайные блуждания могут происходить в одном, двух, трех или большем числе измерений. Ниже рассматриваются не¬ которые опыты, касающиеся в данной задаче одномерных, а в задаче 11—двумерных случайных блужданий. Рис. 10.1. Одномерные случайные блуждания можно представить про¬ цессом передвижения путника по длинной прямой дороге. В за¬ висимости от исхода бросания монеты он делает шаг либо вперед, либо назад (рис. 10.2). —< 1 1 1 ч 1 1 -3-2-10 1 2 3 Рис. 10.2. Опыт 1 Чтобы яснее представить, что такое случайные блуждания, воспользуемся вычислительной машиной, с помощью которой отобразим графики некоторых случайных блужданий. Как и во множестве других случаев, для уяснения характера предпола¬ гаемых результатов работы составленной программы полезно сначала нарисовать такой график от руки. Для этой цели на лист бумаги следует нанести оси координат, как показано на рис. 10.3. г> 4 - 3 - 2 1 п I I 1...Т . I [ f J ГТ 1 Г Т..Т..Т ! .1 Т Т Г , и *-2 ►5 Рис, 10.3.
118 Глава 3 Используем ось абсцисс для указания числа бросаний монеты (шагов), а ось ординат — для указания положения путника пос- ле каждого шага. Предположим, что путник сделал следующий ряд шагов: +1, +1, —1, +1, —1, —1, —1, +1, —1, —1, где + 1 соответствует движению путника на 1 шаг вперед, а —1 —* на 1 шаг назад. Положение путника после каждого шага отобра¬ жает следующая таблица. Номео шага Направление Положение Путника после Р движения очередного шага 0 0 1 +1 и 2 + 1 -2 3 —1 -1 4 +1 -2 5 —1 -1 6 —1 0 7 —1 -1 8 +1 0 9 —1 -1 10 —J -2 Вид соответствующего графика приведен на рис. 10.4. Читателю рекомендуется самостоятельно написать программу, имтирующую случайные блуждания и отображающую результаты в виде гра¬ фика. В помощь начинающему программисту: 1. Рекомендуем построить график движения путника, совер¬ шающего 55 шагов, при этом на экране дисплея каждый шаг пут¬ ника следует представлять пятью единичными перемещениями светового пятна (пятью делениями соответствующей масштабной
Законы случайных событий 119 - 80 Элементы разложения ЭВМ -150 шкалы), как показано на рис. 10.5. В первой, части программы должны быть определены функции масштабирования (при не¬ обходимости можно обратиться к строкам ПО и 120 программы 10.1 приложения), затем программа должна содержать операто¬ ры, обеспечивающие построение осей координат с нанесением на них соответствующих делений (строки 130—180 программы 10.1 приложения). Элементы разложения ЭВМ О 50 100 150 200 250 275 1111П11 и | mi I и 111 и п 1111111 п и 11111111111111111 н'Ч Q123 10 ' 20 50 40 50 55 Номер шага В 1 5 5 4 J 2 7 Местоположение путника О -1 ~2 -4 -5 -6 -7 Рис. 10.5. 2. Каждый шаг путника должен быть представлен в программе числом +1 или —1. Одним из способов получения чисел +1 или —1 случайным образом является вычисление арифметического выражения вида 2 * INT(2 * RND(l)) — 1. Теперь попытайтесь написать программу решения данной задачи, обращаясь при необходимости к программе 10.1 прило¬ жения. После того как вы убедитесь в работоспособности про¬ граммы, осуществите ее выполнение на ЭВМ несколько раз,— Это даст вам наглядное представление о графической интерпрета¬ ции случайных блужданий. Построенные графики случайных блужданий иллюстрируют не только маршрут ’’прогулки пьяницы”. Они, например, ха¬ рактеризуют увеличение выигрыша или проигрыша игрока, ко¬ торый при бросании монеты каждый раз делает ставку на выпа¬ дание орла.
120 Глава 3 Технику алгоритмизации и программирования, используе¬ мую при решении задачи 8, можно применять для получения от¬ ветов на некоторые вопросы, возникающие при исследовании случайных блужданий. Например, можно дать ответ на вопрос о том, какова вероятность того, что после десяти шагов случайных блужданий путник вернется точно на место старта. Для этого, очевидно, необходимо, чтобы он проделал в любой последователь¬ ности пять шагов вперед и пять шагов назад. Это в точности со¬ ответствует случаю выпадания ровно, пяти орлов и пяти решек при 10-кратном бросании монеты. При решении задачи 8 установ¬ лено, что это случается 252 раза из 1024 опытов, т. е. искомая ве¬ роятность равна 252/1024=0,246094. Опыт 2 Некто, назовем его Джо Счастливчиком, имеет 10 долл, и же¬ лает увеличить свой капитал до 20 долл. Для этой цели он соби¬ рается воспользоваться игрой ’’бросание монеты” в некотором вы¬ мышленном казино. Правила игры просты: любая сумма денег пригодна в качестве ставки, для разыгрывания которой бросает¬ ся монета. Если выпадает решка, игрок теряет ставку, а если ’’орел” — получает выигрыш в размере ставки. Например, имея 10 долл, и делая ставку в размере 1 долл., игрок при выпадении решки проигрывает его (оставаясь с 9 долл.), а при выпадании орла выигрывает его (имея в итоге 11 долл.). Джо мог бы поставить сразу все 10 долл, и либо добиться же¬ лаемого, либо все проиграть. Но он не относится к игрокам, де¬ лающим крупные ставки, и решает ставить каждый раз только 1 долл, и играть до тех пор, пока не проиграет все свои деньги или же не увеличит их до желаемых 20 долл. Читателю предла¬ гается написать программу, имитирующую игру Джо Счастлив¬ чика. Следует определить, какова вероятность того, что Джо добьется поставленной цели. Если при разработке программы возникнут трудности, можно обратиться к программе 10.2 при¬ ложения. Полученную программу следует затем изменить таким образом, чтобы она имитировала игру Джо для случая, когда первоначальный капитал составляет 5 долл., а цель — та же, а именно иметь в своем распоряжении 20 долл. Рекомендуется срав¬ нить исходную и модифицированную программы, определив, чем они отличаются. Опыт 3 В реальном казино не играют в описанную выше игру. В лю¬ бой игре, которой можно воспользоваться в подобном казино, владельцу казино дается некоторое преимущество. Например,
Законы случайных событий 121 в одном из вариантов рулетки колесо имеет 38 лунок, из которых 36 пронумерованы от 1 до 36. Одна половина лунок выкрашена красным цветом, другая половина — черным. Оставшиеся две лунки имеют номера 0 и 00 и выкрашены в зеленый цвет. Если игрок ставит на черный цвет, то имеется 18 шансов из 38, что он выиграет, и 20 шансов из 38, что он проиграет. Допустим, что, играя в рулетку, Джо делает ставку на чер¬ ный цвет. Если он поставит сразу все 10 долл., то его шанс вы¬ играть составляет 18/38=0,4 736 842. Читателю предлагается написать новую программу или же изменить соответствующим образом предыдущую программу для определения вероятности того, что Джо, каждый раз делая ставку по 1 долл, проиграет все деньги или добудет необходимые 20 долл. В помощь начинающему программисту: поскольку при каж¬ дом раскручивании колеса рулетки вероятность выигрыша равна 18/38, результаты такого однократного раскручивания рулетки можно описать следующим фрагментом программы: R = RND (1) IF R < 18/38 THEN С = С + 1 IF R > 18/38 THEN С = С — 1 При затруднении в написании полного текста программы мож¬ но обратиться к программе 10.3 приложения. Выполните пуск разработанной вами программы несколько раз. Проанализиро¬ вав результаты, решите, можно ли дать Джо какой-либо совет? Опыт 4 Читателю предлагается экспериментально определить, на какое расстояние вероятнее всего удалится путник от заданного места при случайном блуждании в 50 шагов. Затем следует на¬ писать программу, имитирующую 100-кратное повторение слу¬ чайных блужданий по 50 шагов в каждом опыте. В конце каждо¬ го опыта необходимо определить, насколько путник удалился от своей исходной позиции. Кроме того, следует вести подсчет числа опытов, которые заканчиваются в исходной позиции пут¬ ника (нулевое удаление), а также на расстоянии 1, 2, 3, . . ., 50 шагов от этого места. Чтобы сделать более наглядным и интересным графическое представление результатов, сопровождаемое суммированием чис¬ ла опытов, завершающихся одним и тем же удалением от исход¬ ной позиции, дисплей следует использовать в режиме низкой раз¬ решающей способности и отображать результаты на графике тотчас же после окончания очередного опыта. Хотя в режиме низкой разрешающей способности на дисплее нельзя отобразить блуждания, заканчивающиеся на расстоянии более 39 шагов от
122 Глава 3 места старта, это практически не является серьезным недостат¬ ком, поскольку вероятность удалений от этого места на расстоя¬ ние более 39 шагов настолько мала, что такое событие вряд ли когда-нибудь может произойти. Рекомендуется попытаться написать эту программу самостоя¬ тельно. При возникновении трудностей следует обратиться к программе 10.4. приложения. График будет легче читаться, ес¬ ли в нижней части экрана вывести следующие метки: 111111111122222222223333333333 0123456789012345678901234567890123456789 (см. строки 120 и 130 программы 10.4). После выполнения отладки программу следует попытаться выполнить несколько раз. Если она работает правильно, можно заметить следующую особенность: все случайные блуждания заканчиваются на четном числе шагов от места старта. Можете ли вы объяснить причины этого? Измените текст программы так, чтобы случайные блуждания длились не 50, а 200 шагов, сравните результаты работы обеих программ. С помощью вычислительной машины можно получить ответы на множество различных вопросов, касающихся случайных блужданий, например: 1) как часто в среднем случайные блуждания продолжитель¬ ностью в 100 шагов заканчиваются на месте старта? 2) как часто в среднем случайные блуждания продолжитель¬ ностью в 50 шагов заканчиваются на месте старта? 3) сколько в среднем потребуется шагов прежде, чем в резуль¬ тате случайных блужданий путник вернется к месту старта? Ответы на многие из подобных вопросов чрезвычайно важны с практической точки зрения. Теория вероятностей располагает значительными возможнос¬ тями для оценки характеристик случайных блужданий, однако существует много простых и в то же время важных вопросов, ответы на которые остаются неизвестными. Задача 11. Двумерные случайные блуждания Назначение разрабатываемой программы: более углубленное изучение статистических свойств случайных блужданий. Специфические предпосылки успешной разработки: знаком¬ ство с решением задачи 10. Пояснения программисту: данная задача средней степени трудности.
Законы случайных событий 123 Двумерные случайные блуждания можно представить в виде передвижений путника по обширной равнине, на которой он мо¬ жет случайным образом шагать на восток, запад, север или юг. Так же, как и в предыдущей задаче, знакомство со случайными блужданиями этого типа начнем с составления программы для их отображения на экране дисплея. Опыт 1 Для отображения результатов решения данной задачи, целе¬ сообразно использовать дисплей в режиме высокой разрешаю¬ щей способности. Путника на экране дисплея удобно изображать в виде квадрата размером 3x3 элемента разложения. В приводи¬ мых в приложении программах решения задач этого типа исход¬ ное положение путника определено в центре экрана, а шаг слу¬ чайных блужданий соответствует четырем элементам разложе¬ ния. Расположение осей координат на экране дисплея соответст- -20 — т— О 19 А 4 Шаги случайных блужданий Ось ординат 156 Ось абсцисс О I Ь- I -35 276 I -I I 34 Шаги' случайных блужданий Рис. 11.1. вует рис. 11.1. На первом этапе разработки программы необхо¬ димо написать процедуру, содержащую функции масштабирова¬ ния и обеспечивающую преобразование каждого шага случайных блужданий в эквивалентные перемещения светового пятна на экране дисплея вдоль осей х и у (строки НЮ* и 120 программы 11,1 приложения).
124 Глава 3 Для хранения значений координат местоположения путника относительно осей х и у используем соответствующие перемен¬ ные X и Y, Принятое условное изображение путника в виде квадрата размером 3x3 элемента можно реализовать на экране дисплея в режиме высокой разрешающей способности с помощью следующей последовательности операторов: А = FN Х(Х) : В = FN Y(Y) HPLOT А—1, В + 1 ТО А4-1, В4-1 HPLOT А—1, В ТО А+1, В HPLOT А—1, В—1 ТО А+1, В—1 Для наглядности отображения следа блужданий путника на экране дисплея можно в каждой точке его пути формировать от¬ метку, остающуюся после смещения квадрата (как это делается, например, с помощью строк 200—220 программы 11.1 для место¬ положения путника, представляемого точкой с координатами А, В). Высокое быстродействие вычислительной машины и со¬ ответственно высокая скорость отображения результатов на эк¬ ране не позволяют сделать наглядным процесс блужданий пут¬ ника. Для того чтобы иметь возможность наблюдать за блужда¬ ниями путника по экрану дисплея, в программе 11.1 (строка 180) сразу же после формирования изображения путника введен цикл задержки: FOR DLY = 1 ТО 100 i NEXT DLY Аналогично бросанию монеты при одномерных блужданиях для определения направления движения в двумерном случае путник использует игральную кость с четырьмя гранями и вы¬ бирает направление в зависимости от результата бросания. Чи¬ тателю предлагается написать программу, имитирующую дву¬ мерные случайные блуждания, используя при необходимости схему алгоритма, приведенную на рис. 11.2, программу 11.1 приложения, а также приведенные ниже примечания. Примечания: 1. Предельно допустимыми значениями координат местополо¬ жения путника, представляемого квадратом размером 3x3 эле¬ мента, являются У = 19, Х=—34. 2. В целях сокращения текста программы в ее алгоритм вне¬ сены некоторые изменения по сравнению со схемой алгоритма, приведенной на рис. 11.2, а именно: после каждой из первых трех проверок, не ”вышел” ли путник за пределы экрана, действия, выполняемые программой, соответствуют штриховой линии на схеме алгоритма, а не линии с надписью ”нет”.
Законы случайных событий 125 Рис. 11.2.
126 Глава 3 Опыт 2 В этом опыте исследуются некоторые из основных свойств двумерных блужданий фиксированной длины и рассматривают¬ ся области их применения. Результаты опыта изображаются на экране дисплея в виде решетки, каждая ячейка которой отобра* жает количество закончившихся на ней блужданий, как это по¬ казано на рис. 11.3. .. - оь. к ж ж * ■и Ок hi ж В— ж ж ъ. ж ш ь ж — ■U *В Ъ ha к ж ж ж Ж ж Ьа !■ to № ta ж ж ы ж Ь ■ Ьа ■в. ж Ж в— Ж ь а ъ ж to ж в. ь. ь. ■U ■ ■в tai ъ № ж Ж Ж. tai ъ Ьв ж ж U. ■> ж В. ж IU. ж Ж ь» Рис. 11.3* Результаты, полученные в данном опыте, справедливы для множества практических применений двумерных случайных блужданий. Рассмотрим для примера игру, в которой участники бросают в мишень небольшие стрелы с оперением на конце. Если бы все броски выполнялись идеально, каждый бросок за¬ вершился бы попаданием стрелы точно в центр мишени. Однако бросание таких стрел — очень сложное действие, результат ко¬ торого зависит от координации многих мышц бросающего, а также его мозга, определяющего координаты цели и управляю¬ щего мышцами руки и тела. Каждая составляющая этого слож¬ ного действия может давать погрешность, которая влияет на отклонение стрелы от идеальной траектории. Реальная траекто¬ рия полета стрелы зависит от суммы большого количества мелких погрешностей. Эти мелкие погрешности аналогичны множеству малых шагов при случайных блужданиях, Вид мишени, которая уже многократно с отображением использовалась в игре
Законы случайных событий 127 (рис. 11.4), напоминает картину, весьма схожую с отображением результатов описываемого ниже опыта. Данный опыт рассматривается как случайные блуждания продолжительностью 24 шага. Местоположение конечной точки каждого очередного блуждания фиксируется на решетке, вид которой изображен на рис. 11.5. Все блуждания начинаются в точке с координатами (10, 10). После выполнения 24 шагов большинство блужданий не при¬ водят к выходу за пределы за¬ данной решетки, хотя, возмож¬ но, найдется несколько блужда¬ ний, завершающихся за ее пре¬ делами. Для регистрации коли¬ чества блужданий, закончив¬ шихся в каждой ячейке, резер¬ вируется двумерный массив DIM NW(20, 20) Рис. 11.4. Индексированная переменная NW(I, J) обозначает количество случайных блужданий, заканчивающихся в ячейке решетки с координатами /, J. Читателю предлагается начать решение по¬ ставленной задачи с написания программы, имитирующей 100 случайных блужданий продолжительностью 24 шага каждое и регистрирующей количество блужданий, заканчивающихся в каж¬ дой ячейке решетки. При наличии затруднений можно обратиться к схеме алгоритма, приведенной на рис. 11.6. Прошедшую отлад¬ ку программу следует выполнить 100 раз. Для вывода результа¬ тов можно воспользоваться фрагментом программы, подобным следующему: FOR X = О ТО 20 FOR Y = 0 ТО 20 PRINT ”NW X; Y; ”) = NW(X,Y) NEXT Y PRINT NEXT X Однако такой вывод даст множество чисел, которые трудно интерпретировать. Чтобы придать результатам наглядность, следует воспользоваться дисплеем в графическом режиме с вы¬ сокой разрешающей способностью и воспроизвести на нем исполь¬ зуемую при описании блужданий решетку, а в каждую ячейку решетки помещать точку, если очередное блуждание завершает¬ ся в этой ячейке.
128 Глава 3 После выполнения указанных действий можно получить кар¬ тину, очень похожую на ту, которая приведена на рис. 11.3. На нем изображена решетка, точки в ячейках которой символи¬ зируют завершение случайных блужданий. Чтобы сделать на¬ блюдение за работой программы более наглядным и интерес¬ ным, каждую упомянутую точку на экране рекомендуется отоб¬ ражать в момент окончания очередного блуждания. Рис. 11.5. Значительную часть данной программы занимают графичес¬ кие построения. Вид каждой ячейки решетки представлен на рис. 11.7. Контур квадратной ячейки ограничен четырьмя линия¬ ми. В центральной части ячейки имеется квадрат размером 5Х Х5=25 элементов. Эти 25 элементов предназначены для отобра¬ жения количества блужданий, закончившихся в данной ячейке, и пронумерованы как показано на рис. 11.8. Заполнение квадрата следует вести слева направо и снизу вверх. По ходу выполнения программы переменные /?(Х, У) и С(Х, Y) содержат информацию о номерах строки и столбца, на пересечении которых находилась последняя из точек, поме-
Законы случайных событий 129 л Начало случайного блуждания > (X « Ю-, Y = Ю) 1 FOR N = 1 ТО 24 R = INT(4*RND(/)); если Я=0,шаг вправо (Х= X +1), если R=1,tuae влево (Х= X- 1), если шаг вверх (Y= Y + 1 \ если R=3,шаг вниз (Y = Y-1) NEXT N Подсчет числа блужданий, закон* чившихся вне решетки (ОВ=ОВ + 1> Добавить / к числу блужданий, закончивших¬ ся в ячейке X, Y; NW(X,Y) = NW(X,Y)+1 Рис. 11.6. щенных в ячейку с координатами (X, Y). Например, после того, как в ячейке с координатами (10, 8) завершится 8 случайных блужданий, она будет выглядеть так, как показано на рис. 11.9, при этом переменной 7?(10, 8) будет присвоено значение 1, а переменной С (10, 8) — значение 3. 072345673 Рис. 11.7, 5 № 989
130 Глава 3 4 3 2 J О 1 2 3 4 5 Рис. 11.8. Вся решетка будет выглядеть так, как показано на рис. 11.10. Числа на концах решетки являются координатами соответствую¬ щих строк, как они определяются вычислительной машиной (ма¬ шинные координаты). Заметим, что в данном случае по оси орди¬ нат используется 180 шагов, хотя обычно в машине Apple исполь¬ Рис. 11.10. зуется не более 159. Увеличение числа шагов до 191 достигается применением оператора РОКЕ—1& 302, 0 Однако за это приходится ’’расплачиваться” четырьмя стро¬ ками в нижней части экрана дисплея, предназначенными для
Законы случайных событий 131 текста при работе дисплея в графическом режиме с высокой раз¬ решающей способностью и недоступными к использованию в дан¬ ном случае. Рис. 11.11. Теперь читателю предлагается написать короткую подпро¬ грамму для формирования изображения заданной решетки. Выделение этой части в виде отдельной подпрограммы позволит впоследствии сократить запись программы в целом (если напи¬ сание подпрограммы вызовет затруднения, можно обратиться к строкам 800—860 программы 11.2 приложения). Приведем обобщенное описание всей программы: 1. Инициализация: (a) HGR РОКЕ — 16 302,0 (ДЛЯ ИСПОЛЬЗОВАНИЯ ВСЕГО ЭКРАНА) HCOLOR = 7 (ЧЕРНО-БЕЛОЕ ИЗОБРАЖЕНИЕ) .(b) DIM R(20,20), С(20,20) 2. Формирование изображения решетки. 3. Выполнение случайных блужданий продолжительностью 24 шага.
132 Глава 3 4. Добавление очередной точки в ячейку, в которой заверши¬ лось случайное блуждание. Добавление выполняется, пока ячей¬ ка не будет заполнена, в противном случае все действия прекра¬ щаются, выполнение программы заканчивается, 5. Повторение пп. 3 и 4. Рассмотрим составление фрагмента программы, соответству¬ ющего требованиям п. 4. Отметим, что левый нижний угол ячей¬ ки с координатами X и Y в вычислительной машине Apple имеет координаты 56+8’Х, 180—8-Y соответственно, как показано на рис. 11.11. Числа, указанные вдоль правого и верхнего края решетки, обозначают номера ячеек, а вдоль левого и нижнего края — координаты у и х соответственно, как они определены в Рис. 11.12. вычислительной машине. Например, на рис. 11.12 заштрихован¬ ная ячейка с номером (6,4) имеет координаты хи у левого нижне¬ го угла 104 и 148 соответственно. Пусть требуется поставить точку (отметку о завершении блуж¬ дания) в строку R и столбец С некоторой ячейки (рис. 11.11). Заметим, что С-я точка в R-и строке ячейки (X, У) имеет следую* щие координаты: координата %: 56 + 8 -х X + 1 + С = 57 + 8 * X + С, координата у*. 180 — 8-хY — 2 — R=178—8xY— R. Схема алгоритма, приведенная на рис. 11.13, описывает дей¬ ствия, которые должен выполнять фрагмент программы, соот¬ ветствующий п. 4. Перед тем как непосредственно приступить к написанию про¬ граммы, необходимо принять во внимание следующее: любая программа, содержащая много переменных и использующая гра¬ фический режим высокой разрешающей способности, потенциаль-
Законы случайных событий 133 но может переполнить оперативную память (гл. 2). В данной программе около 800 переменных [DIM R(20, 20), С (20, 20)L Опасность переполнения можно предотвратить с помощью следую¬ щего оператора в первой строке текста программы: 100 LOMEM : 16 384 Теперь нее подготовлено для написания программы. При необ¬ ходимости можно обратиться к программе 11.2 приложения. Однако в ней имеются два усовершенствования (строки 600—• 610 и 310), которые до сих пор не рассматривались. Усовершенствования программы 11.2 1. При повторных пусках первоначального варианта програм¬ мы (предлагаемой для написания читателю) можно заметить, что используется только половина ячеек решетки. (/Можете ли вы объяснить это явление?) Если продолжительность случайных блужданий вместо фиксированной длины (равной 24) сделать ме¬ няющейся по случайному закону и принимающей значения 24 или 25, то окажутся использованными все ячейки решетки. При этом вдвое увеличится количество мест, реально заполняемых точ¬ ками (отметками о завершении случайного блуждания) и улуч¬ шится наглядность представления результатов работы программы (строки 310 и 320 программы 11.2).
134 Глава 3 2. После завершения графического представления результа¬ тов работы программы линии решетки могут показаться лишними и даже ухудшающими наглядность представления характера группирования точек на экране дисплея. Поэтому может оказать¬ ся полезным фрагмент программы, стирающий упомянутую решет¬ ку (строки 600 и 610 программы 11.2 приложения). Задача 12. Проверка статистических гипотез Назначение разрабатываемой программы: изучение статисти¬ ческих способов проверки гипотез. (Рассматриваемые способы часто используются в юриспруденции для доказательства винов¬ ности обвиняемых, в медицине для определения достоверности диагнозов и во множестве других приложений.) Специфические предпосылки успешной разработки: знаком¬ ство с решением задач 8 и 9. Пояснения программисту: данная задача предполагает разра¬ ботку нескольких коротких программ. В одном городе проводился торжественный карнавал. Во время праздника в помещение местного шерифа вошел его знако¬ мый, по имени Хэнк, и стал жаловаться на якобы обнаруженное им жульничество игрального автомата. Шериф был не очень удивлен, так как ежегодно во время карнавала к нему являлись раздраженные неудачники, считавшие себя обиженными не толь¬ ко судьбой. По словам ’’пострадавшего”, он был обманут так на¬ зываемым ’’колесом фортуны” (рис. 12.1). В этой игре на каждое вращение колеса ставится 1 долл. Если против стрелки останав¬ ливался полукруг с надписью ’’выигрыш”, то игрок получал ис¬
Законы случайных событий 135 ходную ставку плюс 1 долл., если полукруг с надписью ’’про¬ игрыш”, то игрок терял ставку. Если игра протекает честно, то шансы выиграть и проиграть одинаковы (50%). Доход владель¬ цев ’’чудесного колеса” (устроителей карнавала) складывался из 5 дополнительных центов, взымаемых с играющего за каждый сеанс игры. — Шериф! — воскликнул Хэнк, вваливаясь в дверь.— Я иг¬ раю в ’’колесо фортуны” вот уже 30 лет, но никогда раньше не проигрывал 25 долл.! — Ха, Хэнк! Я помню, что примерно 8 лет тому назад тебе удалось выиграть 25 долл., но при этом ты не жаловался на то, что колесо поддельное. Мне кажется, что если ты при честной игре можешь выиграть 25 долл., то можешь столько же и проиг¬ рать. — Может быть, шериф, но только не так, как сегодня. После того как я спустил все, я еще долго стоял, наблюдая за игрой. Прошло 50 сеансов, из которых 30 завершились проигрышем и только 20 — выигрышем, т. е. на целых 10 сеансов меньше. Я думаю, что устроители карнавала утяжелили колесо так, что проигрышетал выпадать в 60% случаев. — Подожди, Хэнк. Ты же прекрасно знаешь, что выигрыш совсем не обязательно выпадает ровно 25 раз из каждых 50! — Да, но почему только 20 раз? Это очень подозрительно. Вот что я тебе предлагаю, шериф. Завтра ты переоденься и загри¬ мируйся так, чтобы тебя не узнали, пойди туда и проследи за игрой в течение 100 сеансов. Ты убедишься сам! Держу пари, что проигрыш выпадет не менее 56 раз. Это докажет виновность вла¬ дельцев. Если проигрыш выпадет в 55 случаях или меньше, я признаю, что был неправ. — Хорошо, Хэнк. Похоже, ты придумал справедливый спо¬ соб проверки своих подозрений, раз ты считаешь, будто бы про¬ игрыш выпадает в 60% случаев, а владельцы этого игрального автомата утверждают, что в 50%. Задание 1 Предположим, что игра ведется честно. Какова вероятность того, что владельцы игрального автомата будут необоснованно обвинены в подделке? Задание 2 Предположим, что игра ведется нечестно: в 60% случаев вы¬ падает проигрыш. Какова вероятность того, что владельцы, к сожалению, не будут увеличены в подделке? Подобные проблемы весьма характерны для многих областей современной жизни. Примером может служить статистическое
136 Глава 3 подтверждение достоверности медицинских показаний о том, что некоторые вещества являются канцерогенными. Доказательства истинности подобных утверждений основываются на вероятност¬ ных закономерностях, которые служат достаточно убедительным аргументом. Более того, степень достоверности статистических характеристик можно оценить количественно. Прежде чем продолжить чтение, попытайтесь самостоятель¬ но дать ответы на вопросы обоих заданий. При выполнении этих заданий возможны два подхода: 1) теоретический, 2) экспериментальный, основанный на статистическом модели¬ ровании. Теоретический подход Первое задание аналогично задаче о бросании монеты. Резуль¬ таты вращения колеса подобны результатам бросания монеты, причем выпадение ’’орла” можно считать проигрышем, а выпадение решки — выигрышем. Для нахождения ответа на вопрос перво¬ го задания необходимо определить вероятность, с которой орел выпадет 56 или больше раз из 100. Для этой цели воспользуемся треугольной таблицей Паскаля. Вначале решим более простую задачу и найдем вероятность того, что при бросании монеты орел выпадет 6 или более раз из 10. Приведем значения элементов десятой строки таблицы Паскаля, которые найдены при реше¬ нии задачи 8: Число выпаданий орла 0 1 2 3 4 5 6 7 8 9 10 Количество 10-кратных бросаний 1 10 45 120 210 252 210 120 45 10 1 Суммируя содержимое строк 6—10 правого столбца, получаем 210 120 45 10 1 6 7 8 9 10 386
Законы случайных событий 137 Согласно результатам суммирования, шесть и более выпада¬ ний орла имеет место 386. Поскольку общее количество равнове¬ роятных исходов при 10-кратных бросаниях монеты составляет 1024 = 210, то 386 случаев выпадания орла 6 или более раз соот¬ ветствует 37,7% от возможного числа исходов. Вернемся к первому заданию. Для его решения необходимо рассчитать значения элементов 100-й строки треугольной табли¬ цы Паскаля. Если вы попытаетесь для этой цели модифициро¬ вать соответствующую программу задачи 8, то возможно, что это вам не удастся. Ниже приводятся результаты попытки подобной модификации, выполненной автором. 100 DIM Т(100,100) : REM РЕЗЕРВИРОВАНИЕ ПАМЯТИ ДЛЯ ТАБЛИЦЫ ПАСКАЛЯ; T(I,J) — СЧЕТЧИК ЧИСЛА ПОЯВЛЕНИЙ ОРЛА J РАЗ. ПРИ 1-КРАТНЫХ БРОСАНИЯХ 110 Т(1,0) = 1 : Т(1,1) = 1 : REM ВЫЧИСЛЕНИЕ ЭЛЕМЕНТОВ ПЕРВОЙ СТРОКИ ТАБЛИЦЫ ПАСКАЛЯ 120 FOR I = 1 ТО 99: REM ВЫЧИСЛЕНИЕ ЭЛЕМЕНТОВ СТРОК СО 2-й ПО 100-ю 130 Т(1 + 1,0) = 1 ; REM ЕДИНСТВЕННАЯ СИТУАЦИЯ, КОГДА ОРЕЛ НЕ ВЫПАДАЕТ НИ РАЗУ 140 FOR J = 1 ТО I 150 T(I + 1,J) = T(I,J) + T(I,J — 1) : REM ДВА ВАРИАНТА ВЫПАДАНИЯ ОРЛА J РАЗ: J РАЗ ПРИ ПЕРВЫХ I БРОСАНИЯХ И РЕШКА ПРИ (I + 1) —М; (J — 1) РАЗ ПРИ ПЕРВЫХ I БРОСАНИЯХ И ОРЕЛ REM: ПРИ (I + 1)—М 160 NEXT J 170 Т(1 + 1,1 + 1) = 1: REM ЕДИНСТВЕННАЯ СИТУАЦИЯ, КОГДА ПРИ ВСЕХ БРОСАНИЯХ ВЫПАДАЕТ ОРЕЛ 180 PRINT : REM ФОРМИРОВАНИЕ СТРОКИ ПРОБЕЛОВ МЕЖДУ ВЫВОДИМЫМИ СТРОКАМИ 190 FOR J = 0 ТО I + 1: REM ВЫВОД (I + 1)-й СТРОКИ 200 PRINT ”Т(”; I + 1;”,”;J;”) = ”;T(I + 1,J) 210 NEXT J 220 NEXT I ]RUN ?OUT OF MEMORY ERROR IN 100 ЭВМ выдала сообщение об ошибке ’’переполнение памяти” сразу же после выполнения оператора в строке 100 программы. В этой строке предпринимается попытка зарезервировать память для 10 000 переменных, каждой из которых требуется 5 байт, т. е. всего необходимо более 50К байт. Такое использование памяти крайне нерационально. При вычислении значений элементов таблицы Паскаля нет необходимости хранить все результаты. Для вычисления элементов каждой строки достаточно иметь только значения элементов предыдущей строки. Все прочие стро¬ ки для расчетов уже не нужны. Поэтому память следует зарезер¬ вировать только для двух строк: 100 DIM PR(100) : REM ПРЕДЫДУЩАЯ СТРОКА 110 DIM NR(100) : REM РАССЧИТЫВАЕМАЯ СТРОКА
138 Глава 3 При этом приемлема следующая последовательность вычисления значений элементов таблицы Паскаля: 1. Присвоение переменной PR значений элементов первой строки PR(O) = 1: PR(1) = 1. 2. Вычисление значений элементов следующей строки, исполь¬ зуя элементы предыдущей строки: NR(0) = 1 : NR(N) = 1 FOR I = 1 ТО N — 1 NR(I) = PR(I — 1)_+ PR(I) NEXT I 3. Пересылка значений элементов массива NR в массив PR. Действия пп. 2 и 3 подлежат повторению в цикле для перемен¬ ной N, принимающей значения 2—100 с шагом 1. С помощью ЭВМ можно получить ответы на ряд других вопросов. Например, пользуясь данными 10-й строки таблицы Паскаля, можно опреде¬ лить вероятность выпадания орла не более 4 раз при 10-кратном бросании. Для этого необходимо вычислить сумму 1 + 10+45+ Число выпаданий орла 0 2 3 4 5 6789 10 Число 10-кратных бросаний 1 10 45 120 210 252 210 120 45 10 1 + 120+210 и полученный результат разделить на общее число возможных исходов 1024. Искомая вероятность составляет 386/1024=0,3 769 531. Читателю предлагается изменить программу и получить для каждой строки треугольника Паскаля таблицу следующего вида: Строка 10 Число выпаданий орла (/<) из 10 бросаний монеты Число 10-крат¬ ных бросаний Вероятность выпадания орла не более Л раз 0 1 9,765 625Е-04 1 10 0,0 107 421 875 2 45 0,0 546 875 3 120 0,171 875 4 210 0,376 953 125 5 252 0,623 046 875 6 210 0,828 125 7 120 0,9 453 125 8 45 0,989 257 813 9 10 0,999 023 438 10 1 1
Законы случайных событий 139 При необходимости можно обратиться к программе 12.1 приложе¬ ния. Теперь можно получить ответ на вопрос задания 1. Для этого в таблице, подобной указанной выше и построенной для сотой строки треугольной таблицы Паскаля, нужно найти строку, соответствующую появлению орла 55 раз. Информация этой и расположенных над ней строк позволяет заключить, что вероят¬ ность выпадания орла не более 55 раз составляет примерно 0,86. Следовательно, вероятность выпадания орла по крайней мере 56 раз равна примерно 0,14, т. е. около 14% честных впадальцев игрального автомата типа ’’колесо фортуны” не смогут пройти предложенную Хэнком проверку. Перейдем к ответу на вопрос задания 2. Здесь необходимо иметь в виду, что ’’колесо” по предположению Хэнка является поддельным и дает вероятность проигрыша 0,6. Допустим, что имеется такая же поддельная монета и ее бросают 3 раза. (Напом¬ ним, что выпадание орла соответствует проигрышу.) Полная группа возможных исходов при 3-кратном бросании монеты нам уже известна (задача 8). Вероятность выпадания решки при лю¬ бом бросании равна 0,4. Следовательно, вероятность выпадания всех решек при трехкратнОхМ бросании составляет 0,4-0,4 х X 0,4=0,064. Вероятность выпадания орла при любом бросании равна 0,6, а поэтому вероятность получения комбинации ”орел- решка-орел” при 3-кратном бросании составит 0,6-0,4-0,6=* = 0,144. Аналогично можно подсчитать вероятность каждой возмож¬ ной комбинации при проведении 3-кратных бросаний. Результа¬ ты таких расчетов могут быть сведены в следующую таблицу: Комбинация выпаданий орла (о) Вероятность или решки (р) в результате комбинации 3-кратных бросаний Читателю предлагается самостоятельно заполнить эту табли* цу. Проверкой корректности полученных результатов может служить вычисление суммы значений всех вероятностей, которая должна равняться 1. Отметим, что вероятность любой комбинации, в которой при¬ сутствуют одна решка и два орла, составляет 0,4-0,6-0,6=0,144,
140 Глава 3 Таких комбинаций три, следовательно, вероятность выпадания одной решки и двух орлов определяется произведением 3x0144=* -0,432. Упражнение. Определите вероятность того, что при 10-крат¬ ном бросании такой поддельной монеты орел выпадет 7 раз, а решка — 3. Решение: Вероятность получения комбинации вида о-о-о-о-о-о~ о-р-р-р составляет (0,6)7+(0,4)3—0,0 017 916. Вероятность появления орла 7 раз и решки 3 раза в любой дру¬ гой комбинации также равна этой величине. Из вычисленной ранее треугольной таблицы Паскаля следует, что ’’орел” появля¬ ется 7 раз в 120 различных комбинациях. Поэтому вероятность появления ’’орла” 7 раз при 10-кратном бросании определяется произведением 120x0,0 017 916=0,2 149 909. Читателю предлагается так изменить программу вычисления элементов таблицы Паскаля, чтобы в качестве выходных данных формировались значения вероятности появления орла ровно К раз и вероятности появления орла не более К раз при N—крат¬ ном бросании такой фальшивой монеты. (При необходимости можно обратиться к программе 12.2 приложения.) Ниже приво¬ дится таблица таких выходных данных для Af—10 * ■■■-. * ❖ СтрОКЭ 1Q * ❖ * * * Число выпаданий орла (/<) из 10 бросаний монеты Вероятность выпадания орла К раз Вероятность выпадания орла не более К раз 0 1,04 857 G01E-04 1,04 857 601Е-04 1 1,57 286 401Е-03 1,67 772 161Е-03 2 1,010 616 832 0,0 122 945 536 с> 0,0 424 673 282 0,0547618818 4 0,111 476 736 0,166 238 618 5 0,200 658 125 0,366 896 744 6 0,250 822 657 0,617719401 7 0,214 990 849 0,832 710 249 8 0,120 932 352 0,953 642 602 9 0,0403 107 841 0,993 953 386 10 0,04 661 761Е-03 1 Выполните 1 программу для получения подобных результатов при А7= 100. Они дают возможность ответить на вопрос задания 2. Вероятность появления орла не более 55 раз при бросании фальшивой монеты равна 0,178 901 639. Именно с такой вероят¬ ностью виновный не будет уличен в подделке.
Законы случайных событий Экспериментальный подход (статистическое моделирование] Второй способ получения ответов на вопросы заданий 1 и 2 состоит в написании двух программ, одна из которых имитирует честную игру и определяет вероятность того, что игра выдержит проверку на отсутствие подделки, а другая имитирует заведомо поддельную игру и определяет вероятность того, что игра также выдержит проверку на отсутствие подделки. Читателю предлагается написать эти программы самостоя* тельно и сравнить результаты их выполнения с расчетами, полу¬ чаемыми посредством рассмотренного выше теоретического под¬ хода. При необходимости можно обратиться к программам 12.3 и 12.4 приложения.
4 ИЗМЕРЕНИЕ ВРЕМЕНИ В данной главе рассматривается программирование на ЭВМ задач, связанных с измерением времени. Центральное место принадлежит задаче 13, для решения ко¬ торой составляется подпрограмма DATE 1. С ее помощью опре¬ деляется количество дней между двумя календарными датами. Разработка данной подпрограммы представляет известную труд¬ ность, поскольку используемый нами календарь достаточно сло¬ жен. Но после того как подпрограмма DATE 1 создана и имеется в распоряжении, существенно упрощается разработка других программ, оперирующих отсчетами времени по календарю. Например, второй программный модуль, рассматриваемый в задаче 13, позволяет определить день недели, на который выпа¬ дает любая заданная дата. В качестве дополнительного задания читателю предлагается написать изящную демонстрационную программу, с помощью которой составляется таблица дней недели, на которые выпадают все дни рождения любого челове¬ ка— от года рождения до 100 лет. В задаче 14 подпрограмма DATE 1 используется для разработки программы, воспроизводя¬ щей на экране дисплея изображение календаря любого месяца заданного года начиная с 1600 г. При составлении программы для решения задачи 15 подпрограмма DATE 1 используется для определения и воспроизведения на экране дисплея биоритмов человека. Подобные программы часто служат для демонстрации возможностей графических средств вычислительных машин. Задача 13. Определение количества дней между двумя календарными датами Назначение разрабатываемой подпрограммы: определение ко¬ личества дней между 31 декабря 1599 г. и любой последующей датой. Примечание: эта подпрограмма, именуемая DATE 1, чрезвы¬ чайно полезна для решения всех других задач данной главы. Специфические предпосылки успешной разработки: отсутст¬ вуют.
Измерение времени 143 Пояснения программисту: для составления подпрограммы DATE 1 не требуется знания каких-либо специфических приемов программирования, основная трудность при ее разработке за¬ ключается лишь в сложности нашего календаря, содержащего месяцы различной продолжительности, а также високосные го¬ ды. Второй программный модуль, подлежащий разработке в данной задаче, представляет собой короткую и весьма простую программу, использующую подпрограмму DATE 1 для определе¬ ния дня недели любой заданной даты начиная с 1600 г. Мы живем в мире, имеющем четыре измерения. Чтобы точно определить некоторое событие, необходимо указать четыре коор¬ динаты, три из которых описывают место, где оно произошло, а четвертая — время, когда оно произошло. Текст пригласитель¬ ного билета на какое-либо предстоящее мероприятие имеет за¬ частую вид, подобный следующему: Приглашаем Вас принять участие в праздновании первой годовщины основания на Марсе постоянно действующей станции ’’База 1”. Празднование состоится в помещении Агентства межпланет¬ ных космических полетов, расположенном на пересечении аллей Вязов и Третьей авеню (6-й этаж), 4 июня 2006 г. в 14 ч. 30 мин. Если необходимо сопоставить два события, то следует ука¬ зать как географическое расстояние между пунктами, где проис¬ ходят события, так и разность во времени их возникновения. Хотя для измерения расстояния используется много различных еди¬ ниц (дюймы, футы, мили, сантиметры, метры, километры), они по крайней мере являются величинами постоянными. В футе содержится 12 дюймов, будь это в Детройте, Чикаго или даже Лондоне. К сожалению, этого нельзя сказать о единицах време¬ ни, в частности о месяцах. Июль содержит 31 день, апрель —> 30 дней, февраль — 28 дней (29 в високосном году). Год может содержать 365 дней (например, 1981 г.) или 366 (1980 г.). Годы объявлялись високосными не регулярно и содержали не только дополнительные дни, но и целые месяцы. Тот или иной год провозглашался високосным по политическим мотивам. Ос¬ нованием для этого могло служить даже желание правителей продлить свое пребывание у власти. В наличии столь неразумной, по нашим представлениям, системы отсчета времени можно упрекать астрономию, поскольку три основные единицы измерения времени, рассматриваемые ни¬ же, базируются на астрономических явлениях, и именно это слу¬ жит источником указанных недоразумений.
144 Глаза 4 1. Сутки1'— период времени, за который Земля делает пол¬ ный оборот вокруг своей оси. Для решения задач, рассматривае¬ мых в данной книге, можно считать, что сутки постоянны и рав¬ ны точно 24 час. В действительности это не совсем верно * 2). 2. Месяц — промежуток времени, приблизительно равный периоду обращения Луны вокруг Земли3) (около 29,5 сут.). 3. Год — промежуток времени, приблизительно равный пе¬ риоду обращения Земли вокруг Солнца и длящийся около 365 сут 5 ч 48 мин 46 с. Если бы эти единицы измерения‘были кратны друг другу (на¬ пример, каждый месяц содержал бы ровно 30 дней, а год— 360 дней, т. е. точно 12 мес), используемый в настоящее время календарь был бы существенно проще, что значительно упрости¬ ло бы и решение рассматриваемой задачи. Однако необходимость строгого соблюдения предписаний календаря вынуждает идти на соответствующие ухищрения при составлении алгоритмов и программ, оперирующих указанными выше единицами измерения времени. Основной целью данной задачи является разработка подпро¬ граммы DATE1, которая в дальнейшем используется в несколь¬ ких программах, требующих измерения интервалов времени, в частности при составлении универсального календаря и вычис¬ лении биоритмов. Для определения географических координат некоторого объек¬ та необходимо располагать некоторым началом отсчета. Напри¬ мер, географическая долгота измеряется в градусах, отсчитывае¬ мых к западу или к востоку от Гринвичского меридиана. Анало¬ гично этому при измерении времени также необходимо распола¬ гать некоторой ’’точкой” отсчета. Х) Существует два определения суток. Первое определение связано с измерением суточного вращения Земли относительно Солнца. Это обычные, или солнечные, сутки. Кроме солнечных в астрономических измерениях также используются так называемые звездные сутки, определяющие су¬ точное вращение Земли относительно звезд. 2) Скорость вращения Земли не постоянна. Существует множество факторов, вызывающих некоторые, хотя и незначительные, изменения ве¬ личины скорости. Фактически любой из нас может повлиять на значение этой величины. Для этого достаточно кому-нибудь из нас, до сих пор, например, сидевшему на стуле, всего лишь встать. В соответствии с зако¬ ном сохранения момента количества движения вы тем самым уменьшаете скорость вращения Земли. По этому же принципу находящийся на льду фигурист может изменять скорость собственного вращения, вытягивая руки в сторону или же прижимая их к телу. Встав на ноги, вы, конечно же, изменили скорость вращения Земли на ничтожно малую величину, но тем не менее изменили. 3) Период обращения Луны относительно Земли определяется путем измерения промежутка времени, за который происходит полный цикл смены лунных фаз,
Измерение времени 145 В дайной задаче в качестве начала отсчета времени выбрано 31 декабря 1599 г. Для такого выбора имеются две причины. Во- первых, большинство событий, которые могут нас интересовать, произошли позднее этой даты. Во-вторых, действовавший до ука¬ занного времени календарь претерпевал множество изменений, и вследствие этого программа определения календарных дат, пред¬ шествовавших этому числу, была бы существенно более сложной. Последнее значительное изменение календаря имело место в 1582 г. Однако новая система лишь гораздо позднее распростра¬ нилась на большинство стран. По этой причине, например, воз¬ никают иногда разногласия относительно даты рождения'Дж. Ва¬ шингтона: в одних случаях указывается 11 февраля 1731 г., в других — 22 февраля 1732 г. Первая дата соответствует старому, юлианскому календарю а вторая — современному григориан¬ скому. В рассматриваемой задаче используется летосчисление по григорианскому календарю. В первой части решаемой задачи требуется вычислить коли¬ чество дней, прошедших с 31 декабря 1599 г. до заданной даты. Так, до 3 января 1600 г. прошло 3 дня, а до 4 февраля — 35 дней. Поскольку при решении последующих задач данной главы такие вычисления требуются неоднократно, алгоритм подобных вычислений целесообразно оформить в виде подпрограммы, име¬ нуемой в дальнейшем DATE 1. Для нумерации строк данной подпрограммы используются числа из интервала значений 9000—• 9999. Чтобы использовать эту подпрограмму как часть некоторой программы на языке Бейсик, достаточно загрузить ее в оператив¬ ную память машины путем обращения к соответствующему маг¬ нитному диску или магнитной ленте, где она хранится под име¬ нем DATA 1. Необходимо учесть, что при этом в тексте программы нельзя нумеровать строки числами 9000—9999, а также исполь¬ зовать имена переменных, которые имеются в тексте подпрограм¬ мы DATE 1, за исключением переменных, являющихся входными или выходными параметрами подпрограммы. Чтобы подпрограмма DATE1 могла выполнить свои функ¬ ции, ей необходимо передать в качестве исходных данных значе¬ ния трех переменных Л4, О и У, которые обозначают соответст¬ венно месяц, день и год (последний не должен быть меньше 1600). Для удобства программирования присвоим месяцам следую¬ щие числовые обозначения: М = 1 — январь М=2 — февраль М=3 — март М=4 — апрель М=5 — май ЛА=6 — июнь
146 Глава 4 М=7 —июль М=8 — август М=9 —сентябрь М=10 — октябрь М = 11 — ноябрь М = 12 — декабрь Результатом выполнения подпрограммы является число, опре¬ деляемое переменной DY и равное количеству дней, прошедших с 31 декабря 1599 г. до заданной даты. Поскольку данная под¬ программа достаточно сложна, целесообразно разделить ее на следующие процедуры: 1) анализ заданного года Y с целью выяснения, не является ли он високосным; 2) анализ корректности задания даты как сочетания дня и месяца. Например, 30 января — корректная дата, а 30 февра¬ ля — некорректная; 3) определение порядкового номера дня в данном году (на¬ пример, 7 января — это 7-й день года, а 4 февраля — 35-й день),? 4) определение количества дней от 31 декабря 1599 г. до задан¬ ной даты. Рассмотрим подробнее все перечисленные процедуры. Анализ заданного года с целью выяснения, является ли он високосным Эта процедура реализуется в виде отдельной подпрограммы, в которой в качестве выходной используется лишь одна перемен¬ ная L. В случае високосного года L = l, в случае обычного года L=0. Продолжительность каждого года в днях определяется выражением 365+L, а продолжительность февраля — выраже¬ нием 28+L. Если бы рассматриваемая задача оперировала датами до 1582 г., программирование данной процедуры не вызвало бы ни¬ каких затруднений: в юлианском календаре тех времен каждый високосный год был числом, кратным четырем (т. е. делящимся на 4 без остатка). Однако в этом случае средняя продолжитель¬ ность каждого года составляет 365 дней и 6 ч. Учитывая, что Земля делает полный оборот вокруг Солнца приблизительно за 365 дней 5 ч 48 мин и 46 с, приходим к заключению, что год по юлиан¬ скому календарю длиннее солнечного. В 1582 г. по указанию римского папы Григория XIII была проведена реформа календа¬ ря. В соответствии с введенными изменениями високосными пере¬ стали считать годы, оканчивающиеся двумя нулями, за исключе¬ нием тех, которые делились на 400 без остатка. По этой системе годы 1600, 2000 и 2400 являются високосными, а годы 1700,
Измерение времени 147 1800, 1900 и 2100 — невисокосными. Схема алгоритма определе¬ ния, является ли заданный год високосным, приведена на рис. 13.1. В программе 13.1 приложения соответствующая подпро¬ грамма размещена в строках 9800—9900. Читателю предлагается написать текст подобной подпрограммы самостоятельно,, обра¬ щаясь к программе 13.1 приложения лишь при возникновении затруднений. В программе 13.1 при составлении этой подпрограм¬ мы использована одна особенность арифметики целых чисел, которую целесообразно рассмотреть подробнее. В данном случае требуется определить, делится ли число А на число В без остат¬ ка (т. е. определяется кратность одного числа по отношению к другому). Например, число 24 делится на 4 без остатка, посколь¬ ку результат деления 24/4=6 — целое число. Напротив, 25 не делится на 4 без остатка, так как результат деления 25/4= 6,25 не равен целому числу. Если А делится на В без остатка, то число
148 Глава 4 (А/В) — целое, т. е. A/B = INT (А/В). Возможность деления од¬ ного числа (Л) на другое число (В) без остатка определяется с помощью следующего оператора: IF INT(A/B) = A/В THEN 1000 : REM ПЕРЕХОД К МЕТКЕ 1000, ЕСЛИ А ДЕЛИТСЯ НА В БЕЗ ОСТАТКА Анализ корректности задания даты Эта процедура должна выполняться в самом начале програм¬ мы. Ее назначение — анализ корректности задания даты как соче¬ тания дня и месяца. Аналогично тому как человек должен пом¬ нить, сколько дней в каждом месяце (30 дней в апреле, июне, сен¬ тябре и ноябре), так и в памяти ЭВМ должна храниться информа¬ ция о количестве дней в каждом месяце. Эту информацию для хранения в ЭВМ удобно оформить в виде таблицы, которая может быть сформирована, например, с помощью следующих операторов: 9130 DIM МТ(12) 9140 МТ(1) = 31 : REM В ЯНВАРЕ 31 ДЕНЬ 9150 МТ(3) = 31 : REM В МАРТЕ 31 ДЕНЬ 9240 МТ(12) = 31 s REM В ДЕКАБРЕ 31 ДЕНЬ 9250 МТ(2) = 28 + L : REM В ФЕВРАЛЕ 28 ИЛИ 29 ДНЕЙ (В ВИСОКОСНЫЙ ГОД) Однако использование приведенного фрагмента программы связано с некоторыми затруднениями. Часть программы, реали¬ зующая описываемую процедуру и, следовательно, включа¬ ющая данный фрагмент, должна допускать многократное ис¬ пользование, но оператор в строке 9130 может выполняться только один раз. При несоблюдении этого условия ЭВМ выдаст сообщение об ошибке. Чтобы избежать этого, в текст программы достаточно включить следующие строки: 9120 IF SW = 1 THEN 9250 9250 SW = 1 : GOSUB 9800 9260 MT(2) = 28 + L : REM В ФЕВРАЛЕ 28 ИЛИ 29 ДНЕЙ (В ВИСОКОСНОМ ГОДУ) При первом обращении к этой процедуре операторы строк 9130—9240 будут выполнены, поскольку значение переменной первоначально равно 0; при последующих обращениях к данной процедуре операторы этих строк не выполняются (’’пропускают¬ ся”). Отметим, что оператор в строке 9260 определяет число дней в феврале, при этом используется выходная переменная L под¬ программы анализа, является ли данный год високосным. Схема алгоритма процедуры анализа корректности заданной даты приведена на рис. 13.2; в программе 13.1 приложения ей соответствуют строки 9090-9330.
Измерение времени 149 Начало Рис. 13.2. Определение порядкового номера дня в данном году Рассмотрим действия, соответствующие этой процедуре, на конкретном примере. Пусть необходимо проверить, действитель¬ но ли 7 апреля является 97-м днем года. Сначала определяется количество дней в месяцах, предшествующих апрелю: 31 Н- 28 + 31 ^90. Количество дней в январе Количество дней в феврале Количество дней в марте
150 Глава 4 Таким образом, за первые три месяца прошло 90 дней. Поскольку 7 апреля — седьмой день 4-го месяца, то от начала года —это 97-й день (90+7=97). Описанную процедуру реализует следую¬ щий фрагмент программы: 9370 DY = D 9390 FOR I = 1 ТО М—1 9400 DY = DY + MT(I) : REM ДОБАВЛЕНИЕ КОЛИЧЕСТВА ДНЕЙ ПРЕДЫДУЩИХ МЕСЯЦЕВ 9410 NEXT I Однако такая последовательность действий не учитывает следующее: если Л4 = 1, цикл FOR...NEXT выполнять бессмыс¬ ленно, поскольку предыдущие месяцы отсутствуют. Поэтому предлагаемое выше решение нуждается в корректировке: не¬ обходимо добавить строку 9380 IF М = 1 THEN 9420 передающую управление следующей части программы при 7И = 1. Данную процедуру реализуют строки 9340—9410 программы 13.1 приложения. Определение количества дней от 31 декабря 1599 г. до заданной даты Существует много вариантов реализации этой процедуры. Рассмотрим один из них, который хотя и не отличается высоким быстродействием, но весьма прост при программировании. Чита¬ тель при желании может попытаться разработать алгоритм боль¬ шего быстродействия. Приводимый ниже алгоритм аналогичен алгоритму описанной процедуры определения порядкового но¬ мера дня в данном году. Подсчет общего количества дней, про¬ шедших с 31 декабря 1599 г., производится путем последователь¬ ного суммирования чисел 365 (или 366 для високосных годов), соответствующих полному году, начиная с 1600. Ниже представ¬ лен соответствующий фрагмент программы: 9460 YR = Y : REM ЗАПИСЬ ЗНАЧЕНИЯ Y НА ХРАНЕНИЕ В YR 9470 IF YR = 1600 THEN RETURN 9480 FOR Y = 1600 TO YR —1 9490 GOSUB 9800 : REM ПЕРЕХОД К ПОДПРОГРАММЕ ОПРЕДЕЛЕНИЯ, ЯВЛЯЕТСЯ ЛИ ДАННЫЙ ГОД ВИСОКОСНЫМ 9500 DY = DY + 365 + L : REM ДОБАВЛЕНИЕ КОЛИЧЕСТВА ДНЕЙ ПРЕДЫДУЩИХ ЛЕТ 9510 NEXT Y 9520 Y = YR : REM ВОССТАНОВЛЕНИЕ ИСХОДНОГО ЗНАЧЕНИЯ ПЕРЕМЕННОЙ Y 9530 RETURN Теперь необходимо объединить все рассмотренные выше фраг¬ менты в одну подпрограмму. При возникновении каких-либо
Измерение времени 151 затруднений можно обратиться к аналогичной программе 13.1, приводимой в приложении. Прежде чем продолжить решение задачи, поставленной в дан¬ ном разделе, желательно проверить работоспособность составлен¬ ной подпрограммы, используя ее при выполнении следующей ко¬ роткой программы: 100 INPUT ’’МЕСЯЦ, ДЕНЬ, ГОД”; М, D, Y 110 GOSUB 9000 : REM ВЫЗОВ ПОДПРОГРАММЫ DATE 1 120 PRINT ”DY = DY 130 PRINT 140 GO TO 100 Ниже приведены примеры тестовых входных данных и соответст¬ вующие им правильные результаты работы данной подпрограм¬ мы. 2, 20, 1600 2, 20, 1601 2, 30, 1970 2, 29, 1980 3, 01, 1980 12, 31, 1600 DY = 51 DY = 417 DY = 135,191 DY = 138,852 DY = 138,853 DY = 366 Определение дней недели После разработки и проверки работоспособности подпрограм¬ мы DATE 1 можно перейти к написанию разнообразных программ, оперирующих календарными датами. Первой рассмотрим про¬ грамму, определяющую, каким днем недели является любая календарная дата после 1 января 1600 г. Для составления программы необходимо знать, каким днем недели была дата начала отсчета. В данном случае воспользуем¬ ся тем фактом, что 31 декабря 1599 г. приходилось на пятницу. Пусть теперь требуется определить, на какой день приходится 20 февраля 1970 г. Воспользовавшись подпрограммой DATE1, определяем, что с 31 декабря 1599 г. по 20 февраля 1970 г. про¬ шел 135 191 день. Разделив это число на 7, получим: 135 191 : 7 = 19 313, остаток-0. Таким образом получаем, что между ука¬ занными выше двумя датами прошло ровно 19 313 недель, сле¬ довательно, 20 февраля 1970 г. тоже падает на пятницу. 21 фев¬ раля 1970 г. отделяют от 31 декабря 1599 г. 135 192 дня, или 19 313 недель и один день, так как остаток от деления равен 1. Сле¬ довательно, 21 февраля 1970 г. падает на субботу. Читателю предлагается самостоятельно написать программу, определяющую с помощью подпрограммы DATA1, каким днем недели является любая заданная дата. При этом необходимо сос¬ тавить программу таким образом, чтобы она определяла остаток от деления переменной DY на 7. Если деление выполнять обыч¬ ным образом, то результат представляется в форме веществен¬
152 Глава 4 ного числа. Например, результат деления 263 на 7 равен 37, 571 428. Для вычисления остатка от деления DY на 7 необходимо воспользоваться следующим оператором: R = DY — INT(DY/7)*7 Рассмотрим последовательность операций, выполняемых этим оператором при ОУ =263: 263/7 = 37,571 428 1МТ(263/7) = 37 — ЧИСЛО ПОЛНЫХ НЕДЕЛЬ INT(263/7)*7 = 259 — КОЛИЧЕСТВО ДНЕЙ В НАЙДЕННОМ ЧИСЛЕ НЕДЕЛЬ 263 — INT (263/7)^7 = 263 — 259 = 4 — ЗНАЧЕНИЕ ОСТАТКА Если при разработке данной программы встретятся затрудне¬ ния, можно обратиться к программе 13.2 приложения. Прежде чем приступить к набору текста программы, следует удостове¬ риться, что с магнитного диска или ленты в оперативную память ЭВМ загружена подпрограмма DATE1. Ниже приведены данные для тестирования полученной программы: 3 января 1981 г.— суббота 14 июля 1981 г.— вторник 16 мая 1943 г.— воскресенье 29 февраля 1968 г.— четверг 1 марта 1968 г.— пятница 4 марта 1900 г.— воскресенье 4 марта 2000 г.— суббота Дополнительные задания 1. Напишите программу, определяющую, какими днями не¬ дели являются все дни рождения человека в возрасте 0—100 лет (дата рождения человека подлежит вводу). 2. Напишите программу, которая позволит определить коли¬ чество дней между двумя заданными датами. (Указания начина¬ ющему программисту, следует вычислить количество дней от 31 декабря 1599 г. до каждой из заданных дат и затем произвести вычитание.) Задача 14. Универсальный календарь Назначение разрабатываемой программы: формирование на экране дисплея изображения календаря для заданного месяца любого года после 1600. Специфические предпосылки успешной разработки: знаком¬ ство с решением задачи 13.
Измерение времени 153 Пояснения программисту: для тех, кто успешно справился с решением задачи 13, составление данной программы не предста¬ вит особого труда. В данной задаче составляется программа, ’’превращающая” персональную ЭВМ в универсальный календарь. С помощью этой программы на экране дисплея ЭВМ формируется изображение календаря для выбранного месяца любого года начиная с 1600. На рис. 14.1 приведен пример изображения такого календаря для апреля 1983 г. АПРЕЛЬ!933 Вс Пн Вт Ср Чт Пн • » Сб V 1 > 1 . 2 « 3 . 4 . 5 ". 6 • 7 « » . 8 . р t 10 . 1 1 12 . 13 ' 14 . ■ . 15 . 16 17 . 18 . 19 . 20 21 ■ ч . 22 . 23 24 . 25 . 26 27 . 28 • • . 29 . 30 . Рис. 14.1. В данной программе используется подпрограмма DATE1, разработанная при решении задачи 13. Формирование текста программы следует начать с загрузки в оперативную память машины подпрограммы DATE1 с магнитного диска или ленты. Имея в своем распоряжении подпрограмму DATE1, основные усилия можно направить на программирование той части задачи, которая обеспечивает построение на экране дисплея изображе¬ ния календаря. Разрабатываемая программа состоит из трех основных частей: 1) ввод информации о месяце и годе; 2) использование подпрограммы DATE1 для определения количества дней в заданном месяце, а также дня недели, на кото¬ рый выпадает первое число этого месяца; 3) формирование изображения календаря.
154 Глава 4 Ввод информации о месяце и годе Наиболее простой путь реализации данной процедуры ввода — это использование оператора следующего вида: 100 INPUT ’’ВВЕДИТЕ МЕСЯЦ, ГОД”; М, Y Более строгим решением является ввод названия месяца с последующей проверкой корректности введенного названия. Для этого необходимо наличие таблицы названий месяцев. 100 DIM NTS(12) : REM ТАБЛИЦА НАЗВАНИЙ МЕСЯЦЕВ 110 КТ$(1) = ’’ЯНВАРЬ” 120 NT$(2) = ’’ФЕВРАЛЬ” 130 NTS(3) = ’’МАРТ” 140 NT§(4) = ’’АПРЕЛЬ” 150 NT$(5) = ’’МАЙ” 160 NTS(6) = ’’ИЮНЬ” 170 NT$(7) = ’’ИЮЛЬ” 180 NTS(8) = ’’АВГУСТ” 190 NT$(9) = ’’СЕНТЯБРЬ” 200 NTS(10) = ’’ОКТЯБРЬ” 210 NTS(H) = ’’НОЯБРЬ” 220 NT$(12) = ’’ДЕКАБРЬ” В этом случае ввод названия месяца и поиск в таблице соот¬ ветствующего ему номера могут быть выполнены следующим фрагментом программы: 230 INPUT ’’ВВЕДИТЕ НАЗВАНИЕ МЕСЯЦА”; MN$ 240 РЕМ ПОИСК МЕСЯЦА В ТАБЛИЦЕ 250 FOR М = 1 ТО 12 260 IF NT§(M) = MN$ THEN 300 270 NEXT M 280 REM ВЫВОД СООБЩЕНИЯ ОБ ОШИБКЕ, ЕСЛИ МЕСЯЦ НЕ НАЙДЕН В ТАБЛИЦЕ 290 PRINT ’’НЕКОРРЕКТНОЕ НАЗВАНИЕ МЕСЯЦА” : GOTO 230 Техника просмотра таблиц с целью идентификации в ней того или иного элемента широко применяется в программировании, а поэтому используется и в последующих задачах данной книги. После ввода месяца М следует выполнить ввод года Y. Значения М и Y являются исходными данными для подпрограммы DATE1. Использование подпрограммы DATE 1 Сначала переменной D следует присвоить значение 1. После этого с помощью подпрограммы DATE1 необходимо вычислить значения двух других переменных: 1) МТ(М), определяющей количество дней в заданном ме¬ сяце; 2) DY определяющей количество дней, прошедших с 31 де¬ кабря 1599 г. до первого числа заданного месяца.
Измерение времени 155 В данной задаче переменная DY используется для определе¬ ния дня недели, на который выпадает первое число заданного месяца (при необходимости можно обратиться к программе 13.2 приложения). В разрабатываемой программе дни недели обоз¬ начим цифрами в следующем порядке: Воскресенье О Понедельник 1 Вторник 2 Среда 3 Четверг 4 Пятница 5 Суббота 6 Поскольку исходная дата 31 декабря 1599 г. была пятницей (цифра 5), то для определения дня недели можно воспользовать¬ ся следующим оператором: I = DY + 5 — 7 ❖ INT((DY + 5)/7) Формирование изображения календаря на экране дисплея Разработка этой части программы является наиболее трудо¬ емкой. На рис. 14.2 представлен экран дисплея, который под¬ лежит разметке в соответствии с нумерацией строк и столбцов, J /11 № JZ АПРЕЛЬ1?83 ✓А 3 ВС Пн Вт Ср ЧТ Пт Сб у / л Рис. 14.2 принятой для ЭВМ типа Apple (см. также рис. 14.1). Строки 1—5 формируются посредством нескольких операторов PRINT. При этом следует тщательно подобрать требуемое количество пробе¬
156 Глава 4 лов. Строки 6—20 образуют повторяющийся рисунок ряда кле¬ ток таблицы календаря; этот ряд представлен отдельно на рис. 14.3, Для календаря на апрель 1983 г. (рис. 14.2) требуется 5-кратное повторение приведенного ряда клеток. Для других месяцев может потребоваться иное количество таких рядов, о чем свидетельствует рис. 14.4. • •■•■••о Рис. 14.3. Таким образом, прежде всего нужно определить необходимое число рядов в календаре месяца. После этого следует начать за¬ полнение первого ряда. Переменная I указывает, каким днем недели является первое число данного месяца, и тем самым опре- деляет количество клеток в первом ряду, Пн 6 13 20 27 , которые должны Сб 7 2^ Требуются 4 ряда 28 Вс 1 8 15 22 Ли 2 9 16 23 Вт 3 10 17 24 СР 4 11 18 25 Чт 5 12 19 26 1 2 3 4 5 £ 13 7 14 8 15 9 16 10 17 11 18 12 19 Требуется 5 рядов 20 21 22 23 24 25 26 27 28 2 3 4 5 6 7 1 8 9 10 11 12 13 14 15 Требуется 6 рядов 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Рис. 14.4. таться пустыми. Например, если первое число месяца — среда, то 1=3 и в первом ряду календаря следует оставить пустыми пер¬ вые три клетки (рис. 14.5). Выражение МТ(Л4)+/ определяет необходимое число пустых клеток. Далее необходимо составить Вс Пн Вт Ср Чт пт Сб 1 2 3 4 5 6 7 8 9 10 11 Рис. 14.5. выражение для вычисления требуемого числа рядов (NL). Если программирование операций, позволяющих вычислять значение NL, вызывает затруднения, можно обратиться к строке 470 программы 14.1 приложения.
Измерение времени !57 Теперь можно перейти к программированию остальной части графического изображения таблицы календаря. Для этого вос¬ пользуемся циклом FOR . . . NEXT, который повторяет NL раз рисунок одного ряда клеток таблицы (строки 6—8 изображения на экране дисплея). При необходимости читатель может обратить¬ ся к строкам 500—550 программы 14.1 приложения. Начало Рис. 14.6. Таким образом, изображение таблицы календаря сформирова¬ но и теперь можно приступить к заполнению ее клеток числами. Для этого сначала необходимо выполнить позиционирование кур¬ сора в клетку таблицы, предназначенную для первого числа ме¬ сяца (рис. 14.1 и 14.2). Если первое число месяца падает на воскресенье, то цифра 1 должна воспроизводиться в поле экрана с координатами 3, 7 [т. е. НТАВ (3): VTAB (7)]. Если первое число месяца падает на вторник, то цифру 2 необходимо воспроизвести в позиции с ко¬
158 Глава 4 ординатами 13, 7. Поскольку первые две клетки первого ряда таблицы календаря для данного месяца должны оставаться пусты¬ ми, курсор получил исходное смещение вправо на 2x5 = 10 про¬ белов. По мере заполнения таблицы числами месяца переменные X и Y принимают значения текущих координат позиции отобража¬ емого числа. Исходным значением координаты Y является 7, а координаты X — (3+5*/), где / — число пустых клеток в первом ряду. Для позицирования курсора при отображении чисел на экране дисплея используются операторы VTAB(F) и НТАВ(Х). Схема алгоритма функционирования этой части программы приведена на рис. 14.6. Блоки, обведенные штриховой линией, образуют цикл FOR . . . NEXT, параметр которого J принимает значения от / до МТ(Л4), где МТ(Л4) — число дней в заданном месяце. Пользуясь схемой алгоритма на рис. 14.6, можно закончить формирование текста программы. Эта часть программы соответст¬ вует строкам 600—670 программы 14.1 приложения. Задача 15. Определение биоритмов Назначение разрабатываемой программы: построение графиков биоритмов человека для любого заданного месяца. Специфические предпосылки успешной разработки; знакомст¬ во с решением задачи 13. Пояснения программисту: у тех, кто успешно справился с решением задачи 13, разработка данной программы не вызовет особых затруднений. Некоторые люди (автор книги не принадлежит к их числу) полагают, что жизнь и поведение человека подвержены влиянию трех циклических процессов, называемых биоритмами, которые характеризуются определенными днями ’’подъема” и ’’спада” жизнедеятельности. Первый среди таких процессов определяет физическое состояние человека. Началом этого цикла полагают день рождения, в который величину активности принимают рав¬ ной нулю. Считают, что продолжительность цикла физического биоритма составляет 23 дня. За этот период происходит увели¬ чение активности до максимума (условно равного 1), затем сни¬ жение до минимума (условно равного —1), после чего значение физического биоритма возвращается к начальной (нулевой) величине. График такого процесса приведен на рис. 15.1. В даль¬ нейшем этот цикл повторяется с периодом 23 дня. Полагают, что большим значениям графика соответствуют дни, более ’’благоприятные” с точки зрения физического состоя-
Измерение времени 159 ния данного человека. Дни, соответствующие переходу графика биоритма через 0, называются ’’критическими”. Считается, что ’’критические” дни потенциально наиболее неблагоприятны для человека по состоянию физических сил. Второй из упомянутых циклических процессов отражает эмоциональное состояние человека. Так же как и физический цикл, он ведет свой отсчет от момента рождения человека и пе¬ риодически изменяется, с той лишь разницей, что период эмо¬ ционального цикла равен 28 дням. Третий цикл отражает интеллектуальное состояние человека; он аналогичен первым двум, и период его повторения равен 33 дням. Указанные три цикла можно описать приведенными ниже вы¬ ражениями, в которых переменная X соответствует возрасту человека, выраженному в днях: Физический цикл Эмоциональный цикл Интеллектуальный цикл PH (X) = SIN (6.2832*Х/23) ЕМ (X) = SIN (6.2832:^/28) IN (X) = SIN (6.2832*Х/33) Для составления данной программы нет необходимости знать, как вычисляется функция SIN (синус) и вообще как определяют¬ ся тригонометрические функции, поскольку современные ЭВМ имеют так называемые встроенные функции, в том числе, и SIN. Последняя может быть использована именно так, как показана в приводимых выше формулах. На рис. 15.2 приведены графики всех трех циклически изменяющихся функций для первого ме¬ сяца жизни человека (переменная X принимает значения О— 30). Поскольку на одном рисунке приведены три графика, то для их различения используются линии трех типов, показанные на рис. 15.3. Целью рассматриваемой задачи являются написание програм¬ мы, построение графиков физического, эмоционального и интел¬ лектуального циклов человека для любого заданного месяца.
160 Глава 4 Как и при решении предыдущих задач, алгоритм решения дан¬ ной задачи можно представить состоящим из следующих трех процедур: 1) ввод в память машины фамилии человека, дня, месяца и года его рождения; 2) обращение к подпрограмме DATE1 для определения воз¬ раста человека на первое число заданного месяца; 3) построение графиков циклов. Физический. Сплошная цикл линия Эмоциональ - Штриховая ныи цикл линия Интеллекту- Пунктирная альныи цикл линия Рис. 15.3< Первые две процедуры подобны аналогичным процедурам предыдущих задач данной главы, поэтому запись их на языке программирования здесь не рассматривается. При необходимости можно обратиться к решению задачи 14, указаниям, приведенным в дополнительном задании 2 задачи 13, или к строкам 100—370 программы 15.1 приложения. Переходя к описанию программной реализации третьей про¬ цедуры, будем полагать, что ввод исходных данных выполнен и в результате обращения к подпрограмме DATE1 получена следую¬ щая информация: Фамилия, имя и отчество /7$ Месяц, день и год рождения /ИО, D0, У0 Месяц и год, для которых строятся графики био- /И, Y ритмов Возраст человека к началу месяца, для которого А строятся графики биоритмов (в днях)
Измерение времени 161 Теперь можно начать составление программы и построение гра¬ фиков биоритмов. Поскольку максимальное число дней в месяце равно 31, а значения отсчетов вдоль оси абсцисс поля экрана дисплея могут быть любыми целыми числами в диапазоне О— Отсчеты по оси х О 9 18 2736 45 Mini 7 2 3 4 5 6 270 —I 31 День месяца Рис. 15.4. 279, то представляется целесообразным использовать каждые 9 смежных отсчетов вдоль осп абсцисс для отображения на гра¬ фике одного дня (рис. 15.4). Согласно условию задачи, изменения всех трех функций, описывающих биоритмы, вдоль оси ординат поля экрана дисплея не должны выходить за пределы диапазона значений от—1 до +1 (рис. 15.5). +/т О Значения срункциа 0-75 Отсчеты по оси у {машинные координаты) 150 Рис. 15.5. При построении графиков прежде всего необходимо перевести дисплей в режим высокой разрешающей способности и вы¬ брать цвет для воспроизведения (HGR : HCOLOR=7). После этого следует сформировать изображение оси абсцисс (HPLOT 0,75 ТО 270, 75). Для большей наглядности графиков на ось абсцисс следует нанести деления, соответствующие каждому дню месяца (т. е. 0, 9, 18, 27, . . 270), как показано на рис. 15.6. Одно деление 6 № 98Э
162 Глава 4 наносится на ось абсцисс в точке с координатой 18 (Х = 18) G помощью оператора FIPLOT 18,73 ТО 18,77 Все остальные деления наносятся с помощью цикла FOR...NEXT. Читателю предлагается написать эту часть про¬ граммы самостоятельно (при затруднениях можно обратиться к строкам 410—430 программы 15.1 приложения). Следующим шагом при составлении программы является формирование процедуры вычисления значений биоритмических циклов согласно приводимым выше арифметическим выражениям, определяющим соответствующие функции, а именно: PH (X) = SIN (6.2832 * Х/23), ЕМ (X) = SIN (6.2832 * Х/28), IN (Х) = SIN (6.2832 *Х/33). Для вычисления значений всех трех функций можно воспользо¬ ваться одной и той же формулой D(X) = SIN (6.2832 Л/Р), в которой Р=23 для физического, Р=28 для эмоционального и Р=33 для интеллектуального циклов. Теперь необходимо так изменить диапазон значений функций D(X), чтобы согласовать его с разметкой осн ординат поля экрана дисплея. Значения функций изменяются от + 1 до —1, значения функции 75*D (X) — от +75 до —75, а значения функции (75—75*0 (X))—■ в пределах 0—150. Так, при О(Х)= —1 функция 75—75*0 (X) равна 150, что соответствует самой нижней точке поля экрана; именно здесь это значение функции и должно быть отображено. Таким образом, функция FN Y (X) определяется оператором DEF FN У(Х) = 75 — 75 ❖ SIN(6.2832 * Х/Р). Использование этой функции позволит рассчитать значения всех трех биоритмических циклов и отобразить их в соответствии
Измерение времени 163 с разметкой оси ординат. Приведенный выше оператор, будучи включенным в строку 440 текста программы, позволяет исполь¬ зовать функцию FNIY таким же образом, как используются в программе так называемые встроенные функции типа SQR (извлечение квадратного корня). Например, оператор B — FN Г (0) позволяет вычислить FN У(0)=75 Х) с присвоением результата переменной В. Напомним, что график каждого биоритмического цикла стро¬ ится при следующих значениях аргумента: Х=А, Л + 1, Л + +2, . . А'+МТ (М)—1, где А — возраст человека (в днях) па первое число заданного месяца, а МТ(М) — число дней в этом месяце. Вся информация, необходимая для построения графиков, представлена в табл. 15.1. Текст приводимой ниже подпрограм¬ мы обеспечивает построение требуемых графиков. Таблица 15.1 День месяца Возраст, дни Отсчет по оси абсцисс (машинные координаты) Отсчет по оси орди< нат (машинные коор» ди паты) 1 А 0 FN Y(A) 2 Л + 1 9 FN Г(Л + 1) 3 А +2 18 FN Y(Л +2) МТ(М) Л+/И7’(.'И)—1 9:ЧМ7(Л4)—Г FNY(A+M1'(M)—1) 600 КЕМ ПОДПРОГРАММА ПОСТРОЕНИЯ ОДНОГО БИОРИТМИЧЕСКОГО ЦИКЛА 610 REM ФИЗИЧЕСКИЙ ЦИКЛ Р = 23 620 REM ЭМОЦИОНАЛЬНЫЙ ЦИКЛ Р = 28 630 REM ИНТЕЛЛЕКТУАЛЬНЫЙ ЦИКЛ Р = 33 640 REM 650 HPLOT 0, FN Y(A) 660 FOR I = 2 ТО МТ(М) 670 HPLOT ТО 9 * (I — 1), FN Y(A + I — 1) 680 NEXT I 690 RETURN Завершить программу рекомендуется следующими строками! Р = 23 ; GOSUB 600 : REM ПОСТРОЕНИЕ ГРАФИКА ФИЗИЧЕСКОГО ЦИКЛА Р = 28 j GOSUB 600 5 REM ПОСТРОЕНИЕ ГРАФИКА Отметим, что SIN (0)=0t 6*
164 Глава 4 ЭМОЦИОНАЛЬНОГО ЦИКЛА Р = 33 : GOSUB 600 : REM ПОСТРОЕНИЕ ГРАФИКА ИНТЕЛЛЕКТУАЛЬНОГО ЦИКЛА Выполните программу на ЭВМ. На рис. 15.7 приведены ре¬ зультаты выполнения программы определения биоритмов чело¬ века, родившегося 7 августа 1950 г.; результаты получены для Чтобы сделать графики более наглядными, следует дополнить программу двумя процедурами. 1, Выводить на экран комментарии к графикам, используя 4 строки (21—24) в нижней части экрана, предназначенные для вывода текста. Результаты выполнения программы были бы более наглядными, если бы они сопровождались комментариями, по¬ добными следующим: ГРАФИК БИОРИТМОВ ДЛЯ СЮЗАН ЭЛДЕР НА ИЮЛЬ 1983 ДАТА РОЖДЕНИЯ : 7 АВГУСТА 1950 Реализация подобных рекомендаций не требует каких-либо новых приемов программирования, поэтому читателю предла¬ гается выполнить это самостоятельно (при наличии затруднений можно обратиться к строкам 510—530 программы 15.1 приложе¬ ния). 2. Использовать, как это показано на рис. 15.2, линии различ¬ ных типов (сплошные, штриховые, пунктирные) для построения графиков, которые иначе были бы плохо различимы из-за боль¬ шой схожести. Для этого можно использовать линии, подобные приведенным на рис. 15.3. Чтобы провести сплошную линию, не¬ обходимо соединять точки, координаты которых приведены в табл. 15.1. Для проведения штриховой линии расстояние между двумя соседними точками следует заполнять линиями только на 2/3, оставляя 1/3 в виде пробела. Это можно выполнить, напри¬ мер, с помощью следующих операторов:
Измерение времени 165 HPLOT О, FN Y(A) TO 6, FN Y(A 2/3) HPLOT 9, FN Y(A + 1) Результат однократного применения указанных операторов иллюстрирует рис. 15.8. Последовательное выполнение таких Рис. 15.8. Рис. 15.9. операторов при переходе от точки к точке формирует изображе¬ ние, подобное приводимому на рис. 15.9. Именно такую проце¬ дуру выполняет следующая подпрограмма: 600 REM ПОДПРОГРАММА ПОСТРОЕНИЯ ОДНОГО БИОРИТМИЧЕСКОГО ЦИКЛА ШТРИХОВЫМИ линиями 610 REM ФИЗИЧЕСКИЙ ЦИКЛ Р = 23 620 REM ЭМОЦИОНАЛЬНЫЙ ЦИКЛ Р - 28 630 REM ИНТЕЛЛЕКТУАЛЬНЫЙ ЦИКЛ Р = 33 640 REM 650 HPLOT 0, FN Y(A) 660 FOR I = 2 ТО МТ(М) 670 HPLOT ТО 9:Ц1 — 2) + 6, FN Y(A + I — 2 + 2/3) 680 HPLOT 9Ц1 — 1), FN Y(A + 1 — 1) 690 NEXT I 700 RETURN Читателю предлагается вставить данную подпрограмму в раз¬ рабатываемую программу и проверить ее работоспособность (изменению подлежат только строки 670—700). В результате ее выполнения все три графика изображаются штриховыми линия¬ ми (рис. 15.10). Путем введения новой переменной ВК данную подпрограмму можно модифицировать для получения штрихов разной длины. Значение переменной ВК определяет длину штри¬ ха как части каждого сегмента графика. Для вышеприведенного примера ВК=2/3. При ВК = 1 графики изображаются сплошны¬
166 Глава 4 ми линиями. Ниже приводится текст подпрограммы с использо¬ ванием переменной ВАД принимающей различные значения: 600 REM ПОДПРОГРАММА ПОСТРОЕНИЯ ОДНОГО БИОРИТМИЧЕСКОГО ЦИКЛА ШТРИХОВЫМИ линиями 610 REM РАЗМЕР ШТРИХА ОПРЕДЕЛЯЕТ ПЕРЕМЕННАЯ ВК 620 REM ФИЗИЧЕСКИЙ ЦИКЛ Р = 23 ВК - 1 630 REM ЭМОЦИОНАЛЬНЫЙ ЦИКЛ Р - 28 В К-2/3 640 REM ИНТЕЛЛЕКТУАЛЬНЫЙ ЦИКЛ Р = 33 ВК - 1/3 650 REM 660 HPLOT 0, FN Y(A) 670 FOR I = 2 ТО МТ(М) 680 HPLOT ТО 9=:.(1 — 2) + ВК*9, FN Y(A + I — 2 + ВК) 690 HPLOT 9Д1 — 1), FN Y(A + 1 — 1) 700 NEXT I Для обращения к данной подпрограмме можно использовать операторы, подобные следующим: Р = 23: ВК = 1: GOSUB 600 Р = 28: ВК - 2/3: GOSUB 600 Р = 33: ВК = 1/3: GOSUB 600 После ее выполнения графики должны выглядеть так, как показано на рис. 15.11 Программа графического представления биоритмов человека может оказаться одной из самых популярных для демонстрации возможностей вашей персональной ЭВМ, поэтому читателю реко¬ мендуется проявить особое понимание при ее разработке и от¬ ладке.
коды Во все времена существовали сведения, которые нельзя до¬ верить традиционным средствам связи и документирования. Если необходимо соблюсти секретность и уберечь некоторые сведения от любопытных глаз и ушей, обычно их шифруют, т. е. кодируют. В современном обществе для облегчения процессов кодирования и декодирования широко применяются средства вычислительной техники. В данной главе как раз и рассматри¬ ваются некоторые задачи, связанные с кодированием информа¬ ции. В задаче 16 рассматривается простейший способ шифрования— кодирование подстановкой. Речь идет о составлении небольшой программы, при помощи которой можно зашифровать, а затем расшифровать сообщение путем замены одних кодов другими (так называемая подстановка кодов). ' Задача 17 — первая в данной книге, посвященная обработке текстовой информации. Целью этой задачи является разработка программы, выполняющей функции простейшего редактора тек¬ ста; этот редактор используется в дальнейшем в задачах 18 и 19. В задаче 18 рассматриваются проблемы расшифровки кодов. В качестве возможного решения описывается программа, позво¬ ляющая прочитать сообщение, закодированное согласно указан¬ ному выше способу подстановки, даже в случае, когда таблица перекодировки заранее неизвестна. Содержанием задачи 1 9 является анализ более сложных кодов, труднее поддающихся расшифровке. Рассматриваемый в этой задаче код практически недекодируем. Задача 16. Простейшая шифровальная машина Назначение разрабатываемой программы: кодирование и декодирование произвольных сообщений подстановкой. При помощи этой программы можно закодировать (или декодировать) сообщение, вводимое с клавиатуры ЭВМ, причем результат об¬ работки отображается на экране дисплея одновременно с вводи¬ мым сообщением.
168 Глава 5 Специфические предпосылки успешной разработки: отсутст¬ вуют. Пояснения программисту: разрабатывается небольшая, но весьма полезная программа. Данная задача предполагает составление программы кодиро¬ вания и декодирования сообщений простейшим способом —• подстановкой. В процессе кодирования и соответственно декоди¬ рования каждая буква исходного текста сообщения заменяется другой в соответствии с таблицей перекодировки. В данной за¬ даче в качестве таблицы перекодировки используется табл. 16.1. Таблица 16,1 Исходная букса Заменяется на Исходная буква Заменяется на А С N X В Е О V С G D I Р т Е К Q R R N F М S L G 0 т J Н Q I S и И J и V F W D К W X В L У У А М Z Z Р Например, при кодировании сообщения ’’HELLO” в соответст¬ вии с таблицей перекодировки буква ”Н” заменяется на букву ”Q”, ”Е” — на ”К”, ”L” — на ”Y”, а ”0” — на ”V”, так что в ре¬ зультате получается ’’OKYYV”. Декодирование сообщения сво¬ дится к процессу, обратному кодированию: буква из левого столб¬ ца таблицы заменяет соответствующую ей букву из правого столбца. Например, при декодировании сообщения ’’OVVIEA” первая буква ”0” отыскивается в правом столбце таблицы пере¬ кодировки и заменяется на соответствующую ей букву ”G” из левой колонки; аналогичным образом буква ”V” заменяется бук¬ вой ”0”, буква ”1” — буквой ”D”, а буква ”А” — буквой ”Y”. В результате выясняется, что закодировано слово GOODBY. Как можно заметить, кодирование и декодирование сообще¬ ний таким способом — несложная, но весьма утомительная ра¬ бота, а именно такую работу обычно ’’поручают” вычислительной машине. Перед тем как приступить к составлению программы для
Коды 169 ЭВМ, следует попрактиковаться в кодировании и декодировании сообщений. Сообщение 1 необходимо закодировать, а сообще¬ ние 2 — декодировать с использованием табл. 16.1. Ответы поме¬ щены в конце этой страницы. Сообщение 1: This is a secret message Сообщение 2: CXLDKN JV RHKLJSVX JDV Более половины текста составляемой программы занимает таблица перекодировки — аналог таблицы 16.1 на языке Бей¬ сик: 100 REM КОДИРОВАНИЕ ПОДСТАНОВКОЙ 110 REM 120 REM ТАБЛИЦА ПЕРЕКОДИРОВКИ:А$(1) —БУКВА ИСХОДНОГО СООБЩЕНИЯ, В$(1)—ЗАКОДИРОВАННАЯ БУКВА 130 DIM AS(29), В$(29) 140 AS(1) = ”A”:BS(1) = ”C” 150 А$(2) = ”В”:В$(2) = ”Е” 160 А$(3) = ”С”:В§(3) = ”G” 170 Ag(4) = ”D”:BS(3) = ”1” 180 AS(5) = ”E”:B$(5) = ”K” 190 AS(6) = ”F”iB$(6) =”M” 200 A$(7) = ”G”:B§(7) = ”0” 210 AS(8) = ”H”:B$(8) = ”Q” 220 AS(9) = ”I”:BS'(9) = ”S” 230 AS(10) = ”J”:BS(10) = ”U” 240 AS(11) = ”K”:BS(11) = ”W” 250 AS(12) =’’L”:BS(I2) = ”Y” 260 A$ (13) = ”M”iB$(13) = ”Z” 270 AS(14) = ”N”:B$(14) = ”X” 280 A$(15) = ”O”:BS(15) = ”V” 290 A§(16) = ”P”:B$(16) = ”T” 300 A.S(17) = ”Q”:BS(17) = ”R” 310 AS(18) = ”R”:BS'18) = ”N” 320 AS(19) = ”S”:B$(19) = ”L” 330 A$(20) = ”T”:B$(20) = ”J” 340 AS(21) = ”U”:BS(2I) = ”H” 350 A$(22) = ”V”:BS(22) = ”F” 360 AS(23j =”W":BS(23) = ”D” 370 A$(24) = ”X”:B$(24) = ”B” 380 A§(25) = ”Y”:B$(25) = ”A” 390 A$(26) = ”Z”iB$(26) = ”P” 400 AS(27) = ”„”sBS(27) = 410 AS(28) = ”,”’B$(28) = 420 A$(29) = ” ”sB$(29) = ” ” omj uoijsanb oj jaMsuy эииэгпроод MODTOZ niND>n 3 ns nsdr 'I эинэтрооэ Фрагмент программы, соответствующий табл. 16.1, дополнен тремя символами (точка, запятая и пробел), т. е. наиболее упо¬ требительными знаками пунктуации. Пользователь вводит с клавиатуры ЭВМ сообщение, подлежа¬ щее кодированию или декодированию. Непосредственно после
170 Глава 5 ввода сообщения на экране дисплея помимо текста исходного со¬ общения появляется результат обработки. На рис. 16.1 показано расположение информации на экране дисплея при кодировании, а на рис. 16.2 — при декодировании сообщения. THIS IS A SAMPLE RUN OF CODER, A PROGRAM TO ENCODE AND DECODE MESSAGES USING A SIMPLE SUBSTITUTION CODE. JQSL SL C LCZTYK NHX VM GVIKN, c tnvoncz jv kxgvik CXI IKGVIK ZKLLCOKL HLSXO C LSZTYK LHELJSJHJSVX GVIK. Рис. 16.1. Для управления расположением информации на экране дисплея следует использовать операторы VTAB и НТАВ. При этом не¬ обходимы две переменные I и J для указания номеров строки и JQSL SL С LCZTYK NHX VM GVIKN, C TNVONCZ JV KXGVIK CXI IKGVIK ZKLLCOKL HLSXO C LSZTYK LHELJSJHJSVX GVlK. THIS IS A SAMPLE RUN OF CODER, A PROGRAM TO ENCODE AND DECODE MESSAGES USING A SIMPLE SUBSTITUTION CODE. Рис. 16.2. столбца местоположения каждого символа исходного сообщения. Таким образом, последовательность операторов VTAB I: НТАВ J: GET Х$ PRINT Х§ позволяет осуществить ввод с клавиатуры и вывод на экран дис¬ плея каждого символа исходного сообщения. Для размещения результата кодирования или декодирования исходного сообще¬ ния в нижней половине экрана дисплея можно воспользоваться следующей последовательностью операторов: VTAB 1 + 12: НТАВ J: PRINT ; При обработке каждого следующего символа его местоположе¬ ние на экране должно быть изменено. Алгоритм управления зна¬ чениями переменных I и J, указывающими положение обрабаты¬ ваемого символа на экране, показан на рис. 16.3,
Коды 171 Рис. 16.3. Процесс кодирования или декодирования символов сообще¬ ния осуществляется циклически посредством оператора FOR...NEXT, выполняющего поиск очередного символа в таблице перекодировки. Например, 660 FOR К = 1 ТО 29: REM ПОИСК СИМВОЛА В ТАБЛИЦЕ ПЕРЕКОДИРОВКИ 670 IF Ag(K) = X$ THEN PRINT X§;: VTAB 1Д-12: HTAB J: PRINT B$(K);: GOTO 700: REM ЕСЛИ ИСХОДНЫЙ СИМВОЛ В ТАБЛИЦЕ НАЙДЕН, ВЫВОД ИСХОДНОГО И ДЕКОДИРОВАННОГО СИМВОЛА 680 NEXT К 690 PRINT CHRS(7);: GOTO 620: REM ЕСЛИ СИМВОЛА В ТАБЛИЦЕ НЕТ (НЕОПОЗНАВАЕМЫЙ СИМВОЛ), ПОДАЕТСЯ ЗВУКОВОЙ СИГНАЛ И УПРАВЛЕНИЕ ВОЗВРАЩАЕТСЯ ПРОЦЕДУРЕ ВВОДА В этом цикле массив Д$ просматривается последовательно до тех пор, пока не будет найден элемент, совпадающий по значению с переменной Х$. Если таким элементом является Д$(/С), то эле¬ мент массива 5$ (/<) — символ, используемый для замены
172 Глава 5 Если же в результате просмотра таблицы символ, соответствую¬ щий не найден, пользователь, вероятно, ввел недопустимый символ (например, ”3”). Строка 690 фрагмента программы содер¬ жит оператор вывода, обеспечивающий подачу звукового сигна¬ ла (CHR$(7) эквивалентно управляющему символу CTRL-G), а также оператор возврата управления оператору GET. Теперь все подготовлено для самостоятельного составления читателем программы кодирования и декодирования сообщений. Если при этом возникнут затруднения, можно обратиться к про¬ грамме 16.1 приложения. Последняя содержит некоторые про¬ граммные решения, которые полезно использовать при раз¬ работке программы. 1. После ввода очередного символа (GETX$) осуществляется проверка, не является ли введенным управляющий символ CTRL-0 (CHRs(17)), т. е. выполняется ли равенство X$=CHR$ (17). В случае ввода символа CTRL-Q программа за¬ вершает работу. 2. После ввода очередного символа проверяется, не является ли введенным управляющий символ ’’RETURN” (’’Возврат ка¬ ретки” или CHR$(13), т. е. выполняется ли равенство X$=CHRS(13). В случае ввода символа ’’RETURN” указатель текущей позиции на экране переводится на следующую строку (7 = 7+1, 7 = 1). 3. Программа 16.1 позволяет пользователю выбрать режим кодирования или декодирования информации. Возможны различ¬ ные способы реализации переключения режимов. Постарайтесь предложить свою собственную реализацию этой возможности. При необходимости можно обратиться к строкам 540—560 и 800—810 программы 16.1. Для проверки написанной программы рекомендуется рас¬ шифровать приводимое ниже сообщение: JQSL SL С LKGNKJ ZKLLCOK. SJ QCL ЕККХ KXGVIKI HLSXO С LSZTYK LHELJSJHJSVX GVIK. LHGQ GVIKL CNK МНХ EHJ CNK XVJ FKNA LKGHNK CXI LQVHYI XVJ EK HLKI MVN SZTVNJCXJ ZKLLCOKL. Задача 17. М^ни-редактор текста Назначение разрабатываемой программы: использование в ка¬ честве редактора текста при разработке программ решения за¬ дач 18 и 19. (Принципы, лежащие в основе данного мини-редак¬ тора текста, могут служить как основополагающие при написа¬ нии различных программ для обработки текстовой информации.) Специфические предпосылки успешной разработки: отсутст¬ вуют.
Коды 173 Указания программисту: разрабатываемая программа весьма проста. Подлежащая разработке программа является по существу первой половиной программ решения задач 18 и 19. Практическое применение программы задачи 16 очень скоро приводит пользо¬ вателя к весьма неприятному заключению о том, что чрезвычайно трудно осуществить безошибочно ввод с клавиатуры закодиро¬ ванного текста, объем которого превышает несколько слов. В на¬ стоящей задаче разрабатывается мини-редактор текста, упроща¬ ющий процедуру ввода текстовой информации с клавиатуры ЭВМ. Эту программу можно также использовать как часть дру¬ гих программ, разрабатываемых пользователем. Программные решения рассматриваемой задачи могут быть использованы при разработке программ обработки той или иной текстовой информации. Так, если в распоряжении пользователя вычислительной машины имеется печатающее устройство, поль¬ зователь может создать собственную программу обработки тек¬ стов, положив в основу описываемые ниже решения. Разрабатываемый мини-редактор текста подобен редактору, входящему в состав программного обеспечения Applesoft. В част¬ ности, клавиши с обозначениями ’’стрелка влево” и ’’стрелка впра¬ во” имеют то же функциональное назначение. Однако описывае¬ мый редактор имеет свою специфику, позволяя, например, вста¬ вить букву в середину введенного текста посредством нажатия всего двух клавиш или удалить ее оттуда нажатием одной кла¬ виши, причем оставшаяся часть строки сдвигается на одну по¬ зицию, заполняя образовавшийся пробел. Возможности програм¬ мы этого редактора можно расширить, добавив к ней фрагменты, реализующие по желанию пользователя дополнительные функ¬ ции. При работе программы используется только 20 строк верхней части экрана дисплея. Строки 21—24 остаются свободными, они используются программой задачи 18. В начале этой программы следует зарезервировать область памяти для хранения обрабаты¬ ваемого текста: DIM С$(20, 40) Элемент массива С$(Л, Р) содержит символ, отображаемый на экране в позиции Р строки L. Первоначально каждый элемент массива С$ содержит символ ” ” (пробел); это означает, что область памяти, предназначенная для текста, свободна. При вы¬ полнении программы мерцающий курсор на экране дисплея ука¬ зывает первый символ той части текста, которая подлежит об¬ работке. При использовании оператора GET мерцающий кур¬ сор автоматически воспроизводится на экране. Строка программы VTAB L;HTAB P:GET Xg
174 Глава 5 позволяет отображать курсор в позиции Р строки L экрана до тех пор, пока пользователь не нажмет на какую-либо клавишу. При этом изображение курсора исчезает, и программа, именуе¬ мая редактором текста, переходит к выполнению команды, зада¬ ваемой пользователем путем набора на клавиатуре сочетания кла¬ виш ’’CTRL” и некоторой буквы, обеспечивающих ввод в ЭВМ того или иного среди шести управляющих символов, перечисленных ниже. 1. Управляющий символ CTRL-Q. При вводе этого символа текст на экране не меняется, но выполнение программы завер¬ шается. 2. Управляющий символ CTRL-U (’’стрелка вправо” или При вводе этого символа текст на экране не изменяется, но курсор перемещается на одну позицию вправо. Если курсор находится в последней позиции строки, то при вводе символа CTRL-U он автоматически перемещается в первую позицию сле¬ дующей строки. Если же курсор находится в последней позиции последней строки, никаких изменений при вводе CTRL-U на экране не происходит. До ввода символа CTRL-U (—>) ДЕМОНСТРАЦИЯ ВОЗМОЖНОСТЕЙ МИНИ-РЕДАКТОРА ТЕКСТА. МИНИ-РЕДАКТОР ПРЕДОСТАВЛЯЕТ ПОЛЬЗОВАТЕЛЮ РАЗЛИЧНЫЕ СРЕДСТВА РЕДАКТИРОВАНИЯ ТЕКСТА, В ТОМ ЧИСЛЕ УКАЗАННЫЕ НИЖЕ. t КУРСОР 1. CTRL — Q: ЗАВЕРШЕНИЕ РАБОТЫ РЕДАКТОРА 2. CTRL — U: ПЕРЕМЕЩЕНИЕ КУРСОРА НА ОДНУ ПОЗИЦИЮ ВПРАВО (— ->) 3. CTRL. — И: ПЕРЕМЕЩЕНИЕ КУРСОРА НА ОДНУ ПОЗИЦИЮ ВЛЕВО (< ) 4. CTRL — Е: ОБРАЗОВАНИЕ ПРОБЕЛА В ТЕКУЩЕЙ ПОЗИЦИИ СДВИГОМ СТРОКИ ВПРАВО ДЛЯ ПОСЛЕДУЮЩЕЙ ВСТАВКИ ЛИТЕРЫ 5. CTRL — D: УДАЛЕНИЕ ЛИТЕРЫ В ТЕКУЩЕЙ ПОЗИЦИИ 6. CTRL — М: ПЕРЕХОД К НОВОЙ СТРОКЕ (“ВОЗВРАТ КАРЕТКИ”) МОЖНО РАСШИРИТЬ ВОЗМОЖНОСТИ РЕДАКТОРА ДОБАВЛЕНИЕМ НОВЫХ КОМАНД После ввода символа CTRL-U (->) ДЕМОНСТРАЦИЯ ВОЗМОЖНОСТЕЙ МИНИ-РЕДАКТОРА ТЕКСТА. МИНИ-РЕДАКТОР ПРЕДОСТАВЛЯЕТ ПОЛЬЗОВАТЕЛЮ РАЗЛИЧНЫЕ СРЕДСТВА РЕДАКТИРОВАНИЯ ТЕКСТА, В ТОМ ЧИСЛЕ УКАЗАННЫЕ НИЖЕ. t КУРСОР 1. CTRL—Q: ЗАВЕРШЕНИЕ РАБОТЫ РЕДАКТОРА 2. CTRL — U: ПЕРЕМЕЩЕНИЕ КУРСОРА НА ОДНУ ПОЗИЦИЮ ВПРАВО ( >) 3. CTRL — Н: ПЕРЕМЕЩЕНИЕ КУРСОРА НА ОДНУ ПОЗИЦИЮ ВЛЕВО («- —)
Коды 175 4. CTRL — Е: ОБРАЗОВАНИЕ ПРОБЕЛА В ТЕКУЩЕЙ ПОЗИЦИИ СДВИГОМ СТРОКИ ВПРАВО ДЛЯ ПОСЛЕДУЮЩЕЙ ВСТАВКИ ЛИТЕРЫ 5. CTRL — D: УДАЛЕНИЕ ЛИТЕРЫ В ТЕКУЩЕЙ ПОЗИЦИИ 6. CTRL — М: ПЕРЕХОД К НОВОЙ СТРОКЕ (“ВОЗВРАТ КАРЕТКИ”) МОЖНО РАСШИРИТЬ ВОЗМОЖНОСТИ РЕДАКТОРА ДОБАВЛЕНИЕМ НОВЫХ КОМАНД 3. Управляющий символ CTRL-H (’’стрелка влево” или При вводе этого символа текст на экране не изменяется, но кур¬ сор перемещается на одну позицию влево. Если курсор находится в первой позиции строки, то при вводе символа CTRL-H он авто¬ матически перемещается в последнюю позицию предшествующей строки. Если же курсор находится в первой позиции первой стро¬ ки, никаких изменений при вводе символа CTRL-H на экране не происходит. До ввода символа CTRL-И (+-) ДЕМОНСТРАЦИЯ ВОЗМОЖНОСТЕЙ МИНИ-РЕДАКТОРА ТЕКСТА. МИНИ-РЕДАКТОР ПРЕДОСТАВЛЯЕТ ПОЛЬЗОВАТЕЛЮ РАЗЛИЧНЫЕ СРЕДСТВА РЕДАКТИРОВАНИЯ ТЕКСТА, В ТОМ ЧИСЛЕ УКАЗАННЫЕ НИЖЕ. f КУРСОР 1. CTRL —Q: ЗАВЕРШЕНИЕ РАБОТЫ РЕДАКТОРА 2. CTRL — U: ПЕРЕМЕЩЕНИЕ КУРСОРА НА ОДНУ ПОЗИЦИЮ ВПРАВО ( >) 3. CTRL — Н: ПЕРЕМЕЩЕНИЕ КУРСОРА НА ОДНУ ПОЗИЦИЮ В ЛЕЕЮ («-—) 4. CTRL — Е: ОБРАЗОВАНИЕ ПРОБЕЛА В ТЕКУЩЕЙ ПОЗИЦИИ СДВИГОМ СТРОКИ ВПРАВО ДЛЯ ПОСЛЕДУЮЩЕЙ ВСТАВКИ ЛИТЕРЫ 5. CTRL — D: УДАЛЕНИЕ ЛИТЕРЫ В ТЕКУЩЕЙ ПОЗИЦИИ 6. CTRL — М: ПЕРЕХОД К НОВОЙ СТРОКЕ (“ВОЗВРАТ КАРЕТКИ”) МОЖНО РАСШИРИТЬ ВОЗМОЖНОСТИ РЕДАКТОРА ДОБАВЛЕНИЕМ НОВЫХ КОМАНД После ввода символа CTRL-И (<-) ДЕМОНСТРАЦИЯ ВОЗМОЖНОСТЕЙ МИНИ-РЕДАКТОРА ТЕКСТА. МИНИ-РЕДАКТОР ПРЕДОСТАВЛЯЕТ ПОЛЬЗОВАТЕЛЮ РАЗЛИЧНЫЕ СРЕДСТВА РЕДАКТИРОВАНИЯ ТЕКСТА, В ТОМ ЧИСЛЕ УКАЗАННЫЕ НИЖЕ. f КУРСОР 1. CTRL—Q: ЗАВЕРШЕНИЕ РАБОТЫ РЕДАКТОРА 2. CTRL — 0: ПЕРЕМЕЩЕНИЕ КУРСОРА НА ОДНУ ПОЗИЦИЮ ВПРАВО ( 3. CTRL — Н: ПЕРЕМЕЩЕНИЕ КУРСОРА НА ОДНУ ПОЗИЦИЮ ВЛЕВО О ) 4. CTRL — Е: ОБРАЗОВАНИЕ ПРОБЕЛА В ТЕКУЩЕЙ ПОЗИЦИИ СДВИГОМ СТРОКИ ВПРАВО ДЛЯ ПОСЛЕДУЮЩЕЙ ВСТАВКИ ЛИТЕРЫ 5. CTRL ==, D; УДАЛЕНИЕ ЛИТЕРЫ В ТЕКУЩЕЙ ПОЗИЦИИ
176 Глава 5 6. CTRL — М: ПЕРЕХОД К НОВОЙ СТРОКЕ (“ВОЗВРАТ КАРЕТКИ”) МОЖНО РАСШИРИТЬ ВОЗМОЖНОСТИ РЕДАКТОРА ДОБАВЛЕНИЕМ НОВЫХ КОМАНД 4. Управляющий символ CTRL-E. При вводе этого символа в позицию, указываемую текущим положением курсора, поме¬ щается пробел, а часть строки, находящаяся справа от этой по¬ зиции, сдвигается на одну позицию вправо. Этот управляющий символ воздействует только на текст той строки, где находится курсор. Если при этом в последней позиции строки находится символ, отличный от пробела, то при вводе символа CTRL-E он будет потерян. Положение курсора на экране при этом не ме¬ няется. До ввода символа CTRL-E ДЕМОНСТРАЦИЯ ВОЗМОЖНОСТЕЙ МИНИ-РЕДАКТОРА ТЕКСТА. МИНИ-РЕДАКТОР ПРЕДОСТАВЛЯЕТ ПОЛЬЗОВАТЕЛЮ РАЗЛИЧНЫЕ СРЕДСТВА РЕДАКТИРОВАНИЯ ТЕКСТА, В ТОМ ЧИСЛЕ УКАЗАННЫЕ НИЖЕ. 1. CTRL — Q: ЗАВЕРШЕНИЕ РАБОТЫ РЕДАКТОРА 2. CTRL — U: ПЕРЕМЕЩЕНИЕ КУРСОРА Н,\ ОДНУ ПОЗИЦИЮ ВПРАВО ( >) 3. CTRL — Н: ПЕРЕМЕЩЕНИЕ КУРСОРА НА ОДНУ ПОЗИЦИЮ ВЛЕВО (^—) 4. CTRL — Е: ОБРАЗОВАНИЕ ПРОБЕЛА В ТЕКУЩЕЙ ПОЗИЦИИ СДВИГОМ СТРОКИ ВПРАВО ДЛЯ ПОСЛЕДУЮЩЕЙ ВСТАВКИ ЛИТЕРЫ t КУРСОР 5. CTRL — D: УДАЛЕНИЕ ЛИТЕРЫ В ТЕКУЩЕЙ ПОЗИЦИИ 6. CTRL — М: ПЕРЕХОД К НОВОЙ СТРОКЕ (“ВОЗВРАТ КАРЕТКИ”) МОЖНО РАСШИРИТЬ ВОЗМОЖНОСТИ РЕДАКТОРА ДОБАВЛЕНИЕМ НОВЫХ КОМАНД После ввода символа CTRL-E ДЕМОНСТРАЦИЯ ВОЗМОЖНОСТЕЙ МИНИ-РЕДАКТОРА ТЕКСТА. МИНИ-РЕДАКТОР ПРЕДОСТАВЛЯЕТ ПОЛЬЗОВАТЕЛЮ РАЗЛИЧНЫЕ СРЕДСТВА РЕДАКТИРОВАНИЯ ТЕКСТА, В ТОМ ЧИСЛЕ УКАЗАННЫЕ НИЖЕ. 1. CTRL — Q: ЗАВЕРШЕНИЕ РАБОТЫ РЕДАКТОРА 2. CTRL — U: ПЕРЕМЕЩЕНИЕ КУРСОРА НА ОДНУ ПОЗИЦИЮ ВПРАВО 3. CTRL — Н: ПЕРЕМЕЩЕНИЕ КУРСОРА НА ОДНУ ПОЗИЦИЮ ВЛЕВО 4. CTRL — Е: ОБРАЗОВАНИЕ ПРОБЕЛА В ТЕКУЩЕЙ ПОЗИЦИИ СДВИГОМ СТРОКИ ВПРАВ О ДЛЯ ПОСЛЕДУЮЩЕЙ ВСТАВКИ ЛИТЕРЫ | КУРСОР 5. CTRL — О: УДАЛЕНИЕ ЛИТЕРЫ В ТЕКУЩЕЙ ПОЗИЦИИ 6. CTRL — М: ПЕРЕХОД К НОВОЙ СТРОКЕ (“ВОЗРАТ КАРЕТКИ”) МОЖНО РАСШИРИТЬ ВОЗМОЖНОСТИ РЕДАКТОРА ДОБАВЛЕНИЕМ НОВЫХ КОМАНД
Коды 177 5. Управляющий символ CTRL-D. Ввод этого символа при¬ водит к удалению символа в текущей позиции курсора, причем оставшаяся справа часть строки сдвигается на одну позицию вле¬ во, заполняя образовавшийся пробел. Воздействие оказывается только на текст той строки, в которой находится курсор. Поло¬ жение курсора на экране при этом не меняется. До ввода символа CTRL-D ДЕМОНСТРАЦИЯ ВОЗМОЖНОСТЕЙ МИНИ-РЕДАКТОРА ТЕКСТА. МИНИ-РЕДАКТОР ПРЕДОСТАВЛЯЕТ ПОЛЬЗОВАТЕЛЮ РАЗЛИЧНЫЕ СРЕДСТВА РЕДАКТИРОВАНИЯ ТЕКСТА, В ТОМ ЧИСЛЕ УКАЗАННЫЕ НИЖЕ. 1. CTRL — Q: ЗАВЕРШЕНИЕ РАБОТЫ РЕДАКТОРА 2. CTRL — U: ПЕРЕМЕЩЕНИЕ КУРСОРА НА ОДНУ ПОЗИЦИЮ ВПРАВО (— ->) 3. CTRL - Н: ПЕРЕМЕЩЕНИЕ КУРСОРА НА ОДНУ ПОЗИЦИЮ ВЛЕВО Ц ) 4. CTRL — Е: ОБРАЗОВАНИЕ ПРОБЕЛА В ТЕКУЩЕЙ ПОЗИЦИИ СДВИГОМ СТРОКИ ВПРАВО ДЛЯ ПОСЛЕДУЮЩЕЙ ВСТАВКИ ЛИТЕРЫ 5. CTRL — D: УДАЛЕНИЕ ЛИТЕРЫ В ТЕКУЩЕЙ ПОЗИЦИИ t КУРСОР 6. CTRL — М: ПЕРЕХОД К НОВОЙ СТРОКЕ (“ВОЗВРАТ КАРЕТКИ”) МОЖНО РАСШИРИТЬ ВОЗМОЖНОСТИ РЕДАКТОРА ДОБАВЛЕНИЕМ НОВЫХ КОМАНД После ввода символа CTRL-D ДЕМОНСТРАЦИЯ ВОЗМОЖНОСТЕЙ МИНИ-РЕДАКТОРА ТЕКСТА. МИНИ-РЕДАКТОР ПРЕДОСТАВЛЯЕТ ПОЛЬЗОВАТЕЛЮ РАЗЛИЧНЫЕ СРЕДСТВА РЕДАКТИРОВАНИЯ ТЕКСТА, В ТОМ ЧИСЛЕ УКАЗАННЫЕ НИЖЕ. 1. CTRL — Q: ЗАВЕРШЕНИЕ РАБОТЫ РЕДАКТОРА 2. CTRL — LJ: ПЕРЕМЕЩЕНИЕ КУРСОРА НА ОДНУ ПОЗИЦИЮ ВПРАВО ( >) 3. CTRL — Н: ПЕРЕМЕЩЕНИЕ КУРСОРА НА ОДНУ ПОЗИЦИЮ ВЛЕВО Ц ) 4. CTRL — Е: ОБРАЗОВАНИЕ ПРОБЕЛА В ТЕКУЩЕЙ ПОЗИЦИИ СДВИГОМ СТРОКИ ВПРАВО ДЛЯ ПОСЛЕДУЮЩЕЙ ВСТАВКИ ЛИТЕРЫ 5. CTRL — D: УДАЛНИЕ ЛИТЕРЫ В ТЕКУЩЕЙ ПОЗИЦИИ t КУРСОР 6. CTRL — М: ПЕРЕХОД К НОВОЙ СТРОКЕ (“ВОЗВРАТ КАРЕТКИ») МОЖНО РАСШИРИТЬ ВОЗМОЖНОСТИ РЕДАКТОРА ДОБАВЛЕНИЕМ НОВЫХ КОМАНД 6. Управляющий символ CTRL-М (’’Возврат каретки”). Ввод этого символа не изменяет текст, но переводит курсор в первую позицию следующей строки. Если курсор находится в последней строке, то он перемещается в первую позицию этой же строки.
178 Глава 5 До ввода символа CTRL-М (“ВОЗВРАТ КАРЕТКИ'") ДЕМОНСТРАЦИЯ ВОЗМОЖНОСТЕЙ МИНИ-РЕДАКТОРА ТЕКСТА. МИНИ-РЕДАКТОР ПРЕДОСТАВЛЯЕТ ПОЛЬЗОВАТЕЛЮ РАЗЛИЧНЫЕ СРЕДСТВА РЕДАКТИРОВАНИЯ ТЕКСТА, В ТОМ ЧИСЛЕ УКАЗАННЫЕ НИЖЕ. ]. CTRL — Q: ЗАВЕРШЕНИЕ РАБОТЫ РЕДАКТОРА 2. CTRL — U: ПЕРЕМЕЩЕНИЕ КУРСОРА НА ОДНУ ПОЗИЦИЮ ВПРАВО (—->) 3. CTRL - Н: ПЕРЕМЕЩЕНИЕ КУРСОРА НА ОДНУ ПОЗИЦИЮ ВЛЕВО (+-—) 4. CTRL — Е: ОБРАЗОВАНИЕ ПРОБЕЛА В ТЕКУЩЕЙ ПОЗИЦИИ СДВИГОМ СТРОКИ ВПРАВО ДЛЯ ПОСЛЕДУЮЩЕЙ ВСТАВКИ ЛИТЕРЫ 5. CTRL — D: УДАЛЕНИЕ ЛИТЕРЫ В ТЕКУЩЕЙ ПОЗИЦИИ 6. CTRL — М: ПЕРЕХОД К НОВОЙ СТРОКЕ (“ВОЗВРАТ КАРЕТКИ”) t КУРСОР МОЖНО РАСШИРИТЬ ВОЗМОЖНОСТИ РЕДАКТОРА ДОБАВЛЕНИЕМ НОВЫХ КОМАНД После ввода символа CTRL-М (“ВОЗВРАТ КАРЕТКИ") ДЕМОНСТРАЦИЯ ВОЗМОЖНОСТЕЙ МИНИ-РЕДАКТОРА ТЕКСТА. МИНИ-РЕДАКТОР ПРЕДОСТАВЛЯЕТ ПОЛЬЗОВАТЕЛЮ РАЗЛИЧНЫЕ СРЕДСТВА РЕДАКТИРОВАНИЯ ТЕКСТА, В ТОМ ЧИСЛЕ УКАЗАННЫЕ НИЖЕ. 1. CTRL —Q: ЗАВЕРШЕНИЕ РАБОТЫ РЕДАКТОРА 2. CTRL — U: ПЕРЕМЕЩЕНИЕ КУРСОРА НА ОДНУ ПОЗИЦИЮ ВПРАВО (—>) 3. CTRL — Н: ПЕРЕМЕЩЕНИЕ КУРСОРА НА ОДНУ ПОЗИЦИЮ ВЛЕВО («—) 4. CTRL — Е: ОБРАЗОВАНИЕ ПРОБЕЛА В ТЕКУЩЕЙ ПОЗИЦИИ СДВИГОМ СТРОКИ ВПРАВО ДЛЯ ПОСЛЕДУЮЩЕЙ ВСТАВКИ ЛИТЕРЫ 5. CTRL — D: УДАЛЕНИЕ ЛИТЕРЫ В ТЕКУЩЕЙ ПОЗИЦИИ 6. CTRL — М: ПЕРЕХОД К НОВОЙ СТРОКЕ (“ВОЗВРАТ КАРЕТКИ”) МОЖНО РАСШИРИТЬ ВОЗМОЖНОСТИ РЕДАКТОРА ДОБАВЛЕНИЕМ f КУРСОР НОВЫХ КОМАНД 7. При вводе любого другого символа (буквы, цифры или зна¬ ка) этот символ замещает символ, находившийся до этого в по¬ зиции, указываемой курсором; при этом последний сдвигается на одну позицию вправо подобно тому, как это происходит при вводе управляющего символа. До ввода символа ”В” ДЕМОНСТРАЦИЯ ВОЗМОЖНОСТЕЙ МИНИ-РЕДАКТОРА ТЕКСТА. МИНИ-РЕДАКТОР ИМЕЕТ РЯД КОМАНД РЕДАКТИРОВАНИЯ ТЕКСТА, В ТОМ ЧИСЛЕ УКАЗАННЫЕ НИЖЕ.
Коды 179 Рис» 17sl
180 Глава 5 1. CTRL — Q: ЗАВЕРШЕНИЕ РАБОТЫ РЕДАКТОРА 2. CTRL — U: ПЕРЕМЕЩЕНИЕ КУРСОРА НА ОДНУ ПОЗИЦИЮ ВПРАВО ( » 3. CTRL — Н: ПЕРЕМЕЩЕНИЕ КУРСОРА НА ОДНУ ПОЗИЦИЮ ВЛЕВО ( < ) 4. CTRL — Е: ОБРАЗОВАНИЕ ПРОБЕЛА В ТЕКУЩЕЙ ПОЗИЦИИ СДВИГОМ СТРОКИ ВПРАВО ДЛЯ ПОСЛЕДУЮЩЕЙ ВСТАВКИ ЛИТЕРЫ t курсор 5. CTRL — D: УДАЛЕНИЕ ЛИТЕРЫ В ТЕКУЩЕЙ ПОЗИЦИИ 6. CTRL — М: ПЕРЕХОД К НОВОЙ СТРОКЕ (’’ВОЗВРАТ КАРЕТКИ”) МОЖНО РАСШИРИТЬ ВОЗМОЖНОСТИ РЕДАКТОРА ДОБАВЛЕНИЕМ НОВЫХ КОМАНД ПОСЛЕ ВВОДА СИМВОЛА ”В” ДЕМОНСТРАЦИЯ ВОЗМОЖНОСТЕЙ МИНИ-РЕДАКТОРА ТЕКСТА. МИНИ-РЕДАКТОР ИМЕЕТ РЯД КОМАНД РЕДАКТИРОВАНИЯ ТЕКСТА, В ТОМ ЧИСЛЕ УКАЗАННЫЕ НИЖЕ. 1. CTRL —Q: ЗАВЕРШЕНИЕ РАБОТЫ РЕДАКТОРА 2. CTRL — U: ПЕРЕМЕЩЕНИЕ КУРСОРА НА ОДНУ ПОЗИЦИЮ ВПРАВО ( » 3. CTRL — Н: ПЕРЕМЕЩЕНИЕ КУРСОРА НА ОДНУ ПОЗИЦИЮ ВЛЕВО « ) 4. CTRL — Е: ОБРАЗОВАНИЕ ПРОБЕЛА В ТЕКУЩЕЙ ПОЗИЦИИ СДВИГОМ СТРОКИ ВПРАВО ДЛЯ ПОСЛЕДУЮЩЕЙ ВСТАВКИ ЛИТЕРЫ f курсор 5. CTRL — D: УДАЛЕНИЕ ЛИТЕРЫ В ТЕКУЩЕЙ ПОЗИЦИИ 6. CTRL — М: ПЕРЕХОД К НОВОЙ СТРОКЕ (’’ВОЗВРАТ КАРЕТКИ”) МОЖНО РАСШИРИТЬ ВОЗМОЖНОСТИ РЕДАКТОРА ДОБАВЛЕНИЕМ НОВЫХ КОМАНД Работа с таким мини-редактором во многом подобна исполь¬ зованию редактора текста, имеющегося в комплекте программ¬ ного обеспечения Applesoft. Алгоритм функционирования рассматриваемого мини-ре¬ дактора текста можно описать графически, как это показано на рис. 17.1. Поскольку мини-редактор предполагает широкое использова¬ ние управляющих символов, чтение текста программы этого ре¬ дактора может иногда вызывать затруднения в понимании логики его работы, как, например, когда в тексте встречается оператор IF Х$ = ” ’’THEN END в котором управляющий символ CTRL-Q представлен пробелом. Поэтому в подобных ситуациях рекомендуется использовать функцию CHR$, а в данном случае CHR$ (17), т. е. IF X$ = CHR§(17) THEN END Ниже указаны десятичные коды символов, используемых мини¬ редактором в качестве управляющих (см. также руководство по эксплуатации ЭВМ, имеющейся в распоряжении пользователя).
Коды 181 CTRL — D CTRL — E CTRL — H CTRL — M CTRL — Q CTRL — U CHR§(4) CHR$(5) CHR$(8) CHRS(13) CHRS(17) CHR$(21) Читателю рекомендуется самостоятельно составить програм¬ му мини-редактора текста. В случае возникновения трудностей при ее написании можно обратиться к программе 17.1 приложе¬ ния. Усовершенствование первоначального варианта программы Существует много возможностей совершенствования первона¬ чального варианта рассмотренного выше мини-редактора текста. Так, например, программу редактора можно дополнить операто¬ рами, предоставляющими в распоряжение пользователя управ¬ ляющий символ CTRL-Р, перемещающий курсор в шестую позицию следующей строки для ввода текста, начиная с абзаца. Если в распоряжении пользователя ЭВМ имеется печатающее устройство, то программу редактора можно дополнить процеду¬ рой печати обрабатываемого текста. Задача 18. Декодирование зашифрованных сообщений Назначение разрабатываемой программы: освоение некоторых принципов расшифровки закодированных сообщений и техники программирования трудоемких операций расшифровки. Специфические предпосылки успешной разработки: знаком¬ ство с программой решения задачи 17 (мини-редактор текста). Пояснения программисту: написание подобных программ, как правило, не вызывает больших трудностей, однако использова¬ ние их для расшифровки закодированных сообщений требует от пользователя немалой доли изобретательности. Применение кодирования для передачи тем или иным спосо¬ бом секретных сообщений стимулировало развитие противополож¬ ного рода деятельности — расшифровки кодов. Сообщения» кодируемые так называемой подстановкой (задача 16), сравни¬ тельно легко поддаются расшифровке. Для этого необходимо проявить лишь немного изобретательности и затратить значи¬ тельное время на выполнение скучных и утомительных операций. Упростить задачу можно, используя ЭВМ для выполнения срав-
182 Глава 5 нителы-ю примитивной, но весьма трудной части работы с возло¬ жением на пользователя поиска ’’ключа” к разгадке способа кодирования. К составлению подобной программы и сводится решение данной задачи. Первой частью этой программы является редактор текста, рассматриваемый в задаче 17, который используется для ввода и отображения на экране дисплея закодированного сообщения, подлежащего расшифровке. Такой редактор позволяет изучить особенности сообщения и сделать затем обоснованные’предполо¬ жения о способах его расшифровки. В разрабатываемой программе следует предусмотреть выполнение вспомогательных действий двух видов: 1. IT WILL COMPILE A TABLE GIVING THE NUMBER OF TIMES EACH LETTER OCCURS IN THE MESSAGE; THIS TABLE. IS CALLED THE FREQUENCY TABLE. FOR EXAMPLE, HERE IS A FREQUENCY TABLE FOR THIS PARAGRAPH. А 13:В 5 :С 7:D 1:Е 24:F 5:G 4:H 8 1 11 :J 0:К 0:L 11 :М 5:N 5:0 5:P 4 Q 2:R 10 :S 8:Т 13:U 4:V 11:W 1:X 1 Y 2:2 0: Рис. 18.1. 1. Составление таблицы частоты (количества раз)' появления каждой буквы алфавита в сообщении. (Речь идет о так называе¬ мой таблице частот.) На рис. 18.1 приведено изображение не¬ которого сообщения и соответствующей таблицы частот на экра¬ не дисплея. При анализе этой таблицы обнаруживается, что буква ”Е” появляется в сообщении 24 раза, т. е. почти вдвое ча¬ ще, чем следующие за ней в порядке убывания частоты появления буквы ”А” и ”Т”, встретившиеся по 13 раз каждая. Это — типич¬ ное соотношение между частотами появления указанных букв в сообщениях на английском языке. Следовательно, наиболее час¬ то встречающийся в закодированном сообщении символ, как пра¬ вило, замещает букву ”Е” исходного текста. Ниже показано, насколько удобно наличие таблицы частот в процессе расшиф¬ ровки сообщений. 2. Отображение на экране результатов выполнения тех или иных действий над текстом, например взаимной замены любых двух символов текста сообщения. Видя результат, можно сразу оценить правильность сделанных предположений. Ниже при¬ водится пример сообщения до и после замены буквы ”А” на бук¬ ву ”В”.
Коды 183 До замены 1. IT WILL COMPILE A TABLE GIVING THE NUMBER OF TIMES EACH LETTER OCCURS IN THE MESSAGE. THIS TABLE IS CALLED THE FREQUENCY TABLE. FOR EXAMPLE, HERE IS A FREQUENCY TABLE FOR THIS PARAGRAPH. После замены 1. IT WILL COMPILE В ТВ ALE GIVING THE NUMAER OF TIMES EBCH LETTER OCCURS IN THE MESSBGE. THIS TBALE IS CBLLED THE FREQUENCY TBALE. FOR EXBMPLE, HERE IS В FREQUENCY TBALE FOR THIS PBRBGRBPH. Продемонстрируем применение подобной программы для рас¬ шифровки проводимого ниже в закодированном виде первого аб¬ заца рассказа ’’Золотой жук” Эдгара Аллана По. Этот замеча¬ тельный рассказ содержит интересные рассуждения об искусстве расшифровки закодированных посланий. DQIH HBQYO QZX, W EXIKYQEKBV QI WIKWDQEH RWKL Q DY. RWAAWQD ABZYQIV. LB RQO ХР QI QIEWBIK LMZMBIXK PQDWAH, QIV LQV XIEB GBBI RBQAKLH; GMK Q OBYWBO ХР DWOPXYKMIBO LQV YBVMEBV LWD КХ RQIK, КХ QSXWV KLB DXYKWPWEQKWXI EXIOBFMBIK MCXI LWO VWOQOKBYO, LB АВРК IBR XYABQIO, KLB EWKH ХР LWO PXYBPQKLBYO, QIV КХХТ МС LWO YBOWVBIEB QK OMAAWSQI’O WOAQIV, IBQY ELQYABOKXI, OXMKL EQYXAWIQ. Наиболее часто в приведенном тексте встречается буква ’’В”. Разумно предположить, что при кодировании буква ”В” использована в качестве замены буквы ”Е” исходного текста. Осуществляя обратную замену буквы ”В” на букву ”Е”, получаем DQIFI HEQYO QZX, W BXIKYQBKEV QI WIKWDQBH RWKL Q DY. RWAAWQD AEZYQIV. LE RQO ХР QI QIBWEIK LMZMEIXK PQDWAH, QIV LQV XIBE GEEI REQAKLH; GMK Q OEYWEO XP DWOPXYKMIEO LQV YEVMBEV LWD KX RQIK. KX QSXWV KLE DXYKWPWBQKWXI BXIOEFMEIK MCXI LWO VWOQOKEYO, LE AEPK IER XYAEQIO, KLE BWKH XP LWO PXYEPQKLEYO, QIV КХХТ MC LWO YEOWVEIBE QK OMAAWSQI’O WOAQIV, IEQY BLQYAEOKXI, OXMKL BQYXAWIQ. Самое частое слово в английском — определенный артикль ”ТНЕ”. Замечаем, что сочетание ”KLE” в анализируемом тексте встречается дважды. Предполагая, что буква ”К” заменяет бук¬ ву ”Т” исходного текста, a ”L” — букву ”Н”, заменяем ”К” на
184 Глава 5 DQIH HEQYO QZX, W BXITYQBTEV QI WITWDQBH RWTL Q DY. RWAAWQD AEZYQIV. LE RQO XP QI QIBWEIT LMZMEIXT PQDWAH, QIV LQV XIBE GEEI REQATLH; GMT Q OEYWEO XP DWOPXYTMIEO LQV YEVMBEV LWD TX RQIT. TX QSXWV TLE DXYTWPWBQTWXI BXIOEFMEIT MCXI LWO VWOQOTEYO, LE AEPT IER XYAEQIO, TLE BWTH XP LWO PXYEPQTLEYO, QIV TXXK MC LWO YEOWVEIBE QT OMAAWSQI’O WOAQIV, IEQY BLQYAEOTXI, OXMTL BQYXAWIQ. Теперь можно выполнить замену ”L” на ”Н”; DQIL LEQYO QZX, W BXITYQBTEV QI WITWDQBL RWTH Q DY. RWAAWQD AEZYQIV. HE RQO XP QI QIBWEIT HMZMEIXT PQDWAL, QIV HQV XIBE GEEI REQATHL; GMT Q OEYWEO XP DWOPXYTMIEO HQV YEVMBEV HWD TX RQIT. TX QSXWV THE DXYTWPWBQTWXI BXIOEFMEIT MCXI HWO VWOQOTEYO, HE AEPT IER XYAEQIO, THE BWTL XP HWO PXYEPQTHEYO, QIV TXXK MC HWO YEOWVEIBE QT OMAAWSQI’O WOAQIV, IEQY BHQYAEOTXI, OXMTH BQYXAWIQ. Можно заметить, что в тексте дважды встречается слово ”ТХ”, состоящее из двух букв. Наиболее часто встречающимся двухбук¬ венным словом английского языка, начинающимся с ”Т”, явля¬ ется предлог ”ТО”. Поэтому единственно разумным представля¬ ется заменить букву ”Х” на букву ”0”. DQIL LEQYX QZO, W BOITYQBTEV QI WITWDQBL RWTH Q DY. RWAAWQD AEZYQIV. HE RQX OP QI QIBWEIT HMZMEIOT PQDWAL, QIV HQV OIBE GEEI REQATHL; GMT Q XEYWEX OP DWXPOYTMIEX HQV YEVMBEV H\\ D TO RQIT. TO QSOWV THE DOYTWPWBQTWOI BOIXEFMEIT MCOI HWX VWXQXTEYX, HE AEPT IER OYAEQIX, THE BWTL OP HWX POYEPQTHEYX, QIV TOOK MC HWX YEXWVEIBE QT XMAAWSQI’X WXAQIV, IEQY BFIQYAEXTOI, XOMTH BOYQAWIQ. Анализируя полученный текст, обращаем внимание на то, что среди слов, состоящих из одной буквы, ”W” встречается один раз, a ”Q” — дважды., Можно предположить, что первая соответству¬ ет местоимению первого лица единственного числа ”1”, а вторая —» неопределенному артиклю ”А”, После выполнения соответству¬ ющих замен текст принимает следующий вид: DAIL LEAYX AZO, W BOITYABTEV Al WITWDABL RWTH A DY. RWQQWAD QEZYAIV, HE RAX OP Al AIBWEIT HMZMEIOT PADWQL, AIV HAV OIBE GEEI REAQTHL; GMT A XEYWEX OP DWXPOYTMIEX HAV YEVMBEV HWD TO RAIT, TO ASOWV THE DOYTWPWBATWOI BOIXEFMEIT MCOI HWX VWXAXTEYX, HE QEPT IER OYQEAIX, THE
Коды 185 BWTL OP HWX POYEPATHEYX, AIV TOOK MC HWX YEXWVEIBE AT XMQQWSAI’X WXQAIV, IEAY BHAYQEXTOI, XOMTH BAYOQWIA. DAWL LEAYX AZO, I BOWTYABTEV AW IWTIDABL RITH A DY. RIQQIAD QEZYAWV. HE RAX OP AW AWBIEWT HMZMEWOT PADIQL, AWV HAV OWBE GEEW REAQTHL; GMT A XEYIEX OP DIXPOYTMWEX HAV YEVMBEV HID TO RAWT. TO ASOIV THE DOYTIPIBATIOW BOWXEFMEWT MCOW HIX VIXAXTEYX, HEQEPT WER OYQEAWX, THE BITL OP HIX POYEPATHEYX, AWV TOOK MC HIX YEXIVEWBE AT XMQQISAW’X IXQAWV, WEAY BHAYQEXTOW, XOMTH BAYOQIWA. Теперь это уже в большей степени напоминает текст, написан¬ ный по-английски, чем результат забав какой-нибудь мартышки, получившей доступ к клавиатуре ЭВМ. В этом тексте каждое сочетание букв ”AW” и ”AWV” встречается дважды. По-видимо¬ му, первое из них соответствует неопределенному артиклю ”AN”, а второе — союзу ’’AND”, т. е. следует произвести замену буквы ”W” на букву ”N”, а буквы ”V” — на ”D”. DANE LEAYX AZO, I BONTYABTEV AN INTIDABL RITH A DY. RIQQIAD QEZYANV. HE RAX OP AN ANBIENT HMZMENOT PADIQL, ANV HAV ONBE GEEN REAQTHL; GMT A XEYIEX OP DIXPOYTMNEX HAV YEVMBEV HID TO RANT. TO ASOIV THE DOYTIPIBATION BONXEFMENT MCON HIX VIXAXTEYX, HE QEPT NER OYQEANX, THE BITL OP HIX POYEPATHEYX, ANV TOOK MC HIX YEXIVENBE AT XMQQISAN’X IXQANV, NEAY BHAYQEXTON, XOMTH BAYOQINA. VANL LEAYX AZO, I BONTYABTED AN INTIVABL RITH A VY. RIQQIAV QEZYAND. HE RAX OP AN ANBIENT HMZMENOT PAVIQL, AND HAD ONBE GEEN REAQTHL; GMT A XEYIEX OP VIXPOYTMNEX HAD YEDMBED HIV TO RANT. TO ASOID THE VOYTIPIBATION BONXEFMENT MCON HIX DIXAXTEYX, HE QEPT NER OYQEANX, THE BITL OP HIX POYEPATHEYX, AND TOOK MC HIX YEXIDENBE AT XMQQISAN’X IXQAND, NEAY BHAYQEXTON, XOMTH BAYOQINA. По мере работы над расшифровкой данного текста становится очевидным, что разгадывание кроссвордов является неплохой тренировкой для подобных занятий. Свободно владеющему анг¬ лийским языком слово ’’RITH” представляется более естествен¬ ным, если осуществить взаимную замену букв ”R” и ”W”. В ре¬ зультате получается часто употребляемый предлог ’’WITH”* VANL LEAYX AZO, I BONTYABTED AN INTIVABL WITH A VY. WIQQIAV QEZYAND. HE WAX OP AN ANBIENT HMZMENOT PAVIQL, AND HAD ONBE
186 Глава 5 GEEN WEAQTHL; GMT A XEYIEX OP VIXPOYTMNEX HAD YEDMBED HIV TO WANT. TO ASOID THE VOYTIPIBATION BONXEFMENT MOON HIX DIXAXTEYX, HE QEPT NEW OYQEANX, THE BITL OP HIX POYEPATHEYX, AND TOOK MC HIX YEXIDENBE AT XMQQISAN’X IXQAND, NEAY BHAYQEXTON, XOMTH BAYOQINA. Много слов в анализируемом отрывке оканчивается буквой ”Х”; сочетание букв ”Н1Х” в сообщении встречается дважды. Более характерным для английского языка является завершение слова буквой ”S”; если догадка верна и букву ”Х” следует заме¬ нить на ”S”, слово ”Н1Х” приобретает смысл притяжательного местоимения третьего лица единственного числа ”HIS”. VANL LEAYS AZO, I BONTYABTED AN INTIVABL WITH A VY. WIQQIAV QEZYAND. HE WAS OP AN ANBIENT HMZMENOT PAVIQL, AND HAD ONBE GEEN WEAQTHL; GMT A SEYIES OP VISPOYTMNES HAD YEDMBED HIV TO WANT. TO AXOID THE VOYTIPIBATION BONSEFMENT MCON HIS DISASTERS, HE QEPT NEW OYQEANS, THE BITL OP HIS POYEPATHEYS, AND TOOK MC HIS BHAYQESTON, SOMTH BAYOQINA. Заменим буквы ”B” и ”С”, чтобы сочетание букв ’’ONBE” приобрело смысл наречия ’’ONCE” (’’однажды”): VANL LEAYS AZO, I CONTYACTED AN INTIVACL WITH A VY. WIQQIAV QEZYAND. НЕ WAS OP AN ANCIENT HMZMENOT PAVIQL, AND HAD ONCE GEEN WEAQTHL; GMT A SEYIES OP VISPOYTMNES HAD YEDMCED HIV TO WANT. TO AXOID THE VOYTIPICATION CONSEFMENT MBON HIS DISASTEYS, HE QEPT NEW OYQEANS, THE CITL OP HIS POYEPATHEYS, AND TOOK MB HIS YESIDENCE AT SMQQIXAN’S ISQAND, NEAY CHAYQESTON, SOMTH CAYOQINA. Замена букв ”Y” и ”R” придает смысл существительного ’’DISASTERS” (бедствия, несчастья) исходному сочетанию букв ’’DISASTEYS”: VANL LEARS AZO, I CONTRACTED AN INTIVACL WITH A VR. WIQQIAV QEZRAND. HE WAS OP AN ANCIENT HMZMENOT PAVIQL, AND HAD ONCE GEEN WEAQTHL; GMT A SERIES OP VISPORTMNES HAD REDMCED HIV TO WANT. TO AXOID THE VORTIPICATION CONSEFMENT MBON HIS DISASTERS, HE QEPT NEW ORQEANS, THE CITL OP HIS POREPATHERS, AND TOOK MB HIS RESIDENCE AT SMQQIXAN’S ISQAND, NEAR CHARQESTON, SOMTH CAROQINA.
Коды 187 В дальнейшем, переходя к проверке работоспособности раз¬ рабатываемой программы, читателю следует завершить начатый здесь процесс расшифровки данного сообщения. Вернемся теперь к программированию. Составление програм¬ мы следует начать с написания процедуры формирования таб¬ лицы частот введенного текста. Вычислительные машины оперируют исключительно числами. Когда ЭВМ оперирует буквами, то это означает, что в ее памяти буквы также представляются в виде чисел. В вычислительных машинах типа Apple II для внутреннего представления букв используется код ASCII п. Численные эквиваленты внутренне¬ го представления некоторых букв в коде ASCII приведены ниже: Д = 65 В = 66 Z = 90 В программном обеспечении ЭВМ типа Apple имеются две так называемые встроенные функции для работы с кодом ASCII: ASC и CHR$ ( ). С помощью функции ASC(X$) можно опреде¬ лить десятичный эквивалент кода ASCII того символа, который является значением переменной г). Например, в результате выполнения программы 100 XS = ”В” 110 Y = ASC(X$) 120 PRINT Y на экране дисплея появляется JRUN 66 Функция CHR$ (У) позволяет выполнять обратные действия: значением такой функции является буква, десятичный эквивалент кода ASCII которой равен значению переменной Y 3). Например, в результате выполнения программы 100 V = 66 НО RS = CHRg(V) 120 PRINT R$ Х) ASCII — американский стандартный код обмена информацией, использующий 8 двоичных цифр (битов) для представления символа лю¬ бой арабской цифры, буквы латинского алфавита или знака типа запя¬ той, точки, скобки и т. д.— Прим, перев. 2) В качестве аргумента функции ASC ( ) может использоваться пере¬ менная символьного типа, значение которой — строка символов. Если эта строка содержит более одного символа, то функция ASC, вычисленная для такого аргумента, является кодом ASCII первого символа строки.— Прим. ред. 3) Значением аргумента функции CHR$ ( ) может быть любое целое число без знака, не выходящее за пределы диапазона 0—225.— Прим, ред.
188 Глава 5 на экране дисплея получаем ]RUN; В Рассмотренные функции могут оказаться весьма полезными при формировании таблицы частот. Воспользуемся одномерным массивом DIM СТ(26) для хранения числа появлений каждой буквы в анализируемом тексте. Пусть элемент массива СТ (1) предназначен для числа появ¬ лений буквы ”А”, элемент массива СТ (2) — для хранения числа появлений буквы ”5”, и т. д. При использовании функции ASC последовательность операторов Z = ASC(C$(L, Р)) CT(Z — 64) = CT(Z — 64) + 1 увеличивает на единицу содержимое элемента СТ (Z — 64), соответствующего символу текста, который представлен перемен¬ ной Cs (L, Р), где L и Р — координаты символа на экране дис¬ плея. Текст содержит пробелы, знаки препинания и другие элементы синтаксических конструкций языка, которые не вклю¬ чены в таблицу частот. Поскольку буквам А — Zb коде ASCII соответствуют числа 65—90, можно проверить, является ли сим¬ вол текста С$ (L, Р) буквой, если воспользоваться следующей последовательностью операторов: Z = ASC(C$(L, Р)) IF 64 < Z AND Z < 91 THEN Читателю рекомендуется самостоятельно составить фрагмент программы, формирующий таблицу частот (при необходимости можно обратиться к строкам 710—760 программы 18.1 приложе¬ ния). После формирования таблицы частот необходимо вывести ее и отобразить в нижней части экрана дисплея. Пространство эк¬ рана, отведенное для вывода таблицы частот, невелико. Поэто¬ му для вывода информации, относящейся к каждой букве, ис¬ пользуется поле размером в четыре позиции экрана; эти поля от¬ деляются друг от друга двоеточием. Таким образом, с учетом двоеточия играющая роль разделителя информация, относящаяся к одной букве алфавита, занимает пять позиций экрана (рис. 18.2). Для вывода таблицы частот целесообразно использовать цикл вида FOR 1 = 1 ТО 26... NEXT I. Для каждой буквы, согласно рис. 18.2, необходимо заполнить пять позиций экрана. В первой позиции размещается изображе¬ ние буквы посредством оператора PRINT CHR$(I + 64);
Коды 189 Вторая позиция — пробел, формулируемый оператором PRINT ” Третья позиция заполняется пробелом, если соответствующее данной букве значение кода ASCII — однозарядное десятичное число. Это условие реализует оператор IF СТ(1) < 10 THEN PRINT ” Четвертая позиция всегда занята десятичной цифрой — эквивалентом кода ASCII данной буквы (если это одноразрядное А 1 2 - Буква Пробел Число Двоеточие Рис. 18.2. число) или цифрой младшего разряда этого десятичного экви¬ валента (если это двухразрядное число). Заполнение этой по¬ зиции элемента таблицы частот осуществляется оператором PRINT СТ(1); В пятой позиции всегда размещается двоеточие посредствОхМ оператора PRINT Описанной процедуре вывода таблицы частот соответствуют строки 770—795 программы 18.1 приложения. Теперь следует перейти к составлению фрагмента програм¬ мы, выполняющего замену букв в декодируемом тексте. Для этого можно воспользоваться схемой алгоритма, показанной на рис. 18.3. Отметим, что в соответствии с этим алгоритмом при вводе в ЭВА1 с клавиатуры символа, отличного от буквы, осуществля¬ ется переход к формированию новой таблицы частот. На экране дисплея в правом нижнем углу удобно отображать ту пару букв, которые участвуют в данный момент в процедуре замещения одна другой. Используя рассмотренные выше алгоритмы и фрагменты про¬ грамм, читателю рекомендуется написать программу расшифров¬ ки закодированных сообщений. Текст, приведенный в рассмот¬ ренном выше примере расшифровки закодированного сообщения, следует использовать в процессе отладки этой программы. Ниже приведен еще один пример закодированного сообщения, который можно использовать для тренировки в расшифровке ко-
190 Глава 5 Рис. 18.3. дов. Если при составлении программы возникнут затруднения, следует обратиться к программе 18.1 приложения (строки 100—• 650 этой программы соответствуют программе задачи 17, т. е. мини-редактору текста). DUSKUY QKMNUSY VZIAUK MVU. GUKU BD JV BXUJ WMK IJPBVO DQUUXIJRU UHUV IMKU WZV. TMZ SJV ZDU J IJRU FGBSG JEEMFD YGU KJSU SJK YM ОМ MWW YGU DSKUUV MV YGU KBOGY DBXU (МК EUWY DBXU) JVX KUJQQUJK MV YGU EUWY DBXU (МК KBOGY DBXU). TMZK IJRU DGMZEX GJHU DMIU OJQD MV YGU KBOGY UXOU JVX OJQD BV YGU DJIU QEJSUD MV YGU EUWY UXOU. FGUV YGU SJK BD IMHBVO KBOGY, BW BYD QMDBYBMV YJPUD BY MWW YGU DSKUUV FBYGMZY GBYYBVO J FJEE, BY DGMZEX KUJQQUJK JY YGU DJIU QEJSU MV YGU UCYKUIU EUWY* DBIBEJKET, YGU SJK DGMZEX AU JAEU YM OM YGKMZOG J OJQ BV YGU EUWY FJEE JVX KUJQQUJK JY YGU DJIU DQMY MV YGU KBOGY FJEE*
Коды 191 Ответ: '33VAY IHDId ЗН1 NO 10dS 3WVS ЗН1 IV dV3ddV3d GNV 33VAY 133d 3111 N1 dVO V HOHOdHl OD 01 333V 33 ennOHS dVO 3H1 ‘A3dV3IWIS •1333 3W3M1X3 3H1 NO 33V3d 3WVS 3H1 IV dV3ddV3d CI3B0HS II ‘33VAY V 0NI11II-I IHOHIIAY ‘N33dOS 3H1 330 II S3>IV1 NOIlISOd S1I 31 ‘1H0IH ONIAOW SI dVO 3131 N3HAY '3003 1333 3H1 NO S3DV3d 3WVS 3H1 N1 sdvo onv зоаз iHoid shi no sdvo swos 3AVH a3H0HS 3ZVW dflOA -(3GIS IHDId do) 3CIIS 1333 3H1 NO dV3ddV3d CLNV (30IS 1333 do) 3CIIS IHDId ЗН1 NO N33dDS 3H1 330 00 01 dvo 30Vd 3H1 SAY033V hdihay 3ZVW V 3SH NVO ПОА 'N03 3dOW N3A3 3ZVWG33dS ONIdVW dO3 V3GI NV SI 3d3H '3no dssvMN losfodd i3d03s Задача 19. Кодирование и декодирование сообщений, исключающие несанкционированную расшифровку Назначение разрабатываемой программы: кодирование и де- кодирование сообщений с использованием кода, не поддающегося расшифровке. Специфические предпосылки успешной разработки: знаком¬ ство, с программой мини-редактора текста задачи 17 и назначе¬ нием функций ASC и CHR$ (см. задачу 18). Пояснения программисту: разрабатывается весьма несложная программа. Существует простой способ кодирования, практически не поддающийся расшифровке. Он даже проще, чем кодирование так называемой подстановкой, рассматриваемое в задаче 16. Знакомство с данным способом начнем с описания исключитель¬ но простого способа кодирования, а именно кодирования сме¬ щением. Продемонстрировать такое кодирование можно с помощью двух концентрических дисков, вдоль образующей каждого из которых нанесены все 26 букв латинского алфавита (рис. 19.1). Диски в центре соединены так, что внутренний диск может вра¬ щаться. На рис. 19.1 показано взаимное положение дисков после поворота внутреннего диска против часовой стрелки на две бук¬ вы. Буква ”А” внешнего диска находится против буквы ”С” внут¬ реннего. Этим можно воспользоваться для кодирования: каждая буква внешнего диска представлена ближайшей к ней буквой внутреннего диска. В примере, приведенном на рис. 19.1, имеет место кодирование со смещением 2, поскольку внутренний диск
192 Глава 5 повернут против часовой стрелки на две буквы по отношению к внешнему диску. Нетрудно составить программу, позволяющую кодировать и декодировать сообщения указанным способом. Величина смеще¬ ния Р задается пользователем. При этом значение Р должно находиться в пределах 1—26 (1^7^26). Однако следует учиты¬ вать, что при Р=2& каждой букве исходного сообщения соот¬ ветствует эта же буква закодированного сообщения и закодиро¬ ванное сообщение не отличается от исходного. Нетрудно заметить, что подобный код легко поддается рас¬ шифровке. Однако кодирование смещением можно модифици¬ ровать так, что закодированное сообщение практически нельзя будет расшифровать. Для этого воспользуемся последователь¬ ностью случайных чисел, значения которых принадлежат диапазо¬ ну 1—26. Например, 21 5 18 24 12 8 17 17 10 10 24 26 22 9 17 3 15 13 14 24 7 21 6 25 13 21 22 24 6 7 Пусть теперь требуется закодировать следующее сообщение: SECRET MESSAGE
Коды 193 При кодировании используем полученные случайные числа как смещения: первое число — смещение для кодирования первой буквы сообщения, второе число — смещение для кодирования второй буквы этого сообщения и т. д. (табл. 19.1). Результат такого кодирования имеет следующий вид: NJTBAW AZFQSEV Это сообщение легко декодировать в том случае, когда имеется та же самая последовательность случайных чисел, которая ис¬ пользована при кодировании. Если же эта последовательность неизвестна, декодировать сообщение весьма затруднительно. Описанный метод кодирования часто используется для шифровки секретных сообщений. Недостатком метода является необходи¬ мость иметь в распоряжении весьма длинный список случайных чисел. Таблица 19,1 Исходная буква Смещение Закодированная буква S 21 N Е 5 J С 17 Т R 10 В Е 22 А Т 3 W М 14 А Е 21 Z S 13 F S 24 Q А 18 S G 24 Е Е 17 V В рассматриваемой задаче используется одна из модификаций описанного способа кодирования. Вместо того чтобы хранить в памяти машины и использовать при кодировании список слу¬ чайных чисел, предлагается генерировать случайные числа по¬ средством имеющейся в программном обеспечении Applesoft специальной функции (RND), играющей роль датчика случай¬ ных чисел. Рассмотрим следующий пример программы: 100 REM ***** ГЕНЕРАЦИЯ СЛУЧАЙНЫХ ЧИСЕЛ ***** 110 REM 7 КаЭ89
194 Глава 5 120 FOR 1 = 1 ТО 10 130 PRINT INT (26 * RND (1)) 140 NEXT I □ RUN 3 21 22 21 15 6 10 22 Г з □ RUN 7 21 3 21 14 23 11 0 3 25 Результатом выполнения этой программы является список слу¬ чайных чисел 1}. Интересно, что два повторных выполнения этой программы дают две разные последовательности случайных чисел. Специфика функции RND (Л) заключается в том, что генери¬ руемой ею числовой последовательностью можно управлять, задавая первоначальное ’’стартовое” значение аргумента ”Л”. Так, например, оператор X=RND(—123) задает в качестве ’’стартового” значения аргумента отрицательное число —123. Отметим, что ’’стартовое” значение аргумента всегда должно быть отрицательным. ’’Стартовые” значения различной абсолют¬ ной величины порождают различные последовательности слу¬ чайных чисел. Однако одно и то же отрицательное ’’стартовое” значение аргумента всегда вызывает появление одной и той же последовательности случайных чисел 2). Это иллюстрируют сле¬ дующие варианты выполнения рассмотренной выше программы: Чтобы удостовериться в том, что имеющийся датчик генерирует дей¬ ствительно случайную последовательность, можно провести анализ работы функции RND ( ). V Используемые после ’’стартового” отрицательного значения после¬ дующие положительные значения аргумента функции RND (например, 1) вызывают генерирование этой функцией случайных чисел, больших или равных нулю, ио меньших единицы.— Прим. ред.
Коды 195 100 REM ***** ГЕНЕРАЦИЯ СЛУЧАЙНЫХ ЧИСЕЛ ***** 110 REM ***** С УСТАНОВКОЙ СТАРТОВОГО ЧИСЛА ДАТЧИКА ***** 120 X = RND ( — 123) 130 FOR I = 1 ТО 10 140 PRINT INT (26* RND (I)) 150 NEXT I □ RUN 10 2 24 12 13 8 8 17 3 18 100 REM ***** ГЕНЕРАЦИЯ СЛУЧАЙНЫХ ЧИСЕЛ ***** 110 REM ***** С УСТАНОВКОЙ СТАРТОВОГО ЧИСЛА ДАТЧИКА ***** 120 X = RND ( — 345) 130 FOR 1 = 1 ТО 10 140 PRINT INT (26* RND (1)) 150 NEXT I 2 RUN 19 18 21 2 18 4 13 22 22 10 100 REM ***** ГЕНЕРАЦИЯ СЛУЧАЙНЫХ ЧИСЕЛ ***** 110 REM ***** С УСТАНОВКОЙ СТАРТОВОГО ЧИСЛА ДАТЧИКА ***** 120 X = RND ( — 123) 130 FOR 1 = 1 ТО 10 140 PRINT INT (26* RND (1)) 150 NEXT I □ RUN 10 2 24 12 13 8 8 17 3 18
196 Глава 5 Рис. 19.2. В первом и третьем случаях результат выполнения программы идентичен, поскольку использовано одно и то же ’’стартовое” значение аргумента функции RND. Во втором случае это зна¬ чение задано другим, и поэтому программа формирует другую последовательность случайных чисел. Схема алгоритма на рис. 19.2 описывает последовательность операций, которые должна выполнять программа кодирования и декодирования сообщений, использующая последовательность случайных чисел, генерируемых описанным выше способом, при условии, что ’’стартовое” значение аргумента функции RND
Коды 197 задает пользователь. Для ввода обрабатываемых сообщений пред¬ полагается использовать мини-редактор текста, описанный при решении задачи 17. Используемые в задаче 18 функции ASC и CHR$ следует при¬ менять и при составлении разрабатываемой программы. В слу¬ чае каких-либо затруднений можно обратиться к программе 19.1 приложения. Отметим лишь, что строки 100—650 этой программы в точности повторяют мини-редактор текста задачи 17.
6 СИЛЫ ГРАВИТАЦИИ И КОСМИЧЕСКОЕ ПРОСТРАНСТВО Задачи, рассматриваемые в этой главе, посвящены силам гравитации. В задаче 20 речь идет о действиях силы гравитации у поверхности Земли и, в частности, о ее влиянии на траекторию движения объекта, подобного футбольному мячу. Результаты ре¬ шения этой задачи находят непосредственное применение в зада¬ че 21, описывающей электронную игру — имитатор элементов игры в американский футбол. В задаче 22 рассматривается тех¬ ника программирования на ЭВМ электронной игры, содержанием которой является процедура спуска на Луну (’’прилунение”). Существует легенда о роли яблока в открытии Исааком Нью¬ тоном закона всемирного тяготения. Этот великий английский ученый и знаменитый немецкий ученый Готфрид Вильгельм фон Лейбниц независимо разработали теорию дифференциального и интегрального исчисления для решения ряда физических задач, включая описание орбитального движения планет. Задача 23 данной главы — одна из подобных задач, решаемых методами численного анализа на ЭВМ. Полученные результаты исполь¬ зуются в задаче 24, посвященной моделированию на ЭВМ движе¬ ния Земли, а также планет Меркурий, Венера и Марс вокруг Солнца. Предлагаемые решения применимы для описания орби¬ тального движения лун и искусственных спутников. С задачами 20, 23 и 24 рекомендуется знакомиться в указан¬ ной последовательности; к задачам 21 и 22 можно обращаться в любом порядке после рассмотрения задачи 20. Задача 20. Движение по баллистической кривой Назначение разрабатываемой программы: описание параметров движения объектов (футбольного мяча и т. д.) по баллистической кривой. Специфические предпосылки успешной разработки: отсутст¬ вуют. Пояснения программисту: рассматривается задача средней трудности выполнения.
Силы гравитации и космическое пространство 199 В данной задаче анализируется полет футбольного мяча или другого объекта, бросаемого над землей (рис. 20.1). После того как мяч покидает руку футболиста, на его положение в прост¬ ранстве начинает оказывать влияние сила гравитации (на мяч влияет и ветер, что в задаче не учитывается, однако в реаль¬ ной жизни игроку приходится принимать это обстоятельство во внимание). Сила гравитации (притяжения земли)' вызывает ускорение свободного падения мяча, равное —32 фут/с2 или —9,8 м/с21). Ускорение записывается со знаком ’’минус”, симво¬ лизируя тем самым движение тела сверху вниз. Величина уско¬ рения означает следующее: мяч, который уронил человек, стоящий на краю обрыва, движется вниз в течение первой секунды в среднем со скоростью —32 фут/с, в течение второй секунды —64 фут/с и т. д. Мяч, брошенный вертикально вверх с начальной скоростью 100 фут/с, проходит первую секунду в среднем со скоростью 68 фут/с, вторую секунду — со ско¬ ростью 36 фут/с и т. д. Указанное можно выразить в виде фор¬ мул, используя V для обозначения скорости (футы в секунду) X) | фуТ=зо, 48 см.— Прим, перев.
200 Глава 6 и t для обозначения времени (секунды)'. Так, для мяча, падающего вниз под действием силы тяжести (рис. 20.2), скорость описывает¬ ся выражением —32*/, а для мяча, брошенного вертикально вверх с начальной ско¬ ростью 100 фут/с (рис. 20.3),— выражением V = 100 — 32*/. Отметим, что во втором случае скорость движения мяча имеет знак ’’плюс” в течение первого интервала времени движения, равного 3,125 с (100/32), и знак ’’минус” в течение второго (зак- Рис. 20.3. лючительного) интервала времени. Это соответствует тому, что мяч будет подниматься вверх в течение 3,125 с, а затем начнет падать вниз. Предположим, что требуется определить путь, который про¬ ходит в течение некоторого интервала времени мяч, брошенный вертикально вверх. Пусть этот интервал равен первой 1/4 с полета. Скорость в начале этой 1/4 с движения составляет 100 фут/с, а в конце — 92 фут/с (100—32*0,25=92). Используя эту информацию, можно дать оценки ’’сверху” и ’’снизу” значения пути, пройденного мячом за первую 1/4 с. Этот путь не может превосходить величину, определяемую начальной скоростью 100 фут/с, а именно 100*0,25=25 фут, но и не может оказаться меньшим 92*0,25=23 фут, т. е. дистанции, которую прошел бы мяч, двигаясь со скоростью 92 фут/с, равной его скорости в кон¬ це рассматриваемого пути. Лучшую оценку величины пройден¬ ного пути дает вычисление среднего арифметического указанной
Силы гравитации и космическое пространство 201 выше пары оценок х): (24 + 23)/2 = 24 фут. Проведенные вычисления можно повторить для оценки ве¬ личины пути, проходимого мячом в течение второй 1/4 с его дви¬ жения (полета). В начале этого интервала времени его скорость составляла 92 фут/с (100 — 32*0,25), а в конце—84 фут/с (100— 32*0,5). Это позволяет определить оценки ’’сверху” и ’’снизу” величины пройденного пути: 92*0,25=23 фут и 84*0,25= = 21 фут. Среднее арифметическое этих предельных оценок составляет (23+21)/2=22 фут. Следовательно, пройдя вверх за первую 1/4 с 24 фут, а за вторую 1/4 с 22 фут, мяч окажется на высоте 46 фут (24+22) за первую 1/2 с. Подобные расчеты можно продолжить для третьей 1/4 с, четвертой 1/4 с т. д. На основании проведенных рассуждений можно написать программу построения графика движения мяча, брошенного вертикально вверх. Используя подобную программу, приводи¬ мую в приложении, можно построить график, аналогичный пока¬ занному на рис. 20.4. По оси абсцисс отложен временной интер- Рис. 20.4. вал 0—10 с через каждую секунду. На оси ординат указан диа¬ пазон значений высоты, на которой находится мяч в каждый данный момент времени (0—300 фут, через каждые 10 фут). График, представленный на рис. 20.4, соответствует начальной скорости бросания мяча 120 фут/с. Читателю предлагается напи¬ сать программу, воспроизводящую подобный график. При воз- 9 По счастливому стечению обстоятельств данная оценка является точной. Более детально вопросы приемлемости подобных оценок рассмат¬ риваются в задаче 23,
202 Глава 6 никновении затруднений можно обратиться к программе 20.1 приложения. Проведенные выше рассуждения позволяют перейти к рас¬ смотрению основной задачи данного раздела — моделированию траектории движения мяча, брошенного под некоторым углом к горизонту с начальной скоростью V (рис. 20.5). Используя экран дисплея ЭВМ для построения подобной траектории, будем стре¬ миться к возможно более точному воспроизведению реального полета мяча, компенсируя искажения, вносимые дисплеем из- за его конечной разрешающей способности. Для этого прежде Ьсего необходимо ’’нарисовать” на экране прямоугольник на¬ ибольших возможных размеров и измерить его. Воспользуемся оператором HPLOT 0,0 ТО 279, 0 ТО 279, 159 ТО 0, 159 ТО 0,0 Дисплей ЭВМ, которой пользовался автор, имел размеры 19,5# « 12,0 см (рис. 20.6). Если 1 см соответствует 10 фут, то на экране можно воспроизвести траекторию, длина которой не превышает 12,0 19,5 Рис, 20.6. 195, а высота— 120 фут. Таким образом, значения вдоль оси абсцисс могут меняться в пределах 0—195 фут, а вдоль оси ор¬ динат — в пределах 0—120 фут. Для задания соответствующего масштаба текст программы следует начать с операторов DEF. Затем в программе необходимо разместить процедуру нанесения
Силы гравитации и космическое пространство 203 на оси координат делений с интервалом 10 фут. Подобная про* цедура занимает строки 220—360 программы 20.2 приложения. Траектория движения мяча, брошенного под углом к горизон¬ ту со скоростью V, имеет два измерения: вдоль оси абсцисс (по горизонтали) и вдоль оси ординат (по вертикали). Поэтому не- Рис. 20.7. обходимо измерить значения горизонтальной (1Л¥)и вертикаль¬ ной (УУ) скоростей, как показано на рис. 20.7. Для этого про¬ грамма должна ’’потребовать” от пользователя ввода значения горизонтальной составляющей VX скорости, с которой бросается мяч. Вертикальную составляющую VY можно определить по теореме Пифагора (УХ)2+(VY)2=V2, используя в программе оператор присваивания VY = SQ7? (V * V—VX * VX). Теперь все подготовлено для вычисления значений координат X и Y местоположения мяча в любой заданный момент времени, В начальный момент времени Х=0 и 2=0. Необходимо задать значение интервала времени DT, определяющего период повто¬ рения вычисления значений координат местоположения мяча. Положим DT=0,02. (Читателю предлагается проэксперименти- ровать с различными значениями DT.) Без учета влияния ветра на полет мяча получаем значение горизонтальной составляющей VT скорости в виде некоторой Таблица 20.1 Т в начале интервала Т в конце интервала VX в начале VX в конце VY в начале VY в конце X в начале X в конце Y в начале Y в конце 0 0,02 20 20 20 19.36 0 0,4 0 0,3936 0,02 0,04 20 20 19,36 18,72 0 ,4 0,8 0,3936 0,7744
204 Главе 6 Начало Рис. 20.8. константы. Тогда за время DT мяч проходит вдоль оси абсцисс путь DT*VX (фут). Координату X мяча можно определить по¬ средством оператора X = X+DT*VX. Несколько сложнее определяется координата Y, В момент бросания мяча вертикальная составляющая скорости VY опре¬ деляется приведенным выше оператором (на основании теоремы Пифагора). К концу первого интервала времени DT она опреде¬ ляется как NYVY—32*DT. Среднее арифметическое этих
Силы гравитации и космическое пространство 205 двух значений, равное (VY-\-NY)/2, позволяет определить путь, пройденный за указанный интервал времени, а именно: DT* * (VY+NY)/2. Следовательно, новое местоположение мяча вдоль оси ординат определяется оператором У = У + DT*(VY -\-NY)/2. Результаты подобных расчетов при 07=0,02 и начальных значениях VX и VY, равных 20, сведены в табл. 20.1. Изложенное выше должно позволить читателю самостоятель¬ но написать текст программы. Если необходимо, то можно ис¬ пользовать для этих целей схему алгоритма, приведенную на рис. 20.8, и программу 20.2 приложения. Дополнительные задания 1. Используя разработанную программу, определите для У=50фут/с значение VX, при котором мяч пролетает максималь¬ но возможное расстояние. (Другими словами, необходимо опре¬ делить угол бросания мяча, обеспечивающий максимальную даль¬ ность его полета.) 2. Модифицируйте программу таким образом, чтобы она оп¬ ределяла траекторию движения мяча, бросаемого на Луне, сила гравитации которой составляет 1/6 силы гравитации Земли. (Сле¬ довательно, ускорение свободного падения на Луне в 6 раз мень¬ ше ускорения свободного падения на Земле.) Во сколько раз дальше можно бросить мяч на Луне, чем на Земле? Задача 21. Имитатор элементов игры в американский футбол (играющий имитирует действия защитника, пытающегося выполнить передачу мяча принимающему партнеру) Назначение разрабатываемой программы: реализация на ЭВМ игры с использованием пульта управления. Специфические предпосылки успешной разработки: знаком¬ ство с решением задачи 20. Пояснения программисту: разрабатывается программа сред¬ ней трудности; игра может быть запрограммирована с использо¬ ванием специального пульта управления игрой или клавиатуры ЭВМ; первый вариант рассматривается детально и соответствует программе 21.1 приложения, второй — программе 21.2 приложе¬ ния 1}. Х) Конечно, Вы можете написать собственную программу, используя клавиатуру вместо пульта управления игрой (см. задачи 1 и 2). Программа 21.2 идентична программе 21.1, за исключением того, что она рассчитана на использование клавиатуры.
206 Глава б Представьте себя участником игры в американский футбол в роли защитника с пультом управления игрой в руках. Вы на¬ жимаете на кнопку пульта — и ваш партнер бросается к линии ворот. Вращая ручку управления, вы нацеливаете мяч, затем нажимаете на кнопку пульта — и мяч устремляется в намечен¬ ном направлении. Под восклицания болельщиков мяч прочерки¬ вает высоко над полем дугообразную кривую, направляясь к вы¬ тянутым рукам вашего партнера. Принимающий, игрок 1-ярдовые метки l j l i I l ! I l l l | I ГГТ'Г I ]' I I I I I I I | I | 70-ярдовые метки Рис. 21.1. В рассматриваемой задаче требуется разработать программу, моделирующую процесс игры. Для этого оказываются полезны¬ ми результаты решения задачи 20, описывающие траекторию полета мяча. Однако сначала необходимо создать на экране дис¬ плея изображение игрового поля. Схематически подобное поле представлено на рис. 21.1. В реализующей такое поле программе 21.1 приложения для представления линейного размера, равного 1 фут, используются два элемента разложения поля экрана дис¬ плея, работающего в графическом режиме с высокой разрешаю¬ щей способностью. Благодаря этому каждый ярд (0,9 м) представ¬ лен шестью элементами разложения, а длина всего поля равна 279/6=46,5 ярд (весьма немалое расстояние). Итак, на экра¬ не поле простирается от точки с машинными координатами (0,140) до точки с координатами (279, 140), причем, согласно рис. 21.1, через 1 ярд нанесены ’’мелкие” деления (метки), а через 10 ярд — ’’крупные”. Игрок, принимающий мяч, условно изображен отрез¬ ком вертикальной линии, высота которого соответствует 10 стро¬ кам (139—130), а ширина — 3 строкам; этот отрезок на горизон¬ тальной оси занимает положение, соответствующее ее значениям 10—12 машинной координаты х. После масштабирования горизонтальной оси необходимо вы¬ полнить масштабирование вертикальной оси. В задаче 20 с по¬ мощью линейки измерялись длина и ширина прямоугольника, формируемого на экране дисплея оператором HPLOT 0,0 ТО 279, 0 ТО 279, 159 ТО 0, 159 ТО 0,0
Силы гравитации и космическое пространство 207 Автор использовал дисплей, диагональ экрана которого равна 12 дюйм (30 см). Прямоугольник, вписываемый в поле экрана, имел длину 19,5 см и ширину (высоту) 12,0 см, т. е. размер эле¬ мента разложения по вертикали составлял 12/159=0,07 547 см, а по горизонтали — 19,5/279=0,0 698 925 см. Согласно выбран¬ ному масштабу, для представления 1 фут линейного размера иг¬ рового поля используются два элемента разложения по гори¬ зонтали, т. е. 1 фут соответствует 2-0,0 698 925=0,139 785 см. Тогда каждый элемент разложения по вертикали представляет линейный размер, равный 0,7547/0,139 785=0,54 фут, т. е. для изображения одного фута линейного размера требуется 1/0,54 = = 1,852 193^1,85 элементов разложения по вертикали. Поскольку на экране дисплея, использованного автором, каждый фут представляется 1,85 элементами разложения по вер¬ тикали, а нижнему уровню вдоль вертикальной оси соответству¬ ет значение машинной координаты у, равное 140, то значение вы¬ соты У, выраженное в футах, может быть преобразовано в зна¬ чение машинной координаты вдоль вертикальной оси следую¬ щим выражением: 140—1,85*У. Выше указывалось, что линей¬ ному размеру 1 фут на экране дисплея соответствуют два эле¬ мента разложения по горизонтали. Поэтому X футов представля¬ ются вдоль горизонтальной оси 2*Х элементами. Следующей задачей в процессе разработки данной программы является описание процедуры использования пульта управления игрой для прицеливания, которое входит в функцию защитника. На пульте имеется ручка управления, положениям которой соот¬ ветствуют целые числа 0—244. Текущее положение этой ручки можно записать в память ЭВМ как значение некоторой перемен¬ ной посредством оператора присваивания вида Z=PDL(0). Ав¬ тору книги не повезло: имевшийся в его распоряжении пульт управления игрой позволял достичь максимального значения этой переменной, не превышающего 233. Читателю, пользующе¬ муся подобным пультом, рекомендуется проверить его работо¬ способность с помощью следующей программы: 100 PRINT PDL(0) ПО FOR DLY = 1 ТО 150 : NEXT DLY 120 GO TO 100 В процессе выполнения этой программы ручку управления сле¬ дует вращать в обоих направлениях. При достижении предела вращения против часовой стрелки значение функции PDL(0) должно быть равным, 0 при достижении предела вращения по ча¬ совой стрелке — 255. Проведя эксперименты с пультогл управле¬ ния игрой, можно заметить, что функция PDL(0) произвольно „переходит” с одного значения на ближайшее другое и обратно даже при неподвижном положении ручки. Эти недостатки при¬ сущи подобным техническим средства^м управления.
208 Глава 6 Для обозначения направления на цель (линии визирования)' защитника воспользуемся прямой линией (’’линия бросания мяча”) длиной 12 элементов разложения. Проекции этой линии на оси координат обозначим через LX и LY соответственно. Пусть на¬ /х /1иния бросания Рис. 21.2. чальная скорость бросания мяча Е0=65 фут/с. Обозначим гори¬ зонтальную и вертикальную составляющие этой скорости через VX и VY соответственно (рис. 21.2). Тогда из подобия треуголь¬ ников направления бросания и начальной скорости следует, что LX] 12 - VX/V0 и LY /12 - VE/VO. Используя ручку управления на пульте, играющий может изменять значение LX и тем самым управлять им. Такую воз¬ можность обеспечивает следующий фрагмент программы: Z = PDL(O) IF Z > 200 THEN Z = 200 LX = 12 * Z/200 x> LY = SQR(144 — LX * LX) Если ручка управления повернута против часовой стрелки до от¬ каза (Z=0), то LX=0 и £У = 12. Это соответствует нацеливанию мяча вертикально вверх. Если же положение потенциометра близко к предельно возможному при повороте по часовой стрел¬ ке (Z^200), то LX = 12, a LY=0, что соответствует бросанию мяча в горизонтальном направлении. При расположении защитника в точке поля с координатами (0, 139) линия бросания описывается оператором HPLOT 0,139 ТО LX, 139 — LY * 1.85/2 Отметим, что коэффициент 1,85/2 предназначен для коррекции искажений изображения поля, вносимых экраном дисплея Величина LY рассчитывается на основе теоремы Пифагора,
Силы гравитации и космическое пространство 209 (рис. 21.3). Упомянутая линия бросания должна появляться на экране только после нажатия кнопки на пульте управления иг¬ рой, что является сигналом начала движения игрока, принимаю¬ щего мяч, который в этот момент бросается к линии ворот. Рис. 21.3. Основной цикл разрабатываемой программы составляет по¬ следовательность операторов, выполняющих вычисления значе¬ ний тех параметров игры, которые описывают происходящее в те¬ чение очередного интервала времени, равного 0,05 с. Алгоритм этого цикла представлен схемой на рис. 21.4. Повторение опера¬ торов тела цикла осуществляется до тех пор, пока не происхо¬ дит такое событие, которое останавливает этот периодически пов¬ торяющийся процесс (например, принимающий игрок выбегает за пределы поля или пас не завершается). Ниже следует несколько важных замечаний относительно рас¬ сматриваемого алгоритма. 1. Предыдущее показание ручки уп¬ равления записано на хранение в ОХ. Естественным решением в программе бы¬ ло бы использование оператора IF Z = = 0XTHEN. Однако (как уже отмеча¬ лось) показание, определяемое функцией PDL(O), может изменяться на 1 произ¬ вольно, без изменения положения ручки управления. Для пре¬ дотвращения отрицательных последствий подобного ’’дрожания” показаний следует воспользоваться оператором IF ABC(Z—OX) <2 THEN... 2. За 0,05 с принимающий игрок пробегает расстояние, соот¬ ветствующее 1 фут. Согласно схеме алгоритма (рис. 21.4), это реализуется двумя отдельными движениями по 1/2 фут каждое. Такое решение обеспечивает большую плавность воспроизведе¬ ния движений на экране дисплея. 3. Для вычисления новых значений скорости и координат по¬ ложения мяча используется соответствующий фрагмент програм-
210 Глава 6 Начало основного цикла программы Рис. 21.1
Силы гравитации и космическое пространство 211 мы задачи 20, а именно: = 32*D7\ X^BX + VX^DT. Y = BY + DT*(VY + NY)/2f где BX и BY — старые, а X и Y — новые координаты мяча. Необходимо отметить, что, если DT=0, мяч не вброшен. В на¬ чале программы величина DT полагается равной 0, поэтому мяч не может двигаться, пока не нажата кнопка управления игрой и величина DT не положена равной 0,05. Вычисление начальных значений горизонталь¬ ной W) и вертикальной (VY) скоростей; Ш=0}05 4\ Мяч бросают всегда с начальной скоростью VO=65 фут7с/ Поэтому, используя подобие треугольников на рис. 21,2, полу- Рис. 21,5.
212 Глаза 6 чаем VX = VCULA/12, VY = VO*LY/12. Чтобы начать перемещение мяча, переменная DT полагается рав¬ ной 0,05. 5. Для программирования процедуры проверки, нажата ли кнопка пуска на пульте управления игрой, следует обратиться к соответствующим рекомендациям задачи 1 или руководству по программированию на языке Бейсик ЭВМ Apple II. Теперь все подготовлено для анализа схемы алгоритма рабо¬ ты всей программы (рис. 21.5), на которой ранее описанный ос¬ новной цикл представлен одним блоком (в нижней части рисун¬ ка). Относительно этой схемы можно сделать следующие два за¬ мечания. 1. Поскольку предполагается использование одной и той же кнопки пульта управления как для приведения принимающего игрока в движение, так и для бросания мяча, то требуется прове- Таблица 21.1. Комментарии к отдельным частям программы 21.1 Номера строк программы Назначение 200—210 220—280 290—330 340 350—360 370 380—730 380—450 500—530 1 6Ю—640 / 540—600 650—730 800—870 Присвоение постоянного значения начальной скорости (V0-—65) и настройка на подачу звукового сигнала (при¬ своение G$ значения управляющего символа CTRL-G) Формирование изображения игрового поля Установка мяча и принимающего игрока в исходное поло¬ жение DT = 0 для отмены движения мяча Проверка, была ли нажата и отпущена кнопка пульта 0 Установка старого угла наклона линии бросания (ОХ = —10) для формирования изображения этой линии при первом выполнении операций основного цикла. Основной цикл Если значение функции PDL (0) изменилось, стирание ста¬ рой линии бросания и формирование изображения новой линии. Перемещение принимающего игрока на 1/2 фут; проверка, не находится ли он в конце поля Перемещение мяча (если DT ?= 0) и проверка, ударился ли мяч о землю или достиг ли он принимающего игрока Проверка, была ли нажата кнопка пульта 0; если ответ положительный, то присвоение начальных значений пере¬ менным VX и VY, а также присвоение DT значений 0,05 Вывод соответствующих сообщений о завершении или о неза- вершении паса и т. д.
Силы гравитации и космическое пространство 213 рить работоспособность кнопки дважды — в состояниях ’’нажа¬ то” и ’’отпущено”, прежде чем выполнить пуск основного цикла. 2. В аналогичной программе, разработанной автором, пере¬ менной (используемой для хранения старого показания потен¬ циометра пульта управления, представляемой функцией PDL(O)) присваивается значение —10. Поскольку пульт управления иг¬ рой не может дать подобное показание, это гарантирует форми¬ рование изображения линии бросания при первом выполнении операций основного цикла. Читателю предлагается попытаться самостоятельно написать соответствующую программу. Это может оказаться не очень про¬ стой задачей. Поэтому можно рекомендовать обратиться еще раз к рассмотренным выше фрагментам программы, а также приводи¬ мой в приложении программе, разработанной автором. В послед¬ нем случае может оказаться полезной информация, представлен¬ ная в табл. 21.1. Программа 21.2 приложения является вариан¬ том программмы 21.1, ориентированным на использование кла¬ виатуры ЭВМ вместо пульта управления игрой. Задача 22. Имитатор управления посадкой космического корабля на поверхность Луны Назначение разрабатываемой программы: реализация на ЭВМ игры с использованием различных возможностей машинной гра¬ фики и звуковых эффектов. Специфические предпосылки: знакомство с решением задачи 20. Пояснения программисту: разрабатываемая программа срав¬ нительно велика по количеству операторов, однако благодаря этому позволяет продемонстрировать разнообразие возможностей воспроизведения графической информации и звуков. Представьте, что вы пролетели на космическом корабле зна¬ чительное расстояние от Земли и находитесь всего в нескольких километрах от Луны, стремительно приближаясь к ее поверх¬ ности. На экране дисплея перед вами изображение корабля, не¬ сущегося в направлении гористого ландшафта Луны. Ваша зада¬ ча — безопасно ’’прилуниться” на крошечную посадочную пло¬ щадку. Электронные игры, имитирующие управление подобными спусками космических кораблей, чрезвычайно популярны. Раз¬ работано много различных программ — имитаторов таких опера¬ ций. В их основу заложен простой принциип: играющий управля¬ ет последней стадией полета корабля, пытаясь как можно ’’мяг¬ че” выполнить посадку. Рассматриваемая ниже программа реали¬ зует также несколько сопутствующих функций, а именно:
214 Глава 6 1) формирует новое изображение лунного ландшафта (по не¬ которому случайному закону) при каждом новом сеансе игры; 2) формирует изображение звездного неба как некоторого фона, на котором происходят основные события; площадка Рис. 22.1. Звездное > неоо 3) обеспечивает играющему управление движение^м космиче¬ ского корабля в двух направлениях на плоскости с помощью трех посадочных ракет, которые управляются нажатием соответствую¬ щих клавиш на клавиатуре ЭВМ, а именно: клавиши ”Х” для ориентации движения корабля вниз (при каждом нажатии кла¬ виши соответствующая ракета дает импульс кораблю, ускоряя его движение), клавиши ”К” — для ускорения корабля вправо, клавиши ”J” — для ускорения влево. Читатель может усовершенствовать программу, вводя по соб¬ ственному желанию процедуры, обеспечивающие программе но¬ вые дополнительные функции. Рассмотрение поставленной задачи начнем с описания лунного ландшафта, изображаемого на экране дисплея (рис. 22.1). Си¬ луэт космического корабля весьма прост (рис. 22.2). Он форми¬ руется операторами, расположенными в строке 690 программы 22.1. Процедура стирания изображения корабля размещается в строке 670 этой программы. При каждом пуске программы создается новый рисунок лун¬ ного ландшафта. Изображение формируется по случайному за¬ кону в поле экрана со значениями координаты 0—270 вдоль оси X. При этом используется графический режим работы дисплея с высокой разрешающей способностью. Посадочная площадка всегда имеет форму, показанную на рис. 22.3. Индексированные переменные L(0), Л(1), ..., Л(270) используются для хранения значений координаты У, символически обозначающей высоту соответствующих точек лунного ландшафта, абсциссы которых
Силы гравитации и космическое пространство 215 имеют значения 0, 1, ..., 270. Координаты посадочной площадки имеют следующие значения: L (130) = 150, L (131) = 159, Л(132) = = 159, ..., L(139) = 159, L(140) = 150. Значение подобных коор¬ динат остальной части лунного ландшафта определяется каждый раз случайным образом. Читатель может написать соответствую¬ Рис. 22.2. (130,150) (14 0,150) (130,159) & (14 О,159) Рис. 22.3. щий фрагмент программы, формирующий ландшафт вполне опре¬ деленного вида или случайной формы, но задаваемый каким-либо другим законом распределения случайных величин. Автор вос¬ пользовался алгоритмом случайных блужданий (строки 230— 320 программы 22.1). Чтобы изображаемое на экране выглядело более реалистич¬ ным, к описанному выше следует добавить 100 сверкающих звезд, ’’рассыпанных” по небу случайным образом. Координаты X и Y подобной звезды могут быть получены посредством соответст¬ вующих операторов X=270*RND (1) и K=£(X)*RND(1). По¬ скольку 0^У<£(Х), звезды всегда располагаются выше уровня поверхности Луны (строки 360—400 программы 22.1). К этому полному описанию изображаемого на экране чита¬ тель при желании может добавить, например, изображение из¬ вестных созвездий или силуэта освещенной части нашей планеты на лунном небосклоне. Теперь можно перейти к рассмотрению основной части про¬ граммы. Прежде всего отметим, что отсчет значений координат ведется не в километрах или милях, а в элементах разложения экрана дисплея (машинных единицах), которые являются безраз¬ мерными величинами. Для координат местоположения космиче¬ ского корабля введены соответствующие обозначения X и Y (рис. 22.2). В исходном состоянии Х=10, a Y=6, т. е. корабль стартует из верхнего левого угла поля экрана. Соответствующие горизонтальная и вертикальная составляющие начальной ско¬ рости равны VX=5f VY =5; корабль движется вправо и вниз.
216 Глава 6 Для управления скоростью происходящих событий используется переменная DT. Вполне приемлем режим работы при DT=0,4, однако читателю предлагается провести эксперименты и с дру¬ гими значениями этой переменной. Для управления числом повто¬ рений выполнения операций основного цикла используется пе¬ ременная ТМ (время). Переменная FUEL регистрирует количест¬ во израсходованного топлива. Когда космический корабль совер¬ шает прилунение, программа выводит значение переменных ТМ и FUEL. Основной цикл включает выполнение операций, пере¬ численных ниже. 1. VY = VY+0,25. Вертикальная составляющая скорости корабля увеличивается под действием силы притяжения Луны, 2. NY=Y+VY*DT NX=X-\-VX*DT. Вычисляются новые значения коорди¬ нат местоположения корабля. 3. ТМ=ТМ+\. Подсчитывается число повторений выполне¬ ния операций основного цикла. 4. Проверка, не вышел ли корабль за пределы поля экрана (ХХ<2 или jVX>268). 5. Проверка, не коснулся ли корабль поверхности Луны. Силуэт корабля, предложенный автором, таков, что один из двух стабилизаторов обязательно коснется первым, поэтому усло¬ вием пребывания корабля над поверхностью является следую¬ щее: IF NY < L(NX — 2) AND NY < L(NX + 2) 6. Проверка, не была ли нажата какая-либо клавиша. Если да, то выполняется операция GET Х$, а затем последователь¬ ность действий: 720 IF Х$ = ”Х” THEN VY = VY — .5: FUEL = FUEL + .5: GOTO 530: REM ПРИ НАЖАТИИ КЛАВИШИ ”X” КОРАБЛЬ ПОЛУЧАЕТ УСКОРЕНИЕ В ВЕРТИКАЛЬНОМ НАПРАВЛЕНИИ 730 IF Х$ = ”К” THEN VX = VX + .5:FUEL = FUEL + .5: GOTO 530: REM ПРИ НАЖАТИИ КЛАВИШИ ”К” КОРАБЛЬ ПОЛУЧАЕТ УСКОРЕНИЕ ВПРАВО 740 IF Х$ = ”J” THEN VX = VX — .5:FUEL = FUEL + .5: GOTO 530: REM ПРИ НАЖАТИИ КЛАВИШИ ”J” КОРАБЛЬ ПОЛУЧАЕТ УСКОРЕНИЕ ВЛЕВО Играющий управляет полетом космического корабля следую¬ щим образом. При вводе буквы ”Х” корабль получает импульс дви¬ жения в вертикальном направлении, при вводе буквы ”/<” или ”«/” — импульс движения вправо или влево соответственно. Пе¬ ременная FUEL регистрирует потребление топлива. 7. После касания кораблем поверхности Луны выполняется проверка, произошло ли это на посадочной площадке и выполнено ли оно достаточно мягко. Выводятся соответствующие сообщения о результатах такой проверки. Здесь еще раз читателю предостав¬
Силы гравитации и космическое пространство 217 ляется возможность внести изменения в программу, используя разнообразие средств машинной графики и воспроизведения зву¬ ков. Например, можно более эффектно оформить процедуру ре¬ гистрации аварии при прилунении. В программе, разработанной автором, авария при посадке регистрируется при выполнении условия ABS(VX) > 2OR VY>2. Читатель может использовать более ’’жесткие” условия регистра¬ ции аварии. Теперь все подготовлено для самостоятельной работы над составлением текста алгоритма и программы имитации управле¬ ния посадкой космического корабля на поверхность Луны. При возникновении затруднений в процессе работы можно обратиться к тексту программы 22.1 приложения. Задача 23. Определение площади заданной области на плоскости с помощью численных методов Назначение разрабатываемой программы: реализация на ЭВМ численных методов прикладной математики. Специфические предпосылки успешной разработки: отсутст¬ вуют. Пояснения программисту: техника программирования подоб¬ ных задач проста. Рассматриваемые ниже проблемы занимали умы многих ве¬ ликих математиков, и в том числе Ньютона и Лейбница. Хотя по¬ следние и внесли огромный вклад в решение этих проблем, ни од¬ ному из них не удалось дать законченное описание подобных ре¬ шений. Эти проблемы тесно связаны с открытием Ньютоном за¬ кона всемирного тяготения. Легенда гласит, что неоценимую ус¬ лугу в этом знаменитому ученому оказало яблоко (по-английски Apple), свалившееся ему на голову. В практической реализации описываемых ниже решений подобных задач автору книги помогла персональная ЭВМ, по случайному стечению обстоятельств наз¬ ванная Apple. Проблема 1 Необходимо описать на языке программирования вычисление площади заштрихованной области (рис. 23.1), ограниченной сни¬ зу и по бокам одним горизонтальным и двумя вертикальными от¬ резками прямых линий соответственно, а сверху — отрезком некоторой кривой. Рассмотрим частный случай, когда кривая описывается зависимостью у= V 10л—хг, а вертикальные отрез-
218 Глава 6 ки перпендикулярны оси абсцисс в точках х=1 и х—3 (рис. 23.2)'. Максимальные значения ординат левого (короткого) и правого (длинного) вертикального отрезков определяются значениями абсцисс х—1 и х=3 соответственно: —12=К10—1=3, /10-3—32=К30—9 =4,5 825 757. Для любого значения х в пре- . делах горизонтального отрезка (от х=1 до х=3) соответствующее значение ’’высоты” рассматриваемой области определяется выра¬ жением К Юх—х2 (рис. 23.3). Поскольку может возникнуть не¬ обходимость в определении значения этой «высоты» при различ¬ ных значениях х, целесообразно воспользоваться услугами ЭВМ,
Силы гравитации и космическое пространство 219 написав программу, состоящую из оператора 100 DEF FN F(X) = SQR(10 * X — X * X) Чтобы ее использовать, достаточно набрать на клавиатуре текст PRINT FN F(l), PRINT FN F(3) или PRINT FN F(2). В ответ на это ЭВМ вычислит и выведет значение ’’высоты”, соответствую¬ щее отсчету по оси абсцисс 1, 3 или 2. Для оценки рассматриваемой области рассмотрим ’’вписан¬ ный” в нее заштрихованный прямоугольник (рис. 23.4). Посколь¬ ку ширина прямоугольника составляет 2, а высота 3, его площадь
220 Глава 6 равна 6. Очевидно, что площадь области, охватывающей этот прямоугольник, больше 6. Теперь обратимся к рис. 23.5, на котором представлен за¬ штрихованный прямоугольник, включающий в себя данную об¬ ласть. Ширина этого прямоугольника равна 2, высота — 4,5 825 757, следовательно, площадь составляет 9,1 651 514. Таким образом, площадь интересующей нас области меньше 9,1 651 514, т. е. 6 площади области 9,1 651 514, где 6 — оценка ’’снизу” (с недостатком), а 9,16 51 514 — оценка ’’сверху” (с избытком).
Силы гравитации и космическое пространство 221 Более близкие оценки значения площади данной области мож¬ но получить, если каждый из указанных выше прямоугольников заменить соответствующей парой прямоугольников, как пока¬ зано на рис. 23.6. Для этого вычислим ’’высоту” области при х=2, а именно V 10*2—22=4. Тогда оценка ’’снизу” (с недостатком) определяется как сумма площадей двух прямоугольников на рис. 23.6, а. Параметры первого прямоугольника: ширина 1, вы¬ сота 3, площадь 3. Параметры второго треугольника: ширина 1, высота 4, площадь 4. Сумма площадей этих прямоугольников (3+4=7) свидетельствует о том, что площадь интересующей нас области по крайней мере не меньше 7. Для оценки ’’сверху” (с избытком) требуется определить сум¬ му площадей двух прямоугольников на рис. 23.6, б. Параметры первого прямоугольника: ширина 1, высота 4, площадь 4. Пара¬ метры второго прямоугольника: ширина 1, высота 4,5 825 757, площадь 4,5 825 757. Сумма площадей обоих прямоугольников (8,5 825 757) является верхним пределом возможного значения площади области. В результате получаем, что справедливо сле¬ дующее соотношение: 7 С площади области 8,5 825 757. Отметим, что данные оценки возможного значения площади об¬ ласти лучше предыдущих, поскольку сужен диапазон, в пределах которого находится искомая величина. Дальнейшее увеличение количества используемых прямоугольников позволит получить более точные оценки. Читателю предлагается в качестве упражнения получить по¬ добные оценки для случаев, изображенных на рис. 23.7, а (с не¬ достатком) и 23.7, б (с избытком). Ответ, который при этом дол-
222 Глава 6 жен быть получен, имеет вид 7,4 504 206 < площади области 8,2 417 084. Но и это еще не предел возможных оценок; они могут уточняться по мере увеличения количества используе¬ мых прямоугольников. Естественно, с увеличением количества прямоугольников возрастает объем вычислений. В такой утоми¬ тельной работе может помочь ЭВМ. Необходимо лишь написать
Силы гравитации и космическое пространство 223 программу, выполняющую ввод значения переменной # и вы¬ числение значений двух рассмотренных выше оценок с недостат¬ ком (рис. 23.8, а) ис избытком (рис. 23.8, б). При этом для полу¬ чения каждой пары подобных оценок необходимо задание нового значения N — количества используемых прямоугольников. От¬ метим, что поскольку ширина основания области равна 2, а об¬ ласть подлежит разбиению на N равных полос, то ширина каж¬ дой полосы определяется по формуле W=2/N. Для каждой из N полос необходимо вычислить координаты х, а также высоту ле¬ вого и правого края. В качестве примера рассмотрим заштрихо¬ ванную третью полосу на рис. 23.9. Ширина каждой полосы рав¬ на W. Координата х левого края первой полосы равна 1. Поэтому координата х левого края третьей полосы определяется выраже¬ нием 1+2*W, а ее правого края — выражением 1+3*IF, а имен¬ но: LE = 1 + 2*-IF, 7?£=1+3*IF. Поскольку координата у определяется выражением К 10х—х2, то высота левого края третьей полосы может быть вычислена в программе с помощью оператора LH=SQR (10*L£—LE*LE\ или ££=FN F(LE). Аналогично вычисляется значение высоты правого края данной полосы: RH = FN F (RE), Теперь можно определить значения площадей заштрихованных прямоугольников на рис. 23.10. Значение координаты х левого Рис. 23.10. а-площадь = FNE(LE)*W; 6-ruiomaAb=FNE(REj*W.
224 Глава 6 края 1-й полосы вычисляется посредством оператора LE=l + (/-l)< так как этой полосе предшествует (/—1)-я полоса. Значение коор¬ динаты х правого края I-й полосы определяется с помощью опера¬ тора RE=\+I*W. Значения высот левого и правого краев этой полосы можно вы¬ числить, используя следующие операторы: ZJ7 = FH F(LE), RH = FH F (RE). Площади заштрихованных прямоугольников определяются вы¬ ражениями FN F(LE)*W (рис. 23.10, а) и FN F(RE)*W (рис. 23.10,6). Читателю предлагается составить программу определения указанных выше оценок, основанного на использовании N пря¬ моугольников. При необходимости можно познакомиться с по¬ добными решениями, содержащимися в программе 23.1 приложе¬ ния. Проверку работоспособности программы целесообразно вы¬ полнять при N=1, 2 и 4. Используя разработанную программу, можно получить вполне удовлетворительные оценки площади той или иной области. Например, при N=100 в результате пуска программы ]RUN ВВЕДИТЕ N: 100 получаем ОЦЕНКА, ОСНОВАННАЯ НА 100 ЛЕВЫХ ПРЯМОУГОЛЬНИКАХ, РАВНА 7.8 487 983 ОЦЕНКА, ОСНОВАННАЯ НА 100 ПРАВЫХ ПРЯМОУГОЛЬНИКАХ, РАВНА 7.88 044 982 т. е. 7.8 487 983<ПЛОЩАДИ ОБЛАСТИ<7.88 044 982. Рис. 23.11»
Силы гравитации и космическое пространство 225 Чтобы вычислить площадь области по форме, отличной от рассмотренной выше, достаточно внести в программу лишь незна¬ чительные изменения. Например, требуется определить площадь круга, радиус которого равен 2 (рис. 23.11). Верхняя половина окружности представляет собой график функции у=У4—х2, а нижняя — график функции у=— V 4—х2. 2 — 2 1 i] 1 2 3 / 2 3 Рис. 23.12. Рис. 23.13. Для нахождения площади круга описанным выше способом удоб¬ нее сначала вычислить площадь 1/4 этого круга (рис. 23.12) и ре¬ зультат умножить на 4. Ширина каждой полосы, на которые раз¬ бивается площадь этой области, равна 2/W (рис. 23.13). Коорди¬ ната х левого края 7-й полосы определяется в программе с по¬ мощью оператора LE = (I—l)*W, так как значение координаты начальной точки отсчета равно О и данной полосе предшествует (/—1)-я полоса. Аналогично оп¬ ределяется координата х правого края 1-й полосы, а именно: RE = I*W. Соответствующие значения координаты у можно вычислить, если воспользоваться следующим оператором: 100 DEF FN F(X) = SQR(4 — X * X) Значения высоты (координаты у) для левого и правого краев по¬ лосы определяются операторами LH = FNF(LE) и RH = FN F (RE). Используя эти значения и значение ширины полосы, можно оп¬ ределить площади ’’левого” и ’’правого” прямоугольников. Соот¬ ветствующие выражения имеют вид FNF(LE)*W и FNF(RE)*W. 8 К2 989
226 Глава 6 Теперь можно внести требуемые изменения в ранее разрабо¬ танную программу. (При возникновении затруднений можно об¬ ратиться к программе 23.2 приложения.) Ниже приведены резуль¬ таты двух выполнений подобной программы в виде оценок сверху и снизу площади 1/4 круга. ]RUN ВВЕДИТЕ N:2 ОЦЕНКА, ОСНОВАННАЯ НА 2 ЛЕВЫХ . ПРЯМОУГОЛЬНИКАХ, РАВНА 3.73 205 081 ОЦЕНКА, ОСНОВАННАЯ НА 2 ПРАВЫХ ПРЯМОУГОЛЬНИКАХ, РАВНА 1.73 205 081 ]RUN ВВЕДИТЕ N: 100 ОЦЕНКА, ОСНОВАННАЯ НА 100 ЛЕВЫХ ПРЯМОУГОЛЬНИКАХ, РАВНА 3.16041 703 ОЦЕНКА, ОСНОВАННАЯ НА 100 ПРАВЫХ ПРЯМОУГОЛЬНИКАХ, РАВНА 3.12041 789 Соответствующие оценки ’’сверху” и ’’снизу” площади круга лег¬ ко вычислить, умножая полученные оценки на 4. Площадь круга определяется по формуле Л=л>7?2. В рас¬ сматриваемом случае она равна л - (22)=4-л, а площадь четверти круга равна л. Следовательно, разработанная программа позво-’ ляет оценить значение л ’’сверху” и ’’снизу”. При N= 100 получа¬ ем 3.120 441 789^ л ^3.16 041 703. Увеличивая значение А/, можно точнее оценить значение л. Имеется определенное различие в результатах, полученных при выполнении предыдущей программы и данной. Сравним эти результаты при А7=10. ПЕРВАЯ ЗАДАЧА ОПРЕДЕЛЕНИЯ ПЛОЩАДИ JRUN ВВЕДЕНИЕ N: 10 ОЦЕНКА, ОСНОВАННАЯ НА 10 ЛЕВЫХ ПРЯМОУГОЛЬНИКАХ, РАВНА 7.70 340 929 ОЦЕНКА, ОСНОВАННАЯ НА 10 ПРАВЫХ ПРЯМОУГОЛЬНИКАХ, РАВНА 8.01 992 443 ВТОРАЯ ЗАДАЧА ОПРЕДЕЛЕНИЯ ПЛОЩАДИ ]RUN ВВЕДЕНИЕ N:10 ОЦЕНКА, ОСНОВАННАЯ НА 10 ЛЕВЫХ ПРЯМОУГОЛЬНИКАХ, РАВНА 3.30 451 833 ОЦЕНКА, ОСНОВАННАЯ НА 10 ПРАВЫХ ПРЯМОУГОЛЬНИКАХ, РАВНА 2:90 451 833
Силы гравитации и космическое пространство 227 В первой задаче использование ’’левых” прямоугольников дает оценку ’’снизу” (с недостатком), а во второй — ’’сверху” (с из¬ бытком). Причины этого очевидны из рис. 23.14. Форма области, площадь которой подлежит оценке, может быть такой, когда ни одна из рассмотренных ’’закономерностей” не сохраняется на всем интервале значений координаты х. На¬ пример, согласно рис. 23.15, все прямоугольники являются ’’ле¬ выми”, причем первые два дают площади каждой полосы области завышенную оценку, а вторые два — заниженную. ,, Левые1 прямоугольники „ Правые* прямоугольники 3 (первая зада ча) (первая зада ча) Рис. 23.14. Предпримем попытку усовершенствовать рассмотренный ме¬ тод оценок площади заданной области. Для этого обратимся к средней полосе рис. 23.16. При оценке площади средней полосы замечаем, что использование ’’левого” прямоугольника значитель¬ но ’’переоценивает” ее площадь (рис. 23.16, а), а использование ’’правого” прямоугольника столь же значительно ее ’’недооцени- 8*
228 Глава 6 вает” (рис. 23.16, б). Возможны два компромиссных решения этой проблемы: представление полосы эквивалентной трапецией (рис. 23.17) или использование прямоугольника, высота которого соответствует координате середины основания полосы (рис. 23.18J. Оба решения находят применение, причем дают значительно луч¬ шие результаты, чем рассмотренный выше метод. Читателю реко- Рис. 23,17. Рис, 23,18. W » Рис. 23.19.
Силы гравитации и космическое пространство 229 мендуется написать программы, реализующие как тот, так и дру¬ гой метод, используя в качестве заданной области 1/4 круга. Ниже следуют два замечания, облегчающие разработку программ. Рис. 23.20. 1. Согласно рис. 23.19, площадь трапеции определяется вы¬ ражением 2. Согласно рис. 23.20, значение координаты х середины осно¬ вания 1-й полосы 1/4 круга можно определить по формуле MID — (I — 1) * W + W/2 == (/ — 1/2) * w', так как указанную точку на оси абсцисс от начала координат отделяет ’’расстояние”, равное сумме (/—1) полос шириной IF и полуширине (IF/2) I-й полосы. Значение соответствующей коор¬ динаты у, т. е. высоты середины этой полосы (рис. 23.21), можно определить с помощью выражения FN F(MID), а площадь пря¬ моугольника ’’средней” высоты — с помощью выражения FN F (MID)*W. В приложении приведены программа 23.3, использующая ме¬ тод трапеций, и программа 23.4, базирующаяся на построении прямоугольников ’’средней” высоты (высоту каждого прямоуголь¬ ника определяет координата средней точки его основания). Вслед за текстом каждой программы приведены результаты выполне¬ ния примеров-тестов. Дополнительное задание Оцените величину площади области, представленной на рис. 23.22.
230 Глава 6 Проблема 2 Маленькие корабли инопланетян впервые появились 30 дней назад. За это время они уничтожили 40% флота землян. Подобно москитам, роями носились они между полем битвы и своим ко¬ раблем-базой. Еще таких 30 дней — и Земля станет абсолютно беззащитной. Оставался только один шанс спасения: нанести стремительный удар по базе инопланетян. ’’Москиты” были слиш¬ ком малы, чтобы самостоятельно (без поддержки с базы) сражать¬ ся более 1—2 дней. Военачальники землян решились на этот пос¬ ледний отчаянный маневр. На поле боя останется минимальное число кораблей, чтобы лишь создавать видимость продолжения боевых действий. Большая часть флота молниеносным броском будет переброшена в район базы неприятеля со стороны гипер¬ пространства и нанесет ему сокрушительный удар прежде, чем он успеет осознать случившееся. Сара Ньютон, пра-пра-пра-...-внучка знаменитого сэра Исаа¬ ка Ньютона, бормотала проклятия. Ее Вектор IV удалился. От¬ деляемый отсек корабля теперь был надежно прикреплен к ’’мо¬ скиту”, который быстро набирал скорость в направлении звезды Регулус. Через несколько часов она увидит базу инопланетян и сможет передать на Землю ее координаты. Это будет последняя жизненно важная информация перед началом атаки с Земли. Без этого наступление невозможно. Расстояние между Землей и ба¬ зой до сих пор оставалось неизвестным. Вектор IV был чудом современной науки. Он непрерывно вы¬ давал информацию о скорости и местоположении. Но теперь это чудо превратилось в технического калеку с бездействующими ин¬ дикаторами своего местоположения. Только указатель скорости все еще продолжал работать. Используя эту информацию, Сара должна каким-то образом рассчитать координаты местоположе¬
Силы гравитации и космическое пространство 231 ния базы противника. Существование Земли зависело теперь от Сары Ньютон и ее персональной ЭВМ. Оставляя в стороне драматизм описанной ситуации, попытаем¬ ся сформулировать проблему. Известна скорость объекта в любой заданный момент времени, требуется определить пройденное им расстояние. Остановимся на конкретном примере. Пусть верти¬ кально вверх брошен мяч с начальной скоростью 100 фут/с (рис. 23.23). Скорость этого мяча по истечении t с определяется формулой V= 100—32*/. Положим, что необходимо узнать, на какой высоте будет находиться мяч спустя 3 с после момента бро¬ сания. Ответ может быть получен посредствохм следующих рассуж¬ дений. В первую секунду полета мяч начинает.двигаться со ско¬ ростью 100 фут/с, а заканчивает этот интервал времени со ско¬ ростью 68 фут/с. Следовательно, максимальная и минимальная ско¬ рости мяча в течение первой секунды составляют 100 и 68 фут/с соответственно. Аналогичные вычисления можно выполнить для второй и третьей секунд движения мяча (табл. 23.1). После трех секунд полета высота мяча будет по крайней мере не менее 108, но не более 204 фут. Лучшие оценки значения высоты мяча можно получить, если промежуток времени, равный 3 с, разбить на 6 ин¬ тервалов продолжительностью 1/2 с каждый (табл. 23.2). В самом деле, благодаря такому решению устанавливаем, что по истече¬ нии 3 с полета высота мяча составляет не менее 132, но не более 180 фут. Таблица 23.1. Параметры движения брошенного вверх мяча (оценки при использовании интервалов размером 1 с) Порядковый номер интервала разме¬ ром 1 с Скорость на интервале, фут/с Пройденное расстояние, фут Начальная Конечная Максимальное Минимальное 1 100 68 100 68 2 68 36 68 36 3 36 4 36 4 Всего: 204 108 Разбивая тот же самый трехсекундный промежуток времени на все большее число равных интервалов, можно получать все более точные оценки значения высоты мяча. Читателю рекомен¬ дуется написать программу, требующую ввод числа интервалов N и вычисляющую значения указанных оценок. Отметим, что з продолжительность каждого интервала W7 равна -у с. Аналогии-
232 Глава 6 Таблица 23.2. Параметры движения брошенного вверх мяча (оценки при использовании интервалов размером 0,5 с) Порядковый номер интервала разме¬ ром 0,5 с Скорость на интервале, фут/с Пройденное расстояние, фут Начальная Конечная Максимальное Минимальное 1 100 84 50 42 2 84 68 42 34 3 68 52 34 26 4 52 36 26 18 5 36 20 18 10 6 20 4 10 2 Всего: 180 132 ная программа приведена на приложении (программа 23,5). Ниже даны примеры возможных результатов ее работы, СКОЛЬКО ИНТЕРВАЛОВ? 6 ПРОЙДЕНО РАССТОЯНИЕ НЕ МЕНЕЕ 132 И НЕ БОЛЕЕ 180 ФУТ СКОЛЬКО ИНТЕРВАЛОВ? 10 ПРОЙДЕНО РАССТОЯНИЕ НЕ МЕНЕЕ 141.6 И НЕ БОЛЕЕ 170.4 ФУТ СКОЛЬКО ИНТЕРВАЛОВ? 100 ПРОЙДЕНО РАССТОЯНИЕ НЕ МЕНЕЕ 154.56 И НЕ БОЛЕЕ 157.44 ФУТ Для оценки расстояния, проходимого за каждый интервал, выполняется умножение длины интервала W на скорость в на¬ чале или конце интервала. Такие же вычисления пришлось бы выполнить при определении площадей прямоугольников, пока¬ занных на рис. 23.24. Следовательно, расстояние, которое про- 100 50- I 100 ■п - ЛЯ il ^// 'Д'Ь t ‘ • 0 12 3 0 1 2 3 Рис. 23.24. ходит мяч, равно площади заштрихованной области, представлен¬ ной на рис. 23.25. Используя эту информацию и учитывая, что указанная на рис. 23.25 область является трапецией, можно опре¬ делить точное значение расстояния с помощью выражения
Силы гравитации и космическое пространство 233 3 • (100+4)/2 = 156, Итак, через 3 о мяч оказывается на высоте 156 фут. При выполнении приводимых ниже упражнений реко¬ мендуется использовать подобный ход рассуждений. Упражнения 1. Согласно показаниям отделяемого отсека Вектора IV, ’’мо¬ скит” находится в пути 10 ч. В течение первого часа он постоян¬ но ускорялся, изменив свою скорость с нулевого значения до 108 миль/час, Затем на протяжении последующих 8 ч движение проходило g постоянной скоростью, В последний час скорость постоянно падала и наконец достигла нуля. График изменения скорости ’’москита” представлен на рис. 23.26, Определите прей¬ денный путь, (Для этой цели нет необходимости пользоваться ЭВМ.) 2. Скорость автомобиля по истечении / определяется по форму* ле V = 100—фут/с.
234 Главе 6 Пользуясь графиком изменения скорости V (рис. 23.27), оцените путь, пройденный автомобилем за 25 с. Дайте наилучшую воз¬ можную оценку этой величине. Рис. 23.27. Решение, предлагаемое автором, реализует программа 23.6 приложения. Однако, если читатель выполнит оба упражнения самостоятельно, это будет хорошим подтверждением усвоения изложенного материала. Задача 24. Моделирование орбитального движения Луны и планет Назначение разрабатываемой программы: изучение законов движения космических тел. Специфические предпосылки успешной разработки: знаком¬ ство с решениями задач 20 и 23. Пояснения программисту: подлежат разработке три сложные программы; первая программа описывает весьма грубую модель движения Луны вокруг Земли; вторая, более сложная, програм¬ ма обеспечивает более точное решение той же задачи; третья про¬ грамма моделирует движение четырех планет вокруг Солнца. Приводимые ниже программы демонстрируют возможность использования ЭВМ для изучения орбитального движения искус¬ ственных спутников, естественных спутников планет, самих пла¬ нет, комет и других небесных тел. Прежде всего рассматривает¬ ся моделирование движения Луны вокруг Земли. Затем на базе более точных решений моделируется движение по орбите четырех планет Солнечной системы (Меркурия, Венеры, Земли и Марса).
Силы гравитации и космическое пространство 235 Когда американцы выезжают за границу, они обнаруживают, что привычные для них футы, мили, фунты и тонны в большинст¬ ве стран не используются. За исключением США и небольшого числа других стран, во всем мире используют метрическую си¬ стему. Все ученые, в том числе ученые США и других стран, поль¬ зуются метрической системой. Последующее изложение также базируется на этой системе. Определим метрические единицы, необходимые для выполнения поставленных задач. Единицы массы Масса тела измеряется в граммах или килограммах, 1 кг — = 1000 г. Английская мера массы выражается фунтами и унциями: 1 кг=2,2 046 226 фунтов=35,273 962 унции. Отметим, что очень важно не смешивать понятия ’’масса” и ’’вес”. Тело массой 1 кг имеет вес 1 кг на поверхности Земли, То же тело на поверхности Луны имеет массу, по-прежнему равную 1 кг, однако вес тела на Луне составляет только одну шестую (1/6) веса на Земле. Масса —• это свойство, присущее самому телу, однако его вес зависит от массы, а также сил гравитации (притяжения), под влиянием ко¬ торых оказывается это тело. Масса Земли составляет приблизи¬ тельно 5,983*1024 кг, а масса Луны — приблизительно 7,36*1022 кг. Метрическая тонна —это 1000 кг, или 2202,6226 фунтов. Сле¬ довательно, масса Земли составляет 5,983*1021 метрических тонн, а масса Луны — 7,36* 1019 метрических тонн. Единицы длины В метрической системе расстояние измеряется в метрах и ки¬ лометрах. 1 км = 1000 м. Пересчет метров и километров в футы и мили можно выполнить с помощью следующих соотношений: 1 м=3,28 084 фут, 1 км=3280,84 фут=0,62 137 миль. Диаметр Земли (на экваторе) составляет около 12 757 км, диаметр Луны (на экваторе) —около 3476 км, а среднее расстоя¬ ние между центрами Земли и Луны — около 384 470 км. Действие силы на тело Для измерения силы, действующей на некоторое тело, исполь¬ зуют различные единицы, в том числе дины. 1 дин = 1 г*см/с2. Известно, что одни тела труднее сдвинуть с места, чем дру¬ гие. Причиной этому является различие в массе тел, которую бу¬ дем измерять в граммах. При воздействии на тело массой т р силы, равной F дин, оно приобретает ускорение F/m, см/с2.
236 Глава 6 Сила притяжения Закон всемирного тяготения впервые был сформулирован Исааком Ньютоном и использован для расчета параметров движе¬ ния планет и тел, падающих на Землю. Основополагающая фор¬ мула имеет следующий вид: г G«mpm2 где G — константа, именуемая гравитационной постоянной; т1 и т2 — массы двух тел; d — расстояние между центрами тя¬ жести двух тел; F — сила притяжения (именуемая иногда силой гравитации). Эта сила воздействует на оба тела, вызывая взаим¬ ное притяжение (рис. 24.1). Используя эту силу, можно опреде¬ лить ускорение каждого тела, а именно: Ускорение первого тела Al=Flml—G^m1^m2ld2lml=G^m2/d2, Ускорение второго тела A 2=F/m2=G*m1*m2/d2/m2=G*m1/d2. Отметим, что масса тела не влияет на его ускорение. Следствием этого удивительного факта является то, что огромная каменная глыба и маленький цветочный лепесток, одновременно брошен¬ ные вниз с крутого обрыва, достигнут земли одновременно (если не учитывать воздействия сопротивления воздуха). В дальнейших рассуждениях будем измерять расстояние в километрах, массу — в метрических тоннах (м. т.). Тогда грави¬ тационная постоянная G=6,67*10"17, сила F=G^m^m2!d2 будет измеряться в км-с2/м. т., а ускорения A^G^mJd2 и Л2 = =G*mJd2 — в км/с2. В качестве примера используем эти формулы для расчета ускорения, испытываемого объектом на поверхности Земли под действием силы ее притяжения (рис. 24.2): z4 = G*m1/d2 = (6,67* 10)-17* (5,983* 1021)/(6,38 * 103)2^ ^=9,8*10“- км/с2?=980 см/с2.
Силы гравитации и космическое пространство 237 В качестве еще одного подобного примера читателю предлагается вычислить ускорение, испытываемое объектом под действием си¬ лы притяжения Луны. (Ответ: ускорение у поверхности Луны со¬ ставляет приблизительно 1/6 уско¬ рения у поверхности Земли.) При описании орбитального движения Луны и других планет воспользуемся двумерным про¬ странством (плоскостью). Строго говоря, необходимо представить такое движение в трехмерном пространстве, однако это затруд¬ нительно, поскольку плоскость эк¬ рана дисплея имеет два измерения. Более того, за исключением Плуто¬ на, все планеты Солнечной систе¬ мы имеют плоскую (двумерную) орбиту. Предположим, что тело Р (рис, 24.3) с координатами на плос¬ кости Р (1) вдоль оси х и Р (2) вдоль оси у движется со скоростью, составляющие которой вдоль этих осей равны 7(1) и 7(2) соот¬ ветственно. Например, если ракета находится в точке с коорди¬ натами (1000, 2000) х) и имеет скорость (10, —20), т. е. 10 км/а вдоль положительного направления оси х и 20 км/с вдоль отри¬ цательного направления оси у, то через 10 с ракета будет нахо¬ диться в точке g координатами 1100, 1800, поскольку 10004* 4-10*10 = 1100, а 2000 +(—20)* 10 = 1800. Ускорение тела, совершающего подобное движение, также имеет две координаты, Рассмотрим взаимодействие двух тел В данном примере координаты положения будут измеряться в кило метрах, а координаты скорости — в километрах в секунду.
238 Глава 6 и 02 массой trii и тг соответственно, расположенных как показано на рис. 24.4. Расстояние между ними определяется формулой L = j/(c—a)2 + (d—&)2. Пусть требуется определить ускорение тела 02, вызываемое гра¬ витационным полем тела Ог. Величина этого ускорения, направ¬ ленного в сторону тела Оь определяется по формуле А = G * m^L2 = G* —а)2 + (d—Ь)2). Разложим это ускорение на составляющие А (1) и А (2) вдоль осей х и у соответственно. Для этого рассмотрим два треуголь¬ ника, показанные на рис. 24.5. следует, что А (1) _с—а А ~~ L * или А (2) _d — b А — L ’ ИЛИ Из подобия этих треугольников А (2) = .
Силы гравитации и космическое пространство 239 Подставляя в эти формулы приводимое ранее выражение для Л, получаем А * (с — а) _ G •!: mi * (с—a) ‘ I — ” IS ’ д (2) = G Теперь все готово для написания первой программы вычисления параметров орбитального движения Луны. Программа 24.1 Для описания траектории движения объектов в данной про¬ грамме удобно воспользоваться двумерными массивами, резерви¬ руемыми операторами 1}. 200 DIM Р(2,10) : REM РЕЗЕРВИРОВАНИЕ ПАМЯТИ ДЛЯ ХРАНЕНИЯ МАССИВА ЗНАЧЕНИЙ КООРДИНАТ X И Y ТЕЛА I 210 DIM V(2,10) : REM РЕЗЕРВИРОВАНИЕ ПАМЯТИ ДЛЯ ХРАНЕНИЯ МАССИВА ГОРИЗОНТАЛЬНОЙ И ВЕРТИКАЛЬНОЙ СОСТАВЛЯЮЩИХ СКОРОСТИ ТЕЛА I 220 DIM А(2,10) : REM РЕЗЕРВИРОВАНИЕ ПАМЯТИ ДЛЯ ХРАНЕНИЯ МАССИВА ГОРИЗОНТАЛЬНОЙ И ВЕРТИКАЛЬНОЙ СОСТАВЛЯЮЩИХ УСКОРЕНИЯ ТЕЛА I 230 DIM М(10) : REM М(1) — МАССА ТЕЛА I Значения составляющих ускорения можно определить посредст¬ вом следующих операторов языка Бейсик: Л (1,2)==G*M (1)*(Р(1,1)—Р(1,2))/(£*Л*Л), А (2,2) = G * М (1) * (Р (2,1)—Р (2,2))/(L * L * L). Для определения координат и скорости объектов можно восполь¬ зоваться решениями, полученными в задачах 20 и 23. Для хране¬ ния значений обеих составляющих (вдоль осей х и у) целесооб¬ разно применение двумерного массива 260 DIM NV(2,10): REM РЕЗЕРВИРОВАНИЕ ПАМЯТИ ДЛЯ ХРАНЕНИЯ МАССИВА ЗНАЧЕНИЙ ГОРИЗОНТАЛЬНОЙ И ВЕРТИКАЛЬНОЙ СОСТАВЛЯЮЩИХ НОВОЙ СКОРОСТИ ТЕЛА I Приводимая ниже подпрограмма предназначена для вычисления ускорения Луны. Х) В действительности можно было бы ограничиться массивами мень¬ ших размеров, используя оператор DIM Р (2,2), V (2,2), поскольку в дан-, ной программе описываются только два объекта. Однако автор предпочел зарезервировать больше памяти, чтобы предоставить читателю большую ’’свободу” действий.
240 • Глава 6 1000 REM ПОДПРОГРАММА ВЫЧИСЛЕНИЯ УСКОРЕНИЯ ТЕЛА 2 1010 REM 1020 S = (Р(1,2) — Р(1,1)) * (Р(1,2) - Р(1,1)) 4- (Р(2,2) - Р(2,1)) * *(Р(2,2) — Р(2,1)) : REM S — КВАДРАТ РАССТОЯНИЯ МЕЖДУ ТЕЛАМИ 1 И 2 1030 DS = S * SQR (S) : REM DS — КУБ РАССТОЯНИЯ МЕЖДУ ТЕЛАМИ 1 И 2 1040 A(1,2)=G ф М(1) * (Р(1,1) - Р(1,2)) / DS: REM ВЫЧИСЛЕНИЕ ГОРИЗОНТАЛЬНОЙ СОСТАВЛЯЮЩЕЙ УСКОРЕНИЯ 1050 A(2,2) = G * М(1) * (Р(2,1) — Р(2,2)) / DS: REM ВЫЧИСЛЕНИЕ ВЕРТИКАЛЬНОЙ СОСТАВЛЯЮЩЕЙ УСКОРЕНИЯ 1060 RETURN Чтобы определить координаты нового положения Луны и ее новой скорости, необходимо использовать аналогичные решения, полученные при рассмотрении задач 20 и 23. 500 GOSUB 1000: REM ВЫЧИСЛЕНИЕ УСКОРЕНИЯ В НАЧАЛЕ ВРЕМЕННОГО ИНТЕРВАЛА 530 NV(1,2) - V(l,2) + DT * А(1,2): REM ВЫЧИСЛЕНИЕ НОВОГО ЗНАЧЕНИЯ СКОРОСТИ 540 NV(2,2) = V(2,2) + DT * А(2,2) 550 Р(1,2) = Р(1,2) + DT •••= (V(1,2) + NV(1,2)) / 2: REM ВЫЧИСЛЕНИЕ КООРДИНАТ НОВОЙ ПОЗИЦИИ 560 Р(2,2) = Р(2,2) + DT * (V(2,2) + NV(2,2)) / 2 570 V(1,2) = NV(1,2) 580 V(2,2) = NV(2,2) Приведенный выше фрагмент является наиболее сложной частью рассматриваемой программы орбитального движения Лу¬ ны, именуемой здесь ’’тело 2”. Дело в том, что Земля тоже движет¬ ся, т. е. Земля и Луна вращаются вокруг своего общего центра тяжести. Но поскольку центр тяжести Земли скрыт от наблюда¬ теля ее поверхностью, собственное вращение Земли не столь ’’за¬ метно”. В последующих рассуждениях такое движение Земли не учитывается. Теперь необходимо рассмотреть проблему отображения реше¬ ния поставленной задачи на экране дисплея Х). Расстояние между Землей и Луной составляет в среднем 3,8447x10? км. Орбита Луны представляет собой ’’слабо выраженный” эллипс. Чтобы можно было экспериментировать с орбитами явно эллиптической формы, поле экрана дисплея используется в соответствии с рис. 24.6. Как и в предыдущих задачах, здесь тоже требуются описание на языке Бейсик и последующее использование в про¬ грамме функций преобразования координат х и у, определяемых условиями задачи, в соответствующие координаты х и у. опреде¬ ляемые числом элементов разложения на экране дисплея (строки 120 и 130 программы 24.1 приложения). п Здесь не рассматриваются вопросы коррекции геометрических ис¬ кажений, вносимых дисплеем, Об этом речь идет в задачах 20 и 21,
Силы гравитации и космическое пространство 241 В заключение необходимо сделать несколько замечаний от¬ носительно пяти небольших фрагментов описываемой программы. 1. В программе должны быть операторы, отмечающие на эк¬ ране дисплея местоположение Луны (строки 400—440 програм¬ мы 24.1). Машинные координаты 50 5*1О4 5 г Километры О -б*/05 I -5*1О5 95 ~I I I I I I I I Земля I I I I I I О 279 — О 95 Машинные координат^ 190 Километры Рис. 24.6. 2. Программа должна содержать операторы ввода значений массы Земли и Луны (в метрических тоннах), координат положе¬ ния Земли, а также начального положения Луны и ее скорости (в километрах и километрах в секунду соответственно). 300 М(1) = 5.983Е21 : REM МАССА ЗЕМЛИ В МЕТРИЧЕСКИХ ТОННАХ 310 М(2) = 7.36Е19 : REM МАССА ЛУНЫ В МЕТРИЧЕСКИХ ТОННАХ 320 Р(1,1) = 0: Р(2,1) = 0 : REM ИСХОДНЫЕ КООРДИНАТЫ ЗЕМЛИ 330 Р(1,2) = 364000 : Р(2,2) = 0 : REM ИСХОДНЫЕ КООРДИНАТЫ ЛУНЫ 340 V(1,2) = 0 : V(2,2) = - 1.075 : REM НАЧАЛЬНАЯ СКОРОСТЬ ЛУНЫ (КМ/С) Исходное положение и скорость Луны выбраны для случая, ког¬ да она максимально приближена к Земле (так называемая точка перигея). 3. Необходимо задать гравитационную константу: 140 G = 6.67Е — 17 : REM ГРАВИТАЦИОННАЯ КОНСТАНТА ПРИ ИСПОЛЬЗОВАНИИ В КАЧЕСТВЕ ЕДИНИЦ ИЗМЕРЕНИЯ КИЛОМЕТРОВ, СЕКУНД И МЕТРИЧЕСКИХ ТОНН 4. Для завершения основного цикла программы используется оператор GO ТО (строка 590 программы 24.1).
242 Глава 6 5. Наконец, необходим выбор продолжительности интервала между соседними отсчетами времени (значение переменной DT). Если интервал слишком большой, то оценки параметров орбиты весьма неточные, однако если он слишком мал, то программа вы¬ полняется очень медленно. На основании изложенного выше читателю предлагается са¬ мостоятельно завершить написание текста программы, обращаясь по мере необходимости к программе 24.1 приложения. Для выпол¬ нения программы рекомендуется использовать следующие значе¬ ния временных интервалов: DT = 2l 600(21 600 с = 6 ч) и 07=10000. При 07=21600 спиралеобразная траектория Луны выходит за пределы экрана дисплея, что вызывает диагностическое сооб¬ щение об ошибке ILLEGAL QUANTITY ERROR (НЕДОПУ¬ СТИМАЯ ВЕЛИЧИНА). При 07—10 000 орбита Луны все еще сохраняет форму спирали. Чтобы достичь приемлемой точности результатов, значение переменной 07 в этой программе должно быть значительно меньше. Но в таком случае программа выпол¬ няется слишком медленно. Следовательно, необходимо попытать¬ ся ее усовершенствовать. Программа 24.2 Основным источником ошибок в программе 24.1 является про¬ цедура вычисления ускорения. Величина ускорения Луны за¬ висит от ее местоположения. Так ускорение в конце временного интервала отличается от ускорения в начале этого интервала. Программа 24.2 похожа на программу 24.1, за исключением не¬ скольких отличий в тексте основного цикла. 500 GOSUB 1000 : REM ВЫЧИСЛЕНИЕ УСКОРЕНИЯ В НАЧАЛЕ ВРЕМЕННОГО ИНТЕРВАЛА 510 Al(1,2) = А(1,2): А1(2,2) = А(2,2) : REM ЗАПИСЬ НА ХРАНЕНИЕ ЗНАЧЕНИЙ СОСТАВЛЯЮЩИХ УСКОРЕНИЯ В НАЧАЛЕ ВРЕМЕННОГО ИНТЕРВАЛА 520 SP(1,2) = Р(1,2) : SP(2,2) = Р(2,2): REM ЗАПИСЬ НА ХРАНЕНИЕ ЗНАЧЕНИЙ КООРДИНАТ СТАРОЙ ПОЗИЦИИ ТЕЛА 530 NV(1,2) = V(1,2) 4- DT * A(l,2) : REM ПЕРВАЯ ОЦЕНКА ЗНАЧЕНИЯ НОВОЙ СКОРОСТИ 540 NV(2,2) = V(2,2) + DT * А(2,2) 550 Р(1,2) = Р(1,2) + DT * (V(l,2) + NV(1,2)) / 2: REM ПЕРВАЯ ОЦЕНКА ЗНАЧЕНИЙ КООРДИНАТ НОВОЙ ПОЗИЦИИ 560 Р(2,2) = Р(2,2) + DT * (V(2,2) -}- NV(2,2)) / 2 570 GOSUB 1000 : REM ПЕРЕХОД К ВЫЧИСЛЕНИЮ УСКОРЕНИЯ В КОНЦЕ ВРЕМЕННОГО ИНТЕРВАЛА 580 NV(1,2) = V(l,2) + DT * (Al( 1,2) + А(1,2)) / 2 : REM ВТОРАЯ ОЦЕНКА ЗНАЧЕНИЯ НОВОЙ СКОРОСТИ 590 NV(2,2) = V(2,2) + DT * (Al(2,2) + A(2,2)) / 2
Силы гравитации и космическое пространство 243 600 Р(1,2) = SP (1,2) + DT + (V(l ,2) + NV(1,2)) / 2: REM ВТОРАЯ ОЦЕНКА ЗНАЧЕНИЙ КООРДИНАТ НОВОЙ ПОЗИЦИИ 610 Р(2,2) = §Р(2,2) -f- DT * (V(2,2) + NV(2,2)) / 2 620 V(1,2) = NV(1,2): V(2,2) = NV(2,2): REM СКОРОСТЬ ДЛЯ СЛЕДУЮЩЕГО ВРЕМЕННОГО ИНТЕРВАЛА — ЙТО НОВАЯ СКОРОСТЬ 630 GOTO 420 Здесь, как и прежде, в строке 500 размещается обращение к под¬ программе вычисления значения ускорения в начале временного интервала. В строке 510 осуществляется запись на хранение по¬ лученных значений ускорения. Строки 530—560 обеих программ (24.1 и 24.2) идентичны и содержат операторы вычисления оцен¬ ки (первой по счету) местоположения Луны в конце временного интервала. В строке 570 содержится обращение к подпрограмме вычисления оценки ускорения Луны в конце временного интерва¬ ла. Строки 580 и 590 —это операторы вычисления второй, луч¬ шей оценки новой скорости Луны, основанной на усреднении ее ускорения в начале и конце временного интервала. Операторы в строках 600 и 610 обеспечивают вычисление второй, лучшей оценки нового местоположения Луны, базирующейся на уже по¬ лученной лучшей оценке новой скорости. Строки 620 и 630 обеих программ идентичны. Такое новое решение требует еще двух мас¬ сивов. 240 DIM SP(2,10) : REM РЕЗЕРВИРОВАНИЕ ПАМЯТИ ДЛЯ ХРАНЕНИЯ МАССИВА ЗНАЧЕНИЙ КООРДИНАТ X И Y СТАРОЙ ПОЗИЦИИ ТЕЛА I 250 DIM Al(2,10) : REM РЕЗЕРВИРОВАНИЕ ПАМЯТИ ДЛЯ ХРАНЕНИЯ МАССИВА ЗНАЧЕНИЙ ГОРИЗОНТАЛЬНОЙ И ВЕРТИКАЛЬНОЙ СОСТАВЛЯЮЩИХ УСКОРЕНИЯ ТЕЛА I В НАЧАЛЕ ВРЕМЕННОГО ИНТЕРВАЛА Программа 24.2, использующая описанное выше модифици¬ рованное решение рассматриваемой задачи, обеспечивает прием¬ лемую точность результатов и скорость выполнения уже при ОТ =21 600. После написания и отладки собственной подобной программы читателю рекомендуется провести следующие эксперименты. 1. Изменять начальную скорость Луны и наблюдать измене¬ ние длины и формы орбиты. Проверить, приводит ли увеличение скорости к сокращению времени периода обращения по орбите. 2. Астрономы определяют массу планеты, наблюдая орбиты ее лун. Следует, изменяя массу Земли до 5х Ю21 м. т., наблюдать изменение орбиты Луны. 3. Используя координаты положения и скорость одного из искусственных спутников Земли, необходимо модифицировать программу так, чтобы она моделировала движение этого спутника по орбите. (Отметим, что значение DT должно быть значительно меньше.)
244 Глава 6 Программа 24.3 Модифицируем программу 25.2 так, чтобы ее можно было ис¬ пользовать для моделирования орбит четырех ближайших к Солн¬ цу планет. Масса Солнца во много раз больше массы этих планет. Поэтому всеми гравитационными силами, кроме силы притяже¬ ния Солнца, можно в первом приближении пренебречь. Первым изменением текста программы 24.2 будет использова¬ ние для обозначения Солнца термина ’’тело 1”. Тогда ускорение, испытываемое некоторым телом I под действием гравитационного поля Солнца, может быть определено следующими формулами: Л (1,/) = G * Л4 (1) * (Р (1,1) — P(1,Z)/(L*L*L), А (2,/) = G * М (1) * (Р (2,1) — Р (2,/)/(L * L * Л). Используя эти формулы, можно изменить программу вычис¬ ления ускорения следующим образом: 1000 REM ПОДПРОГРАММА ВЫЧИСЛЕНИЯ УСКОРЕНИЯ ТЕЛА I 1010 REM 1020 S = (Р(1,1) - Р (1,1)) * (Р(1,1) - Р(1,1)) + (Р(2,1) - Р(2,1)) * ЦР(2,1) - Р(2,1)) 1030 DS = S * SQR(S) : REM DS = L * L * L 1040 A(1,1) = G * M( 1) * (P( 1,1) — P(1,1)) / DS : REM ВЫЧИСЛЕНИЕ ' ГОРИЗОНТАЛЬНОЙ СОСТАВЛЯЮЩЕЙ УСКОРЕНИЯ 1050 A(2,I) = G * M(l) * (Р(2,1) — P(2,I)) / PS : REM ВЫЧИСЛЕНИЕ ВЕРТИКАЛЬНОЙ СОСТАВЛЯЮЩЕЙ УСКОРЕНИЯ 1060 RETURN Создаваемая программа должна ’’следить” за состоянием пяти небесных тел: Солнца (1), Меркурия (2), Венеры (3), Земли (4), и Марса (5). Приводимые ниже фрагменты программы решают эту задачу для любого числа N подобных объектов, вплоть до N = 10. Это дает возможность пользователю легко дополнять такую про¬ грамму новыми объектами моделирования. В предлагаемом ав¬ тором решении N=5 (строка 160 программы 24.3 приложения). Чтобы основной цикл программы 24.2 мог оперировать пара¬ метрами всех четырех планет Солнечной системы, в него необхо¬ димо внести изменения, 500 FOR 1 = 2 ТО N 510 GOSUB 1000: REM ПЕРЕХОД К ВЫЧИСЛЕНИЮ УСКОРЕНИЯ КАЖДОГО ТЕЛА В НАЧАЛЕ ВРЕМЕННОГО ИНТЕРВАЛА 520 Al(1,1) = A(l,I): А1 (2,1) = A(2,I) : REM И ЗАПИСЬ НА ХРАНЕНИЕ 530 NV(1,I) = V(1,I) + DT * A(l,I) : REM ПЕРВАЯ ОЦЕНКА ЗНАЧЕНИЯ НОВОЙ СКОРОСТИ 540 NV(2,I) = V(2,I) + DT * A(2,I) 550 SP(1,I) = P(1,I) + DT * (NV(1, I) + V(l, I)) / 2: REM ПЕРВАЯ ОЦЕНКА ЗНАЧЕНИЙ КООРДИНАТ НОВОЙ ПОЗИЦИИ 560 SP(2,1) = P(2,I) + DT * (NV(2,I) + V (2,1)) / 2 570 NEXT I 580 FOR I = 2 TO N
Силы гравитации и космическое пространство 245 590 W = Р(1,1) : Р(1,1) = SP(I,I) : SP(1,1) = W : REM ЗАПИСЬ ЗНАЧЕНИЯ SP(1,I) В Р(1,1) ДЛЯ НОВОЙ ОЦЕНКИ УСКОРЕНИЯ 600 W = P(2,I) : P(2,I) = SP(2,I) : SP(2,I) = W 610 NEXT I 620 FOR I = 2 TO N 630 GOSUB 1000 : REM ПЕРЕХОД К ВЫЧИСЛЕНИЮ УСКОРЕНИЯ КАЖДОГО ТЕЛА В КОНЦЕ ВРЕМЕННОГО ИНТЕРВАЛА 640 NV(1,1) = V(I,I) + DT* (A(l, I) + А(1,1)) / 2: REM ВТОРАЯ ОЦЕНКА НОВОЙ СКОРОСТИ 650 NV(2,I) = V(2,I) + DT * (A1(2,I) + A(2,I)) / 2 660 NEXT I 670 FOR I = 1 TO N 680 P(1,I) = SP(1,I) + DT * (V(1,I) + NV(1,I)) / 2-. REM ВТОРАЯ ОЦЕНКА ЗНАЧЕНИЙ КООРДИНАТ НОВОЙ ПОЗИЦИИ 690 P(2,I) = SP(2,I) + DT * (V(2,l) + NV(2,I)) / 2 700 V(1,I) = NV(1,I) : V(2,I) = NV(2,I): REM СКОРОСТЬ ДЛЯ СЛЕДУЮЩЕГО ВРЕМЕННОГО ИНТЕРВАЛА 710 NEXT I 720 GOTO 420 Для каждого из пяти небесных тел, с параметрами которых оперирует программа, необходимы сведения о массе, исходном местоположении и начальной скорости. Этому требованию удов¬ летворяют строки 300—400 программы 24.3 в соответствии с дан¬ ными табл. 24.1 и рис. 24.7. Для представления изображаемого на экране дисплея в соот¬ ветствии с размерами его поля необходимо внести коррективы в определение функций масштабирования (строки 120 и 130 прог¬ раммы 24.2), Важным условием является надлежащий выбор значения временного интервала DT достаточно небольшой вели¬ чины для достижения требуемой точности решения, но не настоль¬ ко малой, чтобы продолжительность выполнения программы стала
246 Глава 6 Таблица 24./. Параметры небесных тел Небесное тело Масса, т Координаты положения Координаты скорости, км/с Солнце 1,9827-1О27 0, 0 0, 0 Меркурий 3,24-1020 57,9Ь 10б, 0 0, —47,9 Венера 4,86- Ю2* 108,2.10е, 0 . 0, —35,05 Земля 5,97.1021 149,6-106, 0 0, —29,77 Марс 6,43-1020 227,9.106, 0 0, —24,02 практически неприемлемой. Компромиссным решением (строка 150) можно считать DT= 172 800 с (двое суток). После отладки программы полезно проведение с ее помощью ряда экспериментов, в том числе, например, позволяющих оце¬ нить время, необходимое каждой планете для завершения одного цикла движения по орбите. Для подобного экспериментирования много возможностей предоставляет программа 24.3.
7 РОЖДАЕМОСТЬ И СМЕРТНОСТЬ Вычислительные машины используются для изучения различ¬ ных процессов, протекающих в природе и обществе. В данной главе рассматриваются некоторые задачи применения средств вычислительной техники для изучения экономических и экологи¬ ческих процессов. Программы этой главы невелики по объему, однако область приложения рассматриваемых здесь методов без¬ гранична. Применение математических методов и вычислительных ма¬ шин для изучения социальных процессов во многом противоре¬ чиво по сравнению с их применением в научных исследованиях природных явлений. Это обусловлено по крайней мере тремя при¬ чинами. 1. Решение важнейших социальных и гуманитарных проблем в большей мере связано с основополагающими философскими концепциями, нежели с оперированием простыми фактами пов¬ седневной жизни. Дебаты вокруг ’’левой” (не поддающейся учету и обложению налогом) экономики — не наилучщий способ изуче¬ ния сложного механизма экономики Соединенных Штатов Амери¬ ки. Это скорее дискуссия о моральных ценностях общества, месте каждого индивидуума в его социальной структуре и достоинствах и недостатках социальной системы, в которой приходится жить человеку. 2. В естественных науках, как правило, оперируют коли¬ чественными характеристиками объектов и процессов. Масса или скорость объекта поддается непосредственному измерению. В про¬ тивоположность этому важные факторы социальных процессов зачастую можно оценить лишь качественно. Обычно стараются всему дать количественную оценку; нас преследуют обилие ста¬ тистических данных, даже представителей противоположного пола мы склонны оценивать в долях единицы или в процентах. Но красоту природы нельзя выразить числом. А поскольку вы¬ числительные машины оперируют числами, их использование для решения проблем, определяемых ’’человеческим фактором”, прин¬ ципиально ограничено. Вычислительные машины могут принести большую пользу, но их применение для решения социальных задач требует учета указанных факторов и чувства социальной ответственности.
248 Глава 7 3. То, что мы называем человеческим фактором, представляет собой сочетание сотен и более отдельных факторов. Часто труд¬ но понять, какие из них являются наиболее важными, что неред¬ ко приводит к тому, что именно такие факторы не принимаются во внимание должным образом. Короче говоря, человеческий фактор с трудом поддается учету не только вычислительной машиной, но и человеком. И все же его нужно принимать во внимание. Разумно применяемые маши¬ ны могут помочь в этом. Целью настоящей главы является зна¬ комство с некоторыми возможностями применения вычислитель¬ ных машин для решения задач, связанных с той или иной оцен¬ кой человеческого фактора. Задачи 25, 26 и 27 посвящены вопросам экологии. В задаче 25 изучается изменение численности одного вида в пределах огра¬ ниченного пространства среды обитания. В задаче 26 рассматри¬ вается экологическая игра того же типа, что и игра задачи 3.’ В задаче 27 изучается поведение популяций видов, обитающих на одной территории. Задача 25 является необходимой для решения задач 26 и 27, другие задачи можно решать в любом порядке. Задача 25. Моделирование экологических систем Назначение разрабатываемой программы: моделирование на ЭВМ экологических систем. Специфические предпосылки успешной разработки: отсутст¬ вуют. Пояснения программисту: поставленная задача решается по¬ средством двух довольно простых программ,. Решение данной и двух следующих задач сводится к разра¬ ботке программ несложных математических моделей экологиче¬ ских систем. Однако при работе с подобными моделями необхо¬ димо быть осведомленным о возможных ’’подводных камнях” на пути получения искомого решения. Хотя ниже рассматриваются примеры некоторых конкретных моделей, цель автора — пробу¬ дить у читателя интерес к самостоятельной разработке подобных моделей, Пример 1 Рассмотрим некий тропический ”рай”, населенный особой раз¬ новидностью мух, получивших название ’’образцовых”, Им не приходится добывать себе пищу: она у них всегда в изобилии. Они летают в чистом, ничем не загрязненном воздухе и хорошо
Рождаемость и смертность 249 размножаются. Предположим, что при нашем первом знакомстве с этим ”раем” численность популяции подобных мух равнялась 100 особей. В течение всего года до наступления 1 апреля ком¬ фортабельная жизнь этих насекомых протекает без каких-либо значительных событий. И только этот день вносит существенные изменения в их жизнь: 50 % мух производят на свет новых моло¬ дых особей, а 20 % старых погибает. Подсчитаем число особей популяции следующим образом. Первый год: 100 особей Второй год: 100 старых особей +50 новорожденных особей —20 погибших особей Всего: 130 особей Третий год: 130 старых особей +65 новорожденных особей —26 погибших особей Всего: 169 особей Четвертый год: 169 старых особей +84,5 новорожденной особи —33,8 погибшей особи Всего: 219,7 особи Заметим, что при подсчете численности популяции получи¬ лось дробное число особей. Для удобства вычислений и их гра¬ фической интерпретации будем полагать такое представление ко¬ личества особей допустимым. График зависимости численности популяции от времени пред¬ ставлен на рис» 25.1. Пусть Р(1) —численность популяции в течение /-го года. Тогда изменение численности популяции определяется в соот¬
250 Глава 7 ветствии со следующим уравнением: Р (/ 4-1) = Р (7) + 0,50 * Р (7)—0,20 « Р (7), Показатель Показатель рождаемости смертности или проще Р (/ + 1) = р (7) + 0,30 * Р (7) = 1,30 * Р (7). Значение коэффициента 1,30 зависит от показателей как рож¬ даемости, так и смертности. Модели, описываемые уравнением вида Р(7+1) = Р#Р (7), где R —константа, определяемая показателями рождаемости и смертности, называются экспоненциальными. Составим програм¬ му, позволяющую объяснить изменения численности популяции в соответствии с экспоненциальной моделью. 100 REM ЭКСПОНЕНЦИАЛЬНАЯ МОДЕЛЬ ЭКОЛОГИЧЕСКОЙ СИСТЕМЫ ПО REM 120 НОМЕ 130 DIM Р(100) 140 Р(1) = 100 : REM НАЧАЛЬНАЯ ЧИСЛЕННОСТЬ ПОПУЛЯЦИИ = 100 150 YR = 1 160 PRINT ; REM ПРОПУСК СТРОКИ 170 PRINT “ГОД ЧИСЛЕННОСТЬ» : PRINT : REM ВЫВОД ЗАГОЛОВКА КОЛОНОК ТАБЛИЦЫ 180 PRINT YR ; : НТАВ 6 : PRINT P(YR) 190 P(YR + 1) = 1.30 * P(YR) : REM ВЫЧИСЛЕНИЕ ЧИСЛЕННОСТИ ПОПУЛЯЦИИ В СЛЕДУЮЩЕМ ГОДУ 200 IF YR = 10 * INT (YR / 10) THEN PRINT : GET X$ : REM ОЖИДАНИЕ ВВОДА С КЛАВИАТУРЫ ПОСЛЕ ВЫВОДА ЧИСЛЕННОСТИ ПОПУЛЯЦИИ ЗА ОЧЕРЕДНЫЕ ДЕСЯТЬ ЛЕТ 210 YR = YR + 1 220 GOTO 180 3 RUN ГОД ЧИСЛЕННОСТЬ 1 100 2 130 3 169 4 219.7 5 285.61 6 371.293 7 482.6809 8 627.48 517 9 815.730 721 10 1,060.44 994 11 1378.58 492 12 1792.16 039 13 2329.80 851
Рождаемость и смертность 251 14 3028.75 106 15 3937.37 638 16 5118.58929 17 6654.16 608 18 8650.4159 19 11 245.5407 20 14 619.2029 21 19 004.9637 22 24 706.4528 23 32 118.3887 24 41753.9053 25 54 280.0769 26 70 564.0999 27 91 733.3298 28 119 253.329 29 155 029.327 30 201 538.126 Обратите внимание на скорость возрастания численности по¬ пуляции. Всего за 30 лет численность популяции из 100 особей увеличилась до 201 538 особей. Такой ход событий типичен для процессов, описываемых экспоненциальными моделями, если 7?>1 (т. е. рождаемость превышает смертность). С другой сторо¬ ны, если /?<1 (смертность превышает рождаемость), то популя¬ ция вымирает. Достаточно незначительно изменить программу, чтобы получить количественные оценки и для такого случая. Экспоненциальные модели с коэффициентом /?>1 нельзя признать реалистичными, поскольку в этом случае быстрый рост популяции приводит к перенаселенности, нехватке пищи и появ¬ лению других факторов, существенно влияющих на условия жиз¬ ни популяции, но не учитываемых экспоненциальными моделями. Подобные модели с коэффициентом 7?<1 не представляют осо¬ бого интереса, поскольку предполагают вымирание особей изуча¬ емой популяции. Однако они заслуживают внимания в тех случаях, когда смертность превалирует над рождаемостью, а вос¬ полнение естественных потерь происходит, например, за счет ми¬ грации извне. Пример 2 Теперь рассмотрим экологическую проблему некоего острова в Арктике, населенного животными только одного вида — опре¬ деленной породой свиней. При первом обследовании популяции этого острова на нем оказалось 100 особей. Жизнь этих живот¬ ных на острове настолько трудна, что ежегодно погибает поло¬ вина особей, а рождения новых не происходит вовсе. Однако ежегодно остров пополняется 100 новыми ’’безрассудно храбры¬ ми” особями, мигрирующими извне. Подсчитаем изменение чис¬ ленности популяции данной породы свиней за 4 года.
252 Глава 7 Первый год: 100 особей Второй год: 100 старых особей —50 погибших особей + 100 новых особей (мигрантов) Всего: 150 особей Третий год: 150 старых особей —75 погибших особей + 100 новых особей (мигрантов) Всего: 175 особей Четвертый год: 175 старых особей —87,5 погибшей особи 4-100 новых особей (мигрантов) Всего: 187,5 особи Нетрудно написать программу, моделирующую процесс из¬ менения численности этой популяции и позволяющую предска¬ зать число особей на острове через 20 или 30 лет. Рассмотренное выше позволяет перейти к более сложной за¬ даче, в которой учитываются такие реальные факторы, как огра¬ ниченность пищевых ресурсов и перенаселенность места обита¬ ния популяции. Пример 3 В Тихом океане в нескольких градусах к северу от экватора расположен маленький остров, на котором обитает колония жу¬ ков определенного вида. Из-за ограниченности на острозе пище¬ вых и других ресурсов условия жизни, а следовательно, рождае¬ мость и смертность особей зависят от численности популяции, Это довольно типичный случай. Показатель смертности этих на¬ секомых на острове вычисляется по формуле D (Р) = 0,2 + 0,001 Согласно графику, представленному на рис. 25.2, при малой численности популяции значение показателя смертности близко к 0,2. Но при возрастании численности популяции вида показа¬ тель смертности также растет. Действительно, когда численность популяции достигает 800 особей, показатель смертности становит¬ ся равным 1,0, т. е. все старые особи погибают (хотя перед этим некоторые из них могут произвести на свет новое поколение), Отметим, что функция D (Р) =0,24-0,001 х Р имеет смысл только при0<Р<800, При Р<0 (отрицательная численность по¬ пуляции) все предыдущие рассуждения теряют смысл. С другой стороны, при Р>800 показатель смертности становится больше
Рождаемость и смертность 253 что невозможно, поскольку каждая особь может погибнуть толь¬ ко один раз. Показатель рождаемости насекомых на острове (рис. 25.3) вычисляется по формуле [ 0,5 — 0,002 при Р^250, = { О при Р > 250. Обратим внимание на то, что при малой численности популя¬ ции показатель рождаемости близок к величине 0,5, однако с ро¬ стом численности популяции значение этого показателя падает. Когда число особей достигает 250, показатель рождаемости ста¬ новится равным нулю. Теперь можно составить программу, моделирующую измене¬ ние численности данной популяции. Программе нужно задавать начальное значение количества особей Р(1)» Следует проверить работоспособность программируемой модели при различных на¬ чальных значениях численности популяции. Полученные резуль¬ таты рекомендуется сравнить с приведенными ниже. В случае их
254 Глава 7 несоответствия необходимо обратиться к программе 25.1, приве¬ денной в приложении. □ RUN ЗАДАЙТЕ НАЧАЛЬНУЮ ЧИСЛЕННОСТЬ ПОПУЛЯЦИИ: 10 ГОД ЧИСЛЕННОСТЬ 1 10 2 12.7 3 16.02 613 4 20.0 634 585 5 24.8 748 689 6 30.4 810 523 7 36.8 380 843 8 43.8 183 762 9 51.2 037 388 10 58.6 993 919 11 65.9 723 536 12 72.7 070 053 13 78.6 601811 14 83.6 959 632 15 87.7 897 093 16 91.0 055 229 17 93.4 611 642 18 95.2 945 458 19 96.6 397 582 20 97.613 957 21 98.3 126 903 22 98.8 103 421 23 99.1 629 937 24 99.4 119 939 25 99.5 873 584 26 99.7 106 401 27 99.7 971 969 28 99.8 579 145 29 99.9 004 796 30 99.9 303 059 □ RUN ЗАДАЙТЕ НАЧАЛЬНУЮ ЧИСЛЕННОСТЬ ПОПУЛЯЦИИ: 500 ГОД ЧИСЛЕННОСТЬ 1 500 2 150 3 127.5 4 116.98 125 5 111.021 786 6 107.350 811 7 104.983 465 8 103.41 392 9 102.35 478 10 101.631711 11 101.13421 L12 100.790 088
Рождаемость и смертность 255 13 100.551 189 14 100.384 921 15 100.269 16 100.188 083 17 100.131 552 18 100.092 034 19 100.064 399 20 100.045 067 Рассмотренная модель выглядит вполне правдоподобно. Ин¬ тересно отметить, что численность популяции приближается к 100. При такой численности показатели рождаемости и смертнос¬ ти становятся равными друг другу. Пример 4 В этом примере рассматривается целое семейство так назы¬ ваемых логистических моделей. Модели этого типа во многом по¬ добны модели, описываемой в примере 3. В первой из рассмот¬ ренных выше моделей (экспоненциальной) численность популяции (Р) из года в год изменяется в соответствии с уравнением Р(1 + 1) = (/), где постоянная R определяется соотношением показателей рож¬ даемости и смертности. Однако в более реалистических моделях условия существования, а следовательно, рождаемость и смерт¬ ность зависят от общей численности популяции. Поэтому кон¬ станту R следует заменить функцией R(P), график которой в об¬ щем случае подобен кривой, изображенной на рис. 25.4. При не¬ большой численности популяции значение R(P) относительно велико, что отражает благоприятные условия существования вида, высокую рождаемость и низкую смертность. Однако с уве¬ личением численности популяции условия жизни особей ухуд-
256 Глава 7 шаются из-за недостатка пищи и других ресурсов, снижается рождаемость и растет смертность, что находит отражение в умень¬ шении значения R(P). Конкретный вид функции R(P) зависит от особенностей изу¬ чаемого биологического вида и окружающей его среды. Ниже рассматриваются две простые частные модели, в которых 7?(Р) является линейной функцией. Графики функций R(P) для обеих моделей приведены на рис. 25.5 и 25.6 соответственно. В общем виде линейную функцию R(P) можно задать сле¬ дующей формулой: R = A*(1—B*P). Величина В определяется размером среды обитания биологиче¬ ского вида, количеством имеющейся в распоряжении пищи и т. д. Отметим, что, когда Р=\!В, тогда R=0 и популяция вымирает. Величина В отражает соотношение рождаемости и смертности среди особей, обитающих в благоприятных условиях. Для более
Рождаемость и смертность 257 плодовитых видов (при высокой выживаемости молодых особей) значение А относительно велико, для менее плодовитых видов или видов с низкой выживаемостью в раннем возрасте величина А сравнительно невелика. С учетом формулы для (Р) зависимость численности популя¬ ции от времени принимает следующий вид: Р(/+1) = /?(Р (/))*/>(/) = = Д*(1 — В (/)) */>(/). Модель такого типа называется логистической моделью. Те¬ перь можно написать программу для получения количественных оценок процессов, описываемых рассмотренной моделью, исполь¬ зуя в качестве R(P) следующие функции: R = 2,5 *(1—0,001 т. е. Л = 2,5 и В = 0,001, = 2,0« (1— 0,002*Р), т. е. Д = 2,0 и В —0,002. Программа должна обеспечивать ввод значений параметров Л и В, а также начальной численности популяции. При необхо¬ димости можно обратиться к программе 25.2 приложения. Ниже приведен пример выходной информации, полученной при работе такой программы. □ RUN ЛОГИСТИЧЕСКАЯ МОДЕЛЬ ЭКОЛОГИЧЕСКОЙ СИСТЕМЫ ЧИСЛЕННОСТЬ ПОПУЛЯЦИИ ИЗМЕНЯЕТСЯ В СООТВЕТСТВИИ С УРАВНЕНИЕМ Р (I -f- 1) = А * (1 — В * Р(1)) * Р (I) ЗАДАЙТЕ ЗНАЧЕНИЕ А: 2.5 ЗАДАЙТЕ ЗНАЧЕНИЕ В: .001 ЗАДАЙТЕ НАЧАЛЬНУЮ ЧИСЛЕННОСТЬ ПОПУЛЯЦИИ: 10 год ЧИСЛЕННОСТЬ 1 2 3 4 5 6 7 8 9 10 10 24.75 60.3 435 938 141.755 611 304.152 395 529.109 289 622.881 623 587.250 267 605.968 478 596.926 704 И 12 13 14 15 601.513 035 599.23 776 600.379 668 599.809 806 600.095 007 ₽ № 989
258 Глава 7 16 599.952 474 17 600.023 757 18 599.98 812 19 600.00 594 20 599.99 703 J RUN ЛОГИСТИЧЕСКАЯ МОДЕЛЬ ЭКОЛОГИЧЕСКОЙ СИСТЕМЫ ЧИСЛЕННОСТЬ ПОПУЛЯЦИИ ИЗМЕНЯЕТСЯ В СООТВЕТСТВИИ С УРАВНЕНИЕМ Р (I + 1) = А (1 - В =;= Р (I)) * Р (I) ЗАДАЙТЕ ЗНАЧЕНИЕ А: 2 ЗАДАЙТЕ ЗНАЧЕНИЕ В: .002 ЗАДАЙТЕ НАЧАЛЬНУЮ ЧИСЛЕННОСТЬ ПОПУЛЯЦИИ; 10 ГОД ЧИСЛЕННОСТЬ 1 10 2 19.6 3 37.66 336 4 69.6 526 053 5 119.899 269 6 182.295 199 7 231.66 424 8 248.6552 9 249.992 766 10 250 11 ,250 12 250 13 250 14 250 15 250 16 250 17 250 18 250 19 250 20 250 Проведите ряд экспериментов с различными логистическими моделями. Попытайтесь изменить значение параметра А. Мож- но добавить фрагмент, позволяющий выводить результаты в гра¬ фической форме. Это облегчит процесс их анализа. Стоп! Прове¬ дите эксперименты прежде, чем продолжить чтение. Ниже при¬ ведены результаты подобных экспериментов. JRUN ЛОГИСТИЧЕСКАЯ МОДЕЛЬ ЭКОЛОГИЧЕСКОЙ СИСТЕМЫ ЧИСЛЕННОСТЬ ПОПУЛЯЦИИ ИЗМЕНЯЕТСЯ В СООТВЕТСТВИИ С УРАВНЕНИЕМ Р (I 4- 1) = А Ф (1 — В Р (I)) * Р (I)
Рождаемость и смертность 259 ЗАДАЙТЕ ЗНАЧЕНИЕ А: 2.8 ЗАДАЙТЕ ЗНАЧЕНИЕ В: .001 ЗАДАЙТЕ НАЧАЛЬНУЮ ЧИСЛЕННОСТЬ ПОПУЛЯЦИИ: 10 ГОД ЧИСЛЕННОСТЬ 1 10 2 27.72 3 75.4 644 845 4 195.354 869 5 440.135 763 6 689.965 565 7 598.956 636 8 672.581 236 9 616.604 008 10 661.929 815 11 625.580 458 12 655.136 685 13 632.611 305 14 650.759 877 15 636.360 086 16 647.936 595 17 638*721 339 18 646Л17 892 19 640.218 772 20 644.948 349 21 641.171 933 22 644.197 359 23 641.779 941 24 643.715 655 25 642.168 269 26 643.406 913 27 642.41 648 28 643.209 129 29 642.575 207 30 643.082 469 71 RUN ЛОГИСТИЧЕСКАЯ МОДЕЛЬ ЭКОЛОГИЧЕСКОЙ СИСТЕМЫ ЧИСЛЕННОСТЬ ПОПУЛЯЦИИ ИЗМЕНЯЕТСЯ В СООТВЕТСТВИИ С УРАВНЕНИЕМ Р (I + 1) = А * (1 —В ❖ Р (I)) * Р (I) ЗАДАЙТЕ ЗНАЧЕНИЕ А: 3.2 ЗАДАЙТЕ ЗНАЧЕНИЕ В: .001 ЗАДАЙТЕ НАЧАЛЬНУЮ ЧИСЛЕННОСТЬ ПОПУЛЯЦИИ: 10 ГОД ЧИСЛЕННОСТЬ 1 10 2 31.68 3 98.1 644 084 4 283.290 103 5 649.717 827 9*
Глава 7 6 728.270 632 7 633.25 606 8 743.177 032 9 610.76 778 10 760.737 597 11 582.450 898 12 778.245 918 13 552.253 468 14 791.26 264 15 528.531 438 16 797.395 063 17 516.979 766 18 799.0774 19 513.768 668 20 799.393 356 21 513.163 578 22 799.445 504 23 513.063 647 24 799.453 892 25 513.047 574 26 799.455 234 27 513.045 28 799.455 449 29 513.044 588 30 799.455 484 Необходимо отметить, что во втором примере численность популяции колеблется приблизительно в пределах 513—799. При А > 3,0 подобные явления наблюдаются часто. Такие же ко¬ лебания численности тех или иных популяций наблюдаются и в природе. Численность некоторых видов изменяется циклически, достигая минимума и максимума. Ниже приводятся результаты моделирования при Л =4,5. □ RUN ЛОГИСТИЧЕСКАЯ МОДЕЛЬ ЭКОЛОГИЧЕСКОЙ СИСТЕМЫ ЧИСЛЕННОСТЬ ПОПУЛЯЦИИ ИЗМЕНЯЕТСЯ В СООТВЕТСТВИИ С УРАВНЕНИЕМ Р (I 4- 1) = А ф (1 — В * Р(1)) * Р(1) ЗАДАЙТЕ ЗНАЧЕНИЕ А: 4.5 ЗАДАЙТЕ ЗНАЧЕНИЕ В: .001 ЗАДАЙТЕ НАЧАЛЬНУЮ ЧИСЛЕННОСТЬ ПОПУЛЯЦИИ; 10 ГОД ЧИСЛЕННОСТЬ 1 10 2 44.55 3 191.543 839 4 696.846 585 5 950.631 399 6 211.191 039
Рождаемость и смертность 261 7 749.652 228 8 844.531 945 9 590.839 827 10 1087.86 657 П —430.141 949 12 —2768.23 821 13 —46 941.2 144 14 —10 126 884.7 15 —4.61 537 644Е+ 11 16 —9.58 576 487Е 4-20 POVERFLOW ERROR IN 2901* Такое сообщение обычно появляется на экране, когда в про¬ грамме допущена ошибка. В действительности никакой ошибки нет. Это всего лишь свидетельство несовершенства рассматривае¬ мой модели. Необходимо отметить, что Р( 10) = 1087,86 657. Если 7?=4,5х (1—0,001 х 1087,86 657)=—0,3 953 993, то Р(11) = =—430,141 949. Модель предсказывает отрицательное значе¬ ние численности популяции, что, безусловно, не имеет смысла. Это означает, что численность популяции оказалась настолько большой, а количество пищи на одну особь настолько малым, что вся популяция вымерла. Программу следует дополнить операто¬ ром, осуществляющим проверку знака вычисленного значения функции Р (/+1). При отрицательных значениях функции Р (/+1) ее значение принудительно следует полагать равным нулю. Еще лучше, если полученный результат послужит основани¬ ем для пересмотра модели. В подобных случаях в природе всегда находятся такие особи, которые сумели (или которым посчастли¬ вилось) выжить. Практически невероятно, чтобы целая популя¬ ция могла исчезнуть. Подобные явления можно моделировать раз¬ личными способами. Можно, например, добавить в программу оператор, который проверял бы, приняла ли функция Р(/~Н) значение меньше 5, и, если это так, устанавливал бы значение Р(/+1)=5. Еще лучше для подобных целей воспользоваться элементом удачи. Когда численность популяции становится меньше 5, вы¬ бирается случайное число выживших особей, заключенное в пре¬ делах 1—5. Рассмотрение задачи 25 закончено, однако читателю можно рекомендовать продолжить эксперименты и попытаться построить другие модели экологических систем с привлечением новых идей и собственных методов. Например, значение R может зависеть не только от Р(/), но и от Р(1—1), т. е. от численности предыду¬ щего поколения. Можно также попытаться смоделировать изме¬ нение численности отдельных возрастных групп. Желаем удачи! 1} Сообщение вычислительной системы об ошибке, именуемой ’’ПЕРЕ¬ ПОЛНЕНИЕ”, которая имеет место при выполнении операций, задавае¬ мых оператором Бейсик-программы в строке 290.— Прим, ред.
262 Глава 7 Задачи 26 и 27 также связаны с экологией. В задаче 26 рас¬ сматривается экологическая игра, а задача 27 посвящена моде¬ лированию экосистемы с двумя конкурирующими видами. Задача 26. Создание экологической игры «Фермер-кактусовод» Назначение разрабатываемой программы: моделирование на ЭВМ экологической системы с ограниченными ресурсами. Специфические предпосылки успешной разработки: освоение техники программирования задачи 25. Пояснения программисту: разрабатываемая программа срав¬ нительно длинная, но не очень сложная. Упоминание кактусов в названии данной игры, подлежащей программированию для выполнения на ЭВМ, весьма условно. Эта игра подобна рассматриваемой в задаче 3 и предназначена для развлечения или знакомства с проблемами экологической систе¬ мы с ограниченными ресурсами. Игровое поле покрыто кактуса¬ ми. Выбор именно этих растений объясняется единственной при¬ чиной — простотой их изображения на экране дисплея при ис¬ пользовании его в графическом режиме с низкой разрешающей способностью. Играющий выполняет роль фермера-кактусовода. Перемещаясь по экрану, фермер собирает кактусы и относит их в дом. Цель игры — собрать наибольшее число кактусов за 8 лет. Каждый год на поле созревает новый урожай кактусов. Однако размер урожая зависит от того, сколько кактусов оставлено на поле в предыдущем году. Таким образом, в задаче используется логистическая модель (задача 25) для определения ежегодного изменения числа кактусов. Игра требует навыка в сборе какту¬ сов и выбора некоторой статегии. Если в одном году игрок собрал слишком много кактусов, то в следующем году урожай будет не¬ велик. Ниже приводится детальное описание этой игры, поскольку текст соответствующей программы оказывается достаточно длин¬ ным. Читатель может воспользоваться только основными прин¬ ципами ее построения и разработать свою собственную игру, зна¬ чительно отличающуюся от данной. При составлении программы используется графический ре¬ жим с низкой разрешающей способностью х). Разделим экран на 1} В графическом режиме с низкой разрешающей способностью прост* ранство поля экрана дисплея делится на графическую область, располо* женную в верхней части экрана, и текстовую область, расположенную д нижней его части и позволяющую разместить четыре строки текста. Гра«
Рождаемость и смертность 263 80 прямоугольных областей, в каждой из которых может нахо¬ диться или отсутствовать изображение кактуса. Общий вид экра¬ на представлен на рис. 26.1. Один из адресуемых элементов экра¬ на с координатами (39,39) имеет специальное назначение. В нем находится дом фермера. О 4 8 12 16 20 24 28 32 36 ег тг ЧГ ВТ ВТ В? -У в и п_г -У и чг и ЧГ и чг U у ВТ ВТ и п_г В в ВТ -У ВТ и ЧГ BJ ВТ ВТ -У и чг ВТ в U ЧГ ВТ ВТ и Ч_Г "ОТ л_г -У и ЧГ и чг и чг в в В BJ и "1_Г (39.391 Рис. 26.1. Положение фермера на экране указывается одним элементом разложения. Для перемещения фермера (выбора другого эле¬ мента разложения) используются кнопки пульта управления фическая область экрана содержит 40X40 элементов разложения, адре¬ суемых в пределах 0—39 по каждому направлению. Изображение одного адресуемого элемента представляет собой небольшой квадрат на экране дисплея и используется в настоящей задаче для указания положения фер¬ мера и его дома нц игровом поле,— Прим. ред.
264 Глава 7 игрой, как это делается в игре ’’Гонки по лабиринту” зада¬ чи 31}. Сбор кактусов происходит следующим образом: при движе¬ нии по полю экрана фермер ’’наталкивается” на кактус и относит его домой. У фермера имеется сумка, вмещающая одновременно не более 5 кактусов. Таким образом, фермер может собрать до пяти кактусов за каждый поход на поле. Однако к урожаю при¬ числяются только те кактусы, которые принесены домой. Если фермер пытается положить в уже заполненную сумку еще один кактус, подается звуковой сигнал, а кактус остается на прежнем месте. В каждом году время сбора урожая кактусов ограничено. В программе 26.1, приводимой в приложении и являющейся возможным вариантом решения рассматриваемой задачи, для отображения количества собранных кактусов в текстовой облас¬ ти (нижней части поля экрана) воспроизводится латинская буква ”У” каждый раз, когда в дом фермера попадает очередной как¬ тус. Выбор именно этой буквы объясняется ее отдаленным сход¬ ством с силуэтом кактуса. Для указания числа поколений как¬ тусов (лет), оставшихся для последующих сборов урожая, в пра¬ вом нижнем углу текстовой области воспроизводятся буквы ”0”: одна буква для каждого оставшегося года (поколения). С учетом сделанных замечаний середине игры может соответствовать изоб¬ ражение на экране, подобное воспроизводимому на рис. 26.2. Поскольку дом фермера расположен в правом нижнем углу поля экрана дисплея, работающего в режиме низкой разрешающей спо¬ собности, нет необходимости в использовании специального мар¬ кера для указания его положения. Изменение количества кактусов в очередном году определяется в упомянутой программе следующим соотношением: Р = 4*(1—0,03хР)*Р. t t t Число кактусов Число кактусов в новом году в старом году Для исключения возможности полного исчезновения кактусов при неблагоприятных условиях в текст программы добавлен опе¬ ратор IF Р < 1 THEN Р=1 Значение переменной Р, используемой для указания числа кактусов в старом году, равно количеству кактусов, оставшихся Х) При нажатых кнопках фермер движется вверх, неиажатых — вниз. Если нажата только кнопка 0, фермер перемещается вправо; если нажата только кнопка 1 — влево. Если читатель забыл, как пользоваться этими кнопками, полезно сыграть несколько раз в игру ’’Гонки по лабиринту”. Альтернативным решением является такая модификация текста програм¬ мы, при которой вместо кнопок управления использовалась бы клавиатура ЭВМ.
Рождаемость и смертность 26$ на поле по завершении сбора предыдущего урожая. Игра начи- нается с того, что в первом году имеется 10 кактусов. Можно, конечно, изменить некоторые условия игры, например начальное —[—!—I—I 1—I—I 1 1—I—I—I—I—1—I—Г4—]—I—I 1—I 1 1—I—I—I 1—I—I—I—I—I 1—I 1 1—I 1—I— Фермер L—1 1 1_1 |,1 l.l.LI I I 1_1 11.11 1 1—J __2 i—J 1—1 1—1 L_J—I L_1_J X Y Y Y Y GGGGG Рис. 26.2. число кактусов или формулу, определяющую ежегодное изме¬ нение числа кактусов. Интересно проследить изменение числа кактусов, если их вовсе не собирать. VQI\ ЧИСЛО КАКТУСОВ
266 Глава 7 На самом деле чрезвычайно любопытно провести несколько экспериментов с данной моделью, изменяя стратегию сбора каю тусов и сравнивая между собой полученные результаты. График функции, задающий изменение числа кактусов в каждом году, приведен на рис. 26.3; с его помощью можно предсказывать по- ведейие моделируемой экологической системы. Вернемся теперь к программе. Ее можно разбить на несколь¬ ко частей: 1) процедура формирования изображения кактуса; 2) процедура построения на экране изображения кактусов нового поколения; 3) центральная часть програм¬ мы, которая управляет перемеще¬ нием маркера фермера; 4) процедура подсчета числа собранных кактусов; 5) процедура подсчета числа кактусов нового поколения. Процедура формирования изображения кактуса Разделим экран дисплея на 80 прямоугольных областей, каждая из которых имеет в ширину 4 и в высоту 5 элементов разло¬ жения поля экрана (рис. 26.4, а также рис. 26.1). В рассматри¬ ваемой программе изображение кактуса формируется из элемен¬ тов разложения черного цвета, однако возможны и другие ва¬
Рождаемость и смертность 267 рианты. Если присвоить переменным X, Y значения координат верхнего левого угла какой-либо прямоугольной области, то для формирования (или стирания) изображения кактуса внутри этого прямоугольника можно использовать следующую процедуру (строки 1000—1030 программы 26.1): VLIN У, У + 2 AT X VLIN У + 2, У + 3 AT X + 1 VLIN У, У+2 AT X + 2 RETURN Процедура построения на экране изображения кактусов нового поколения Рис. 26.5, При составлении пакета этой процедуры удобно иметь перед глазами рис. 26.1. Переменная Р будет содержать число какту¬ сов, изображения которых не¬ обходимо построить. Первона¬ чально (для первого года) пере¬ менной Р присваивается значе¬ ние 10 (строка 150 программы 26.1). На рис. 26.5 представлен алгоритм процедуры формирова¬ ния изображения кактуса в про¬ извольном прямоугольнике на экране дисплея. Эта процедура повторяется Р раз. Произволь¬ ная прямоугольная область оп¬ ределяется случайным выбором координат Х=0, 4, 8, . . ., 32 или 36 и координаты Y=0, 5, 10, . . 30 или 35. Для про¬ верки, занята ли выбранная об¬ ласть, можно использовать фун¬ кцию SCRN(X, У); изображе¬ ние кактуса в этой области формируется посредством под¬ программы, рассмотренной вы¬ ше. При необходимости можно обратиться к строкам 190—280 программы 26.1. Процедура перемещения маркера фермера Для этой процедуры в программе используются следующие переменные: CY — число кактусов в сумке фермера; устанавливается рав* ным 0 в начале каждого года (строка 290 программы);
268 Глава 7 FX, FY — координаты текущего положения фермера; уста¬ навливаются равными (39, 39) в начале каждого года (строка 300 программы); NX, NY — координаты нового положения фермера (строка 300 программы). На рис. 26.6 представлена схема алгоритма процедуры пере¬ мещения изображения фермера на один шаг. Выполнение этой процедуры повторяется 500 раз.
Рождаемость и смертность 269 Блокам схемы алгоритма на рис. 26.6 (их номера указаны в кружочках) соответствуют следующие строки программы 26.1 приложения: блок 1 — строки 320—420 (см. также программу ’’Гонки по лабиринту”), блок 2 — строка 430, блок 3 — строка 440, блоки 4 и 5 — строка 830, блок 6 — строки 840—870, блок 7 — строки 450 и 460, блок 8 — строка 470, блок 9 — строки 900—990. Процедура подсчета числа собранных кактусов Эта процедура является составной частью операций, соответ¬ ствующих блоку 9. В ней использованы две переменные SX и SY для установления следующей позиции, где будет изображена буква ”У”. Первоначально SX = 1 и 5У=21 (строка 140 програм¬ мы 27.2). Алгоритм подсчета числа собранных кактусов реализу¬ ется строками 840—970 программы. Процедура подсчета числа кактусов нового поколения Операции, выполняемые этой процедурой, описаны в начале рассмотрения данной задачи (см. также строку 490 программы). В предлагаемой программе (программа 26.1 приложения)’ моделирование процессов экологической системы охватывает период, равный восьми годам (изучается 8 поколений кактусов). Число оставшихся лет отображается в правом нижнем углу эк¬ рана (строки 170, 180 и 500). Предлагая данную задачу читателю, автор преследует три цели: 1) написание программы (или, лучше, составление читателем программы собственной модификации подобной задачи); 2) получение удовольствия от игры; 3) использование игры для исследования поведения реализо¬ ванной модели экологической системы. Автор надеется, что все три цели доступны читателю. Задача 27. Моделирование экологической системы с двумя соперничающими видами особей Назначение разрабатываемой программы: моделирование на ЭВМ экологической системы с двумя видами, разделяющими между собой одно и то же ограниченное жизненное пространство. Специфические предпосылки успешной разработки: освоение техники программирования задачи 26. Пояснения для программиста: разработке подлежат две не¬ большие программы.
270 Глава 7 В задаче 25 рассматриваются модели экологических систем с популяцией одного вида особей. В данной задаче речь идет о реализации на ЭВМ математической модели экологической систе¬ мы с популяциями особей двух видов, разделяющими между со- бой одно и то же жизненное пространство и его ресурсы. Сначала напомним одну из моделей, рассмотренных в задаче 25. Она описывается следующими соотношениями: Р(1)=10, р (М + 1) = р (N) * (2 — 0,01 * Р (М)). Выражение 2—0,01*Р(М) можно считать неким ’’обобщенным показателем рождаемости и смертности”, поскольку его значение отражает оба этих показателя. График функции 2—0,0кР (рис. 27.1) согласуется с нашими интуитивными представлениями о том, что с ростом численности популяции происходит постепенное истощение пищевых и других жизненно важных ресурсов, а это с неизбежностью отрицательно отражается на условиях жизни особей. При этом возрастает по¬ казатель смертности, падает показатель рождаемости, что при¬ водит к уменьшению обобщенного показателя рождаемости и смертности. Математические модели экологических систем, реализован¬ ные в программах данной задачи, по существу очень близки рассмотренной. Медель I. Экологическая система, включающая два вида особей Рассмотрим взаимоотношения двух соперничающих видов особей на примере белок и бурундуков. Бурундуки роют норы в земле и питаются орехами, семенами, ягодами и насекомыми. Белки устраивают себе гнезда на ветках или в дуплах деревьев и питаются плодами, орехами и насекомыми. Очевидно, что бу¬
Рождаемость и смертность 271 рундуки и белки соперничают между собой в борьбе за пищевые ресурсы, но не за места обитания. Пусть в нашей модели в течение /-го года SQ(I) означает численность белок, а СН (/) — численность бурундуков. Если бы белки и бурундуки не конкурировали между собой за источ¬ ники пищи, можно было бы ожидать, что изменение численности описывалось соотношениями СН (/ + 1) = СН (/) * (2 — 0,01 * СН (/)), SQ (/ + 1) = SQ (/) * (2-0,0Ь SQ (/)). Ниже приведены результаты моделирования изменения числен¬ ности обоих видов в соответствии с предложенной моделью в те¬ чение 10 лет при условии, что первоначально насчитывалось 10 бурундуков и 20 белок. Ц RUN ЧИСЛЕННОСТЬ ГОД БЕЛОК ЧИСЛЕННОСТЬ БУРУНДУКОВ 1 20 10 2 36 19 3 59.04 34.39 4 83.222 784 56.953 279 5 97.1 852 503 81А 697 981 6 99.9 207 718 96.5 663 162 7 99.9 999 372 99*8 820 982 8 100 99.999 861 9 100 100 10 100 100 Полученные результаты точно соответствуют тем, которые следовало ожидать при моделировании изменения численности каждого вида в отдельности. В самом деле, формула SQ (/ + 1) = SQ (/) * (2—0,01 * SQ (/)) описывает изменение численности белок независимо от числен¬ ности бурундуков, а формула СН{1 + 1) = СЯ (/) * (2— 0,01 * СЯ (/)) описывает изменение численности бурундуков независимо от численности белок. В более реалистичных моделях значение обобщенного показателя рождаемости и смертности каждого вида испытывает обратное влияние численности другого вида, обусловленное возрастающим соперничеством за пищевые ре¬ сурсы. Модифицированные варианты рассмотренных формул, отражающие это взаимное влияние видов, можно представить
272 Глава 7 следующим образом: SQ(I + 1) = SQ(7)*(2—0,01 *SQ(7) — 0,005* CH (/)), Обобщенный показатель рождаемости и смертности СН(1+\) = СН (7) * (2—0,01 * СН (7)—0,005 * SQ (7)). Обобщенный показатель рождаемости и смертности Чтобы определить, в какой мере приведенные формулы отра¬ жают реальные процессы в подобной экологической системе, вычислим два значения обобщенного показателя рождаемости и смертности для трех примеров численности соперничающих видов (табл. 27.1), Отметим, что увеличение численности белок Таблица 27.1 Численность популяции Обобщенный показатель рождаемости и смертности Белки Бурундуки 10 бурундуков 1 10 белок j 1,85 1,85 10 бурундуков 1 20 белок J 1,75 1,80 20 бурундуков 1 10 белок | 1,80 1,75 на 10 особей приводит к падению значения обобщенного показа¬ теля рождаемости и смертности белок на 0,1, а бурундуков — лишь на 0,05. Формальная причина этого факта заключена в выражении для обобщенного показателя рождаемости и смерт¬ ности, которое для белок имеет вид 2—0,01 *SQ(/)—0,005* *С7/(/), а для бурундуков 2—0,01*СЯ(/)—0,005*SQ(/). В вы¬ ражении обобщенного показателя рождаемости и смертности для белок значение численности этих животных умножается на 0,01, тогда как в выражении обобщенного показателя для бурун¬ дуков значение численности белок умножается на 0,005. Эта математическая модель учитывает тот реальный факт, что отдельные особи популяции белок соперничают между собой за все жизненно важные ресурсы: пищу, места обитания и т. д., тогда как межвидовое соперничество белок и бурундуков проис¬ ходит только из-за пищи. Теперь можно приступить к написанию программы, реали¬ зующей рассмотренную модель, а также провести ряд экспери¬ ментов, задавая различные значения численности популяции
Рождаемость и смертность 273 обоих видов. При необходимости следует обратиться к програм¬ ме 28.1 приложения. Пример результатов работы такой про¬ граммы приведен ниже. 3 RUN ЗАДАЙТЕ НАЧАЛЬНУЮ ЧИСЛЕННОСТЬ БЕЛОК: 10 ЗАДАЙТЕ НАЧАЛЬНУЮ ЧИСЛЕННОСТЬ БУРУНДУКОВ: 25 ГОД ЧИСЛЕННОСТЬ БЕЛОК ЧИСЛЕННОСТЬ БУРУНДУКОВ 1 10 25 2 17.75 42.5 3 28.5 775 63.165 625 4 39.9 626 867 77.4067 099 5 48.4 883 096 79.428 532 6 54.2 086 813 76.5 113 708 7 58.2 936 487 73.7 449 404 8 61.1 114944 71.6 124 102 9 62.9 951 343 70.0 597 404 10 64.2 392 854 68.9 686 948 11 65.0 592 145 68.2 180 826 12 65.6 003 407 67.7 080 229 13 65.9 582 876 67.3 639 353 14 66.1 955 691 67.1 328 237 15 66.3 531 271 66.9 780 099 Можно проделать серию экспериментов, каждый раз модифи¬ цируя математическую модель, например смоделировать эколо¬ гическую систему с тремя видами. Модель II. Экологическая система, включающая два враждующих рода Попытаемся смоделировать ситуацию, когда два враждующих агрессивных рода (семейства) особей занимают одно и то же огра¬ ниченное жизненное пространство. Назовем их условно Монтек¬ ки и Капулетти. Формулы, описывающие изменения численности каждого семейства, на первый взгляд выглядят очень похожими на формулы модели /: I MNT (/ + 1) = MNT (/) * (2 — 0,01 х- MNT (/) — 0,02 * САР (/)), САР (/ + 1) = САР (/) * (2—0,01 * САР (/) —0,02 *MNT (I)). t Единственное различие между приведенными формулами пока¬ зано стрелками. В данном случае численность каждого семейства в большей степени зависит от числа членов другого семейства, чем от своего собственного. Такая зависимость является отраже¬ нием того факта, что Монтекки и Капулетти — смертельные вра¬
274 Глава 7 ги. Математически это представляется как изменения в форму¬ лах, но для семейств Монтекки и Капулетти это очень важное обстоятельство жизни. Теперь можно перейти к составлению программы в соответствии с рассмотренной моделью. (В помощь начинающему программисту: не забудьте, что отрицательные значения числа членов семейства не имеют никакого смысла.} Полезно провести серию экспериментов с разработанной про¬ граммой, например изменить начальные значения численности каждого семейства. Такая программа вместе с полученными g ее помощью результатами приведена в приложении (программа 27.2). При необходимости можно обратиться к тексту, помещен¬ ному в приложении. Рассмотренная выше задача — последняя в этой книге из тех, в которых анализируются проблемы экологии. Если читате¬ лю подобные задачи показались интересными, то можно, напри* мер, составить программу моделирования системы с двумя вида¬ ми особей, один из которых (жертва) служит пищей для другого (хищника).
СРЕДСТВА МАШИННОЙ ГРАФИКИ Одной из наиболее привлекательных возможностей персональ¬ ной ЭВМ Apple II является наличие мощных графических средств с высокой разрешающей способностью. Обычно средства вывода графической информации применяют для представления данных в наиболее доступной и наглядной форме. Данная глава посвящена разработке двух довольно сложных программ, использующих ЭВМ для вывода графической информации: построение графика функции вида y=f(x) (задача 28); построение изображения повер¬ хности, описываемой функцией двух переменных вида z=f (х, у) (задача 29). Приведенный ниже рисунок получен при помощи такой программы. Рассмотрим последовательно эти две программы. Задача 28. Построение графика функции Назначение разрабатываемой программы: построение графика функции одной переменной. Специфические предпосылки успешной разработки: отсутст¬ вуют, однако задача достаточно сложна; для ее решения требует¬ ся определенный опыт программирования, и поэтому рекоменду¬ ется решить не менее десяти предшествующих задач, прежде чем приступить к решению данной задачи.
27Ь Глава 8 Пояснения для программиста: эта очень полезная программа весьма обширна, поэтому ее следует разрабатывать поэтапно: начать с создания относительно простого варианта, а затем посте¬ пенно дополнять его операторами, реализующими более сложные функции. Одним из наиболее примечательных достоинств ЭВМ Apple II является наличие средств вывода графической информации, кото¬ рые уже не раз использовались в предыдущих главах для пред¬ ставления выводимой информации в наглядной графической фор¬ ме. Целью настоящей задачи является разработка программы общего назначения, позволяющей за несколько минут построить график некоторой функции. Предположим, что необходимо построить график функции Зе~х\ Располагая соответствующей программой, достаточно нажать только несколько клавиш, и на экране дисплея можно получить изображение, аналогичное рис. 28.1. ФУНКЦИЯ 130 DEF FN F(X)=X+3*EXP(-X*X) X ПРИНИМАЕТ ЗНАЧЕНИЯ ОТ-5 ДО 5 У ПРИНИМАЕТ ЗНАЧЕНИЯ ОТ-5 ДО 5 Даже беглое знакомство с программой 28.2 приложения пока¬ зывает, что она весьма обширна. Программа создавалась поэтап¬ но. Сначала был написан относительно простой и короткий перво¬ начальный вариант. Затем он подвергся усовершенствованию и принял наконец вид программы, приводимой в приложении. Читатель может поступить таким же образом: написать прос¬ той первоначальный вариант программы, подобный программе 28.1, а затем дополнить его фрагментами, реализующими большие возможности. Особенности исходного и окончательного варианта программы рассматриваются ниже.
Средства машинной графики 277 Первоначальный вариант программы Эта программа позволяет строить график функции, задавае¬ мой пользователем посредством оператора типа 130 DEF FN Р(Х) = ..{ Программа 28.1 составлена так, что если перед ее пуском пользо¬ ватель не задал функцию, график которой требуется построить, Координаты ос А ' В & 278 Машинные координаты х Рис. 28.2. то при выполнении оператора 130, имеющегося в тексте програм¬ мы, подается звуковой сигнал, а на экране дисплея появляется сообщение 1} ЗАДАЙТЕ ФУНКЦИЮ ДЛЯ ПОСТРОЕНИЯ ГРАФИКА В ВИДЕ: 130 DEF FN F(X)=... До тех пор пока пользователь не задал функцию указанным способом, ЭВМ напоминает ему о необходимости сделать это. Удобно снабдить воспроизводимый s Q график функции ее формулой. Это делается при помощи оператора 180 LIST 130 Координаты у Машинные координаты у Границы поля воспроизведения графика функции пользователь указывает вводом значений четы¬ рех переменных Д, В, С и D, Зна¬ чения аргумента х изменяются в интервале А—В (рис. 28.2), значе¬ ния функции у — в интервале С—D (рис. 28.3). Строки 250—270 про¬ граммы 28.1 определяют соответ¬ ствующие функции масштабирования FN X и FN У, а строки 290 и 300 обеспечивают построение изображения координатных осей. Последовательность операторов для построения графика функции может быть следующей: С 1 191 Рис. 28.3. 1} Первая строка сообщения выводится в режиме FLASH, вторая — в режиме NORMAL.— Прим, перев.
278 Глава 8 HPLOT FN X(A), FN Y(FN F(A)) DX = (B — A) / 278 FOR X = A + DX TO В STEP DX HPLOT TO FN X(X), FN Y (FN F(X)) NEXT X Предложенный фрагмент обеспечивает построение точек графика в каждой позиции экрана по горизонтали. В программе 28.1 ис- ФУНКЦИЯ 130 DEF FN F(X)= 5IN(X) X ПРИНИМАЕТ ЗНАЧЕНИЯ 0Т-10 ДО ТО Y ПРИНИМАЕТ ЗНАЧЕНИЯ ОТ-1 ДО 1 ФУНКЦИЯ 130 DEF FN F(X) = X*X X ПРИНИМАЕТ ЗНАЧЕНИЯ ОТ -2 ДО 2 Y ПРИНИМАЕТ ЗНАЧЕНИЯ 0Г-1 ДО4 Рис, 28.5,
Средства машинной графики 279 пользуется иное решение: HPLOT FN Х(А), FN Y(FN F(A)) DX = (В — А) / 139 FOR X = А DX ТО В STEP DX HPLOT ТО FN Х(Х), FN Y(FN F(X)) NEXT X Применение последнего фрагмента приводит к тому, что получа¬ ется более грубый график, но скорость его построения возрастает в два раза. При этом изображения в обоих случаях практически не отличаются друг от друга. Неплохо рассмотренные выше приемы использовать при раз¬ работке первоначального варианта программы, создаваемой поль¬ зователем. Если при этом возникают трудности, следует обра¬ титься к программе 28.1. Попытайтесь, используя написанную программу, построить графики следующих функций: z/ = sinx при у = х2 при у = хэ при у = е~х* при — 10<хС 10, —2 ОС 2, —2 2, —3 3. Полученные графики представлены на рис. 28.4—28.7. ФУНКЦИЯ 130 DEF FN F(X)=X*X X ПРИНИМАЕТ ЗНАЧЕНИЯ ОТ-2 ДО 2 У ПРИНИМАЕТ ЗНАЧЕНИЯ ОТ-8 ДО 8 После нескольких попыток построения графиков весьма веро¬ ятно появление у читателя ряда предложений по усовершенство¬ ванию используемой программы. Подобная программа находит
280 Глава 8 ФУНКЦИЯ 130 DEF FN F(X)= EXP (-X*X) X ПРИНИМАЕТ ЗНАЧЕНИЯ DT~3 ДОЗ Y ПРИНИМАЕТ ЗНАЧЕНИЯ ОТ О ДО 1 столь широкое применение, что целесообразно потратить некото¬ рое время и сделать ее по-настоящему хорошей. Ниже рассматри¬ ваются изменения и дополнения, которые привели к появлению более совершенной программы 28.2. Улучшение первоначального варианта программы Функции масштабирования Функции масштабирования в программах 28.1 и 28.2 выглядят несколько необычно. Рассмотрим их назначение на специальном примере. Пусть необходимо задать подобную функцию для коор- U ТОО I —— , 0 279 Машинные координаты Рис. 28.8. динаты х, приводящую график к масштабу, показанному на рис. 28.8. Очевидным программным решением кажется оператор DEF FN Х(Х) = 279*Х / 100. Однако при использовании этой функции в операторе HPLOT [т. е. HPLOT FN X (A), FN Y (С)] программное обеспечение ЭВМ
Средства машинной графики 281 автоматически обращается к стандартной функции INT для пре¬ образования результата вычисления в целое число. Такое пре¬ образование необходимо потому, что в операторе HPLOT допус¬ тимы лишь операнды целого типа. Поэтому лучше воспользовать¬ ся оператором DEF FN Х(Х) = 279 * X / 100 + 4 5 второе слагаемое правой части которого обеспечивает округление результата вычислений. Благодаря этому график получается более точным. Операторы 260 и 270 программы 28.1 и операторы 240 и 250 программы 28.2 как раз и служат для округления ре¬ зультатов вычислений описанным способом. Нанесение меток на оси координат При построении графиков функций вручную обычно на оси координат наносят метки и проставляют соответствующие им значения переменных (рис. 28.9). Благодаря этому график стано¬ вится более удобным для чтения. 2 Метки на осях координат I 25 — Метки на осях координат / 45 10 1 2 I / 1 / 2 J 1 i 1 L- 5 10 75 20 25 Рис. 28.9. Одним из усовершенствований первого варианта программы является дополнение его фрагментом, реализующим нанесение таких меток на оси координат. Во время выполнения программы ЭВМ требует от пользователя ввести информацию о расстоянии между метками на осях к и у. Пользователь может отказаться от нанесения меток на одну или обе оси, отвечая на запрос ЭВМ вводом нуля. Нанесение меток реализуется операторами строк 220,410,420 и 460—590 программы 28.2. Одной из причин значи¬
282 Глава 8 тельной длины этой части программы является различие способов нанесения меток в зависимости от расположения координатных осей на экране дисплея (рис. 28.10). Рис. 28.10. На рис. 28.11 показан пример изображения, получаемого при работе программы 28.2. Метки на оси у нанесены с шагом 0,ls а на оси х — с шагом 1. ФУНКЦИЯ 130 DEF FN F(X)=EXP(-X*X) X ПРИНИМАЕТ ЗНАЧЕНИЯ ОТ-3 ДОЗ Y ПРИНИМАЕТ ЗНАЧЕНИЯ ОТ 0 ДО 1 Изменение масштаба по оси ординат Не располагая определенной информацией о функции, график которой требуется построить, очень трудно выбрать надлежащий диапазон изменения значений отсчетов на оси у (оси ординат). Программа 28.2 (строки 270—370) вычисляет все значения орди¬ нат точек графика и выводит максимальное и минимальное зна¬
Средства машинной графики 283 чения прежде, чем запросить пользователя ввести значения С и р. Это помогает выбрать нужный интервал значений отсчетов вдоль оси у. В качестве дополнительной особенности программы отметим, что вычисленные значения ординат сохраняются в виде массива (описываемого оператором DIM У(139)). Содержимое этого массива используется при построении графика, что обеспе¬ чивает экономию времени, поскольку повторных вычислений значений ординат не требуется. Отсечение части графика Пусть необходимо построить график функции у=х3—2а:+ I для —4<л:<4. Минимальное значение у в этом интервале состав¬ ляет —55, максимальное 57. Поэтому приемлемым диапазоном изменения значений ординат является —60 <#<60. На рис. 28.12 представлен результирующий график этой функции. «РУНКЦИЯ 130 DEF FN- F(X)=X*X*X-2*Xvl X ПРИНИМАЕТ ЗНАЧЕНИЯ ОТ-4 ДО 4 Y ПРИНИМАЕТ ЗНАЧЕНИЯ ОТ “60 ДО 60 График вполне корректен, но на нем трудно проследить ход кривой в окрестности точки х=1. На рис. 28.13 представлен дру¬ гой график той же функции в диапазоне значений ординат —3< <#<3. В этом случае ход кривой в окрестности точки х=1 виден отчетливо, однако часть кривой в поле представления графика отсутствует. Например, если х=2, то #=23—2x2+1=5, т. е. Сточка находится за пределами поля представления. При попытке построить такой график при помощи программы 28.1 ЭВМ выдает сообщение об ошибке ILLEGAL QUANTITY ERROR (недопусти¬
284 Глава 8 мая величина), вызванной попыткой заставить машину воспроиз¬ вести точку графика за пределами допустимых значений z/. ФУНКЦИЯ 130 DEF FN F(X)= Х*Х»Х-2*Х+1 X ПРИНИМАЕТ ЗНАЧЕНИЯ ОТ-4 ДО 4 Y ПРИНИМАЕТ ЗНАЧЕНИЯ ОТ-3 ДО 3 ФУНКЦИЯ 130 DEF FN F(X) = Х*Х»Х*Х-2*Х*Х+Х+1 X ПРИНИМАЕТ ЗНАЧЕНИЯ ОТ-4 ДО 4 Y ПРИНИМАЕТ ЗНАЧЕНИЯ ОТ-10 ДО 220 Для обеспечения возможности построения графиков, подоб¬ ных рис. 28.13, в программу 28.2 включены средства отсечения части графика, обеспечивающие автоматическое удаление тех частей графика функции, которые выходят за пределы диапазона
Средства машинной графики 285 яопустимых значений без выдачи сообщений ILLEGAL QUANTITY ERROR. На рис. 28.14—28.16 представлено несколь¬ ко примеров графика функции y=xi—2х2+х+1 для —4<х<4, построенного с использованием средств отсечения. ФУНКЦИЯ 130 DEF FN F(X) = X*X*X*X-2«X*X+X+1 /ПРИНИМАЕТ ЗНАМЕНИЯ ОТ-4 ДО4 у ПРИНИМАЕТ ЗНАЧЕНИЯ ОТ-1 ДО 10 ФУНКЦИЯ 130 DEF FM F(X) = X X X X X X X - 2 X X X X + X + 1 X ПРИНИМАЕТ ЗНАЧЕНИЯ ОТ-4 Д04- У ПРИНИМАЕТ ЗНАЧЕНИЯ ОТ-2 ДО 2 Рис. 28.16.
286 Глава 8 Строки 600—750 программы 28.2 обеспечивают построение графиков с отсечением частей, выходящих за диапазон допусти¬ мых значений. Заслуживают внимания программные средства реализации подобной задачи. Напомним, что был выбран следую¬ щий интервал значений у: CcycD. Значение новой переменной SW используется для запомина¬ ния того, появилась ли последняя полученная точка на графике или оказалась за пределами поля его представления. Пусть (х, У) — координаты последней полученной точки. Тогда (+1, если у < С, 0, если С^у — 1, если D < у. Говоря иначе, SW=—1, если последняя точка ниже поля представления графика; SIF= + 1, если точка выше этого поля; 5Ц7=0, если точка находится в пределах поля. 0 1 2 3 4 5 6 7 6 Номер позиции координаты на экране Рис. 28.17. Последняя постро¬ енная точка грасрика В программе 28.2 первой ординатой является y(0)=FN F(A), поэтому первая точка графика имеет координаты (А, У (0)). В программе соответствующий фрагмент имеет сле¬ дующий вид: 630 IF Y(0) > D THEN SW = 1 : GOTO 660 : REM ЕСЛИ ПЕРВОЕ ЗНАЧЕНИЕ СЛИШКОМ ВЕЛИКО, УСТАНАВЛИВАЕТСЯ SW=+1 И ЭТА ТОЧКА НЕ ОТОБРАЖАЕТСЯ НА ГРАФИКЕ 640 IF Y(0) < С THEN SW = — 1 : GOTO 660 : REM ЕСЛИ ПЕРВОЕ ЗНАЧЕНИЕ СЛИШКОМ МАЛО, УСТАНАВЛИВАЕТСЯ SW= — 1 ЭТА ТОЧКА НЕ ОТОБРАЖАЕТСЯ НА ГРАФИКЕ 650 HPLOT FN Х(А), FN Y(Y(0)) : SW = 0
Средства машинной графики 287 Последняя постро¬ енная точка графика Следующая точка (в поле представления графика) Строка 680 программ Ы Следующая точка (высие поля предстаоле-* пая графика) Строка 720 программы Последняя построенная точка графика (ниже поля представ* ления градоика) Строка 710 программы Рис. 28.18. Напомним теперь, что в программе 28.1 для увеличения скорости построения графика использован цикл вида п DX = (В — А) / 139 FOR X = А + DX ТО В STEP DX HPLOT ТО FN Х(Х), FN Y(FN F(X)) NEXT X Чтобы избежать повторного вычисления значения функции FM Р(X) для каждого значения X, можно использовать последовательность операторов FOR 1 = 1 ТО 139 X = X + DX HPLOT ТО FN Х(Х), FN Y(Y(I)) NEXT I
283 Глаза 8 Следующая точка (в поле представления графика) Строка 700программы Последняя построенная точка (выше поля представления графика) Следующая точка (в поле представления графика) Строка 690 программы • -■ Последняя построенная точка ( ниже поля пред* оглавления графика) Рис. 28.19. вместо цикла DX = (В — А) / 278 FOR X = А + DX ТО В STEP DX HPLOT ТО FN Х(Х), FN Y(FN F(X)) NEXT X Такое решение вполне приемлемо для данной части програм¬ мы. При выполнении средней части программы график функции, если его рассматривать через увеличительное стекло, имеет вид, показанный на рис. 28.17. Фрагмент программы, отсекающий выходящую за диапазон допустимых значений часть графика, участвует в построении
Средства машинной графики 289 каждого короткого сегмента графика между предыдущей и теку¬ щей точками. Изображаемое зависит от того, принадлежат ли та и другая точки диапазону допустимых значений функции или нет. Если последняя точка принадлежит этому диапазону и, сле¬ довательно, изображена на графике, как показано на рис. 28.17, то следующая точка будет нарисована, как показано на рис. 28.18, а переменной SU7 будет присвоено адекватное значение. Если последняя точка находится за пределами поля представ¬ ления графика, а следующая ему принадлежит, то переменной SW присваивается значение 0, а график принимает вид, показан¬ ный на рис. 28.19. Наконец, если как предыдущая, так и следующая точки на¬ ходятся за пределами поля представления графика, то он не претерпевает изменений, хотя значение переменной SW обновля¬ ется соответствующим образом (строки 730 и 740 программы). Прочие изменения в программе Программа 28.2 имеет еще несколько особенностей в своей последней части: 1) при нажатии клавиши G график воспроизводится печатаю¬ щим устройством (для реализации этого необходимо печатающее устройство, обеспечивающее вывод графической информации; текст программы будет зависеть от типа используемого печатаю¬ щего устройства и его интерфейса); 2) при нажатии клавиши R график строится повторно для другого диапазона значений у; 3) при нажатии клавиши Q программа завершает работу; 4) при нажатии любой другой клавиши дисплей переходит из режима работы с графической информацией в режим работы с текстом, и наоборот. Задача 29. Построение поверхностей в трехмерном пространстве Назначение разрабатываемой программы: построение графика функции двух переменных z=f(x, у) в виде поверхности в трех¬ мерном пространстве (задача аналогична задаче 28). Специфические предпосылки успешной разработки: задача 28. Пояснения для программиста: хотя график двух переменных имеет очень эффектное изображение и часто представляется весьма сложным для наблюдателя, данная программа удиви¬ тельно проста. 10 № "ед
290 Глава 8 В данном случае ставится задача разработки программы пост¬ роения графика функции z=f(x, у), весьма полезного с практи- а. 5 Рис. 29.1. fl) Z=exp (-10 (х2 + у2)) + 0,5 exp (-10 (х2 + у2-I)2); б) z=siri ( | х | + | у |). ческой точки зрения. Она позволяет формировать на экране до¬ вольно интересные изображения поверхностей наподобие приве¬ денных на рис. 29.1.
Средства машинной графики 291 Для графического представления функции двух переменных Z==/(x, У) необходимо трехмерное пространство (по одному на каждую переменную х, у и г). При построении такого графика используют три координатные оси. Три координаты определяют положение каждой точки на графике (рис. 29.2). Представим ось х проходящей перпендикулярно плоскости изображения. Тогда точка Р на рис. 29.2 имеет координаты (х, у, г). Рис. 29,3. На рис. 29.3 представлен график полусферической поверх¬ ности, задаваемой функциейz=]/r 1—х2—у\ В действительности использована несколько иная функция, имеющая дополнительное условие: __ f — &—У*, если 1~х?— О л если 1—х*— ю*
292 Глава 8 Рис. 29.4 является копией рис. 29.3, дополненной изображе¬ нием трех координатных осей и двух точек с координатами (0,5; 0; 0,866 и 0,5; 0,43; 0,66), которые иллюстрируют способ представ¬ ления произвольной точки поверхности на чертеже. Любой гра- Рис. 29.4. фи к функции двух переменных является совокупностью графиков функций одной переменной. При этом построение изображения поверхности в трехмерном пространстве сводится к построению последовательности сечений воспроизводимой поверхности рядом Уравнение плоскости сечения л=0,2 х=0,8 Формула 2 = V 1—(0,2)2—z/2 = V 0,96 —//2 2 = V 1-(0,8)2 — г/2—т/ о,36-г/2 параллельных плоскостей. Изображения на рис. 29.3 и 29.4 со¬ ставлены из 25 таких сечений. Обе точки, показанные на рис. 29.4, принадлежат сечению поверхности плоскостью х=0,5. На рис. 29.5 выделены два сечения поверхности параллельными плос¬
Средства машинной графики 293 костями л;=0,2 и х=0,8; под рисунком приведены уравнения функций одной переменной, графики которых повторяют форму полученных в сечении кривых. Таким образом, формирование изображений, подобных при¬ веденным на рис. 29.1—29.5, сводится к построению ряда сече¬ ний поверхности параллельными плоскостями и последующему совмещению этих сечений в одном поле представления искомого изображения. Однако имеется ряд трудностей, рассматриваемых подробнее с привлечением в качестве примеров рис. 29.3—29.5. На этих рисунках изображена упомянутая выше полусферичес¬ кая поверхность, описываемая уравнением I j/'l — x2— у2, если 1—х2—у2>®, \ 0 , если 1—х2— у2 Запишем это уравнение в виде одной обобщенной формулы п z 2 или на языке Бейсик z = SQR((1 -X * X - Y * Y + ABS(1 — X * X — Y * Y)) / 2). Использование формулы в таком виде позволяет избежать появления сообщения об ошибках вида ILLEGAL QUANTITY ERROR при работе программы. Поскольку программа предназначена для построения изобра¬ жения поверхности, задаваемой произвольной функцией, жела¬ тельно для ее описания использовать в программе только один оператор DEF FN F подобно тому, как это имеет место в про¬ граммах задачи 28. Например, 150 DEF FN F(X,Y) == SQR((1 — X * X - Y * Y + АВС(1 — X * X — Y * Y) / 2. Однако попытка выполнения этого оператора приводит к по¬ явлению сообщения об ошибке: ] 150 DEF FNE(X,Y) = = SQR( (1 — X * X — Y * Y + ABC(1 — X* X — Y * Y) ) / 2) ] RUN ? SYNTAX ERROR IN 150 Причина возникновения ошибки заключается в том, что про¬ граммное обеспечение Applesoft допускает использование функ- Х) Действительно, например, при х=1 и r/=2, 1—х2—у2=1— 1—4=а = 0, а при х=1/2 и г/=1/2 1— х2—у2=* 1/1/2+11/21 . .
294 Глава 8 ций только одной переменной. Поэтому оператор 150 следует представить в виде 150 DEF FN F(Y) = SQR( (1 — X * X — Y * Y + ABC(1 - X « X - Y * Y)) / 2) При такой записи переменная X программы по-прежнему используется в качестве аргумента х функции /(%, у). Поэтому необходимо присваивать переменной соответствующее значение перед каждым обращением к функции FN F(Y). В противном случае в качестве значения X будет использовано последнее при¬ своенное ей значение. После задания функции описания поверхности можно перейти непосредственно к построению такого графика. Основная идея предлагаемого метода заключается в совмещении ряда сечений поверхности параллельными плоскостями в плоскости изображе¬ ния. При построении каждого сечения используется следующая последовательность операторов: 100 HGR : HCOLOR = 7 : РОКЕ — 16 302,0: REM ПОЛНОФОРМАТНЫЙ ГРАФИЧЕСКИЙ РЕЖИМ С ВЫСОКОЙ РАЗРЕШАЮЩЕЙ СПОСОБНОСТЬЮ ПО DEF FN Z(Z) = 100 — 90 « Z: REM ФУНКЦИЯ МАСШТАБИРОВАНИЯ ПО ОСИ Z 150 DEF FN F(Y) = SQR ((1 — X * X — Y * Y + АВС (1 — X * X — Y ::: Y)) / 2): REM ФУНКЦИЯ ОПИСАНИЯ ПОВЕРХНОСТИ, ПОДЛЕЖАЩЕЙ ПОСТРОЕНИЮ 300 Y = — 1.2: REM НАИМЕНЬШЕЕ ЗНАЧЕНИЕ Y=-1.2 310 DY =2.4 /139: REM ШАГ ПО ОСИ Y = 2.4/139 320 FOR I = 0 ТО 139: REM ЦИКЛ ПОСТРОЕНИЯ ОЧЕРЕДНОГО СЕЧЕНИЯ ПО 140 ТОЧКАМ 330 Z = FN F(Y): REM ВЫЧИСЛЕНИЕ ЗНАЧЕНИЯ Z 340 HPLOT 2 I, FN Z(Z): REM ПОСТРОЕНИЕ ТОЧКИ КРИВОЙ С УЧЕТОМ МАСШТАБА ПО ОСИ Z 350 Y = Y + DY: REM ПРИРАЩЕНИЕ ЗНАЧЕНИЯ Y 360 NEXT I Изображение ряда сечений поверхности при значениях X от —1,2 до +1,2 можно получить, дополнив приведенный фраг¬ мент несколькими операторами: 100 HGR : HCOLOR = 7: РОКЕ — 16 302,0: REM ПОЛНО — ФОРМАТНЫЙ ГРАФИЧЕСКИЙ РЕЖИМ С ВЫСОКОЙ РАЗРЕШАЮЩЕЙ СПОСОБНОСТЬЮ ПО DEF FN Z(Z) = 100 — 90 * Z: REM ФУНКЦИЯ МАСШТАБИРОВАНИЯ ПО ОСИ Z 150 DEF FN F(Y) = SQR ( (1 — X * X — Y * Y + ABS (1 — X * X — Y * Y) ) I 2): REM ФУНКЦИЯ ОПИСАНИЯ ПОВЕРХНОСТИ, подлежащей построению 200 X = — 1.2 300 Y = —1.2: REM НАИМЕНЬШЕЕ ЗНАЧЕНИЕ Y = — 1.2 310 D Y = 2.4 / 139: REM ШАГ ПО ОСИ Y = 2.4 / 139 320 FOR I = 0 ТО 139: REM ЦИКЛ ПОСТРОЕНИЯ ОЧЕРЕДНОГО СЕЧЕНИЯ ПО 140 ТОЧКАМ
Средства машинной графики 295 330 Z = FN F(Y): REM ВЫЧИСЛЕНИЕ ЗНАЧЕНИЯ Z 340 HPLOT 2 * I, FN ,Z(Z): REM ПОСТРОЕНИЕ ТОЧКИ КРИВОЙ С УЧЕТОМ МАСШТАБА ПО ОСИ Z 350 Y = Y + DY: REM ПРИРАЩЕНИЕ ЗНАЧЕНИЯ Y 360 NEXT I 390 X = X + .1 400 IF X < 1.3 THEN 300 Приведенный фрагмент программы несколько отличается от предыдущих использованием операторов HPLOT. Ранее для построения графиков использовались операторы HPLOT ТО, но в данном случае линии на изображении представляются мно¬ жеством точек, а не отрезков прямых, что вызывается необходи¬ мостью удаления на изображении так называемых скрытых ли¬ ний. Рассмотренный фрагмент программы позволяет получить изображение, представленное на рис. 29.6. Отметим, что оно силь¬ но отличается от изображения на рис. 29.3. Причины этого отли¬ чия становятся понятными после внимательного изучения рис. 29.4. Рис. 29.6. Все сечения на рис. 29.6 совмещены так, что начала их коор¬ динат совпадают, а на рис. 29.4 начала координат сечений сме¬ щены друг относительно друга. Сечения, полученные при поло¬ жительных значениях X (т. е. располагающиеся как бы над пло¬ скостью изображения), сдвинуты влево и вниз. Сечения, соот¬ ветствующие отрицательным значениям X, смещены вверх и вправо. Смещение вниз достигается заменой в приведенном выше фраг¬ менте программы строки 330 на оператор 330 Z = FN F(Y) — . 4 * X При положительных значениях X кривая сдвигается вниз, при отрицательных — вверх. Величина смещения пропорциональна значению X. Значение коэффициента 0,4 выбрано в результате нескольких экспериментов с различными числами. Однако в окончательный вариант программы включен оператор Z = FN F(Y) - ZT * X в котором коэффициент ZT может задавать пользователь.
296 Глава 8 Сдвиг кривой влево обеспечивается следующим изменением текста строки 330 программы: 330 Z = FN F(Y + . 5 * X) — . 4 * X При Х^О высота Z некоторой точки поверхности, имеющей ко¬ ординаты (X, У), на экране соответствует значению функции Z, вычисленному в точке с координатами (X, F-|-.5*X). Следова- Рис. 29.7. тельно, сформированное изображение кривой, полученной в се¬ чении, оказывается смещенным влево. Значение коэффициента 0,5, как и в предыдущем случае, получено экспериментально. Тем не менее используем возможность явного задания значения коэффициента УТ в окончательном варианте программы Z = FN F(Y + YT * X) — ZT * X позволив пользователю самому сделать выбор. На рис. 29.7 представлено изображение, полученное при ис¬ пользовании оператора 330 следующего вида: 330 Z - FN F(Y + . 5 * X) — . 4 * X Сформированное изображение поверхности заметно ближе по форме к искомому (рис. 29.3), чем к представленному на рис. 29.6.
Средства машинной графики 297 Недостатком является наличие на изображении множества ли¬ ний, в действительности скрытых от наблюдателя самой поверх¬ ностью. Такие линии называются скрытыми. Одна из этих линий специально выделена на рис. 29.8. Отсутствие на рис. 29.3 скрытых линий усиливает впечатле¬ ние ’’объемности” изображаемой поверхности. При внимательном рассмотрении рис. 29.1 заметно отсутствие значительного числа скрытых линий. Для достижения подобного эффекта следует начинать пост¬ роение изображения от меньших величин X к большим, причем при добавлении к изображению очередной точки стирать все точки, располагающиеся непосредственно под ней. При таком способе все скрытые части изображения будут удалены. Выпол¬ нение указанных действий обеспечивается введением в программу следующих двух строк: 345 HCOLOR = 0: HPLOT 2 * I, FN Z(Z) + 1 ТО 2 * I, 191: HCOLOR = 7: REM УДАЛЕНИЕ СКРЫТЫХ ЛИНИЙ С учетом сказанного программа принимает вид 100 HGR : HCOLOR = 7: РОКЕ — 16 302,0: REM ПОЛНОФОРМАТНЫЙ ГРАФИЧЕСКИЙ РЕЖИМ С ВЫСОКОЙ РАЗРЕШАЮЩЕЙ СПОСОБНОСТЬЮ 110 DEF FN Z(Z) = 100 — 90 * Z: REM ФУНКЦИЯ МАСШТАБИРОВАНИЯ ПО ОСИ Z 150 DEF FN F(Y) = SQR ( (1 — X * X — Y * Y 4-ABS (1 — X * X — Y * Y) ) / 2): REM ФУНКЦИЯ ОПИСАНИЯ ПОВЕРХНОСТИ, ПОДЛЕЖАЩЕЙ ПОСТРОЕНИЮ 200 X = — 1.2 300 Y = — 1.2: REM НАИМЕНЬШЕЕ ЗНАЧЕНИЕ Y = — 1.2 310 DY = 2.4 / 139: REM ШАГ ПО ОСИ Y = 2.4 / 139 320 FOR I = 0 ТО 139: REA1 ЦИКЛ ПОСТРОЕНИЯ ОЧЕРЕДНОГО СЕЧЕНИЯ ПО 140 ТОЧКАМ 330 Z = FN F(Y + . 5 * X) — . 4 ❖ X: REM ВЫЧИСЛЕНИЕ ЗНАЧЕНИЯ Z 340 HPLOT 2 * I, FN Z(Z): REM ПОСТРОЕНИЕ ТОЧКИ КРИВОЙ С УЧЕТОМ МАСШТАБА ПО ОСИ Z 345 HCOLOR = 0: HPLOT 2 ф I, FN Z(Z) +1 ТО 2 * I, 191: HCOLOR = 7: REM УДАЛЕНИЕ СКРЫТЫХ ЛИНИЙ 350 Y = Y + DY: REM ПРИРАЩЕНИЕ ЗНАЧЕНИЯ Y 360 NEXT I 390 X = X -I- .1 400 IF X < 1.3 THEN 300 На рис. 29.9 представлено изображение, сформированное с помощью этой программы. Следует использовать рассмотренные выше идеи при состав’ лении программы построения изображения поверхности, описы¬ ваемого функцией вида z=f (х, у). В процессе работы можно обра¬ титься к программе 29.1, приведенной в приложении, и програм¬ мам задачи 28.
298 Глава 8 Рис. 29.9. Рис. 29.10. r=sjn (| я 1+ | у |); х и у принимают значения от -5 до 5; г принимает значения от -4 до 4; ZT=0,4; YT=0,5. Рис. 29.11. 2=sin (| я 1+1 у 1)1 х и у принимают значения от - 5 до 5; g принимает значения от ~4 до 4; ZT = 0,5; ¥1=0,25,
Средства машинной графики 299 На рис. 29.10—29.13 приведены изображения нескольких поверхностей, которые следует использовать для проверки пра¬ вильности работы написанной программы. Укажем лишь, что Рис. 29.12. Z = cos(xf/); х, у и г принимают значения от —4 до 4; ZT = 0, 5; YT = C. Рис. 29.13. z=gos (xr) Xf у и 2 принимают значения от —1 до 4; ZT=sO,4; YT=sO,5. значения функции z заключены в пределах —l^z^l, но масштаб по оси z выбран более крупным, чтобы, не выходя за границы изо¬ бражения, можно было смещать отдельные сечения,
ПРИЛОЖЕНИЕ Программа 7.1 100 REM ПОГОНЯ МУХ ДРУГ ЗА ДРУГОМ ***** НО REM 120 DEF FN Х(Х) = 140 -|- X: REM ФУНКЦИЯ МАСШТАБИРОВАНИЯ ПО ОСИ X 130 DEF FN Y(Y) = 95 - Y: REM ФУНКЦИЯ МАСШТАБИРОВАНИЯ ПО ОСИ Y 140 DIM X(5),Y(5): REM ТЕКУЩИЕ ЗНАЧЕНИЯ КООРДИНАТ МУХ 150 DIM NX(4),NY(4): REM КООРДИНАТЫ СЛЕДУЮЩЕГО ПОЛОЖЕНИЯ МУХ 160 Х(1) — 90:Y(l) = — 90: REM НАЧАЛЬНЫЕ КООРДИНАТЫ 1-Й МУХИ 170 Х(2) =ч 90:Y(2) = — 90: REM НАЧАЛЬНЫЕ КООРДИНАТЫ 2- Й МУХИ 180 Х(3) = 90:Y(3) = 90: REM НАЧАЛЬНЫЕ КООРДИНАТЫ 3- Й МУХИ 190 Х(4) = - 90:Y(4) = 90: REM НАЧАЛЬНЫЕ КООРДИНАТЫ 4- Й МУХИ 200 HGR : РОКЕ — 16 302,0: HCOLOR = 7: REM ПОЛНОФОРМАТНЫЙ ГРАФИЧЕСКИЙ РЕЖИМ С ВЫСОКОЙ РАЗРЕШАЮЩЕЙ СПОСОБНОСТЬЮ; ЦВЕТ — БЕЛЫЙ 300 REM ПРОЦЕДУРА ФОРМИРОВАНИЯ ИЗОБРАЖЕНИЯ 310 REM ТРАЕКТОРИИ ПОЛЕТА МУХ 320 Х(5) = Xfl):Y(5) = Y(l): REM ОПЕРАТОРЫ, УПРОЩАЮЩИЕ СТРУКТУРУ ОСНОВНОГО FOR... NEXT ЦИКЛА 330 FOR I = I TO 4: REM ЦИКЛ РАСЧЕТА ТРАЕКТОРИИ ДВИЖЕНИЯ МУХ 340 NX(I) = X(I) + .02 ■■■■■ (X(I -I- 1) — X(I)) 350 NY(I) = Y(I) + .02 * (Y(I 1) — Y(I)) 360 NEXT I 370 FOR 1=1 TO 4: REM ЦИКЛ ПОСТРОЕНИЯ ИЗОБРАЖЕНИЯ ТРАЕКТОРИИ МУХ 380 HPLPT FN X(X(I)), FN Y(Y(I)) TO FN X(NX(I)), FN Y(NY(I)) 390 X(I) = NX(I):Y(I) = NY(I): REM ИЗМЕНЕНИЕ ЗНАЧЕНИИ ТЕКУЩИХ КООРДИНАТ ПОЛОЖЕНИЯ МУХИ 400 NEXT I 410 GOTO 320
Приложение 301 Программа 8.1 100 DIM Н(10): REM Н(СТ) — СЧЕТЧИК ЧИСЛА 10-КРАТНЫХ БРОСАНИЙ МОНЕТЫ С ВЫПАДАНИЕМ ОРЛА СТ РАЗ ПО FOR J=1 ТО 1000: REM ПУСК ПРОГРАММЫ НА 1000 ИСПЫТАНИЙ 120 СТ = 0: REM ПРИСВОЕНИЕ НУЛЯ СОДЕРЖИМОМУ СЧЕТЧИКА ЧИСЛА ПОЯВЛЕНИЙ ОРЛА 130 FOR 1 = 1 ТО 10: REM ЦИКЛ Ю-КРАТНОГО БРОСАНИЯ 140 СТ = СТ + INT(2 * RND(1)):REM ОДНОКРАТНОЕ БРОСАНИЕ И УВЕЛИЧЕНИЕ НА Г СОДЕРЖИМОГО СЧЕТЧИКА ЧИСЛА ПОЯВЛЕНИЙ ОРЛА, ЕСЛИ ЭТО СОБЫТИЕ ИМЕЕТ МЕСТО 150 NEXT I 160 Н(СТ) = Н(СТ) + 1: REM УВЕЛИЧЕНИЕ НА 1 СОДЕРЖИМОГО СЧЕТЧИКА 10-КРАТНЫХ БРОСАНИЙ 170 NEXT J 180 FOR СТ = 0 ТО 10: REM ВЫВОД РЕЗУЛЬТАТОВ 190 PRINT СТ; ”ОРЛ. ВЫПАЛО ”;Н(СТ);” РАЗ” 200 NEXT СТ 210 END Программа 8.2 100 DIM Т(12): REM T(J) — СЧЕТЧИК ЧИСЛА ВЫПАДАНИЙ J ОЧКОВ 110 FOR DI = 1 ТО 6: REM БРОСАНИЕ ПЕРВОЙ КОСТИ 120 FOR D2 = 1 ТО 6: REM БРОСАНИЕ ВТОРОЙ КОСТИ 130 T(D1 -|- D2) = T(D1 + D2) + 1 140 NEXT D2 150 NEXT DI 160 FOR I = 2 TO 12: REM ВЫВОД РЕЗУЛЬТАТОВ 170 PRINT I;” ОЧКОВ ВЫПАЛО ”;Т(1);” РАЗ” 180 NEXT I 190 END Программа 8.3 100 DIM Т(30,30): REM РЕЗЕРВИРОВАНИЕ ПАМЯТИ ДЛЯ ТАБЛИЦЫ ПАСКАЛЯ; T(I,J) — СЧЕТЧИК ЧИСЛА ПОЯВЛЕНИЙ ОРЛА J РАЗ ПРИ 1-КРАТНЫХ БРОСАНИЯХ 110 Т(1,0) = 1:Т(1,1) = 1: REM ВЫЧИСЛЕНИЕ ЭЛЕМЕНТОВ ПЕРВОЙ СТРОКИ ТАБЛИЦЫ ПАСКАЛЯ 120 FOR 1 = 1 ТО 29: REM ВЫЧИСЛЕНИЕ ЭЛЕМЕНТОВ СТРОК СО 2-Й ПО 30-Ю 130 Т(1 + 1,0) = 1: REM ЕДИНСТВЕННАЯ СИТУАЦИЯ; КОГДА ОРЕЛ НЕ ВЫПАДАЕТ НИ РАЗУ 140 FOR J = 1 ТО I 150 T(I + 1,J) = T(I,J) + T(I,J — 1): REM ДВА ВАРИАНТА ВЫПАДАНИЯ ОРЛА J РАЗ: J РАЗ ПРИ ПЕРВЫХ I БРОСАНИЯХ И РЕШКА ПРИ (I + 1)-М; (J - 1) РАЗ ПРИ ПЕРВЫХ I БРОСАНИЯХ И ОРЕЛ REM: ПРИ (I + 1)-М 160 NEXT J
302 Приложение 170 T(I + I,I + 1) = 1: REM ЕДИНСТВЕННАЯ СИТУАЦИЯ, КОГДА ПРИ ВСЕХ БРОСАНИЯХ ВЫПАДАЕТ ОРЕЛ 180 PRINT : REM ФОРМИРОВАНИЕ СТРОКИ ПРОБЕЛОВ МЕЖДУ ВЫВОДИМЫМИ СТРОКАМИ 190 FOR J = 0 ТО 1 + 1: REM ВЫВОД (I + 1)-Й СТРОКИ 200 PRINT ”T(”;I + 1;”,”;J;”) = ”;T(I + 1, J) 210 NEXT J 220 NEXT I Программа 8.4 100 DIM ТН(10): REM TH(I) — ПЕРЕМЕННАЯ ДЛЯ ХРАНЕНИЯ ПОЛУЧАЕМОГО РАСЧЕТНЫМ ПУТЕМ ЧИСЛА ВЫПАДАНИЯ ОРЛА I РАЗ ПРИ ПРОВЕДЕНИИ 1024 ДЕСЯТИКРАТНЫХ БРОСАНИЙ ПО DIM ЕХ(10): REM ЕХ(1) — ПЕРЕМЕННАЯ ДЛЯ ХРАНЕНИЯ ПОЛУЧАЕМОГО МОДЕЛИРОВАНИЕМ НА ЭВМ ЧИСЛА ВЫПАДАНИЙ ОРЛА I РАЗ ПРИ ПРОВЕДЕНИИ 1024 ДЕСЯТИКРАТНЫХ БРОСАНИЙ 120 ТН(0) = 1 130 ТН(1) = 10 140 ТН(2) = 45 150 ТН(3) = 120 160 ТН(4) = 210 170 ТН(5) = 252 180 ТН(6) = 210 190 ТН(7) = 120 200 ТН(8) = 45 210 ТН(9) = 10 220 ТН(10) = 1 230 HGR : REM УСТАНОВКА ГРАФИЧЕСКОГО РЕЖИМА ВЫСОКОЙ РАЗРЕШАЮЩЕЙ СПОСОБНОСТИ 240 HCOLOR = 7 : REM ВЫБИРАЕМЫЙ ДЛЯ ГРАФИЧЕСКОГО ИЗОБРАЖЕНИЯ ЦВЕТ-БЕЛЫЙ 250 HPLOT 0,0 ТО 0,159 : REM ОТОБРАЖЕНИЕ ОСИ ОРДИНАТ 260 HPLOT 0,159 ТО 279,159: REM ОТОБРАЖЕНИЕ ОСИ АБСЦИСС 270 FOR X 10 ТО 270 STEP 10: REM НАНЕСЕНИЕ ДЕЛЕНИЙ 280 HPLOT Х,159 ТО Х,156 /90 NEXT X 300 FOR I = 0 ТО 10: REM ГРАФИЧЕСКОЕ ПРЕДСТАВЛЕНИЕ РЕЗУЛЬТАТОВ РАСЧЕТА 310 FOR J = 0 ТО 4 STEP 2: REM ПОСТРОЕНИЕ ТРОЙНЫХ ПОЛОС 320 HPLOT 0,14 * I + J ТО TH(I),14 * I + J 330 NEXT J 340 NEXT I 350 FOR J = 1 TO 1024: REM ЦИКЛ ВЫПОЛНЕНИЯ 1024 ДЕСЯТИКРАТНЫХ БРОСАНИЙ 360 СТ = 0 370 FOR I = 1 ТО 10: REM 10-КРАТНОЕ БРОСАНИЕ 380 СТ = СТ + INT(2 RND(I)): REM ОДНОКРАТНОЕ БРОСАНИЕ И ДОБАВЛЕНИЕ 1 К СОДЕРЖИМОМУ СЧЕТЧИКА СТ ПРИ ПОЯВЛЕНИИ ОРЛА 390 NEXT I 400 ЕХ(СТ) = ЕХ(СТ) + 1: REM УВЕЛИЧЕНИЕ СООТВЕТСТВУЮЩЕЙ СУММЫ НА 1
Приложение 303 410 HPLOT ЕХ(СТ),14 * СТ + 7 ТО ЕХ(СТ),14 * СТ +9; REM НАНЕСЕНИЕ НА ГРАФИК РЕЗУЛЬТАТОВ МОДЕЛИРОВАНИЯ 420 NEXT J 430 END Программа 9.1 100 НОМЕ по PRINT ”N N ФАКТОРИАЛ”: PRINT 120 F = 1 130 FOR N = 1 TO 50 140 F = F * N 150 PRINT N;: HTAB 8: PRINT F 160 NEXT N 999 END Программа 10.1 100 HGR : HCOLOR =7: REM УСТАНОВКА ГРАФИЧЕСКОГО РЕЖИМА ВЫСОКОЙ РАЗРЕШАЮЩЕЙ СПОСОБНОСТИ 110 DEF FN Х(Т) = 5*Т: REM ОПИСАНИЕ ФУНКЦИИ ПРЕОБРАЗОВАНИЯ ШАГОВ БЛУЖДАНИЯ В МАШИННЫЕ КООРДИНАТЫ ПО ОСИ АБСЦИСС, 120 DEF FN Y(Y) = 80 — 5 * Y: REM ОПИСАНИЕ ФУНКЦИИ ПРЕОБРАЗОВАНИЯ ШАГОВ БЛУЖДАНИЯ В МАШИННЫЕ КООРДИНАТЫ ПО ОСИ ОРДИНАТ, 130 HPLOT 0,0 ТО 0,159: REM ПОСТРОЕНИЕ ОСИ ОРДИНАТ 140 FOR Y=—15 ТО 16: REM НАНЕСЕНИЕ ДЕЛЕНИЙ НА ОСЬ ОРДИНАТ 150 HPLOT 0, FN Y(Y) ТО 2, FN Y(Y): NEXTY 160 HPLOT 0, FN Y(0) ТО 279, FN Y(0): REM ПОСТРОЕНИЕ ОСИ АБСЦИСС 170 FOR Т = 1 ТО 55: REM НАНЕСЕНИЕ ДЕЛЕНИЙ НА ОСЬ АБСЦИСС 189 HPLOT FN Х(Т),79 ТО FN Х(Т),81: NEXT Т 190 Y = 0: REM ЗАДАНИЕ КООРДИНАТЫ ТОЧКИ НАЧАЛА БЛУЖДАНИЯ 200 HPLOT FN Х(0). FN Y(0): REM ПОСТРОЕНИЕ ГРАФИКА ИЗ НАЧАЛА КООРДИНАТ (0,0) 210 FOR X = 1 ТО 55: REM ЦИКЛ СЛУЧАЙНОГО БЛУЖДАНИЯ ПРОДОЛЖИТЕЛЬНОСТЬЮ 55 ШАГОВ 220 Y = Y 4- 2 * INT (2 * RN'D(l))—1: REM ДОБАВЛЕНИЕ . К КООРДИНАТЕ Y ЗНАЧЕНИЯ +1 ИЛИ — 1 В ЗАВИСИМОСТИ ОТ РЕЗУЛЬТАТА ’’БРОСАНИЯ МОНЕТЫ” 230 HPLOT ТО FN Х(Х), FN Y(Y): RE.M НАНЕСЕНИЕ НА ГРАФИК ИЗОБРАЖЕНИЯ ОЧЕРЕДНОГО ШАГА БЛУЖДАНИЯ 240 NEXT X Программа 10.2 100 W = 0: REM W —КОЛИЧЕСТВО ВЫИГРАННЫХ СЕАНСОВ ИГРЫ 110 I. = 0: REM L —КОЛИЧЕСТВО ПРОИГРАННЫХ СЕАНСОВ ИГРЫ
304 Приложение 120 REM НАЧАЛО НОВОГО СЕАНСА ИГРЫ 130 С = 10: REM С —ТЕКУЩАЯ СУММА ДЕНЕГ У ИГРОКА, ИСХОДНАЯ СУММА РАВНА 10 ДОЛЛ. 140 С = С + 2 * INT (2 * RND(l))- 1: REM МОДЕЛИРОВАНИЕ ОДНОГО СЕАНСА ИГРЫ И ИЗМЕНЕНИЕ ТЕКУЩЕЙ СУММЫ ДЕНЕГ В СООТВЕТСТВИИ С ВЫИГРЫШЕМ ИЛИ ПРОИГРЫШЕМ 150 IF С = 0 THEN L = L Ч- 1: GOTO 200: REM ПРОВЕРКА, НЕ ВСЕ ЛИ ДЕНЬГИ ПРОИГРАНЫ 160 IF С = 20 THEN W = W + 1: GOTO 200: ПРОВЕРКА, ДОСТИГНУТА ЛИ ЖЕЛАЕМАЯ СУММА ВЫИГРЫША 170 GOTO 140 200 PRINT : REM ВЫВОД КОЛИЧЕСТВА ВЫИГРАННЫХ И ПРОИГРАННЫХ СЕАНСОВ ИГРЫ И ПЕРЕХОД К НАЧАЛУ НОВОГО СЕАНСА 210 PRINT ’’ЧИСЛО ВЫИГРАННЫХ СЕАНСОВ ИГРЫ =”;W 220 PRINT ’’ЧИСЛО ПРОИГРАННЫХ СЕАНСОВ ИГРЫ =”;L 230 PRINT ’’ВЕРОЯТНОСТЬ ВЫИГРЫША =”;W/(W + L) 240 GOTO 130 Программа 10.3 100 W = 0: REM W —КОЛИЧЕСТВО ВЫИГРАННЫХ СЕАНСОВ ИГРЫ ПО L = 0: REM L —КОЛИЧЕСТВО ПРОИГРАННЫХ СЕАНСОВ ИГРЫ 120 REM НАЧАЛО НОВОГО СЕАНСА ИГРЫ 130 С =. 10: REM С —ТЕКУЩАЯ СУММА ДЕНЕГ У ИГРОКА, ИСХОДНАЯ СУММА РАВНА 10 ДОЛЛ. 140 R = RND(l) 143 IF R < 18 / 38 THEN С = С + 1: REM ВЫПОЛНЕНИЕ ДАННОГО УСЛОВИЯ ЭКВИВАЛЕНТНО ВЫИГРЫШУ, ПОЭТОМУ К ТЕКУЩЕЙ СУММЕ ДЕНЕГ ИГРОКА ДОБАВЛЯЕТСЯ 1 ДОЛЛ. 146 IF R > 18 / 38 THEN С = С — 1: REM ВЫПОЛНЕНИЕ ДАННОГО УСЛОВИЯ ЭКВИВАЛЕНТНО ПРОИГРЫШУ, ПОЭТОМУ ИЗ ТЕКУЩЕЙ СУММЫ ДЕНЕГ ИГРОКА ВЫЧИТАЕТСЯ 1 ДОЛЛ. 150 IF С - 0 THEN L = L + 1: GOTO 200: REM ПРОВЕРКА, НЕ ВСЕ ЛИ ДЕНЬГИ ПРОИГРАНЫ 160 IF С = 20 THEN W = W + 1: GOTO 200: REM ПРОВЕРКА, ДОСТИГНУТА ЛИ ЖЕЛАЕМАЯ СУММА ВЫИГРЫША 170 GOTO 140 200 PRINT : REM ВЫВОД КОЛИЧЕСТВА ВЫИГРАННЫХ И ПРОИГРАННЫХ СЕАНСОВ ИГРЫ И ПЕРЕХОД К НАЧАЛУ НОВОГО СЕАНСА 210 PRINT ’’ЧИСЛО ВЫИГРАННЫХ СЕАНСОВ ИГРЫ =”;W 220 PRINT ’’ЧИСЛО ПРОИГРАННЫХ СЕАНСОВ ИГРЫ =”;L 230 PRINT ’’ВЕРОЯТНОСТЬ ВЫИГРЫША =”;W / (W + L) 240 GOTO 130 Программа 10.4 100 GR : COLOR = 15: REM УСТАНОВКА ГРАФИЧЕСКОГО РЕЖИМА НИЗКОЙ РАЗРЕШАЮЩЕЙ СПОСОБНОСТИ, ВЫБИРАЕМЫЙ ДЛЯ ГРАФИЧЕСКОГО ИЗОБРАЖЕНИЯ ЦВЕТ-БЕЛЫЙ
Приложение 305 ЦО DIM D(39): REM D(L)-C4ET4HK ЧИСЛА СЛУЧАЙНЫХ БЛУЖДАНИЙ, ЗАВЕРШИВШИХСЯ НА РАССТОЯНИИ L 120 PRINT ” 111111111122222222223333333333”;: REM ВЫВОД ЦИФР В НИЖНЕЙ ЧАСТИ ГРАФИКА 130 PRINT ”0123456789012345678901234567890123456789” 140 FOR N 1 ТО 100: REM ЦИКЛ ВЫПОЛНЕНИЯ 100 СЛУЧАЙНЫХ БЛУЖДАНИЙ 150 X = 0: REM ЗАДАНИЕ КООРДИНАТЫ ТОЧКИ НАЧАЛА БЛУЖДАНИЯ 160 FOR 1 = 1 ТО 50: REM ЦИКЛ ВЫПОЛНЕНИЯ ОДНОГО БЛУЖДАНИЯ ПРОДОЛЖИТЕЛЬНОСТЬЮ 50 ШАГОВ 170 X = X + 2 * INT(2 * RND(l)) —1: REM ВЫПОЛНЕНИЕ ОЧЕРЕДНОГО ШАГА 180 NEXT I 190 X = ABS(X): REM ВЫЧИСЛЕНИЕ ПРОЙДЕННОГО РАССТОЯНИЯ КАК АБСОЛЮТНОГО ЗНАЧЕНИЯ КООРДИНАТЫ X 200 PLOT Х,39 — D(X): REM ДОБАВЛЕНИЕ ОДНОГО БЛОКА К СООТВЕТСТВУЮЩЕМУ ГРАФИКУ 210 D(X) == D(X) J- 1: REM УВЕЛИЧЕНИЕ НА 1 СООТВЕТСТВУЮЩЕЙ СУММЫ 220 NEXT N Программа 11.1 100 HGR : HCOLOR 7: REM УСТАНОВКА ГРАФИЧЕСКОГО РЕЖИМА ВЫСОКОЙ РАЗРЕШАЮЩЕЙ СПОСОБНОСТИ; ВЫБИРАЕМЫЙ ДЛЯ ГРАФИЧЕСКОГО ИЗОБРАЖЕНИЯ ЦВЕТ-БЕЛЫЙ 110 DEF FN Х(Х) = 140 + 4 ■■■■■ X: REM ОПИСАНИЕ ФУНКЦИИ ПРЕОБРАЗОВАНИЯ ШАГОВ БЛУЖДАНИЯ В КООРДИНАТЫ ПО ОСИ АБСЦИСС, ОПРЕДЕЛЯЕМЫЕ ЭВМ 120 DEF FN Y(Y) = 80 - 4 « Y: REM ОПИСАНИЕ ФУНКЦИИ ПРЕОБРАЗОВАНИЯ ШАГОВ БЛУЖДАНИЯ В КООРДИНАТЫ ПО ОСИ ОРДИНАТ, ОПРЕДЕЛЯЕМЫЕ ЭВМ 130 X = 0: Y = 0: REM ЗАДАНИЕ НАЧАЛЬНЫХ КООРДИНАТ ПОЛОЖЕНИЯ ПУТНИКА 140 REM СЛЕДУЮЩИЕ ТРИ СТРОКИ ПРОГРАММЫ СОДЕРЖАТ ОПЕРАТОРЫ, ФОРМИРУЮЩИЕ КВАДРАТ —УСЛОВНОЕ ИЗОБРАЖЕНИЕ ПУТНИКА —В ПОЗИЦИИ, ГДЕ ОН НАХОДИТСЯ В ДАННЫЙ МОМЕНТ 150 А = FN Х(Х): В = FN Y(Y): HPLOT А —1,В 1 ТО А + 1,В4-< 160 HPLOT А — 1 ,В ТО А + 1,В 170 HPLOT А — 1 ,В — 1 ТО А + 1,В — 1 180 FOR DLY = 1 ТО 100: NEXT DLY: REM ЦИКЛ ЗАДЕРЖКИ 190 REM СЛЕДУЮЩИЕ ТРИ СТРОКИ ПРОГРАММЫ СОДЕРЖАТ ОПЕРАТОРЫ, ФОРМИРУЮЩИЕ СЛЕД, ОСТАВЛЯЕМЫЙ ПУТНИКОМ, ПЕРЕШЕДШИМ В СЛЕДУЮЩУЮ ПОЗИЦИЮ 200 HCOLOR = 0: HPLOT А — 1,В + 1 ТО А + 1 ,В + 1 210 HPLOT А — 1,В — 1 ТО А + 1,В — 1 220 HPLOT А — 1 ,В: HPLOT А + 1,В 230 HCOLOR = 7: REM ВОЗВРАЩЕНИЕ К БЕЛОМУ ЦВЕТУ ВОСПРОИЗВЕДЕНИЯ ИЗОБРАЖЕНИЙ НА ЭКРАНЕ 240 R = INT(4 * RND(l)): REM ВЫБОР ЧИСЕЛ 0, 1, 2 ИЛИ 3 ПО СЛУЧАЙНОМУ ЗАКОНУ 250 IF R = 0 THEN X = X + 1: IF X > 34 THEN END: REM ЕСЛИ R = 0, TO ВЫПОЛНЕНИЕ ШАГА ВПРАВО. ПРОВЕРКА,
SOA Приложение НАХОДИТСЯ ЛИ ИЗОБРАЖЕНИЕ ПУТНИКА В ПРЕДЕЛАХ ЭКРАНА 260 IF R ?= 1 THEN X = X — 1: IF X < —34 THEN END: REM ЕСЛИ R = 1, TO ВЫПОЛНЕНИЕ ШАГА ВЛЕВО. ПРОВЕРКА; НАХОДИТСЯ ЛИ ИЗОБРАЖЕНИЕ ПУТНИКА В ПРЕДЕЛАХ ЭКРАНА 270 IF R = 2 THEN Y = Y + 1: IF Y > 19 THEN END: REM ЕСЛИ R = 2, TO ВЫПОЛНЕНИЕ ШАГА ВВЕРХ. ПРОВЕРКА, НАХОДИТСЯ ЛИ ИЗОБРАЖЕНИЕ ПУТНИКА В ПРЕДЕЛАХ ' ЭКРАНА 280 IF R = 3 THEN Y = Y — 1: IF Y < —19 THEN END: REM ЕСЛИ R = 3, TO ВЫПОЛНЕНИЕ ШАГА ВНИЗ. ПРОВЕРКА, НАХОДИТСЯ ЛИ ИЗОБРАЖЕНИЕ ПУТНИКА В ПРЕДЕЛАХ ЭКРАНА 290 GOTO 150 Программа 11.2 100 LOMEM: 16 384: REM ЭТОТ ОПЕРАТОР ВКЛЮЧЕН В ПРОГРАММУ, ЧТОБЫ ЗАЩИТИТЬ ЕЕ ПЕРЕМЕННЫЕ ОТ ВОЗМОЖНОГО СТИРАНИЯ КОМАНДАМИ СИСТЕМНЫХ ПРОГРАММ ПОДДЕРЖКИ ГРАФИЧЕСКОГО РЕЖИМА 105 REM ВЫСОКОЙ РАЗРЕШАЮЩЕЙ СПОСОБНОСТИ ПО DIM R(20,20),C(20,20): REM МАССИВЫ ДЛЯ ЗАПИСИ ТОЧЕК (ОТМЕТОК О ЗАВЕРШЕНИИ БЛУЖДАНИЙ, ФОРМИРУЮЩИХ ДИАГРАММУ РАССЕЯНИЯ) 120 FOR I = 0 ТО 20: FOR J = 0 ТО 20: 130 R(I,J) = 0: C(I,J) = 0: REM ПРИСВОЕНИЕ ПЕРЕМЕННЫМ R И С НУЛЕВЫХ ЗНАЧЕНИЙ В КАЧЕСТВЕ ИСХОДНЫХ 140 NEXT J: NEXT I 150 HGR : HCOLOR =7: REM УСТАНОВКА РЕЖИМА ВЫСОКОЙ РАЗРЕШАЮЩЕЙ СПОСОБНОСТИ, ВЫБИРАЕМЫЙ ДЛЯ ГРАФИЧЕСКОГО ИЗОБРАЖЕНИЯ ЦВЕТ — БЕЛЫЙ 160 РОКЕ—16302,0: REM ИСПОЛЬЗОВАНИЕ ДЛЯ ГРАФИЧЕСКОГО ИЗОБРАЖЕНИЯ ВСЕЙ ПЛОЩАДИ ЭКРАНА 170 GOSUB 800 300 X = 10:Y = 10: REM НАЧАЛО НОВОГО БЛУЖДАНИЯ 310 NS = 24 + INT (2 * RND(l)): REM ВЫБОР ПРОДОЛЖИ ТЕЛЬНОСТИ (ЧИСЛА ШАГОВ) БЛУЖДАНИЯ: 24 ИЛИ 25 320 FOR N = 1 ТО NS 330 R = INT(4 * RND(l)): REM ’’БРОСАНИЕ ЧЕТЫРЕХСТОРОННЕЙ ИГРАЛЬНОЙ КОСТИ” 340 IF R = 0 THEN X = X + 1: REM ЕСЛИ R = 0, ТО ВЫПОЛНЕНИЕ ШАГА ВПРАВО 350 IF R = 1 THEN X = X — 1: REM ЕСЛИ R = 1, ТО ВЫПОЛНЕНИЕ ШАГА ВЛЕВО 360 IF R = 2 THEN Y = Y + 1: REM ЕСЛИ R = 2, TO ВЫПОЛНЕНИЕ ШАГА ВВЕРХ 370 IF R = 3 THEN Y = Y — 1: REM ЕСЛИ R = 3, TO ВЫПОЛНЕНИЕ ШАГА ВНИЗ 380 NEXT N 390 IF X < 0 OR X > 20 OR Y < 0 OR Y > 20 THEN OB = OB + 1: GOTO 300: REM ЕСЛИ БЛУЖДАНИЕ ЗАВЕРШАЕТСЯ НА РАССТОЯНИИ, ПРЕВЫШАЮЩЕМ 10 ШАГОВ ОТ ТОЧКИ СТАРТА, ТО ТАКОЕ БЛУЖДАНИЕ
Приложение 307 395 REM ИГНОРИРУЕТСЯ И ВЫПОЛНЯЕТСЯ ПЕРЕХОД К НАЧАЛУ НОВОГО БЛУЖДАНИЯ 400 REM НАНЕСЕНИЕ НА ЭКРАН ТОЧКИ, ПОМЕЧАЮЩЕЙ МЕСТО ЗАВЕРШЕНИЯ БЛУЖДАНИЯ 410 IF С(Х, Y) < 5 THEN С(Х, Y) = С(Х, Y) + 1: GOTO 500: REM ЕСЛИ ИМЕЕТСЯ МЕСТО В ДАННОЙ СТРОКЕ ЯЧЕЙКИ, ТО ВНЕСЕНИЕ ТОЧКИ В ЭТУ СТРОКУ 420 IF R(X, Y) = 4 THEN 600 : REM ЗАВЕРШЕНИЕ ВЫПОЛНЕНИЯ ПРОГРАММЫ, ЕСЛИ ЯЧЕЙКА ЗАПОЛНЕНА 430 R(X, Y) = R (X, Y)+ 1:С(Х, Y) = 1 : REM НАЧАЛО ЗАПИСИ В НОВОЙ СТРОКЕ С ЛЕВОГО СТОЛБЦА 500 РХ = 57 + 8 * X + С(Х, Y) : REM ВЫЧИСЛЕНИЕ ЗНАЧЕНИЯ АБСЦИССЫ НОВОЙ ТОЧКИ (ОТМЕТКИ ЗАВЕРШЕНИЯ. БЛУЖДАНИЯ) 510 PY = 178 — 8 * Y —R (X, Y) : REM ВЫЧИСЛЕНИЕ ЗНАЧЕНИЯ ОРДИНАТЫ НОВОЙ ТОЧКИ 520 HPLOT PX,PY: REM ПОСТРОЕНИЕ ГРАФИЧЕСКОГО ИЗОБРАЖЕНИЯ НОВОЙ ТОЧКИ 530 GOTO 300 600 HCOLOR = 0: REM ВЫБОР ЧЕРНОГО ЦВЕТА ДЛЯ ГРАФИЧЕСКОГО ИЗОБРАЖЕНИЯ 610 GOSUB 800: REM СТИРАНИЕ ЛИНИЙ РЕШЕТКИ 620 END 800 FOR X = 56 ТО 224 STEP 8: REM ПОСТРОЕНИЕ РЕШЕТКИ 810 HPLOT Х,12 ТО Х,180 820 NEXT X 830 FOR Y = 12 ТО 180 STEP 8 840 HPLOT 56,Y TO 224,Y 850 NEXT Y ! REM КОНЕЦ ПОСТРОЕНИЯ ЛИНИЙ РЕШЕТКИ 860 RETURN 999 END Программа 12.1 100 DIM PR(100) : REM ПРЕДЫДУЩАЯ СТРОКА ТРЕУГОЛЬНОЙ ТАБЛИЦЫ ПАСКАЛЯ 110 DIM NR(100) : REM ТЕКУЩАЯ СТРОКА ТРЕУГОЛЬНОЙ ТАБЛИЦЫ ПАСКАЛЯ 120 PR(0) = 1:PR(1) = 1 : REM ПЕРВАЯ СТРОКА 130 FOR N =2 ТО 100: REM ЦИКЛ ВЫЧИСЛЕНИЯ ЗНАЧЕНИЙ ЭЛЕМЕНТОВ СТРОК СО 2-Й ПО 100-Ю 140 NR(0) = 1:NR(N) = 1 150 FOR I = 1 TO N — I 160 NR(I) = PR(I — 1) + PR(I) 170 NEXT I 180 PRINT : PRINT : PRINT : REM ПРОПУСК ТРЕХ СТРОК 190 PRINT "* * * * * СТРОКА ”;N;” * * * * * REM ВЫВОД ЗАГОЛОВКА 200 PRINT : REM ПРОПУСК СТРОКИ 210 PRINT ’’ЧИСЛО КОЛИЧЕСТВО ВЕРОЯТНОСТЬ” 220 PRINT ’’ВЫПАДАНИЙ 10-КРАТНЫХ ВЫПАДАНИЯ” 230 PRINT ’’ОРЛА (К) БРОСАНИЙ ОРЛА К ИЛИ МЕНЕЕ РАЗ” 240 PRINT 250 S = 0: REM S—ЧИСЛО ВЫПАДАНИЙ ОРЛА К ИЛИ МЕНЕЕ РАЗ 260 FOR К = 0 ТО N 270 S = S + NR(K)
308 Приложение 280 PRINT К;: REM ВЫВОД ЧИСЛА ВЫПАДАНИЙ ОРЛА 290 НТАВ II: PRINT NR(K);: REM ВЫВОД КОЛИЧЕСТВА 10-КРАТНЫХ БРОСАНИЙ, ЗАКОНЧИВШИХСЯ ВЫПАДАНИЕМ ОРЛА К РАЗ 300 НТАВ 27: PRINT S / 2 л N: REM ВЫВОД ЗНАЧЕНИЯ ВЕРОЯТНОСТИ ВЫПАДАНИЯ ОРЛА К ИЛИ МЕНЕЕ РАЗ 310 PR(K) = NR(K): REM ПЕРЕСЫЛКА ЗНАЧЕНИЙ ЭЛЕМЕНТОВ МАССИВА ТЕКУЩЕЙ СТРОКИ ТАБЛИЦЫ ПАСКАЛЯ В МАССИВ ПРЕДЫДУЩЕЙ СТРОКИ 320 NEXT К 330 NEXT N Программа 12.2 100 DIM PR(100) : REM ПРЕДЫДУЩАЯ СТРОКА ТРЕУГОЛЬНОЙ ТАБЛИЦЫ ПАСКАЛЯ 110 DIM NR(100) : REM ТЕКУЩАЯ СТРОКА ТРЕУГОЛЬНОЙ ТАБЛИЦЫ ПАСКАЛЯ 120 PR(0) = 1 :PR(1) = 1: REM ПЕРВАЯ СТРОКА 130 FOR N =2 ТО 100: REM ЦИКЛ ВЫЧИСЛЕНИЯ ЗНАЧЕНИЙ ЭЛЕМЕНТОВ СТРОК СО 2-Й ПО 100-Ю 140 NR(0) = 1 ;NR(N) = 1 150 FOR I = 1 ТО N — 1 160 NR(I) = PR(I — 1) + PR (I) 170 NEXT I 180 PRINT : PRINT : PRINT : REM ПРОПУСК ТРЕХ СТРОК 190 PRINT ”***** СТРОКА ”;N;” * * * * REM ВЫВОД ЗАГОЛОВКА 200 PRINT : REM ПРОПУСК СТРОКИ 210 PRINT ’’ЧИСЛО ВЕРОЯТНОСТЬ ВЕРОЯТНОСТЬ" 220 PRINT ’’ВЫПАДАНИЙ ВЫПАДАНИЯ ВЫПАДАНИЯ ОРЛА” 230 PRINT ’’ОРЛА (К) ОРЛА К РАЗ К ИЛИ МЕНЕЕ РАЗ” 240 PRINT 250 S = 0: REM S — ЧИСЛО ВЫПАДАНИЙ ОРЛА К ИЛИ МЕНЕЕ РАЗ 260 FOR К = 0 ТО N 270 Р = (.6 К) * (.4 (N - К)) * NR(K) 275 S S | Р 280 PRINT К;: REM ВЫВОД ЧИСЛА ВЫПАДАНИЙ ОРЛА 290 НТАВ 11: PRINT Р;: REM ВЫВОД ЗНАЧЕНИЯ ВЕРОЯТНОСТИ ВЫПАДАНИЯ ОРЛА К РАЗ 300 НТАВ 27: PRINT S: REM ВЫВОД ЗНАЧЕНИЯ ВЕРОЯТНОСТИ ВЫПАДАНИЯ ОРЛА К ИЛИ МЕНЕЕ РАЗ 310 PR(K) = NR(K): REM ПЕРЕСЫЛКА ЗНАЧЕНИЙ ЭЛЕМЕНТОВ МАССИВА ТЕКУЩЕЙ СТРОКИ ТАБЛИЦЫ ПАСКАЛЯ В МАССИВ ПРЕДЫДУЩЕЙ СТРОКИ 320 NEXT К 330 NEXT N Программа 12.3 100 REM ИМИТАЦИЯ ЧЕСТНОЙ ИГРЫ И ПОДСЧЕТ ЧИСЛА ПРОВЕРОК С ОТРИЦАТЕЛЬНЫМ РЕЗУЛЬТАТОМ 110 Н = 0: REM Н — ЧИСЛО ВЫПАДАНИЙ ОРЛА 129 FOR N = 1 ТО 100: IF RND(l) < .5 THEN Н = Н + 1
Приложение 309 130 NEXT N 140 IF Н > = 56 THEN F = F 1: REM УВЕЛИЧЕНИЕ HA 1 СОДЕРЖИМОГО СЧЕТЧИКА ПРОВЕРОК С ОТРИЦАТЕЛЬНЫМ РЕЗУЛЬТАТОМ, ЕСЛИ Н > = 56 150 Т - Т Ж 1 : REM УВЕЛИЧЕНИЕ НА 1 КОЛИЧЕСТВА ПРОВЕРОК 160 PRINT ”ИЗ ОБЩЕГО ЧИСЛА ”;Т;” ПРОВЕРОК 165 PRINT F;” ПРОВЕРОК С ОТРИЦАТЕЛЬНЫМ РЕЗУЛЬТАТОМ’* 170 PRINT ’’ДОЛЯ ПРОВЕРОК С ОТРИЦАТЕЛЬНЫ/^ РЕЗУЛЬТАТОМ = ”;F / Т 180 PRINT : RЕМ ПРОПУСК СТРОКИ 190 GOTO НО: REM ПОВТОРЕНИЕ ИГРЫ Программа 12.4 100 REM ИМИТАЦИЯ НЕЧЕСТНОЙ ИГРЫ И ПОДСЧЕТ ЧИСЛА ПРОВЕРОК С ПОЛОЖИТЕЛЬНЫМ РЕЗУЛЬТАТОМ 110 Н - 0: REM Н — ЧИСЛО ВЫПАДАНИЙ ОРЛА 120 FOR N = 1 ТО 100: IF RND(l) < .6 THEN Н = Н Щ 1 130 NEXT N 140 IF Н < = 55 THEN Р Р + 1: REM УВЕЛИЧЕНИЕ НА 1 СОДЕРЖИМОГО СЧЕТЧИКА ПРОВЕРОК С ПОЛОЖИТЕЛЬНЫМ РЕЗУЛЬТАТОМ, ЕСЛИ Н < = 55 150 Т =- Т + 1: REM УВЕЛИЧЕНИЕ НА 1 КОЛИЧЕСТВА ПРОВЕРОК 160 PRINT ”ИЗ ОБЩЕГО ЧИСЛА ”;Т;” ПРОВЕРОК 165 PRINT Р;” ПРОВЕРОК С ПОЛОЖИТЕЛЬНЫМ РЕЗУЛЬТАТОМ” 170 PRINT ’’ДОЛЯ УСПЕШНЫХ ПРОВЕРОК = ”;Р / Т 180 PRINT : REM ПРОПУСК СТРОКИ 190 GOTO НО: REM ПОВТОРЕНИЕ ИГРЫ Программа 13.1 9000 9010 9020 9030 9040 9050 9060 9070 9080 9090 9100 9110 9120 9130 9140 REM DATE1: ПОДПРОГРАММА ОПРЕДЕЛЕНИЯ ПОРЯДКОВОГО НОМЕРА REM ЗАДАННОГО ДНЯ ОТНОСИТЕЛЬНО 31 ДЕКАБРЯ 1599 ГОДА REM REM ВХОДНЫЕ ДАННЫЕ: М — МЕСЯЦ (1 — 12) REM D — ДЕНЬ МЕСЯЦА REM Y — ГОД ( > = 1600) REM REM ВЫХОДНЫЕ ДАННЫЕ: DY — ПОРЯДКОВЫЙ НОМЕР ЗАДАННОГО ДНЯ ОТНОСИТЕЛЬНО 31 ДЕКАБРЯ 1599 ГОДА REM REM ПРОЦЕДУРА АНАЛИЗА КОРРЕКТНОСТИ ЗАДАННОЙ ДАТЫ, REM ВЫВОДА СООБЩЕНИЯ ОБ ОШИБКЕ, ЕСЛИ ДАТА ЗАДАНА НЕКОРРЕКТНО, И ВЫДАЧИ ЗАПРОСА О ВВОДЕ НОВОЙ ДАТЫ REM IF SW = 1 THEN 9250: REM ЕСЛИ SW = 1, ОПЕРАТОРЫ 9130 — 9240 НЕ ВЫПОЛНЯЮТСЯ И ОСУЩЕСТВЛЯЕТСЯ ПЕРЕХОД К СТРОКЕ 9250 DIM МТ (12) МТ(1) = 31: REM В ЯНВАРЕ 31 ДЕНЬ
310 Приложение 9150 9160 9170 9180 9190 9200 9210 9220 9230 9240 9250 9260 9270 9280 9290 9300 9310 9320 9330 9340 9350 9360 9370 9380 9390 9400 9410 9420 9430 9440 9450 9460 9470 9480 9490 9500 9510 9520 9530 9800 9810 9820 9830 9840 9850 9860 В МАРТЕ 31 ДЕНЬ в В в в в в в REM REM REM REM REM REM REM АПРЕЛЕ 30 ДНЕЙ МАЕ 31 ДЕНЬ ИЮНЕ 30 ДНЕЙ ИЮЛЕ 31 ДЕНЬ АВГУСТЕ 31 ДЕНЬ СЕНТЯБРЕ 30 ДНЕЙ ОКТЯБРЕ 31 ДЕНЬ В НОЯБРЕ 30 ДНЕЙ В ДЕКАБРЕ 31 ДЕНЬ МТ(3) = 31: МТ (4) = 30: МТ (5) = 31: МТ (6) = 30: МТ (7) = 31: МТ (8) = 31: МТ (9) = 30: МТ (10) =31: REM МТ (11) = 30: REM МТ (12) = 31: REM SW = 1: GOSUB 9800 МТ (2) = 28 + L: REM В ФЕВРАЛЕ 28 ИЛИ 29 ДНЕЙ (ВИСОКОСНЫЙ ГОД) IF М < 1 OR М > 12 THEN 9310 IF D < 1 OR D > МТ (М) THEN 9310 IF Y < 1600 THEN 9310 GOTO 9370 PRINT ’’НЕКОРРЕКТНАЯ ДАТА. ПОЖАЛУЙСТА, ВВЕДИТЕ НОВУЮ ДАТУ” INPUT ’’ВВЕДИТЕ МЕСЯЦ, ДЕНЬ, ГОД ”;M,D,Y GOSUB 9800: GOTO 9260 REM REM ВЫЧИСЛЕНИЕ DY — ПОРЯДКОВОГО НОМЕРА ЗАДАННОГО ДНЯ В ТЕКУЩЕМ ГОДУ REM DY = D IF М = 1 THEN 9420 FOR I = 1 ТО М — 1 DY = DY + МТ (I): REM ДОБАВЛЕНИЕ КОЛИЧЕСТВА ДНЕЙ ПРЕДЫДУЩИХ МЕСЯЦЕВ NEXT I REM REM ВЫЧИСЛЕНИЕ DY — ПОРЯДКОВОГО НОМЕРА ЗАДАННОГО ДНЯ REM ОТНОСИТЕЛЬНО 31 ДЕКАБРЯ 1599 ГОДА REM YR = Y: REM ЗАПИСЬ ЗНАЧЕНИЯ Y НА ХРАНЕНИЕ В YR IF YR = 1600 THEN RETURN FOR Y = 1600 TO YR — 1 GOSUB 9800: REM ПЕРЕХОД К ПОДПРОГРАММЕ ОПРЕДЕЛЕНИЯ, ЯВЛЯЕТСЯ ЛИ ДАННЫЙ ГОД високосным DY = DY + 365 + L: REM ДОБАВЛЕНИЕ КОЛИЧЕСТВА ДНЕЙ ПРЕДЫДУЩИХ ЛЕТ NEXT Y Y = YR: REM ВОССТАНОВЛЕНИЕ ИСХОДНОГО ЗНАЧЕНИЯ ПЕРЕМЕННОЙ Y RETURN REM ПОДПРОГРАММА ОПРЕДЕЛЕНИЯ, ЯВЛЯЕТСЯ ЛИ ДАННЫЙ REM ГОД ВИСОКОСНЫМ REM REM ВВОД ЗНАЧЕНИЯ ПЕРЕМЕННОЙ Y ~ ЗАДАННОГО ГОДА REM ВЫВОД ЗНАЧЕНИЯ ПЕРЕМЕННОЙ L: REM ПРИ L = 1 « ГОД ВИСОКОСНЫЙ. L = 0 « НЕТ REM
Приложение 311 9870 IF Y < > INT (Y / 4) * 4 THEN L = 0: RETURN: REM ЕСЛИ Y HE ДЕЛИТСЯ HA 4 БЕЗ ОСТАТКА, TO ГОД НЕВИСОКОСНЫЙ 9880 IF Y < > INT (Y / 100) * 100 THEN L = 1: RETURN: REM ЕСЛИ Y ДЕЛИТСЯ HA 4 БЕЗ ОСТАТКА И HE ДЕЛИТСЯ НА 100, ТО ГОД ВИСОКОСНЫЙ 9890 IF Y = INT (Y / 400) * 400 THEN L = 1: RETURN: REM ЕСЛИ Y ДЕЛИТСЯ БЕЗ ОСТАТКА НА 400, ТО ГОД високосный 9900 L = 0: RETURN: REM ЕСЛИ ЗНАЧЕНИЕ ПЕРЕМЕННОЙ Y ОКАНЧИВАЕТСЯ ЦИФРАМИ 00 И НЕ ДЕЛИТСЯ НА 400 БЕЗ ОСТАТКА, ТО ГОД НЕВИСОКОСНЫЙ Программа 13.2 100 REM ПРОГРАММА ОПРЕДЕЛЕНИЯ ДНЯ НЕДЕЛИ ЛЮБОЙ 110 REM ДАТЫ ПОСЛЕ 1600 ГОДА 120 DIM NMg (6): REM РЕЗЕРВИРОВАНИЕ ПАМЯТИ ДЛЯ НАЗВАНИЙ ДНЕЙ НЕДЕЛИ 130 NMg (0) = ’’ПЯТНИЦА” 140 NMg (1) = ’’СУББОТА” 150 NMg (2) = ’’ВОСКРЕСЕНЬЕ” 160 NMg (3) = ’’ПОНЕДЕЛЬНИК” 170 NMg (4) = ’’ВТОРНИК” 180 NMg (5) = ’’СРЕДА” 190 NMg (6) = ’’ЧЕТВЕРГ” 200 НОМЕ : VTAB (10) : REM ОЧИСТКА ЭКРАНА ДИСПЛЕЯ И ПОЗИЦИОНИРОВАНИЕ КУРСОРА В СЕРЕДИНЕ ПОЛЯ ЭКРАНА 210 PRINT ’’ВВЕДИТЕ ЧИСЛОВЫЕ ЗНАЧЕНИЯ МЕСЯЦА, ДНЯ И ГОДА” 220 INPUT M,D,Y 230 GOSUB 9000 240 I = DY — 7 * INT (DY / 7) 250 PRINT NMg (I) 260 END 9000 REM DATEI: ПОДПРОГРАММА ОПРЕДЕЛЕНИЯ ПОРЯДКОВОГО НОМЕРА 9010 REM ЗАДАННОГО ДН/Я ОТНОСИТЕЛЬНО 31 ДЕКАБРЯ 1599 ГОДА 9020 REM 9030 REM ВХОДНЫЕ ДАННЫЕ: М — МЕСЯЦ (1 — 12) 9040 REM D — ДЕНЬ МЕСЯЦА 9050 REM Y — ГОД ( > = 1600) 9060 REM 9070 REiM ВЫХОДНЫЕ ДАННЫЕ: DY — ПОРЯДКОВЫЙ НОМЕР ЗАДАННОГО ДНЯ ОТНОСИТЕЛЬНО 31 ДЕКАБРЯ 1599 ГОДА 9080 REM 9090 REM ПРОЦЕДУРА АНАЛИЗА КОРРЕКТНОСТИ ЗАДАННОЙ ДАТЫ, 9100 REM ВЫВОДА СООБЩЕНИЯ ОБ ОШИБКЕ, ЕСЛИ ДАТА ЗАДАНА НЕКОРРЕКТНО, И ВЫДАЧИ ЗАПРОСА О ВВОДЕ НОВОЙ ДАТЫ 9110 REM
312 Приложение 9120 9130 9140 9150 9160 9170 9180 9190 9200 9210 9220 9230 9240 9250 9260 IF SW = 1 THEN 9250: REM ЕСЛИ SW = 1, ОПЕРАТОРЫ 9130 — 9240 НЕ ВЫПОЛНЯЮТСЯ И ОСУЩЕСТВЛЯЕТСЯ ПЕРЕХОД К СТРОКЕ 9250 DIM МТ(12) = 31: = 31: = 30: = 31: = 30: = 31: = 31: = 30: = 31: = 30: = 31: МТ(1) МТ(3) МТ(4) МТ(5) МТ (6) МТ(7) МТ(8) МТ(9) МТ(10) МТ(11) МТ(12) В В в в в в в в в в в SW' = 1: GOSUB 9800 МТ(2) = 28 -I- L: REM В ФЕВРАЛЕ 28 ИЛИ 29 ДНЕЙ (ВИСОКОСНЫЙ ГОД) REM REM REM REM REM REM REM REM REM REM REM ЯНВАРЕ 31 ДЕНЬ МАРТЕ 31 ДЕНЬ АПРЕЛЕ 30 ДНЕЙ МАЕ 31 ДЕНЬ ИЮНЕ 30 ДНЕЙ ИЮЛЕ 31 ДЕНЬ АВГУСТЕ 31 ДЕНЬ СЕНТЯБРЕ 30 ДНЕЙ ОКТЯБРЕ 31 ДЕНЬ НОЯБРЕ 30 ДНЕЙ ДЕКАБРЕ 31 ДЕНЬ 9270 IF М < 1 OR М > 12 THEN 9310 9280 IF D < 1 OR D > МТ(М) THEN 9310 9290 IF Y < 1600 THEN 9310 9300 GOTO 9370 9310 PRINT ’’НЕКОРРЕКТНАЯ ДАТА. ПОЖАЛУЙСТА, ВВЕДИТЕ НОВУЮ ДАТУ” 9320 INPUT ’’ВВЕДИТЕ МЕСЯЦ, ДЕНЬ, ГОД ”;M,D,Y 9330 GOSUB 9800: GOTO 9260 9340 REM 9350 REM ВЫЧИСЛЕНИЕ DY — ПОРЯДКОВОГО НОМЕРА ЗАДАННОГО ДНЯ В ТЕКУЩЕМ ГОДУ 9360 REM 9370 DY = D 9380 IF М = 1 THEN 9420 9390 FOR I = 1 ТО М - 1 9400 DY = DY + MT(I): REM ДОБАВЛЕНИЕ КОЛИЧЕСТВА ДНЕЙ ПРЕДЫДУЩИХ МЕСЯЦЕВ 9410 NEXT I 9420 REM 9430 REM ВЫЧИСЛЕНИЕ DY — ПОРЯДКОВОГО НОМЕРА ЗАДАННОГО ДНЯ 9440 REM ОТНОСИТЕЛЬНО 31 ДЕКАБРЯ 1599 ГОДА 9450 REM 9460 YR = Y: REM ЗАПИСЬ ЗНАЧЕНИЯ Y НА ХРАНЕНИЕ В YR 9470 IF YR = 1600 THEN RETURN 9480 FOR Y = 1600 TO YR — 1 9490 GOSUB 9800: REM ПЕРЕХОД К ПОДПРОГРАММЕ ОПРЕДЕЛЕНИЯ, ЯВЛЯЕТСЯ ЛИ ДАННЫЙ ГОД ВИСОКОСНЫМ 9500 DY = DY + 365 + L: REM ДОБАВЛЕНИЕ КОЛИЧЕСТВА ДНЕЙ ПРЕДЫДУЩИХ ЛЕТ 9510 NEXT Y 9520 Y = YR: REM ВОССТАНОВЛЕНИЕ ИСХОДНОГО ЗНАЧЕНИЯ ПЕРЕМЕННОЙ Y 9530 RETURN 9800 REM ПОДПРОГРАММА ОПРЕДЕЛЕНИЯ, ЯВЛЯЕТСЯ ЛИ ДАННЫЙ 9810 REM ГОД ВИСОКОСНЫМ 9820 REM
Приложение 313 9830 REM ВВОД ЗНАЧЕНИЯ ПЕРЕМЕННОЙ Y — ЗАДАННОГО ГОДА 9840 REM ВЫВОД ЗНАЧЕНИЯ ПЕРЕМЕННОЙ L: 9850 REM ПРИ L = 1 — ГОД ВИСОКОСНЫЙ, L = 0 — НЕТ 9860 REM 9870 IF Y < > INT (Y / 4) * 4 THEN L = 0: RETURN: REM ЕСЛИ Y HE ДЕЛИТСЯ HA 4 БЕЗ ОСТАТКА, TO ГОД НЕВИСОКОСНЫЙ 9880 IF Y < > INT(Y / 100) * 100 THEN L = 1: RETURN: REM ЕСЛИ Y ДЕЛИТСЯ HA 4 БЕЗ ОСТАТКА И HE ДЕЛИТСЯ НА 100, ТО ГОД ВИСОКОСНЫЙ 9890 IF Y = INT (Y I 400) * 400 THEN L = 1: RETURN: REM ЕСЛИ Y ДЕЛИТСЯ БЕЗ ОСТАТКА НА 400, ТО ГОД ВИСОКОСНЫЙ 9900 L = 0: RETURN: REM ЕСЛИ ЗНАЧЕНИЕ ПЕРЕМЕННОЙ Y ОКАНЧИВАЕТСЯ ЦИФРАМИ 00 И НЕ ДЕЛИТСЯ НА 400 БЕЗ ОСТАТКА, ТО ГОД НЕВИСОКОСНЫЙ Программа 14.1 100 DIM NT$(12): REM РЕЗЕРВИРОВАНИЕ ПАМЯТИ ДЛЯ ТАБЛИЦЫ НАЗВАНИЙ МЕСЯЦЕВ ПО NT$(1) = ’’ЯНВАРЬ” 120 NT$(2) = ’’ФЕВРАЛЬ” 130 NT$(3) = ’’МАРТ” 140 NT$(4) = ’’АПРЕЛЬ” 150 NT§(5) = ’’МАЙ” 160 NT$(6) = ’’ИЮНЬ” 170 NT$(7) = ’’ИЮЛЬ” 180 NTS(8) = ’’АВГУСТ” 190 NT$(9) = ’’СЕНТЯБРЬ” 200 NT$(10) = ’’ОКТЯБРЬ” 210 NT$(11) = ’’НОЯБРЬ” 220 NTS(12) = ’’ДЕКАБРЬ” 230 INPUT ’’ВВЕДИТЕ НАЗВАНИЕ МЕСЯЦА ”;MN$ 240 REM ПОИСК ЗАДАННОГО МЕСЯЦА В ТАБЛИЦЕ 250 FOR М = 1 ТО 12 260 IF NT$(M) = MN§ THEN 300 270 NEXT M 280 REM ВЫВОД СООБЩЕНИЯ ОБ ОШИБКЕ, ЕСЛИ МЕСЯЦ В ТАБЛИЦЕ НЕ НАЙДЕН 290 PRINT’’НЕКОРРЕКТНОЕ НАЗВАНИЕ МЕСЯЦА”: GOTO 230 300 INPUT ’’ВВЕДИТЕ ГОД ”;У 310 D = 1: REM D — ПОРЯДКОВЫЙ НОМЕР ДНЯ В МЕСЯЦЕ 320 GOSUB 9000: REM ОБРАЩЕНИЕ К ПОДПРОГРАММЕ DATE1 330 I - DY + 5 — 7 * INT((DY -|- 5) /7): REM ОПРЕДЕЛЕНИЕ ДНЯ НЕДЕЛИ ПЕРВОГО ЧИСЛА ЗАДАННОГО МЕСЯЦА 400 НОМЕ 410 НТ АВ (14) 420 PRINT NM$;” ”;Y 430 VTA В (3) 440 PRINT ” ВС ПН ВТ СР ЧТ ПТ СБ” 460 PRINT” ” 470 NL = INT((6 + МТ(М) I)/ 7): REM ОПРЕДЕЛЕНИЕ КОЛИЧЕСТВА РЯДОВ КЛЕТОК В ТАБЛИЦЕ КАЛЕНДАРЯ ЗАДАННОГО МЕСЯЦА
814 Приложение 500 REM ОТОБРАЖЕНИЕ ТАБЛИЦЫ НА ЭКРАНЕ ДИСПЛЕЯ 510 FOR J = 1 ТО NL: REM ЦИКЛ ОТОБРАЖЕНИЯ NL РЯДОВ КЛЕТОК 520 PRINT ” ” 530 PRINT ” ” 540 PRINT ” ” 550 NEXT J 600 Y = 7: REM НАЧАЛО ЗАПОЛНЕНИЯ ЧИСЛАМИ ПЕРВОГО РЯДА КЛЕТОК ТАБЛИЦЫ КАЛЕНДАРЯ 610 X = 3 + 5 * I: REM ЗАДАНИЕ КООРДИНАТЫ ПОЛОЖЕНИЯ КУРСОРА ВДОЛЬ ОСИ АБСЦИСС ДЛЯ ПЕРВОГО ЧИСЛА МЕСЯЦА 620 FOR J = 1 ТО МТ(М) 630 VTAB (Y): НТАВ (X): REM ПОЗИЦИОНИРОВАНИЕ КУРСОРА В ИСХОДНОЕ ПОЛОЖЕНИЕ 640 PRINT J; 650 IF X < 33 THEN X = X + 5: GOTO 670: REM ЗАПОЛНЕНИЕ ТЕКУЩЕГО РЯДА КЛЕТОК ТАБЛИЦЫ 660 X = 3:Y = Y + 3: REM ПЕРЕХОД К ЗАПОЛНЕНИЮ СЛЕДУЮЩЕГО РЯДА КЛЕТОК ТАБЛИЦЫ 670 NEXT J 680 VTAB (24): НТАВ (40): GET Z$: REM ПЕРЕХОД К ФОРМИРОВАНИЮ НОВОЙ ТАБЛИЦЫ ПРИ НАЖАТИИ ЛЮБОЙ КЛАВИШИ ДИСПЛЕЯ 690 НОМЕ : GOTO 230 9000 REM 9010 REM * * * * ДАЛЕЕ СЛЕДУЕТ КОПИЯ ПОДПРОГРАММЫ DATE1 * * * # Программа 15.1 100 НОМЕ 110 DIM NM$(12): REM РЕЗЕРВИРОВАНИЕ ПАМЯТИ ДЛЯ ТАБЛИЦЫ НАЗВАНИЙ МЕСЯЦЕВ 120 NM$(1) = ’’ЯНВАРЬ” 130 NMS(2) = ’’ФЕВРАЛЬ” 140 NM$(3) = ’’МАРТ” 150 NM$(4) = ’’АПРЕЛЬ” 160 NM$(5) = ’’МАЙ” 170 NM$(6) = ’’ИЮНЬ” 180 NM§(7) = ’’ИЮЛЬ” 190 NMS(8) = ’’АВГУСТ” 200 NM§(9) = ’’СЕНТЯБРЬ” 210 NMS(10) = ’’ОКТЯБРЬ” 220 NMS(ll) = ’’НОЯБРЬ” 230 NMS(12) = ’’ДЕКАБРЬ” 240 INPUT ’’ВВЕДИТЕ ВАШУ ФАМИЛИЮ ”;N$ 250 PRINT : PRINT ’’ВВЕДИТЕ МЕСЯЦ, ДЕНЬ, ГОД ВАШЕГО РОЖДЕНИЯ” 260 INPUT M,D,Y 265 IF Y < 1900 THEN Y = Y + 1900 270 GOSUB 9000: REM ОБРАЩЕНИЕ К ПОДПРОГРАММЕ DATE1 ДЛЯ ОПРЕДЕЛЕНИЯ КОЛИЧЕСТВА ДНЕЙ, ПРОШЕДШИХ С 31 ДЕКАБРЯ 1599 ГОДА ДО ДНЯ РОЖДЕНИЯ 300 BD = DY: REM И ЗАПИСЬ ВЫЧИСЛЕННОГО ЗНАЧЕНИЯ ДЛЯ ХРАНЕНИЯ В BD
Приложение 315 310 PRINT : PRINT ’’ВВЕДИТЕ МЕСЯЦ И ГОД, НАЗНАЧЕННЫЕ ДЛЯ ПОСТРОЕНИЯ ГРАФИКОВ БИОРИТМОВ” 320 INPUT M,Y 323 IF Y < 1900 THEN Y = Y + 1900 330 D = 1: REM НАЧАЛО ГРАФИКОВ БИОРИТМОВ ПРИХОДИТСЯ НА ПЕРВЫЙ ДЕНЬ МЕСЯЦА 340 GOSUB 9000: REM ОБРАЩЕНИЕ К ПОДПРОГРАММЕ DATE1 ДЛЯ ОПРЕДЕЛЕНИЯ КОЛИЧЕСТВА ДНЕЙ ОТ 31 ДЕКАБРЯ 1599 ГОДА ДО ПЕРВОГО ЧИСЛА ЗАДАННОГО МЕСЯЦА 370 А = DY — BD: REM ОПРЕДЕЛЕНИЕ ВОЗРАСТА В ДНЯХ НА ПЕРВОЕ ЧИСЛО ЗАДАННОГО МЕСЯЦА 380 НОМЕ 390 HGR 400 HPLOT 0,75 ТО 270,75: REM ПОСТРОЕНИЕ ОСИ АБСЦИСС 410 FOR X = 0 ТО 270 STEP 9 420 HPLOT Х,73 ТО Х,77: REM НАНЕСЕНИЕ ДЕЛЕНИЙ НА ОСЬ АБСЦИСС 430 NEXT X 440 DEF FN Y(X) = 75 — 75 * SIN (6.2832 * X / P): REM ОПРЕДЕЛЕНИЕ ДИАПАЗОНА ЗНАЧЕНИЙ ФУНКЦИИ ПО ОСИ ОРДИНАТ 450 Р = 23:ВК = 1: GOSUB 600 460 Р = 28:ВК = 2/3: GOSUB 600 470 Р = 33:ВК = 1 / 3: GOSUB 600 510 VTAB (21) 520 PRINT ’ТРАФИК БИОРИТМОВ ДЛЯ ”;N$ 530 PRINT ”НА ”;NM$(M);” ”;Y;” ГОДА” 540 END 600 REM ПОДПРОГРАММА ПОСТРОЕНИЯ ОДНОГО БИОРИТМИЧЕСКОГО ЦИКЛА ШТРИХОВЫМИ ЛИНИЯМИ 610 REM ДЛИНА ШТРИХОВ ОПРЕДЕЛЯЕТСЯ ПЕРЕМЕННОЙ ВК 620 REM ФИЗИЧЕСКИЙ ЦИКЛ Р = 23, ВК = 1 630 REM ЭМОЦИОНАЛЬНЫЙ ЦИКЛ Р = 28, ВК = 2 / 3 640 REM ИНТЕЛЛЕКТУАЛЬНЫЙ ЦИКЛ Р = 33, ВК = 1 / 3 650 REM 660 HPLOT 9, FN Y(A) 670 FOR I = 2 TO MT(M) 680 HPLOT TO 0 * (I — 2) + BK * 9, FN Y(A + I — 2 + BK) 690 HPLOT 9 * (I — 1), FN Y(A + 1 — 1) 700 NEXT I 710 RETURN 9000 REM 9010 REM * * * ДАЛЕЕ СЛЕДУЕТ КОПИЯ ПОДПРОГРАММЫ DATE1 * * * ::= Программа 16.1 100 REM КОДИРОВАНИЕ СООБЩЕНИЙ ЗАМЕНОЙ СИМВОЛОВ 110 REM 120 REM ТАБЛИЦА ПЕРЕКОДИРОВКИ: А£(1) — СИМВОЛ ИСХОДНОГО СООБЩЕНИЯ, В$(1) — СИМВОЛ ЗАКОДИРОВАННОГО СООБЩЕНИЯ 130 DIM А$(29),В$(29) 140 А§(1) = ”А”:В$(1) = ”С” 150 А$(2) = ”В”:В$(2) = ”Е” 160 А$(3) = ”С”:В$(3) = ”G”
316 170 180 190 200 210 220 230 240 250 260 270 280 290 300 310 320 330 340 350 360 370 380 390 400 410 420 500 510 520 530 540 550 560 600 610 620 630 640 650 660 670 680 690 Приложение AS(4) = ”D”:B$(4) = ”1” A$(5) = ”E”:B$(5) = ”K” AS(6) = ”F”:B$(6) = ”M” A$(7) = ”G”:B$(7) = ”0” A$(8) = ”H”:BS(8) = ”Q” AS(9) = ”I”:BS(9) = ”S” A$(10) = ”J”:B$(10) = ”U” AS(ll). = ”K”:BS(H) = ”W” АЩ12) = ”L”:BS(12) = ”Y” AS(13) = ”Mr:BS(13) = ”Z” A$(14) = ”N”:B$(14) = ”X” AS(15) = ”O”:B$(15) = ”V” A$(16) = ”P”:B$(16) = ”T” AS(17) = ”Q”:B$(17) = ”R” A$(18) = ”R”:B$(18) = ”N” A$(19) = ”S”:BS(19) = ”L” A$(20) = ”T”:BS(20) = ”J” A$(21) = ”U”:BS(21) = ”H” M$(22) = ”V”:B$(22) = ”F” AS (23) = ”W” : BS (23) = ”D” AS (24) = ”X” : В$ (24) = ”B” AsS (25) = ”Y” : BS (25) = ”A” AS (26) = ”Z” : B$ (26) = ”P” AS (27) = : BS (27) = AS (28) = : BS (28) = AS (29) = ” ” : В$ (29) = ” ” HOME VTAB 10: HTAB 10 PRINT ’’ШИФРОВАЛЬНАЯ МАШИНА” VTAB 21 PRINT ’’ВЫБОР РЕЖИМА РАБОТЫ: КОДИРОВАНИЕ (С) ИЛИ ДЕКОДИРОВАНИЕ (D)” INPUT ’’ВВЕДИТЕ ’С2 ИЛИ 2D2”; Х$ IF XS = ”D” THEN 800 HOME I = 1 : J = 1 : REM ПОЗИЦИОНИРОВАНИЕ КУРСОРА: I — СТРОКА, J —СТОЛБЕЦ VTAB I : HTAB J : REM ПОЗИЦИОНИРОВАНИЕ КУРСОРА ДЛЯ ВЫВОДА ИСХОДНОГО ТЕКСТА СООБЩЕНИЯ GET XS : REM ВВОД СИМВОЛА ТЕКСТА IF XS = CHR$ (13) THEN 710: REM ЕСЛИ ВВЕДЕН СИМВОЛ ВОЗВРАТА КАРЕТКИ, ТО ПЕРЕХОД К НОВОЙ СТРОКЕ IF Х$ = CHRS(17) THEN END: REM ЕСЛИ ВВЕДЕН СИМВОЛ CTRL-Q, ТО ОКОНЧАНИЕ ВЫПОЛНЕНИЯ ПРОГРАММЫ FOR К = 1 ТО 29: REM ПОИСК ВВЕДЕННОГО СИМВОЛА В ТАБЛИЦЕ ПЕРЕКОДИРОВКИ IF AS (К) = XS THEN PRINT Xg; : VTAB I + 12: HTAB J PRINT B$(K);r GOTO 700: REM ЕСЛИ СИМВОЛ НАЙДЕН В ТАБЛИЦЕ ПЕРЕКОДИРОВКИ, ТО ВЫВОД ПАРЫ СИМВОЛОВ: ИСХОДНОГО И ЗАКОДИРОВАННОГО СООБЩЕНИЙ NEXT К PRINT CHRS (7); : GOTO 620: REM ЕСЛИ СИМВОЛ НЕ НАЙДЕН В ТАБЛИЦЕ ПЕРЕКОДИРОВКИ, ТО ПОДАЧА ЗВУКОВОГО СИГНАЛА И ВОЗВРАТ К НАЧАЛУ ПРОЦЕДУРЫ ВВОДА СИМВОЛА
Приложение 317 700 J = J + 1: IF J < 41 THEN 620: REM ПЕРЕМЕЩЕНИЕ КУРСОРА ВПРАВО 710 J = 1 : I = I 4- 1: IF I < 12 THEN 620 720 END 800 FOR I = 1 TO 28: W$ = A$ (I): A§ (I) = B$ (I) :B$ (I) = W$! NEXT I: REM ПЕРЕСТАНОВКА ЭЛЕМЕНТОВ ТАБЛИЦЫ ДЛЯ ДЕКОДИРОВАНИЯ 810 GOTO 600 840 END Программа 17.1 100 REM МИНИ-РЕДАКТОР ТЕКСТА ***** 110 REM 120 HOME 130 DIM CS (20, 40): REM ОБЛАСТЬ ПАМЯТИ ДЛЯ ТЕКСТА ОБРАБАТЫВАЕМОГО СООБЩЕНИЯ 200 FOR L = 1 ТО 20: FOR Р = 1 ТО 40 210 С$ (L, Р) = ” NEXT Р: NEXT L: REM ОЧИСТКА ТЕКСТОВОГО БУФЕРА 220 НОМЕ : REM ОЧИСТКА ЭКРАНА 230 L = 1 :Р = 1: REM УСТАНОВКА КУРСОРА В НАЧАЛЬНУЮ ПОЗИЦИЮ ЭКРАНА 240 VTAB L: НТАВ Р 250 GET XS 260 IF Х$ = CHR$(17) THEN 700: REM ОКОНЧАНИЕ ВЫПОЛНЕНИЯ ПРОГРАММЫ ПО ВВОДУ СИМВОЛА CTRL— Q 270 IF XS = CHRS (21) THEN 330: REM ВВОД СИМВОЛА CTRL —U ВЫЗЫВАЕТ ПЕРЕМЕЩЕНИЕ КУРСОРА ВПЕРЕД 280 IF XS = CHRS (8) THEN 400: REM ВВОД СИМВОЛА CTRL —Н ВЫЗЫВАЕТ ПЕРЕМЕЩЕНИЕ КУРСОРА НАЗАД 290 IF Х$ = CHRS (5) THEN 500: REM ВВОД СИМВОЛА CTRL —Е ВЫЗЫВАЕТ РАСШИРЕНИЕ СТРОКИ ЗА СЧЕТ ВКЛЮЧЕНИЯ ПРОБЕЛА 300 IF XS = CHR$ (4) THEN 600: REM ВВОД СИМВОЛА CTRL —D ВЫЗЫВАЕТ УДАЛЕНИЕ СИМВОЛА ИЗ СТРОКИ 310 IF Х$ = CHRS (13) THExN 450: REM ВВОД СИМВОЛА CTRL —М ВЫЗЫВАЕТ ПЕРЕХОД К НАЧАЛУ СЛЕДУЮЩЕЙ СТРОКИ 320 PRINT XS; : С$ (L, Р) = Х$: REM ЗАПИСЬ НОВОГО СИМВОЛА В ОБЛАСТЬ ПАМЯТИ ДЛЯ ТЕКСТА СООБЩЕНИЯ 330 Р = Р + 1; IF Р = 41 THEN Р = 1:L = L + 1: IF L = 21 THEN P = 40:L = 20; REM ПЕРЕМЕЩЕНИЕ КУРСОРА ВПРАВО 340 GOTO 240 400 P = P — 1: IF P = 0 THEN P = 40:L = L — 1: IF L = 0 THEN L = 1:P = 1 410 GOTO 240 450 P = 1:L = L + 1: IF L = 21 THEN L = 20 460 GOTO 240 500 IFCS(L, 40) < > ”” THEN PRINT CHR$ (7) ; : REM ЕСЛИ СИМВОЛ В ПОСЛЕДНЕЙ ПОЗИЦИИ СТРОКИ ОТЛИЧЕН ОТ ПРОБЕЛА, ТО ОН БУДЕТ ПОТЕРЯН, О ЧЕМ СВИДЕТЕЛЬСТВУЕТ ПОДАЧА ЗВУКОВОГО СИГНАЛА 510 IF Р = 40 THEN GOTO 240: REM РАСШИРЕНИЕ СТРОКИ ПУТЕМ ВКЛЮЧЕНИЯ ПРОБЕЛА В ПОЗИЦИЮ 40 НЕ ИМЕЕТ СМЫСЛА
318 Приложение 520 TP = 40:FP = 39 530 Cg (L, TP) = Cg (L, FP) : VTAB L: HTAB TP: PRINT C$ (L, TP): REM ПЕРЕСЫЛКА И ВЫВОД СИМВОЛА 540 IF FP > Р THEN FP = FP — 1:TP = TP — 1: GOTO 530: REM ПРОДОЛЖЕНИЕ ОПЕРАЦИИ ДО ТЕКУЩЕЙ ПОЗИЦИИ 550 С$ (L, Р) = ” ”: VTAB L: HTAB Р: PRINT ” : GOTO 240: REM ВЫВОД ПРОБЕЛА В ТЕКУЩЕЙ ПОЗИЦИИ И ВОЗВРАТ УПРАВЛЕНИЯ ОСНОВНОЙ ПРОЦЕДУРЕ 600 TP = P:FP = Р + 1 610 VTAB L : HTAB TP: REM ПОЗИЦИОНИРОВАНИЕ КУРСОРА 620 IF FP = 41 THEN Cg (L, 40) = ” ”: PRINT ” : GOTO 240: REM ПОСЛЕДНИЙ СИМВОЛ— ПРОБЕЛ, ВОЗВРАТ УПРАВЛЕНИЯ ОСНОВНОЙ ПРОЦЕДУРЕ 630 Cg (L, TP) = Cg (L, FP): PRINT Cg (L, FP); : REM ПЕРЕСЫЛКА Й ВЫВОД СИМВОЛА 640 TP = TP + 1:FP = FP + 1: REM УВЕЛИЧЕНИЕ НА 1 СОДЕРЖИМОГО СЧЕТЧИКОВ ТР И FP 650 GOTO 620 700 VTAB 22: PRINT ’’ОКОНЧАНИЕ РАБОТЫ” Программа 18.1 100 REM ***** МИНИ-РЕДАКТОР ТЕКСТА 110 REM 120 НОМЕ 130 DIM Cg (20, 40): REM ОБЛАСТЬ ПАМЯТИ ДЛЯ ТЕКСТА ОБРАБАТЫВАЕМОГО СООБЩЕНИЯ 200 FOR L = 1 ТО 20: FOR Р = 1 ТО 40 210 Cg (L, Р) = ” NEXT Р: NEXT L: REM ОЧИСТКА ТЕКСТОВОГО БУФЕРА 220 НОМЕ : REM ОЧИСТКА ЭКРАНА 230 L = 1:Р = 1: REM УСТАНОВКА КУРСОРА В НАЧАЛЬНУЮ ПОЗИЦИЮ ЭКРАНА 240 VTAB L: HTAB Р 250 GET Xg 260 IF Xg = CHRg (17) THEN 700: REM ОКОНЧАНИЕ ВЫПОЛНЕНИЯ ПРОГРАММЫ ПО ВВОДУ СИМВОЛА CTRL—Q 270 IF Xg = CHRg (21) THEN 330: REM ВВОД СИМВОЛА CTRL —U ВЫЗЫВАЕТ ПЕРЕМЕЩЕНИЕ КУРСОРА ВПЕРЕД 280 IF Xg = CHRg (8) THEN 400: REM ВВОД СИМВОЛА CTRL —H ВЫЗЫВАЕТ ПЕРЕМЕЩЕНИЕ КУРСОРА НАЗАД 290 IF Xg = CHRg (5) THEN 500: REM ВВОД СИМВОЛА CTRL —E ВЫЗЫВАЕТ РАСШИРЕНИЕ СТРОКИ ЗА СЧЕТ ВКЛЮЧЕНИЯ ПРОБЕЛА 300 IF Xg == CHRg (4) THEN 600: REM ВВОД СИМВОЛА CTRL —D ВЫЗЫВАЕТ УДАЛЕНИЕ СИМВОЛА ИЗ СТРОКИ 310 IF Xg = CHRg (13) THEN 450: REM ВВОД СИМВОЛА CTRL—M ВЫЗЫВАЕТ ПЕРЕХОД К НАЧАЛУ СЛЕДУЮЩЕЙ СТРОКИ 320 PRINT Xg; :Cg(L, Р) = Xg: REM ЗАПИСЬ НОВОГО СИМВОЛА В ОБЛАСТЬ ПАМЯТИ ДЛЯ ТЕКСТА СООБЩЕНИЯ 330 Р = Р + 1: IF Р = 41 THEN Р = 1:L = L + 1: IF L = 21 THEN P = 40:L = 20: REM ПЕРЕМЕЩЕНИЕ КУРСОРА ВПРАВО 340 GOTO 240 400 P = P — 1: IF P = 0 THEN P = 40;L = L — 1: IF L = 0 THEN L = 1:P = 1
Приложение 319 410 450 460 500 510 520 530 540 550 600 610 620 630 640 650 700 710 720 730 740 750 760 770 780 785 790 795 800 810 820 830 840 850 860 870 GOTO 240 Р = 1 : L = L + 1: IF L = 21 THEN L = 20 GOTO 240 IF C$(L, 40) < > ”” THEN PRINT CHRS (7) ; : REM ЕСЛИ СИМВОЛ В ПОСЛЕДНЕЙ ПОЗИЦИИ СТРОКИ ОТЛИЧЕН ОТ ПРОБЕЛА, ТО ОН БУДЕТ ПОТЕРЯН, О ЧЕМ СВИДЕТЕЛЬСТВУЕТ ПОДАЧА ЗВУКОВОГО СИГНАЛА IF Р = 40 THEN GOTO 240: REM РАСШИРЕНИЕ СТРОКИ ПУТЕМ ВКЛЮЧЕНИЯ ПРОБЕЛА В ПОЗИЦИЮ 40 НЕ ИМЕЕТ СМЫСЛА TP = 40.-FP = 39 Cg(L, TP) = С$ (L, FP) : VTAB L: НТАВ TP: PRINT С$ (L, ТР)з REM ПЕРЕСЫЛКА И ВЫВОД СИМВОЛА IF FP > Р THEN FP = FP — 1 : ТР = ТР — 1: GOTO 530: REM ПРОДОЛЖЕНИЕ ОПЕРАЦИИ ДО ТЕКУЩЕЙ ПОЗИЦИИ с$ (L, Р) = ” ” : VTAB L: НТАВ Р: PRINT ” : GOTO 240: REM ВЫВОД ПРОБЕЛА В ТЕКУЩЕЙ ПОЗИЦИИ И ВОЗВРАТ УПРАВЛЕНИЯ ОСНОВНОЙ ПРОЦЕДУРЕ TP = Р : FP = Р + 1 VTAB L : НТАВ TP: REM ПОЗИЦИОНИРОВАНИЕ КУРСОРА IF FP = 41 THEN C$(L, 40) = ” PRINT ” : GOTO 240: REM ПОСЛЕДНИЙ СИМВОЛ— ПРОБЕЛ, ВОЗВРАТ УПРАВЛЕНИЯ ОСНОВНОЙ ПРОЦЕДУРЕ CS(L, ТР) = С$(Ь, FP): PRINT С$ (L, FP) ; : REM ПЕРЕСЫЛКА И ВЫВОД СИМВОЛА TP = TP + 1:FP = FP + 1: REM УВЕЛИЧЕНИЕ НА 1 СОДЕРЖИМОГО СЧЕТЧИКОВ ТР И FP GOTO 620 DIM СТ (26): REM РЕЗЕРВИРОВАНИЕ ПАМЯТИ ДЛЯ ТАБЛИЦЫ ЧАСТОТ REM ФОРМИРОВАНИЕ ТАБЛИЦЫ ЧАСТОТ REM FOR 1 = 1 ТО 26 : СТ (I) = 0: NEXT I: REM ПРИСВОЕНИЕ ЭЛЕМЕНТАМ ТАБЛИЦЫ ЧАСТОТ НУЛЕВЫХ ЗНАЧЕНИЙ FOR L = 1 ТО 20: FOR Р = 1 ТО 40 Z = ASC (Cg (L, Р)): IF 64 < Z AND Z < 91 THEN CT (Z — 64) = CT (Z — 64) + 1 NEXT P: NEXT L VTAB 21: НТАВ 1: FOR I = 1 TO 26: REM ВЫВОД ТАБЛИЦЫ ЧАСТОТ PRINT CHR$ (I + 64) ; ” ” ; :• REM ВЫВОД БУКВЫ И ОДНОГО ПРОБЕЛА IF СТ (I) < 10 THEN PRINT : REM ВЫВОД ВТОРОГО ПРОБЕЛА, ЕСЛИ ЧИСЛО МЕНЬШЕ ЧЕМ 10 PRINT СТ (I) ; ; : REM ВЫВОД ЧИСЛА И ЗНАКА ДВОЕТОЧИЯ NEXT I REM ЗАМЕНА СИМВОЛОВ VTAB 24: НТАВ 36 PRINT CI-IR$ (7) ; : REM ПОДАЧА ЗВУКОВОГО СИГНАЛА, ПОСКОЛЬКУ ВЫВОДИТСЯ СИМВОЛ CTRL—G GET U§: REM ВВОД ПЕРВОГО СИМВОЛА С КЛАВИАТУРЫ Z = ASC (U$) : IF Z < 65 OR Z > 90 THEN 730 PRINT U$;”/”;: GET V$: REM ВВОД ВТОРОГО СИМВОЛА С КЛАВИАТУРЫ Z = ASC (V$): IF Z < 65 OR Z > 90 THEN 730 PRINT VS
320 Приложение 880 890 900 910 920 930 940 950 FOR L = 1 ТО 20: FOR P 1 TO 40 IF C$(L, P) = US THEN C$(L, P) = V$: GOTO 930 IF C$(L, P) = V$ THEN C$(L, P) = U$: GOTO 930 NEXT P: NEXT L GOTO 810 VTAB L: HTAB P: PRINT C$ (L, P) ; NEXT P: NEXT L GOTO 810 Программа 19.1 100 REM « » « * * МИНИ-РЕДАКТОР ТЕКСТА * * * * * 110 REM 120 HOME 130 DIM C$(20,40): REM ОБЛАСТЬ ПАМЯТИ ДЛЯ ТЕКСТА ОБРАБАТЫВАЕМОГО СООБЩЕНИЯ 200 FOR L = 1 ТО 20: FOR Р 1 ТО 40 210 CS(L.P) = ” NEXT Р: NEXT L: REM ОЧИСТКА ТЕКСТОВОГО БУФЕРА 220 НОМЕ : REM ОЧИСТКА ЭКРАНА 230 L = 1 :Р = 1: REM УСТАНОВКА КУРСОРА В НАЧАЛЬНУЮ ПОЗИЦИЮ ЭКРАНА 240 VTAB L: HTAB Р 250 GET Х$ 260 IF XS = CHRS (17) THEN 700: REM ОКОНЧАНИЕ ВЫПОЛНЕНИЯ ПРОГРАММЫ ПО ВВОДУ СИМВОЛА CTRL—О 270 IF Х$ =- CHR$ (21) THEN 330: REM ВВОД СИМВОЛА CTRL — U ВЫЗЫВАЕТ ПЕРЕМЕЩЕНИЕ КУРСОРА ВПЕРЕД 280 IF XS = CHRS (8) THEN 400: REM ВВОД СИМВОЛА CTRL — Н ВЫЗЫВАЕТ ПЕРЕМЕЩЕНИЕ КУРСОРА НАЗАД 290 IF XS - = CHR$ (5) THEN 500: REM ВВОД СИМВОЛА CTRL — Е ВЫЗЫВАЕТ РАСШИРЕНИЕ СТРОКИ ЗА СЧЕТ ВКЛЮЧЕНИЯ ПРОБЕЛА 300 IF Х$ = CHR$ (4) THEN 600: REM ВВОД СИМВОЛА CTRL — D ВЫЗЫВАЕТ УДАЛЕНИЕ СИМВОЛА ИЗ СТРОКИ 310 IF Х$ = CHRS (13) THEN 450: REM ВВОД СИМВОЛА CTRL — М ВЫЗЫВАЕТ ПЕРЕХОД К НАЧАЛУ СЛЕДУЮЩЕЙ СТРОКИ 320 PRINT XS; :CS(L,P) = Х$: REM ЗАПИСЬ НОВОГО СИМВОЛА В ОБЛАСТЬ ПАМЯТИ ДЛЯ ТЕКСТА СООБЩЕНИЯ 330 Р = Р + 1: IF Р = 41 THEN Р = 1 :L — L + 1: IF L = 21 THEN Р = 40:L = 20: REM ПЕРЕМЕЩЕНИЕ КУРСОРА ВПРАВО 340 GOTO 240 400 Р = Р — 1: IF Р = 0 THEN Р = 40:L = L — 1: IF L = 0 THEN L = 1 :P = 1 410 GOTO 240 450 P = 1 :L - L -}- 1: IF L = 21 THEN L = 20 460 GOTO 240 500 IF CS(L,40) < > ” ” THEN PRINT CHR$(7) ;: REM ЕСЛИ СИМВОЛ В ПОСЛЕДНЕЙ ПОЗИЦИИ СТРОКИ ОТЛИЧЕН ОТ ПРОБЕЛА, ТО ОН БУДЕТ ПОТЕРЯН, О ЧЕМ СВИДЕТЕЛЬСТВУЕТ ПОДАЧА ЗВУКОВОГО СИГНАЛА 510 IF Р = 40 THEN GOTO 240: REM РАСШИРЕНИЕ СТРОКИ ПУТЕМ ВКЛЮЧЕНИЯ ПРОБЕЛА В ПОЗИЦИЮ 40 НЕ ИМЕЕТ СМЫСЛА
Приложение 321 520 TP = 40:FP = 39 530 C$(L,TP) = C$(L,FP); VTAB L: HTAB TP: PRINT C$(L,TP): REM ПЕРЕСЫЛКА И ВЫВОД СИМВОЛА 540 IF FP > Р THEN FP = FP — 1:TP = TP — 1: GOTO 530: REM ПРОДОЛЖЕНИЕ ОПЕРАЦИИ ДО ТЕКУЩЕЙ ПОЗИЦИИ 550 C$(L,P) = " ”:VTAB L: HTAB P: PRINT ” GOTO 240: REM ВЫВОД ПРОБЕЛА В ТЕКУЩЕЙ ПОЗИЦИИ И ВОЗВРАТ УПРАВЛЕНИЯ К ОСНОВНОЙ ПРОЦЕДУРЕ 600 TP = P:FP = Р + I 610 VTAB L:HTAB TP: REM ПОЗИЦИОНИРОВАНИЕ КУРСОРА 620 IF FP = 41 THEN C$(L,40) = ” ”: PRINT ” GOTO 240: REM ПОСЛЕДНИЙ СИМВОЛ— ПРОБЕЛ, ВОЗВРАТ УПРАВЛЕНИЯ К ОСНОВНОЙ ПРОЦЕДУРЕ 630 C$(L,TP) = C$(L,FP): PRINT C$(L,FP);: REM ПЕРЕСЫЛКА И ВЫВОД СИМВОЛА 640 TP = TP + 1:FP = FP + h REM УВЕЛИЧЕНИЕ НА 1 СОДЕРЖИМОГО СЧЕТЧИКОВ ТР И FP 650 GOTO 620 700 REM КОДИРОВАНИЕ СЛУЧАЙНЫМ СМЕЩЕНИЕМ КОДОВ 710 REM 720 VTAB 21: HTAB 1 730 INPUT ’’ВВЕДИТЕ СТАРТОВОЕ ЗНАЧЕНИЕ АРГУМЕНТА ФУНКЦИИ RND”;SEED 740 IF SEED > = 0 THEN PRINT CHR$ (7): GOTO 720 750 X = RND (SEED): REM ПРИСВОЕНИЕ АРГУМЕНТУ ФУНКЦИИ RND СТАРТОВОГО ЗНАЧЕНИЯ 760 PRINT ’’ВЫБОР РЕЖИМА РАБОТЫ: С — КОДИРОВАНИЕ; D — ДЕКОДИРОВАНИЕ” 770 PRINT ’’УКАЖИТЕ РЕЖИМ РАБОТЫ (С ИЛИ D) GET Х$ 780 IF Х$ = ”D” THEN 900 790 IF Xg = ”C” THEN 1000 800 PRINT CHR$ (7);: GOTO 760 900 VTAB 1: HTAB 1 910 FOR L = 1 TO 20: FOR P = 1 TO 40 915 Z = ASC (C$(L,P)): IF Z < 65 OR Z > 90 THEN PRINT C$(L,P);: GOTO 950: REM СИМВОЛЫ, HE ЯВЛЯЮЩИЕСЯ ЛАТИНСКИМИ БУКВАМИ, ИГНОРИРУЮТСЯ 920 Z = Z + INT(26 * RND(l)): REM ПРИМЕНЯЕТСЯ СЛУЧАЙНОЕ СМЕЩЕНИЕ ДЛЯ КОДИРОВАНИЯ СООБЩЕНИЯ 930 IF Z > 90 THEN Z = Z — 26: REM ПРИНИМАЮТСЯ МЕРЫ В СЛУЧАЕ ВОЗМОЖНОГО ВЫХОДА ЗНАЧЕНИЙ КОДОВ ЗА ДОПУСТИМЫЕ ПРЕДЕЛЫ 940 PRINT CHR$ (Z); 950 NEXT P: NEXT L 960 END 1000 VTAB 1: HTAB 1 1010 FOR L = 1 TO 20: FOR P = 1 TO 40 1015 Z = ASC (C$(L,P)): IF Z < 65 OR Z > 90 THEN PRINT C$(L,P);: GOTO 1050: REM СИМВОЛЫ, HE ЯВЛЯЮЩИЕСЯ ЛАТИНСКИМИ БУКВАМИ, ИГНОРИРУЮТСЯ 1020 Z = Z — INT(26 * RND(l)): REM ЗАДАНИЕ ОБРАТНОГО СЛУЧАЙНОГО СМЕЩЕНИЯ ДЛЯ ДЕКОДИРОВАНИЯ СООБЩЕНИЯ 1030 IF Z < 65 THEN Z = Z + 26: REM ПРИНИМАЮТСЯ МЕРЫ В СЛУЧАЕ ВОЗМОЖНОГО ВЫХОДА ЗНАЧЕНИЙ КОДОВ ЗА ДОПУСТИМЫЕ ПРЕДЕЛЫ 'П 11 № 989
322 Приложение 1040 PRINT CHRS (Z); 1050 NEXT P: NEXT L 1060 END Программа 20.1 100 REM ПОСТРОЕНИЕ ГРАФИКА ИЗМЕНЕНИЯ ВО ВРЕМЕНИ ВЫСОТЫ ПО REM МЯЧА, БРОШЕННОГО ВЕРТИКАЛЬНО ВВЕРХ 120 НОМЕ 130 DT = .1: REM ОТСЧЕТ ВРЕМЕНИ ВЕДЕТСЯ ЧЕРЕЗ ИНТЕРВАЛЫ, РАВНЫЕ 0,1 СЕК 140 INPUT ’’ЗАДАЙТЕ НАЧАЛЬНУЮ СКОРОСТЬ: ”;V: REM ВВОД ВЕЛИЧИНЫ НАЧАЛЬНОЙ СКОРОСТИ МЯЧА 150 DEF FN Т(Т) = 27 * Т: REM ФУНКЦИЯ МАСШТАБИРОВАНИЯ ОСИ ВРЕМЕНИ 160 DEF FN Y(Y) = 159 — Y /2: REM ФУНКЦИЯ МАСШТАБИРОВАНИЯ ОСИ ОРДИНАТ 170 HGR : HCOLOR = 7: REM РЕЖИМ РАБОТЫ ДИСПЛЕЯ ГРАФИЧЕСКИЙ, С ВЫСОКОЙ РАЗРЕШАЮЩЕЙ СПОСОБНОСТЬЮ, ЦВЕТ—БЕЛЫЙ 180 REM ПОСТРОЕНИЕ ИЗОБРАЖЕНИЯ ОСЕЙ КООРДИНАТ 190 HPLOT FN Т (0), FN Y(0) ТО FN Т(10), FN Y(0) 200 HPLOT FN T(0), FN Y(0) TO FN T(0), FN Y(300) 210 REM НАНЕСЕНИЕ ДЕЛЕНИЙ НА ОСЬ ОРДИНАТ 220 FOR Y = 10 ТО 300 STEP 10 230 HPLOT FN T(0), FN Y(Y) TO FN T(.2), FN Y(Y) 240 NEXT Y 250 REM НАНЕСЕНИЕ ДЕЛЕНИЙ НА ОСЬ ВРЕМЕНИ 260 FOR Т = 1 ТО 10 270 HPLOT FN Т(Т), FN Y(0) ТО FN Т(Т), FN Y(10) 280 NEXT T 290 HPLOT FN T(0), FN Y(0): REM НАНЕСЕНИЕ НА ГРАФИК НАЧАЛЬНОЙ ТОЧКИ 300 T = 0:Y = 0 310 NV = V — 32 * DT: REM НОВОЕ ЗНАЧЕНИЕ СКОРОСТИ = СТАРОЕ ЗНАЧЕНИЕ СКОРОСТИ — 32 * DT 320 Y = Y + DT * (V + NV) / 2: REM НОВОЕ ЗНАЧЕНИЕ ВЫСОТЫ = СТАРОЕ ЗНАЧЕНИЕ ВЫСОТЫ + DT * СРЕДНЕЕ АРИФМЕТИЧЕСКОЕ ЗНАЧЕНИЕ СКОРОСТИ 330 Т = Т + DT: REM НОВОЕ ЗНАЧЕНИЕ ВРЕМЕНИ 340 HPLOT ТО FN Т(Т), FN Y(Y): REM НАНЕСЕНИЕ НА ГРАФИК НОВОЙ ТОЧКИ 350 V= NV: REM ОБНОВЛЕНИЕ ТЕКУЩЕГО ЗНАЧЕНИЯ СКОРОСТИ 360 IF Т > =10 THEN END 370 IF Y < =0 THEN END 380 GOTO 310 Программа 20.2 100 REM * * » * ТРАЕКТОРИЯ ДВИЖЕНИЯ МЯЧА, БРОШЕН 110 REM * * * * НОГО ПОД УГЛОМ К ГОРИЗОНТУ * * * * 120 REM ВВОД ЗНАЧЕНИЯ НАЧАЛЬНОЙ СКОРОСТИ (V) И ЗНА 130 REM ЧЕНИЯ ЕЕ ГОРИЗОНТАЛЬНОЙ СОСТАВЛЯЮЩЕЙ (VX)
Приложение 323 140 REM 150 HOME : VTAB 12 160 INPUT ’’ВВЕДИТЕ ЗНАЧЕНИЕ НАЧАЛЬНОЙ СКОРОСТИ: ”:V 170 PRINT : REM ПРОПУСК СТРОКИ 180 INPUT ’’ВВЕДИТЕ ЗНАЧЕНИЕ ГОРИЗОНТАЛЬНОЙ СОСТАВЛЯЮЩЕЙ СКОРОСТИ:”;УХ 200 VY = SQR (V * V — VX * VX) : REM ВЫЧИСЛЕНИЕ ЗНАЧЕНИЯ ВЕРТИКАЛЬНОЙ СОСТАВЛЯЮЩЕЙ СКОРОСТИ (VY) 220 REM FNX И FNY — ФУНКЦИИ МАСШТАБИРОВАНИЯ ОСЕЙ АБСЦИСС И ОРДИНАТ СООТВЕТСТВЕННО 230 DEF FN Х(Х) = X * 279 / 195 240 DEF FN Y(Y) = 159 - 159 * Y / 120 250 REM ПОСТРОЕНИЕ ИЗОБРАЖЕНИЯ ОСЕЙ КООРДИНАТ 260 HGR : HCOLOR = 7 270 HPLOT FN Х(0), FN Y(0) ТО FN Х(195), FN Y(0) 280 HPLOT FN Х(0), FN Y(0) TO FN X(0), FN Y(120) 290 REM НАНЕСЕНИЕ ДЕЛЕНИЙ НА ОСЬ АБСЦИСС 300 FOR X = 10 ТО 190 STEP 10 310 HPLOT FN X(X), FN Y(0) TO FN X(X), FN Y(3) 320 NEXT X 330 REM НАНЕСЕНИЕ ДЕЛЕНИЙ НА ОСЬ ОРДИНАТ 340 FOR Y = 10 ТО 120 STEP 10 350 HPLOT FN X(0), FN Y(Y) TO FN X(3), FN Y(Y) 360 NEXT Y 370 X = 0 380 Y = 0 390 DT = .02 400 HPLOT FN X(X), FN Y(Y) 410 NY = VY — 32 * DT: REM ВЫЧИСЛЕНИЕ НОВОГО ЗНАЧЕНИЯ ВЕРТИКАЛЬНОЙ СОСТАВЛЯЮЩЕЙ СКОРОСТИ 420 X = X + VX * DT: REM ВЫЧИСЛЕНИЕ НОВОГО ЗНАЧЕНИЯ КООРДИНАТЫ X 430 Y = Y + DT ч= (VY + NY) / 2: REM ВЫЧИСЛЕНИЕ НОВОГО ЗНАЧЕНИЯ КООРДИНАТЫ Y 440 VY = NY: REM ВЫЧИСЛЕНИЕ НОВОГО ЗНАЧЕНИЯ ВЕРТИКАЛЬНОЙ СОСТАВЛЯЮЩЕЙ СКОРОСТИ 450 IF Y < 0 THEN END 460 HPLOT ТО FN Х(Х), FN Y(Y) : REM НАНЕСЕНИЕ НА ГРАФИК ТОЧКИ, ОБОЗНАЧАЮЩЕЙ НОВУЮ ПОЗИЦИЮ МЯЧА 470 GOTO 410 Программа 21.1 100 REM ***** ИМИТАТОР ЭЛЕМЕНТОВ ИГРЫ В АМЕРИКАНСКИЙ ФУТБОЛ ***** 110 REM 120 REM ВАРИАНТ ПРОГРАММЫ С ИСПОЛЬЗОВАНИЕМ ПУЛЬТА УПРАВЛЕНИЯ ИГРОЙ 130 REM 200 V0 = 65 210 GS = ” ”: REM СИМВОЛ CTRL — G ДЛЯ ПОДАЧИ ЗВУКОВОГО СИГНАЛА 220 НОМЕ : HGR : HCOLOR = 7 230 VTAB (21) : REM ПОЗИЦИОНИРОВАНИЕ КУРСОРА В ОБЛАСТЬ ТЕКСТА ПОД ПОЛЕМ ДЛЯ ПРЕДСТАВЛЕНИЯ ГРАФИЧЕСКОЙ ИНФОРМАЦИИ Ъ11
324 240 250 260 270 280 290 300 310 320 330 340 350 360 370 380 390 400 410 420 430 440 450 500 510 520 530 540 550 Приложение HPLOT 0,140 ТО 279,140: REM ПОСТРОЕНИЕ ОСНОВАНИЯ ИГРОВОГО ПОЛЯ FOR X = 0 ТО 276 STEP 6: REM НАНЕСЕНИЕ ДЕЛЕНИЙ ЧЕРЕЗ 1 ЯРД HPLOT Х,140 ТО Х,143 IF X = 60 * INT(X I 60) THEN HPLOT TO X.149: REM НАНЕСЕНИЕ ДЕЛЕНИЙ ЧЕРЕЗ 10 ЯРДОВ NEXT X LR = 10:RR = 12: REM ОПРЕДЕЛЕНИЕ ЛЕВОЙ И ПРАВОЙ СТОРОН СИМВОЛИЧЕСКОГО ИЗОБРАЖЕНИЯ ПРИНИМАЮЩЕГО ИГРОКА HPLOT 10,139 ТО 10,130 HPLOT 11,139 ТО 11,130: REM ЗАДАНИЕ ИСХОДНОЙ ПОЗИЦИИ ПРИНИМАЮЩЕГО ИГРОКА HPLOT 12,139 ТО 12,130 ВХ = 0 : BY = 0: REM ЗАДАНИЕ ИСХОДНОГО ПОЛОЖЕНИЯ МЯЧА DT = 0: REM ОТМЕНА ДВИЖЕНИЯ МЯЧА IF РЕЕК(— 16 287) < 128 THEN 350: REM ОЖИДАНИЕ МОМЕНТА НАЖАТИЯ КНОПКИ ПУЛЬТА УПРАВЛЕНИЯ ИГРОЙ 0 IF РЕЕК(— 16 287) > 127 THEN 360: REM ОЖИДАНИЕ МОМЕНТА ОТПУСКАНИЯ РАНЕЕ НАЖАТОЙ КНОПКИ ПУЛЬТА УПРАВЛЕНИЯ ИГРОЙ 0 0Х —10: REM ПРИСВОЕНИЕ ’’СТАРОЙ” КООРДИНАТЕ X ЗНАЧЕНИЯ —10 ДЛЯ ПРИНУДИТЕЛЬНОГО ИЗОБРАЖЕНИЯ ЛИНИИ БРОСАНИЯ ПРИ ПЕРВОМ ВЫПОЛНЕНИИ ОПЕРАЦИЙ ОСНОВНОГО ЦИКЛА Z = PDL (0): REM СЧИТЫВАНИЕ ПОКАЗАНИЙ ПУЛЬТА УПРАВЛЕНИЯ 0 IF ABS (Z — 0Х) < 2 THEN 500: REM ПРИ НЕБОЛЬШИХ ИЗМЕНЕНИЯХ ЗНАЧЕНИЙ ФУНКЦИИ PDL ИЗОБРАЖЕНИЕ ЛИНИИ БРОСАНИЯ НЕ ВНОСИТСЯ IF Z > 200 THEN Z = 200: REM ПРЕДЕЛЫ ИЗМЕНЕНИЯ ЗНАЧЕНИЯ Z ОГРАНИЧЕНЫ ДИАПАЗОНОМ 0 ... 200 0Х = Z: REM ПОКАЗАНИЕ ПУЛЬТА УПРАВЛЕНИЯ, РЕГИСТРИРУЕМОЕ ФУНКЦИЕЙ PDL, ИСПОЛЬЗУЕТСЯ КАК ЗНАЧЕНИЕ ПЕРЕМЕННОЙ 0Х HCOLOR - 0: HPLOT 0,139 ТО LX,139 -LY * 1.85 / 2: REM СТИРАНИЕ СТАРОЙ ЛИНИИ БРОСАНИЯ LX = 12 * 0Х /200: REM ВЫЧИСЛЕНИЕ ПРИЛЕЖАЩЕГО КАТЕТА ТРЕУГОЛЬНИКА, ОПРЕДЕЛЯЮЩЕГО УГОЛ НАКЛОНА ЛИНИИ БРОСАНИЯ LY = SQR (144 — LX * LX): REM ВЫЧИСЛЕНИЕ ПРОТИВОЛЕЖАЩЕГО КАТЕТА ТРЕУГОЛЬНИКА, ОПРЕДЕЛЯЮЩЕГО УГОЛ НАКЛОНА ЛИНИИ БРОСАНИЯ HCOLOR = 7: HPLOT 0,139 ТО LX, 139 — LY * 1.85/ 2: REM ПОСТРОЕНИЕ ИЗОБРАЖЕНИЯ НОВОЙ ЛИНИИ БРОСАНИЯ RR = RR + 1: IF RR > 279 THEN 800: REM ПРОВЕРКА, НЕ ОКАЗАЛСЯ ЛИ ПРИНИМАЮЩИЙ ИГРОК ЗА ПРЕДЕЛАМИ ПОЛЯ HPLOT RR, 139 ТО RR, 130: REM ПЕРЕМЕЩЕНИЕ ПРИНИМАЮЩЕГО ИГРОКА HCOLOR = 0: HPLOT LR, 139 ТО LR, 130 HCOLOR = 7 : LR = LR + 1 NY = VY — 32 * DT: REM ВЫЧИСЛЕНИЕ НОВОГО ЗНАЧЕНИЯ ВЕРТИКАЛЬНОЙ СОСТАВЛЯЮЩЕЙ СКОРОСТИ X = ВХ + VX * DT: REM ВЫЧИСЛЕНИЕ НОВОГО ЗНАЧЕНИЯ КООРДИНАТЫ X МЯЧА
Приложение 325 560 Y = BY + DT * (VY + NY) / 2: REM ВЫЧИСЛЕНИЕ НОВОГО ЗНАЧЕНИЯ КООРДИНАТЫ Y МЯЧА 570 VY = NY: REM ПРИСВОЕНИЕ ПЕРЕМЕННОЙ VY НОВОГО ЗНАЧЕНИЯ 580 IF Y < 0 THEN 830: REM ПРОВЕРКА, HE УДАРИЛСЯ ЛИ МЯЧ О ЗЕМЛЮ 590 HPLOT 2 * ВХ, 140 — 1.85 s BY ТО 2 * Х,140 — 1.85 * Y: ВХ = X : BY = Y: REM ПЕРЕМЕЩЕНИЕ МЯЧА В НОВУЮ ПОЗИЦИЮ 600 IF LR < =2*Х THEN 840: REM ПРОВЕРКА, НЕ НАХОДИТСЯ ЛИ МЯЧ БЛИЗКО ОТ ПРИНИМАЮЩЕГО ИГРОКА 610 RR = RR + 1: IF RR > 279 THEN 700: REM ПРОВЕРКА, НЕ ОКАЗАЛСЯ ЛИ ПРИНИМАЮЩИЙ ИГРОК ЗА ПРЕДЕЛАМИ ПОЛЯ 620 HPLOT RR.I39 ТО RR, 130: REM ПЕРЕМЕЩЕНИЕ ПРИНИМАЮЩЕГО ИГРОКА 630 HCOLOR = 0: HPLOT LR.139 ТО LR, 130 640 HCOLOR = 7 : LR = LR + 1 650 IF PEEK (-16 287) < 128 THEN 380: REM ЕСЛИ КНОПКА ПУЛЬТА, ОПРЕДЕЛЯЮЩАЯ ПУСК МЯЧА, ОТЖАТА, ВОЗВРАТ К ОСНОВНОМУ ЦИКЛУ 700 IF DT > 0 THEN 380: REM ЕСЛИ МЯЧ УЖЕ В ДВИЖЕНИИ, ПРОПУСК ПРОЦЕДУРЫ УСТАНОВЛЕНИЯ НАЧАЛЬНЫХ ПАРАМЕТРОВ ЕГО ДВИЖЕНИЯ 710 REM УСТАНОВЛЕНИЕ НАЧАЛЬНЫХ ПАРАМЕТРОВ ДВИЖЕНИЯ МЯЧА 720 VX = V0 * LX / 12 : VY = V0 * LY / 12: REM ЗАДАНИЕ НАЧАЛЬНЫХ ЗНАЧЕНИЙ ГОРИЗОНТАЛЬНОЙ И ВЕРТИКАЛЬНОЙ СОСТАВЛЯЮЩИМ СКОРОСТИ МЯЧА 730 DT = .05: GOTO 380: REM ПУСК МЯЧА 800 PRINT Cig; ’’ПРИНИМАЮЩИЙ ИГРОК ЗА ПРЕДЕЛАМИ ПОЛЯ”, ’’ПЕРЕДАЧА МЯЧА НЕ ЗАВЕРШЕНА” 810 GET W$: GOTO 200: REM ПРИ НАЖАТИИ ЛЮБОЙ КЛАВИШИ ИГРА ВОЗОБНОВЛЯЕТСЯ 820 PRINT G<S; ”МЯЧ НЕ ДОБРОШЕН; ПЕРЕДАЧА НЕ ЗАВЕРШЕНА”: GOTO 810 830 PRINT G$; ’’ПЕРЕДАЧА НЕ ЗАВЕРШЕНА”: GOTO 810 840 IF 1NT (1.53 * Y) > 10 THEN PRINT G$; ’’ПОЛОЖЕНИЕ МЯЧА СЛИШКОМ ВЫСОКОЕ. ПЕРЕДАЧА НЕ ЗАВЕРШЕНА”: GOTO 810 850 IF 1.53 * Y < 4 THEN PRINT G$; ’’ПОЛОЖЕНИЕ МЯЧА СЛИШКОМ НИЗКОЕ. ПЕРЕДАЧА НЕ ЗАВЕРШЕНА”: GOTO 810 860 PRINT G$; ’’БРОСОК МЯЧА УДАЧНЫЙ И ВЫПОЛНЕН С РАССТОЯНИЯ”; INT ((X + 1) / 3); ’’ЯРДОВ”: GOTO 810 870 END Программа 21.2 100 REM ***** ИМИТАТОР ЭЛЕМЕНТОВ ИГРЫ В АМЕРИКАНСКИЙ ФУТБОЛ ***** 110 REM 120 REM ВАРИАНТ ПРОГРАММЫ С ИСПОЛЬЗОВАНИЕМ КЛАВИАТУРЫ 130 REM 200 V0 65 210 G$ =- ””: REM СИМВОЛ CTRL - G ДЛЯ ПОДАЧИ ЗВУКОВОГО СИГНАЛА 220 НОМЕ : HGR : HCOLOR = 7
326 230 240 250 260 270 280 290 300 310 320 330 340 350 360 370 380 385 390 400 405 410 420 430 440 450 500 Приложение VTAB (21): REM ПОЗИЦИОНИРОВАНИЕ КУРСОРА В ОБЛАСТЬ ТЕКСТА ПОД ПОЛЕМ ДЛЯ ПРЕДСТАВЛЕНИЯ ГРАФИЧЕСКОЙ ИНФОРМАЦИИ HPLOT 0,140 ТО 279,140: REM ПОСТРОЕНИЕ ОСНОВАНИЯ ИГРОВОГО ПОЛЯ FOR X = 0 ТО 276 STER 6: REM НАНЕСЕНИЕ ДЕЛЕНИЙ ЧЕРЕЗ 1 ЯРД HPLOT X, 140 ТО X, 143 IF X - 60 * INT (X / 60) THEN HPLOT ТО X, 149: REM НАНЕСЕНИЕ ДЕЛЕНИЙ ЧЕРЕЗ 10 ЯРДОВ NEXT X LR - 10 : RR - 12: REM ОПРЕДЕЛЕНИЕ ЛЕВОЙ И ПРАВОЙ СТОРОН СИМВОЛИЧЕСКОГО ИЗОБРАЖЕНИЯ ПРИНИМАЮЩЕГО ИГРОКА HPLOT 10,139 ТО 10,130 HPLOT 11,139 ТО 11,130: REM ЗАДАНИЕ ИСХОДНОЙ ПОЗИЦИИ ПРИНИМАЮЩЕГО ИГРОКА HPLOT 12,139 ТО 12,130 ВХ = 0 : BY = 0: REM ЗАДАНИЕ ИСХОДНОГО ПОЛОЖЕНИЯ МЯЧА DT = 0: REM ОТМЕНА ДВИЖЕНИЯ МЯЧА LX = 8.5 : LY = SQR (144 — 8.5 * 8.5): HPLOT 0,139 ТО LX, 139 — LY * 1.85 / 2: REM УГОЛ НАЧАЛЬНОГО ПУСКА РАВЕН ПРИБЛИЗИТЕЛЬНО 45 ГРАДУСАМ IF РЕЕК (— 16 384) > 127 THEN 380: REM ДЛЯ ПУСКА ПРИНИМАЮЩЕГО ИГРОКА ДОСТАТОЧНО НАЖАТЬ ЛЮБУЮ КЛАВИШУ GOTO 350: REM ОЖИДАНИЕ ПУСКА ПРИНИМАЮЩЕГО ИГРОКА IF РЕЕК (— 16 384) < 128 THEN 500: REM ЕСЛИ НИКАКАЯ КЛАВИША НЕ НАЖАТА, ТО В ДВИЖЕНИЕ ПРИВОДИТСЯ ПРИНИМАЮЩИЙ ИГРОК (И МЯЧ) GET Х$: REM СЧИТЫВАНИЕ ЗНАЧЕНИЯ НАЖАТОЙ КЛАВИШИ IF Х$ = CHR$ (21) THEN NX - LX + .5: GOTO 410 REM ЕСЛИ НАЖАТА КЛАВИША С ИЗОБРАЖЕНИЕМ СТРЕЛКИ, УКАЗЫВАЮЩЕЙ ВПРАВО, ТО NX = LX + .5 IF Х$ < > CHR§ (8) THEN 720: REM ПРИ НАЖАТИИ ЛЮБОЙ КЛАВИШИ, КРОМЕ ТЕХ, КОТОРЫЕ ИМЕЮТ ИЗОБРАЖЕНИЕ СТРЕЛКИ, УКАЗЫВАЮЩЕЙ ВЛЕВО ИЛИ ВПРАВО, НАЧИНАЕТСЯ ПЕРЕДАЧА МЯЧА IF NX = LX — .5: REM ЕСЛИ НАЖАТА КЛАВИША С ИЗОБРАЖЕНИЕМ СТРЕЛКИ, УКАЗЫВАЮЩЕЙ ВЛЕВО, ТО NX = LX — .5 IF NX > 12 OR NX < 0 THEN 500: REM ТРЕБОВАНИЕ ИЗМЕНЕНИЯ УГЛА НАКЛОНА ЛИНИИ БРОСАНИЯ ИГНОРИРУЕТСЯ, ЕСЛИ NX ВНЕ ДИАПАЗОНА ДОПУСТИМЫХ ЗНАЧЕНИЙ HCOLOR = 0: HPLOT 0,139 ТО LX, 139 — LY * 1.85 / 2: REM СТИРАНИЕ СТАРОЙ ЛИНИИ БРОСАНИЯ LX = NX LY = SQR (144 — LX * LX): REM ВЫЧИСЛЕНИЕ ПРОТИВОЛЕЖАЩЕГО КАТЕТА ТРЕУГОЛЬНИКА, ОПРЕДЕЛЯЮЩЕГО УГОЛ НАКЛОНА ЛИНИИ БРОСАНИЯ HCOLOR = 7: HPLOT 0,139 ТО LX, 139- LY * 1.85 / 2: REM ПОСТРОЕНИЕ ИЗОБРАЖЕНИЯ НОВОЙ ЛИНИИ БРОСАНИЯ RR - RR + 1: IF RR > 279 THEN 800: REM ПРОВЕРКА, НЕ ОКАЗАЛСЯ ЛИ ПРИНИМАЮЩИЙ ИГРОК ЗА ПРЕДЕЛАМИ ПОЛЯ
Приложение 327 510 HPLOT RR, 139 TO RR.130: REM ПЕРЕМЕЩЕНИЕ ПРИНИМАЮЩЕГО ИГРОКА 520 HCOLOR = 0: HPLOT LR,139 TO LR.130 530 HCOLOR = 7 : LR = LR + 1 540 NY = VY — 32 * DT: REM ВЫЧИСЛЕНИЕ НОВОГО ЗНАЧЕНИЯ ВЕРТИКАЛЬНОЙ СОСТАВЛЯЮЩЕЙ СКОРОСТИ 550 X = ВХ + VX * DT: REM ВЫЧИСЛЕНИЕ НОВОГО ЗНАЧЕНИЯ КООРДИНАТЫ X МЯЧА 560 Y BY + DT * (VY + NY) / 2: REM ВЫЧИСЛЕНИЕ НОВОГО ЗНАЧЕНИЯ КООРДИНАТЫ Y МЯЧА 570 VY = NY: REM ПРИСВОЕНИЕ ПЕРЕМЕННОЙ VY НОВОГО ЗНАЧЕНИЯ 580 IF Y < 0 THEN 830: REM ПРОВЕРКА, НЕ УДАРИЛСЯ ЛИ МЯЧ О ЗЕМЛЮ 590 HPLOT 2 » ВХ.140 — 1.85 « BY ТО 2 * Х.140 — 1.85 * Y: ВХ = X : BY = Y: REM ПЕРЕМЕЩЕНИЕ МЯЧА В НОВУЮ ПОЗИЦИЮ 600 IF LR < = 2 * THEN 840: REM ПРОВЕРКА, НЕ НАХОДИТСЯ ЛИ МЯЧ БЛИЗКО ОТ ПРИНИМАЮЩЕГО ИГРОКА 610 RR = RR + 1: IF RR > 279 THEN 700: REM ПРОВЕРКА, НЕ ОКАЗАЛСЯ ЛИ ПРИНИМАЮЩИЙ ИГРОК ЗА ПРЕДЕЛАМИ ПОЛЯ 620 HPLOT RR, 139 ТО RR, 130: REM ПЕРЕМЕЩЕНИЕ ПРИНИМАЮЩЕГО ИГРОКА 630 HCOLOR = 0: HPLOT LR.139 ТО LR.130 640 HCOLOR = 7 : LR = LR + 1 650 GOTO 380 710 REM УСТАНОВЛЕНИЕ НАЧАЛЬНЫХ ПАРАМЕТРОВ ДВИЖЕНИЯ МЯЧА 720 VX = V0 * LX / 12 : VY = V0 * LY / 12: REM ЗАДАНИЕ НАЧАЛЬНЫХ ЗНАЧЕНИЙ ГОРИЗОНТАЛЬНОЙ И ВЕРТИКАЛЬНОЙ СОСТАВЛЯЮЩИМ СКОРОСТИ МЯЧА 730 DT = .05: GOTO 380: REM ПУСК МЯЧА 800 PRINT G$; ’’ПРИНИМАЮЩИЙ ИГРОК ЗА ПРЕДЕЛАМИ ПОЛЯ”, "ПЕРЕДАЧА МЯЧА НЕ ЗАВЕРШЕНА” 810 GET W$: GOTO 200: REM ПРИ НАЖАТИИ ЛЮБОЙ КЛАВИШИ ИГРА ВОЗОБНОВЛЯЕТСЯ 820 PRINT G$; ”МЯЧ НЕ ДОБРОШЕН; ПЕРЕДАЧА НЕ ЗАВЕРШЕНА”! GOTO 810 830 PRINT G$; ’’ПЕРЕДАЧА НЕ ЗАВЕРШЕНА”: GOTO 810 840 IF INT (1.53 * Y) > 10 THEN PRINT G$; ’’ПОЛОЖЕНИЕ МЯЧА СЛИШКОМ ВЫСОКОЕ. ПЕРЕДАЧА НЕ ЗАВЕРШЕНА”: GOTO 810 850 IF 1.53 « Y < 4 THEN PRINT G$; ’’ПОЛОЖЕНИЕ МЯЧА СЛИШКОМ НИЗКОЕ. ПЕРЕДАЧА НЕ ЗАВЕРШЕНА”: GOTO 810 860 PRINT G$; ’’БРОСОК МЯЧА УДАЧНЫЙ И ВЫПОЛНЕН С РАССТОЯНИЯ”; INT ((X + 1) / 3); ’’ЯРДОВ”: GOTO 800 870 END Программа 22.1 100 REM * * * * ИМИТАТОР УПРАВЛЕНИЯ ПОСАДКОЙ * * * * НО REM ♦»** КОСМИЧЕСКОГО КОРАБЛЯ НА ПОВЕРХНОСТЬ ЛУНЫ * * * « 120 DIM L (270): REM L (X) — МАССИВ ЗНАЧЕНИЙ ВЫСОТЫ (КООРДИНАТЫ Y) ПОВЕРХНОСТИ ЛУНЫ ДЛЯ СООТВЕТСТВУЮЩИХ ЗНАЧЕНИЙ КООРДИНАТЫ X 130 HGR: HCOLOR = 7: REM РЕЖИМ РАБОТЫ ДИСПЛЕЯ ГРАФИЧЕСКИЙ, С ВЫСОКОЙ РАЗРЕШАЮЩЕЙ СПОСОБНОСТЬЮ
328 Приложение 140 HOME : VTAB: 21 REM ОЧИСТКА ЭКРАНА И ПОЗИЦИОНИРОВАНИЕ КУРСОРА 150 HPLOT 130,150 ТО 130,159 ТО 140,159 ТО 140,150: REM ФОРМИРОВАНИЕ ИЗОБРАЖЕНИЯ ПОСАДОЧНОЙ ПЛОЩАДКИ 160 FOR I = 131 ТО 139 : L (I) = 159: NEXT 1: REM ФОРМИРОВАНИЕ МАССИВА ЗНАЧЕНИЙ ВЫСОТЫ ТОЧЕК ПОСАДОЧНОЙ ПЛОЩАДКИ 170 AD =1:BD = 1: REM ПЕРЕМЕННЫЕ AD И BD ОПРЕДЕЛЯЮТ НАПРАВЛЕНИЕ ЛУННОГО СКЛОНА 180 L (130) = 150: L (140) = 150 200 REM 210 REM ФОРМИРОВАНИЕ ИЗОБРАЖЕНИЯ ПОВЕРХНОСТИ ЛУНЫ 220 REM 230 FOR I = 129 ТО 0 STEP — 1 240 IF RND (1) > .8 THEN AD = —AD 250 IF L (I + 1) = 159 THEN AD = —1 260 L(I) = L (I -I- 1) + AD 270 HPLOT I,L (I) 280 IF RND (1) > .8 THEN BD =—BD 290 IF L (269 — I) = 159 THEN BD = —1 300 L(270 — I) = L (269 — I) + BD 310 HPLOT 270 — I,L(270 — I) 320 NEXT I 330 REM 340 REM ФОРМИРОВАНИЕ ИЗОБРАЖЕНИЯ ЗВЕЗДНОГО НЕБА 350 REM 360 FOR I = 1 TO 100 370 X = 271 * RND (I) 380 Y = RND (1) * L(X) 390 HPLOT X.Y 400 NEXT I 410 Y = 6: REM НАЧАЛЬНОЕ ЗНАЧЕНИЕ КООРДИНАТЫ Y КОРАБЛЯ 420 X = 10: REM НАЧАЛЬНОЕ ЗНАЧЕНИЕ КООРДИНАТЫ X КОРАБЛЯ 430 VY = 5: REM НАЧАЛЬНОЕ ЗНАЧЕНИЕ ВЕРТИКАЛЬНОЙ СОСТАВЛЯЮЩЕЙ СКОРОСТИ КОРАБЛЯ 440 VX = 5: REM НАЧАЛЬНОЕ ЗНАЧЕНИЕ ГОРИЗОНТАЛЬНОЙ СОСТАВЛЯЮЩЕЙ СКОРОСТИ КОРАБЛЯ 450 DT = .4: REM ЗАДАНИЕ ЗНАЧЕНИЯ ИНТЕРВАЛА ВРЕМЕНИ (ИЗМЕНЯЯ КОТОРОЕ МОЖНО МЕНЯТЬ СКОРОСТЬ ВСЕХ ДЕЙСТВИЙ) 500 REM 510 REM ОСНОВНОЙ ЦИКЛ 520 REM 530 VY = VY + .25: REM УЧЕТ ВЛИЯНИЯ СИЛЫ ПРИТЯЖЕНИЯ ЛУНЫ 540 NY = Y + VY * DT:NX = X + VX * DT: REM НОВЫЕ ЗНАЧЕНИЯ ВЕРТИКАЛЬНОЙ И ГОРИЗОНТАЛЬНОЙ СОСТАВЛЯЮЩИХ СКОРОСТИ КОРАБЛЯ 550 ТМ = ТМ + 1: REM ПРИРАЩЕНИЕ СЧЕТЧИКУ ЧИСЛА ПОВТОРЕНИЙ ОПЕРАЦИЙ ОСНОВНОГО ЦИКЛА 560 REM ПРОВЕРКА, НЕ ОКОНЧИЛАСЬ ЛИ ПОСАДКА КРУШЕНИЕМ КОРАБЛЯ 570 IF NX < 2 OR NX > 268 THEN 760: REM ПРОВЕРКА, HE ВЫШЕЛ ЛИ КОРАБЛЬ ЗА ПРЕДЕЛЫ ПОЛЯ ЭКРАНА 580 IF NY < L(NX — 2) AND NY < L(NX + 2) THEN 660;
Приложение 329 REM ПРОВЕРКА, НАХОДИТСЯ ЛИ КОРАБЛЬ НАД ПОВЕРХНОСТЬЮ ЛУНЫ 590 IF ABS (VX) > 2 OR VY > 2 THEN 760: REM ПРОВЕРКА УСЛОВИЙ КРУШЕНИЯ ПРИ ПОСАДКЕ 600 IF INT (NX) < 133 OR INT (NX) > 137 THEN 760: REM ПРОВЕРКА, HE ОКАЗАЛСЯ ЛИ КОРАБЛЬ ЗА ПРЕДЕЛАМИ ПОСАДОЧНОЙ ПЛОЩАДКИ 610 PRINT ’’ПОСАДКА ВЫПОЛНЕНА ОТЛИЧНО, КАПИТАН 1” 620 PRINT ’’ЧИСЛО ПОВТОРЕНИЙ ОПЕРАЦИЙ ЦИКЛА, ПОТРЕБОВАВШИХСЯ ДЛЯ ЗАВЕРШЕНИЯ ПОСАДКИ ”;ТМ;: НТАВ 20: PRINT ’’РАСХОД ТОПЛИВА: FUEL 630 PRINT ”VX: ”;VX;: НТАВ 20: PRINT ”VY: ”;VY 640 CL = PEEK (—16368): REM ОЧИСТКА БУФЕРНОЙ ПАМЯТИ КЛАВИАТУРЫ, ЕСЛИ ИГРАЮЩИЙ ПО ОШИБКЕ НАЖАЛ ЕЩЕ ОДНУ КЛАВИШУ 650 НТАВ 10: PRINT ’’ДЛЯ ВОЗОБНОВЛЕНИЯ ИГРЫ НАЖМИТЕ ЛЮБУЮ КЛАВИШУ”;: GET Х$: GOTO 130 660 REM СТИРАНИЕ СТАРОГО ИЗОБРАЖЕНИЯ КОРАБЛЯ И ФОРМИРОВАНИЕ ЕГО НОВОГО ИЗОБРАЖЕНИЯ 670 HCOLOR = 0: HPLOT X — 2,Y ТО X - 2,Y — 1: HPLOT X — 1, Y - 1 ТО X - 1,Y — 5: HPLOT X,Y — 1 ТО X.Y — 6: HPLOT X + 1,Y — 1 TO X + 1,Y — 5: HPLOT X + 2,Y TO X + 2,Y — 1 680 X = NX:Y = NY 690 HCOLOR = 7: HPLOT X — 2,Y TO X — 2,Y — 1: HPLOT X — 1, Y - 1 TO X — 1,Y — 5: HPLOT X,Y — 1 TO X,Y — 6: HPLOT X + 1,Y — 1 TO X -f- 1,Y — 5: HPLOT X+ 2,Y TO X + 2,Y — 1 700 IF PEEK (-16 384) < 128 THEN 530 710 GET X$ 720 IF X§ = ”X” THEN VY = VY - ,5:FUEL = FUEL + .5 GOTO 530: REM ПРИ НАЖАТИИ КЛАВИШИ ”X” КОРАБЛЬ ПОЛУЧАЕТ УСКОРЕНИЕ В ВЕРТИКАЛЬНОМ НАПРАВЛЕНИИ 730 IF Х$ = ”К” THEN VX = VX + ,5:FUEL = FUEL + .5:GOTO 530: REM ПРИ НАЖАТИИ КЛАВИШИ ”K” КОРАБЛЬ ПОЛУЧАЕТ УСКОРЕНИЕ ВПРАВО 740 IF Х$ = ”J” THEN VX = VX — ,5:FUEL = FUEL + .5: GOTO 530: REM ПРИ НАЖАТИИ КЛАВИШИ ”J” КОРАБЛЬ ПОЛУЧАЕТ УСКОРЕНИЕ ВЛЕВО 750 GOTO 530 760 PRINT ’’ПОСАДКА МОГЛА БЫТЬ И МЯГЧЕ, НОВИЧОК!” 770 GOTO 620 Программа 23.1 100 DEF FN F(X) = SQR (10 » X — X * X): REM ЭТА ФУНКЦИЯ ОПРЕДЕЛЯЕТ ЗНАЧЕНИЯ КООРДИНАТ Y ВЕРХНЕЙ ЛИНИИ КОНТУРА ДАННОЙ ОБЛАСТИ ПО AL = 0: REM AL — ОЦЕНКА, ОСНОВАННАЯ НА ПРЕДСТАВЛЕНИИ ПЛОЩАДИ ОБЛАСТИ "ЛЕВЫМИ” ПРЯМОУГОЛЬНИКАМИ 120 AR = 0: REM AR — ОЦЕНКА, ОСНОВАННАЯ НА ПРЕДСТАВЛЕНИИ ПЛОЩАДИ ОБЛАСТИ ’’ПРАВЫМИ” ПРЯМОУГОЛЬНИКАМИ 130 INPUT "ВВЕДИТЕ N ”;N: REM N — ЧИСЛО ПРЯМОУГОЛЬНИКОВ, ИСПОЛЬЗУЕМЫХ КАЖДОЙ ОЦЕНКОЙ 140 W = 2 / N: REM W — ШИРИНА КАЖДОГО ПРЯМОУГОЛЬНИКА 150 FOR I == 1 ТО N 12 Xs 939
330 Приложение 160 LE = 1 + (1 — 1) * W: REM КООРДИНАТА X ЛЕВОГО КРАЯ 170 RE = 1 + I * W: REM КООРДИНАТА X ПРАВОГО КРАЯ 180 AL = AL Ц- W * FN F(LE): REM ДОБАВЛЕНИЕ ПЛОЩАДИ ’’ЛЕВОГО” ПРЯМОУГОЛЬНИКА К ЗНАЧЕНИЮ AL 190 AR = AR + W * FN F(RE): REM ДОБАВЛЕНИЕ ПЛОЩАДИ ’’ПРАВОГО” ПРЯМОУГОЛЬНИКА К ЗНАЧЕНИЮ AR 200 NEXT I 210 PRINT 220 PRINT ’’ОЦЕНКА, ОСНОВАННАЯ НА ”;N;” ’ЛЕВЫХ’ 230 PRINT ’’ПРЯМОУГОЛЬНИКАХ, РАВНА ”;AL 240 PRINT ’’ОЦЕНКА, ОСНОВАННАЯ НА ”;N;” ’ПРАВЫХ” 250 PRINT ’’ПРЯМОУГОЛЬНИКАХ, РАВНА ”;AR 999 END Программа 23.2 100 DEF FN F(X) = SQR (4 — X » X): REM ЭТА ФУНКЦИЯ ОПРЕДЕЛЯЕТ ЗНАЧЕНИЯ КООРДИНАТ Y ВЕРХНЕЙ ЛИНИИ КОНТУРА ЧЕТВЕРТИ КРУГА, ЦЕНТР КОТОРОГО СОВПАДАЕТ С НАЧАЛОМ КООРДИНАТ, А РАДИУС РАВЕН 2 110 AL = 0: REM AL — ОЦЕНКА, ОСНОВАННАЯ НА ПРЕДСТАВЛЕНИИ ПЛОЩАДИ ОБЛАСТИ ’’ЛЕВЫМИ” ПРЯМОУГОЛЬНИКАМИ 120 AR = 0: REM AR - ОЦЕНКА, ОСНОВАННАЯ НА ПРЕДСТАВЛЕНИИ ПЛОЩАДИ ОБЛАСТИ ’’ПРАВЫМИ” ПРЯМОУГОЛЬНИКАМИ 130 INPUT ’’ВВЕДИТЕ N ”;N: REM N — ЧИСЛО ПРЯМОУГОЛЬНИКОВ, ИСПОЛЬЗУЕМЫХ КАЖДОЙ ОЦЕНКОЙ 140 W = 2 / N: REM W — ШИРИНА КАЖДОГО ПРЯМОУГОЛЬНИКА 150 FOR I = 1 ТО N 160 LE = (I — 1) * W: REM КООРДИНАТА X ЛЕВОГО КРАЯ 170 RE = I * W: REM КООРДИНАТА X ПРАВОГО КРАЯ 180 AL = AL + W * FN F(LE): REM ДОБАВЛЕНИЕ ПЛОЩАДИ ’’ЛЕВОГО” ПРЯМОУГОЛЬНИКА К ЗНАЧЕНИЮ AL 190 AR = AR + W * FN F(RE): REM ДОБАВЛЕНИЕ ПЛОЩАДИ ’’ПРАВОГО” ПРЯМОУГОЛЬНИКА К ЗНАЧЕНИЮ AR 200 NEXT I 210 PRINT 220 PRINT ’’ОЦЕНКА, ОСНОВАННАЯ НА ”;N;” ’ЛЕВЫХ’” 230 PRINT ’’ПРЯМОУГОЛЬНИКАХ, РАВНА ”;АЬ 240 PRINT ’’ОЦЕНКА, ОСНОВАННАЯ НА ’;N;” ’ПРАВЫХ’” 250 PRINT ’’ПРЯМОУГОЛЬНИКАХ, РАВНА ";AR 999 END Программа 23.3 100 DEF FN F(X) = SQR (4 — X s X): REM ЭТА ФУНКЦИЯ ОПРЕДЕЛЯЕТ ЗНАЧЕНИЯ КООРДИНАТ Y ВЕРХНЕЙ ЛИНИИ КОНТУРА ДАННОЙ ОБЛАСТИ ПО А = 0: REM А — ПЛОЩАДЬ ОБЛАСТИ, ПРЕДСТАВЛЯЕМОЙ СУММОЙ ТРАПЕЦИЙ 120 INPUT ’’ВВЕДИТЕ N ”;N: REM N — ЧИСЛО ТРАПЕЦИЙ 130 W = 2 / N: REM W — ШИРИНА КАЖДОЙ ТРАПЕЦИИ 140 FOR I = 1 ТО N
Приложение 331 150 LE = (1 — 1) * W: REM КООРДИНАТА X ЛЕВОГО КРАЯ ТРАПЕЦИИ 160 RE = I ::: W: REM КООРДИНАТА X ПРАВОГО КРАЯ ТРАПЕЦИИ 170 LFI = FN F(LE): REM LH — ВЫСОТА ЛЕВОГО КРАЯ ТРАПЕЦИИ 180 RH = FN F(RE): REM RH — ВЫСОТА ПРАВОГО КРАЯ ТРАПЕЦИИ 190 А = А + W ❖ (LH + RH) / 2: REM ДОБАВЛЕНИЕ К А ПЛОЩАДИ ТРАПЕЦИИ 200 NEXT I 210 PRINT ’’ОЦЕНКА, ОСНОВАННАЯ НА ”;N;” ТРАПЕЦИЯХ”, 220 PRINT ’’РАВНА ”;А 999 END □ RUN ВВЕДИТЕ N 10 ОЦЕНКА, ОСНОВАННАЯ НА 10 ТРАПЕЦИЯХ, РАВНА 3.10 451 833 □ RUN ВВЕДИТЕ N 100 ОЦЕНКА, ОСНОВАННАЯ НА 100 ТРАПЕЦИЯХ, РАВНА 3.14 041 747 Программа 23.4 100 DEF FN F(X) = SQR (4 — X * X): REM ЭТА ФУНКЦИЯ ОПРЕДЕЛЯЕТ ЗНАЧЕНИЯ КООРДИНАТ Y ВЕРХНЕЙ ЛИНИИ КОНТУРА ДАННОЙ ОБЛАСТИ НО AM = 0: REM AM — ПЛОЩАДЬ ОБЛАСТИ, ПРЕДСТАВЛЯЕМОЙ СУММОЙ ПРЯМОУГОЛЬНИКОВ "СРЕДНЕЙ” ВЫСОТЫ 120 INPUT ’’ВВЕДИТЕ N ”;N: REM N — ЧИСЛО ПР ЯМОУГОЛЬНИ КОВ 130 W = 2 / N: REM W - ШИРИНА КАЖДОГО ПРЯМОУГОЛЬНИКА 140 FOR I = 1 ТО N 150 MID = (I — 1 / 2) W: REM КООРДИНАТА X СЕРЕДИНЫ ПРЯМОУГОЛЬНИКА 160 AM = AM + FN F(MID) * W 170 NEXT I 180 PRINT ’’ОЦЕНКА, ОСНОВАННАЯ НА ”;M; ’’ПРЯМОУГОЛЬНИКАХ” 190 PRINT ’’СРЕДНЕЙ ВЫСОТЫ, РАВНА ”;АМ 200 END □ RUN ВВЕДИТЕ N 10 ОЦЕНКА,ОСНОВАННАЯ НА 10 ПРЯМОУГОЛЬНИКАХ СРЕДНЕЙ ВЫСОТЫ, РАВНА 3.15 241 144 □ RUN ВВЕДИТЕ N 100 ОЦЕНКА, ОСНОВАННАЯ НА 100 ПРЯМОУГОЛЬНИКАХ СРЕДНЕЙ ВЫСОТЫ, РАВНА 3.14 193 686
332 Приложение Программа 23.5 100 НОМЕ : PRINT : PRINT НО INPUT ’’СКОЛЬКО ИНТЕРВАЛОВ? ”;N: REM ВВОД ЧИСЛА ИСПОЛЬЗУЕМЫХ ИНТЕРВАЛОВ 120 W = 3 / N: REM ДЛИНА КАЖДОГО ИНТЕРВАЛА РАВНА W СЕКУНДАМ 130 MX = 0:MN = 0: REM ПЕРЕМЕННЫЕ ДЛЯ ХРАНЕНИЯ МАКСИМАЛЬНОГО И МИНИМАЛЬНОГО ЗНАЧЕНИЙ ВЫСОТЫ 140 FOR I = 1 ТО N: REM ВЫЧИСЛЕНИЕ МАКСИМАЛЬНО ВОЗМОЖНОГО ЗНАЧЕНИЯ ВЫСОТЫ 150 В = (I — 1) » W: REM НАЧАЛО ИНТЕРВАЛА 160 VB = 100 — 32 « В: REM НАЧАЛЬНАЯ СКОРОСТЬ РАВНА МАКСИМАЛЬНОЙ 170 MX = MX + W * VB: REM ДОБАВЛЕНИЕ К ОБЩЕМУ ПРОЙДЕННОМУ РАССТОЯНИЮ МАКСИМАЛЬНОГО ЗНАЧЕНИЯ ПУТИ, КОТОРЫЙ МОЖЕТ БЫТЬ ПРОЙДЕН ЗА ДАННЫЙ ИНТЕРВАЛ 180 NEXT I 190 FOR I = 1 ТО N: REM ВЫЧИСЛЕНИЕ МАКСИМАЛЬНО ВОЗМОЖНОГО ЗНАЧЕНИЯ ВЫСОТЫ 200 Е = I * W: REM КОНЕЦ ИНТЕРВАЛА 210 VE = 100 — 32 * Е: REM СКОРОСТЬ В КОНЦЕ ИНТЕРВАЛА 220 MN = MN + W * VE: REM ДОБАВЛЕНИЕ К ОБЩЕМУ ПРОЙДЕННОМУ РАССТОЯНИЮ МАКСИМАЛЬНОГО ЗНАЧЕНИЯ ПУТИ, КОТОРЫЙ МОЖЕТ БЫТЬ ПРОЙДЕН ЗА ДАННЫЙ ИНТЕРВАЛ 230 NEXT I 240 PRINT 250 PRINT ’’ПРОЙДЕНО РАССТОЯНИЕ НЕ МЕНЕЕ” 260 PRINT MN;” И НЕ БОЛЕЕ ”;МХ;” ФУТОВ” 270 GET Wg: GOTO 100: REM ПОВТОРНЫЙ ПУСК ПРОГРАММЫ ПРИ НАЖАТИИ ЛЮБОЙ КЛАВИШИ Программа 23.6 100 REM ОЦЕНКА РАССТОЯНИЯ, ПРОХОДИМОГО ЗА 25 СЕКУНД АВТОМОБИЛЕМ, ДВИЖУЩИМСЯ СО СКОРОСТЬЮ 100 — 100/(Т + 1) ФУТОВ В СЕКУНДУ 110 DEF FN V(T) = 100 — 100 / (Т + 1): REM ФУНКЦИЯ, ОПРЕДЕЛЯЮЩАЯ ЗНАЧЕНИЕ СКОРОСТИ 120 НОМЕ : INPUT ’’ВВЕДИТЕ ЧИСЛО ИНТЕРВАЛОВ”; N 130 W = 25 / N : D = 0 140 FOR 1 = 1 ТО N 150 MP = (I — 1 / 2) « W 160 D = D + FN V(MP) * W : REM ИСПОЛЬЗОВАНИЕ МЕТОДА ПРЯМОУГОЛЬНИКОВ СО ’’СРЕДНЕЙ” ВЫСОТОЙ 170 NEXT 1 180 PRINT "ОЦЕНКА ПРИ ИСПОЛЬЗОВАНИИ ”;N;" ПРЯМОУГОЛЬНИКОВ” 190 PRINT ’’РАВНА ”;D;” ФУТОВ” 200 GET W$: PRINT : PRINT ; PRINT ; GOTO 120
Приложение 333 Программа 24.1 100 REM с * * МОДЕЛИРОВАНИЕ ОРБИТЫ ЛУНЫ (ВАРИАНТ 1) * е * ПО REM 120 DEF FN X (X) = 95 Ж 95 * X / 5Е5: REM ФУНКЦИЯ МАСШТАБИРОВАНИЯ ОСИ X 130 DEF FN Y (Y) = 95 Ж 95 * Y / 5Е5: REM ФУНКЦИЯ МАСШТАБИРОВАНИЯ ОСИ Y 140 G = 6.67Е — 17: REM ГРАВИТАЦИОННАЯ КОНСТАНТА ПРИ ИСПОЛЬЗОВАНИИ В КАЧЕСТВЕ ЕДИНИЦ ИЗМЕРЕНИЯ КИЛОМЕТРОВ, СЕКУНД И МЕТРИЧЕСКИХ ТОНН 150 DT = 21 600: REM DT = 21 600 С = 6 ЧАС 200 DIM Р (2, 10) : REM РЕЗЕРВИРОВАНИЕ ПАМЯТИ ДЛЯ ХРАНЕНИЯ МАССИВА ЗНАЧЕНИЯ КООРДИНАТ X И Y ТЕЛА I 210 DIM V (2,10) : REM РЕЗЕРВИРОВАНИЕ ПАМЯТИ ДЛЯ ХРАНЕНИЯ МАССИВА ГОРИЗОНТАЛЬНОЙ И ВЕРТИКАЛЬНОЙ СОСТАВЛЯЮЩИХ СКОРОСТИ ТЕЛА I 220 DIM А (2,10) : REM РЕЗЕРВИРОВАНИЕ ПАМЯТИ ДЛЯ ХРАНЕНИЯ МАССИВА ГОРИЗОНТАЛЬНОЙ И ВЕРТИКАЛЬНОЙ СОСТАВЛЯЮЩИХ УСКОРЕНИЯ ТЕЛА I 230 DIM М (10) : REM М (I) — МАССА ТЕЛА I 260 DIM NV (2,10) : REM РЕЗЕРВИРОВАНИЕ ПАМЯТИ ДЛЯ ХРАНЕНИЯ МАССИВА ЗНАЧЕНИЙ ГОРИЗОНТАЛЬНОЙ И ВЕРТИКАЛЬНОЙ СОСТАВЛЯЮЩИХ НОВОЙ СКОРОСТИ ТЕЛА 1 300 М (1) = 5.983Е21 : REM МАССА ЗЕМЛИ В МЕТРИЧЕСКИХ ТОННАХ 310 М (2) - 7.36Е19 : REM МАССА ЛУНЫ В МЕТРИЧЕСКИХ ТОННАХ 320 Р (1,1) - 0: Р(2,1) = 0 : REM ИСХОДНЫЕ КООРДИНАТЫ ЗЕМЛИ 330 Р (1,2) = 364000 : Р (2,2) = 0 : REM ИСХОДНЫЕ КООРДИНАТЫ ЛУНЫ 340 V(l,2) = 0: V(2,2) = —1.075 : REM НАЧАЛЬНАЯ СКОРОСТЬ ЛУНЫ (КМ/С) 400 HGR : HCOLOR = 7 :. REM ГРАФИЧЕСКИЙ РЕЖИМ ВЫСОКОЙ РАЗРЕШАЮЩЕЙ СПОСОБНОСТИ; ЦВЕТ — БЕЛЫЙ 410 РОКЕ —16302,0 : REM ГРАФИЧЕСКИЙ РЕЖИМ ДЛЯ ВСЕГО ПОЛЯ ЭКРАНА 420 FOR 1 = 1 ТО 2: REM ПОСТРОЕНИЕ ИЗОБРАЖЕНИЯ КАЖДОГО ТЕЛА 430 HPLOT FN X (P(l,l)), FN Y (Р(2,1)) 440 NEXT I 500 GOSUB 1000 : REM ВЫЧИСЛЕНИЕ УСКОРЕНИЯ В НАЧАЛЕ ВРЕМЕННОГО ИНТЕРВАЛА 530 NV (1,2) = V (1,2) + DI « А (1,2) : REM ВЫЧИСЛЕНИЕ НОВОГО ЗНАЧЕНИЯ СКОРОСТИ 540 NV (2,2) = V (2,2) Ж ОТ * А (2,2) 550 Р (1,2) = Р (1,2) Ж DT * (V (1,2) Ж NV (1,2)) / 2 : REM ВЫЧИСЛЕНИЕ КООРДИНАТ НОВОЙ ПОЗИЦИИ 560 Р (2,2) = Р (2,2) Ж DT * (V (2,2) Ж NV (2,2)) / 2 570 V (1,2) = NV (1,2) 580 V (2,2) = NV (2,2) 590 GOTO 420 1000 REM ПОДПРОГРАММА ВЫЧИСЛЕНИЯ УСКОРЕНИЯ ТЕЛА 2
334 Приложение 1010 REM 1020 S - (P (1,2) — P (1,1)) ❖ (P (1,2) — P (1,1)) + (P (2,2) — P (2,1)) * (P (2,2) — P (2,1)) : REM S — КВАДРАТ РАССТОЯНИЯ МЕЖДУ ТЕЛАМИ 1 Й 2 1030 DS = S * SQR (S) : REM DS — КУБ РАССТОЯНИЯ МЕЖДУ ТЕЛАМИ 1 И 2 1040 А (1,2) = G * М(1) * (Р (1,1) — Р (1,2)) / DS : REM ВЫЧИСЛЕНИЕ ГОРИЗОНТАЛЬНОЙ СОСТАВЛЯЮЩЕЙ УСКОРЕНИЯ 1050 А (2,2) = G * М (1) * (Р (2,1) — Р (2,2)) / DS : REM ВЫЧИСЛЕНИЕ ВЕРТИКАЛЬНОЙ СОСТАВЛЯЮЩЕЙ УСКОРЕНИЯ 1060 RETURN Программа 24.2 100 REM * :•= * МОДЕЛИРОВАНИЕ ОРБИТЫ ЛУНЫ (ВАРИАНТ 2) ❖ * * ПО REM 120 DEF FN X (X) = 95 + 95 * X / 5Е5: REM ФУНКЦИЯ МАСШТАБИРОВАНИЯ ОСИ X 130 DEF FN Y (Y) = 95 — 95 * X / 5Е5 : REM ФУНКЦИЯ МАСШТАБИРОВАНИЯ ОСИ Y 140 G = 6.67Е—17: REM ГРАВИТАЦИОННАЯ КОНСТАНТА ПРИ ИСПОЛЬЗОВАНИИ В КАЧЕСТВЕ ЕДИНИЦ ИЗМЕРЕНИЯ КИЛОМЕТРОВ, СЕКУНД И МЕТРИЧЕСКИХ ТОНН 150 DT = 21600 : REM DT = 21600 С = 6 ЧАС 200 DIM Р (2,10) : REM РЕЗЕРВИРОВАНИЕ ПАМЯТИ ДЛЯ ХРАНЕНИЯ МАССИВА ЗНАЧЕНИЙ КООРДИНАТ X И Y ТЕЛА I 210 DIM V (2,10) : REM РЕЗЕРВИРОВАНИЕ ПАМЯТИ ДЛЯ ХРАНЕНИЯ МАССИВА ГОРИЗОНТАЛЬНОЙ И ВЕРТИКАЛЬНОЙ СОСТАВЛЯЮЩИХ СКОРОСТИ ТЕЛА I 220 DIM А (2,10) : REM РЕЗЕРВИРОВАНИЕ ПАМЯТИ ДЛЯ ХРАНЕНИЯ МАССИВА ГОРИЗОНТАЛЬНОЙ И ВЕРТИКАЛЬНОЙ СОСТАВЛЯЮЩИХ УСКОРЕНИЯ ТЕЛА I 230 DIM М (10) : REM М (I) — МАССА ТЕЛА I 240 DIM SP (2,10) : REM РЕЗЕРВИРОВАНИЕ ПАМЯТИ ДЛЯ ХРАНЕНИЯ МАССИВА ЗНАЧЕНИЙ КООРДИНАТ X И Y СТАРОЙ ПОЗИЦИИ ТЕЛА I 250 DIM Al (2,10) : REM РЕЗЕРВИРОВАНИЕ ПАМЯТИ ДЛЯ ХРАНЕНИЯ МАССИВА ЗНАЧЕНИЙ ГОРИЗОНТАЛЬНОЙ И ВЕРТИКАЛЬНОЙ СОСТАВЛЯЮЩИХ УСКОРЕНИЯ ТЕЛА I В НАЧАЛЕ ВРЕМЕННОГО ИНТЕРВАЛА 260 DIM NV (2,10) : REM РЕЗЕРВИРОВАНИЕ ПАМЯТИ ДЛЯ ХРАНЕНИЯ МАССИВА ЗНАЧЕНИЙ ГОРИЗОНТАЛЬНОЙ И ВЕРТИКАЛЬНОЙ СОСТАВЛЯЮЩИХ НОВОЙ СКОРОСТИ ТЕЛА I 300 М (1) = 5.983Е21 : REM МАССА ЗЕМЛИ В МЕТРИЧЕСКИХ ТОННАХ 310 М (2) = 7.36EI9 : REM МАССА ЛУНЫ В МЕТРИЧЕСКИХ ТОННАХ 320 Р(1,1) = 0:Р(2,1) =0: REM ИСХОДНЫЕ КООРДИНАТЫ ЗЕМЛИ 330 Р (1,2) = 364000:Р (2,2) = 0 : REM ИСХОДНЫЕ КООРДИНАТЫ ЛУНЫ 340 V(l,2) = 0: V(2,2) = —1.075: REM НАЧАЛЬНАЯ СКОРОСТЬ ЛУНЫ (КМ/С) 400 HGR : HCOLOR = 7: REM ГРАФИЧЕСКИЙ РЕЖИМ ВЫСОКОЙ РАЗРЕШАЮЩЕЙ СПОСОБНОСТИ; ЦВЕТ — БЕЛЫЙ
Приложение 335 410 POKE — 16302,0: REM ГРАФИЧЕСКИЙ РЕЖИМ ДЛЯ ВСЕГО ПОЛЯ ЭКРАНА 420 FOR 1 = 1 ТО 2: REM ПОСТРОЕНИЕ ИЗОБРАЖЕНИЯ КАЖДОГО ТЕЛА 430 HPLOT FN X (Р (1,1)), FN Y (Р(2,1)) 440 NEXT I 500 GOSUB 1000: REM ВЫЧИСЛЕНИЕ УСКОРЕНИЯ В НАЧАЛЕ ВРЕМЕННОГО ИНТЕРВАЛА 510 А1 (1,2) = А (1,2) :А1 (2,2) = А (2,2) : REM ЗАПИСЬ НА ХРАНЕНИЕ ЗНАЧЕНИЙ СОСТАВЛЯЮЩИХ УСКОРЕНИЯ В НАЧАЛЕ ВРЕМЕННОГО ИНТЕРВАЛА 520 SP (1,2) = Р (1,2) : SP (2,2) = Р (2,2) : REM ЗАПИСЬ НА ХРАНЕНИЕ ЗНАЧЕНИЙ КООРДИНАТ СТАРОЙ ПОЗИЦИИ ТЕЛА 530 NV (1,2) = V(1,2) + DT * А (1,2) : REM ПЕРВАЯ ОЦЕНКА ЗНАЧЕНИЯ НОВОЙ СКОРОСТИ 540 NV (2,2) = V (2,2) +DT * А (2,2) 550 Р (1,2) = Р (1,2) + DT * (V (1,2) + NV(1,2)) / 2: REM ПЕРВАЯ ОЦЕНКА ЗНАЧЕНИЙ КООРДИНАТ НОВОЙ ПОЗИЦИИ 560 Р (2,2) = Р (2,2) + DT * (V (2,2) + NV (2,2)) / 2 570 GOSUB 1000: REM ПЕРЕХОД К ВЫЧИСЛЕНИЮ УСКОРЕНИЯ В КОНЦЕ ВРЕМЕННОГО ИНТЕРВАЛА 580 NV (1,2) = V (1,2) + DT * (А1 (1,2) + А (1,2)) / 2: REM ВТОРАЯ ОЦЕНКА ЗНАЧЕНИЯ НОВОЙ СКОРОСТИ 590 NV (2,2) = V (2,2) + DT * (А1 (2,2) + А (2,2)) / 2 600 Р (1,2) = SP (1,2) + DT * (V (1,2) + NV (1,2)) / 2: REM ВТОРАЯ ОЦЕНКА ЗНАЧЕНИЙ КООРДИНАТ НОВОЙ ПОЗИЦИИ 610 Р (2,2) = SP (2,2) + DT * (V (2,2) + NV ((2,2)) / 2 620 V (1,2) = NV (1,2) s V (2,2) = NV (2,2) : REM СКОРОСТЬ ДЛЯ СЛЕДУЮЩЕГО ВРЕМЕННОГО ИНТЕРВАЛА — ЭТО НОВАЯ СКОРОСТЬ 630 GOTO 420 1000 REM ПОДПРОГРАММА ВЫЧИСЛЕНИЯ УСКОРЕНИЯ ТЕЛА 2 1010 REM 1020 S = (Р (1,2) — Р (1,1)) * (Р (1,2) — Р (1,1)) + (Р (2,2) — —Р (2,1)) * (Р (2,2) ~ Р(2,1)) : REM S— КВАДРАТ РАССТОЯНИЯ МЕЖДУ ТЕЛАМИ 1 И 2 1030 DS = S * SQR (S) : REM DS — КУБ РАССТОЯНИЯ МЕЖДУ ТЕЛАМИ 1 И 2 1040 А (1,2) = G * М(1) * (Р (1,1) — Р (1,2)) / DS: REM ВЫЧИСЛЕНИЕ ГОРИЗОНТАЛЬНОЙ СОСТАВЛЯЮЩЕЙ УСКОРЕНИЯ 1050 А (2,2) = G * М(1) * (Р (2,1) — Р (2,2)) / DS: REM ВЫЧИСЛЕНИЕ ВЕРТИКАЛЬНОЙ СОСТАВЛЯЮЩЕЙ УСКОРЕНИЯ 1060 RETURN Программа 24.3 100 REM МОДЕЛИРОВАНИЕ ОРБИТ ЧЕТЫРЕХ ПЛАНЕТ 110 REM СОЛНЕЧНОЙ СИСТЕМЫ 120 DEF FN X (X) = 95 + 95 * X /300Е6 s REM ФУНКЦИЯ МАСШТАБИРОВАНИЯ ОСИ X 130 DEF FN Y (Y) = 95 + 95 * Y /300Е6 j REM ФУНКЦИЯ МАСШТАБИРОВАНИЯ ОСИ Y 140 G = 6.67Е*—17: REM ГРАВИТАЦИОННАЯ КОНСТАНТА ПРИ ИСПОЛЬЗОВАНИИ В КАЧЕСТВЕ ЕДИНИЦ ИЗМЕРЕНИЯ КИЛОМЕТРОВ, СЕКУНД И МЕТРИЧЕСКИХ ТОНН
336 150 160 200 210 220 230 240 250 260 300 310 320 330 340 400 410 420 430 440 500 510 520 530 540 550 560 570 580 590 Приложение DT = 172800: REM DT = 172800 С = ДВОЕ СУТОК N = 5: REM ЧИСЛО НЕБЕСНЫХ ТЕЛ РАВНО ПЯТИ DIM Р (2,10) : REM РЕЗЕРВИРОВАНИЕ ПАМЯТИ ДЛЯ ХРАНЕНИЯ МАССИВА ЗНАЧЕНИЙ КООРДИНАТ X И У ТЕЛА I DIM V (2,10) : REM РЕЗЕРВИРОВАНИЕ ПАМЯТИ ДЛЯ ХРАНЕНИЯ МАССИВА ГОРИЗОНТАЛЬНОЙ И ВЕРТИКАЛЬНОЙ СОСТАВЛЯЮЩИХ СКОРОСТИ ТЕЛА I DIM А (2,10) : REM РЕЗЕРВИРОВАНИЕ ПАМЯТИ ДЛЯ ХРАНЕНИЯ МАССИВА ГОРИЗОНТАЛЬНОЙ И • ВЕРТИКАЛЬНОЙ СОСТАВЛЯЮЩИХ УСКОРЕНИЯ ТЕЛА I DIM М (10) : REM М (I) — МАССА ТЕЛА I DIM SP (2,10) : REM РЕЗЕРВИРОВАНИЕ ПАМЯТИ ДЛЯ ХРАНЕНИЯ МАССИВА ЗНАЧЕНИЙ КООРДИНАТ X И Y СТАРОЙ ПОЗИЦИИ ТЕЛА I DIM Al (2,10) : REM РЕЗЕРВИРОВАНИЕ ПАМЯТИ ДЛЯ ХРАНЕНИЯ МАССИВА ЗНАЧЕНИЙ ГОРИЗОНТАЛЬНОЙ И ВЕРТИКАЛЬНОЙ СОСТАВЛЯЮЩИХ УСКОРЕНИЯ ТЕЛА I В НАЧАЛЕ ВРЕМЕННОГО ИНТЕРВАЛА DIM NV (2,10) : REM РЕЗЕРВИРОВАНИЕ ПАМЯТИ ДЛЯ ХРАНЕНИЯ МАССИВА ЗНАЧЕНИЙ ГОРИЗОНТАЛЬНОЙ И ВЕРТИКАЛЬНОЙ СОСТАВЛЯЮЩИХ НОВОЙ СКОРОСТИ ТЕЛА I М (1) = 1.987Е27: REM МАССА СОЛНЦА В МЕТРИЧЕСКИХ ТОННАХ М (2) = 3.24Е20 : Р (1,2) = 57.91 Е6 : V (2,2) = —47.9 REM ПАРАМЕТРЫ МЕРКУРИЯ М (3) = 4.86Е21 : Р (1,3) = 108.2Е6 : V (2,3) =—35,05: REM ПАРАМЕТРЫ ВЕНЕРЫ М (4) = 5.97Е21 : Р (1,4) = 149.6Е6 : V (2,4) =—29.77: REM ПАРАМЕТЫ ЗЕМЛИ М(5) = 6.43Е20: Р (1,5) = 227.9Е6: V (2,5) =—24.02 : REM ПАРАМЕТРЫ МАРСА HGR : HCOLOR = 7: REM ГРАФИЧЕСКИЙ РЕЖИМ ВЫСОКОЙ РАЗРЕШАЮЩЕЙ СПОСОБНОСТИ; ЦВЕТ — БЕЛЫЙ РОКЕ — 16302,0 : REM ГРАФИЧЕСКИЙ РЕЖИМ ДЛЯ ВСЕГО ПОЛЯ ЭКРАНА FOR 1 = 1 ТО N: REM ПОСТРОЕНИЕ ИЗОБРАЖЕНИЯ КАЖДОГО ТЕЛА HPLOT FN X (Р (1,1)), FN Y (Р (2,1)) NEXT I FOR 1 = 2 ТО N GOSUB 1000 : REM ПЕРЕХОД К ВЫЧИСЛЕНИЮ УСКОРЕНИЯ КАЖДОГО ТЕЛА В НАЧАЛЕ ВРЕМЕННОГО ИНТЕРВАЛА А1 (1,1) = А (1,1) : А1 (2,1) = А (2,1) : REM И ЗАПИСЬ НА ХРАНЕНИЕ NV(1,I) = V (1,1) 4- DT * А (1,1) : REM ПЕРВАЯ ОЦЕНКА ЗНАЧЕНИЯ НОВОЙ СКОРОСТИ NV (2,1) = V (2,1) + DT * А (2,1) SP (1,1) = Р (1,1) + DT * (NV (1,1) + V (1,1)) /2 : REM ПЕРВАЯ ОЦЕНКА ЗНАЧЕНИЙ КООРДИНАТ НОВОЙ ПОЗИЦИИ SP(2,I)= Р (2,1) + DT * (NV (2,1) + V (2,1))/2 NEXT I FOR 1 = 2 ТО N W = Р (1,1) : Р (1,1) = SP (1,1) : SP (1,1) = W: REM ЗАПИСЬ ЗНАЧЕНИЯ SP (1,1) В Р (1,1) ДЛЯ НОВОЙ ОЦЕНКИ УСКОРЕНИЯ
Приложение 337 600 W = Р (2,1) : Р (2,1) = SP (2,1) : SP (2,1) = W 610 NEXT I 620 FOR 1 = 2 TO N 630 GOSUB 1000 : REM ПЕРЕХОД К ВЫЧИСЛЕНИЮ УСКОРЕНИЯ КАЖДОГО ТЕЛА В КОНЦЕ ВРЕМЕННОГО ИНТЕРВАЛА 640 NV(l.I) = V(I,I) + DT * (Al (1,1) + A (1,1)) / 2: REM ВТОРАЯ ОЦЕНКА НОВОЙ СКОРОСТИ 650 NV (2,1) = V (2,1) + DT * (Al (2,1) + A (2,1)) / 2 660 NEXT I 670 FOR I = 1 TO N 680 P(1,I) = SP(1,I) + DTs (V(l,1) + NV(1,I) )/ 2: REM ВТОРАЯ ОЦЕНКА ЗНАЧЕНИЙ КООРДИНАТ НОВОЙ ПОЗИЦИИ 690 P(2,I) = SP(2,I) + DT * (V(2.I) + NV(2,I) ) / 2 700 V(1,I) = NV(1,I):V(2,I) = NV(2,I): REM СКОРОСТЬ ДЛЯ СЛЕДУЮЩЕГО ВРЕМЕННОГО ИНТЕРВАЛА 710 NEXT 1 720 GOTO 420 1000 REM ПОДПРОГРАММА ВЫЧИСЛЕНИЯ УСКОРЕНИЯ ТЕЛА I 1010 REM 1020 S = (Р(1,1) — Р(1,1)) * (Р(1,1) — Р(1,1)) + (Р(2,1) — — Р(2,2)) * (Р(2,1) — Р(2,1)) 1030 DS = S * SQR (S): REM DS = L * L * L 1040 A(1,I) = G * М(1) * (Р(1,1) — Р(1,1)) / DS: REM ВЫЧИСЛЕНИЕ ГОРИЗОНТАЛЬНОЙ СОСТАВЛЯЮЩЕЙ УСКОРЕНИЯ 1050 A(2,I) = G* М(1) * (Р(2,1) — P(2,I)) / DS: REM ВЫЧИСЛЕНИЕ ВЕРТИКАЛЬНОЙ СОСТАВЛЯЮЩЕЙ УСКОРЕНИЯ 1060 RETURN Программа 25.1 100 REM ЭКОЛОГИЧЕСКАЯ МОДЕЛЬ ПОПУЛЯЦИИ ЖУКОВ НО REM 120 DIM Р (100): REM Р(1) — ЧИСЛЕННОСТЬ ЖУКОВ В 1-М ГОДУ 130 НОМЕ 140 INPUT’’ЗАДАЙТЕ НАЧАЛЬНУЮ ЧИСЛЕННОСТЬ ПОПУЛЯЦИИ:”; Р(1) 150 YR = 1 160 PRINT : REM ПРОПУСК СТРОКИ 170 PRINT ’’ГОД ЧИСЛЕННОСТЬ”: REM ВЫВОД ЗАГОЛОВКА 180 PRINT : REM ПРОПУСК СТРОКИ 190 PRINT ” YR;: НТАВ 6: PRINT P(YR) 200 IF YR = 10 * INT (YR I 10) THEN PRINT : GET X§: REM ПРОПУСК СТРОКИ И ОЖИДАНИЕ ВВОДА С КЛАВИАТУРЫ ПОСЛЕ ВЫВОДА ДАННЫХ ЗА ОЧЕРЕДНЫЕ ДЕСЯТЬ ЛЕТ 210 D = 0.2 + .001 P(YR) : IF P(YR)> 800 THEN D = 1: REM ВЫЧИСЛЕНИЕ ПОКАЗАТЕЛЯ СМЕРТНОСТИ (МАКСИМАЛЬНОЕ ЗНАЧЕНИЕ I) 220 В = 0.5 — .002 « P(YR): IF P(YR) > 250 THEN В = 0: REM ВЫЧИСЛЕНИЕ ПОКАЗАТЕЛЯ РОЖДАЕМОСТИ (МИНИМАЛЬНОЕ ЗНАЧЕНИЕ 0) 230 P(YR + 1) = P(YR) + В * P(YR) — D* P(YR): REM ВЫЧИСЛЕНИЕ ЧИСЛЕННОСТИ ПОПУЛЯЦИИ В СЛЕДУЮЩЕМ ГОДУ 240 YR = YR + 1: GOTO 190
338 Приложение Программа 25.2 100 REM ЛОГИСТИЧЕСКАЯ МОДЕЛЬ ЭКОЛОГИЧЕСКОЙ СИСТЕМЫ ПО REM 120 HOME: REM ОЧИСТКА ЭКРАНА И ВЫВОД ИНСТРУКЦИИ 130 PRINT ’’ЛОГИСТИЧЕСКАЯ МОДЕЛЬ ЭКОЛОГИЧЕСКОЙ СИСТЕМЫ” 140 PRINT : PRINT ’’ЧИСЛЕННОСТЬ ПОПУЛЯЦИИ ИЗМЕНЯЕТСЯ” 150 PRINT : PRINT ”В СООТВЕТСТВИИ С УРАВНЕНИЕМ:” 160 PRINT : REM ПРОПУСК СТРОКИ 170 PRINT ” Р(1 + 1) = А * (1 - В * Р(1)) * Р(1) ” 180 PRINT : REM ПРОПУСК СТРОКИ 190 INPUT "ЗАДАЙТЕ ЗНАЧЕНИЕ А: ”;А 200 INPUT ’’ЗАДАЙТЕ ЗНАЧЕНИЕ В: ”;В 210 DIM Р(500): REM Р(1) — ЧИСЛЕННОСТЬ ПОПУЛЯЦИИ В 1-М ГОДУ 220 INPUT ’’ЗАДАЙТЕ НАЧАЛЬНУЮ ЧИСЛЕННОСТЬ ПОПУЛЯЦИИ:”; Р(1) 230 1 = 1 240 НОМЕ 250 PRINT "ГОД ЧИСЛЕННОСТЬ”: REM ВЫВОД ЗАГОЛОВКА 260 PRINT : REM ПРОПУСК СТРОКИ 270 PRINT ” ”;I;: НТАВ 8: PRINT P(I): REM ВЫВОД ГОДА И ЧИСЛЕННОСТИ ПОПУЛЯЦИИ 280 IF I = 10 * INT (I / 10) THEN PRINT : GET X$: REM ОЖИДАНИЕ ВВОДА С КЛАВИАТУРЫ ПОСЛЕ ВЫВОДА ДАННЫХ ЗА ОЧЕРЕДНЫЕ ДЕСЯТЬ ЛЕТ 290 P(I + 1) = А * (I — В * P(I)) « P(I): REM ВЫЧИСЛЕНИЕ ЧИСЛЕННОСТИ ПОПУЛЯЦИИ В СЛЕДУЮЩЕМ ГОДУ 300 1 = 1 + 1 310 GOTO 270 Программа 26.1 100 REM ЭКОЛОГИЧЕСКАЯ ИГРА "ФЕРМЕР-КАКТУСОВОД” ПО REM 120 НОМЕ : GR : REM ОЧИСТКА ЭКРАНА И УСТАНОВКА ГРАФИЧЕСКОГО РЕЖИМА С НИЗКОЙ РАЗРЕШАЮЩЕЙ СПОСОБНОСТЬЮ 130 G$ = CHR$(7): REM СИМВОЛ -’CTRL-G’ СЛУЖИТ ДЛЯ ПОДАЧИ ЗВУКОВОГО СИГНАЛА 140 SX = 1:SY = 21: REM SX И SY —ЗНАЧЕНИЯ КООРДИНАТ ТЕКУЩЕЙ ПОЗИЦИИ ЭКРАНА 150 Р = 10: REM ЧИСЛЕННОСТЬ ПОПУЛЯЦИИ КАКТУСОВ ПЕРВОНАЧАЛЬНО РАВНА 10 160 НС = 0: REM НС — ЧИСЛО СОБРАННЫХ КАКТУСОВ 170 FOR NG = 1 ТО 8: REM ЦИКЛ СБОРА УРОЖАЯ 8 ПОКОЛЕНИЙ КАКТУСОВ 180 VTAB 24: HTAB 30: PRINT LEFT$ (” GGGGGGGG”,9—NG); LEFT$ (” ”,NG) ;: REM ВЫВОД УКАЗАТЕЛЯ ЧИСЛА ЛЕТ, ОСТАВШИХСЯ ДО ОКОНЧАНИЯ ИГРЫ 190 REM 200 REM НОВОЕ ПОКОЛЕНИЕ 210 REM 220 GR : COLOR = 15: REM ОЧИСТКА ЭКРАНА, ЦВЕТ — БЕЛЫЙ 230 REM ПОСТРОЕНИЕ ИЗОБРАЖЕНИЯ НОВОГО ПОКОЛЕНИЯ КАКТУСОВ
Приложение 339 240 FOR СТ = 1 ТО Р: REM ПОСТРОЕНИЕ ИЗОБРАЖЕНИЯ Р КАКТУСОВ НА ЭКРАНЕ 250 X = 4 * IMT (10 * RND(l)): REM ВЫБОР КООРДИНАТЫ X РАВНОВЕРОЯТНОЙ СЛУЧАЙНОЙ ОБЛАСТИ ДЛЯ ИЗОБРАЖЕНИЯ КАКТУСА 260 Y = 5 * INT (8 * RND (1)): REM И ЕЕ КООРДИНАТЫ Y 270 IF SCRN(X,Y) > 0 THEN 250: REM ПРОВЕРКА, ЗАНЯТА ИЛИ СВОБОДНА ВЫБРАННАЯ ОБЛАСТЬ 280 GOSUB 1030: NEXT СТ: REM ЕСЛИ ВЫБРАННАЯ ОБЛАСТЬ СВОБОДНА, В НЕЙ СТРОИТСЯ ИЗОБРАЖЕНИЕ КАКТУСА 290 CY = 0: REM CY — ЧИСЛО КАКТУСОВ В СУМКЕ ФЕРМЕРА 300 FX = 39:NX = 39:FY = 39:NY = 39: PLOT FX,FY: REM ДВИЖЕНИЕ МАРКЕРА МЕСТОПОЛОЖЕНИЯ ФЕРМЕРА НАЧИНАЕТСЯ ИЗ ЛЕВОГО НИЖНЕГО УГЛА ЭКРАНА 310 FOR FS = 1 ТО 500: REM ФЕРМЕР ДЕЛАЕТ 500 ШАГОВ 320 IF РЕЕК (—16384) > 127 THEN РОКЕ —16368,0: GOTO 490: REM ПРИ НАЖАТИИ ЛЮБОЙ КЛАВИШИ НЕМЕДЛЕННО ПРОИСХОДИТ ПЕРЕХОД К СЛЕДУЮЩЕМУ ПОКОЛЕНИЮ 330 IF РЕЕК (—16286) > 127 THEN 390: REM ВЫБОР ПУТИ ДВИЖЕНИЯ ФЕРМЕРА К ДОМИКУ 340 IF РЕЕК (—16287) > 127 THEN 370: REM В ЗАВИСИМОСТИ ОТ СОСТОЯНИЯ КНОПОК УПРАВЛЕНИЯ ИГРОЙ 350 NY = FY Ч- I: IF NY = 40 THEN NY = 39: REM ДВИЖЕНИЕ ВНИЗ 360 GOTO 430 370 NX = FX + 1: IF NX = 40 THEN NX = 39: REM ДВИЖЕНИЕ ВПРАВО 380 GOTO 430 390 IF PEEK (—16287) > 127 THEN 420 400 NX = FX — 1: IF NX = —1 THEN NX = 0: REM ДВИЖЕНИЕ ВЛЕВО 410 GOTO 430 420 NY = FY— I: IF NY = —1 THEN NY = 0: REM ДВИЖЕНИЕ ВВЕРХ 430 COLOR = 0: PLOT FX,FY: REM СТИРАНИЕ СТАРОГО МАРКЕРА МЕСТОПОЛОЖЕНИЯ ФЕРМЕРА 440 IF SCRN(NX.NY) > 0 THEN 830: REM ПРОВЕРКА, ДОБРАЛСЯ ЛИ ФЕРМЕР ДО КАКТУСА 450 COLOR = 15: PLOT NX,NY: REM ПОСТРОЕНИЕ НОВОГО МАРКЕРА МЕСТОПОЛОЖЕНИЯ ФЕРМЕРА 460 FX = NX:FY = NY: REM ИЗМЕНЕНИЕ ПОЗИЦИИ МАРКЕРА НА ЭКРАНЕ 470 IF FX = 39 AND FY = 39 AND CY > 0 THEN 930: REM ФЕРМЕР ДОБРАЛСЯ ДО ДОМА 480 NEXT FS 490 P = 4 * (1—03 *P) * P: IF P <1 THEN P = 1: REM ПОЛУЧЕНИЕ ЧИСЛЕННОСТИ СЛЕДУЮЩЕГО ПОКОЛЕНИЯ ПОПУЛЯЦИИ кактусов 500 NEXT NG: REM СЛЕДУЮЩЕЕ ПОКОЛЕНИЕ 700 REM 710 REM КОНЕЦ ПРОЦЕДУРЫ, ОПИСЫВАЮЩЕЙ ИГРУ 720 REM 730 TEXT : НОМЕ : REM КОНЕЦ ИГРЫ 740 PRINT ”ВЫ СОБРАЛИ УРОЖАЙ ИЗ ”;НС;” КАКТУСОВ” 750 END 800 REM
340 Приложение 810 REM ПРОЦЕДУРА ОБРАБОТКИ СИТУАЦИИ, КОГДА ФЕРМЕ! 820 REM ’’НАТКНУЛСЯ” НА КАКТУС 830 IF CY = 5 THEN PRINT GS;:NX = FX:NY = FY: GOTO 450: REM ЕСЛИ СУМКА ФЕРМЕРА УЖЕ ЗАПОЛНЕНА, ПОДАЕТСЯ ЗВУКОВОЙ СИГНАЛ, А НАЙДЕННЫЙ КАКТУС ОСТАЕТСЯ НА ПРЕЖНЕМ МЕСТЕ 840 CY = CY + 1:Р = Р — 1: REM КАКТУС ПОМЕЩАЕТСЯ В СУМКУ, ЧИСЛЕННОСТЬ ПОПУЛЯЦИИ УМЕНЬШАЕТСЯ НА ЕДИНИЦУ 850 X == 4 * INT (NX / 4):Y = 5 * I NT (NY I 5): REM ПОЛУЧЕНИЕ КООРДИНАТ КАКТУСА 860 COLOR = 0: GOSUB 1030: REM УДАЛЕНИЕ ИЗОБРАЖЕНИЯ КАКТУСА 870 GOTO 450 900 REM 910 REM ПРОЦЕДУРА ДОСТАВКИ СУМКИ ДОМОЙ 920 REM 930 НС = НС + CY: REM ДОБАВЛЕНИЕ СОДЕРЖИМОГО СУМКИ К СОБРАННОМУ УРОЖАЮ 940 FOR J = 1 ТО CY 950 VTAB SY: НТАВ SX: PRINT ”Y”;: REM ПРИБАВЛЕНИЕ ЕДИНИЦЫ К ОБЩЕМУ ЧИСЛУ СОБРАННЫХ КАКТУСОВ 960 SX = SX + 1: IF SX = 41 THEN SX = 1:SY = SY + 1 970 NEXT J 980 CY = 0: REM ’’ОПОРОЖНЕНИЕ” СУМКИ 990 GOTO 480 1000 REM 1010 REM ПОДПРОГРАММА ПОСТРОЕНИЯ ИЛИ УДАЛЕНИЯ 1020 REM ИЗОБРАЖЕНИЯ КАКТУСА 1030 VLIN Y + 2.Y AT X: VLIN Y + 3.Y + 2 AT X + 1: VLIN Y j 2,Y AT X + 2: RETURN: REM ПОСТРОЕНИЕ ИЗОБРАЖЕН!! ОДНОГО КАКТУСА Программа 27.1 100 REM МОДЕЛИРОВАНИЕ ЭКОЛОГИЧЕСКОЙ СИСТЕМЫ С НО REM ДВУМЯ СОПЕРНИЧАЮЩИМИ ВИДАМИ ОСОБЕЙ 120 НОМЕ 130 DIM SQ(100): REM SQ(I) — ЧИСЛЕННОСТЬ БЕЛОК В ЬМ ГОД 140 INPUT ’’ЗАДАЙТЕ НАЧАЛЬНУЮ ЧИСЛЕННОСТЬ БЕЛОК: SQ(1) 150 DIM СН(ЮО): REM CH(I) — ЧИСЛЕННОСТЬ БУРУНДУКОВ В I-М ГОДУ 160 INPUT ’’ЗАДАЙТЕ НАЧАЛЬНУЮ ЧИСЛЕННОСТЬ БУРУНДУКОВ: СН(1) 170 PRINT 175 PRINT ” ЧИСЛЕННОСТЬ ЧИСЛЕННОСТЬ” 180 PRINT ’’ГОД БЕЛОК БУРУНДУКОВ” 190 PRINT 200 YR = 1 210 PRINT ” ”;YR;: НТАВ 8: PRINT SQ(YR) НТАВ 20: PRINT CH(YR) 220 IF YR - 10 * INT(YR / 10) THEN PRINT : GET X$: REM ПРОПУСК СТРОКИ И ОЖИДАНИЕ ВВОДА С КЛАВИАТУРЫ ПОСЛЕ ВЫВОДА ДАННЫХ ЗА ОЧЕРЕДНЫЕ ДЕСЯТЬ ЛЕТ
Приложение 341 230 SQ(YR + 1) = SQ(YR) * (2 - .01 * SQ(YR) - .005 * CH(YR)): REM ОПРЕДЕЛЕНИЕ ЧИСЛЕННОСТИ ПОПУЛЯЦИИ БЕЛОК В СЛЕДУЮЩЕМ ГОДУ 235 IF SQ(YR + 1) <0 THEN SQ(YR J- 1) = 0: REM ОТРИЦАТЕЛЬНОЕ ЗНАЧЕНИЕ ЧИСЛЕННОСТИ БЕЛОК СМЫСЛА НЕ ИМЕЕТ 240 CH(YR + 1) = CH(YR) * (2 - .01 * CH(YR) - .005 * SQ(YR)): REM ВЫЧИСЛЕНИЕ ЧИСЛЕННОСТИ БУРУНДУКОВ В СЛЕДУЮЩЕМ ГОДУ 245 IF CH(YR + 1) <0 THEN CH(YR + 1) = 0: REM ОТРИЦАТЕЛЬНОЕ ЗНАЧЕНИЕ ЧИСЛЕННОСТИ БУРУНДУКОВ СМЫСЛА НЕ ИМЕЕТ 250 YR = YR + 1 260 GOTO 210 Программа 27.2 100 REM МОДЕЛИРОВАНИЕ ПОВЕДЕНИЯ ДВУХ ВРАЖДУЮЩИХ ПО REM СЕМЕЙСТВ ОСОБЕЙ 120 НОМЕ 130 DIM САР (100): REM САР(1) — ЧИСЛЕННОСТЬ РОДА КАПУЛЕТТИ В 1-М ГОДУ 140 INPUT ’’ЗАДАЙТЕ НАЧАЛЬНУЮ ЧИСЛЕННОСТЬ РОДА КАПУЛЕТТИ:”' САР(1) 150 DIM MNT(100):REM MNT(I) — ЧИСЛЕННОСТЬ РОДА МОНТЕККИ В 1-М ГОДУ 160 INPUT ’’ЗАДАЙТЕ НАЧАЛЬНУЮ ЧИСЛЕННОСТЬ РОДА МОНТЕККИ:”; MNT(l) 170 YR = I 180 PRINT 190 PRINT ’’ГОД КАПУЛЕТТИ МОНТЕККИ”: REM ВЫВОД ЗАГОЛОВКА 200 PRINT 210 PRINT ” YR;: НТАВ 10: PRINT CAP(YR);: НТАВ 25: PRINT MNT(YR) 220 CAP(YR + 1)=CAP(YR)*(2 —,01*CAP(YR) —.02* MNT(YR)): REM ОПРЕДЕЛЕНИЕ ЧИСЛЕННОСТИ РОДА КАПУЛЕТТИ В СЛЕДУЮЩЕМ ГОДУ 230 IF CAP(YR + 1)<0 THEN CAP(YR + l) = 0: REM ОТРИЦАТЕЛЬНОЕ ЗНАЧЕНИЕ ЧИСЛЕННОСТИ РОДА КАПУЛЕТТИ СМЫСЛА НЕ ИМЕЕТ 240 MNT(YR + 1) = MNT (YR)*(2 —.01*MNT(YR) —.02*CAP(YR)): REM ОПРЕДЕЛЕНИЕ ЧИСЛЕННОСТИ РОДА МОНТЕККИ В СЛЕДУЮЩЕМ ГОДУ 250 IF MNT(YR + l)<0THEN MNT(YR + 1)=0: REM ОТРИЦАТЕЛЬНОЕ ЗНАЧЕНИЕ ЧИСЛЕННОСТИ РОДА МОНТЕККИ СМЫСЛА НЕ ИМЕЕТ 260 IF YR = 10 * INT (YR/10) THEN PRINT : GET XS 270 YR = YR + 1 280 GOTO 210 JRUN ЗАДАЙТЕ НАЧАЛЬНУЮ ЧИСЛЕННОСТЬ РОДА КАПУЛЕТТИ: 10 ЗАДАЙТЕ НАЧАЛЬНУЮ ЧИСЛЕННОСТЬ РОДА МОНТЕККИ: 15
342 Приложение ООО’ЧСПСЛЛ^СлЭЮ ГОД КАПУЛЕТТИ 1 10 16 21.52 23.149 333 20.9 947 197 17.5715 745 13.573 777 9.27 686 097 5.22 585 806 10 2.15 469 435 И .531 876 404 12 .0560 173 116 13 1.43 731 708Е-03 14 3.65 172 553Е-06 15 2.21 465 329Е-10 16 3.27 793 42Е-17 17 2.42 901 448Е-24 18 9.02 227 397Е-32 19 0 20 0 МОНТЕККИ 15 24.75 35.454 375 43.0 790 599 47.6 550 358 52.5 899 648 59.0 411 159 67.1 954 793 76.7 713 718 86.5 803 825 94.4 680 534 98.6 890 691 99.8 722 486 99.9 969 658 99.9 999 926 99.9 999 963 99.9 999 982 99.9 999 991 99.9 999 995 99.9 999 998 Программа 28.1 100 REM ПОСТРОЕНИЕ ГРАФИКА ФУНКЦИИ ОДНОЙ ПЕРЕМЕННОЙ 110 REM 120 HOME:GS = CHRS (7): REM СИМВОЛ ’CTRL-G’ СЛУЖИТ ДЛЯ ПОДАЧИ ЗВУКОВОГО СИГНАЛА 130 PRINT GS: FLASH : PRINT ’’ЗАДАЙТЕ ФУНКЦИЮ ДЛЯ ПОСТРОЕНИЯ ГРАФИКА В ВИДЕ СЛЕДУЮЩЕГО ОПЕРАТОРА:”: NORMAL: PRINT: PRINT ”130 DEFFNF(X) = END 140 REM ОПЕРАТОР 130 ДОЛЖЕН БЫТЬ ЗАМЕНЕН ОПЕРАТОРОМ ”DEF FNF(X) = . . . ЗАДАЮЩИМ ВИД ФУНКЦИИ ДЛЯ 150 REM ПОСТРОЕНИЯ ГРАФИКА. ОПЕРАТОР 130 ДАННОГО 160 REM ТЕКСТА ПРОГРАММЫ БУДЕТ ВЫПОЛНЯТЬСЯ ТОЛЬКО В ТОМ 170 REM СЛУЧАЕ, КОГДА ПОЛЬЗОВАТЕЛЬ НЕ УКАЖЕТ ВИД ФУНКЦИИ; О ТАКОЙ СИТУАЦИИ ПРОГРАММА НАПОМНИТ ПОЛЬЗОВАТЕЛЮ СООБЩЕНИЕМ ’’ЗАДАЙТЕ ФУНКЦИЮ. . 180 LIST 130: REM ВЫВОД ТЕКСТА ОПЕРАТОРА, СОДЕРЖАЩЕГО 190 REM ЗАПИСЬ ЗАДАННОЙ ФУНКЦИИ 200 REM ОБРАЩЕНИЕ К ПОЛЬЗОВАТЕЛЮ ЗА УКАЗАНИЕМ МАСШТАБА ПО ОСИ X 210 PRINT ”Х ПРИНИМАЕТ ЗНАЧЕНИЯ ОТ А ДО В”: INPUT ’’ЗАДАЙТЕ ЗНАЧЕНИЯ А И В:”; А, В 220 REM ОБРАЩЕНИЕ К ПОЛЬЗОВАТЕЛЮ ЗА УКАЗАНИЕМ МАСШТАБА ПО ОСИ Y 230 PRINT ”Y ПРИНИМАЕТ ЗНАЧЕНИЯ ОТ С ДО D” 240 INPUT ’’ЗАДАЙТЕ ЗНАЧЕНИЯ С И D:”; С, D 250 SX = 278/(В — A): REM SX- КОЭФФИЦИЕНТ МАСШТАБИРОВАНИЯ ПО ОСИ X
Приложение 343 260 DEF FN Х(Х)= INT((X —A)*SX-|-.5): REM FNX —ФУНКЦИЯ МАСШТАБИРОВАНИЯ ПО ОСИ X 270 DEF FN Y(Y)= INT(190.5—190*(Y—C)/(D —С)): REM ФУНКЦИЯ МАСШТАБИРОВАНИЯ ПО ОСИ Y 280 HGR: POKE—16302,0:REM ПОЛНОФОРМАТНЫЙ ГРАФИЧЕСКИЙ РЕЖИМ С ВЫСОКОЙ РАЗРЕШАЮЩЕЙ СПОСОБНОСТЬЮ 290 HPLOT 0, FN Y(0) ТО 278, FN Y(0): REM ПОСТРОЕНИЕ ОСИ X 300 HPLOT FN Х(0), 0 ТО FN Х(0), 191: REM ПОСТРОЕНИЕ ОСИ Y 310 HPLOT FN Х(А), FN Y(FN F(A)): REM НАЧАЛО ПОСТРОЕНИЯ КРИВОЙ ГРАФИКА 320 DX = (В —А)/139: REM ВЫЧИСЛЕНИЕ ШАГА ПО ОСИ X 330 FOR X = A + DX ТО В STEP DX: REM ПОСТРОЕНИЕ ГРАФИКА ФУНКЦИИ 340 HPLOT ТО FN Х(Х), FN Y(FN F(X)) 350 NEXT X 999 END Программа 28.2 100 REM ПОСТРОЕНИЕ ГРАФИКА ФУНКЦИИ ОДНОЙ НО REM ПЕРЕМЕННОЙ 120 HOME: Gg = CHRS (7): REM СИМВОЛ ’CTRL-G’OiyXHTДЛЯ ПОДАЧИ ЗВУКОВОГО СИГНАЛА 130 PRINT Gg: FLASH: PRINT ’’ЗАДАЙТЕ ФУНКЦИЮ ДЛЯ ПОСТРОЕНИЯ ГРАФИКА В ВИДЕ СЛЕДУЮЩЕГО ОПЕРАТОРА:”: NORMAL: PRINT: PRINT ”130 DEF FNF(X)= ”: END 140 REM ОПЕРАТОР 130 ДОЛЖЕН БЫТЬ ЗАМЕНЕН ОПЕРАТОРОМ ”DEF FNF(X) = . . . .”, ЗАДАЮЩИМ ВИД ФУНКЦИИ ДЛЯ 150 REM ПОСТРОЕНИЯ ГРАФИКА. ОПЕРАТОР 130 ДАННОГО ТЕКСТА 160 REM ПРОГРАММЫ БУДЕТ ВЫПОЛНЯТЬСЯ ТОЛЬКО В ТОМ СЛУЧАЕ 170 REM КОГДА ПОЛЬЗОВАТЕЛЬ НЕ УКАЖЕТ ВИД ФУНКЦИИ; О ТАКОЙ СИТУАЦИИ ПРОГРАММА НАПОМНИТ ПОЛЬЗОВАТЕЛЮ СООБЩЕНИЕМ “ЗАДАЙТЕ ФУНКЦИЮ...” 180 LIST 130: REM ВЫВОД ТЕКСТА ОПЕРАТОРА, СОДЕРЖАЩЕГО 190 REM ЗАПИСЬ ЗАДАННОЙ ФУНКЦИИ 200 REM ОБРАЩЕНИЕ К ПОЛЬЗОВАТЕЛЮ ЗА УКАЗАНИЕМ МАСШТАБА ПО ОСИ X 210 PRINT ”Х ПРИНИМАЕТ ЗНАЧЕНИЯ ОТ А ДО В”: INPUT ’’ЗАДАЙТЕ ЗНАЧЕНИЯ А И В:”; А, В 220 PRINT ’’ЗАДАЙТЕ РАССТОЯНИЕ МЕЖДУ МЕТКАМИ НА ОСЯХ”: PRINT ’’ЕСЛИ МЕТКИ НЕ НУЖНЫ, ВВЕДИТЕ НУЛЬ”: INPUT ТХ 230 SX = 278/(B- A): REM SX-КОЭФФИЦИЕНТ МАСШТАБИРОВАНИЯ ПО ОСИ X 240 DEF FN Х(Х) - INT((X - A)*SX + .5): REM FNX —ФУНКЦИЯ МАСШТАБИРОВАНИЯ ПО ОСИ X 250 DEF FN Y(Y) = INT(190.5— 190*(Y — C)/(D—С)): REM FNY —ФУНКЦИЯ МАСШТАБИРОВАНИЯ ПО ОСИ Y 260 DX = (B—А)/139: REM DX-ИНТЕРВАЛ ЗНАЧЕНИЙ X 270 DIM Y(139): REM РЕЗЕРВИРОВАНИЕ ПАМЯТИ ДЛЯ ХРАНЕНИЯ ОТСЧЕТОВ ПО ОСИ Y: КАЖДЫЙ 1-Й ОТСЧЕТ СООТВЕТСТВУЕТ 1-Й ТОЧКЕ ГРАФИКА ФУНКЦИИ
344 Приложение 280 Х = А: REM ПРИСВОЕНИЕ X НАЧАЛЬНОГО ЗНАЧЕНИЯ, РАВНОГО А 290 YL = FN F(A): YU = YL: REM YL И YU ПРЕДНАЗНАЧЕНЫ ДЛЯ ХРАНЕНИЯ МИНИМАЛЬНОГО И МАКСИМАЛЬНОГО ЗНАЧЕНИЙ Y СООТВЕТСТВЕННО 300 FOR 1=0 ТО 139: REM ВЫЧИСЛЕНИЕМ ВСЕХ ЗНАЧЕНИЙ Y, ПОИСК МИНИМАЛЬНОГО И МАКСИМАЛЬНОГО 310 Y(I) = FN F(X): X = X + DX 320 IF Y(I) > YU THEN YU = Y(I) 330 IF Y(l)< YL THEN YL = Y(I) 340 NEXT I 350 REM ВЫВОД МАКСИМАЛЬНОГО И МИНИМАЛЬНОГО ЗНАЧЕНИЙ Y ДЛЯ ПОЛЬЗОВАТЕЛЯ, ПРИНИМАЮЩЕГО РЕШЕНИЕ О ВЫБОРЕ ПРЕДЕЛОВ ВОСПРОИЗВОДИМЫХ ЗНАЧЕНИЙ Y 360 PRINT ”Y МАКСИМАЛЬНОЕ = ”; YU 370 PRINT ”Y МИНИМАЛЬНОЕ =”; YL 380 REM ОБРАЩЕНИЕ К ПОЛЬЗОВАТЕЛЮ ЗА УКАЗАНИЕМ ИНТЕРВАЛА ВОСПРОИЗВОДИМЫХ ЗНАЧЕНИЙ Y И ШАГА МЕТОК ПО ОСИ Y 390 PRINT ”Y ПРИНИМАЕТ ЗНАЧЕНИЯ ОТ С ДО D” 400 INPUT ’’ЗАДАЙТЕ ЗНАЧЕНИЯ С И D”; С, D 410 PRINT ’’ЗАДАЙТЕ РАССТОЯНИЕ МЕЖДУ МЕТКАМИ НА ОСИ Y (0—ОТКАЗ ОТ НАНЕСЕНИЯ МЕТОК)” 420 INPUT TY 430 HGR: HCOLOR=7: POKE—16 302,0: REM ПОЛНОФОРМАТНЫЙ ГРАФИЧЕСКИЙ РЕЖИМ С ВЫСОКОЙ РАЗРЕШАЮЩЕЙ СПОСОБНОСТЬЮ 440 HPLOT FN Х(0), 0 ТО FN Х(0), 191: REM ПОСТРОЕНИЕ ОСИ Y 450 HPLOT 0, FN Y(0) ТО 279, FN Y(0): REM ПОСТРОЕНИЕ ОСИ X 460 IF TY = 0 THEN 530 470 REM ЕСЛИ TY < >0, НАНЕСЕНИЕ МЕТОК НА ОСЬ Y 480 MY = FN Х(0) —2: IF MY < 0 THENMY=0 490 Y = INT(D/TY)*TY 500 HPLOT MY, FN Y(Y) TO FN X(0)+2, FN Y(Y) 510 Y=Y—TY 520 IF Y > =C THEN 500 530 IF TX = 0 THEN 600 540 REM ЕСЛИ TX < >0, TO ОСУЩЕСТВЛЯЕТСЯ НАНЕСЕНИЕ МЕТОК НА ОСЬ X 550 MY = FN Y(0)+2: IF MY > 191 THEN MY = 191 560 X = INT (B/TX)*TX 570 HPLOT FN X(X), FN Y(0) — 2 TO FN X(X), MY 580 X = X-TX 590 IF A < = X THEN 570 600 X=A: REM НАЧАЛЬНОЕ ЗНАЧЕНИЕ X=A 610 REM 620 REMSW= —1, ЕСЛИ ПОСЛЕДНЕЕ ЗНАЧЕНИЕ Y СЛИШКОМ МАЛО, SW=+1, ЕСЛИ ЭТО ЗНАЧЕНИЕ СЛИШКОМ ВЕЛИКО, И SW = 0, ЕСЛИ ТОЧКА ПОПАДАЕТ В ПРЕДЕЛЫ ПОЛЯ ПРЕДСТАВЛЕНИЯ ГРАФИКА ФУНКЦИИ 630 IF Y(0) > D THEN SW = 1: GOTO 660: REM ЕСЛИ ПЕРВОЕ ЗНАЧЕНИЕ СЛИШКОМ ВЕЛИКО, УСТАНАВЛИВАЕТСЯ SW=+1 И ЭТА ТОЧКА НЕ ОТОБРАЖАЕТСЯ НА ГРАФИКЕ 640 IF Y(0) < С THEN SW = — 1: GOTO 660: REM ЕСЛИ ПЕРВОЕ ЗНАЧЕНИЕ СЛИШКОМ МАЛО, УСТАНАВЛИВАЕТСЯ SW= —1 И ЭТА ТОЧКА НЕ ОТОБРАЖАЕТСЯ НА ГРАФИКЕ
Приложение 345 650 HPLOT FN X(A), FN Y(Y(0)); SW = 0 660 FOR 1 = 1 TO 139 670 X —X4-DX 680 IF SW = 0 AND Y(I) > =C AND Y(I)<=D THEN HPLOT TO FN X(X), FN Y(Y(I)): GO TO 750: REM ЕСЛИ ПРЕДЫДУЩАЯ И ТЕКУЩАЯ ТОЧКИ НАХОДЯТСЯ В ПРЕДЕЛАХ ПОЛЯ ПРЕДСТАВЛЕНИЯ ГРАФИКА, ТО ОТОБРАЖАЕТСЯ ТЕКУЩАЯ И ПОСТРОЕНИЕ ПРОДОЛЖАЕТСЯ 690 IF SW = — 1 AND Y(I) > =C AND Y(I) < = D THEN HPLOT FN X(X)— 1.191 TO FN 'X(X), FN Y(Y(I)): GO TO 750: REM ЕСЛИ ПРЕДЫДУЩАЯ ТОЧКА НИЖЕ ПОЛЯ ПРЕДСТАВЛЕНИЯ ГРАФИКА, А ТЕКУЩАЯ НАХОДЯТСЯ В НЕМ, ТО СТРОИТСЯ ОТРЕЗОК ОТ НИЖНЕЙ ГРАНИЦЫ ПОЛЯ К ТЕКУЩЕЙ ТОЧКЕ 700 IF SW=- 4-1 AND Y(I) > =C AND Y(I) < =D THEN HPLOT FN X(X)—1,0 TO FN X(X), FN Y(Y(I)): SW = 0: GO TO 750: REM ЕСЛИ ПРЕДЫДУЩАЯ ТОЧКА ВЫШЕ ПОЛЯ ПРЕДСТАВЛЕНИЯ ГРАФИКА, А ТЕКУЩАЯ НАХОДЯТСЯ В НЕМ, ТО СТРОИТСЯ ОТРЕЗОК ОТ ВЕРХНЕЙ ГРАНИЦЫ ПОЛЯ К ТЕКУЩЕЙ ТОЧКЕ 710 IF SW = 0 AND Y(I) < С THEN SW= — 1: HPLOT TO FN X(X) — 1,191: GO TO 750: REM ЕСЛИ ПРЕДЫДУЩАЯ ТОЧКА В ПРЕДЕЛАХ ПОЛЯ ПРЕДСТАВЛЕНИЯ ГРАФИКА, А ТЕКУЩАЯ НИЖЕ ЕГО ГРАНИЦЫ, СТРОИТСЯ ОТРЕЗОК ОТ ПРЕДЫДУЩЕЙ ТОЧКИ К НИЖНЕЙ ГРАНИЦЕ ПОЛЯ 720 IFSW = 0 AND Y(I) > D THEN SW= 4-1: HPLOT TO FN X(X)—1,0: GO TO 750: REM ЕСЛИ ПРЕДЫДУЩАЯ ТОЧКА В ПРЕДЕЛАХ ПОЛЯ ПРЕДСТАВЛЕНИЯ ГРАФИКА, А ТЕКУЩАЯ ВЫШЕ ЕГО ГРАНИЦЫ, СТРОИТСЯ ОТРЕЗОК ОТ ПРЕДЫДУЩЕЙ ТОЧКИ К ВЕРХНЕЙ ГРАНИЦЕ ПОЛЯ 730 IF Y(I) < С THEN SW= — 1: REM ЕСЛИ ПРЕДЫДУЩАЯ И ТЕКУЩАЯ ТОЧКИ ВНЕ ПРЕДЕЛОВ ПОЛЯ ПРЕДСТАВЛЕНИЯ ГРАФИКА, ТО ОБНОВЛЯЕТСЯ ЗНАЧЕНИЕ SW 740 IF Y(I) > D THEN SW = 1 750 NEXT I 760 GET WS: REM ОСТАНОВ ПО ЗАВЕРШЕНИИ ПОСТРОЕНИЯ ГРАФИКА ФУНКЦИИ 770 IF W$ = ”G” THEN GO TO 870 780 IF W$ = ”Q” THEN TEXT : END 790 IF WS = ”R” THEN TEXT : GO TO 390: REM ПОСТРОЕНИЕ НОВОГО ГРАФИКА, ЕСЛИ НАЖАТА КЛАВИША ”R” 800 IF FF = 0 THEN PRINT ’’ВВЕДИТЕ ’G’ ДЛЯ ПОЛУЧЕНИЯ ’ТВЕРДОЙ’ КОПИИ (ГРАФИКА ФУНКЦИИ НА БУМАГЕ)”: PRINT ’’ВВЕДИТЕ ’Q’ ДЛЯ ОКОНЧАНИЯ РАБОТЫ”: FF = 1 810 TEXT : REM ДИСПЛЕЙ ПЕРЕВОДИТСЯ В ТЕКСТОВЫЙ РЕЖИМ ПРИ НАЖАТИИ ЛЮБОЙ КЛАВИШИ 820 GET WS: REM ОСТАНОВ 830 IF W$ = ”G” THEN GOTO 870 840 IF W$ = ”Q” THEN TEXT : END 850 IF WS = ”R” THEN GOTO 390: REM ПОСТРОЕНИЕ НОВОГО ГРАФИКА ПРИ НАЖАТИИ КЛАВИШИ ”R” 860 РОКЕ —16304,0: GOTO 760: REM ГРАФИК ФУНКЦИИ ВОСПРОИЗВОДИТСЯ НА ЭКРАНЕ ДИСПЛЕЯ ПРИ НАЖАТИИ ЛЮБОЙ КЛАВИШИ 870 REM 880 REM * * * ЗДЕСЬ РАЗМЕЩАЕТСЯ ПОДПРОГРАММА * * * 890 REM * * * ПОЛУЧЕНИЯ ТВЕРДОЙ КОПИИ » » * 13 № £89
346 Приложение 900 REM * * * ГРАФИКА НА ПЕЧАТАЮЩЕМ УСТРОЙСТВЕ * * * 999 END Программа 29.1 100 REM ПОСТРОЕНИЕ ПОВЕРХНОСТИ В ТРЕХМЕРНОМ 110 REM ПРОСТРАНСТВЕ 120 LOMEM: 16 384: REM ВЫДЕЛЕНИЕ ДЛЯ ПЕРЕМЕННЫХ ПРОГРАММЫ ОБЛАСТИ ПАМЯТИ С НАИМЕНЬШИМ ДОСТУПНЫМ АДРЕСОМ» 130 НОМЕ : REM ОЧИСТКА ЭКРАНА 140 G$= CHRg (7): REM НАСТРОЙКА НА ПОДАЧУ ЗВУКОВОГО СИГНАЛА 150 PRINT G$;: FLASH : PRINT ’’ЗАДАЙТЕ ФУНКЦИЮ В ВИДЕ ОПЕРАТОРА”: NORMAL : PRINT : PRINT "150 DEF FNF(Y) = F(X, Y)” : END 160 PRINT "ФУНКЦИЯ” : PRINT ; LIST 150 170 INPUT "ЗАДАЙТЕ ДИАПАЗОН ВОСПРОИЗВОДИМЫХ ЗНАЧЕНИЙ X (НИЖНИЙ ПРЕДЕЛ, ВЕРХНИЙ ПРЕДЕЛ):”; XL, ХН 180 INPUT "ЗАДАЙТЕ ДИАПАЗОН ВОСПРОИЗВОДИМЫХ ЗНАЧЕНИЙ Y (НИЖНИЙ ПРЕДЕЛ, ВЕРХНИЙ ПРЕДЕЛ):”; YL, YH 190 INPUT "ЗАДАЙТЕ ДИАПАЗОН ВОСПРОИЗВОДИМЫХ ЗНАЧЕНИЙ Z (НИЖНИЙ ПРЕДЕЛ, ВЕРХНИЙ ПРЕДЕЛ):”; ZL, ZH 200 INPUT "ЗАДАЙТЕ ЧИСЛО ТОЧЕК НА ОСИ X:”; N 210 DY = (YH — YL) / 139: REM ВЫЧИСЛЕНИЕ ШАГА ПО ОСИ Y 220 DX = (ХН — XL)/N: REM ВЫЧИСЛЕНИЕ ШАГА ПО ОСИ X 230 SZ = 191 / (ZH — ZL): REM SZ —КОЭФФИЦИЕНТ МАСШТАБИРОВАНИЯ ПО ОСИ Z 240 DEF FN Z(Z) = 191 — SZ * (Z—ZL): REM ФУНКЦИЯ МАСШТАБИРОВАНИЯ ПО ОСИ Z 250 ZT = .4 : YT = .5: REM ПРИСВОЕНИЕ КОЭФФИЦИЕНТАМ СМЕЩЕНИЯ СЕЧЕНИЙ "СТАНДАРТНЫХ” ЗНАЧЕНИЙ 260 PRINT : PRINT "СТАНДАРТНЫЕ ВЕЛИЧИНЫ СМЕЩЕНИЯ: ZT= .4, YT= .5” 270 INPUT ’’УКАЖИТЕ Y (ДА), ЕСЛИ ХОТИТЕ ИХ ИЗМЕНИТЬ; УКАЖИТЕ N (НЕТ), ЕСЛИ ИЗМЕНЕНИЯ НЕ ТРЕБУЮТСЯ”; Х$ 280 IF Х$ = ”Y” THEN INPUT ”ZT =”; ZT: REM ВВОД ЗНАЧЕНИЯ ZT 290 IF X$ = ”Y” THEN INPUT ”YT =”; YT: REM ВВОД ЗНАЧЕНИЯ YT 300 REM ПОСТРОЕНИЕ ГРАФИКА ФУНКЦИИ В ТРЕХМЕРНОМ ПРОСТРАНСТВЕ 310 HGR : РОКЕ —16 302,0: REM ПОЛНОФОРМАТНОЙ ГРАФИЧЕСКИЙ РЕЖИМ С ВЫСОКОЙ РАЗРЕШАЮЩЕЙ СПОСОБНОСТЬЮ 320 X=XL » Подобное использование оператора LOMEM позволяет защитить области данных программы от возможных ’’интерференций”, вызываемых работой системных программных средств при использовании графического режима с высокой разрешающей способностью.— Прим, рсд.
Приложение 347 330 FOR 1 = 0 ТО N: REM ЦИКЛ ПО X 340 Y == YL 350 FOR J = 0 TO 139: REM ЦИКЛ ПО Y 370 Z = FN F(Y+YT * X): REM ВЫЧИСЛЕНИЕ Z С УЧЕТОМ СДВИГА ПО Y 380 Z = Z —ZT « X: REM СДВИГ ВНИЗ С УЧЕТОМ ZT 390 GOSUB 820: REM ПОСТРОЕНИЕ ТЕКУЩЕЙ ТОЧКИ 400 Y = Y-RDY: REM ПРИРАЩЕНИЕ ЗНАЧЕНИЯ Y 410 NEXT J 420 X = X + DX: NEXT I: REM ПРИРАЩЕНИЕ ЗНАЧЕНИЯ X 430 PRINT G$ 440 GET X$: IF X$ = ”G” THEN GOTO 600 450 TEXT 460 GET X$: IF X$ = ”G” THEN GOTO 600 470 POKE—16304,0 480 GOTO 440: REM ЭТОТ ЦИКЛ ОБЕСПЕЧИВАЕТ ПЕРЕКЛЮЧЕНИЕ ДИСПЛЕЯ ИЗ ГРАФИЧЕСКОГО РЕЖИМА В ТЕКСТОВЫЙ И НАОБОРОТ 600 REM ЗДЕСЬ РАЗМЕЩАЕТСЯ ПРОГРАММА ВЫВОДА 610 REM ИЗОБРАЖЕНИЯ НА ПЕЧАТАЮЩЕЕ УСТРОЙСТВО 800 REM ПОДПРОГРАММА ПОСТРОЕНИЯ ТОЧКИ ИЗОБРАЖЕНИЯ 810 И УДАЛЕНИЯ СКРЫТЫХ ТОЧЕК 820 TZ = FN Z(Z): REM МАСШТАБИРОВАНИЕ ПО ОСИ Z 830 IF TZ > 191 THEN RETURN : REM ТОЧКА ЗА ПРЕДЕЛАМИ ПОЛЯ ПРЕДСТАВЛЕНИЯ ГРАФИКА 840 DJ = J4-J 850 IF TZ < 0 THEN HCOLOR = 0: HPLOT DJ, О TO DJ, 191} RETURN: REM ПОСТРОЕНИЕ ТОЧКИ В ПОЛЕ ПРЕДСТАВЛЕНИЯ ИЗОБРАЖЕНИЯ 870 IF TZ = 191 THEN RETURN 880 HCOLOR = 0 890 HPLOT DJ,TZ + 1 TO DJ, 191: RETURN: REM СТИРАНИЕ ЛИНИЙ, СКРЫТЫХ ЗА ДАННОЙ 13*
Дополнение НЕФОРМАЛЬНОЕ ОПИСАНИЕ ОСНОВ ЯЗЫКА ПРОГРАММИРОВАНИЯ БЕЙСИК ЭВМ APPLE II (APPLESOFT II BASIC) 1. Структура языка программирования Язык Бейсик является одним из наиболее широко применяе¬ мых языков программирования, особенно популярным среди начинающих пользователей ЭВМ благодаря своей простоте, уни¬ версальности и многообразию средств решения задач самых раз¬ личных областей знаний. Вычислительные машины индивиду¬ ального пользования, подобные персональным ЭВМ фирмы App¬ le, предоставляют в распоряжение программиста тот или иной диалект этого языка. ЭВМ типа Apple II располагает средствами программирования на весьма мощном диалекте подобного языка, получившем название Applesoft II BASIC и именуемом в после¬ дующем изложении просто Бейсик. Любой язык программирования высокого уровня (Фортран, Паскаль, Бейсик и др.) имеет структуру, подобную структуре ’’живых”, разговорных языков (английского, русского и т. д.). Основу языка составляют символы (буквы, цифры, знаки). В языке Бейсик это — латинские буквы, арабские цифры, знаки типа ”+” (плюс), (точка), (двоеточие), ”(” (открывающая круглая скобка), ”)” (закрывающая круглая скобка) и т. д. Из неделимых ’’элементарных” частиц (символов) строятся простей¬ шие смысловые (семантические) понятия — слова языка. Четыре группы слов различают в языке программирования, подобном языку Бейсик: константы, имена переменных (принимающих значения констант), служебные слова (’’зарезервированные” для особого употребления) и указатели функций (синуса, извлечения квадратного корня и т. д.). Из слов посредством знаков операций, например знаков арифметических операций сложения (”+”), умножения (”*”), деления (”/”), возведения в степень (”А”), фор¬ мируются словосочетания, называемые выражениями (подобными хорошо известным из курса средней школы арифметическим вы¬ ражениям). Из отдельных слов и целых выражений формируются так называемые операторы или команды. Примером может слу¬ жить оператор PRINT X, осуществляющий вывод (на экран дисплея или печатающее устройство) значения переменной X, ЭВМ реагирует на ’’приказы” человека, только если они пред¬ ставлены в форме команд. Последовательность команд, подлежа¬ щих выполнению вычислительной машиной, представляет собой
Дополнение 349 текст на языке Бейсик; каждая строка текста нумеруется целыми числами (обычно 10, 20, 30 и т. д., хотя, возможно, и 1, 2, 3 и т. д.). В одной строке такого текста может размещаться один или несколько операторов; в последнем случае между двумя сосед¬ ними операторами ставится двоеточие. Будучи набранной на кла¬ виатуре ЭВМ, подобная последовательность операторов (команд)1 может заставить машину выполнять соответствующие операции после нажатия клавиши ’’RUN” (’’пуск”). Если требуется выпол¬ нить только одну команду, то номер ей не присваивается; после набора текста этой команды на клавиатуре достаточно нажать кла¬ вишу Return и соответствующие операции будут выполнены. Совокупность операторов, описывающих алгоритм решения поставленной задачи, называется программой. Текст программы, набираемый на клавиатуре ЭВМ, как правило, одновременно воспроизводится на экране дисплея и при желании может быть записан на хранение в память машины. Итак, структура языка Бейсик по степени иерархии (сложности) его элементов кратко может быть определена следующим набором понятий: символы, слова, выражения, операторы, программа. 2. Константы Константа — это разновидность слова языка программирова¬ ния. Различают числовые и символьные константы. Первые — это целые или вещественные числа, вторые — строки (цепочки) символов. 2.1. Числа Целые числа, используемые в программе на языке Бейсик, не должны выходить за диапазон значений от —32 767 до +32 767; вещественные числа должны принадлежать диапазону значений от —10‘38 до +Ю38. Представление вещественного числа в программе на языке Бейсик предполагает отделение целой части от дробной точкой, а не запятой. Эту точку называют десятичной. Пример: 3.14. При воспроизведении вещественного числа на экране дисплея или бумаге печатающего устройства машина ’’руководствуется” следующими правилами: 1) если абсолютное значение числа — целая величина, не выходящая за диапазон значений 0—999 999 999, то число пред¬ ставляется как целое; 2) если абсолютное значение числа больше или равно 0,01, но меньше, чем 999 999 999,2, то число воспроизводится в виде целой и дробной частей, разделяемых десятичной точкой;
350 Дополнение 3) если подлежащее воспроизведению число не подпадает ни в одну из перечисленных выше категорий (1 или 2), то оно представляется в виде вещественной мантиссы и цело¬ го порядка, разделяемых буквой ”Е”, согласно формату SX.XXXXXXXXESXX, где ”S”— условное обозначение знака (знак не воспроизводится), ”Х” — условное обозначение цифры (0—9); ”Е” — условное обозначение основания степени,, равного 10. Примеры записи чисел: Математическая форма Форма представления представления на языке Бейсик —321 6705 —27,450 1Q20 — 12,34 567816-1017 1000 000 000 999 999 999 —321 6705 —27.45 1Е-1-20 — 1.23 456 782Е-|-18 1Е+09 999 999 999 Примечание: незначащие нули ’’подавляются” (не воспроизво¬ дятся); числа, количество значащих цифр которых выходит за так называемую разрядную сетку, округляются. 2.2. Строки символов ЭВМ может оперировать не только числовыми, но и символь¬ ными константами (строками символов). Символьная констан¬ та — это последовательность символов языка Бейсик, заключен¬ ная в кавычки. Саму последовательность символов (без кавычек)' принято называть литералом. Примеры записи строк символов: ’’LIST 15”, ’’TEST 1”, ”3.14”. Число символов в строке не должно выходить за пределы диапазона значений 0—255. Строка, не содержащая символы, называется нулевой (или пустой (””). 3. Имена переменных 3.1. Простые переменные Имена переменных, используемых в программе, являются разновидностью слов языка программирования, т. е. тех прос¬ тейших смысловых понятий, из которых формируются команды для ЭВМ. Имя переменной — это символическая форма записи адреса области памяти вычислительной машины, в которой уже расположена или куда будет помещена числовая или символьная
Дополнение 351 константа. В соответствии с этим различают переменные числовые и символьные. Имя символьной переменной должно завершаться знаком ”S”. Числовые переменные разделяются на переменные целого и вещественного типов. Имя переменной целого типа всег¬ да заканчивается символом Имя любой переменной должно начинаться с буквы и может содержать до 238 символов (букв, цифр). Однако только первые два символа имени используются вычислительной машиной для идентификации переменной, а следовательно, и соответствующей области памяти. Это означает, что имена MAX, MARK и MASSA воспринимаются вычислительной машиной как имя одной и той же переменной (МА). Примеры записи имен переменной: Правильно сформированные имена Неправильно сформированные имена SUM PEREM N 1% ТО 12Y XGOTO Примечание: имя переменной не должно начинаться цифрой (12Y); в качестве имени переменной нельзя использовать служеб¬ ное слово (ТО); служебное слово не может быть частью имени переменной (XGOTO). 3.2.Индексированные переменные. Массивы Как числовые, так и символьные переменные можно разде¬ лить на две категории: простые и индексированные. Все сказан¬ ное выше о переменных относится как к тем, так и к другим. Ис¬ ключением является имя переменной. Если при решении той или иной задачи приходится иметь дело с совокупностью (последо¬ вательностью, таблицей, пакетом таблиц) однородных данных, часто оказывается рациональным размещать эти данные в смеж¬ ных областях памяти, присваивая всем областям одно и то же имя, но каждой из них свой уникальный индекс (номер) или комбинацию индексов (номеров). В этом случае принято гово¬ рить, что имеет место массив данных: одномерный (последователь¬ ность данных), двумерный (таблица данных), трехмерный (пакет или ’’стопка” таблиц) и т. д. Каждый элемент такого массива адре¬ суем посредством индексированной переменной, составленной из имени массива, за которым в скобках указывается индекс (номер) элемента, если массив одномерный, или разделяемые запятыми индексы элемента (номера строки и столбца, на ’’пересечении” которых элемент находится), если массив двумерный. Примеры записи индексированных переменных:
352 Дополнение А (I) 1-й элемент одномерного массива А вещественных чисел ТВ% (3, К) элемент двумерного массива целых чисел, распо¬ ложенный на «пересечении» 3-й строки и К-го столбца Если массив, подлежащий использованию в программе, должен содержать более 11 элементов, то прежде, чем обращаться к его элементам, необходимо в памяти машины зарезервировать для него соответствующее место с помощью оператора DIM. Например, оператор DIM А (25) резервирует память для 26 вещест¬ венных чисел. Отметим, что индексация резервируемых областей всегда начинается с нуля, а поэтому в данном случае резервиру¬ ется не 25, а 26 областей ячеек памяти. В одном операторе DIM можно описать несколько резервируемых массивов. Например, операторы DIM А (25), RES (6,7) резервируют память для 26 элементов одномерного массива А и 42 элемента для двумерного массива RES. Если в программе использовать индексированную перемен¬ ную, например В(К), не описывая одноименный массив операто¬ ром DIM, то ЭВМ автоматически зарезервирует смежные области памяти, к которым можно адресоваться следующим образом: В(0), В(1), В(2), . . ., В (10). В процессе выполнения программы переменным могут при¬ сваиваться различные значения. Однако следует помнить, что, согласно правилам языка Бейсик, прежде чем будут выполнены какие-либо операции присваивания, предписываемые програм¬ мой, всем числовым переменным автоматически присваиваются нулевые значения. 4. Служебные слова Программист ’’общается” с ЭВМ посредством команд, которые он формирует из отдельных слов языка программирования: кон¬ стант, имен переменных, указателей функций, служебных слов. Набор последних не велик. Они заимствованы из английского языка, употребляются в определенных сочетаниях с другими словами языка программирования и выполняют роль идентифи¬ каторов определенных действий, которые должна выполнять ЭВМ. Примеры служебных слов: INPUT, PRINT, GO ТО, IF, THEN, REM, STOP и т. д. Служебное слово RE?4 указывает, что следующий за ним текст является комментарием, поясняю¬ щим программу. ЭВМ игнорирует информацию, размещаемую между словом REM и началом следующего оператора программы* (Признаком начала очередного оператора является наличие двое¬
Дополнение 353 точия, если этот оператор является не первым в данной строке текста программы, или наличие номера оператора, если он раз¬ мещается первым в следующей по порядку строке.) 5. Указатели функций Вычислительная машина непосредственно выполняет арифме¬ тические операции (сложение, вычитание, умножение, деление, возведение в степень) и операции сравнения (равны ли две кон¬ станты, а если нет, то которая из них больше). Все остальные операции над данными с целью их модификации выполняются посредством специально разработанных процедур (встроенных функций) или процедур, определяемых программистом в созда¬ ваемой им программе (функций, определяемых пользователем). Для обращения к процедуре необходимо указать ее имя (имя фун¬ кции) и параметры исходных данных (список параметров). Имя и следующий за ним в круглых скобках перечень параметров пред¬ ставляют собой разновидность слова языка программирования, называемого указателем функции. 5.1. Встроенные функции Описываемый язык Бейсик предоставляет в распоряжение программиста большое разнообразие встроенных функций для обработки числовой и символьной информации. Перечислим некоторые из наиболее употребляемых функций, выполняющих арифметические операции над числовым значением арифметиче¬ ского выражения, условно обозначаемого ”ab”: а) тригонометрические функции SIN(<2&), COS(ab), TAN(ab) вычисления синуса, косинуса и тангенса соответственно (при условии, что в результате вычисления ab получается значение угла в радианах); б) функция INT(tf&) определения целой части числового зна¬ чения ab (определение целого числа, ближайшего меньшего или равного по значению); в) функция SQRRzb) извлечения квадратного корня из число¬ вого значения ab\ г) функция ABS определения абсолютного значения (моду¬ ля) аЬ; д) функция ЕХР(яЬ) возведения натурального числа е (2,718 289) в степень ab; е) функция LOG(ab) вычисления натурального логарифма ab; ж) функция RND(ab) случайного выбора вещественного чис¬ ла, большего или равного 0, но меньшего 1; если ab>0, то эта функция выбирает каждый раз новое случайное число из задан¬
354 Дополнение ного диапазона; если ab<0, то при использовании того же значе¬ ния ab функция выбирает одно и то же число; если ab=0, то функция выбирает то число, которое было выбрано при предыду¬ щем использовании этой функции. Язык Бейсик располагает встроенными функциями для выде¬ ления части строки символов (сс) LEFT$(cc,n), RIGHT$(cc,n), MID$(cc,n,m), определения длины строки символов LEN(cc), а также функцией STR$(#fc) преобразования числа или число¬ вого значения арифметического выражения ab в строку символов и функцией VAL(cc) преобразования строки символов в число. Функция LEFT$(cc,rz) или RIGHT$(cc,n) позволяет выде¬ лить из исходной строки символов (сс)п крайних слева или справа символов соответственно. Так, если значением символьной пере¬ менной С$ является текст MAXIMUM 1, то в результате выпол¬ нения оператора PRINT LEFT$(C$,3) на экран дисплея выводится МАХ. Если же использовать опера¬ тор PRINT RIGHT$(C$,3), то будет выведено Ml. С помощью функции MID$(cc,/i,m) из строки символов (сс) можно выделить т символов, начиная с символа под номером п (символы нумеруются слева направо, начиная с нуля: 0, 1, 2. . . .). Например, оператор PRINT MID$(C$,2,5) выводит на экран дисплея XIMUM. Примечание: в качестве сс,п>т во всех функциях, выполняю¬ щих операции со строками символов, могут использоваться не только переменные или константы (сс — символьные, п и т — числовые), но и соответствующие выражения (символьные или арифметические). Функция LEN(cc) определяет длину строки символов (сс). Так, для упомянутой выше переменной С$ значение LEN(C$) равно 9, а значение LEN(”LIST”) равно 4. Иногда необходимо число представить в виде строки символов, а строку символов — в числовой форме. Для этого используют функции STR$(ab) и VAL(cc) соответственно. Например, зна¬ чением функции STR$ (3.14) является символьная константа ”3.14”, а значением функции VAL (”3.14”) — число 3.14. Функция VAL(cc) ’’пытается” интерпретировать любую сим¬ вольную строку (сс) как целое или вещественное число. Строка просматривается слева направо. Если вся последовательность символов или первая (левая) часть их по составу символов подоб¬ на числу, то значением функции VAL(cc) является это число, в противном случае ее значение равно нулю. Так, например, зна¬ чение функции VAL (”—123.5 QR”) равно —123.5, а значение функции VAL(C$) равно 0. Указатели функций могут использоваться в качестве аргумен¬ тов других функций.
Дополнение 355 Пример. Вещественное число 3.1415 требуется представить в виде 3.14 (т. е. ’’отбросить” две последние цифры). Решение этой задачи достигается использованием следующего сочетания рас¬ смотренных выше функций: VAL(LEFT$(STR$(3.1415”), 4)) или VAL(LEFT$(”3.1415”,4)) 5.2. Функции, определяемые в программе Если в разрабатываемой программе требуется неоднократно обращаться к вычислениям, производимым по одной и той же фор¬ муле с использованием в качестве исходных данных значения той или иной числовой переменной вещественного типа, то вы¬ числение по этой формуле можно определить как некоторую функцию с помощью оператора DEF FN. Например, функцию z/=2*%+3 можно определить, используя в программе оператор 10 DEF FN Y(X) = 2* Х4-З Если далее в тексте программы имеется оператор 20 PRINT FN Y(3.14) то на экран дисплея (или бумагу печатающего устройства) выво¬ дится число 9.28. Последующее применение оператора 30 PRINT FN Y(— J) сопровождается выводом числа 1.6, Оператор DEF FN должен предшествовать первому исполь¬ зованию функции FN в программе. 6. Выражения Константы, переменные и указатели функций, связанные меж¬ ду собой знаками операций, образуют выражения языка програм¬ мирования. В языке Бейсик следует различать арифметические и символьные выражения. 6.1. Арифметические выражения Числовые константы, переменные и указатели арифметичес¬ ких функций, связанные между собой знаками арифметических операций — сложения (”+”), вычитания (”—”), умножения (”*”), деления (”/”), возведения в степень (”Д”) — и заключае¬ мые, если это необходимо, в круглые скобки, образуют арифме¬ тические выражения. Очередность выполнения операций в про¬ грамме строго соответствует правилам математики. В частности, первыми выполняются арифметические операции, указываемые
356 Дополнение в скобках; при этом сначала вычисляются значения функций. Например, математическая запись выражения — 6 + V — 4 * а С 2а на языке Бейсик имеет следующий вид: (— в + SQR (В Л2- 4 А * С))/(2 * А) 6.2. Символьные выражения Символьные константы, переменные и указатели символьных функций, связываемые между собой знаком соединения (слияния) образуют символьные выражения. Например, результатом ’’вычисления” символьного выражения ’’МАС”+”СА”, составлен¬ ного из двух строк символов (символьных констант) ”МАС” и ”СА”, формируется строка символов ’’МАССА”. Если же сим¬ вольная переменная VAR$ имеет значение’’MINIMUM”, то зна¬ чением символьного выражения LEFT$(VAR$,3) + ”SUM1” является строка символов ’’MINSUM 1”. 7. Операторы Операторы языка Бейсик — это команды, выполняя которые ЭВМ решает задачу, поставленную перед ней программистом. Условно операторы можно разделить на три группы: описания (резервирования памяти, определения функций, задания исход¬ ных данных), выполнения операций (вычисления, передачи уп¬ равления, ввода и вывода данных) и установки режима работы ЭВМ и ее внешних устройств (выбора ’’приемника” выходной ин¬ формации и, в частности, печатающего устройства или дисплея, выбора режима работы дисплея текстового или графического с тем или иным уровнем разрешающей способности экрана дисплея и т. д.). Рассмотрим некоторые операторы языка Бейсик, наибо¬ лее употребимые программистами. 7.1. Оператор присваивания Обобщенная форма оператора: [я] [LET] имя = выражение где ”/г” — номер оператора (строки, в которой оператор занимает крайнюю слева, т. е. первую позицию); ’’LET” — служебное (зарезервированное) слово языка Бей¬ сик, которое может быть опущено;
Дополнение 357 ’’имя” — имя переменной (числовой или символьной, простой или индексированной); ”=” знак операции присваивания; ’’выражение” — арифметическое или символьное выражение (в зависимости от того, является ли имя, указываемое слева от знака операции присваивания, именем числовой или символьной переменной); выражение может состоять из одной константы или одного имени переменной. Примеры: Р1=3.14 C$=”MAXIMUM 1” К=К+1 R(J)=A(J)+B(J) 10 LET №/о = 100 Переменной PI вещественного типа при¬ сваивается значение числовой константы (3.14) Символьной переменной С$ присваивается значение символьной константы Значение переменной К увеличивается на I J-му элементу массива R присваивается сумма J-x элементов массива А и В В строке с номером 10 текста программы переменной N% целого типа присваивается значение 100 Примечания: 1. Здесь и далее при записи обобщенной формы опе¬ ратора элементы, помещаемые в прямоугольные скобки (”[”и”1”), использовать не обязательно или следует применять только в особых случаях. (Так, оператор имеет номер только будучи пер¬ вым или единственным в строке программы, поскольку этот номер является одновременно номером данной строки). 2. При записи обобщенной формы всех последующих опера¬ торов возможность использования номера п указываться не бу¬ дет, поскольку каждый оператор может занимать целую строку программы или ’’начинать” строку. 7.2. Оператор безусловной передачи управления Обобщенная форма оператора: GOTO п где ”/г” — номер оператора (строки программы), подлежащего выполнению следующим (оператору с номером п передается управление). Пример: GOTO 250. После выполнения данного оператора следующим выполняется оператор с номером 250,
358 Дополнение 7.3. Оператор условной передачи управления Обобщенная форма оператора: IF отношение THEN on где ’’отношение” — это два операнда, связанные между собой знаком операции отношения; если операнды арифметические (числовые константы, имена переменных или арифметические выражения), то знаком операции отношения являются ”=” (рав¬ но), (больше), ”>=” (больше или равно), (меньше), (меньше или равно), ”О” или ”Х” (не равно); если операнды символьные (строки символов, символьные переменные или выражения), то в качестве знака операции отношения используется (совпадение); ”оп” — оператор безусловной передачи управления (GOTO /г), либо его сокращенная запись в виде номера (/г) оператора, которому передается управление, либо какой-либо другой опера¬ тор языка Бейсик (присваивания, вывода и т. д.), исключая опе¬ раторы условной передачи управления или цикла. Если отношение, указываемое после служебного слова IF, истинно, то следующим выполняется оператор, расположенный после служебного слова THEN; в противном случае (отношение ложно) ЭВМ сразу переходит к выполнению оператора, который в тексте программы размещен непосредственно после данного опе¬ ратора IF. Примеры: IF A > В THEM GOTO 40 IF A > В THEM 40 IF A > В GOTO 40 Эти три оператора выполняют одни и те же действия: если А>В, то управление передается оператору с номером 40, иначе ЭВМ переходит к выполнению оператора, следующего по поряд¬ ку. Третий оператор иллюстрирует единственную возможность не использовать служебное слово THEN, а именно в тех случаях, когда за ним следует оператор GOTO. IF D$ = ”MIN” THEN J =150. Согласно данному оператору, переменной J присваивается значение 150 только в том случае, когда значением символьной переменной D$ является строка символов ”MIN”. 10 К = 0 : SUM = 0 20 К = К+1 30 SUM = SUM + KA3 40 IF К < 25 THEN 20 50 PRINT SUM
Дополнение 359 Этот фрагмент программы (строки 10—50) выполняет вычисление 25 и вывод значения суммы УК3 = 13+23+. . .+253. К=1 7.4. Операторы цикла Одним из главных достоинств ЭВМ является возможность повторения требуемого количества раз одной и той же группы операций, т. е. выполнения циклического вычислительного про¬ цесса (сокращенно цикла). Приведенный выше (в разд. 7.3) 25 фрагмент программы вычисления суммы УК3 содержит описание К = 1 цикла (строки 20—40) посредством операторов присваивания и условной передачи управления. Однако язык Бейсик предо¬ ставляет программисту для описания цикла два специальных оператора: оператор-заголовок цикла и оператор конца тела цикла. Цикл, формируемый в Бейсик-программе с помощью этих операторов, имеет следующую структуру: Оператор — заголовок цикла Оператор 1 тела цикла Оператор N тела цикла Оператор конца тела цикла Тело цикла может содержать ни одного, один или несколько операторов языка Бейсик, и в том числе совокупность операто¬ ров, образующих некоторый цикл, вложенный внутрь данного цикла.. Вложенный цикл в свою очередь может содержать в себе цикл и т. д. Глубина ’’вложения” циклов не должна превышать 10. Пример: использование операторов цикла для вычисления и 25 вывода значения суммы УК3: К=1 10 SUM = 0 20 FOR К=1 ТО 25 Оператор-заголовок цикла 30 SUM = SUM + KA3 40 NEXT К Оператор конца тела цикла 50 PRINT SUM Оператор-заголовок цикла имеет следующую обобщенную FOR nb = ab\ ТО ab2 [STEP аЬЗ] где — имя переменной вещественного типа, последовательно принимающей значения арифметической прогрессии, нижний предел которой равен аЫ, шаг — аЬЗ, а верхний предел — я&2; если шаг равен 1, то аЬЗ и служебное слово STEP можно не ука¬
360 Дополнение зывать; ”abV\ ”аЪ2'\ ”аЬЗ” — арифметические выражения, со¬ ставленные из целых или вещественных констант и переменных. Переменную ”nfe” принято называть параметром цикла. Опе¬ раторы тела цикла выполняются столько раз, сколько значений принимает параметр цикла, т. е. выполнение этих операторов происходит при nb=abl, после этого при nb—аЫ+аЬЗ, затем при пЬ=аЬ1+аЬЗ+аЬЗ, после этого при nb=abl+ab3+ab3+ab3 и т. д. и, наконец, при пЬ-^аЬ2, Совокупность значений парамет¬ ра цикла может представлять собой возрастающую (cib\<Zab2; ab3>0) или убывающую (ab\>ab2; аЬЗ<0) прогрессию. Оператор конца тела цикла имеет следующую обобщенную форму: NEXT \п1о\ тж ”пЬ” — имя переменной, являющейся параметром цикла, тело которого завершает данный оператор NEXT; если в опера¬ торе имя параметра цикла отсутствует, то предполагается, что такой оператор NEXT соответствует в программе ближайшему предыдущему оператору — заголовку цикла. Рассмотрим два примера использования операторов цикла. Пример 1 Дано: одномерный массив (последовательность) 100 чисел 6Z1, 0.2, • • а, . . ., Ярю)* Требуется: описать на языке Бейсик вычисление суммы эле¬ ментов массива, имеющих нечетные порядковые номера (^-Е +а3+. . .6Z99). Решение: фрагмент программы 100 SUM = 0 ПО FOR J == 1 ТО 100 120 SUM = SUM-|-A(J) 130 NEXT J Пример 2 Дано: двумерный массив (таблица) чисел, состоящий из 6 строк и 7 столбцов (fen, fe12, . . ., fez/, . . fe67). Требуется: описать на языке Бейсик вычисление среднего арифметического элементов массива. Решение: фрагмент программы 50 S = 0 55 FOR 1 = 1 ТО 6 60 FOR J = 1 ТО 6 65 S = S-|-A(1, J) 70 NEXT J 75 NEXT I 80 CA = S/42 Оператор-заголовок внешнего цикла Оператор-заголовок внутреннего цикла Оператор конца внутреннего цикла Оператор конца внешнего цикла
Дополнение 361 7.5. Операторы вызова процедуры и возврата из нее Если в различных частях программы требуется выполнение одной и той же группы операций, то вместо многократного пов¬ торения текста подобной процедуры его можно записать где-либо в программе (например, в конце) только один раз, используя в качестве последнего оператора процедуры оператор RETURN. В каждой точке программы, где необходимо выполнение этой процедуры, достаточно разместить оператор GOSUB п, передаю¬ щий управление первому оператору процедуры, который должен иметь номер /г. Приводимая ниже программа позволяет вычислить и вывести значение г по формуле / , 7 , 11 1 13 \/ г \ А-=1 /г=1 ks k=\ / 10 R = 100 20 N = 7 : М = 4 : GOSUB 100 Вызов процедуры 30 R - R - SUM / 7 40 N=11 : М = 3 : GOSUB 100 Вызов процедуры 50 R - R -|- SUM / 11 60 N = 13 : М = 2 : GOSUB 100 Вызов процедуры 70 R = (R — SUM / 13) / 273 80 PRINT R Вывод результата 90 STOP Конец программы 100 SUM = 0 Начало процедуры НО FOR К = 1 TO N 120 SUM = SUM + КЛМ 130 NEXT К 140 RETURN Конец процедуры 7.6. Операторы вывода Информация, подлежащая выводу на экран дисплея или пе¬ чати на бумагу, должна быть направлена к соответствующему внешнему устройству ЭВМ. Для указания устройства, которое должно принимать выводимую информацию, используется спе¬ циальный оператор, имеющий следующую обобщенную форму- PR # п где ”п” — номер устройства — приемника информации, подлежа¬ щей выводу (0</г<7); если /г=0, то информация выводится на экран дисплея. Для указания, что необходимо выводить, используется опера¬ тор PRINT, имеющий следующую обобщенную форму: PRINT список где ’’список” — последовательность отделяемых друг от друга запятой или точкой с запятой констант, имен переменных или
362 Дополнение выражений, значения которых подлежат выводу; если в качестве разделителей используется точка с запятой, то указанные значе¬ ния выводятся непосредственно друг за другом; если же раздели¬ телем является запятая, то эти значения выводятся через интер¬ валы, размер которых (так называемая табуляция) определяется вычислительной машиной. Пример Пусть в программе слово MINIMUM используется как значе¬ ние символьной переменной Т$, а числовой переменной Y при¬ сваивается значение 3,25. Тогда в результате выполнения опе¬ ратора PRINT Т$; ”Y=”; Y выводится следующий текст: MINIMUM Y=3.25. Примечание: для упрощения процесса записи текста опера¬ тора вывода вместо служебного слова PRINT можно использо¬ вать вопросительный знак. 7-7. Операторы ввода Отдельные команды, а также текст программы, подлежащий выполнению на персональной ЭВМ, программист, как правило, набирает на клавиатуре вычислительной машины. Набор клавиш включает не только все символы, используемые языком Бейсик (буквы, цифры, знаки операций), но и специальные знаки, вы¬ полняющие служебные функции (”«-”, и т. д.). Некоторые клавиши имеют особое функциональное назначение и соответст¬ вующие наименования (Return, Reset, Esc, Ctrl). Так, при выводе информации на печать нажатие клавиши Return вызывает перевод каретки к началу следующей строки, а при одновременном нажа¬ тии клавиш Ctrl и G формируется код подачи звукового сигнала (звонок). Для ввода в память ЭВМ информации (числовой и символь¬ ной) используется оператор INPUT, имеющий следующую обоб¬ щенную форму: INPUT [строка;] список, где ’’строка” — строка символов, воспроизводимая на экране дисплея; если эта строка и всегда следующий за ней раздели¬ тель”;” (точка с запятой) отсутствуют, то на экране дисплея вос¬ производится воспросительный знак (?); после появления текста строки или вопросительного знака ЭВМ переходит в состояние ожидания ввода числовой или символьной информации согласно списку ввода; ’’список” — список ввода, содержащий имя одной или не¬ скольких переменных, отделяемых одна от другой запятой. Пример INPUT КР% INPUT ’’НОМЕР, ТЕКСТ”; NM, Т$
Дополнение 363 Выполняя операции, задаваемые первым оператором INPUT, ЭВМ воспроизведет на экране дисплея вопросительный знак и будет ожидать, пока пользователь не наберет на клавиатуре целое число, присваиваемое переменной КР%. Выполняя предписывае¬ мое вторым оператором INPUT, ЭВМ воспроизведет на экране слово НОМЕР, запятую и слово ТЕКСТ и будет ожидать набора на клавиатуре числа, подлежащего присваиванию переменной NM. Набрав это число, пользователь должен нажать клавишу со знаком ”, ’’(запятая), после чего ЭВМ ждет набора строки симво¬ лов, присваиваемой символьной переменной Т$. Процедура ввода, описываемая оператором INPUT, завершается нажатием клавиши Return. Последняя может использоваться вместо кла¬ виши со знаком”, ’’для завершения набора на клавиатуре очеред¬ ного числа или строки символов. Для ввода с клавиатуры в память ЭВМ одиночного символа без воспроизведения его на экране дисплея и нажатия клавиши Return используется оператор GET, имеющий следующую обоб¬ щенную форму: GET имя где ’’имя” — имя переменной, которой присваивается значение вводимого символа. Например, в результате выполнения опера¬ тора GET Х$ и нажатия клавиши N символьной переменной Х$ присваивается значение N. 7.8. Оператор определения данных в программе Для определения данных в программе используется оператор DATA, имеющий следующую обобщенную форму: DATA список где ’’список” — перечень констант (числовых, символьных), ко¬ торые могут быть использованы последовательным применением оператора READ; для возобновления ’’чтения” списка данных сначала используется оператор RESTORE. Рассмотрим применение этих операторов на примере про¬ граммы-игры, предлагающей пользователю за наименьшее коли¬ чество попыток ввести с клавиатуры в память ЭВМ число, совпа¬ дающее с одним из чисел, указанных в списках данных операто¬ ров DATA. 10 PRINT ’’ВВЕДИТЕ ЧИСЛО” 20 INPUT N 30 СТ = 1 40 READ DN 50 IF DN = 111 111 THEN GOTO 90 60 IF DN < > N THEN GOTO 40 70 PRINT ’’ПРАВИЛЬНО! ЧИСЛО ПОПЫТОК РАВНО”, СТ 80 END
364 Дополнение 90 PRINT ’’НЕВЕРНО, ПОПЫТАЙТЕСЬ ЕЩЕ РАЗ” 100 RESTORE 110 СТ = СТ + 1 120 GOTO 10 130 DATA 5, 431, 17, —9, 321, —8, 0, 3.14, 90 140 DATA 123, 19, —13, 36, 111 111 При первом выполнении программы оператор READ присваи¬ вает переменной DN значение 5, при повторном выполнении этого оператора — значение 431 и т. д. После ’’прочтения” оператором READ всех данных списка первого оператора DATA начинается ’’чтение” списка второго оператора DATA. Если и этот список будет исчерпан, а введенное число не совпадет ни с одним из чи¬ сел списков, последним значением переменной DN станет число 111111. Оно используется для вывода сообщения о том, что иг¬ рающий потерпел неудачу. Чтобы повторить сеанс игры, необ¬ ходимо начать чтение данных оператором READ с первого числа списка данных первого оператора DATA. Оператор RESTORE позволяет ’’установить” оператор READ на начало полного спис¬ ка данных, представленного в этой программе двумя операторами DATA. В общем случае оператор READ может использоваться для одновременного ’’чтения” нескольких следующих друг за другом данных из списка оператора DATA. Для этого после слова READ через запятую перечисляются имена переменных, которым не¬ обходимо присвоить значения этих данных. Операторы DATA можно размещать в любом месте программы, поскольку они служат источниками данных для оператора READ и самостоятельно не выполняются. 7.9. Операторы установки режима работы дисплея Для программиста основным источником текущей информации о работе персональной ЭВМ является дисплей. Последний может работать в так называемом текстовом режиме, устанавливаемом оператором TEXT, или в одном из графических режимов работы, задаваемых операторами GR, HGR или HGR2. Устанавливаемый вычислительной машиной по умолчанию текстовый режим работы дисплея позволяет размещать на его экране одновременно 24 строки по 40 символов в каждой. С по¬ мощью оператора TEXT можно отменять графический режим работы и устанавливать текстовый. Различают графический режим работы с низкой разрешающей способностью экрана дисплея (GR) и высокий (HGR и HGR2). В режиме низкой разрешающей способности поле экрана ’’описы¬ вается” элементами разложения, образующими матрицу размером 40x40. В нижней части экрана для отображения текстовой ин-
Дополнение 335 формации имеются 4 строки (’’текстовое окно”). После выполне¬ ния оператора GR цвет поля экрана устанавливается черным, а курсор (указатель текущей позиции экрана) перемещается в левый верхний угол текстового окна. Перед формированием на экране (с помощью операторов PLOT, HLIN, VLIN) требуемого графического изображения необходимо задать цвет последнего посредством оператора COLOR п, где п — целое число от 0 до 15, определяющее выбор цвета (см. гл. 1, задача 2). Графический режим работы дисплея с высокой разрешающей способностью имеет две разновидности: с использованием тексто¬ вого окна (HGR) и без него (HGR 2). После выполнения операто¬ ра HGR поле экрана дисплея представляется в виде матрицы элементов разложения размером 280X 160; в нижней части экра¬ на имеется текстовое окно из 4 строк. Если же используется опе¬ ратор HGR 2, то текстовое окно отсутствует и все поле экрана — это матрица элементов разложения размером 280x192. В обоих случаях по горизонтали поля экрана размещается 280 элементов. Перед формированием на экране дисплея (с помощью оператора HPLOT) требуемого графического изображения необходимо за¬ дать цвет последнего посредством оператора HCOLOR п, где п — целое число от 0 до 7, определяющее выбор цвета (гл. 1, задача 7). Примечание. В памяти ЭВМ помимо служебных программ хранится также и программа пользователя, непосредственно за которой (в порядке возрастания значений адресов памяти) сле¬ дует область размещения переменных программы. Часть памяти, предоставляемая в распоряжение программиста (для Бейсик- программы и данных, представляемых переменными программы), используется также служебными программами, обеспечивающими работу дисплея в графическом режиме с высокой разрешающей способностью. В некоторых случаях это приводит к конфликтной ситуации: установка графического режима с высокой разрешаю¬ щей способностью в процессе выполнения Бейсик-программы может вызывать разрушение данных программы (на месте хра¬ нения переменных размещаются буферы служебной программы, реализующей указанный графический режим). Чтобы избежать подобной ситуации, т. е. защитить переменные программы, в язы¬ ке Бейсик предусмотрен специальный оператор LOMEM, позво¬ ляющий программисту самому указать начальный (минимальный по значению) адрес области памяти для размещения переменных программы. (Корректный выбор значения этого адреса обеспе¬ чивает надежную защиту переменных Бейсик-программы.) Обоб¬ щенная форма оператора: LOMEM : адрес где ’’адрес” — абсолютное значение адреса пространства памяти, доступного программе пользователя для адресации.
366 Дополнение 7.10. Операторы непосредственной адресации к памяти Оперативная память ЭВМ хранит информацию (команды, данные) в двоичной форме, т. е. в виде комбинаций нулей и еди¬ ниц (двоичных цифр, называемых битами). Восемь смежных битов образуют так называемый байт. Язык программирования Бейсик предоставляет в распоряжение пользователя средства для адресации к тому или иному байту памяти с.целью записи в него информации или извлечения, ее оттуда. Память ’’разделена” на байты; каждый байт адресуем, т. е. имеет свой адрес. Оператор записи байта информации в память имеет следую¬ щую обобщенную форму: РОКЕ ад, би где ”би” — целое десятичное число, принадлежащее диапазону значений от 0 до 255, двоичный эквивалент которого (байт) под¬ лежит записи в память по адресу ад; "ад" — адрес оперативной памяти, значение которого при¬ надлежит диапазону значений от —65 535 до +65 535. Например, оператор РОКЕ —16 302,0 записывает число 0 в область оперативной памяти с относительным адресом —16 302. Для извлечения копии содержимого байта памяти использу¬ ется функция РЕЕК, иногда называемая командой. Она имеет следующую обобщенную форму: РЕЕК (ад) где "ад" — целое десятичное число, определяющее адрес байта памяти, копия содержимого которого подлежит извлечению. Например, в результате выполнения оператора присваивания X = РЕЕК (— 16 287) переменной X присваивается значение, указывающее состояние кнопки 0 (ноль) пульта управления игрой. (Если Х>127, то это означает, что кнопка нажата.) В памяти ЭВМ размещается не только программа пользова¬ теля, но и ряд процедур на машинном языке (в том числе созда¬ ваемых пользователями), выполнение которых можно иницииро¬ вать оператором вызова, имеющим следующую обобщенную форму: CALL ад где "ад" — адрес (целое десятичное число) области памяти, в ко¬ торой находится подлежащая вызову процедура на машинном языке. Например, при использовании оператора CALL 62 450 происходит очистка экрана дисплея, работающего в графическом режиме с высокой разрешающей способностью.
Дополнение 367 8. Структура программы Программа — это последовательность операторов, описываю¬ щих алгоритм задачи, которая подлежит решению на ЭВМ. Текст программы состоит из строк, нумеруемых целыми числами в по¬ рядке возрастания их значений. В одной строке может быть один оператор или несколько, отделяемых друг от друга двоеточием. Обычно программа начинается операторами определения функций (DEF FN) и описания массивов (DIM), если они исполь¬ зуются, а также операторами задания режима работы внешних устройств ЭВМ (GR, HGR и т. п.), если требуемый режим отли¬ чается от устанавливаемого вычислительной системой по умолча¬ нию. Тело программы образуют операторы ввода (INPUT, GET), присваивания, передачи управления (GOTO, IF, GOSUB), цикла (FOR, NEXT) и вывода (PRINT). Завершают текст программы операторы STOP или END. Оператор STOP заставляет ЭВМ прекратить выполнение программы, вывести сообщение о номере строки, содержащей этот оператор, и передать управление рабо¬ той машины пользователю. Оператор END вызывает те же дейст¬ вия без вывода какого-либо сообщения. Текст хорошо документированной программы должен быть снабжен достаточным количеством комментариев; признаком начала комментария является служебное слов REM. Коммента¬ рий либо занимает всю строку, либо завершает строку, уже заня¬ тую операторами, и отделяется от последнего оператора двоето¬ чием. В. К. Потоцкий
ПРЕДМЕТНЫЙ УКАЗАТЕЛЬ Аргумента значение «стартовое» 194 — 196 Биоритмы 158, 164, 166 Блок движущийся 27 Блуждания случайные двумерные 117, 122, 123, 126—129 — — одномерные 115—117, 119, 121, 122 Бросание монеты 99, 100, 114, 115, 119, 120, 136, 139 Вероятность 120 — теория 98, 102 Виды особей враждующие 273 — — одинарные 248 — — соперничающие 270 Возврат каретки 177 Выживаемость 2577 Вычисления 231 Год високосный 146, 148 Движение броуновское 116 — небесных тел 77 Дни недели 151, 152, 155 Документирование программ 85 Закон всемирного тяготения 198, 217, 236 — Кеплера третий 77—79 — сохранения момента количества движения 144 Замена буквы 168 «Золотой жук» 183 Изображения движущиеся 27, 71 Инициализация 86, 97, 131 Календарь 85, 143, 144, 155 — григорианский 145 — универсальный 152 — юлианский 145, 146 Клавиатура ЭВМ 14, 18, 19, 29 Код, не поддающийся расшифровке 191 — ASCII 187 Кодирование подстановкой 167, 169, 181 — практически не поддающееся расшифровке 191 — смещением 191 — со смещением 2, 191 Коды 167 Команда COLOR 24, 25 — GR 24 — HCOLOR 68, 131, 161 — HGR 68, 131, 161 — HLIN 25, 34 — HPLOT 69, 73 — PLOT X, Y 15 — POKE 59 — SCRN 25 — TEXT 68 — VLIN 25, 34 Координата 65 — x 65, 67, 72, 206, 223, 229, 240, 277 — у 65, 67, 223, 240, 277 Координаты машинные 130, 206 Лабиринт 27, 32, 33, 39, 40, 41 Линии скрытые 297
Предметный указатель 369 Луна 205, 234, 235, 240—243 — орбита 242 — орбитальное движение 237, 239 Масштаб 202 Масштабирование 72, 206 — функции 280 Метка 74 -— масштабная 72 — нанесение 281 Метод статистического моделирова¬ ния 100 Мини-редактор 181 Модели логистические 255 — экспоненциальные 250 Область рассматриваемая 219, 220, 221, 224, 229 Округление 73, 93, 281 — ошибки 95, 96 Оператор CALL 91, 93 — GET 18, 55, 173 — DEF 74 FN 73, 162 — INPUT 18 — LIST 277 — PEEK 91 — POKE 91—93, 130, 131 — RND 194 Оси координат 117 Особей количество 252, 253 Ось х 64, 70, 72, 118, 161, 162, 237, 239 — у 70, 75, 76, 118, 130, 161, 237, 239 — — изменение масштаба 282 Остаток 151, 152 Отладка программ 85, 87, 89, 246 Отсечение части графика 283 Очистка экрана 60 Память оперативная 96 Планеты 234, 244, 246 — орбитальное движение 237 — параметры движения 236 Площадь области 232 Показатель рождаемости 251 — 253, 255, 256 — — обобщенный 270, 271 — смертности 251, 252, 255, 256 — — обобщенный 270, 271 Посадка космического корабля на поверхность Луны 213 Послание (сообщение) закодиро¬ ванное 183, 189 По Эдгар Аллан 183 Программа моделирующая 253 — обработки текстовой информа¬ ции 173 Программирование интерактивное 9 Прямоугольник «средней» высоты 229 Пульт управления игрой 13, 23, 30 Пуск «горячий» 86, 87 — «холодный» 86, 87 Расшифровка текста 185 Редактор текста 172 Режим воспроизведения текста 58 — графический полноформатный 80, 131 — — с разрешающей способностью высокой 23, 63, 96, 127, 131 — — — — — низкой 23 — «рулон» 57, 59, 62 Рулетка 121 Середина полосы 228, 229 Сила 235 Символ, используемый для замены 171 Система координат декартова 64, 66 — метрическая 235 — экологическая 248, 262, 269, 270 — — моделирование 248, 269 Скорость 199, 200, 204, 209, 216, 230, 232, 237, 240, 245 — быстрый набор 230
370 Предметный уквзатель Способ статической проверки гипо¬ тез 134 Средства графические с высокой разрешающей способностью 275 Таблица Паскаля треугольная 107, 136, 137, 140 — перекодировки 167, 169, 171 — частот 182, 187—189 Техника (метод) просмотра таблиц 154 Трапеций метод 229 Трапеция эквивалентная 228 — — площадь 229 Треугольник Паскаля 105, 106 Ускорение 199, 233, 237, 238, 244 — Луны 239, 242 Факториал 98, 111, 112 Функция встроенная (RND) 194 — график 277 — — переменных двух 292 — — — одной 292 — — построение 275 — масштабирования 280 — ASC 187 — CHR 187, 188 — INT 43, 44 — PDL (0) 207 — РЕЕК 14, 18, 59, 91 — RND 12 — SCRN 35 Футбол американский 206 Циклы задержки 11, 13 Цикл интеллектуальный 159, 160, 162, 165, 166 — ожидания 15, 19 — основной 28 — физический 159, 160, 162, 165, 166 — эмоциональный 159, 160, 162, 165, 166 Циклы задержки 11, 13 Числа вещественного типа слу¬ чайные 41 Численность популяции 249, 252, 253, 255, 257 — — колебания 260 Число случайное R 12, 193—195 — целое случайное 44 Язык машинный 57, 92
СОДЕРЖАНИЕ Предисловие редактора перевода 5 Предисловие 7 1. Игры и интерактивное программирование 9 Задача 1. ’’Быстрее, Макс!” 10 Задача 2. Использование графического режима низкой разрешаю* щей способности 23 Задача 3. ’’Гонки по лабиринту” 32 Задача 4. Генератор лабиринтов 39 Задача 5. Собачьи бега 47 Задача 6. Пилотирование самолета под огнем зенитной артиллерии 56 Задача 7. Формирование изображений на экране дисплея ЭВМ с использованием графического режима высокой разрешающей спо¬ собности 63 2. Несколько рекомендаций по написанию и отладке программ 85 3. Законы случайных событий 98 Задача 8. Бросание монеты 99 Задача 9. Вычисление факториалов 111 Задача 10. Одномерные случайные блуждания 115 Задача 11. Двумерные случайные блуждания 122 Задача 12. Проверка статистических гипотез 134 4. Измерение времени 142 Задача 13. Определение количества дней между двумя календарными да тами 142 Задача 14. Универсальный календарь 152 Задача 15. Определение биоритмов 158 5. Коды 167 Задача 16. Простейшая шифровальная машина 167 Задача 17. Мини-редактор текста 172 Задача 18. Декодирование зашифрованных сообщений 181 Задача 19. Кодирование и декодирование сообщений, исключаю¬ щие несанкционированную расшифровку 191
372 Содержание 6. Силы гравитации и космическое пространство 198 Задача 20. Движение по баллистической кривой 198 Задача 21. Имитатор элементов игры в американский футбол (играющий имитирует действия защитника, пытающегося выпол¬ нить передачу мяча принимающему партнеру) 205 Задача 22. Имитатор управления посадкой космического корабля на поверхность Луны 213 Задача 23. Определение площади заданной области па плоскости с помощью численных методов 217 Задача 24. Моделирование орбитального движения Луны и планет 234 7. Рождаемость и смертность 247 Задача 25. Моделирование экологических систем 248 Задача 26. Создание экологической игры ’’Фермер-кактусовод” 262 Задача 27. Моделирование экологической системы с двумя соперни¬ чающими видами особей 269 8. Средства машинной графики 275 Задача 28. Построение графика функции 275 Задача 29. Построение поверхностей в трехмерном пространстве 289 Приложение 300 Дополнение. Неформальное описание основ языка программирова¬ ния Бейсик ЭВМ Apple II (Applesoft II BASIC) 348 Предметный указатель ,,,,, 8 , э 8 , 368
УВАЖАЕМЫЙ ЧИТАТЕЛЬ! Ваши замечания о содержании книги, ее оформ¬ лении, качестве перевода и другие просим присы¬ лать по адресу: 129820, Москва, И-110, ГСП, 1-й Рижский пер., д. 2, изд-во «Мир».
Учебно^ пособие Фрэнк Уоттенберг ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПЕРСОНАЛЬНОГО КОМПЬЮТЕРА Эпл Зав. редакцией проф. Ю. И. Топчеев Зам. зав. редакцией Э. Н. Бадиков Старший научный редактор В. С. Соболев Младший научный редактор М. Н. Стасюк Художник Н. И. Василевская Художественный редактор Н. М. Иванов Технический редактор Е. С. Потапенкова Корректор В. И, Киселева ИВ Хр2 6205 Сдано в набор 12.03.87. Подписано к печати 20.1 1.87, Формат 60X90Vie‘ Бумага Книжно-журнальная. Печать высокая.Гарни¬ тура литературная. Объем 11,75 бум.л. Усл. печ. л. 23,50. Усл. кр.-отт. 23,93. Уч.-изд. л. 20,26. Изд. № 6/4874, Тираж 30 000 экз. Заказ № 989. Цена 1 р. 50 к. ИЗДАТЕЛЬСТВО «МИР» 129820, ГСП, Москва, И-110, 1-й Рижский пер., 2 Набрано и сматрицировано в ордена Октябрьской Революции и ордена Трудового Красного Знаме-ни МПО «Первой Образцовой типографии» имени А. А. Жданова Союзполиграфпрома при Го¬ сударственном комитете СССР по делам издательств, полигра¬ фии и книжной торговли. 113054, Москва, Валовая, 28 Отпечатано в Ленинградской типографии № 2 головном пред¬ приятии ордена Трудового Красного Знамени Ленинградского объединения «Техническая книга» им. Евгении Соколовой Союз¬ полиграфпрома при Государственном комитете СССР по делам издательств, полиграфии и книжной торговли^ 198052, г. Ленин¬ град, Л-52, Измайловский проспект, 29.
В 1988 году издательство «Мир» выпускает следующие книги: Шнайдер А. Язык ассемблера для персонального компьютера фирмы ИВМ: Пер. с англ,—М.: Мир, 21 л.: ил.; 1 р. 80 к» Пособие по программированию на языке ассемблера для одной из наиболее распространенных персональных ЭВМ — IBM PC. Основное внимание уделяется написанию, отладке и вы¬ полнению программ. Полнота изложения и многочисленные при¬ меры не только облегчают процесс обучения, но и позволяют самостоятельно освоить программирование на ассемблере для IBM PC и других совместимых с ней ПЭВМ. Для читателей, не являющихся профессионалами-програм¬ мистами, но имеющих дело с персональными компьютерами, а также студентов соответствующих вузов.
Исида X. Программирование для микрокомпьютеров: Пер; с япон.— М.: Мир, 16 л.: ил., 1 р. 50 к. Книга является шестым томом 11-томной серии по микро¬ электронике, написанной крупными японскими специалистами, перевод которой подготовлен в издательстве «Мир». Посвящена программному обеспечению микрокомпьютеров, созданных в ос¬ новном на базе 16-разрядного микропроцессора 8086. В нее включены общие вопросы математического обеспечения (система команд, программирование на ассемблере), вопросы системного программирования и программирования на языках высокого уровня. Описываются средства программирования, отладки и обеспечения ввода — вывода. Для специалистов в области вычислительной техники и информатики, а также студентов соответствующих вузов.'