- •Раздел 2 Программирование на языке
- •Лабораторная работа № 1
- •1 Порядок решения задач на компьютере
- •2 Разработка линейных программ
- •Input "Ввести d, k,n"; d, k,n
- •3 Операторы read, datа, restore
- •3 Запуск qbasic, ввод и редактирование программ
- •Лабораторная работа № 2
- •2 Программы ветвления
- •Input X
- •Лабораторная работа № 3
- •1 Операторы цикла qb
- •2 Примеры программ с циклами
- •3 Контрольные вопросы
- •4 Задание
- •Лабораторная работа № 4
- •1 Программа вычисления арифметического ряда
- •2 Программы вычисления факториалов
- •3 Алгоритм итерационного цикла
- •4 Контрольные вопросы
- •5 Задания
- •Лабораторная работа № 5
- •1 Программа "цикл в цикле"
- •2 Программа "цикл и ветвление"
- •3 Программа "цикл в цикле и ветвление"
- •4 Контрольные вопросы
- •5 Задания
- •Лабораторная работа № 6
- •1 Одномерные массивы - векторы
- •2 Двумерные массивы – матрицы. Обработка массивов
- •3 Контрольные вопросы
- •4 Задания
- •Лабораторная работа № 7
- •1 Функции пользователя
- •3 Процедуры. Операторы sub и end sub
- •Лабораторная работа № 8
- •1 Графические операторы qbasic
- •2 Программа рисования графических объектов
- •3 Построение графиков функций
- •4 Контрольные вопросы
- •5 Задание
Лабораторная работа № 7
Функции пользователя и подпрограммы
Цель работы: изучить операторы DEF, GOSUB, RETURN, SUB,
CALL, разработка программ с использованием функций пользова-
теля и подпрограмм
Содержание работы:
1 Функции пользователя
2 Подпрограммы пользователя. Операторы GOSUB, RETURN
3 Процедуры. Операторы SUB и END SUB
1 Функции пользователя
Функции пользователя вводятся самим пользователем, если в программе неоднократно повторяются одни и те же математические формулы, или формулы одной структуры.
Это уменьшает громоздкость программы, т.к. можно один раз вычислить , например, часто повторяющуюся формулу, а затем подставлять её обозначение в места программы, где она встречается для новых вычислений.
Такие функции могут определяться в любом месте программы с помощью оператора DEF (define – определить).
Формат оператора:
DEF FN Имя [% $] (аргументы, до 5) = выражение
где
FN Имя – обозначение функции или указатель функции;
Имя - любая латинская буква;
% - для целочисленных функций;
$ - для символьных функций.
(данные в квадратных скобках могут отсутствовать)
Если значение выражения вещественного типа, а функция целого
(или наоборот), то значение выражения приводится к типу функции.
Аргументы, употребляемые в описании функции (в операторе
DEF), называются формальными параметрами функции. Параметры обозначаются так же, как и переменные, и разделяются запятыми.
Выражение, записываемое в правой части определения функции, может быть произвольным арифметическим или символьным выражением, зависящим, как правило, от формальных параметров. Однако оно необязательно должно зависеть от всех формальных параметров-аргументов и может содер-
101
жать и другие переменные, которых нет среди аргументов, но они были определены в программе
Пример 1: DEF FNL (X,Y)=(X-C)^3+SIN(A+B/X)
В функции пользователя L аргументами являются X и Y, а в выражении используются также величины С, А, В, определённые в программе ранее.
Если в программе введено описание функции, то можно обращаться к нему, т.е. употреблять обозначение этой функции (указатель функции) в различных выражениях. В указателе все формальные параметры должны быть заменены на фактические.
Пример 2: DEF FNC(X)=SQR(X^7+SIN(X)) – ABS(LOG(2*X)
.........................
M=FNC(1)+2*FNC(4.5)
.........................
Z=X+4
L=FNC(Z)
Функция С(Х), определённая в операторе DEF FNC(X) будет вычисляться в строке с выражением М=… для Х=1 и Х=4.5 и в строке с выражением L=…, где вместо Х используется новая переменная Z=X+4.
Фактические аргументы могут быть любым допустимым в языке выражением. При обращении к функции сначала вычисляют значения всех фактических параметров, далее их подставляют вместо соответствующих формальных параметров в описании функции и вычисляют значение выражения, записанного в правой части определения функции. Это значение является значением указателя функции при данных фактических параметрах.
Пример 3: DEF FNZ(X)=(5*X+2)*X+1
A=1:B=4
? FNZ(A+B/2)
Здесь фактический параметр Х вычисляется как А+В/2, а потом его значение подставляется в FNZ(X) и функция Z(X) вычисляется по выражению в правой части.
Тип и количество используемых переменных должны соответствовать переменным из списка аргументов в операторе DEF. Нельзя употреблять числовые аргументы вместо символьных и наоборот. При определении функции или в указателе функции ее можно писать или с пустыми скобками () или без них, если функция не зависит от аргументов.
102
DEF - неисполняемый оператор, его рекомендуют помещать с другими неисполняемыми операторами либо в конце, либо в начале программы.
Задача 1 Написать программу для вычисления значения функции:
при заданных значениях R,A,B
и функции
при заданных значениях S, Q, M, X.
В правой части обеих формул можно выделить арифметическое
выражение
Определим это выражение как функцию пользователя с формаль-
ными аргументами X,Y,Z:
DEF FNC(X,Y,Z)=(X*(SIN(Z)^3+Y*(COS(X+Z)))/SQR(X^2+Y^2+Z^2).
Тогда значение функции Т можно определить так:
T=FNC(R+A,7,B^2),
где (R+A), 7, B^2 - фактические значения формальных аргументов X,Y,Z.
а значение функции U можно определить по формуле:
U = S^2+FNC(Q,M,X)*FNC(3,M+S,X) при фактических параметрах Х=Q, Y=M, Z=X и Х=3, Y=M+S, Z=X .
Программа
REM Программа с функций пользователя
DEF FNC(X,Y,Z)=(X*(SIN(Z)^3+Y*COS(X+Z)))/SQR(X^2+Y^2+Z^2)
? "ВВЕДИТЕ ЗНАЧЕНИЯ R,A,B"
INPUT R,A,B
T=FNC(R+A,7,B^2): ? "T="T
? "ВВЕДИТЕ ЗНАЧЕНИЯ S,Q,M,X"
INPUT S,Q,M,X
103
U=S^2+FNC(Q,M,X)*FNC(3,M+S,X)
? "U="U
END
Подпрограммы пользователя.
Операторы GOSUB, RETURN
Последовательность повторяющихся в программе операторов может быть оформлена в виде подпрограммы.
Подпрограмма - это фрагмент программы, которая реализует операции, часто повторяющиеся в нескольких точках программы. Подпрограммы обычно размещаются в конце программы перед операторами DATA (если они имеются), и всегда перед оператором END.
Для обращения к подпрограмме используется оператор GOSUB.
Формат оператора
[метка] GOSUB [метка1],
где [метка1] метка некоторой строки, с которой начинается подпрограмма - точка входа в подпрограмму.
При выполнении GOSUB управление передается строке подпрограммы, метка которой указана в операторе GOSUB (напр., оператор GOSUB N010 передает управление подпрограмме, которая начинает выполняться со строки с меткой N010).
Подпрограмма может содержать любые операторы языка QB, но последним выполняемым оператором подпрограммы должен быть оператор RETURN, формат которого должен быть [метка] RETURN.
Оператор RETURN обеспечивает возврат управления на оператор, следующий за оператором GOSUB, осуществившим переход на подпрограмму.
Пример 4:
........................
GOSUB 1000
PRINT 'A='A,'B='B
........................
REM Подпрограмма 4
........................
RETURN
Оператор RETURN передает управление строке PRINT 'A='A,'B='B. QBASIC допускает использование в одной программе нескольких подпро-
104
грамм. Они могут помещаться одна после другой в конце программы в порядке возрастания номеров строк.
Подпрограммы могут вкладываться друг в друга, т.е внутри одной подпрограммы может осуществляться вызов другой подпрограммы. Подпрограмма может обращаться как к другой подпрограмме, так и к самой себе. Вход в подпрограмму может осуществляться в любой точке.
Для работы операторов RETURN среда программирования QBASIC организует таблицу адресов возврата. Каждый раз, когда в программе выполняется оператор GOSUB, QB помещает в таблицу адрес строки, следующей за оператором GOSUB. Таблица вмещает не более 20 адресов строк.
Подпрограмма может иметь несколько операторов RETURN - несколько выходов из подпрограммы, например, из различных ветвей программы. Первый же встреченный оператор RETURN осуществляет выход из подпрограммы.
Для условной передачи управления одной из нескольких подпрограмм или к одной из нескольких входных точек одной подпрограммы может быть использован оператор ON GOSUB.
Формат оператора:
[метка] ON [арифм.выражение] GOSUB [список],
где [список] - список меток или номеров строк, являющихся точками входов в подпрограмму.
Результат вычисления выражения может принимать значения от 0 до 255, в противном случае печатается сообщение об ошибке. В результате выполнения этого оператора происходит передача управления в зависимости от значения арифметического выражения. Если его значение равно единице, передается управление строке, номер которой в списке стоит первым Если значение арифметического выражения равно двум то строке, номер которой в списке стоит вторым, и т.д.
Задача 2
Составить программу вычисления функции с помощью подпрограммы пользователя при положительных целочисленных значениях a, b, x.
105
Вычисление значения функции Z можно организовать с помощью разветвляющегося вычислительного процесса, при этом в каждой ветви алгоритма необходимо получать значение факториала, которое в общем случае вычисляется по формуле
n!=1 2 3...(n-1) n.
В задаче 2 вычисляется три факториала:
(ax+2)! = 1 2...(ax)(ax+1)(ax+2);
a!=1 2 3...(a-1)a;
b!=1 2 3...(b-1)b,
т.е. сначала при введённых a, b, x вычисляется значение n, а потом вычисляется его факториал.
В программе для каждой ветви нужно подставлять формулу своего факториала ((аx+2)!, a! или b!). Предусмотрим в основном алгоритме настройку на формулу прежде, чем осуществить переход к процедуре. Эта настройка заключается в задании величины n:
n = ax+2 , если a=b;
n = a , если a>b;
n = b , если b>a
Для вычисления факториала разработаем подпрограмму пользователя вычисления факториала F = n! в виде последовательности операторов:
SUB F(i)
F=1 ' начальное значение факториала
FOR i=2 TO n ' увеличение на 1 управляющей переменной I
F=F*i ' накопление факториала
NEXT i ' переход к следующему значению I
END SUB
Программа
Основной алгоритм и алгоритм вычисления значения факториала представим в виде основной программы и подпрограммы. Вызов подпро-
106
граммы из основной программы осуществляется с помощью оператора GOSUB. Возвращение из подпрограммы в основную программу осуществляется оператором RETURN. Перед каждым обращением к подпрограмме пользователя параметр факториала n (его конечное значение) вычисляется по формуле, которая используется в данной ветви вычислений.
CLS
REM Программа с подпрограммой пользователя
INPUT "a=";a, "b=";b, "x=";x
IF a=b THEN m1
IF a>b THEN m2
REM Вычисление при b>a
n=b
GOSUB m3
Z=X*SIN(X)/F :GOTO m4
m1: REM Вычисление при a=b
n=a*x+2
GOSUB m3
Z=F : GOTO m4
m2: REM Вычисление при a>b
n=a
GOSUB m3
Z=F*b*x^2/(a^2+b^2)
m4: PRINT"Z="Z,"F="F
STOP
m3: REM Подпрограмма вычисления факториала
F=1
FOR i=2 TO n
F=F*i
NEXT i
RETURN
END