Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
GLAVA_10_Algoritmy_i_programmy.doc
Скачиваний:
7
Добавлен:
22.09.2019
Размер:
797.7 Кб
Скачать

6.12.3. Подпрограммы в языке Basic

В языке Basic подпрограммы, обладающие значением (возвращающие единственное значение) также называются функциями. Кроме этого используются подпрограммы - процедуры, которые не возвращают значение, а выполняют последовательность операторов.

Определение функции в языке Basic возможно несколькими способами. Функция может быть определена с помощью оператора FUNCTION, имеющего следующий вид:

FUNCTION <имя функции>(<список формальных параметров>)

<имя функции> = <выражение>

END FUNCTION

Более компактные функции можно описать с помощью оператора DEF FN, имеющего следующий вид:

DEF FN<имя функции> = <выражение>

или

DEF FN<имя функции> (<перечень формальных парам-ов>)=<выражение>

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

Пример определения функции:

DEF FNX(A) = A*B+C ‘Определение функции X(A) с одним

… формальным параметром А

B=10: C=100

PRINT “Результат = ”; FNX(10) ‘Вызов функции с фактическим

параметром равным 10

При выполнении этого вызова функции получим сообщение:

Результат = 200

С помощью оператора DEF FN кроме однострочных функций, называемых оператор-функция, есть возможность описать функции, состоящие из нескольких строк (однако эта возможность считается устаревшей).

Например, определение функции нахождения N! (N факториал), где N!=N*(N-1)*(N-2) *…*3*2*1:

FUNCTION Fact (N)

DIM T, I As Integer

T=1

FOR I = 1 TO N

T = T*I

NEXT I

Fact = T

END FUNCTION

Функции с именем Fact имеет один параметр –N и две локальные переменные T и I.

Определение процедуры имеет вид:

SUB <имя> (<список формальных параметров >)

<операторы подпрограммы>

END SUB

Вызов процедуры:

CALL < имя > (<список фактических параметров >)

или

< имя > <список фактических параметров >

Особенности передачи параметров. Параметры в подпрограммах на языке Basic можно передавать по значению и по имени (по ссылке). Для передачи параметра по значению, при вызове подпрограммы параметр должен быть заключен в круглые скобки. Для передачи параметра по имени скобок не должно быть.

Опишем процедуру PRSUM с одним параметром X

SUB Prsum (x)

DIM z AS INTEGER

z=10

x = x+z

END SUB

Возможны два варианта вызова процедуры PRSUM:

PRSUM (y)

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

PRSUM y

Параметр без круглых скобках, т.е. передается по имени. После вызова процедуры PRSUM значение переменной y увеличится на 10.

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

Например, в вызове процедуры Pr, параметры X2 и X4 будут переданы по значению, а X1 и X3 – по имени.

CALL Pr (X1, (X2), X3, (X4))

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

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

Область действия переменных. Переменные, описанные в подпрограмме, и ее формальные параметры являются локальными для данной подпрограммы, т.е. доступны только в этой подпрограмме. Их значения после завершения подпрограммы теряются. Справедливо и обратное: в подпрограмме недоступны переменные, описанные в главной программе.

Командой SHARED можно повторить описание переменных из главной программы и сделать их доступными в подпрограмме (переменные становятся доступными и для изменения, их измененные значения передаются в главную программу):

SHARED <список переменных>

Кроме этого возможно использование глобальных переменных, доступных из всех подпрограмм. Их описание должно содержать ключевое слово COMMON:

COMMON <список переменных>

Однако, предпочтительным считается обмен входными и выходными данными через параметры.

Упражнения.

1. Составить определение и вызов функции подсчета суммы N первых элементов массива вещественных чисел.

Решение задачи на языке Turbo Pascal:

Type Massiv = array [1..100] of real;

Function Sum (M: Massiv, N: Integer): Real;

Var

S: Real;

I: Integer;

Begin

S:= 0;

I:=1;

While I<=N do begin

S:= S + M[I];

I:=I + 1;

end;

Sum:=S;

end;

Var

X: Massiv;

Begin

{вызов функции для вычисления суммы 10 элементов массива }

Sum (X, 10);

End.

2. Дано описание двух функций FNA и FNB и фрагмент программы на языке Basic:

DEF FNA (X) = 4*X

DEF FNB (A, B) = SQR (A + B)

…..

X = 1 : A = 5 : B = 4

Z = FNA(X) + FNA(A) + FNA (2)

W = FNB (Z, B)

PRINT Z; PRINT W

Что будет выведено?

Решение.

Z = FNA(1) + FNA(5) + FNA(2) = 4*1 + 4*5 + 4*2 = 32,

W = FNB (32, 4) = SQR (32 + 4) = 36 = 6

Будет выведено 32 6

3. Каким будет результат выполнения команд на языке Basic:

DEF FNX (A) = 5* A – C

C = 1

Y = FNX (FNX(1))

PRINT Y, FNX I

Решение. Y = FNX (5*1 – 1) = FNX(4) = 5*4 – 1 = 19

FNX(C) = 5*1-1 = 4

Будет выведено 19 4

4. Каким будет результат выполнения следующих команд на языке Basic, если введены числа 10, 15:

DEF FNX (A, B)

IF A>B THEN

FNX = 5* (A – B)

ELSE

FNX = B*B

END IF

END DEF

INPUT “C=”, C, “D=”, D

Y = FNX (C, D)

PRINT Y

Решение. Переменные C = 10, D = 15. Функция FNX(10, 15) = 15*15 = 225.

5. Каким будет результат выполнения следующих команд на языке Basic, если введены числа 6 7 5 4 8:

N = 5

DIM A(N)

CALL VVOD (N, A())

CALL OBR (N, A())

CALL VIVOD (N, A())

S =0

FOR I = 1 TO N

S = S + A(I)

NEXT I

PRINT “S= “,S

END

SUB VVOD (N, M())

FOR I=1 TO N

INPUT M(I)

NEXT I

END SUB

SUB OBR (N, M())

FOR I=1 TO N

IF M(I) mod 2 >0 THEN M(I) = M(I) +1

NEXT I

END SUB

SUB VIVOD(N, M())

FOR I=1 TO N

PRINT M(I)

NEXT I

END SUB

Решение.

Вызов подпрограммы CALL VVOD (N, A()) заполняет массив из 5 элементов: А(1)=6, А(2)=7, А(3)=5, А(4)=4, А(5)=8. Вызов подпрограммы CALL OBR (N, A()) преобразует массив А(): каждый нечетный элемент увеличивает на единицу, тогда значения элементов массива А(1)=6, А(2)=7+1=8, А(3)=5+1=6, А(4)=4, А(5)=8.Вызов подпрограммы CALL VIVOD (N, A()) выводит значения массива А(). Далее в программе вычисляется и выводится сумма элементов массива.

Результат работы программы будет следующий:

6 8 6 4 8 S=32

6. Дано описание двух функций FNA и FNB и фрагмент программы на языке Basic:

DEF FNA (X) = 2*X +5

DEF FNB (A, B) = A ^2+ B^2

…..

X = 0: A = 5 : B = 4

Z = FNA(X) * FNA(2) – FNA (5)

W = FNB (A, B)

PRINT Z; PRINT W

Что будет выведено?

7. Каким будет результат выполнения следующих команд на языке Basic, если введены числа –23, 12:

DEF FNX (A, B)

IF abs (A) > B THEN

FNX = 2* (A + B)

ELSE

FNX = abs (A)*B

END IF

END DEF

INPUT “C=”, C, “D=”, D

Y = FNX (C, D)

PRINT Y

8. Каким будет результат выполнения следующих команд на языке Basic:

N = 5

DIM A(N, N)

FOR I=1 TO N

FOR J = 1 TO N

A(I, J) = 2*I –J

IF A(I,J) <0 THEN A(I,J)= N- A(I,J)

NEXT J

NEXT I

CALL OBR (N, A())

CALL VIVOD (N, A())

END

SUB OBR (N, M())

FOR I=1 TO N

FOR J=1 TO N

IF M(I,J) mod 3 >0 THEN M(I,J) = M(I,J) *3

NEXT J

NEXT I

END SUB

SUB VIVOD(N, M())

FOR J=1 TO N

S=0

FOR I=1 TO N

S=S+M(I, J)

NEXT I

PRINT “S(“, J, “)=”, S

NEXT J

END SUB

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]