Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
INFORMAT / 2TEOR_BA.DOC
Скачиваний:
38
Добавлен:
02.03.2016
Размер:
219.65 Кб
Скачать

Строка– строка экрана (1 – 25), на которую должен переместиться курсор. Столбец– столбец экрана (1 – 80), к которому должен переместиться курсор.

Например:

CLS: LOCATE 5,25

PRINT "Длина:"

LOCATE 6,25

PRINT "Ширина:"

3.2.6 Оператор останова STOP служит для прекращения выполнения программы и ее трансляции. Общий вид: STOP

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

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

Оператор удобен для отделения главной программы и подпрограммы. Если оператор STOP означает логическое завершение программы, то оператор END – ее физическое завершение.

Рассмотрим программу, вычисляющую объемы цилиндра и конуса.

' ОБЪЕМЫ ЦИЛИНДРА И КОНУСА

CLS: INPUT “Введите высоту и радиус: ”; H, R

PI = 3.14159: V1 = H*PI*R*R: V2 = V1 / 3

LOCATE 7, 20

? ”ОБЪЕМ ЦИЛИНДРА = ”; V1

LOCATE 8, 20

? ”ОБЪЕМ КОНУСА = ”; V2: END

Здесь использованы комментарии, оператор ввода исходных данных INPUT, два оператора присваивания, позволяющие присвоить переменным V1 и V2 вычисленные значения объемов цилиндра и конуса. В программе использованы два оператора вывода для печати значений V1 и V2 в указанные оператором LOCATE позиции курсора.

3.2.8 Операторы условного и безусловного переходов. Для изменения естественного порядка выполнения операторов программы используются операторы GOTO и IF.

Оператор GOTO служит для организации безусловного перехода на указанную строку.

Общий вид: GOTO < метка>.

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

Например, после выполнения программы:

CLS: PRINT "Привет "

GOTO a

PRINT "Саша!"

a:

PRINT "Коля!": END

на экране появится текст: "Привет Коля!".

Оператор условного перехода IF предназначен для изменения порядка выполнения операторов после проверки некоторого условия. QBASIC позволяет использовать оператор IF в двух формах: линейной и блочной.

Линейная форма этого оператора перешла в QBASIC из предыдущей версии GW-BASIC и имеет следующий общий вид:

IF < условие > THEN < меткаоператоры > [ ELSE<меткаоператоры > ],

где условие - выражение логического типа;

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

Работа оператора IF заключается в следующем: если результат отношения при проверке условия – "истина", то управление передается на строку, помеченную меткой или выполняется записанный оператор, или группа операторов. Если результат отношения – "ложь", то выполняются операторы из ветви ELSE или осуществляется переход на помеченную строку. Если ветвь ELSE отсутствует, то управление передается строке, следующей за оператором IF.

Примеры записи оператора IF:

IF Х+A > 0 THEN K = 2 ELSE K = 4

IF L >= 6 AND L <= 16 THEN ? ”Вы обязаны ходить в школу”

Блочная форма оператора IF имеет вид:

IF < условие > THEN

< оператор 1-1>

…………

[ < оператор 1-n> ]

[ ELSE

< оператор 2-1 >

…………

[ < оператор 2- n > ] ]

END IF.

Если условие, заданное в операторе IF истинно, то выполняется THEN-ветвь, то есть последовательно выполняются операторы 1-1…1-n. В противном случае выполняются операторы 2-1…2- n. После выполнения одной из ветвей работа программы продолжается с оператора, следующего за END IF.

Рассмотрим пример программы вычисления действительных корней квадратного уравнения y = ax2 + bx + c.

Программа:

` Линейная форма оператора IF

INPUT “ВВЕДИТЕ КОЭФФИЦИЕНТЫ A, B, C”; A, B, C

D = B^2 - 4*A*C

IF D > 0 THEN 1 ELSE IF D = 0 THEN X1 = -B/(2*A): X2 = X1: GOTO 2

ELSE PRINT “ДЕЙСТВИТЕЛЬНЫХ КОРНЕЙ НЕТ”: END

1: X1 = (-B + SQR(D)) / (2*A)

X2 = (-B - SQR(D)) / (2*A)

2: PRINT “ X1 = ”; X1; ” X2 = “; X2: END

Программа:

` Блочная форма оператора IF

INPUT “ВВЕДИТЕ КОЭФФИЦИЕНТЫ A, B, C”; A, B, C

D = B^2 - 4*A*C

IF D > 0 THEN

X1 = (-B + SQR(D)) / (2*A)

X2 = (-B - SQR(D)) / (2*A)

ELSE

IF D = 0 THEN

X1 = -B/(2*A): X2 = X1

ELSE

PRINT “ДЕЙСТВИТЕЛЬНЫХ КОРНЕЙ НЕТ”: END

END IF

END IF

PRINT “ X1 = ”; X1; ” X2 = “; X2: END

После ввода коэффициентов a, b, c вычисляется значение дискриминанта D. Затем проверяется знак дискриминанта D в операторе IF. Если D>0, то выполняется переход на строку с меткой 1, где происходит вычисление корней, их вывод на печать и завершение программы. Если условие D>0 не выполняется, то по ветви ELSE происходит проверка еще одного условия D=0. Здесь также происходит выбор нужной ветви. Если D=0, то выполняется вычисление корня x = -b/(2a) и переход на строку с меткой 2, в противном случае выдается сообщение “ДЕЙСТВИТЕЛЬНЫХ КОРНЕЙ НЕТ”.

3.2.9 Оператор выбора SELECT CASE предназначен для выполнения одного из альтернативных действий, перечисленных в нем. Выбор определяется значением управляющей переменной. Синтаксис конструкции следующий:

SELECT CASE < переменная выбора >

CASE < сравнение_1 >

[ < операторы_1 > ]

CASE < сравнение_2 >

[ < операторы_2 > ]

…………………………..

[CASE ELSE

[ < операторы > ] ]

END SELECT.

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

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

  • < выражение > [,< выражение >…];

  • < выражение > TO < выражение >;

  • IS < выражение с операцией >.

Сначала выполняется Сравнение_1. Если результат истинен, выполняются Операторы_1, после чего выполнение программы продолжается с оператора, следующего за END SELECT. Если результат сравнения ложен, то проверяется условие следующей ветви CASE. Если же ни для одной ветви результатом сравнения не является истина, то выполняются операторы ветви CASE ELSE.

CASE-сравнение в простейшем случае состоит только из одного выражения (например, из чисел или переменных). Однако можно включать списки выражений (выражение_1, выражение_2,…) или даже целые области (выражение_1TO выражение_2). Далее значение переменной можно оценивать с помощью операторов сравнения, как в случае с условиями. Для этого применяется ключевое слово IS, за которым следует операция отношения и выражение.

Рассмотрим пример программы проверки вводимого числа на принадлежность к определенному интервалу

' Конструкция SELECT CASE

CLS: INPUT " Введите любое число: "; n

SELECT CASE n

CASE 1, 2 ' список значений

PRINT " Число 1 или 2"

CASE 3 TO 10 ' область значений

PRINT " Число в диапазоне от3 до 10 "

CASE IS < n + 10 ' условие

PRINT " Число меньше 20 "

CASE ELSE

PRINT "Это все, что я знаю о числе"

END SELECT

END

3.2.10 Оператор описания массивов DIM служит для резервирования места в памяти ЭВМ под массивы. Нумерация значений индексов массивов начинается с нуля. Можно также в качестве начального значения индексов использовать единицу.

Общий вид:

DIM < имя > [< тип >] (< индекс > [,< индекс >]), . . .,

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

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

Например, оператор

DIM X(20), C(5,4), D$(10), M%(37)

означает, что в программе будут использованы: одномерный массив X, состоящий из 20 вещественных чисел, вещественная матрица C, имеющая 5 строк и 4 столбца, одномерный символьный массив D, состоящий из 10 слов и одномерный массив M, состоящий из 37 целых чисел.

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

FOR…NEXT;

DO…LOOP;

WHILE…WEND.

Цикл FOR…NEXT – это цикл с заранее заданным количеством повторений. Количество повторений зависит от значения счетчика цикла. Такой цикл обеспечивает многократное выполнение операторов, заключенных между операторами FOR и NEXT.

Синтаксическая структура цикла имеет следующий вид:

FOR< счетчик > = < N1 > TO < N2 > [STEP < N3 >] – заголовок цикла

…………………………

< операторы тела цикла >

[ EXIT FOR ]

NEXT < счетчик > – конец цикла,

где счетчик - имя управляющей переменной целого или вещественного типа; N1, N2, N3 – константы, переменные или выражения, определяющие соответственно начальное значение, конечное значение и шаг изменения счетчика цикла; тело цикла - группа операторов, выполняемых многократно в цикле; EXIT FOR – прерывает работу цикла, программа продолжает работу с оператора, следующего за NEXT.

Операторы FOR и NEXT используются только в паре. Оператор FOR определяет начало цикла, NEXT – конец цикла. По умолчанию шаг изменения параметра цикла N3 = 1, и тогда его можно не указывать.

Порядок выполнения операторов цикла следующий:

  1. вычисляются значения выражений N1, N2, N3 (если это необходимо);

  2. счетчику цикла присваивается значение N1;

  3. выполняются операторы тела цикла включительно до оператора NEXT;

  4. значения счетчика увеличиваются на величину шага N3 и действия повторяются с пункта 3 до тех пор, пока значение счетчика не станет больше N2;

  5. осуществляется выход из цикла и управление передается оператору, следующему за оператором NEXT.

Количество повторений в цикле определяется равенством: .

Например, программа

PRINT “ X”, “ X^2 ”,” X^3”,” X^4”

FOR X=1 TO 5

PRINT X, X^2, X^3, X^4

NEXT X

позволяет получить таблицу значений X, X2, X3, X4 для чисел натурального ряда от 1 до 5 в виде:

X X^2 X^3 X^4

1 1 1 1

2 4 8 16

3 9 27 81

4 16 64 256

5 25 125 625

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

FOR I=2 TO 10 STEP 2  FOR I=10 TO 2 STEP –2

PRINT I;  PRINT I;

NEXT I  NEXT I

2 4 6 8 10  10 8 6 4 2

Рассмотрим программу вычисления и печати значений функции при изменении аргумента x от xn до xk с шагом h.

‘ ТАБЛИЦА ЗНАЧЕНИЙ ФУНКЦИИ Y = F(x)

PRINT “Введите диапазон изменения X и шаг”

INPUT XN, XK, H

FOR X = XN TO XK STEP H

Y = (X^3 - 4*X + 1) / (ABS(X) + 1)

PRINT “ X=”; X; ” Y(x) = ”; Y

NEXT X: END

Для вычисления и печати значений функции Y организован цикл со счетчиком X. Количество повторений в цикле: .

При составлении циклических программ следует иметь в виду следующие правила:

  • можно входить в цикл только через оператор FOR, в противном случае параметр цикла (счетчик) не определен;

  • параметр цикла, его начальное N1 и конечное N2 значения, а также шаг изменения N3 нельзя изменять внутри цикла;

  • возможен досрочный выход из цикла с помощью оператора IF;

  • из цикла допустимо обращение к подпрограмме с последующим возвратом в него.

Цикл WHILE – это цикл с неизвестным числом повторений, так называмый итерационный цикл. С помощью конструкции WHILE…WEND можно реализовать выполнение ряда операторов до тех пор, пока выполняется определеннное условие. Общий вид конструкции WHILE…WEND следующий:

WHILE < условие >

[ < оператор1 > ]

…………….

[ < операторN > ]

WEND

До тех пор, пока соблюдается условие, последовательно выполняются операторы от 1 до N. Оператор WEND закрывает конструкцию. Если условие цикла больше не соблюдается, то выполнение программы продолжается, начиная с оператора, следующего за WEND. Этот цикл является циклом с предусловием, поэтому, если условие не выполняется с самого начала, то управление сразу же передается оператору, расположенному за WEND.

‘ Пример использования цикла WHILE

‘ Проверка вводимых величин с помощью цикла WHILE

CLS

WHILE z < 0

INPUT “ Введите положительное число”; z

WEND

PRINT “Спасибо!” : END

Рассмотрим программу вычисления

с точностью до члена ряда, меньшего 10-3.

INPUT " Введите число "; x

sx = x: n = 1: Y = 1: s = SIN (sx) / n

WHILE s > 1E-3

Y = Y + s

sx = sx + x: n = n + 1

s = s + SIN (sx) / n

WEND

PRINT " Y = "; Y

END

Цикл DO – это цикл также с неизвестным числом повторений. Конструкция DO … LOOP очень похожа на WHILE … WEND. Здесь также имеется последовательность операторов, повторное выполнение которых зависит от некоторых условий. Конструкцию DO … LOOP можно использовать в двух вариантах.

Вариант 1 (цикл DO с постусловием ):

DO

[ < оператор 1 > ]

……………..

[ < оператор n > ]

[ EXIT DO ]

LOOP [{WHILE | UNTIL} < условие >]

Вариант 2 (цикл DO с предусловием ):

DO [{WHILE | UNTIL} < условие >]

[ < оператор 1 > ]

……………..

[ < оператор n > ]

[ EXIT DO ]

LOOP

WHILE | UNTIL – ключевые слова, определяющие способ проверки условий. При использовании WHILE цикл выполняется до тех пор, пока соблюдается условие (значение логического выражения истинно). И, наоборот, при использовании UNTIL цикл выполняется только тогда, когда условие не соблюдается (значение логического выражения ложно).

EXIT DO – оператор, преждевременно прерывает выполнение цикла. Работа программы продолжается с оператора, следующего за LOOP.

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

‘ Пример использования циклаDO

‘ Этот цикл используется до тех пор, пока не будет введено

‘ число, превышающее 10

DO

INPUT " Введите число"; n

LOOP WHILE n <= 10

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

' Программа с цикломDO … LOOP

k = 0 ' k - количество нечетных элементов

INPUT "Введите первый элемент"; a

DO UNTIL a <> 0

' Проверка элемента на нечетность (функцияMOD)

IF a MOD 2 <> 0 THEN

k = k + 1

END IF

INPUT "Введите следующий элемент"; a

LOOP

PRINT " Количество нечетных элементов ="; k: END

Использование циклов при обработке на ЭВМ массивов. Определение массива было дано в пункте 3.1 данной главы; оператор DIM, описывающий массивы, рассмотрен в пункте 3.2.9. Элементы массива могут быть использованы при вычислении только после того, как их значения будут введены в память ЭВМ с помощью операторов READ, INPUT. Для вывода массива используется оператор PRINT. Рассмотрим одномерные массивы.

Операторы ввода-вывода помещаются внутри циклического участка программы и при каждом выполнении цикла осуществляется ввод-вывод одного значения элемента. Возможны два способа ввода.

Способ 1.

DIM Z(15)

FOR I = 1 TO 15

INPUT Z(I) ‘ ВВОД С КЛАВИАТУРЫ 15 ЧИСЛОВЫХ ЗНАЧЕНИЙ

NEXT I

Способ 2.

DIM X(8)

DATA –2, 10, 5, 6, -1,-4, 3, 8

FOR I = 1 TO 8

READ X(I)

NEXT I

Для вывода, например, 15-ти элементов массива Z, также необходим цикл:

' Цикл FOR … NEXT | ' Цикл WHILE … WEND

FOR I = 1 TO 15 | i = 1

PRINT “ Z( “; I; ”) = ”; Z(I) | WHILE i < 9

NEXT | PRINT “ Z( “; I; ”) = ”; Z(I)

| i = i +1

| WEND

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

DIM Y(5)

DATA 3, 10, 5, 20, 8

READ Y(1), Y(2), Y(3), Y(4), Y(5)

PRINT Y(1), Y(2), Y(3), Y(4), Y(5)

Рассмотрим программу вычисления суммы положительных элементов массива X = {x1, x2, ... x20} по формуле: .

Алгоритм накапливания суммы был рассмотрен в Главе 2 настоящего пособия.

‘ ПРОГРАММА ВЫЧИСЛЕНИЯ СУММЫ

‘ ПОЛОЖИТЕЛЬНЫХ ЭЛЕМЕНТОВ МАССИВА

DIM X(20)

S = 0: FOR I = 1 TO 20

INPUT X(I)

IF X(I) > 0 THEN S = S + X(I)

NEXT I

PRINT ” СУММА = ”; S:

END

В цикле организован ввод текущего элемента X(I) и проверка условия, позволяющего отбирать положительные значения элементов массива. Если условие выполняется, то значение суммы S увеличивается на слагаемое X(I) и осуществляется переход на продолжение цикла; если условие не выполняется, то сразу осуществляется переход на продолжение цикла.

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

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

Параметры во вложенных циклах изменяются неодновременно. Изменения этих параметров определяются условием конкретной задачи.

Структура правильно организованного вложенного цикла имеет вид:

FOR I=... FOR I=... FOR I=...

FOR J=... FOR J=... FOR J=...

FOR K=... ... FOR K=...

FOR N=... NEXT J

... ...

NEXT N

... FOR K=...

NEXT K ...

... NEXT K

NEXT J ...

... NEXT I NEXT K,J,I

NEXT I

Рисунок 3.1 – Структуры вложенных циклов

Рассмотрим двумерные массивы. Для ввода двумерного массива также можно использовать один из двух способов, рассмотренных выше.

Способ 1.

‘ Рассматривается матрица А из 3-х строк и 4-х столбцов

DIM A (3, 4)

FOR I = 1 TO 3

FOR J = 1 TO 4

INPUT A (I, J)

NEXT J, I

Ввод организован с клавиатуры по строкам, т.к. внешним циклом в данном примере является цикл по строкам.

Способ 2.

‘ Рассматривается матрица В из 2-х строк и 2-х столбцов

DIM В (2, 2)

DATA 5, -4, -2, 10

FOR J = 1 TO 2: FOR I = 1 TO 2

READ B (I, J)

NEXT I: NEXT J

В примере осуществляется ввод элементов матрицы вида:

Ввод организован по столбцам с использованием операторов DATA и READ. Для вывода элементов двумерного массива в виде таблицы используются также вложенные циклы. Рассмотрим фрагмент программы печати матрицы X размером 5х6 в общепринятой форме:

FOR I = 1 TO 5

FOR J = 1 TO 6

PRINT X (I, J); “ “;

NEXT J

PRINT

NEXT I

Оператор PRINT осуществляет печать элементов в одной и той же строке, т.к. в конце оператора стоит знак “;”, блокирующий переход на новую строку. После ввода всех элементов одной строки матрицы (после окончания цикла по счетчику J) выполняется пустой оператор PRINT, осуществляющий переход к новой строке печати.

Методику программирования структур вложенных циклов рассмотрим на примерах.

Пример 1. Из матрицы

выбрать отрицательные значения и произвести их подсчет. Построить и отпечатать новую матрицу B, элементы которой вычисляются по формуле: bij = aij / k, где k – количество отрицательных элементов исходной матрицы.

DIM A (3, 4), B (3, 4)

DATA 5, -2, -6, 3

DATA 12, 0, 1, -4

DATA –5, 7, -11, -8

K = 0: FOR I = 1 TO 3

FOR J = 1 TO 4: READ A (I, J)

IF A (I, J) < 0 THEN K = K + 1

NEXT J, I

' ПОСТРОЕНИЕ И ПЕЧАТЬ НОВОЙ МАТРИЦЫ

FOR I = 1 TO 3: FOR J = 1 TO 4

B (I, J) = A (I, J) / K: PRINT B (I, J);

NEXT J: PRINT: NEXT I: END

Комментарии к программе: чтобы сократить объем программы, ввод элементов матрицы A(I,J) и их обработка совмещены. Порядок выполнения вложенных циклов следующий:

  • оператор внешнего цикла задает параметру I значение, равное 1, затем оператор внутреннего цикла задает значение параметру J=1 и вводится элемент A (1,1);

  • производится проверка условия A (1, 1) < 0; если условие выполняется, то увеличивается значение счетчика K на 1; если нет, то осуществляется переход на продолжение внутреннего цикла, и параметр J последовательно принимает значения =2,3,4;

  • после окончания внутреннего цикла оператор внешнего цикла присваивает значение параметру I=2 и снова повторяется внутренний цикл;

  • после трехкратного повторения внешнего цикла осуществляется переход к оператору FOR;

  • вычисление и печать элементов матрицы B осуществляется аналогично.

Пример 2. В произвольной матрице X(9,6) вычислить произведение элементов каждого столбца.

DIM X (9, 6)

FOR J = 1 TO 6: P = 1

FOR I = 1 TO 9

INPUT X (I, J): P = P * X (I, J): NEXT I

PRINT “ СТОЛБЕЦ ”; J; ” P = ”; P

NEXT J: END

Здесь по условию задачи ввод и обработка элементов X (I, J) осуществляется по столбцам. Поэтому внешний цикл организован по параметру J. Начальное значение переменной P берется равным 1 каждый раз перед заголовком внутреннего цикла, в котором осуществляется ввод элементов каждого J-го столбца и подсчет произведения этих элементов. Печать произведения элементов каждого J-го столбца осуществляется после окончания внутреннего цикла во внешнем цикле.

3.2.13 Оператор описания пользовательских функций. Часто возникает необходимость использования одного и того же математического или строко-вого выражения в нескольких местах программы при различных исходных дан-ных. Процедуру вычисления такого выражения можно оформить с помощью нестандартной функции, составленной пользователем. Пользователь выбирает имя функции и описывает в ней вычисление выражения. Определив функцию один раз, можно неоднократно применять ее наравне со стандартными функциями.

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

Общий вид: DEF FN < имя > [< тип >] (n1, n2, ..., nk) = < выражение >,

где имя - вместе с префиксом FN определяет имя функции;

тип - целый, вещественный или символьный тип;

n1, n2, ..., nk - список формальных параметров целого, вещественного или символьного типа;

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

Тип выражения должен соответствовать типу функции.

Обращение к пользовательской функции производится по имени:

FN < имя > [< тип >] ( l1, l2, ... , ln ),

где l1, l2,..., ln - фактические параметры (константы, переменные, выражения) целого, вещественного или символьного типа.

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

Рассмотрим пример:

Вычислить значение функции:

при x = 21,87; y = 35,13; z = 9,87.

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

Программа:

 ФУНКЦИЯ ПОЛЬЗОВАТЕЛЯ

DEF FNF (A, B) = SQRT (A*A+B*B+SIN(A*B)^2)

DATA 21.87, 35.13, 9.87

READ X, Y, Z

W = FNF(X, Y) + FNF(Y, Z) + FNF(Z, X)

PRINT "w = ";W: END

3.2.14 Подпрограммы. Операторы GOSUB и RETURN.QuickBasic предоставляет возможности программировать по модульному принципу. Модуль – это отдельная, полностью независимая от других, часть вашей программы. Каждая программа может состоять из одного или нескольких модулей. Один из модулей называется главным, с него начинается решение задачи. К главному модулю можно подключить один или несколько вспомогательных (дополнительных) модулей, в котоpые выносятся пpоцедуpы и подпpогpаммы-функции, используемые в нескольких пpогpаммах. Таким обpазом, пpогpамма собиpается как бы из готовых блоков.

Пpоцедуpы и подпpогpаммы-функции являются самостоятельными пpогpаммными единицами, котоpые составляются, тpанслиpуются и хpанятся в памяти независимо от основной пpогpаммы - главного модуля.

В данном пособии не рассматриваются темы, связанные с модульным программированием. Здесь уделяется внимание только локальным подпрограммам.

В ранних версиях языков группы Basic, в частности в GW-Basic, нет процедур и функций, а есть только DEF FN-функции и локальные подпрограммы типа SUBROUTINE. Эти конструкции явились своего рода предвестниками процедур и функций Qbasic. Однако Qbasic поддерживает эти старые формы, хотя их возможности и довольно ограниченны.

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

Общий вид:

GOSUB < метка >,

где метка - метка первой строки подпрограммы.

Подпрограмма завершается оператором выхода из подпрограммы RETURN.

Общий вид:

RETURN [ < метка > ],

где метка - метка строки, куда возвращается управление после выхода из подпрограммы.

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

  • перед обращением к п/п задать с помощью оператора присваивания или ввода фактические значения формальным параметрам, использующимся в п/п;

  • после выхода из п / п запомнить результаты вычисления путем присваивания вычисленного значения фактическому параметру.

Рассмотрим пример:

вычислить выражение z = (Amax + Bmax)/3, где Amax и Bmax – наибольшие элементы массивов A(30), B(20); нахождение наибольших элементов выполнить в п/п.

Программа:

 ОСНОВНАЯ ПРОГРАММА

DIM A (30), B (20)

DATA ...  30 констант массива А

DATA ...  20 констант массива В

FOR I = 1 TO 30: READ A (I): NEXT I

FOR I = 1 TO 20: READ B (I): NEXT I

N = 30: GOSUB p1: AMAX = MAX

FOR I = 1 TO 20: A (I) = B (I): NEXT I

N = 20: GOSUB p1: BMAX = MAX

Z = (AMAX + BMAX) / 3

PRINT “ Z = ”; Z: END

 П/П МАКСИМУМ

p1: MAX = A (1): FOR I = 2 TO N

IF A (I) > MAX THEN MAX = A (I)

NEXT I: RETURN: END

Как было показано выше, перед обращением к п / п необходимо присвоить формальным параметрам значения соответствующих фактических параметров.

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

Соседние файлы в папке INFORMAT