
- •6. Алгоритмы и программы
- •6.1. Алгоритм и алгоритмический процесс
- •6.1.1. Основные свойства алгоритмов:
- •6.1.2. Способы записи алгоритма
- •6.1.3. Схемы алгоритмов и программ
- •6.2. Переменная и постоянная величина Выражения
- •6.3. Присваивание
- •6.4. Основные этапы решения задач на эвм
- •6. 5. Алгоритмизация. Базовые алгоритмические структуры
- •6.5.1. Реализация базовых структур в языке Pascal
- •6.5.2. Реализация базовых структур в языке qBasic
- •Операторы тела цикла
- •6.6. Ввод - вывод
- •6.6.1.Ввод-вывод данных на языке Pascal
- •Var X, y: integer; {Описание переменных X, y целочисленного типа}
- •6.6.2. Ввод-вывод данных на языке qBasic
- •6.7. Алгоритмы линейной и разветвляющейся структуры
- •Решение задачи 6.3. На языке Turbo Pascal:
- •6.8. Циклические алгоритмы
- •Input "Введите натуральное м : " , m
- •Print : print "о т в е т : Сумма этих чисел равна "; s
- •6.9. Итерационные циклы
- •6.10. Массивы
- •6.11. Вложенные циклы
- •6.12. Подпрограммы
- •6.12.1. Параметры подпрограмм
- •6.12.2. Подпрограммы в языке Pascal
- •Операторы функции, один из которых
- •6.12.3. Подпрограммы в языке Basic
- •6.13. Рекурсия
- •6.14. Логические операции с числами
- •6.15. Работа с символьной информацией
- •6.15.1. Работа с символьной информацией в языке Basic
- •6.15.2. Работа с символьной информацией в языке Pascal
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