Программа нахождения корня методом касательных

INPUT e,x‘ввод погрешности и начального значения Х

INPUT a,b,c,d‘ввод коэффициентов уравнения

DO‘цикл итераций

y=a*x^3+b*x^2+c*x+d‘вычисление функции

py=3*a*x^2+2*b*x+c‘вычисление производной

x1=x‘запоминание старого корня

x=x–y/py‘вычисление нового корня

‘если фактическая погрешность больше допустимой,

LOOP WHILE ABS(x1–x)>e ‘цикл повторяется

PRINT “Корень равен =” x‘печать значения корня

Здесь: Y – текущее значение функции, PY – текущее значение производной, X1 – предыдущее значение корня, X – последнее значение корня.

2.9. ВЫЯВЛЕНИЕ НАЖАТИЯ КЛАВИШ

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

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

üINKEY$

Функция возвращает одно- или двухбайтную строку, содержащую символ, считанный с клавиатуры. Если символ не был считан, возвращается нулевая строка. Однобайтовая строка содержит ASCII-символ. Двухбайтная строка содержит расширенный код: первый символ содержит 0, второй – расширен­ный код специальной клавиши или клавиши управления курсором. Эти коды приведены в приложении.

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

DO

a$ = INKEY$

LOOP WHILE a$ = ""

Здесь цикл DO повторяется до тех пор, пока переменная a$ остается пустой (a$ =пустые кавычки). Внутри цикла этой переменной функцией INKEY$ каждый раз присваивается значение нажатой клавиши. Как только будет нажа­та любая клавиша – цикл завершится. Далее будет можно анализировать пере­менную a$ с целью выяснения того, какая же именно клавиша была нажата.

Ниже приведена программа, выводящая ASCII-коды всех нажатых клавиш (как буквенно-цифровых, так и управляющих). Для выяснения того, к какой их этих двух групп относится данная клавиши, ее код сначала анализируется на длину. Если длина 1, значит клавиша обычная, если – 2, то управляющая. В последнем случае выводится только код второго символа из a$, т.е. ASC(RIGHT$(a$, 1)). Справа от программы изображены результаты ее работы при нажатии клавиш q, w, ц, у, ­, ®, ¯.

PRINT "Символ Код" DO DO‘цикл ожидания нажатия a$ = INKEY$‘символ клавиши LOOP WHILE a$ = "" IF LEN(a$) = 1 THEN‘если длина кода – 1 ‘печать символа на клавише и ее кода PRINT a$; TAB(9); ASC(a$) ELSE‘если длина кода – 2 ‘печать кода управляющей клавиши PRINT TAB(9); ASC(RIGHT$(a$, 1)) END IF LOOP     Символ Код q 113 w 119 ц 230 у 227

Оператор

üON KEY (код_клавиши) GOSUB метка

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

1-10,30,31 – функциональные клавиши F1-F10 и F11, F12,

11,12,13,14 – клавиши ­ ®¯.

Этот оператор в форме

üON KEY (код_клавиши) ON/OFF

включает/отключает действие, назначенное клавише оператором вида ON KEY (...) GOSUB.

Состояние задержки на заданное число секунд для просмотра большого объема данных на экране и/или для восприятия какого-либо события можно организовать оператором

üSLEEP [число_секунд_задержки]

Пауза может быть прекращена нажатием любой клавиши. Если параметр число секунд отсутствует, ожидание будет бесконечным. Например, в следую­щем фрагменте программы производится предъявление элементов массива А “порциями” по 20 элементов. Пауза позволяет просмотреть выведенные дан­ные. Если пользователь хочет прервать процесс, он может нажать клавишу F10.

CLS

ON KEY(10) GOSUB m:

KEY(10) ON

DIM a(100)

. . .

FOR i = 1 TO 100

IF i MOD 20 = 0 THEN SLEEP ELSE PRINT a(i)

NEXT

m: PRINT "Конец просмотра"

KEY(10) STOP

2.10. РАБОТА С ГРАФИКОЙ

В Бейсике имеются средства создания графических образов. Вывод изобра­жений на экран в графическом режиме осуществляется в отдельные точки экра­на – пиксели. Число таких точек и возможность их раскраски определяются техническими средствами компьютера. В соответствии с этим назначается определенный доступный графический режим его работы. Начало координат располагается в левом верхнем углу экрана. Отсчет пикселей начинается с нуля. Для цветных мониторов обычно одновременно доступны 16 цветов, которые обозначаются числами:

0 черный 1 голубой 2 зеленый 3 бирюзовый 4 красный 5 розовый 6 коричневый 7 белый 8 серый 9 ярко-голубой 10 ярко-зеленый 11 ярко-бирюзовый 12 ярко-красный 13 ярко-розовый 14 желтый 15 ярко-белый

¶УСТАНОВЛЕНИЕ ГРАФИЧЕСКОГО РЕЖИМА ЭКРАНА

осуществляется оператором

üSCREEN режим

Здесь режим – номер экранного режима. В настоящее время широко используются графические адаптеры SVGA, для которых обычен режим номер 12 с разрешением 640 точек по горизонтали и 480 точек по вертикали, т.е. возможна адресация по оси Y от 0 до 479, по оси Х от 0 до 639. В дальнейшем мы будем использовать оператор выбора графического режима в форме SCREEN 12.

Непосредственно после оператора SCREEN графический курсор устанавли­вается в центр экрана – в нашем случае в точку 320,240. Аналогичный результат получается после применения оператора CLS.

¶ОПЕРАТОРЫ ВЫВОДА ГРАФИЧЕСКИХ ПРИМИТИВ

Оператор

üPSET/PRESET [STEP] (x,y) [,цвет]

рисует точку на экране в позиции X,Y указанным цветом. Если задан параметр STEP, координаты берутся как смещение относительно текущего положения графического курсора, иначе – они интерпретируются как абсолютные коор­динаты. Если цвет не указан, оператор PSET, использует текущий основной цвет. PRESET работает также, но если цвет не указан, то используется цвет фона (удобно для стирания уже выведенных точек). Если координаты точки находятся вне экрана, то никаких действий не производится и сообщений об ошибке не выдается.

Оператор

üCIRCLE [STEP] (x,y), радиус [, цвет]

рисует окружность с центром в точке X,Y заданным радиусом и цветом. STEP – указывает на то, что используются относительные координаты.

Примеры:

'окружность радиусом 100 с центром в точке с координатами 50, 50 цвета 4

CYRCLE (50, 150),100,4

CYRCLE STEP(0,0),5'окружность радиусом 5 с центром в текущей точке

Оператор

üLINE [[STEP](x1,y1)] – [STEP](x2,y2) [, [цвет] [B[F]]]

рисует линию или прямоугольник с начальными координатами x1,y1 и конечными – x2,y2. Если используется ключ В – рисуется прямоугольник с координатами левого верхнего угла х1, у1 и нижнего правого – х2, у2. Если использованы ключи BF – прямоугольник закрашивается. Параметр STEP указывает на относительные координаты.

Примеры:

LINE –(50, 50) 'линия от текущей точки до точки 50,50

LINE –STEP(50, 50) 'линия от текущей точки до точки,

'отстоящей от х и у на 50 и 50 пикселей

LINE (25, 25)–STEP(50, 50),5,BF'прямоугольник с координатами левой верхней точки 25,25 и правой нижней –75, 75, закрашенный цветом 5

Универсальный оператор рисования

üDRAW символьное_выражение

позволяет выполнять действия по перемещению, масштабированию, вращению и раскрашиванию образов.

Команде может предшествовать префикс, влияющий на результат:

B – предписывает двигаться, но не рисовать;

N – двигаться, рисовать, вернуться в исходную точку.

Команды перемещения
Un,Dn,Ln,Rn – Вверх, вниз, влево, вправо (рис. 2.10.1).
En,Fn,Gn,Hn – По диагонали в направлении: вверх вправо, вниз вправо, вниз влево, вверх влево.
Mx,y – Абсолютное или относительное движение. Если х или у имеет знак (+ или –), движение осуществляется относительно текущей точки, т.е. значения х и у будут прибавлены к значениям соответствующих текущих координат (или вычтены из них). Если знаков нет, движение будет абсолютным из текущей точки в точку с указанными координатами.
  Команды трансформации
  A n – Установка угла поворота n. Значение n находится в пределах от 0 до 3, где 0=0°, 1=90°, 2=180°, и 3=270°. Размеры фигур, повернутых на угол 90° или 270° масштабируются в отношении 4/3 к их размерам в углах 0° или 180°.
  TA n – Поворачивает изображение на угол n градусов. Значение n находится в пределах от -360 до 360. Если n>0, то поворот производится против часовой стрелки, иначе – по часовой.
  C n – Установка цвета n.
  S n – Определяет масштаб, согласно которому уменьшаются/увеличиваются дли­ны отрезков, вычерчиваемых, следующими в строке командами пере­мещения (U,D,L,R,М). Масштабный коэффициент n находится в пределах от 1 до 255. Истинное значение масштабного коэффициента вычисляется как n/4. По умолчанию n=4, что соответствует коэффициенту 1/4.
  P n,m– Установка цвета нарисованной фигуры: n – цвет содержимого окра­шен­ной области, m – цвет границ.
   

Пример. Построить шестиугольник, начиная с точки 100,100 (рис.2.10.2).

DRAW "bm100,100 r20 f20 d20 g20 l20 h20 u20 e20"

Пример. Нарисовать фигуру “колесо с касательными” (рис. 2.10.3).

SCREEN 12

FOR I = 0 TO 360 STEP 5

DRAW "nu80ta"+STR$(I)+"u5"'касательная

SLEEP'пауза для просмотра

NEXT

Пример. Нарисовать фигуру (схематическую “восьмерку” рис.2.10.4), изображенную справа. Ее левый верхний угол находится в точке 40,80. Ширина 60 пикселей, высота – 140. Внутренние прямоугольники имеют размер 20 на 40.

Операторы, формирующие изображение приведены ниже.

DRAW "bm40,80"‘переход в левый верхний угол (40,80)

DRAW "r60d140l60u140"‘большой прямоугольник

DRAW "bm+20,+20r20d40l20u40"‘верхнее “окно”

DRAW "bm+0,+60r20d40l20u40"‘нижнее “окно”

Последовательность действий иллюстрирует рис.2.10.5. Элементарные шаги пронумерованы. Так, номер 1 соответ­ствует команде r60; 2 – d140; 3 – l60; 4 – u140; 5 – bm+20, +20; 6 – r20; 7 – d40; 8 – l20; 9 – u40 и т.д. Отдельные действия разнесены по разным операторам только для наглядности. Возможно их объединение, как показано ниже

DRAW "r60d140l60u140 bm+20,+20r20d40l20u40m+0,+60r20d40l20u40"

 
  Программа нахождения корня методом касательных - student2.ru

Между командами можно оставлять любое число пробелов, что облегчает их обозримость.

Оператор

üPAINT [STEP] (x,y)[,[цвет_заполнения][,цвет_рамки]]

дает возможность закрасить ограниченную площадь цветом заполнения. Если цвет заполнения не задан, используется цвет фона. Закрашивание начи­нается с точки с абсолютными (или относительными – STEP) координатами X,Y. Точка может быть указана внутри фигуры (раскрашивается фигура) или вне ее (раскрашивается фон), но не на границе. Если цвет рамки не указан, рамка окрашивается в цветом заполнения.

¶ФОРМИРОВАНИЕ ОКОН

Оператор

üVIEW (Xн,Yн)-(Xк,Yк)[,[цвет_окна] [,цвет_рамки]]

позволяет выделить определенную часть экрана (окно), в которой в дальней­шем будут воспроизводиться все графические объекты. Им определяются размер и положение окна графического вывода на экране монитора. Если VIEW выполняется без аргументов, окном вывода будет весь экран.

Параметры оператора:

Xн,Yн – координаты левого верхнего угла окна (в пикселях).

Xк,Yк – координаты правого нижнего угла окна.

цвет окна – цвет фона окна (если не указан, окно не закрашивается).

цвет рамки – цвет рамки окна.

Оператор

üWINDOW [SCREEN] (Xmin,Ymin)–(Xmax,Ymax)

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

Здесь

Xmin,Ymin – минимальные значения физических координат выводимого на экран объекта.

Xmax,Ymax – максимальные значения физических координат.

SCREEN – определяет направление координат. По умолча­нию, вывод производится в декартовых координатах (рис.2.10.6а) с обычным направлением оси Y (вверх). Если использован параметр SCREEN, Y направляется вниз (рис.2.10.6б).

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

Пример. Положим нам нужно вывести на экран график функции Y=SinX, для Х, изменяющегося в диапа­зоне от 0 до 20. Программа вывода приведена ниже, график на рис.2.10.7.

SCREEN 12

VIEW (25, 10)-(600, 435),,1‘формируется окно вывода с экранными

‘координатами (в пикселях): х=25, у=10 на х=600, у=435

Xmin = 0: Xmax = 20 ‘масштабирование (заданы крайние

Ymin = -1: Ymax = 1 ‘значения Х =[0,20] и Y=[-1.1])

WINDOW (Xmin,Ymin)-(Xmax,Ymax)‘задаются физические координаты

FOR x=0 TO 20 STEP .01 ‘генерация значений Х от 0 до 20 с шагом 0.01

PSET (x, SIN(x)), 4 ‘вывод функции SinX

PSET (x, 0), 4 ‘одновременный вывод оси Х

NEXT

¶СОЗДАНИЕ ДИНАМИЧЕСКИХ ОБРАЗОВ осуществляется с помо­щью двух операторов (GET и PUT), сохраняющих образ в массиве и извлекающих его оттуда (рис.2.10.8).

 
  Программа нахождения корня методом касательных - student2.ru

Оператор

üGET [STEP](X1,Y1) – [STEP](X2,Y2) [,массив]

позволяет сохранить графическое изображение в массиве чисел.

Здесь:

X1,Y1,X2,Y2 – координаты левого верхнего и правого нижнего углов прямоугольной области экрана.

STEP – параметр, указывающий, что координаты берутся относительно послед­ней нарисованной точки.

массив – имя числового массива для записи изображения. Размер массива в байтах определяется по формуле: 4+INT(((Х2–Х1+1)+7)/8)*4*((Y2–Y1)+1)

Оператор

üPUT [STEP] (X,Y), массив [,действие]

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

Здесь:

X,Y – координаты левого верхнего угла прямоугольника, в котором будет размещаться изображение.

STEP – параметр, указывающий, что координаты берутся относительно теку­щего положения курсора

массив – имя массива с изображением.

действие – параметр, позволяющий накладывать образ на экран с созданием специальных эффектов (по умолчанию – XOR):

PSET – Каждая точка имеет запомненный в массиве цвет.

PRESET – Выдается инверсное (негативное) изображение образа.

AND – Выводимое изображение накладывается на существующее. Точки, имеющие одинаковый цвет, сохраняются, остальные цвет меняют.

OR – В результате наложения получается образ, являющийся результатом применения логического ИЛИ.

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

Рассмотрим несколько более интересных примеров.

Пример. Составим программу вывода шести концентрических окруж­ностей с координатами центра в центре экрана (точка: 320, 240), последо­вательно раскрашенных в цвета с первого по шестой (рис.2.10.9).

SCREEN 12

FOR i = 1 TO 6‘цикл рисования шести окружностей

‘круг с центром в точке 320,240, радиусом 25i с цветом линии 1

CIRCLE (320, 240), i*25,1

‘закрашивание цветом i объекта, замкнутого относительно точки

PAINT (320+i*25-1,240), i,1‘с координатами 320+i*25-1, 240

NEXT

Как видим, программа очень несложна. Сделаем пояснения только к раскрашиванию. Здесь координата Y остается постоянной (240). Координата Х меняется таким образом, чтобы точка находилась внутри очередной окружности, хотя бы на один пиксель отступя от края (320+i*25-1).

 
  Программа нахождения корня методом касательных - student2.ru

Пример. Составим программу вывода текущего време­ни в формате ЧЧ-ММ-СС. Вывод цифр времени будем осуществлять большими “рисованными” символами (как, например, на рис.2.10.10).

SCREEN 12

t$ = " "

DO'бесконечный цикл опроса времени

'если нажата какая-то клавиша

IF INKEY$<>"" THEN END'завершение программы

IF t$<>TIME$ THEN'если время изменилось

CLS'экран очищается

t$ = TIME$'запоминается новое время

END IF

FOR i=1 TO 8'перебор цифр времени

x$=MID$(TIME$, i, 1)'выделение очередного символа времени

‘позиционирование точки начала рисования:

IF i = 1 THEN DRAW "bm40,80"'позиция первой цифры часов

IF i = 2 THEN DRAW "bm110,80"

'тире часы-минуты

IF i = 3 THEN DRAW "bm185,80bm+0,+60r20d20l20u20"

IF i = 4 THEN DRAW "bm220,80"'позиция первой цифры минут

IF i = 5 THEN DRAW "bm295,80"

'тире минуты-секунды

IF i = 6 THEN DRAW "bm370,80bm+0,+60r20d20l20u20"

IF i = 7 THEN DRAW "bm405,80"'позиция первой цифры секунд

IF i = 8 THEN DRAW "bm475,80"

'вывод символов времени:

IF x$="1" THEN DRAW "r40d120r20d20l60u20r20u100l20u20"

IF x$="2" THEN DRAW "r60d80l40d40r40d20l60u80r40u40l40u20"

IF x$="3" THEN DRAW "r60d140l60u20r40u40l20u20r20u40l40u20"

IF x$="4" THEN DRAW "r20d60r20u60r20d140l20u60l40u80"

IF x$="5" THEN DRAW "r60d20l40d40r40d80l60u20r40u40l40u80"

IF x$="6" THEN DRAW

"r60d20l40d40r40d80l60u140bm+20,+80r20d40l20u40”

IF x$="7" THEN DRAW "r60d60g30d50l20u50e30u40l40u20"

IF x$="8" THEN DRAW

"r60d140l60u140 bm+20,+20r20d40l20u40bm+0,+60r20d40l20u40"

IF x$="9" THEN DRAW

"r60d140l60u20r40u40l40u80bm+20,+20r20d40 l20u40"

IF x$="0" THEN DRAW "r60d140l60u140bm+20,+20r20d100l20u100"

NEXT

LOOP

Здесь в переменную t$ заносится символьное значение времени с помощью функции TIME$. В бесконечном цикле производится опрос нажатия клавиши. Нажатие любой клавиши является сигналом завершения программы (IF INKEY$<>"" THEN END). Если в очередном цикле произошло изменение значения времени, экран очищается и запоминается новое время. Далее прос­матриваются все восемь символов строки времени. Первая группа операторов IF в зависимости от номера символа, фиксирует текущие координаты в нужном месте экрана. Следующая группа операторов IF выводит уже изображение нужного символа, начиная с этой точки.

 
  Программа нахождения корня методом касательных - student2.ru

Пример. Составим программу, отобража­ющую стрелочный секундомер (только секун­дную стрелку). В левом верхнем углу экрана (рис.2.10.11) отоб­разим уже в числовом виде текущее время и число секунд от начала работы программы. Для вычисления абсолютного числа прошедших секунд (DS) из текущего времени (TIME$) извлекаются две цифры часов и умножаются на 360, плюс число минут, умноженных на 60, плюс просто число секунд (переменная S). Это значение является точкой отсчета для секундомера, который работает три минуты (180 секунд) от запуска программы. Важным является преобразование числа секунд в угол поворота стрелки. Заметим, что одна минута равна шести градусам и отсчет градусов идет от горизонтальной оси, а минут – от вертикальной, т.е. следует отнять 90 градусов.

Наши рекомендации