Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник_Попов_1.doc
Скачиваний:
6
Добавлен:
25.04.2019
Размер:
668.16 Кб
Скачать

Input “Введите левую и правую границы a и в ”, a, b,

Input “Введите допустимую погрешность e ”, e

y1=COS(a): y2=COS(b) ‘вычисляем функцию на границах отрезка

WHILE ABS(b-a)>=e ‘сравниваем длину отрезка с погрешностью

‘если отрезок длиннее, вычисления повторяются снова

c=(b-a)/2+a ‘находим середину нового отрезка

y3=COS(c) ‘вычисляем функцию в этой точке

‘если на этом отрезке функция пересекает ось Х, в качестве

‘новой левой границы берем эту точку, иначе берем ее в качестве

IF y1*y3 > 0 THEN a=c ELSE b=c ‘правой границы

WEND

PRINT “Корень уравнения=” a,“Значение функции в точке А=” COS(a)

Более быстрым средством нахождения корней является метод Ньютона (метод касательных). Рассмотрим графическую интерпретацию метода (рис.2.8.5) нахождения корня на участке [А,В]. Примем, например, правую границу В интервала за начальное приближение. Восстановим перпендикуляр из этой точки до пересечения с кривой Y(Xо). Затем через Y(Xо) проведем касательную к кривой до пересечения с осью абсцисс. Точка пересечения Х1 является первым приближением к искомому корню Х. Повторив эти действия, получим приближение Х2, затем Х3 и т.д., причем каждое последующее приближение расположено ближе к истинному корню Х, никогда не достигая его. Алгоритм решения изображен на рис.2.8.6. Известно, что производная в точке Y(Xo) равна тангенсу угла 

Y'(Xo)=Tg()=Y(Xo)/(Xo–X1)

Отсюда: X1=Xo–Y(Xo)/Y'(Xo); X2=X1–Y(X1)/Y'(X1)

Или, в общем случае: Xi+1=Xi–Y(Xi)/Y'(Xi)

П роцесс последовательного приближения (итерации) закончим, когда Хi–Хi+1<E, где E – заранее заданное малое число (допустимая погрешность). Ниже приведена программа уточнения корней для уравнения вида: AX3+BX2+CX+D=0.

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

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

72

77

80

Оператор

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