Basic - вводный курс


         

Виды алгоритмов

Алгоритмы бывают трех основных видов, которые являются базовыми при написании программ.
Первый тип — линейный алгоритм. В нем все действия выполняются в строгом порядке, последовательно, одно за другим. Типичный жизненный пример такого алгоритма — рецепт пирога.
Второй тип — разветвляющийся алгоритм. Здесь те или иные действия выполняются в зависимости от выполнения или невыполнения некоего условия. Пример из жизни — правило перехода улицы по светофору. Если горит красный — стоим, если горит зеленый — идем.
Наконец, третий тип — циклический алгоритм. Он содержит повторяющиеся действия с какой-либо изменяющейся величиной, так называемым параметром. По циклическому алгоритму можно колоть дрова. Берем полено, ставим на попа, колем топором, берем второе полено и т. д., пока поленья не закончатся, и эта работа нам не надоест.


Линейный алгоритм

Для написания программ с линейным алгоритмом мы уже готовы. Нам известно, как очистить экран и поприветствовать пользователя по имени, запросить у него необходимые данные и решить вычислительные задачи. Попробуем поупражняться. Следите все же за интерфейсом своих программ!
В следующих заданиях вам предлагается написать программы, производящие требуемые вычисления и выдающие на экран результаты.

76. Расстояние до ближайшей к Земле звезды Альфа Центавра 4,3 световых года. Скорость света принять 300 000 км/с. Скорость земного звездолета 100 км/с. За сколько лет звездолет долетит до звезды?
77. Вычислить количество прожитых составителем программы дней. Учесть, что в високосном году 366 дней.
78. Известна теория биоритмов. С момента рождения жизнь человека подчиняется трем синусоидальным биоритмам. Физический цикл — 23 дня, эмоциональный — 28 дней и интеллектуальный — 33 дня. Первая половина каждого цикла — положительная, вторая — отрицательная. При переходе от положительной к отрицательной фазе в каждом цикле есть так называемый критический день. В физическом цикле — 12-й день, в эмоциональном — 15-й день, в интеллектуальном — 17-й день. Когда два и более цикла находятся в отрицательной фазе, или в критических днях, то в такие дни повышена вероятность физических недомоганий и травм, эмоциональных срывов и ссор, замедленности интеллектуальных процессов и реакции. В Японии, например, в крупных фирмах для каждого работника составлен график и в "плохие" дни их не допускают до работы, дают отдыхать, потому что оплата больничного или брак в работе обойдутся фирме дороже. Теперь к делу. Опираясь на результат предыдущего задания и используя операцию нахождения целочисленного остатка, рассчитайте, каков для вас сегодняшний день по всем трем циклам.
79. Запросите у пользователя валютный курс на сегодняшний день, затем имеющуюся у него рублевую сумму и рассчитайте, сколько долларов он может купить.
80. Дискета 3,5" вмешает 1,44 Мбайт. Рукопись содержит 450 страниц текста. На каждой странице 60 строк по 80 символов в каждой. Поместится ли рукопись на дискету? Если нет, то сколько таких дискет потребуется?
81. Документ содержит текст из 32 строк по 60 символов в каждой и точечную черно-белую фотографию 10x15 см. Каждый квадратный сантиметр содержит 300 точек, любая точка описывается 4-мя битами. Каков общий информационный объем документа в Кбайтах?
82. Запросите у пользователя длину ребра куба. Найти площадь грани, площадь полной поверхности и объем этого куба.


83. Есть притча о шахматах, где выигравший запросил у могущественного правителя, чтобы ему был выплачен выигрыш зерном пшеницы по следующим правилам: на первую клетку шахматной доски положить одно зерно, на вторую — два зерна, на третью — четыре, на четвертую — восемь и т. д., иными словами, на каждую последующую в два раза больше зерен, чем на предыдущую. Сколько же зерен должен был бы получить выигравший? (Замечание: на каком-то этапе выполнения этого задания возможно переполнение памяти. Подумайте, как обойти это препятствие.)
84. Кстати, для оценки предыдущего результата еще одно задание. В России ежегодно собирают около 90 млн тонн зерновых. Масса одного зерна около 5 грамм. Сколько зерен в таком урожае, и сколько лет пришлось бы расплачиваться России по условиям предыдущего задания?
85. Продав квартиру, вы получили $ 22 000 и положили их в банк. Банк начисляет 1% в первый месяц, а каждый следующий — тоже 1%, но уже с получившейся суммы. Сколько денег будет в банке на вашем счету через год? (Нестабильностью нашей экономической системы пренебрегаем.)
86. Допустим, вы получили наследство $ 1 000 000 и хотите красиво пожить. После долгих раздумий вы решаете, что будете жить на $ 800 в месяц. На сколько лет вам хватит наследства?
87. Пушка стреляет под углом 30° к линии горизонта. Масса снаряда 30 кг, начальная скорость 500 м/с. Какова будет
дальность полета снаряда? (Формулу вспомните из курса физики.)
Нагляднее всего работа с линейными алгоритмами осуществляется в графике, когда мы сразу видим результат своей деятельности. Но для этого нам надо изучить несколько новых операторов.


Графика в Бейсике

Иногда при изучении этой темы приходится сталкиваться с непониманием учащихся. "А зачем так сложно, если в любом графическом редакторе можно сделать то же самое?" Взгляд автора здесь таков. Да, в графическом редакторе можно нарисовать практически что угодно. Но, зная приемы программирования, создаются быстро такие элементы, на которые в графическом редакторе уйдет очень много времени и не будет возможности многократного повторения и внесения быстрых изменений в рисунок.
Прежде всего, необходимо сказать несколько слов о включении графических режимов. При входе в оболочку Бейсика по умолчанию включается текстовый режим, в котором можно производить вычисления и выводить результаты на экран. Но если мы хотим пользоваться графическими возможностями языка, то должны объяснить это компьютеру посредством включения графического режима командой screen 9. Таких режимов несколько, но автор рекомендует пользоваться девятым режимом, потому что он обладает наибольшей разрешающей способностью и позволяет получать качественные графические объекты. После включения графического режима мы можем давать компьютеру команды рисования графических примитивов.

Замечание
Графический режим включается только один раз.

В режиме screen 9 экран представляет собой координатную сетку с началом в левом верхнем углу, вправо от которого увеличивается координата X, а вниз — координата Y. Максимальное значение X на экране 640, a Y — 350 (рис. 1.4).

Рис.4. Размеры и координаты экрана в режиме screen 9


Графические примитивы

Ну что ж, начнем с графических примитивов, т. е. элементарных объектов, на которые можно разбить любое сложное изображение.

Точка

Первый из графических примитивов — точка. Для изображения точки используется оператор pset со следующим синтаксисом:

PSET(X, Y) , С

где х и y — координаты точки на экране, а с — ее цвет. Если цвет не указан, то точка будет изображена последним установленным цветом (это касается и всех прочих графических примитивов).
Рассмотрим пример.

SCREEN 9
PSET(320, 175),4

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


SCREEN 9
color, 1
PSET (320,175) ,4

Теперь та же точка будет в центре синего экрана, уже лучше!

Отрезок и прямоугольник

Следующий примитив — отрезок прямой линии. Оператор записывается таким образом:

LINE (X1, Y1)-(X2, Y2), С

где XI, yi — координаты начала отрезка; х2, Y2 — координаты конца отрезка; с — как всегда цвет.
Например, мы хотим изобразить отрезок синего цвета на желтом экране с координатами (рис. 1.5).

Рис.5. Отрезок прямой линии

Программа будет выглядеть так:

screen 9
COLOR 1, 14
LINE (100, 300)-(600, 50), 1

Не секрет, что по диагонали прямоугольника можно всегда его достроить. Известно это и Бейсику. Поэтому можно одним оператором построить прямоугольник со сторонами, параллельными экрану. В этом случае оператор line имеет следующий вид:

LINE (XI, Y1)-(X2, Y2), С, В

То есть к обычному оператору отрезка добавляется буква (это именно буква, а не число!) в — от английского слова box (ящик, коробка). А координаты — это начало и конец любой из диагоналей прямоугольника. Возьмем предыдущий пример и добавим в операторе line букву в:

LINE (100, 300)-(600, 50), 1, В

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

Рис..6. Прямоугольник со сторонами, параллельными экрану

Предупреждение
Будьте внимательны с координатами. Довольно часто вместо координат диагонали указывают координаты стороны прямоугольника. В таком случае вы получите просто отрезок, параллельный экрану.

И еще один примитив, основанный на операторе line. Он позволяет не только строить прямоугольник по диагонали, но и сразу закрашивать его. Пишется он так:

LINE (XI, Y1)-(X2, Y2), С, BF

Обратите внимание, что добавилась еще буква f (без пробела после в), вместе с буквой в обозначающая "box full" — полная коробка. Это заставляет компьютер залить полученный прямоугольник указанным цветом с.
Попробуйте самостоятельно в предыдущем примере добавить букву f и посмотреть, что получится.

Замечание
Одним оператором line можно получать только прямоугольники и со сторонами, параллельными экрану. Другие фигуры, состоящие из отрезков прямых, можно рисовать только последовательностью операторов line без всяких букв в и F.

Ну, что ж, для начала достаточно. Надо бы поупражняться. Но перед упражнениями хотелось бы дать совет, как облегчить себе жизнь.
Чтобы быстро и четко нарисовать заданный объект, рекомендуется взять листок миллиметровки или бумаги в клеточку, нарисовать экран в масштабе 1 см=50 экранных точек. Получится 13 см в ширину и 7 см в высоту. Затем изобразить там объект,
который вы хотите получить, и тогда все координаты будут у вас, как на ладони (рис. 1.7).

Рис.7. Так надо делать!

К сожалению, опыт автора показывает, что многим из вас лень этим заниматься — отсюда пустая трата сил и времени и очень неказистые результаты.
Перейдем к упражнениям.
88. Напишите программу, изображающую на экране четыре точки разного цвета в центре желтого экрана. Точки расположите квадратом на расстоянии друг от друга 5 точек.
89. Напишите программу, выводящую ромб с диагоналями (рис. 1.8).

Рис.1.8. Ромб с диагоналями

Пропущенные координаты определите сами, зная свойства ромба.
90. Создайте программу, рисующую Российский флаг'. Флаг состоит из трех полос, поэтому рисовать их надо, используя
Есть, кстати, мнемоническое правило для запоминания цветов нашего флага — это магическое слово БеСиК — БЕлый, СИний, Красный — и на Бейсик похоже, и не забудешь никогда.
команду line с параметром bf. Здесь главное четко рассчитать координаты диагоналей всех трех прямоугольников.
91. Напишите программу, выводящую рамку с конвертом (рис. 1.9).

Рис.1.9. Рамка с конвертом

Рамка рисуется двумя операторами line с bf, конверт — подумайте сами. Координаты тоже выберите сами. Только не рисуйте слишком мелкие объекты. Рис.ок должен быть крупным и наглядным. Это любят преподаватели!
92. Создайте программу, выводящую на одном экране куб и пирамиду (рис. 1.10).

Рис.1.10. Куб и пирамида

Окружность

Следующий этап построения — окружность. Все, что нужно знать об окружности для Бейсика — это координаты ее центра и радиус. Оператор выглядит так:

CIRCLE (X, Y) , R, С

где х, y — координаты центра, r — радиус (в экранных точках),
с — цвет.
Например, оператор

CIRCLE (320, 175), 50, 2

изобразит нам зеленую окружность радиусом 50 точек в центре экрана.

Эллипс

Очередной примитив — эллипс. Эллипс — это, по сути, окружность, которой слегка дали по "голове" или по "бокам", в результате чего она стала вытянутой по вертикали или горизонтали. И вместо одного радиуса, как у окружности, у эллипса стало два — по осям X и Y.
Частное от деления Ry на Rx дает нам так называемый коэффициент сжатия:

Таким образом, для вытянутых по горизонтали эллипсов (рис. 1.11) коэффициент сжатия будет в пределах от 0 до 1.
А для эллипсов, вытянутых по вертикали (рис. 1.12), коэффициент сжатия будет больше 1.

Рис.1.11. Эллипс, вытянутый по горизонтали

Рис.1.12. Эллипс, вытянутый по вертикали

Очевидно, что если коэффициент сжатия равен 1, то это будет уже никакой не эллипс, а просто окружность.
Оператор рисования эллипса записывается почти так же, как и для окружности:

CIRCLE (X, Y) , R, С, , , К

где х, y — координаты центра эллипса, r — радиус той окружности, из которой этот эллипс получился, с — цвет, к — значение коэффициента сжатия.
Например, после выполнения оператора

CIRCLE (320, 175), 50, 2,,,.5

в центре экрана появится эллипс зеленого цвета, сжатый сверху и снизу, у которого Ry в два раза меньше, чем Rx.
Если же добавить еще один оператор

CIRCLE (320, 175), 50, 2,,,2

то сверху дорисуется дополнительный один эллипс, который будет сжат уже по горизонтали, и у него уже Ry будет в два раза больше, чем Rx. Вместе они должны составить следующую картинку (рис. 1.13)
Ну, а теперь продолжим наши упражнения.
93. Напишите программу, которая изобразит квадрат и вписанную в него окружность.
Замечание
К сожалению, иногда размеры точек по осям абсцисс и ординат не совпадают, вследствие чего может наблюдаться асимметрия в изображениях (при полной правильности всех ваших расчетов). В таких случаях приходится подгонять детали рисунка вручную.
94. Создайте программу, с помощью которой можно нарисовать мишень — пять концентрических (т. е. с одним центром) окружностей, вложенных друг в друга, и перекрестие двух отрезков прямых. Можно усложнить изображение, добавив попавшую в мишень стрелу (рис. 1.14).
95. Напишите программу, которая отобразит снеговика, состоящего из пяти окружностей разного радиуса и ведерка на голове из эллипса и двух отрезков (рис. 1.15).
96. Напишите программу построения цилиндра, состоящего из эллипсов и двух вертикальных линий (рис. 1.16).
97. При помощи Бейсика нарисуйте летающую тарелку (рис. 1.17).

Рис.1.13. Два пересекающихся эллипса

Рис.14. Мишень

Рис.15. Снеговик

Рис.16. Цилиндр

Рис.1.17. Летающая тарелка

Ну что ж, если все получается, то пора постепенно переходить к более сложным вещам, а именно, к рисованию дуг окружностей и эллипсов. Но прежде следует вспомнить, что в Бейсике используется радианная мера углов (см. "Стандартные функции Бейсика"). Любая дуга имеет угол, от которого она начинается, и угол, где она заканчивается. Чтобы разобраться с этим, сначала я приведу оператор рисования дуг окружностей:

CIRCLE (X, Y) , R, С, а, Ь

где появившиеся две новые величины а и ь и обозначают эти углы. Правило рисования дуг на Бейсике звучит так: "дуга строится от угла а к углу b против часовой стрелки".
Для того чтобы показать это наглядно, лучше всего обратиться к тригонометрической окружности (рис. 1.18).

Рис.1.18. Тригонометрическая окружность

Взглянув на тригонометрическую окружность, мы всегда довольно легко сможем определить начало и конец нужных нам
дуг. Более того, Бейсик позволяет использовать в качестве операндов в своих командах арифметические выражения. Поэтому, например, если вы знаете угол начала дуги — 30°, но затрудняетесь определить его на тригонометрической окружности, то можете в соответствующем месте оператора дуги написать
3.14*30/180
и пусть компьютер сам считает.

Приведем несколько простых примеров.
Построим верхнюю половину окружности синего цвета с радиусом 30 (рис. 1.19), у которой центр находится в точке 150, 100.

Рис.1.19. Верхняя половина окружности

Первым делом, глядя на дугу, определяем направление против часовой стрелки. Это дает нам возможность выяснить, где находится начало и конец дуги. Далее обращаемся к тригонометрической окружности. В этом простом примере сразу видно, что угол начала а=0, а угол конца дуги b=3,14. Таким образом, оператор построения этой дуги выглядит так:

CIRCLE (150, 100), 30, 1, 0, 3.14

Построим правую половину той же самой окружности (мы уже не будем сопровождать это построение рисунком, т. к. процесс аналогичен). По тригонометрической окружности определяем, что а=4,71, b=1,57. Записываем оператор построения дуги:

CIRCLE (150, 100), 30, 1, 4.71, 1.57

Предупреждение
Прежде, чем мы приведем более сложный пример дуги, хочется сделать еще одно полезное замечание. Если в операторе построения дуг поставить знак минус перед значениями углов дуги, то автоматически будут проведены радиусы, соединяющие центр окружности с концами дуг. Нельзя ставить минус перед 0. В этом случае вместо нуля надо использовать -6,28 (т. е. 2я).

Рис.20. CD-MAN

Построим изображение CD-MAN (рис. 1.20). Радиус "глаза" и координаты его центра определим исходя из здравого смысла.
Хотя на первый взгляд кажется, что данное построение очень сложно, но на самом деле мы знаем уже достаточно инструментов, чтобы сделать это двумя изящными легкими движениями. Для начала, действительно давайте определим радиус "глаза". Диаметр его составляет примерно пятую часть радиуса "туловища", стало быть радиус — одну десятую, т. е. 5. Координаты центра примерно Х=215, Y=85. Теперь займемся углами дуги "туловища". Угол а определяется довольно легко — он равен 45°, а вот для определения угла ь надо пройти почти всю тригонометрическую окружность — первая четверть, вторая четверть — еще +90°, третья четверть — еще +90°, и, наконец, еще +45°. Итого Ь=315°. Ну что ж, все данные для построения есть. Приступим.

Rem "туловище"
CIRCLE (200, 120), 50, 1, -45*3.14/180, -315*3.14/180
CIRCLE (215, 85), 5, 1 Rem "глаз" >

Еще раз напоминаю, что в программировании главное — это предварительная подготовка всех исходных данных!
Теперь рассмотрим рисование дуг эллипсов.
Когда мы говорили о построении самих эллипсов, то в операторе было несколько странно видеть три указанных подряд запятых. Сейчас все стало понятно — это место для углов а и ь. Остальное — аналогично дугам окружности. Итак, оператор построения дуг эллипса таков:

CIRCLE (X, Y) , R, С, a, b, К

Рис.21. Месяц

В качестве примера нарисуем "светит месяц, светит ясный" (рис. 1.21).
Внешняя граница месяца — это дуга окружности, а внутренняя — дуга эллипса. Центр у них общий (Х=500, Y=70). Коэффициент сжатия эллипса равен 2. Начало и конец дуг тоже одинаковы (а=4,71, Ь=1,57). Радиус окружности возьмем 50, а вот с радиусом эллипса придется помучиться, поскольку, как мы уже говорили, экранные точки имеют разные ширину и высоту, определяющиеся примерным соотношением 3:4. Поэтому в качестве радиуса эллипса возьмем значение 50x3/4. Тогда месяц построится следующим образом:

CIRCLE (500, 70), 50, 14, 4.71, 1.57 CIRCLE (215, 85), 50*3/4, 4.71, 1.57, 2

Rem дуга окружности Rem дуга эллипса

Закраска

Уже очень хочется попробовать свои силы? Еще немножко нужно подождать. Ведь мы хотим все делать красиво. И нам нужно изучить еще один шаг — закраску замкнутых контуров.
После того, как мы научимся закрашивать, у нас в руках будут практически все необходимые инструменты для рисования сложных объектов, разработки больших линейных алгоритмов.
Итак, оператор закраски имеет следующий синтаксис:
PAINT (X, Y) , Cl, C2
где х, y — координаты любой точки внутри закрашиваемого' контура, ci — цвет, которым закрашивается контур, С2 — цвет самого контура. Если эти цвета совпадают, то достаточно указать С1.
Правила закраски:

Контур должен быть замкнут. Если в нем будет прокол хотя бы в одну экранную точку, то вся "краска" вытечет и зальет экран. Контур должен быть одноцветен. Если составляющие даже замкнутого контура разных цветов, то для компьютера эта ситуация аналогична разрыву. Будет закрашен весь экран. Координаты точки закраски должны лежать внутри контура.

Рекомендуется закрашивать контур непосредственно после того, как он нарисован. Часто рисуют все изображение, потом начинают закрашивать разные области, а линии разного цвета пересекаясь дают разрывы, и вот уже экран затекает самыми разными красками.
Если точка закраски попала вне контура, то закрасится весь экран, за исключением самого контура (иногда это бывает нужно, но подобные случаи редки).
Если точка закраски попала на контур, то ничего не закрасится.
Есть общая рекомендация из личного опыта автора, немного удлиняющая процесс отладки программы, но дающая 100%-ный правильный результат закраски. Перед закраской вместо оператора paint лучше написать оператор pset с теми же координатами, но какого-нибудь контрастного цвета, чтобы ее было хорошо видно. Запустить программу и убедиться, что все вышеназванные правила соблюдены и точка находится внутри закрашиваемого контура. После этого возвращаемся в программу, изменяем оператор pset на paint.
Рассмотрим пример закраски месяца из предыдущей программы белым цветом. После того как мы его нарисовали, у нас добавится всего одна команда:

PAINT(530, 70), 15, 14

Откуда взялось число 530 в качестве координаты X, я думаю, понятно, если посмотреть на рисунок, вспомнить координаты центра и радиус.
Ну что ж, а теперь упражнения на дуги и закраску. В них изображения уже более сложные, требующие достаточно основательной предварительной подготовки. Не забывайте о ней!
98. Напишите программу, выводящую на экран образ, аналогичный примеру CD-MAN, изменив лишь углы и координаты центра "глаза" (рис. 1.22).
Закрасьте "туловище" одним цветом, а "глаз" — другим.

Рис.1.22. CD-MAN, глядящий на запад

Рис.1.23. Квадрат с окружностями

99. Создайте программу, отображающую месяц в обратную сторону, чем в примере, рассмотренном выше. Закрасьте его красным цветом.
100. С помощью Бейсика нарисуйте закрашенный квадрат (одним оператором) с вписанными в него двумя разноцветными окружностями (рис. 1.23).
101. Напишите программу, выводящую на экран петлю гистерезиса, которая состоит из двух отрезков прямых линий и четырех дуг, являющихся четвертями окружности (рис. 1.24). Попробуйте сначала нарисовать изображение в масштабе на бумаге, рассчитать все исходные данные. Закрасьте получившееся изображение. (Будьте внимательны при состыковке дуг, зачастую там образуются разрывы.)

Рис.1.24. Петля гистерезиса

Рис.1.25. Звезда

102. Выведите на экран пятиконечную звезду, вписанную в окружность и закрашенную как на рис. 1.25.
103. Нарисуйте корабль в ночном море под российским флагом (рис. 1.26).
Это задание уже представляет собой достаточно сложное изображение. Попробуйте выполнить его так, как вы считаете нужным, а мы хотим изучить, как это нужно делать.

Рис.1.26. Корабль в ночи


Правила построения сложных изображений

При рисовании придерживайтесь определенных правил, которые перечислены далее.

Обязательно начертите свое изображение на бумаге в масштабе. Разбейте изображение на те самые графические примитивы, каждый из которых вы могли бы нарисовать каким-либо уже изученным оператором. Найдите и выделите на рисунке опорные точки — концы отрезков, начала и концы дуг, центры окружностей, эллипсов, отдельные точки (если они есть). Наметьте точки для оператора закраски paint. Если в изображении есть прямоугольники со сторонами, параллельными экрану, то необходимо выделить координаты их базовых диагоналей, по которым они будут строиться. Определите максимальный размер изображения в экранных точках, исходя из размеров экрана. Определите координаты всех опорных точек, значения радиусов окружностей и эллипсов, коэффициенты сжатия эллипсов, углы всех дуг. Определите последовательность построения и закраски замкнутых контуров. Напишите программу, введите ее, снабжая как можно большим количеством необходимых комментариев (можно сначала на бумаге), и отладьте ее.

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

104. Попробуйте самостоятельно построить сложное изображение по вышеизложенным правилам на примере рис. 1.27.
105. А вот еще несколько вариантов сложных изображений (рис. 1.28).

Рис.1.27. Храм

Рис.1.28. Буква F, католический костел, яхта, знаки "Не курить" и "Любовь", мороженое

106. Так как программированием чаще занимаются представители сильного пола, а среди них, как известно, бывает довольно много любителей футбола, то предлагаю изобразить эмблему своей любимой команды. У меня это, конечно же, "Зенит"! Вот, кстати, как выглядит их эмблема (рис. 1.29). . Сложно? Конечно, да! Но ведь ради любимой команды можно и постараться!

107. В качестве самостоятельного задания придумайте себе сами эмблему и нарисуй ее.

Рис.29. Эмблема футбольной команды "Зенит"


Макроязык GML

Для расширения возможностей машинной графики Бейсика был дополнительно разработан специальный макроязык GML (Graphics Macro Language). Он позволяет строить довольно сложные изображения и быстро выводить их на экран. Каждая команда языка представляет собой латинскую букву, после которой следует один или два числовых параметра (как правило, целых числа). Команды этого языка перечислены в табл. 1.3.

Таблица 1.3. Команды языка GML

Команда
Действие
Un
Переместиться вверх на n точек
Dn
Переместиться вниз на n точек
Ln
Переместиться влево на n точек
Rn
Переместиться вправо на n точек
En
Переместиться по диагонали вверх и вправо на n точек
Fn
Переместиться по диагонали вниз и вправо на n точек
Gn
Переместиться по диагонали вниз и влево на n точек
Hn
Переместиться по диагонали вверх и влево на n точек
M x, у
Переместиться в точку с координатами х, у
M ±n, im
Переместиться по отношению к текущей позиции на ±n точек по оси X и на +гл точек по оси Y. Знаки плюс и минус проставлять обязательно
At
Поворот изображения против часовой стрелки вокруг точки, с которой начиналось рисование на 90°xt (te0, 1,2,3). Действует во всех дальнейших командах до нового назначения
Cn
Задание нового цвета. Действует во всех дальнейших коман­дах до нового назначения
Sn
Расстояние, указанное в командах перемещения, умножает­ся на п/4 (0<n<255)
В
Переместиться в новую позицию при помощи следующих за в команд, но рисование не производить. Отменяется установкой цвета С
N
Выполнить следующую команду перемещения и вернуться в исходную позицию. Может предшествовать любой команде перемещения
Pcl,c2
Команда заполнения контура цветом, cl — цвет заполнения, с2 — цвет контура. Должны соблюдаться все вышеизложен­ные правила закраски, и курсор должен находиться внутри закрашиваемого контура

Основные команды перемещения легко запомнить с помощью рис. 1.30.

Рис.30. Основные команды перемещения языка GML

Для приведения в действие последовательности команд языка GML необходимо использование оператора draw.

Например, команда
I DRAW "R50 D50 L50 U50"
изобразит нам квадрат, начиная от последней графической точки.
Если такой точки не было, и вы сразу начинаете строить изображение с помощью оператора draw, to по умолчанию исходной точкой считается центр экрана.
Если вы подготовите сначала какое-либо изображение в строковой переменной, то потом его можно будет многократно вызывать на экран. Для этого используется функция "х". Ее работу рассмотрим на примере.
N$="R50 D50 L50 U50"
DRAW "C14 X"+VARPTR$ (N$)
DRAW "BM500, 50 C2 X"+VARPTR$(N$)
С помощью первого оператора запоминаем последовательность команд построения квадрата в строковой переменной n$. Вторым оператором задаем цвет 14 и сообщаем компьютеру командой х, что необходимо выполнить последовательность команд n$. Это делает функция varptr$. Последним оператором перемещаемся без рисования в точку с координатами 500, 50, меняем цвет на 2 и снова выполняем последовательность команд n$.
В результате на экране в центре и в правом верхнем углу должны появиться одинаковые разноцветные квадраты со стороной 50.
Совместное использование фафических примитивов и оператора draw позволит вам рисовать очень качественные изображения на вашем экране.
108. Для того чтобы опробовать эти возможности, нарисуйте елочку (рис. 1.31).

Рис.1.31. Елочка

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

Вывод текстовой информации в графике

Часто хочется сопроводить свои рисунки подписями. Не сдерживайте свои желания. Делайте это просто — с помощью операторов locate и print, как мы это уже многократно делали.

Предупреждение
Только надо помнить, что координаты в операторе locate не графические (640x350), а текстовые (80x25).


Разветвляющийся алгоритм

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

на основе безусловного перехода; на основе условного перехода. Начнем с первого.

Безусловный переход

Безусловный переход оператором goto предписывает программе свернуть с линейного пути и, беспрекословно повинуясь, перейти к метке, расположенной в любом месте программы.
8 качестве метки используются натуральные числа с двоеточием после них. Метка указывается только в начале строки (т. е. если в строке программы несколько операторов, то нельзя ставить метку, например, перед вторым). Приведем пример программы, рисующей на экране три символа звездочки по диагонали:

CLS
?"?*" ?"??*"

Символ ? в данном случае означает пробел.
Добавим теперь метку 1 рядом со второй строкой и оператор goto в конце программы. Получаем:

CLS
1: ?"*"
?"?*"
9 "77* "
GOTO 1

Казалось бы, изменения незначительные, но запустите программу и посмотрите что происходит! Вы в панике? Вы пытаетесь прекратить действие программы, но ничего не получается? Программа зациклилась! Что делать? Спокойно нажмите клавишу <Ctrl> и, не отпуская ее, клавишу <Break>. Это называется прервать выполнение программы. Переведите дух и давайте шаг за шагом разберемся, что же произошло.
Программа очищает экран, затем рисует первую звездочку, под ней с отступом в один пробел — вторую, потом ниже третью, а вот затем получает команду goto 1. Это приказ, которого невозможно ослушаться. Программа ищет метку, находит ее у команды рисования первой звездочки и начинает снова последовательно выполнять команды рисования — первую, вторую, третью и — снова приказ перехода, и так — до бесконечности (вернее, до прерывания программы). А поскольку оператор print, не снабженный точкой с запятой, после выполнения всегда переводит курсор на следующую строку, то и получается эффект движения.
А теперь поупражняйтесь.
110. Попробуйте спрогнозировать, что произойдет, если метку 1 в программе рисования звездочек указать в первой строке перед оператором cls? А что, если в четвертой строке? Или (кощунственная мысль!) перед самим оператором goto? Проверьте свои предположения на практике.
111. Напишите программу, которая заставит бежать по экрану следующий узор:
112. Если вы обратили внимание на текст предыдущей программы, то должны были заметить, что узор легко прослеживается. Воспользовавшись этим, напишите программу, которая заставит бежать по экрану слово "РОК", а потом, если не лень, то и свое имя. Буквы этих слов надо изобразить символами клавиатуры (какими вам больше нравится).
113. Посмотрите на текст следующей программы:

х=о
1: Х=Х+1 ? X
GOTO 1

Как вы думаете, при каком значении х программа закончит свою работу? Если у вас достаточно быстродействующий компьютер, можете рискнуть проверить свое предположение на практике. Да, впрочем, рискните и на медленном, ведь всегда можно прервать программу. Правда, в этом случае вы так и не узнаете тайны, какое самое большое целое число компьютер может вывести на экран.
Строго говоря, серьезное программирование не любит оператор goto. Считается, что он засоряет и путает программу. Вызывает зацикливание и зависание компьютера. Рекомендуют обходиться без него. А мне он все равно нравится. Но это мое личное даже не мнение, а просто чувство. При написании серьезных программ я тоже стараюсь обходиться без goto.


Условный переход

Мало того, что условный переход подразумевает выполнение тех или иных команд в зависимости от проверяемого условия, так Бейсик предоставляет нам еще и несколько вариантов действий.
Начнем с классической конструкции:

IF ... THEN ... ELSE
Или по-русски:
ЕСЛИ ... ТОГДА ... ИНАЧЕ

В записи условия можно использовать следующие символы:

= (равно); > (больше); < (меньше); о или >< (не равно); <= или =< (меньше или равно); >= или => (больше или равно).

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

CLS
INPUT "Как Вас зовут"; N$
INPUT "Сколько Вам полных лет"; S
IF S<18 THEN ?"Вам еще рановато курить, ";N$ ELSE ?"Минздрав
России предупреждает — курение опасно для вашего здоровья!"

Программа запрашивает имя, потом возраст (все это уже не вызывает у нас никаких затруднений), а вот потом вступает в дей ствие условный оператор. Если возраст s меньше 18, то выводится надпись, что курить еще рановато (а чтобы не было очень обидно, обращается по имени). Иначе (т. е. если возраст больше либо равен 18) автомат продает сигареты, но предупреждает об опасности курения.
Еще один маленький пример. Вычислим корень квадратный из х.

CLS
INPUT "Введите любое число"; X
? "Корень квадратный из Х="; SQR(X)

Запускаем программу. Вводим число 4. Ответ 2. Вводим 121. Ответ 11. Вводим -9. Аварийное прерывание программы и сообщение об ошибке "Неверный вызов функции". Что такое? А все потому, что корень квадратный вычисляется только из положительного числа. Вот программа и "ругается". Но мы же умные, добавим в программу условный оператор, и будет она работать для любых чисел.

CLS
1:INPUT "Введите любое число";Х'
IF X>=0 THEN ? "Корень квадратный из X ="; SQR (X) ELSE ?"Корень квадратный из отрицательного числа вычислять отказываюсь. Дайте положительное число!"
:GOTO 1

Теперь программа анализирует введенное значение и, в случае его положительности, вычисляет корень, а в случае отрицательности в легкой форме раздражается и просит у пользователя другое число.
И еще пример с графикой. Предположим, мы настолько дружественны к пользователю, что не говорим ему: "Вот, посмотри, какая картинка!", а предлагаем некий выбор. Для первого раза из двух возможностей.

SCREEN 9
INPUT "Введите 1, если хотите увидеть солнце и любую другую цифру, если ничего не хотите"; X
IF X=l THEN CIRCLE (320, 175), 50, 2: PAINT(320, 175), 14, 2 ELSE ?"Спасибо за внимание!"

Программа запрашивает у пользователя цифру (причем в случае ввода буквы просит осуществить ввод заново). Если это цифра 1,
то рисуется желтый круг, в любом другом случае появляется надпись "Спасибо за внимание!".
Поупражняемся.
114. Напишите программы, которые в зависимости от введенного числа либо вычисляют функцию, либо выдают сообщение, что функция не определена:

115. Напишите программу для вычисления функции:


116. Напишите программу, определяющую четность или нечетность введенного с клавиатуры целого числа.
117. Напишите программу, находящую меньшее из двух, введенных с клавиатуры чисел.
118. По четырехзначному номеру года, запрошенному с клавиатуры определите номер столетия (например, для 1492 г. — ответ XV век, для 1812 г. — XIX век). Учесть, что началом века считается первый, а не нулевой, год. (То есть, 2000-й год, из астрономии — последний год XX века).
Выше мы рассмотрели полную форму условного оператора, когда в зависимости от истинности или ложности условия выполняются те или иные действия, после чего программа переходит к выполнению следующей за условным оператором команды.
Существует также неполная форма условного оператора. Она выглядит так

IF условие THEN
команды,_выполняемые_в_случае_истинности_условия

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

CLS
INPUT "Как Вас зовут"; N$
INPUT "А сколько Вам полных лет"; S
IF S<18 THEN ?"Вам еще рановато курить, ";N$ : END
?'Минздрав России предупреждает — курение опасно для вашего
здоровья!"

Здесь появляется новый оператор end, выполнение которого в любом месте программы приводит к ее остановке.
Возможен еще также составной условный оператор, когда после служебных слов then или else вновь следует условный оператор, когда выполнение тех или иных действий зависит не от одного, а от нескольких условий.
Например, допустим, что Преображенский полк гренадеров набирали только из тех новобранцев, рост которых был не менее 180 см, а вес — не менее 80 кг.^ Программа этого процесса выглядела бы следующим образом:

CLS
INPUT "Как Вас зовут?"; N$
INPUT "Каков Ваш рост в см"; R
INPUT "Каков Ваш вес в кг"; М
IF R>=180 THEN IF M>=80 THEN ?"Вы - достойный кандидат
в гренадеры, ";N$ ELSE ? N$; ", к сожалению, вы в гренадеры
не годитесь"

Здесь условный оператор сначала проверяет соответствие кандидата по росту, а затем еще и по весу, и только в случае выполнения обоих условий выдается сообщение о пригодности кандидата.
При использовании составных условных операторов надо быть очень осторожным, чтобы не запутаться самому в then и else. Есть правило, по которому else относится к ближайшему слева от него then. В рассматриваемом случае первый условный оператор, который проверяет рост, относится к сокращенной форме, у него нет else, а второй является полным. Отсюда получается такой казус, что если кандидат сразу не проходит по росту,
то на экране вовсе не появится никакого сообщения, потому что программа должна перейти к следующей за условным оператором команде, а ее нет. Чтобы разобраться в этом, выполните упражнение. Вообще, лучше не злоупотреблять составными условными операторами, а разбивать их на несколько простых или использовать сложные условия, о которых мы поговорим чуть ниже.
119. Какое значение будет иметь переменная х после выполнения очередных операторов:

х=о
IF A>0 THEN IF B>0 THEN X=l ELSE X=2
при значениях переменных а и в:
А=1, В=1 А=1, В=-1 А=-1, В=1

120. Запишите в виде одного условного оператора указанные действия:

известно, что из трех чисел ai, A2 и аз одно отлично от других, равных между собой. Присвоить номер этого числа переменной n;

121. Напишите программу, запрашивающую у пользователя три разных целых положительных числа и находящую сумму двух наименьших из них.
122. Если N=3, то какое значение будет иметь переменная s после выполнения следующего оператора:

S=l: K=2
1: IF K>N THEN GOTO 2
S=S*K
K=K+1
GOTO 1
2: ? "S="; S

Предупреждение
В сокращенной форме условного оператора при переходе к метке можно опускать оператор goto.

Таким образом, вторая строчка предыдущей программы могла бы выглядеть так:
1: IF К > N THEN 2

Сложные условия

Если для выполнения тех или иных действий нужно одновременное выполнение двух и более условий, то они объединяются логической связкой and (И). Например, программу про набор в Преображенский полк можно было бы изменить таким образом:

CLS
INPUT "Как Вас зовут?"; N$
INPUT "Каков Ваш рост в см"; R
INPUT "Каков Ваш вес в кг"; М
IF R>=180 AND M>=80 THEN ?"Вы - достойный кандидат
в гренадеры, "; N$ ELSE ? N$; '1, к сожалению, вы в гренадеры
не годитесь"

Сразу необходимо заметить, что в рассматриваемой версии Бейсика Russian Quick Basic (в отличие от других версий Бейсика) допускается запись неравенства 0<Х<7 именно в такой форме без связки and. Например, программа для вычисления функции



выглядела бы следующим образом:

CLS
INPUT "Введите значение X"; X
IF X > 1 THEN Y=X ^2
IF 0<= X <= 1 THEN Y=X ELSE Y=-2*X+1
? "Y (X)="; Y

Третье условие мы не рассматриваем потому, что если не выполняются первые два, то, очевидно, х находится в третьем ин тервале, поскольку описанные условия охватывают всю числовую ось.
Если есть несколько условий и для организации тех или иных действий достаточно выполнения хотя бы одного из этих условий, то применяется логическая связка or (ИЛИ). Например, программа для вычисления следующей функции:
выглядит так

CLS
INPUT "Введите значение X"; X
IF X<-1 OR X>=1 THEN Y=X л 3 ELSE Y=X л 2
? "Y <X)="; Y

Для различия применения and и or можно привести такой жизненный пример. Каждый человек хоть раз задумывался о спутнике жизни и, естественно, выдвигал какие-либо условия к будущему избраннику. Так вот, более требовательные могли бы выдвинуть два таких условия: пусть он будет красивым И (and) богатым. А менее требовательные, предпочитающие синицу в руках, могли бы сказать так: пусть он будет красивым ИЛИ (or) богатым. Чувствуете разницу? В первом случае избраннику не будет отказано только в одном случае из четырех возможных, а во втором, наоборот, три исхода благосклонны. Он может быть только красив, или только богат, ну а если и красив, и богат, то тем более.
Еще один пример. В стене существует квадратное отверстие NxN см. И имеется кирпич с измерениями А, В и С. Определить, пройдет он в отверстие или нет, если подавать его можно только параллельно стенкам отверстия.
Понятно, что кирпич пройдет в отверстие только в случае, если хотя бы два его измерения меньше N. Отсюда программа будет выглядеть так:

CLS
INPUT "Введите сторону отверстия N"; N
1: INPUT "Введите стороны кирпича А, В и С"; А, В, С
IF A<N AND B<N OR A<N AND C<N OR B<N AND C<N THEN ?"Кирпич проходит в отверстие" ELSE ?"Кирпич не проходит в отверстие" INPUT "Рассмотрим еще один кирпич? 1- да, 0 — нет"; X IF X=l THEN GOTO I ELSE ?"Спасибо за работу!"

По-русски это условие можно объяснить следующим образом. Если А и В меньше N, или А и С меньше N, или В и С меньше N, тогда печатать "Кирпич проходит в отверстие", иначе печатать "Кирпич не проходит в отверстие". Кроме того, в этой программе применен достаточно простой, но эффективный ход, управляющий совместной работой пользователя и программы. Чтобы каждый раз не запускать программу (если пользователь хочет рассмотреть несколько вариантов исходных данных), применен запрос с клавиатуры вариантов продолжения: либо рассматриваем еще один кирпич, либо — конец программы. Там же вы можете видеть применение безусловного перехода в условном операторе. Разберитесь и пользуйтесь этим для грамотного оформления своих программных продуктов.
Напишите программы для решения следующих задач, используя условный оператор и сложные условия.
123. По введенным с клавиатуры коэффициентам квадратного уравнения А, В и С найдите его корни. Рассмотрите шесть возможных вариантов:

• а=в=с=о, корней бесчисленное множество (X — любое);
• а=в=о, оо, уравнение не имеет корней;
• а=о, в*0, 00, вырожденное квадратное уравнение, имеется один корень (формулу вычисления корня найдите сами);
• d<o, где d — дискриминант, который предварительно надо вычислить; уравнение не имеет вещественных корней;
• d=o, уравнение имеет два одинаковых корня (вывести их значения);
• D>0, уравнение имеет два различных вещественных корня (вычислить и вывести их значения).

Для проверки правильности работы программы предлагается шесть тестовых вариантов исходных данных:

• а=в=с=о;
• а=в=о, c=i;
• а=о, в=з, с=б (должно получиться х=-2);
• А=5, В=3, С=2;
• a=i, в=2, с=1 (должно получиться xi=x2=-i);
• А=2, В=5, С=2 (ДОЛЖНО ПОЛУЧИТЬСЯ Х1=-2, Х2=-8).

124. Осуществите запрос трех целых различных чисел с клавиатуры. Выведите на экран наибольшее и наименьшее.
125. Осуществите запрос с клавиатуры у тренера олимпийской сборной России по марафону результаты в часах, минутах и секундах трех победителей чемпионата России. Если какие-то два результата различаются менее чем на 5 сек, выведите
сообщение "Вот так шла борьба за______________медаль".
В сообщении должно быть указано достоинство медали (золотая, серебряная), за которую шла борьба. В противном случае, вычислить среднюю скорость победителя в км/час, если принять длину марафонской дистанции 42 км 195 м.
126. А сейчас мы попробуем сделать пока не очень красивый, но очень простой вариант телевизионной игры "О, счастливчик!". Придумайте пять любых вопросов, и к каждому из них четыре варианта ответов. Теперь я попробую словесно описать алгоритм, а вы — перевести его на Бейсик. Итак, запрашиваем у игрока имя, и узнаем, желает ли он играть. Если не желает, прощаемся, если желает — приветствуем и предлагаем первый вопрос с вариантами ответов. Запрашиваем у игрока с клавиатуры, какой вариант он выбирает. В случае правильного ответа начисляем ему сто очков и переходим ко второму вопросу. Если ответ неверен, то отправляемся на самое начало — снова регистрация и т. д. Первый вопрос — 100 очков, второй — 200, третий — 300, четвертый — 500, пятый — 1000. Если игрок правильно отвечает на все пять вопросов, то поздравляем его и заканчиваем программу.
127. Каждую пятницу члены Клуба толстяков выстраиваются в определенном порядке и взвешиваются. Напишите программу, которая хранит данные взвешивания 10-ти членов Клуба за прошлую неделю. Затем программа запрашивает новые данные взвешивания и для каждого члена Клуба либо выводит поздравление в случае похудения, либо величину прибавки веса с сожалением.
В рамках изучения условного оператора мы можем проанализировать основные принципы движения геометрических объектов по экрану.

CLS
S=0 Rem S — переменная, в которую
Rem будет заноситься накапливаемая сумма.
Rem Естественно, пока мы еще не ввели
Rem ни одного числа, она должна быть обнулена
1: INPUT "Введите любое число"; N
S=S+N
?"Сумма стала равна"; S
INPUT "Еще число? (1 - да, 0 - нет"; R
IF R=l THEN GOTO 1 ELSE ?"Спасибо за работу!"

Выполните упражнение.
128. Попробуйте сами написать программу, вычисляющую произведение последовательно вводимых с клавиатуры, отличных от нуля, чисел. Что изменится по сравнению с предыдущей программой?

Движение геометрических объектов по экрану

Так как интерпретатор Бейсика достаточно медлителен, то очень красивых программ с движением нам не сделать, но зная принципы, легко потом добиться большего на других языках.
Итак, движение. На самом деле, конечно, ничего там не перемещается, а создается иллюзия движения за счет того, что сначала рисуется изображение, потом оно стирается (т. е. рисуется на том же месте цветом фона), а затем вновь выводится в новом месте экрана. Компьютер достаточно быстро проделывает это, и нам кажется, что шарик, например, двигается. Начнем мы с точки, которая смещается по горизонтали, отражаясь от вертикальных сторон экрана.

SCREEN 9
X=300: Y=175 ' начальные координаты точки
DX=1 ' приращение координаты X.
' Так как мы его сделали положительным, ' координата X будет увеличиваться, а, следовательно, ' точка сначала будет двигаться вправо 1: PSET (X, Y), 14 ' вывод точки на экран PSET (X, Y), 0 ' стирание точки цветом фона IF X=0 OR X=640 THEN DX=-DX ' в случае достижения точкой
' вертикальных сторон экрана, приращение по X ' меняется на противоположное, а значит точка 1 начнет двигаться в обратную сторону X=X+DX ' изменение координаты точки GOTO 1 ' переход на метку 1, где происходит рисование точки

Программа, как вы видите, получилась зацикленной, т. е. точка будет двигаться бесконечно, пока мы не нажмем клавиши <Ctrl>+<Break>.

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

Для этого между двумя операторами pset надо вставить два оператора:
FOR 1=1 to 100: NEXT I
Это оператор цикла, о котором мы поговорим позже; пока просто поймите, что в данном месте компьютер посчитает до 100 в своем уме, и на это время в программе возникнет пауза. Подставляя вместо числа 100 другие значения, вы сможете управлять величиной паузы.
129. Напишите программу, которая заставит точку двигаться по вертикали. Потом замените точку на закрашенную окружность, а затем — на закрашенный прямоугольник.
Теперь рассмотрим организацию движения точки, которая меняет свое положение на экране и отражается от всех его четырех сторон под углом 45°, как это показано на рис. 1.32.

Рис.32. Движение точки по экрану под углом 45°

SCREEN 9
Х=300: Y=175 ' начальные координаты точки
DX=1: DY=1 ' приращение координат X и Y.
' Так как мы их сделали положительными, ' координаты X и Y будут увеличиваться, ' а, следовательно, точка сначала будет двигаться 1 вправо-вниз под углом 45 градусов 1: PSET (X, Y), 14 ' вывод точки на экран PSET (X, Y), 0 ' стирание точки цветом фона IF X=0 OR X=64 0 THEN DX=-DX ' в случае достижения точкой
1 вертикальных сторон экрана, приращение по X меняется ' на противоположное, а значит точка начнет двигаться ' в обратную по X сторону IF Y=0 OR Y=350 THEN DY=-DY ' в случае достижения точкой
' горизонтальных сторон экрана, приращение по Y ' меняется на противоположное, а значит точка ' начнет двигаться в обратную по Y сторону X=X+DX: Y=Y+DY ' изменение координаты точки GOTO 1 ' переход на метку 1, где происходит
' рисование точки

Не забывайте про паузу!
130. Замените в предыдущей программе точку на закрашенную окружность. Получится подобие бильярдного стола. А еще можно сопровождать удар шарика о границу экрана звуковым сигналом веер, который нужно добавить после изменения приращения на противоположное.
131. Усложним задачу. На экране появляется прямоугольник, от которого точка тоже должна отражаться (рис 1.33).

Рис.33. Движение точки по экрану с препятствием

Допустим, координаты углов прямоугольника следующие:

левый верхний 100, 180; правый верхний 300, 180; левый нижний 100, 230; правый нижний 300, 230.

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

Для верхней:

IF Y=180 AND 100<Х<300 THEN DY=-DY

To есть если точка достигла горизонтали 180, а по X попала в интервал ] 100; 300[, то изменяем направление движения по Y на противоположное.
Для левой:
IF X=100 AND 180<Y<230 THEN DY=-DY
Рассуждения аналогичны.
132. Теперь вы готовы к более объемному и сложному заданию. Называться оно будет "Муха в графине". Сначала на экране вы рисуете прямоугольный графин с горлышком (рис. 1.34).
Затем располагаете там точку и заставляете ее двигаться внутри графина, отражаясь от его стенок (будет интересней, если вы не станете ее стирать, тогда мы сможем видеть траекторию ее полета). Меняя начальное расположение точки, можно добиться, что через какое-то время она вылетит из
графина. Пусть в этот момент на экране появится надпись "Ура! Я на свободе!", а муха продолжит полет, отражаясь от сторон экрана. Графин можно сделать закрашенным.

Рис.34. Муха в графине

133. Если вы обратили внимание, "муха" при полете слегка пробивает стенки графина. Что нужно изменить в условиях, чтобы этого избежать? Сделайте из "мухи" шарик, и снова добейтесь того, чтобы он не портил стенки графина.
Давайте сделаем простейший графический редактор. У некоторых в детстве была, наверное, и-грушка "Волшебный экран", где можно было крутить колесики и рисовать отрезками прямых линий. Почему бы то же самое не сделать на компьютере? Для этого нам понадобится использование оператора inkey$, который ожидает нажатия любой символьной клавиши и запоминает ее значение. Например:

CLS
1:K$=INKEY$ ? К$ GOTO 1

На экране будет воспроизводиться символ той клавиши, которую вы нажмете (попробуйте поставить после print k$ точку с запятой и посмотрите, что изменилось).
Теперь, совместно используя inkey$ и условный оператор, мы можем сделать полезную прикладную программу-развлечение для младших друзей. Приведем ее фрагмент.

SCREEN 9
Х=300: Y=200: С =15
начальные координаты и цвет точки рисования.
1 Вы можете задать им свои, ' произвольные значения
1: PSET(X,Y), С
K$=INKEY$
IF K$="w' THEN Y=Y -1 ' эта строка заставляет программу
' после нажатия клавиши "w" ' уменьшить координату Y на 1, ' т. е. осуществить передвижение точки ' на одну экранную единичку вверх
Rem Здесь вы программируете другие клавиши для движения
Rem в другие стороны, а также и изменение цвета,
Rem и возможно, стирание. Все в ваших руках!
GOTO 1 ' зацикливание программы на постоянный опрос ' клавиатуры

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


Замечание
Хорошо бы предусмотреть рисование цветом фона для перемещения точки без следа. А чтобы потом определить, где находится точка, достаточно изменить ее цвет.

Оператор выбора

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

SELECT CASE тест_выражение CASE список_выражений1
[блок_ операторов_1]
[CASE список_выражений2
[блок операторов_2]}
[CASE ELSE
[блок_операторов_n]} END SELECT


Здесь тест_выражение — любое числовое или строковое выражение; список_выражений1, список_выражений2 — ОДНО ИЛИ несколь ко выражений для сравнения с параметром тест_выражение. В выражении ключевое слово is должно стоять перед любым знаком отношения. блок_операторов_1, блок_операторов_2, блок_ операторов_n — один или несколько операторов в одной или нескольких строках.
Аргументы списка выражений могут принимать любую из следующих форм или их комбинацию и должны разделяться запятыми:

выражение [, выражение] . . . выражение ТО выражение IS оператор_отношения выражение

Здесь выражение — любое числовое или строковое выражение, совместимое С параметром тёст_выражение\ знак_отношения — один из знаков отношения <, <=, >, >=, <> или =.
Рассмотрим пример:

CLS
INPUT "Введите уровень риска (1-5): "; RISK SELECT CASE RISK CASE IS >= 5
PRINT "Максимальный риск, шансов на возвращение
практически нет." PRINT "Пишите завещание." CASE 2 ТО 4
PRINT "Высокий риск, шансов на возвращение немного." PRINT "Проверьте снаряжение, оружие и припасы." CASE 1
PRINT "Рис.сутствует, возврат гарантирован." PRINT "В Вас отсутствует дух авантюризма,
это слишком скучно." END SELECT
Еще пример. По заданному номеру дня недели требуется напечатать его название:
CLS
INPUT "Введите номер дня недели"; N SELECT CASE N CASE 1
? "Понедельник" CASE 2
? "Вторник" END SELECT

Ну что ж, теория без практики суха. Задания.
134. Напишите программу, которая выводит на экран меню, содержащее список трех поэтов под номерами, затем запрашивает у пользователя номер поэта и выводит на экран какое-нибудь его четверостишие, после чего возвращается в меню. Последним пунктом меню предусмотреть выход из программы.
135. В восточных календарях принят 60-летний цикл, состоящий, в свою очередь, из пяти 12-летних подциклов. Под-циклы обозначались цветом: зеленый, красный, желтый, белый и черный. Внутри каждого подцикла годы носили названия животных: крысы, быка, тигра, кролика (зайца или кота), дракона, змеи, лошади, овцы (барана или козы), обезьяны, петуха, собаки и свиньи. Создайте программу с использованием операторов выбора, запрашивающую номер года нашей эры и печатающую его название по восточному календарю. Для проверки: 1966 г. — год красной лошади, 1984 г. — зеленой крысы.
136. Усложненный вариант предыдущего задания. Теперь требуется определить не только название введенного с клавиатуры года, но и год наступления "светлого будущего", до которого вы, безусловно, доживете! Делаем это поэтапно. Вот примерный словесный алгоритм. После введения исходного четырехзначного года с клавиатуры вам необходимо выделить составляющие его цифры и записать их в переменные А1, А2, аз и А4. (Если в номере года есть нули, то в соответствующие переменные записать 4.) Затем необходимо взять от них синусы по модулю. Из полученных значений выделить по две цифры после запятой и сложить их. Если сумма больше либо равна 10, то сложить еще раз. Должно полу-
читься 4 цифры, из которых надо составить четырехзначное число. Это и будет номер года наступления светлого будущего. Осталось определить его название по восточному календарю и вывести результаты на экран. Для проверки: при исходном годе 1986 годом светлого будущего будет 3589.


Циклический алгоритм

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


Оператор с заранее известным числом повторений

Когда мы работали с графикой, то в одном из заданий вам предлагалось построить мишень — пять концентрических окружностей. Мы это легко сделали, пять раз написав оператор построения окружности circle, изменяя в нем каждый раз радиус.
Ну а если бы таких окружностей надо было бы 100? Неужели 100 раз писать практически одно и то же? Очень нелегко, даже если пользоваться копированием строк. Неужели нельзя как-нибудь полегче? Конечно можно! Нам на помощь приходит оператор ЦИКЛа FOR. . .NEXT.
Итак, правила пользования оператором цикла for. . .next:

Рассмотреть повторяющиеся действия и выделить в них равномерно изменяющуюся величину (параметр). Дать параметру имя. Определить для параметра начальное значение, конечное значение и шаг изменения, т. е. насколько за один раз увеличивается (или уменьшается) параметр. Написать оператор цикла, состоящий из трех частей: заголовок цикла FOR параметр=нач значение ТО кон_значение STEP шаг тело цикла В теле цикла указываются один или несколько операторов, предназначенных для повторяющихся действий, причем, вместо конкретных значений изменяющейся величины указывают имя параметра. NEXT параметр

Рассмотрим пример построения мишени. Действуем по правилам. При рисовании мишени изменяется радиус, это и будет параметр. Обозначим его буквой R. Пусть начальное значение r=20, конечное значение r=60, шаг изменения ?r=io.
Записываем оператор цикла (предварительно, конечно, включив графический режим):

FOR R=20 TO 60 STEP 10
CIRCLE (320, 175), R, 14 NEXT R

Если мы также четко будем и в дальнейшем следовать этим правилам, то нам не составит труда работать с оператором цикла.
Необходимо отметить, что можно записывать оператор цикла в одну строку, это не ошибка:

FOR R=20 TO 60 STEP 10: CIRCLE (320, 175), R, 14: NEXT R

Но если в теле цикла много операторов, то такая запись будет плохо читаемой.
Как же работает оператор цикла на примере приведенной выше программы? Встретив заголовок цикла for, программа присваивает параметру начальное значение и переходит в тело цикла. Там находит команду circle, и исполняет ее, подставляя вместо параметра его начальное значение. Встретив команду next программа добавляет к предыдущему значению параметра величину шага, затем проверяет условие, не стало ли значение параметра больше конечного его значения, и, если нет, продолжает выполнение цикла. Если да, переходит к выполнению следующей за оператором цикла команды или заканчивает выполнение программы, если таковой отсутствует.
Таким образом, последнее значение параметра в нашем примере будет 70, после чего цикл закончится. (Попробуйте к программе добавить строку ? "R=",- r и посмотрите, что появилось на экране.)
Теперь следует сказать несколько слов о составной части оператора цикла — шаге изменения параметра step. Довольно часто преподаватели провокационно спрашивают, а какие значения может принимать step? Может ли он быть отрицательным? Дробным? Вот ответы на эти вопросы. Шаг может быть любым вещественным числом, за исключением нуля, иными словами, и целым, и дробным, и отрицательным. Но отрицательным он может быть только в случае, если начальное значение параметра больше конечного, т. е. когда мы идем от большего к меньшему. Например, тот же оператор цикла из примера про мишень с тем же результатом можно было бы записать и так:

FOR R=60 TO 20 STEP -10: CIRCLE (320, 175), R, 14: NEXT R

Кроме того, если шаг изменения параметра равен единице, то при написании оператора цикла его можно опускать, например:

FOR №-12 ТО 24 STEP 1

можно было бы записать просто

FOR W=12 TO 24

Но это не касается минус единицы!
Использование оператора цикла очень наглядно в графике (хотя это, как раз, не главное применение данного очень полезного инструмента). Поэтому, давайте освоим правила управления оператором цикла, выполнив несколько упражнений.
137. Напишите программу, рисующую на экране горизонтальную линию, состоящую из точек, расстояние между которыми 8 (рис. 1.35).

Рис.1.35. Горизонтальная линия из точек

138. Заполните экран горизонтальными линиями (через 10), а затем, с помощью еще одного оператора цикла, вертикаль ными линиями другого цвета (тоже через 10). Должна получиться решетка, как на рис. 1.36.

Рис.1.36. Решетка

Рис. 1.37. Пешеходный переход "зебра"

139. Нарисуйте пятиконечную звезду, вписанную в окружность, как на рис. 1.25. Используйте для рисования и закраски операторы цикла.
140. Постройте пешеходный переход — "зебру", как на рис. 1.37.
141. Нарисуйте фантастический глаз, как на рис. 1.38.

Рис. 1.38. Фантастический глаз

Рис. 1.39. Взрыв сверхновой

142. Изобразите взрыв сверхновой звезды (если это задание делать по-простому, то понадобится четыре оператора цикла, можно сложнее — но и короче). Сделайте лучи во всех четырех случаях разного цвета. Это придаст живости (рис. 1.39).
143. Заставьте окружность надуваться как воздушный шарик.
144. Мы уже перемещали по экрану геометрические фигуры с использованием условного оператора и оператора безусловного перехода. Теперь наши фигуры будут двигаться равномерно по вертикали или горизонтали. Сместите:

закрашенный прямоугольник; закрашенную окружность.

Все это замечательно. Но давайте вспомним, что Бейсик — все-таки язык в большой степени не графический, а вычислительный, и попробуем применить оператор цикла к вычислениям.
Например, напечатать значения y = sinx в интервале [-30°; 30°]
с шагом 5°. Действуя по правилам, несложно понять, что параметр — это х, так мы его и обозначим. Начальное, конечное значения параметра и шаг указаны непосредственно в самом задании. Пишем оператор цикла:

OR X=-30 ТО 30 STEP 5
Y=SIN (X*3.14/180)
? "SIN С; X; ")="; Y NEXT X

На что, кроме оператора цикла, здесь хочется обратить ваше внимание, так это на оператор print. Разберитесь, пожалуйста, как он работает, и что дает такая, казалось бы, запутанная запись.
Еще пример. Необходимо вывести на экран четные числа от 2 до 20. Здесь меняется само число, обозначаем его N, начальное значение 2, конечное 20, шаг 2. Пишем:

FOR N=2 ТО 20 STEP 2: ? N: NEXT N

А если от 20 до 2, то будет, соответственно:

FOR N=20 ТО 2 STEP -2: ? N: NEXT N

Проверим ваше понимание, как всегда, при помощи ряда заданий.
145. Выведите на экран в строку все числа первой сотни, оканчивающиеся на пять.
146. Определите значение переменной f после выполнения следующих операторов:

F=l: N=l
FOR 1=2 ТО N: F=F+1/I: NEXT I

147. Напишите программу, запрашивающую возраст пользователя, а затем печатающую текст "Да ты крут!" по числу прожитых лет. Обратите внимание, что здесь в теле цикла не будет использоваться параметр. Такое тоже возможно.
148. С клавиатуры запрашивается любая цифра от 2 до 9, а затем компьютер печатает таблицу умножения на эту цифру.
149. Напишите программу., выводящую на экран степени числа 2 от 2 до 10 включительно.
150. Распечатайте в табличном виде (с аргументами) значение функции квадратного корня на интервале [2; 4] с шагом 0,1.
151. Напишите программу, которая в центре чистого экрана на одном и том же месте выведет последовательно цифры от 1 до 3600 (аналог электронного секундомера).
Когда мы двигали геометрические объекты, го нам приходилось иногда искусственно замедлять движение, чтобы оно было более плавным. Тогда без объяснений был введен пустой цикл для организации пауз. Пустым будем называть такой цикл, в котором нет тела. Например:

FOR 1=1 ТО 100: NEXT I

Просто компьютер считает в уме до 100. А мы его ждем (ну, правда, если до 100 — это быстро, а вот до 10 000 уже придется |и потерпеть).
Следующая группа упражнений поможет вам закрепить работу с оператором цикла в графике на примере орнаментов. Сначала рассмотрим пример.
Орнамент — это повторяющийся геометрический узор, например, как на рис. 1.40.

Рис.1.40. Орнамент

Правила построения орнаментов:

выявить в орнаменте повторяющийся фрагмент; выделить опорную изменяющуюся величину (параметр), ее начальное, конечное и шаг; дать параметру имя; определить смещение других изменяющихся величин относительно опорной; написать оператор цикла.

152. Напишите программу для рисования орнамента (рис. 1.40).
153. Закрепите успех, написав программу для построения греческого орнамента (рис. 1.41).

Рис.41. Греческий орнамент

Рис.1.42. Буратино

154. Когда мы изучали операторы data и read, to мы говорили, что используем их при изучении оператора цикла. Этот час пробил. Задав в операторе data координаты всех точек концов отрезков, из которых состоит рис. 1.42, напишите программу, рисующую Буратино при помощи оператора цикла.

Совет
При рисовании непрерывной ломаной линии применяется сокращенная форма оператора line, а именно: line -(х, Y), с. То есть линия будет рисоваться от последней графической точки на экране до точки с координатами X, у. Поэтому при выполнении предыдущего задания рекомендуется поставить первую точку оператором pset, а затем в цикле считывать поочередно координаты следующих точек и рисовать отрезки при помощи сокращенной формы оператора line.


Оператор цикла WHILE... WEND

Этот оператор позволяет сочетать свойства условного оператора и оператора цикла. С их помощью можно выполнять повторяющиеся действия с заранее неизвестным количеством повторений.
Работает он следующим образом. Сначала идет оператор while с условием, при котором цикл выполняется. Ключевое слово wend аналогично по своему назначению слову next, т. е. является последней строкой цикла. Всякий раз, доходя до wend, компьютер проверяет, выполняется ли условие, указанное оператором while. Если оно не выполняется, то программа переходит к исполнению операторов, следующих за wend. Если же выполняется, то цикл повторяется снова. Следующая программа, прежде чем допустить пользователя до продолжения работы, запрашивает у него пароль.

WHILE WORD$О"TERMINATOR"
INPUT "ВВЕДИТЕ ПАРОЛЬ"; WORD$ 'WEND ? "ПРАВИЛЬНО! ВЫ ДОПУЩЕНЫ К ПРОДОЛЖЕНИЮ РАБОТЫ"
Вот как эта программа будет работать после запуска:
ВВЕДИТЕ ПАРОЛЬ? MOON
ВВЕДИТЕ ПАРОЛЬ? ARNOLD
ВВЕДИТЕ ПАРОЛЬ? TERMINATOR
ПРАВИЛЬНО! ВЫ ДОПУЩЕНЫ К ПРОДОЛЖЕНИЮ РАБОТЫ

155. При помощи оператора while...wend вычислите с— наибольший общий делитель введенных с клавиатуры натуральных чисел х и y.
156. Определите, какие из представленных ниже операторов Бейсика написаны правильно, а какие нет. В случаях неправильной записи объясните допущенные ошибки. Все операторы рассматривайте по отдельности, потому что они не являются частями одной программы.

FOR D=R TO S STEP H IF W=13 THEN ? "ЧЕРТОВА ДЮЖИНА" IF W=13 THEN X=X+1 FOR S=2-6 4 FOR S=4 TO 12 STEP 2 FOR S=12 TO 4 STEP 2 WEND S=45

Что будет выведено на экран в результате выполнения следующих программ при указанных исходных данных.

157. Программа:
INPUT W FOR R=l TO W ? "WAR"
NEXT R
IF R=W THEN GOTO 1
? "SUNDAY"
1: "PEACE"
при w=3.

158. Программа:

W=27.6
1: IF INT(W)=W THEN GOTO 2
? "ЧЕРТ ПОБЕРИ!!!"
W=W * 2 - 5.2
GOTO 1
2: ? "МИХАИЛ СВЕТЛОВ"
A=W -1
IF A <> 50 THEN 3
GOTO 1
3: END

159. Программа:

FOR H=5 TO 21 STEP 4
? H - 3
? H+3 NEXT H
160. Программа:
1: ? "НА СТАРТ! ВНИМАНИЕ!" FOR V=5 TO 1 STEP -1 ? V; "СЕКУНД"
GOTO I
? "МАРШ!"

161. Программа:

DATA 10, 100, 1000
READ А, В
? В - А
READ С
RESTORE
READ X, Y, Z
IF C=Y THEN 1
IF B=Y THEN 2
GOTO 3
1: ? "плюс"
GOTO 3
2: ? "МИНУС"
3: END

162. Программа:

X=13
Y=17
Z=2
2: IF Z >=5 THEN 1
? X, Y, Z
X=X - 1
Y=X+Y
Z=Z+1
GOTO 2
1: END

163. Программа:

FOR R=l TO 4 9 STEP 6
W=W+R*2 NEXT R ? R

164. Программа:

FOR K=7 TO 28 STEP 7
? "УРА!!!" NEXT К ? "ВПЕРЕД!!!"

165. Программа:

x=i
1: ? X
Х=Х+2
IF X <= 13 THEN 1
END

166. Программа:

FOR B=l TO 4
D=B*2
? D, В NEXT В

167. Программа:

FOR C=2 TO 11 STEP 2
? C, C"2 NEXT С ? "ВЗРЫВ!"

168. Программа:

X=13 Y=52 Z=99 FOR U=100 TO 1 STEP -2
IF U=X THEN ? U
IF U=Y THEN ? U
IF U=Z THEN ? О NEXT U

169. Программа:

WHILE S < 10
? S WEND

170. Программа:

WHILE D$ О "ИНФОРМАТИКА"
READ D$, В
? "ПРЕДМЕТ"; D$
? В WEND DATA МАТЕМАТИКА, 4, ФИЗИКА, З, ИНФОРМАТИКА, 5, ХИМИЯ, 3


Случайные числа

В процессе изучения циклических алгоритмов уместно рассказать о генерации случайных чисел программным путем. При кажущейся простоте получить случайные числа не так легко. Попробуйте продиктовать своему другу 100 цифр. В идеале каждая из них должна бы повториться по теории вероятности около 10 раз, но у каждого человека встречаются какие-то пристрастия к тем или иным цифрам и в ряду из сотни цифр не будет абсолютной случайности. Получить на компьютере случайные числа тоже было нелегко, но в конце концов это удалось. В качестве основы для создания какой-либо последовательности случайных чисел служат показания встроенного в компьютер таймера. А поскольку они в каждый момент времени различны, то мы и получаем великое множество практически неповторяющихся случайных чисел в заданном диапазоне.
Случайные числа нужны прежде всего в компьютерных играх, чтобы обеспечить непредсказуемость игры для человека. Кроме того, они используются в учебных задачах и моделировании различных математических, физических и других процессов на компьютере.
Итак, новый оператор rnd.
Чтобы получать случайные числа, вы прежде всего должны инициировать процесс генерации последовательности случайных чисел компьютером при помощи оператора randomize timer. Он указывается в программе только один раз и сообщает компьютеру, что надо создавать случайные числа, беря за основу показания таймера.
Затем, чтобы получить из этой последовательности какое-либо значение, мы должны использовать оператор rnd(n), который выдает случайное число в диапазоне от 0 до 1. Минимальное полученное число будет 0,0000001, а максимальное 0,9999999. В качестве N может служить любое целое или действительное число. Этот параметр также влияет на выбор компьютером случайных чисел. Например, программа
RANDOMIZE TIMER X=RND(1) ? X
может вывести на экран число 0,367423, а может 0.0034289, а может 0,8912314. Каждый раз при запуске программы мы будем видеть новое значение.
Но часто встает проблема получения случайных чисел в заданном диапазоне. Как это сделать, мы рассмотрим на примерах.

Моделирование бросания монеты

Нам необходимо при каждом запуске программы случайным образом получать либо число 0 ("решка"), либо 1 ("орел"). Если мы будем просто брать целую часть от полученного при помощи rnd(N) случайного числа, то всегда будем получать 0.
Попробуем умножить rnd(N) на 2. В результате имеем числа от 0,0000002 до 1,9999998. Если мы теперь будем брать целую часть, то как раз и получим 0 или 1. Программа выглядит следующим образом:

CLS
RANDOMIZE TIMER
X=INT(RND(1)*2)
IF X=0 THEN ? "У вас выпала решка" ELSE ? "У вас выпал орел"

Моделирование бросания игрального кубика

Казалось бы надо пойти по уже проторенному пути первого примера и, раз нам надо получить цифры от 1 до 6, просто умножить rnd(N) на 6. Но, если разобраться, то обнаружится, что при этом мы будем получать числа в диапазоне от 0,0000006 до 5,9999994. Взятая целая часть даст нам числа от 0 до 5. На 6 никак не выходим. Хорошо, умножим на rnd(N) 7. Тогда получим числа от 0,0000007 до 6,9999993. Теперь получается 6, но нам ведь совсем не нужен 0. Что же делать? Очень просто — умножаем на 6 и прибавляем 1!

CLS
RANDOMIZE TIMER
X=INT(RND(1)*6)+1
? X

Так как в дальнейшем нам придется часто сталкиваться с заданиями, требующими использование случайных чисел, то необходимо потренироваться.
Напишите операторы для получения случайных целых чисел в интервалах.
171. От 1 до 10.
172. От -5 до +5.
173. От 10 до 20.
174. От 50 до 100.
175. От -35 до 65.
Применим теперь оператор случайных чисел на практике и, как всегда, для наглядности начнем с графики.

Программа "Звездное небо"

Изобразим звездное небо пятьюстами белыми точками на черном фоне. Координаты каждой из точек должны быть в пределах по X от 0 до 640 и по Y от 0 до 350.

SCREEN 9 RANDOMIZE TIMER FOR N =1 TO 500
X=INT(RND(1)*641)
Y=INT(RND(1)*351)
PSET(X, Y) , 15 NEXT N

Здесь число 500 в заголовке цикла указывает на количество "звезд". Можете поэкспериментировать, изменяя этозначение.
А теперь мы хотим нарисовать разноцветные "звезды".
Добавим для этого перед pset оператор случайных чисел для цвета

C=INT(RND(1)*16)

а в самом операторе pset вместо цвета 15 укажем цвет с, и можем наслаждаться разноцветными "звездами".
Но давайте уж доведем дело до конца. Ведь при использовании оператора c=INT(RND(1) *16) у нас будет получаться и 0 — черный цвет, т. е. на черном фоне своеобразные "черные дыры". Давайте избежим и этого, заставив компьютер при получении 0 не брать его в расчет, пока не получится другой цвет:

SCREEN 9
RANDOMIZE TIMEP
FOR N =1 TO 500 X=INT(RND(1)*641) Y=INT(RND(1)*351) 1: C=INT(RND(1)*16) IF C=0 THEN 1 PSET(X, Y) , С
NEXT N

Co звездным небом разобрались. Теперь задания.
176. Когда-то на петербургском 5-м канале была скандально известная информационная программа "600 секунд" с телеведущим Александром Невзоровым. Начиналась она с заставки, где экран телевизора покрывался сеткой разноцветных отрезков прямых линий со случайными координатами концов (рис 1.43). Попробуйте воспроизвести эту заставку и покажите ее своим старшим родственникам или друзьям. Это навеет на них воспоминания.

Рис. 1.43. "600 секунд"

177. Видоизмените (весьма, надо сказать незначительно, легким движением руки) предыдущую программу, чтобы она заполняла экран сотней цветных прямоугольников случайных размеров (рис. 1.44). Постарайтесь, чтобы на черном фоне не получались черные прямоугольники.
178. Теперь настал черед заполнить экран полусотней окружностей. Закраска пусть будет разноцветная, а контур окружностей только белый (рис. 1.45).
179. Давайте устроим в центре экрана маленький взрыв. Он будет изображен сотней отрезков разноцветных прямых, сходящихся в точке Х=320, Y=175. Длина их пусть лежит случайным образом в пределах от 50 до 100 экранных точек (рис. 1.46).

Рис. 1.44. Разноцветные прямоугольники

Рис. 1.45. Разноцветные окружности

Рис. 1.46. Взрыв


Построение графиков функций

Строить графики в Бейсике мы будем точками, а задавать компьютеру функцию для построения оператором def fn.
Кроме того, координатная сетка экрана компьютера, как мы должны помнить, является перевернутой по отношению к привычной геометрической. Отсюда и последуют преобразования по приведению координатной сетки к нормальному виду. Я не хочу утомлять читателя длинными математическими выкладками, а призываю поверить на слово. Если же в ком-то проснется любознательность, то разобраться во всем можно самому.
Итак, оператор def fn определяет для компьютера ту функцию, график которой мы хотим построить. Работает он следующим образом:

DEF FN имя_функции{параметр_функции)=функция

Например, определим функцию у = sin x .

DEF FNY(X)=SIN(X)

Здесь y — имя функции, х — ее параметр, a sin (X) — непосредственно сама функция.
Определим функцию

DEF FNY(X)=COS(2*X)+TAN(X/2)

Предупреждение
В одной и той же программе нельзя использовать для разных функций одно и то же имя. Необходимо давать разные имена, например Y(X), Z (X), R(X) И Т. Д.

Теперь непосредственно о построении графиков на примере функции синуса.
Сначала нарисуем оси координат — две взаимно перпендикулярные линии, пересекающиеся в центре экрана.

SCREEN 9
LINE (0, 175)-(640, 175), 15
LINE (320, 0)-(320, 350), 15
Rem ось абсцисс Rem ось ординат
Теперь определим функцию, как мы это уже делали.
DEF FNY(X)=SIN(X)

Далее самое интересное — загадочный цикл непосредственного построения графика.

FOR X=0 ТО 640
Y=175~30*FNY( (X - 320)/30)
PSET(X, Y) , 15 NEXT X

После запуска программы должна получиться следующая картинка (рис. 1.47).

Рис.1.47. График функции синуса

Значение X изменяется от 0 до 640, давая возможность строить график на всю ширину экрана. Достаточно сложно выражение для Y. Это связано с переносом начала координат в центр экрана (отсюда числа 175 и 320). А вот число 30 в данном случае несколько произвольно — это коэффициент растяжения. Попробуйте его поменять сначала на 10, а потом на 50 (только менять всегда надо в двух местах) и посмотрите на возникающие отличия. На мой взгляд, коэффициент 30 наиболее оптимален.
Построение иного графика сводится к замене определения функции на другую.
Давайте поупражняемся. Напишите программы построения графиков перечисленных ниже функций.
180. Y=COS (X) .
181. Y=ABS (X) .
182. Y=INT(X) .
183. у=1/(1+х^2).
184. Y=X^2.
185. Y=2*SIN(X/2)+0.5*COS(2*X).
186. Y=TAN(X).
Графики представляют из себя семейства точек, между которыми могут быть значительные разрывы (как, например, при построении графика тангенса). Чтобы избежать этого, уплотнкть график, можно в заголовке цикла установить шаг изменения по X меньше 1. Попробуйте.
Теперь попытаемся построить график функции y=i/x (кажется, это называется гиперболой). Если вы будете рисовать его как т
описано выше, ничем не дополняя, то, возникнет ошибка, о которой мы уже говорили — "Деление на ноль". Придется в очередной раз вспомнить математику и область допустимых значений. В данном случае, X не может быть равен 0, но поскольку начало координат у нас искусственно перенесено в центр экрана, то для графика X будет обращаться в 0 при координате экрана, равной 320. Поэтому программа будет выглядеть так:

SCREEN 9
LINE {0, 175)-(640, 175), 15
LINE (320, 0)-(320, 350), 15
DEF FNY(X)=1/X
FOR X=0 TO 640
IF X=320 THEN X=X+1 Y=175-30*FNY((X - 320)/30) PSET(X, Y), 15
NEXT X

А график должен выглядеть так (рис. 1.48).

Рис.1.48. График гиперболы

Постройте теперь графики следующих функций.

187. y=1i/(x+d.
188. Y=SQR(X).
189. Y=X/(X^2-1).

Сейчас задания посложнее, но и интереснее. Изобразите на экране поверхность, образованную вращением вокруг оси X графиков представленных ниже функций.

190. у=1/(1+х^2).
191. Y=1/X.
192. Нарисуйте поверхность, образованную вращением вокруг оси Y, графика функции у = х2 .

Совет
Попробуйте строить график не точками, а эллипсами, радиус которых... Вот именно!


Циклы с несколькими зависимыми параметрами

Бывает, что при попытке выполнить задание с помощью оператора цикла выясняется, что изменяется не одна, а две или три величины. В том случае, если вы можете установить между ними зависимости, следует использовать следующие правила:

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

Приведем пример. Предположим, мы хотим построить семейство окружностей, как на рис. 1.49. Не правда ли, напоминает рупор?

Рис.1.49. "Рупор"

Действуем по правилам. Все окружности лежат на одной горизонтали, т. е. у их центров меняются не координаты Y, а координаты X. Кроме этого, они имеют разный радиус. Причем он
изменяется не спонтанно, плавно увеличиваясь. Итак, обозначим изменяющиеся величины: X — координата центров окружностей по оси абсцисс, R — радиус окружностей.
Назначим независимым аргументом координату X. Попробуем установить закономерность изменения радиуса R от аргумента X. X изменяется от 0 до 640. Допустим, шаг изменения 10. Обычно устанавливают такое взаимоотношение X и R:

R=X

Но в этом случае получится, что радиус последней окружности будет равен 640, диаметр, соответственно, 1280. А ведь экран высотой всего 350! Значит, если мы хотим видеть на экране все наши окружности, то последний радиус не должен превышать 175, а лучше был бы меньше. Попробуем избрать такое соотношение:

R=X/4

Максимальное значение радиуса в таком случае равно 160. Напишем программу:

SCREEN 9
FOR Х=0 ТО 640 STEP 10
CIRCLE (X, 175), Х/4, 15 NEXT X

Посмотрите, что получается на экране. Похоже? Не совсем, скажете вы и будете правы, потому что последние окружности выходят за пределы экрана справа. Но с этой проблемой я предлагаю разобраться вам самостоятельно.
Потренируемся.
193. Напишите программу, изображающую "орбиты", соприкасающиеся все в крайней правой точке и имеющие разные радиусы (рис. 1.50).

Рис..50. "Орбиты"

194. Создайте программу, выводящую на экран "труба" — окружности одного радиуса, выходящие из левого верхнего угла экрана и идущие под углом 45° вправо вниз (рис. 1.51). Окружности нарисованы одним цветом, а закрашены другим.

Рис.1.51. "Труба" под углом 45°

Рис.52. "Труба" по диагонали

195. Напишите программу, аналогичную предыдущей, только окружности разместите из левого верхнего угла в правый нижний по диагонали экрана (рис. 1.52). Надо использовать соотношения сторон экрана.
196. С помощью Бейсика постройте две лестницы (рис. 1.53 и 1.54).

Рис.1.53. Лестница 1

Рис.1.54. Лестница 2

197. Нарисуйте две пирамиды индейцев майя — вид спереди и вид сверху (рис. 1.55 и 1.56).
198. Вернитесь к примеру с "рупором" из увеличивающихся окружностей и попробуйте сделать картинку, на которой подобные рупоры выходят из всех четырех углов экрана и встречаются в центре.

Рис.55. Пирамида: вид спереди

Рис.56. Пирамида: вид сверху

199. Напишите программу построения "эллипсирующих окружностей" (рис. 1.57).

Рис. 57. "Эллипсирующие окружности"


Вложенные циклы

В предыдущем разделе мы рассмотрели случаи, когда в цикле изменяются несколько величин, но их можно выразить друг через друга. Сейчас нам надо рассмотреть ситуации, когда изменяются несколько независимых величин.
Приведем пример. Напишем программу заполнения экрана точками с расстоянием между ними по горизонтали и вертикали 10.

SCREEN 9
FOR X=0 TO 64 0 STEP 10
FOR Y=0 TO 350 STEP 10 PSET(X, Y), 4
NEXT Y NEXT X

Работает программа таким образом. В первом заголовке цикла переменной X присваивается значение 0. Потом программа переходит к выполнению следующего оператора, т. е. в нашем случае, второго цикла, который и исполняется, пока Y не пре высит значение 350. После этого берется следующее значение X, и действия с Y повторяются. И так до тех пор, пока X не станет больше 640. То есть программа строит вертикальные цепочки точек, пока не заполнится весь экран.
Все это не так сложно, если понять и запомнить следующее. Циклы должны быть вложены друг в друга, как матрешки. Параметры, упоминаемые в заголовках циклов, в их окончаниях должны быть перечислены в обратном порядке.
Правильное использование циклов:

FOR X=0 ТО 64 0 STEP 10
FOR Y=0 TO 350 STEP 10 Rem Тело цикла
NEXT Y NEXT X

Неправильное применение циклов:

FOR X=0 TO 640 STEP 10
FOR Y=0 TO 350 STEP 10 Rem Тело цикла
NEXT X NEXT Y

Кроме того, в окончании вложенных циклов можно указывать только один оператор next с перечислением параметров, например:
NEXT Y, X
Приступим к упражнениям.
200. Напишите программу, заполняющую экран лоскутным ковром. Лоскутки должны быть плотно прилегающими друг к другу разноцветными квадратиками со стороной 10 (рис. 1.58).

Рис.58. Лоскутный ковер

201. Заполните экран светофорными кругами (рис. 1.59). Самые большие круги красные, средние — желтые, маленькие — зеленые.

Рис.59. Светофорные круги

202. Воспользовавшись предыдущим заданием, замените окружности на квадраты — получатся "светофорные" квадраты.
203. Изобразите шахматную доску.
Мы всё работаем с графикой. Это наглядно. Но не будем забывать о том слове, от которого произошел термин "компьютер" — вычислять.
204. Напишите программу, выводящую на экран таблицу умножения от 2 до 10 в следующем виде (рис. 1.60).

Рис.60. Таблица умножения

Прежде чем выдать вам следующее задание, мне бы хотелось ознакомить вас с весьма полезным оператором sleep. Он приостанавливает выполнение программы на указанное количество секунд. Например:

? "Поспите 10 сек."
SLEEP 10
? "Подъем! Учитель пришел!"

Если значение секунд указано 0 или не указано вовсе, то программа будет ожидать нажатия любой клавиши, например:

? "Прочитайте внимательно нижеследующее слово и нажмите
любую клавишу, когда надоест..." ? "Вы — просто гений!" SLEEP ? "Но от скромности вы не умрете..."

205. Итак, используя полученные знания про вложенные циклы и оператор sleep, напишите программу, которая в центре чистого экрана будет выводить показания хронометра — часы, минуты и секунды, разделенные двоеточием, начиная с 0 час. 0 мин. 0 с. Отрегулируйте свой хронометр, чтобы он шел правильно.
206. Усложним предыдущее задание. Нарисуем будильник, сделаем в нем два поля. В одно выведем текущую дату, а во второе — наш уже получившийся хронометр. Если очень захочется, то можно сделать из него будильник, добавив в нужный момент оператор веер, который производит отрывистый не совсем приятный звук (рис. 1.61).

Рис.61. Электронный будильник

А теперь два интегрированных задания, где надо применить знания, приобретенные вами ранее.
207. Напишите программу "Уничтожение астероида". Экран заполняется пятьюстами звездами. Астероид изображается красным кругом белым контуром, центром в точке 470, 160
и радиусом 10. По траектории функции y = 0,5sin2x + 2cos-x/2
от правой стороны экрана движется боевой звездолет, изображаемый зеленым кругом с желтым контуром и радиусом 3. Каждый момент продвижения сопровождается проверкой
условия, не находится ли звездолет в опасной близости от астероида (опасным считается расстояние менее 50 экранных точек). Если это расстояние в некоторый момент времени стало меньше критического, то звездолет уничтожает астероид, т. е. он взрывается (см. задание 179). На экране появляется торжествующая надпись. Все радуются (в том числе и учитель).

Совет
Расстояние между двумя точками на плоскости вычисляется по формуле: корень квадратный из суммы квадратов разностей координат Х1, Х2 и Y1, Y2. Я специально не пишу эту формулу. Проверяем понимание сложных инструкций.

208. Это задание носит прикладной характер и позволяет опытным путем вычислить число п. Да, безусловно, практически все из вас знают это число с точностью по крайней мере до двух знаков. Но предлагаемый метод очень хорош. Называется он методом Монте-Карло. Монте-Карло — европейская столица игорного бизнеса, а значит там владычествует Его Величество Случай. Вот "мы и попробуем поставить его себе на службу.
Сначала забудьте, чему равно п и послушайте теорию вопроса. Представьте себе окружность радиусом R = \ , вписанную в квадрат. Из этого следует, что сторона квадрата будет 2R , а его площадь SK = (2R)2 =4R2. Площадь круга SO = kR2 . Далее берем и равномерно посыпаем квадрат песком. Затем нанимаем бригаду рабочих, которые считают, сколько песчинок всего (N1) и сколько из них попало в круг (N2). Потом составляется простая пропорция — площадь квадрата так относится к площади круга, как общее количество песчинок к количеству песчинок попавших в круг.
Отсюда сенсационный вывод — радиус окружности не имеет никакого значения, она должна быть лишь вписана в квадрат (рис. 1.62).
Но где ж мы найдем песок, а главное тех, кто все это будет считать? Поэтому поставим компьютерный эксперимент. Нарисуем квадрат и впишем в него окружность. Координаты опорных точек (если сами рисовали) знаем. Уравнение окружности X2 +Y2 = R2 тоже знаем. Задаем цикл до 1000, в котором случайным образом определяем координаты "песчинок" так, чтобы они лежали внутри квадрата. Тут же проверяем условие, а не попала ли "песчинка" в круг (используя уравнение окружности), и если попала, подсчитываем их количество. Кроме того, рисуем их на экране разными цветами (попавшие и не попавшие). По окончании цикла подсчитываем и выводим на экран число п. Понятно, что чем больше количество "песчинок", тем более точным будет результат. Для того чтобы знать, когда закончится эксперимент, рекомендуется выводить на экран счетчик "песчинок" (как мы делали с хронометром). Но, все-таки, экспериментировать с миллионом "песчинок" не надо — замучаетесь ждать сами, да и компьютер, хотя и железный, но все же живой.

Рис.62. Вычисление числа я методом Монте-Карло


Наращивание переменной

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

Х=Х+1

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

CLS S=0
'Обнуление переменной, где будет накапливаться сумма


FOR 1=2 TO 100 STEP 2
S=S+I NEXT I ? "Сумма четных чисел от 1 до 100 равна"; S

Программа работает эффективно и просто. Параметром цикла являются сами четные числа, которые нам остается накапливать в переменной S. Разберем алгоритм по шагам:

s=0; 1=2; s=0+2=2; 1=4; s=2+4=6; 1=6; s=6+6 и т. д. до 100.

На экране в результате увидим надпись:

Сумма четных чисел от 1 до 100 равна 2550.

Объяснять здесь вроде больше нечего Иногда лучше решать, чем говорить. Итак, вам необходимо написать программы для нахождения сумм.
209. Всех чисел, делящихся на 13 в интервале [1; 1000].
210.
211.
212. Напишите программу для нахождения суммы пяти произвольных чисел, вводимых с клавиатуры (сумматор).
213. Создайте программу для нахождения суммы пяти заданных чисел, указанных в операторе data.
214. Напишите программу вычисления произведения cos5°xcos]00xcosl5°x...xcos850.
215. Напишите программу вычисления суммы


216. Напишите программу, рисующую цепочку соприкасающихся окружностей с заданными в операторе data радиусами (рис. 1.63).

Рис.1.63. Цепочка соприкасающихся окружностей

217. Создайте программу вычисления среднего роста десяти человек, данные о которых занесены в оператор data.
218. Напишите программу вычисления среднего балла при поступлении в институт по результатам четырех экзаменов, которые вводятся с клавиатуры.
219. С помощью Бейсика вычислите среднее геометрическое трех произвольных чисел. Среднее геометрическое есть корень степени N из произведения N чисел.


Оператор DO...LOOP

Оператор do. . .loop чем-то похож на оператор while. . .wend, но возможности его применения несколько шире — проверяемое условие может быть использовано не только в начале оператора, но и в конце.
Поэтому возможны четыре различные формы написания оператора:

первая форма
DO UNTIL условие
тело_цикла LOOP вторая форма
DO WHILE условие
тело_цикла LOOP третья форма
DO
тело_цикла LOOP UNTIL условие четвертая форма
DO
тело цикла
LOOP WHILE условие

Если используется ключевое слово until, цикл будет выполняться, только когда условие имеет значение "ложь".
При указании ключевого слова while цикл будет выполняться до тех пор, пока условие будет иметь значение "истина".
Размещение условий в начале или конце цикла приводит к разным результатам: при проверке условия в конце оператора цикла, конструкции, составляющие его тело, будут исполняться хотя бы один раз, в то время как при проверке условия в начале возможен вариант, что цикл исполняться вообще не будет. Например:

к=о
? "Значение К в начале цикла равно"; К DO WHILE К < 10
К=К+1 LOOP ? "Значение К в конце цикла равно"; К

Кстати, чему же будет равно значение к в конце цикла?
220. Напишите программы — одну с оператором do ... loop while, а другую с do ... loop until, — которые бы выводили на экран расположенные по диагонали экрана круги, закрашенные цветами с 1 по 6 (рис. 1.64). Параметр цикла — номер цвета.

Рис.1.64. Разноцветные круги


Символы и строки

Когда мы говорили о дружественном интерфейсе, то упоминали о так называемых строковых переменных, имена которых отли чаются от обычных добавлением знака $. В таких переменных могут содержаться как отдельные символы, так и их последовательности длиной до 255 символов. К ним в Бейсике применимы специальные операции, о которых мы здесь и расскажем.
Для начала надо немного отвлечься, чтобы сообщить о том, что каждый символ, представленный на клавиатуре для компьютера переводится в числовой код. Эти коды объединены в стандартную международную таблицу кодов ASCII (см. Приложение). Коды с 0 по 32 не имеют изображения на экране и служат для функций управления (пробел, клавиши управления курсором и т. д.). Далее следуют знаки препинания, цифры, строчные и прописные буквы латинского алфавита и другие символы, которые вы можете найти на клавиатуре. Всего их 128. А еще 128 кодов (от 129 до 255) служат для расширения возможностей клавиатуры, например для генерации национальных символов — в нашем случае для кириллицы. Учить их наизусть ни в коем случае не надо — они есть в таблице. Но если ее не окажется под рукой, то вы должны определить код любого символа, используя специальные функции asc и chr$.


Функции ASC и CHRS

Функция asc определит нам код ASCII для первого символа этой строковой переменной и имеет следующую форму записи:

ASC(строковая_переменная)

Например:

N=ASC("F")
? " Код заглавной буквы F —"; N

В результате получим:

Код заглавной буквы F — 70

Еще пример.

Х$="YAHOO"
N=ASC(X$)
?N

В результате получим код первого символа, входящего в слово "YAHOO", т. е. "Y", который равен 89.

Замечание
Следует помнить, что коды заглавных и строчных букв — разные.
Кроме того, если мы напрямую указываем в функции asc символ или текст, то он берется в кавычки (первый пример), а если это строковая переменная, то без кавычек (второй пример).

Функция chr$ определит нам символ, код которого указан в скобках. Форма записи функции:

CHRS(код)

Например:

CLS
1: INPUT "Введите любой код от 33 до 128"; N
IF N < 33 OR N >=128 THEN ? "Обратите внимание на числовые
границы для кода": GOTO 1
? "Символ с кодом "; N; "- это"; CHR$(N)

Обратите внимание на оформление программы. Сначала выполняется очистка экрана. Затем — запрос кода. Если он введен не в требуемых пределах, то программа возвращает человека к запросу — простейший, но очень полезный способ помочь пользователю.
221. Опробуйте представленную выше программу и узнайте, что за символы скрываются под кодами 33, 66, 99, 100, 128.
222. Примените функции asc и chr$ к примеру простейшей шифровки информации, когда символы вводятся побуквенно, а программа определяет их код, добавляет к ним 1 и выводит на экран вместо введенного символа символ с новым получившимся кодом. Слово для тестовой проверки такой программы — "CAT", после его побуквенного введения должно получиться "DBU".
223. Напишите программу-дешифратор для предыдущего задания. Тестовая проверка: из слова "DBU" должно получиться слово "CAT".
Эти программы грамотно работают для первых стандартизированных 128 кодов. Чтобы правильно работать, например, с русским текстом, надо знать коды строчных и прописных букв кириллицы, которые скрываются в интервале от 129 до 255. Поэтому еще одно задание.
224. Напишите программу, выводящую на экран символы, скрывающиеся за кодами 129—255. Распечатайте или выпишите коды строчных и прописных букв кириллицы.
Но, всякий раз вводить текст побуквенно — большая морока. Нельзя ли как-нибудь в Бейсике обрабатывать слова и строки? Конечно, можно. Для этого существуют специальные функции.


Функция INPUTS

Эта функция ожидает ввода N символов, которые и будут обрабатываться программой сразу после их набора на клавиатуре, не дожидаясь нажатия клавиши <Enter>. В этом заключается принципиальное отличие функции от оператора input.
Например:

CLS
N$=INPUT$ (2)
IF Ы$="да" THEN ?N$ ELSE ?"нет"

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


Функция LEN

Следующая функция — len. Она определяет длину введенной или существующей в переменной строковой переменной в символах. Синтаксис:
LEN(строковая_переменная)
Например,

CLS
INPUT "Введите Вашу фамилию"; F$
N=LEN(F$)
? "В вашей фамилии "; N; "букв"

Представленная программа выясняет количество букв во введенной пользователем фамилии. Причем, обратите внимание, что функция len учитывает не только буквы, но и символы, т. е.
она распознает и пробелы, и знаки препинания, и цифры, содержащиеся во введенном тексте. Например:

CLS
INPUT "Введите Ваш адрес"; F$
N=LEN(F$)
? "В вашем адресе "; N; "символов"

225. Определите с помощью предыдущего примера, сколько символов будет в следующем адресе:
197110, Россия, Санкт-Петербург, Чкаловский пр., 78-33


Функции LEFTS, RIGHTS и MID$

Для получения фрагмента строки (или значения строковой переменной) применяются специальные функции.
Функция left$ выделяет из введенной строковой переменной n символов слева:
LEFT$(строковая_переменная, N)
Рассмотрим пример.

CLS
F$="ГАЗОНОКОСИЛЬВДК"
L$=LEFT$(F$, 5)
? L$

На экране появится слово "ГАЗОН", т. е. первые пять символов слева исходной строковой переменной.
Функция right$ вырезает из введенной строковой переменной N символов справа:
RIGHTS(строковая_переменная, N)
Например:

CLS
F$='TA30H0K0CIOTbII]HK" R$=RIGHT$(F$, 9)
? R$

На экране появится слово "КОСИЛЫЦИК", т. е. первые девять символов справа исходной строковой переменной.
Наконец, функция mid$ извлекает N2 символов, начиная с ni исходной строковой переменной:
MID$(строковая_переменная, N1, N2)
Например,

CLS
F$="ГА30Н0К0СИЛЫЦИК" M$=MID$(F$, 7, 4) ? М$

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

CLS
F$="ГАЗОНОКОСИЛЬЩИК"
W1$=MID$(F$, 4, 2)+RIGHT$(F$, 7)
W2$=MID$(F$, 4, 2)+LEFT$(F$, 2)
W3$=MID$(F$, 9, 1)+MID$(F$, 7, 2)+MID$(F$, 11, 2) +MID$ (F$, 7,2)
? Wl$
? W2$
? W3$

Выполните упражнения.
226. Определите, какие слова получатся в результате выполнения приведенной выше программы?
227. Напишите программу, которая выдаст на экран пять слов максимальной длины из слова "ЭЛЕКТРИЧЕСТВО". Побеждает тот, у кого сумма букв во всех словах наибольшая.
В качестве очередного примера приведем задачу подсчета слов во введенном тексте. Как известно, для компьютера словом является последовательность символов, заключенная в пробелы с двух сторон. Подчеркиваю, это не обязательно слово, в привычном для нас понимании, а любой набор символов, например, 45ро9) или ВАР56+УР47. Поэтому, в простейшем случае, подсчет количества слов во введенном тексте сводится к подсчету количества пробелов и добавлении к полученному значению единицы. (Почему так? Очень просто: слов два, а пробел между ними один; слов три — а пробелов два и т. д.) Получаем программу.

CLS
INPUT "Введите текст телеграммы"; W$
N=LEN(W$) : K=0
FOR 1=1 ТО N
P$=MID$(W$, I, 1)
IF P$=" " THEN K=K+1 NEXT I ? "В вашей телеграмме — "; K+l; "слов"

Программа работает очень просто. Она определяет длину текста в символах и заносит это число в переменную N. Затем устанавливает счетчику пробелов к нулевое значение. После чего, в цикле вырезает из текста последовательно по одному символу и проверяет, а не является ли он пробелом. Если это так, то увеличивает счетчик пробелов к на .единицу, а если нет — берет следующий символ. По завершении цикла в переменной к хранится количество пробелов в тексте, и мы выводим ответ о количестве слов на экран, добавляя к к еще единичку.
228. Используя пример с подсчетом слов в телеграмме, напишите программу, имитирующую отделение связи с очень хорошим обслуживанием. Программа должна выяснять имя клиента и в дальнейшем обращаться к нему только по имени. Запрашивается также регион, куда посылается телеграмма. Их три — Россия (коэффициент 1), страны СНГ (стоимость одного слова умножается на 2) и дальнее зарубежье (стоимость одного слова умножается на 5). По России стоимость одного слова составляет 1 руб. 50 коп. (причем неважно, какой длины слово). Затем у клиента запрашивается текст телеграммы и денежная сумма, определяется количество слов, стоимость телеграммы. Если денег ровно столько, сколько надо, его благодарят и прощаются. Если больше, чем надо, то ему предлагают сдачу и прощаются. Если — меньше, то просят добавить необходимую сумму, а затем, после расчета, с клиентом прощаются. А для пущей красо-
ты я обычно прошу нарисовать окошко телеграфа, в прорезях которого и происходит диалог компьютера с пользователем (рис. 1.65).

Рис.1.65. Телеграф


Сравнение строковых переменных

Над строковыми переменными тоже можно производить операции сравнения. Больше будет та переменная, которая начинается с символов, более близких к концу алфавита, т. е. имеющих больший код, а если символы совпадают, то более длинное слово. Строковые переменные считаются идентичными, если они полностью тождественны. Если они отличаются пробелами в начале или конце, то они уже не идентичны!
Например,

"DOG" > "CAT", но "ELEFANT" < "MOUSE" "TIGER2" > "TIGER1" "Ml 6 " > "Ml6"

229. Напишите программу, проверяющую, является ли введенное слово или фраза палиндромом, т. е. читающемся слева направо и справа налево одинаково (например, шалаш, казак, А роза упала на лапу Азора). Программа сообщает "Да, это палиндром", или "Нет, это не палиндром" и выводит на экран введенный текст в варианте слева направо и справа налево. Здесь необходим цикл посимвольного чтения от N (длины текста) до 1.
230. Напишите программу, подсчитывающую количество слогов во введенном слове.
231. В операторе data перечислены 10 слов. Напишите программу, которая:

напечатает все слова из списка, отличные от слова "SUN"; напечатает слово, ближайшее к началу алфавита в списке (считаем, что все слова различны; выполнять аналогично поиску минимального из ряда чисел); слово, составленное из последних символов всех слов списка; все слова из списка, содержащие три буквы.

232. В тексте, содержащем между словами от 1 до 3 пробелов, оставить только по одному.
233. Подсчитать, сколько раз входит каждый символ в данную строку.
234. Написать программу шифратор и дешифратор, ставящую в соответствие русским символам соответствующие латинские и наоборот (аналог так называемого конвертора).


Преобразование строчных и прописных букв

Если ваш текст напечатан строчными буквами, вы хотите заменить его прописными или наоборот, не надо заново его набирать. Для этого есть две функции:

? ucase$ (строковая_переменная) — преобразует все буквы строки в прописные.
? lcase$ (строковая_переменная) — преобразует все буквы стро-ки в строчные.

К сожалению, эти функции применимы только к латинскому алфавиту.
Пример:

CLS
N$="1 have 5"
R$=" рублей"
? N$;R$
N1$=UCASE$(N$)
R1$=UCASE$(R$)
? N1$, Rl$

Результатом работы программы будет следующее:

I have 5 рублей I HAVE 5 рублей

Функции эти очень полезны, когда мы просим пользователя ввести один из возможных ответов, например "YES" или "NO", или просто "Y" или "N", а пользователь, естественно, может ввести ответ как строчными, так и прописными буквами. В таком случае, с помощью функций ucase$ или lcase$ сначала надо привести ответ к требуемому виду, а потом проверять условие. Например:

INPUT "Будете еще играть? (Y/N); N$ IF UCASE$(N$)="N" THEN ?"До свидания"


Функция определения вхождения подстроки

Допустим, мы хотим найти в тексте какое-либо слово. Нам на помощь приходит функция instr, имеющая следующий синтаксис:

INSTR(N, F$, R$)

где n — позиция, с которой вы хотите начинать поиск (необязательный параметр), f$ — строковая переменная, в которой будет производиться поиск, r$ — подстрока, поиск которой осуществляется. В случае отсутствия этой позиции поиск начнется с первого символа строковой переменной. Функция instr укажет нам номер позиции, с которой начинается вхождение искомой подстроки, или 0 в следующих случаях:
П подстрока не найдена;
? значение N больше длины исходной строковой переменной;
? длина строковой переменной нулевая.
Если подстрока пустая, то результатом будет n, а при его отсутствии — 1. Поиск прекращается с первым нахождением подстроки. Например:

CLS
Р$="Свиноводство, овцеводство, пчеловодство"
Р$="чело"
N=INSTR (F$, R$)
IF N о О THEN ? "Слово 'чело' в исходной строке есть и начинается с"; N; "позиции"

Результатом выполнения программы будет фраза:
Слово 'чело' в исходной строке есть и начинается с 29 позиции
235. Заменить в исходном тексте "photo, graph, philophon, cophe" все сочетания "ph" на символ "Г.


Функция INKEY$

Вернемся еще раз к организации пауз и задержек в вашей программе. Мы уже делали это с помощью пустого оператора цикла, с помощью оператора sleep. Есть еще одна полезная функция inkey$, которая ожидает нажатия определенной клавиши, анализирует поступающую информацию об уже нажатых клавишах, и, в зависимости от результатов анализа, программа следует по тому или иному пути. Например:

CLS
? "Нажмите любую клавишу для продолжения..."
WHILE INKEY$=""
WEND
? "Продолжение..."
Можно задать и определенную клавишу для продолжения выполнения программы:
CLS
? "Нажмите клавишу ESC для продолжения..."
WHILE INKEY$OCHR$ (27)
WEND

Замечание
Функция inkey$ работает только вместе с условным оператором.