"600 Секунд"
Рисунок 1.43. "600 секунд"
177. Видоизмените (весьма, надо сказать незначительно, легким движением руки) предыдущую программу, чтобы она заполняла экран сотней цветных прямоугольников случайных размеров (Рисунок 1.44). Постарайтесь, чтобы на черном фоне не получались черные прямоугольники.
178. Теперь настал черед заполнить экран полусотней окружностей. Закраска пусть будет разноцветная, а контур окружностей только белый (Рисунок 1.45).
179. Давайте устроим в центре экрана маленький взрыв. Он будет изображен сотней отрезков разноцветных прямых, сходящихся в точке Х=320, Y=175. Длина их пусть лежит случайным образом в пределах от 50 до 100 экранных точек (Рисунок 1.46).
Алгоритмы
Алгоритмы
Все, что бы мы ни делали, будь то на компьютере, или в жизни, чаще всего преследует какую-либо цель. И не всегда эта цель достигается. Но если мы как следует сформулируем для себя же лаемый результат, потом продумаем четкий план его достижения, то, по крайней мере, на компьютере цель будет достигнута (в жизни, к сожалению, не все так однозначно).
Так вот, четкая, ясная и однозначная последовательность действий, приводящая к достижению результата, называется алгоритмом.
Примеры алгоритмов из жизни — это и правила перехода улицы, рецепт пирога, инструкция по изготовлению ядерной бомбы в домашних условиях и т. д.
Сразу попробуйте подумать и ответить, что из перечисленного ниже является алгоритмом, а что нет
Безусловный переход
Безусловный переход
Безусловный переход оператором 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.
Буква F, католический костел, яхта, знаки "Не курить" и "Любовь", мороженое
Рисунок 1.28. Буква F, католический костел, яхта, знаки "Не курить" и "Любовь", мороженое
106. Так как программированием чаще занимаются представители сильного пола, а среди них, как известно, бывает довольно много любителей футбола, то предлагаю изобразить эмблему своей любимой команды. У меня это, конечно же, "Зенит"! Вот, кстати, как выглядит их эмблема (Рисунок 1.29). . Сложно? Конечно, да! Но ведь ради любимой команды можно и постараться!
107. В качестве самостоятельного задания придумайте себе сами эмблему и нарисуй ее.
Буратино
Рисунок 1.42. Буратино
154. Когда мы изучали операторы data и read, to мы говорили, что используем их при изучении оператора цикла. Этот час пробил. Задав в операторе data координаты всех точек концов отрезков, из которых состоит Рисунок 1.42, напишите программу, рисующую Буратино при помощи оператора цикла.
Совет
При рисовании непрерывной ломаной линии применяется сокращенная форма оператора line, а именно: line -(х, Y), с. То есть линия будет рисоваться от последней графической точки на экране до точки с координатами X, у. Поэтому при выполнении предыдущего задания рекомендуется поставить первую точку оператором pset, а затем в цикле считывать поочередно координаты следующих точек и рисовать отрезки при помощи сокращенной формы оператора line.
CD-MAN, глядящий на запад
Рисунок 1.22. CD-MAN, глядящий на запад
Цепочка соприкасающихся окружностей
Рисунок 1.63. Цепочка соприкасающихся окружностей
217. Создайте программу вычисления среднего роста десяти человек, данные о которых занесены в оператор data.
218. Напишите программу вычисления среднего балла при поступлении в институт по результатам четырех экзаменов, которые вводятся с клавиатуры.
219. С помощью Бейсика вычислите среднее геометрическое трех произвольных чисел. Среднее геометрическое есть корень степени N из произведения N чисел.
Циклический алгоритм
Циклический алгоритм
В тех случаях, когда нам необходимо выполнить одинаковые действия, в которых изменяется только какая-либо величина (так называемый параметр), то мы применяем операторы цикла. Это дает мощный толчок программированию, позволяя выполнять очень сложные алгоритмы.
Циклы с несколькими зависимыми параметрами
Циклы с несколькими зависимыми параметрами
Бывает, что при попытке выполнить задание с помощью оператора цикла выясняется, что изменяется не одна, а две или три величины. В том случае, если вы можете установить между ними зависимости, следует использовать следующие правила:
определить, какие же величины изменяются, и обозначить их буквами; назначить одну из этих величин независимым аргументом; определить закономерности, связующие изменяющиеся величины, и выразить эти величины через независимый аргумент; написать программу с оператором цикла, основным параметром которого будет независимый аргумент, а в командах тела цикла, на месте других изменяющихся величин, необходимо подставить их выражения через этот независимый аргумент.Приведем пример. Предположим, мы хотим построить семейство окружностей, как на Рисунок 1.49. Не правда ли, напоминает рупор?
Два пересекающихся эллипса
Рисунок 1.13. Два пересекающихся эллипса
Елочка
Рисунок 1.31. Елочка
109. Если вам удалось предыдущее задание, то попробуйте вырастить на экране еловый бор из трех одинаковых елочек,
пририсовать к ним траву, солнце, небо, облака — в общем, все, что подскажет вам фантазия.
Фантастический глаз
Рисунок 1.38. Фантастический глаз
Функции ASC и CHRS
Функции 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. Распечатайте или выпишите коды строчных и прописных букв кириллицы.
Но, всякий раз вводить текст побуквенно — большая морока. Нельзя ли как-нибудь в Бейсике обрабатывать слова и строки? Конечно, можно. Для этого существуют специальные функции.
Функции LEFTS, RIGHTS и MID$
Функции 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).
Функция INKEY$
Функция INKEY$
Вернемся еще раз к организации пауз и задержек в вашей программе. Мы уже делали это с помощью пустого оператора цикла, с помощью оператора sleep. Есть еще одна полезная функция inkey$, которая ожидает нажатия определенной клавиши, анализирует поступающую информацию об уже нажатых клавишах, и, в зависимости от результатов анализа, программа следует по тому или иному пути. Например:
CLS
? "Нажмите любую клавишу для продолжения..."
WHILE INKEY$=""
WEND
? "Продолжение..."
Можно задать и определенную клавишу для продолжения выполнения программы:
CLS
? "Нажмите клавишу ESC для продолжения..."
WHILE INKEY$OCHR$ (27)
WEND
Замечание
Функция inkey$ работает только вместе с условным оператором.
Функция INPUTS
Функция INPUTS
Эта функция ожидает ввода N символов, которые и будут обрабатываться программой сразу после их набора на клавиатуре, не дожидаясь нажатия клавиши <Enter>. В этом заключается принципиальное отличие функции от оператора input.
Например:
CLS
N$=INPUT$ (2)
IF Ы$="да" THEN ?N$ ELSE ?"нет"
В данном случае программа после ввода с клавиатуры последовательности символов, анализирует ее, выделяя только два первых символа, и действует в зависимости от проверяемого условия.
Функция LEN
Функция LEN
Следующая функция — len. Она определяет длину введенной или существующей в переменной строковой переменной в символах. Синтаксис:
LEN(строковая_переменная)
Например,
CLS
INPUT "Введите Вашу фамилию"; F$
N=LEN(F$)
? "В вашей фамилии "; N; "букв"
Представленная программа выясняет количество букв во введенной пользователем фамилии. Причем, обратите внимание, что функция len учитывает не только буквы, но и символы, т. е.
она распознает и пробелы, и знаки препинания, и цифры, содержащиеся во введенном тексте. Например:
CLS
INPUT "Введите Ваш адрес"; F$
N=LEN(F$)
? "В вашем адресе "; N; "символов"
225. Определите с помощью предыдущего примера, сколько символов будет в следующем адресе:
197110, Россия, Санкт-Петербург, Чкаловский пр., 78-33
Функция определения вхождения подстроки
Функция определения вхождения подстроки
Допустим, мы хотим найти в тексте какое-либо слово. Нам на помощь приходит функция 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" на символ "Г.
Алгоритмы, графика, символы и строки
Глава 2. Алгоритмы, графика, символы и строки
Алгоритмы Виды алгоритмов Линейный алгоритм Графика в Бейсике Графические примитивы Правила построения сложных изображений Макроязык GML Вывод текстовой информации в графике Разветвляющийся алгоритм Безусловный переход Условный переход Циклический алгоритм Оператор с заранее известным числом повторений Оператор цикла WHILE... WEND Случайные числа Построение графиков функций Циклы с несколькими зависимыми параметрами Вложенные циклы Наращивание переменной Оператор DO...LOOP Символы и строки Функции ASC и CHRS Функция INPUTS Функция LEN Функции LEFTS, RIGHTS и MID$ Сравнение строковых переменных Преобразование строчных и прописных букв Функция определения вхождения подстроки Функция INKEYS
Содержание |
Горизонтальная линия из точек
Рисунок 1.35. Горизонтальная линия из точек
138. Заполните экран горизонтальными линиями (через 10), а затем, с помощью еще одного оператора цикла, вертикаль ными линиями другого цвета (тоже через 10). Должна получиться решетка, как на Рисунок 1.36.
Графические примитивы
Графические примитивы
Ну что ж, начнем с графических примитивов, т. е. элементарных объектов, на которые можно разбить любое сложное изображение.
График функции синуса
Рисунок 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 .
Совет
Попробуйте строить график не точками, а эллипсами, радиус которых... Вот именно!
Графика в Бейсике
Графика в Бейсике
Иногда при изучении этой темы приходится сталкиваться с непониманием учащихся. "А зачем так сложно, если в любом графическом редакторе можно сделать то же самое?" Взгляд автора здесь таков. Да, в графическом редакторе можно нарисовать практически что угодно. Но, зная приемы программирования, создаются быстро такие элементы, на которые в графическом редакторе уйдет очень много времени и не будет возможности многократного повторения и внесения быстрых изменений в рисунок.
Прежде всего, необходимо сказать несколько слов о включении графических режимов. При входе в оболочку Бейсика по умолчанию включается текстовый режим, в котором можно производить вычисления и выводить результаты на экран. Но если мы хотим пользоваться графическими возможностями языка, то должны объяснить это компьютеру посредством включения графического режима командой screen 9. Таких режимов несколько, но автор рекомендует пользоваться девятым режимом, потому что он обладает наибольшей разрешающей способностью и позволяет получать качественные графические объекты. После включения графического режима мы можем давать компьютеру команды рисования графических примитивов.
Замечание
Графический режим включается только один раз.
В режиме screen 9 экран представляет собой координатную сетку с началом в левом верхнем углу, вправо от которого увеличивается координата X, а вниз — координата Y. Максимальное значение X на экране 640, a Y — 350 (Рисунок 1.4).
Храм
Рисунок 1.27. Храм
Эллипс
Эллипс
Очередной примитив — эллипс. Эллипс — это, по сути, окружность, которой слегка дали по "голове" или по "бокам", в результате чего она стала вытянутой по вертикали или горизонтали. И вместо одного радиуса, как у окружности, у эллипса стало два — по осям X и Y.
Частное от деления Ry на Rx дает нам так называемый коэффициент сжатия:
Эллипс, вытянутый по горизонтали
Рисунок 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.26. Корабль в ночи
Куб и пирамида
Рисунок 1.10. Куб и пирамида
Квадрат с окружностями
Рисунок 1.23. Квадрат с окружностями
99. Создайте программу, отображающую месяц в обратную сторону, чем в примере, рассмотренном выше. Закрасьте его красным цветом.
100. С помощью Бейсика нарисуйте закрашенный квадрат (одним оператором) с вписанными в него двумя разноцветными окружностями (Рисунок 1.23).
101. Напишите программу, выводящую на экран петлю гистерезиса, которая состоит из двух отрезков прямых линий и четырех дуг, являющихся четвертями окружности (Рисунок 1.24). Попробуйте сначала нарисовать изображение в масштабе на бумаге, рассчитать все исходные данные. Закрасьте получившееся изображение. (Будьте внимательны при состыковке дуг, зачастую там образуются разрывы.)
Лестница 1
Рисунок 1.53. Лестница 1
Нарисуйте две пирамиды индейцев майя
Рисунок 1.54. Лестница 2
197. Нарисуйте две пирамиды индейцев майя — вид спереди и вид сверху (Рисунок 1.55 и 1.56).
198. Вернитесь к примеру с "рупором" из увеличивающихся окружностей и попробуйте сделать картинку, на которой подобные рупоры выходят из всех четырех углов экрана и встречаются в центре.
Летающая тарелка
Рисунок 1.17. Летающая тарелка
Ну что ж, если все получается, то пора постепенно переходить к более сложным вещам, а именно, к рисованию дуг окружностей и эллипсов. Но прежде следует вспомнить, что в Бейсике используется радианная мера углов (см. "Стандартные функции Бейсика"). Любая дуга имеет угол, от которого она начинается, и угол, где она заканчивается. Чтобы разобраться с этим, сначала я приведу оператор рисования дуг окружностей:
CIRCLE (X, Y) , R, С, а, Ь
где появившиеся две новые величины а и ь и обозначают эти углы. Правило рисования дуг на Бейсике звучит так: "дуга строится от угла а к углу b против часовой стрелки".
Для того чтобы показать это наглядно, лучше всего обратиться к тригонометрической окружности (Рисунок 1.18).
Линейный алгоритм
Линейный алгоритм
Для написания программ с линейным алгоритмом мы уже готовы. Нам известно, как очистить экран и поприветствовать пользователя по имени, запросить у него необходимые данные и решить вычислительные задачи. Попробуем поупражняться. Следите все же за интерфейсом своих программ!
В следующих заданиях вам предлагается написать программы, производящие требуемые вычисления и выдающие на экран результаты.
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 м/с. Какова будет
дальность полета снаряда? (Формулу вспомните из курса физики.)
Нагляднее всего работа с линейными алгоритмами осуществляется в графике, когда мы сразу видим результат своей деятельности. Но для этого нам надо изучить несколько новых операторов.
Макроязык GML
Макроязык GML
Для расширения возможностей машинной графики Бейсика был дополнительно разработан специальный макроязык GML (Graphics Macro Language). Он позволяет строить довольно сложные изображения и быстро выводить их на экран. Каждая команда языка представляет собой латинскую букву, после которой следует один или два числовых параметра (как правило, целых числа). Команды этого языка перечислены в табл. 1.3.
Моделирование бросания игрального кубика
Моделирование бросания игрального кубика
Казалось бы надо пойти по уже проторенному пути первого примера и, раз нам надо получить цифры от 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.
Применим теперь оператор случайных чисел на практике и, как всегда, для наглядности начнем с графики.
Моделирование бросания монеты
Моделирование бросания монеты
Нам необходимо при каждом запуске программы случайным образом получать либо число 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
Применяется оно обычно в Бейсике для работы всевозможных счетчиков, а также для подсчета сумм или произведений рядов чисел. Например, необходимо вычислить сумму всех четных чисел от 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.
Окружность
Окружность
Следующий этап построения — окружность. Все, что нужно знать об окружности для Бейсика — это координаты ее центра и радиус. Оператор выглядит так:
CIRCLE (X, Y) , R, С
где х, y — координаты центра, r — радиус (в экранных точках),
с — цвет.
Например, оператор
CIRCLE (320, 175), 50, 2
изобразит нам зеленую окружность радиусом 50 точек в центре экрана.
Оператор цикла WHILE... WEND
Оператор цикла WHILE... WEND
Этот оператор позволяет сочетать свойства условного оператора и оператора цикла. С их помощью можно выполнять повторяющиеся действия с заранее неизвестным количеством повторений.
Работает он следующим образом. Сначала идет оператор while с условием, при котором цикл выполняется. Ключевое слово wend аналогично по своему назначению слову next, т. е. является последней строкой цикла. Всякий раз, доходя до wend, компьютер проверяет, выполняется ли условие, указанное оператором while. Если оно не выполняется, то программа переходит к исполнению операторов, следующих за wend. Если же выполняется, то цикл повторяется снова. Следующая программа, прежде чем допустить пользователя до продолжения работы, запрашивает у него пароль.
WHILE WORD$О"TERMINATOR"
INPUT "ВВЕДИТЕ ПАРОЛЬ"; WORD$ 'WEND ? "ПРАВИЛЬНО! ВЫ ДОПУЩЕНЫ К ПРОДОЛЖЕНИЮ РАБОТЫ"
Вот как эта программа будет работать после запуска:
ВВЕДИТЕ ПАРОЛЬ? MOON
ВВЕДИТЕ ПАРОЛЬ? ARNOLD
ВВЕДИТЕ ПАРОЛЬ? TERMINATOR
ПРАВИЛЬНО! ВЫ ДОПУЩЕНЫ К ПРОДОЛЖЕНИЮ РАБОТЫ
155. При помощи оператора while...wend вычислите с— наибольший общий делитель введенных с клавиатуры натуральных чисел х и y.
156. Определите, какие из представленных ниже операторов Бейсика написаны правильно, а какие нет. В случаях неправильной записи объясните допущенные ошибки. Все операторы рассматривайте по отдельности, потому что они не являются частями одной программы.
Что будет выведено на экран в результате выполнения следующих программ при указанных исходных данных.
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=i1: ? X
Х=Х+2
IF X <= 13 THEN 1
END
166. Программа:
FOR B=l TO 4D=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 -2IF 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
Оператор DO...LOOP
Оператор 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). Параметр цикла — номер цвета.
Оператор с заранее известным числом повторений
Оператор с заранее известным числом повторений
Когда мы работали с графикой, то в одном из заданий вам предлагалось построить мишень — пять концентрических окружностей. Мы это легко сделали, пять раз написав оператор построения окружности circle, изменяя в нем каждый раз радиус.
Ну а если бы таких окружностей надо было бы 100? Неужели 100 раз писать практически одно и то же? Очень нелегко, даже если пользоваться копированием строк. Неужели нельзя как-нибудь полегче? Конечно можно! Нам на помощь приходит оператор ЦИКЛа FOR. . .NEXT.
Итак, правила пользования оператором цикла for. . .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.40. Орнамент
Правила построения орнаментов:
выявить в орнаменте повторяющийся фрагмент; выделить опорную изменяющуюся величину (параметр), ее начальное, конечное и шаг; дать параметру имя; определить смещение других изменяющихся величин относительно опорной; написать оператор цикла. 152. Напишите программу для рисования орнамента (Рисунок 1.40).
153. Закрепите успех, написав программу для построения греческого орнамента (Рисунок 1.41).
Отрезок и прямоугольник
Отрезок и прямоугольник
Следующий примитив — отрезок прямой линии. Оператор записывается таким образом:
LINE (X1, Y1)-(X2, Y2), С
где XI, yi — координаты начала отрезка; х2, Y2 — координаты конца отрезка; с — как всегда цвет.
Например, мы хотим изобразить отрезок синего цвета на желтом экране с координатами (Рисунок 1.5).
Пешеходный переход "зебра"
Рисунок 1.37. Пешеходный переход "зебра"
139. Нарисуйте пятиконечную звезду, вписанную в окружность, как на Рисунок 1.25. Используйте для рисования и закраски операторы цикла.
140. Постройте пешеходный переход — "зебру", как на Рисунок 1.37.
141. Нарисуйте фантастический глаз, как на Рисунок 1.38.
Петля гистерезиса
Рисунок 1.24. Петля гистерезиса
Построение графиков функций
Построение графиков функций
Строить графики в Бейсике мы будем точками, а задавать компьютеру функцию для построения оператором def fn.
Кроме того, координатная сетка экрана компьютера, как мы должны помнить, является перевернутой по отношению к привычной геометрической. Отсюда и последуют преобразования по приведению координатной сетки к нормальному виду. Я не хочу утомлять читателя длинными математическими выкладками, а призываю поверить на слово. Если же в ком-то проснется любознательность, то разобраться во всем можно самому.
Итак, оператор def fn определяет для компьютера ту функцию, график которой мы хотим построить. Работает он следующим образом:
DEF FN имя_функции{параметр_функции)=функция
Например, определим функцию у = sin x .
DEF FNY(X)=SIN(X)
Здесь y — имя функции, х — ее параметр, a sin (X) — непосредственно сама функция.
Определим функцию
Правила построения сложных изображений
Правила построения сложных изображений
При рисовании придерживайтесь определенных правил, которые перечислены далее.
Обязательно начертите свое изображение на бумаге в масштабе. Разбейте изображение на те самые графические примитивы, каждый из которых вы могли бы нарисовать каким-либо уже изученным оператором. Найдите и выделите на рисунке опорные точки — концы отрезков, начала и концы дуг, центры окружностей, эллипсов, отдельные точки (если они есть). Наметьте точки для оператора закраски paint. Если в изображении есть прямоугольники со сторонами, параллельными экрану, то необходимо выделить координаты их базовых диагоналей, по которым они будут строиться. Определите максимальный размер изображения в экранных точках, исходя из размеров экрана. Определите координаты всех опорных точек, значения радиусов окружностей и эллипсов, коэффициенты сжатия эллипсов, углы всех дуг. Определите последовательность построения и закраски замкнутых контуров. Напишите программу, введите ее, снабжая как можно большим количеством необходимых комментариев (можно сначала на бумаге), и отладьте ее.Преобразование строчных и прописных букв
Преобразование строчных и прописных букв
Если ваш текст напечатан строчными буквами, вы хотите заменить его прописными или наоборот, не надо заново его набирать. Для этого есть две функции:
? 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 ?"До свидания"
Программа "Звездное небо"
Программа "Звездное небо"
Изобразим звездное небо пятьюстами белыми точками на черном фоне. Координаты каждой из точек должны быть в пределах по 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.9. Рамка с конвертом
Рамка рисуется двумя операторами line с bf, конверт — подумайте сами. Координаты тоже выберите сами. Только не рисуйте слишком мелкие объекты.
Разноцветные круги
Рисунок 1.64. Разноцветные круги
Разноцветные окружности
Рисунок 1.45. Разноцветные окружности
Разноцветные прямоугольники
Рисунок 1.44. Разноцветные прямоугольники
Разветвляющийся алгоритм
Разветвляющийся алгоритм
Ну что ж, надеюсь, что с линейными программами особых трудностей у вас не возникло. Пиши команды подряд, хотя, конечно, все сначала надо было продумать, и изображения у нас получались просто великолепные!
Однако надо двигаться вперед. А дальше у нас — разветвляющийся алгоритм. Что это такое, мы уже говорили. Например, витязь на перепутье: "Если налево пойдешь, коня потеряешь, если прямо пойдешь — смерть найдешь", ну и т. д.
А вот как он реализуется на практике в Бейсике, мы поговорим сейчас.
Ветвление в алгоритме и программе осуществляется двумя способами:
Решетка
Рисунок 1.36. Решетка
Рисунок 4. Размеры
Рисунок 4. Размеры и координаты экрана в режиме screen 9
Отрезок прямой линии
Рисунок 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. Прямоугольник со сторонами, параллельными экрану
Так надо делать!
Рисунок 7. Так надо делать!
К сожалению, опыт автора показывает, что многим из вас лень этим заниматься — отсюда пустая трата сил и времени и очень неказистые результаты.
Перейдем к упражнениям.
88. Напишите программу, изображающую на экране четыре точки разного цвета в центре желтого экрана. Точки расположите квадратом на расстоянии друг от друга 5 точек.
89. Напишите программу, выводящую ромб с диагоналями (Рисунок 1.8).
Мишень Рисунок 15. Снеговик
Рисунок 14. Мишень
Снеговик Рисунок 16. Цилиндр
Рисунок 16. Цилиндр
CD-MAN
Рисунок 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).
Закрасьте "туловище" одним цветом, а "глаз" — другим.
Эмблема футбольной команды "Зенит"
Рисунок 29. Эмблема футбольной команды "Зенит"
Основные команды перемещения языка GML
Рисунок 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).
Движение точки по экрану под углом 45°
Рисунок 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 — один или несколько операторов в одной или нескольких строках.
Аргументы списка выражений могут принимать любую из следующих форм или их комбинацию и должны разделяться запятыми:
Здесь выражение — любое числовое или строковое выражение, совместимое С параметром тёст_выражение\ знак_отношения — один из знаков отношения <, <=, >, >=, <> или =.
Рассмотрим пример:
CLS
INPUT "Введите уровень риска (1-5): "; RISK SELECT CASE RISK CASE IS >= 5
PRINT "Максимальный риск, шансов на возвращение
практически нет." PRINT "Пишите завещание." CASE 2 ТО 4
PRINT "Высокий риск, шансов на возвращение немного." PRINT "Проверьте снаряжение, оружие и припасы." CASE 1
PRINT "
Греческий орнамент
Рисунок 41. Греческий орнамент
Орбиты"
Рисунок .50. "Орбиты"
194. Создайте программу, выводящую на экран "труба" — окружности одного радиуса, выходящие из левого верхнего угла экрана и идущие под углом 45° вправо вниз (Рисунок 1.51). Окружности нарисованы одним цветом, а закрашены другим.
Труба" по диагонали
Рисунок 52. "Труба" по диагонали
195. Напишите программу, аналогичную предыдущей, только окружности разместите из левого верхнего угла в правый нижний по диагонали экрана (Рисунок 1.52). Надо использовать соотношения сторон экрана.
196. С помощью Бейсика постройте две лестницы (Рисунок 1.53 и 1.54).
Пирамида: вид спереди
Рисунок 55. Пирамида: вид спереди
Пирамида: вид сверху
Рисунок 56. Пирамида: вид сверху
199. Напишите программу построения "эллипсирующих окружностей" (Рисунок 1.57).
Эллипсирующие окружности"
Рисунок 57. "Эллипсирующие окружности"
Лоскутный ковер
Рисунок 58. Лоскутный ковер
201. Заполните экран светофорными кругами (Рисунок 1.59). Самые большие круги красные, средние — желтые, маленькие — зеленые.
Светофорные круги
Рисунок 59. Светофорные круги
202. Воспользовавшись предыдущим заданием, замените окружности на квадраты — получатся "светофорные" квадраты.
203. Изобразите шахматную доску.
Мы всё работаем с графикой. Это наглядно. Но не будем забывать о том слове, от которого произошел термин "компьютер" — вычислять.
204. Напишите программу, выводящую на экран таблицу умножения от 2 до 10 в следующем виде (Рисунок 1.60).
Таблица умножения
Рисунок 60.
Электронный будильник
Рисунок 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. Вычисление числа я методом Монте-Карло
ок должен быть крупным
Рисунок ок должен быть крупным и наглядным. Это любят преподаватели!
92. Создайте программу, выводящую на одном экране куб и пирамиду (Рисунок 1.10).
Рисунок сутствует, возврат гарантирован."
Рисунок сутствует, возврат гарантирован." 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.
Ромб с диагоналями
Рисунок 1.8. Ромб с диагоналями
Пропущенные координаты определите сами, зная свойства ромба.
90. Создайте программу, рисующую Российский флаг'. Флаг состоит из трех полос, поэтому рисовать их надо, используя
Есть, кстати, мнемоническое правило для запоминания цветов нашего флага — это магическое слово БеСиК — БЕлый, СИний, Красный — и на Бейсик похоже, и не забудешь никогда.
команду line с параметром bf. Здесь главное четко рассчитать координаты диагоналей всех трех прямоугольников.
91. Напишите программу, выводящую рамку с конвертом (Рисунок 1.9).
"Рупор"
Рисунок 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).
Символы и строки
Символы и строки
Когда мы говорили о дружественном интерфейсе, то упоминали о так называемых строковых переменных, имена которых отли чаются от обычных добавлением знака $. В таких переменных могут содержаться как отдельные символы, так и их последовательности длиной до 255 символов. К ним в Бейсике применимы специальные операции, о которых мы здесь и расскажем.
Для начала надо немного отвлечься, чтобы сообщить о том, что каждый символ, представленный на клавиатуре для компьютера переводится в числовой код. Эти коды объединены в стандартную международную таблицу кодов ASCII (см. Приложение). Коды с 0 по 32 не имеют изображения на экране и служат для функций управления (пробел, клавиши управления курсором и т. д.). Далее следуют знаки препинания, цифры, строчные и прописные буквы латинского алфавита и другие символы, которые вы можете найти на клавиатуре. Всего их 128. А еще 128 кодов (от 129 до 255) служат для расширения возможностей клавиатуры, например для генерации национальных символов — в нашем случае для кириллицы. Учить их наизусть ни в коем случае не надо — они есть в таблице. Но если ее не окажется под рукой, то вы должны определить код любого символа, используя специальные функции asc и chr$.
Случайные числа
Случайные числа
В процессе изучения циклических алгоритмов уместно рассказать о генерации случайных чисел программным путем. При кажущейся простоте получить случайные числа не так легко. Попробуйте продиктовать своему другу 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. Каждый раз при запуске программы мы будем видеть новое значение.
Но часто встает проблема получения случайных чисел в заданном диапазоне. Как это сделать, мы рассмотрим на примерах.
Сравнение строковых переменных
Сравнение строковых переменных
Над строковыми переменными тоже можно производить операции сравнения. Больше будет та переменная, которая начинается с символов, более близких к концу алфавита, т. е. имеющих больший код, а если символы совпадают, то более длинное слово. Строковые переменные считаются идентичными, если они полностью тождественны. Если они отличаются пробелами в начале или конце, то они уже не идентичны!
Например,
"DOG" > "CAT", но "ELEFANT" < "MOUSE" "TIGER2" > "TIGER1" "Ml 6 " > "Ml6"
229. Напишите программу, проверяющую, является ли введенное слово или фраза палиндромом, т. е. читающемся слева направо и справа налево одинаково (например, шалаш, казак, А роза упала на лапу Азора). Программа сообщает "Да, это палиндром", или "Нет, это не палиндром" и выводит на экран введенный текст в варианте слева направо и справа налево. Здесь необходим цикл посимвольного чтения от N (длины текста) до 1.
230. Напишите программу, подсчитывающую количество слогов во введенном слове.
231. В операторе data перечислены 10 слов. Напишите программу, которая:
232. В тексте, содержащем между словами от 1 до 3 пробелов, оставить только по одному.
233. Подсчитать, сколько раз входит каждый символ в данную строку.
234. Написать программу шифратор и дешифратор, ставящую в соответствие русским символам соответствующие латинские и наоборот (аналог так называемого конвертора).
Команды языка GML
Таблица 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.
Таблица умножения Прежде чем выдать
? "Поспите 10 сек."
SLEEP 10
? "Подъем! Учитель пришел!"
Если значение секунд указано 0 или не указано вовсе, то программа будет ожидать нажатия любой клавиши, например:
? "Прочитайте внимательно нижеследующее слово и нажмите
любую клавишу, когда надоест..." ? "Вы — просто гений!" SLEEP ? "Но от скромности вы не умрете..."
205. Итак, используя полученные знания про вложенные циклы и оператор sleep, напишите программу, которая в центре чистого экрана будет выводить показания хронометра — часы, минуты и секунды, разделенные двоеточием, начиная с 0 час. 0 мин. 0 с. Отрегулируйте свой хронометр, чтобы он шел правильно.
206. Усложним предыдущее задание. Нарисуем будильник, сделаем в нем два поля. В одно выведем текущую дату, а во второе — наш уже получившийся хронометр. Если очень захочется, то можно сделать из него будильник, добавив в нужный момент оператор веер, который производит отрывистый не совсем приятный звук (Рисунок 1.61).
Телеграф
Рисунок 1.65. Телеграф
Точка
Точка
Первый из графических примитивов — точка. Для изображения точки используется оператор pset со следующим синтаксисом:
PSET(X, Y) , С
где х и y — координаты точки на экране, а с — ее цвет. Если цвет не указан, то точка будет изображена последним установленным цветом (это касается и всех прочих графических примитивов).
Рассмотрим пример.
SCREEN 9
PSET(320, 175),4
На черном экране в этом случае появится красная точка в центре.
Сразу же хочется заметить, что из эстетических соображений лучше менять цвет фона, потому что черный экран выглядит мрачно. Например:
SCREEN 9
color, 1
PSET (320,175) ,4
Теперь та же точка будет в центре синего экрана, уже лучше!
Тригонометрическая окружность
Рисунок 1.18. Тригонометрическая окружность
Взглянув на тригонометрическую окружность, мы всегда довольно легко сможем определить начало и конец нужных нам
дуг. Более того, Бейсик позволяет использовать в качестве операндов в своих командах арифметические выражения. Поэтому, например, если вы знаете угол начала дуги — 30°, но затрудняетесь определить его на тригонометрической окружности, то можете в соответствующем месте оператора дуги написать
3.14*30/180
и пусть компьютер сам считает.
Приведем несколько простых примеров.
Построим верхнюю половину окружности синего цвета с радиусом 30 (Рисунок 1.19), у которой центр находится в точке 150, 100.
"Труба" под углом 45°
Рисунок 1.51. "Труба" под углом 45°
Условный переход
Условный переход
Мало того, что условный переход подразумевает выполнение тех или иных команд в зависимости от проверяемого условия, так Бейсик предоставляет нам еще и несколько вариантов действий.
Начнем с классической конструкции:
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. Напишите программы, которые в зависимости от введенного числа либо вычисляют функцию, либо выдают сообщение, что функция не определена:
Верхняя половина окружности
Рисунок 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
Виды алгоритмов
Виды алгоритмов
Алгоритмы бывают трех основных видов, которые являются базовыми при написании программ.
Первый тип — линейный алгоритм. В нем все действия выполняются в строгом порядке, последовательно, одно за другим. Типичный жизненный пример такого алгоритма — рецепт пирога.
Второй тип — разветвляющийся алгоритм. Здесь те или иные действия выполняются в зависимости от выполнения или невыполнения некоего условия. Пример из жизни — правило перехода улицы по светофору. Если горит красный — стоим, если горит зеленый — идем.
Наконец, третий тип — циклический алгоритм. Он содержит повторяющиеся действия с какой-либо изменяющейся величиной, так называемым параметром. По циклическому алгоритму можно колоть дрова. Берем полено, ставим на попа, колем топором, берем второе полено и т. д., пока поленья не закончатся, и эта работа нам не надоест.
Вложенные циклы
Вложенные циклы
В предыдущем разделе мы рассмотрели случаи, когда в цикле изменяются несколько величин, но их можно выразить друг через друга. Сейчас нам надо рассмотреть ситуации, когда изменяются несколько независимых величин.
Приведем пример. Напишем программу заполнения экрана точками с расстоянием между ними по горизонтали и вертикали 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).
Вывод текстовой информации в графике
Вывод текстовой информации в графике
Часто хочется сопроводить свои рисунки подписями. Не сдерживайте свои желания. Делайте это просто — с помощью операторов locate и print, как мы это уже многократно делали.
Взрыв
Рисунок 1.46. Взрыв
Взрыв сверхновой
Рисунок 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.25. Звезда
102. Выведите на экран пятиконечную звезду, вписанную в окружность и закрашенную как на Рисунок 1.25.
103. Нарисуйте корабль в ночном море под российским флагом (Рисунок 1.26).
Это задание уже представляет собой достаточно сложное изображение. Попробуйте выполнить его так, как вы считаете нужным, а мы хотим изучить, как это нужно делать.