УРОК 9. Построение графика функции
Ранее
мы уже рассмотрели операторы цикла при работе в текстовом режиме,
теперь используем их для построения графиков функций. Существуют
программы, в которых выполняются одни и те же действия, например,
выводятся графики, в которых для каждого значения аргумента нужно
вычислять значение функции. Приведем пример.
CLS
FOR i1 = 0 TO 1 STEP .1 ' цикл
PRINT i1, SIN(i1)
NEXT i1
В
данном примере производится вычисление значений функции синуса для
разных аргументов, которые принимают значение от 0 до 1 с шагом .1 (STEP),
то есть аргумент принимает значения: 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6,
0.7, 0.8, 0.9 и 1.0. В силу неточности вычислений, переменная i1
для последних значений аргумент будет принимать значение не 0.8, а
0.8000001. Можно выбрать переменную двойной точности, тогда результат
вычислений будет точнее, но для наших целей одинарной точности
достаточно.
В тексте программы операторы внутри цикла (в данном случае оператор PRINT)
сдвинут на два пробела вправо для того, чтобы выделить его для более
легкого чтения текста. Компилятор при переводе данных инструкций в
машинный язык будет их игнорировать. Теперь выведем график синуса на
экран.
SCREEN 9
CLS
LINE (0, 100) - (360, 100) ' ось Х
LINE (0, 0) - (0, 200) ' ось У
FOR i1% = 0 TO 360 ' цикл для графика
PSET (i1%, SIN(i1% * 3.141593 / 180) * 50 + 100)
NEXT i1%
Рассмотрим
данный пример подробнее. Первый оператор, как обычно, устанавливает вид
экрана, второй его очищает. Далее находятся два оператора, которые
выводят на экран оси координат, третий - ось Х, четвертый - ось У.
Почему данные линии не устанавливаются на ноль? Очень просто, ведь
экран содержит точки (пикселы) по оси Х от 0 до 639, а по оси У - от 0
до 349. Поэтому, если примем за начало координат точку с координатами
(0,0), на экран не будут выведены отрицательные значения. Поэтому
начало координат будет на экране в точке (0,100), то есть со сдвигом по
оси У на сто пикселов.
Далее находится цикл для вычисления значений функции. Оператор FOR проводит цикл для переменной i1%, которая принимает значение в градусах от 0 до 360 с шагом 1 градус. Если ключевое слово STEP не указано, то шаг принимается равным единице.
Ниже находится оператор PSET, устанавливающий точку на экране и имеет два аргумента: один по оси Х (i1%), другой по оси У («SIN(i1% * 3.141593 / 180) * 50 + 100»).
Во втором аргументе вначале вычисляется значение синуса, причем
аргумент синуса переводится из градусов в радианы, умножается на 50,
который является множителем, чтобы значения функции находились в
пределах от -50 до 50. Затем прибавляется значение 100 для того, чтобы
диапазон изменения стал от 0 до 100, так как отрицательные значения на
экран не выводятся.
Можно создать разные графики. Для примера приведем исходный текст программы, которая выводит функцию у=1/х.
SCREEN 9
CLS
WINDOW (-10, -10)-(10, 10)
LINE (-9, 0)-(9, 0) ' ось Х
LINE (0, -9)-(0, 9) ' ось У
FOR i1# = -8.0025 TO 8.0025 STEP .005
PSET (i1#, 1 / i1#)
NEXT i1#
В данном примере введен оператор WINDOW,
который переводит координаты окна на дисплее от (0,0)-(349,639) в
координаты (-10,-10)-(10,10), что очень удобно, так как в дальнейшем не
нужно пересчитывать координаты на экране. Цикл по переменной i1# проводится
не от значения 8, а с 8.0025, так как иначе в цикле будет деление на
ноль, а этот диапазон и шаг позволяют его миновать.
Для графиков можно устанавливать линии разметки и символы, например название осей. Так, строчка LOCATE 12, 5: PRINT "ось Х"
позволяет установить курсор на 12 строчке, 5 столбец экрана (в
текстовом режиме) и там вывести название. Трудность состоит в том, что
нужно вычислять координаты, где будет находиться курсор. Имея в виду,
что на экране расположены 24 строчки и 80 столбцов и зная текущую
разметку экрана можно оценить, где будет находиться текст. В данном
примере 12 строчка означает позицию чуть выше, чем ось, а 5 столбец
позволяет отступить от левой границы экрана на 5 позиций (см. рис. 6).
Операторы, которые приведены ниже, позволяют нарисовать координатную сетку.
FOR i1 = -8 TO 8: LINE (-8, i1)-(8, i1): NEXT i1
FOR i1 = -8 TO 8: LINE (i1, -8)-(i1, 8): NEXT i1
Отметим, что для красоты графика можно добавить стрелки для осей координат следующими операторами.
LINE (8.7, .3)-(9, 0)
LINE (8.7, -.3)-(9, 0)
LINE (.2, 8.7)-(0, 9)
LINE (-.2, 8.7)-(0, 9)
По
горизонтали был взята координата 0.3, а по вертикали 0.2, так как по
горизонтали больше точек при одном измерении (650/20=32.5, 350/20=17.5).
Существуют вложенные циклы, то есть цикл, вложенный в другой цикл. Рассмотрим это на примере.
SCREEN 9
CLS
FOR i1% = 1 TO 7
LINE (10, 20 * i1%)-(30 + 5 * i1%, 20 * (i1% + 1)), , B
i3% = (20 + 5 * i1%) / 6
FOR i2% = 1 TO 5
LINE (10 + i3% * i2%, 20 * i1%)-(13 + i3% * i2%, 20 * (i1% + 1))
NEXT i2%
NEXT i1%
Данная программа рисует ступеньки и проводит их штриховку. Четвертый оператор выводит прямоугольники. Далее в переменную i3%
заносится шаг, с которым будет проводиться штриховка. Он равен длине
прямоугольника, деленную на количество интервалов (6). Потом находится
цикл для штриховки, в которой переменная i2% определяет номер штриховой линии.
Операторы
внутри второго цикла также сдвинуты относительно других операторов.
Может быть и третий цикл, четвертый и операторы внутри каждого цикла
также лучше сдвигать вправо для лучшего чтения программы. Эти принципы
заложены в теории структурного программирования, согласно которым
программа должна быть легко прочитана.
Отметим, что в операторе цикла при неправильном указании параметров можно не выполнить нужные действия. Например, оператор «FOR i1% = 0 TO -1» имеет по умолчанию шаг 1, а значения переменной i1%
, будут 0, 1, 2, 3, … и так далее и не достигнут -1. Поэтому программа
не будет выполняться. В других языках программирования данный пример
может дать выполнение бесконечного цикла.
Задачи.
1. Какие значения принимает переменная i1% в следующих операторах:
а) FOR i1% = 0 TO 1 б) FOR i1% = -2 TO 0 в) FOR i1% = 0 TO 10 STEP 2 г) FOR i1% = 3 TO 13 STEP 3 д) FOR i1% = 10 TO 1 STEP -1
2. Написать программу, которая выводит на экран несколько а) окружностей б) линий в цикле.
3. Нарисуйте на экране фасад Вашей школы и дома, в котором проживаете.
|