Задача. Выполнить упорядочение по возрастанию нескольких массивов вещественных чисел. В программе используется процедура сортировки методом «пузырька», алгоритм которой описан ранее.
Исходными данными для процедуры являются массив вещественных чисел и его размерность. Стандарт языка Паскаль, как отмечалось выше, требует описания массива в разделе Type (в программе это новый тип — MasReal). При использовании процедуры сортировки для согласования параметров необходимо в основной программе и процедуре ссылаться только на этот тип.
Program Sort;
MasReal = Array [1..M] Of Real;
Procedure SortY (L:Integer; Var Y:MasReal);
For k:=1 To L-1 Do
For i:=1 To L-k Do
Writeln(’ Введите размер массивов’);
Writeln(’Введите первый массив’);
For i : =1 To n Do
Writeln (’Введите второй массив’);
For i := 1 To n Do
Writeln (’Первый массив’);
For i := 1 To n Do
Writeln (’Второй массив’);
For i := 1 To n Do
18.1.2. Расположение процедур в программе
Информатика. Язык Pascal: Процедуры и функции в Pascal. Центр онлайн-обучения «Фоксфорд»
Процедуры могут быть вложенными друг в друга (см. рис. 2.10,а).
P1 и P3 — внешние процедуры, Р1, P2 и P3 — внешние
Р2 – внутренняя процедуры
Рис. 2.10. Расположение процедур в программе
При таком расположении обращение к внутренней процедуре P2 возможно только из охватывающей ее процедуры P1, а из внешних (на рис. – Р3) — невозможно. Более предпочтительным является расположение процедур в виде рис. 2.10,б, на котором все процедуры являются внешними по отношению друг к другу.
При таком расположении:
1) любая процедура имеет доступ к любой другой (в том числе и к самой себе);
2) облегчается отладка процедур, т.к. они могут быть написаны и отлажены независимо друг от друга.
18.2. Функции
Функция — это независимый программный блок (программная единица), который позволяет получить только один результат.
Примером являются стандартные функции Паскаля. Имеется возможность писать свои функции. Располагаются они в программе так же, как процедуры: после описания данных и перед операторами.
Пример. Program . . .;
Функция оформляется так же, как процедура. Отличие имеется в заголовке и способе передачи результата. В общем виде функция оформляется так:
Function Имя(формальные_параметры):Тип_Результата;
Описание локальных переменных
Имя := Выражение;
Формальные параметры – это аргументы функции. Они могут отсутствовать. Результат передается через имя функции, поэтому в заголовке указывается тип результата. По этой же причине среди операторов в теле функции должен быть хотя бы один, в котором имени функции присваивается значение. Именно это значение и будет возвращено функцией в качестве результата.
Пример. Оформить в виде функции операцию возведения вещественного числа в целую степень.
Function Stepen(x:Real;n:Integer):Real;
#6. Процедуры и Функции на PascalABC.net
For i := 1 to n do
For i := 1 to Abs(n) do
Для вычисления значения функции с конкретным параметром ее, как и процедуру, вызывают из основной программы с указанием фактических параметров–аргументов. В отличие от процедуры имя функции может встречаться в выражениях в качестве операнда. Когда выражение вычисляется, функция выполняется и значением операнда становится величина, возвращаемая функцией.
Формальные параметры функции могут быть только параметрами–значениями. При ее вычислении они не изменяются. Аргументы функции могут быть любых типов:
1) скалярные — числа, символы, булевские;
Сама функция (результат) имеет только скалярный тип, (т.е. число — целое или вещественное, а также символ или булевская переменная).
При обращении к функции (вызове ее) на место формальных параметров подставляются фактические, как в процедуре. Типы, количество и порядок следования фактических и формальных параметров должны совпадать.
В теле функции могут использоваться (вызываться) и другие функции, стандартные или написанные пользователем.
Пример. Вычислить гиперболический синус по формуле:
Sinh(x) = (e x – e — x )/2
Функция будет иметь вид
Function Sinh(X:Real):Real;
К функции можно обращаться из основной программы; из другой функции и из самой себя.
Функции, которые вызывают сами себя, называются рекурсивными. Такие функций часто встречаются в математике, например, вычисление факториала, возведение числа в целую степень, вообще, нахождение любых значений методом математической индукции. Так, факториал вычисляется по формуле:
n! = n*(n -1)! — при n>0 и
Для рекурсивных функций необходимо вырабатывать условие завершения (иначе произойдет зацикливание). Это условие для n! записано во второй строчке (при n=0) – так как рекурсия производится на основе второго сомножителя — (n-1)!=(n-1)*(n-2)! и т.д. — до нуля.
Запишем рекурсивную функцию вычисления факториала.
Function Fact (N:Integer):Integer;
Источник: studfile.net
Пользовательские функции и процедуры
Критерии оценивания Ученики понимают и различают определения функции и процедуры в программировании
Ученики понимают и различают определения функции и процедуры в программировании.
Ученики могут решить задачи используя функции и процедуры.
Процедуры и функции Процедуры и функции в языке
Процедуры и функции
Процедуры и функции в языке Pascal являются подпрограммами.
Подпрограмма – это именованная часть программы, представляющая собой некоторое собрание операторов, структурированных аналогично основной программе.
Подпрограммы не необходимы, но их наличие заметно облегчает работу программиста и увеличивает «ценность» кода.
Описываются подпрограммы между разделом описания переменных и началом тела основной программы
Описываются подпрограммы между разделом описания переменных и началом тела основной программы. Так выглядит структура всей программы в Pascal:
Виды процедур и функций Как уже было сказано ранее, подпрограммы в
Виды процедур и функций
Как уже было сказано ранее, подпрограммы в Pascal представлены в лице функций и процедур, которые могут быть встроенными и пользовательскими.
Первые, как правило, изначально присутствуют в системе, а вторые создаются программистом.
Нас интересуют в первую очередь пользовательские подпрограммы, работа со встроенными вызывает меньше хлопот.
После описания, подпрограммой можно пользоваться посредством ее имени. При этом управление из места вызова передается соответствующей подпрограмме.
Параметры процедур и функций Для передачи данных, после объявления имени подпрограммы, в круглых скобках необходимо указать параметры , которые в свою очередь можно разделить на…
Параметры процедур и функций
Для передачи данных, после объявления имени подпрограммы, в круглых скобках необходимо указать параметры, которые в свою очередь можно разделить на передаваемые и возвращаемые. Передаваемые параметры – это переменные, которые подпрограмма получает из главной части программы, а возвращаемые – отдает (возвращает) ей.
Также различают формальные и фактические параметры. Те, что используются при вызове процедуры или функции называются фактическими, а формальные описываются в заголовке подпрограммы, и принимают значения фактических параметров. Формальные параметры должны совпадать типом и количеством с фактическими.
Чтобы стало понятно, где находятся те или иные части подпрограмм, рассмотрим общую форму записи процедур:
Чтобы стало понятно, где находятся те или иные части подпрограмм, рассмотрим общую форму записи процедур:
Процедура:
Procedure (: ); Var Begin . . . End;
Вызов процедуры:
();
А здесь рассмотрим общую форму записи функций:
А здесь рассмотрим общую форму записи функций:
Переменные В Pascal, также как и во многих других языках программирования, переменные по отношению к программе делятся на локальные и глобальные
В Pascal, также как и во многих других языках программирования, переменные по отношению к программе делятся на локальные и глобальные. Те, которые объявляются в основной части, называются глобальными, а в процедуре или функции – локальными. Локальные переменные в отличие от глобальных могут использоваться лишь внутри подпрограммы, к которой они принадлежат.
Пользовательские процедуры Процедура – это независимая совокупность операторов, выполняющих заданную последовательность действий, и определенных отдельно от основной части программы
Процедура – это независимая совокупность операторов, выполняющих заданную последовательность действий, и определенных отдельно от основной части программы.
Она начинается со служебного слова Procedure, после которого идет имя и заголовок процедуры. Остальная часть аналогична основной программе.
Напишем пример программы, показывающей принцип работы простой процедуры
Напишем пример программы, показывающей принцип работы простой процедуры.
program proc; uses crt; var k, n, r: integer; procedure sum(pk, pn: integer; var rez: integer); var i: integer; begin rez:=0; for i:=pk to pn do rez:=rez+i; write(‘ сумма диапазона = ‘, rez:3); end; begin clrscr; write(‘ начальное значение = ‘); readln(k); write(‘ конечное значение = ‘); readln(n); sum(k, n, r); end.
Объяснение примера Программа выводит сумму целых чисел заданного диапазона
Программа выводит сумму целых чисел заданного диапазона.
Имя процедуры прописано после служебного слова, определяющего, что создана именно процедура. Далее идет заголовок, где первые две переменные – это формальные параметры, в которые передается значение от фактических k и n.
Переменная rez возвращает результат и называется параметром-переменной (определяются после слова Var), а k и n – параметрами-значений. Локальная переменная – i, она описана сразу после заголовка процедуры. Вызывая, в основной части программы процедуру sum, в качестве передаваемых параметров мы указали три целочисленных переменных. Заметьте, что их количество соответствует числу формальных параметров. Порядок также важен, т. е. в переменную pk передается значение переменной k, в pn значение n и т. д.
В примере было бы вполне уместным не использовать параметр-переменную rez, а определить ее локально. В этом состоит различие между процедурами и функциями в Pascal.
Пользовательские функции В отличие от процедур, функции могут быть задействованы в основной программе, лишь в каком либо выражении
В отличие от процедур, функции могут быть задействованы в основной программе, лишь в каком либо выражении. Также для обращения к функции необходимо знать тип данных результата, возвращаемого ей.
Описание функций начинается со служебного слова function, вслед за которым идет ее заголовок, а дальше те же блоки, что и у процедуры.
Function (: ): ; Var Begin . . . :=; End;
В вызываемую часть результат работы функции должен быть возвращен посредством имени последней. Это предусматривает хотя бы одно присвоение ей значения.
Допустим необходимо вычислить наибольший общий делитель двух целых чисел
Допустим необходимо вычислить наибольший общий делитель двух целых чисел. Результатом решения данной задачи будет одно число, поэтому мы воспользуемся именно функцией.
program func; uses crt; var n, m, nod: integer; function nod_Evk(f_n, f_m: integer): integer; begin while n<>m do begin if m>n then m:=m—n else n:=n—m; end; nod_Evk:=n; end; begin clrscr; write(‘ N =: ‘); read(n); write(‘ M =: ‘); read(m); write(‘ Наибольший общий делитель ‘, n,‘ и ‘, m, ‘ = ‘); nod:=nod_Evk(n, m); write(nod); end.
Объяснение примера В конце описания функции, ее имени присваивается значение, которое впоследствии примет переменная nod
В конце описания функции, ее имени присваивается значение, которое впоследствии примет переменная nod.
В функцию из основной части передаются только два фактических параметра (m и n), что соответствует количеству формальных параметров.
И если в заголовке процедуры после слова Var можно указать переменные, также относящиеся к числу формальных параметров, то в функции эта обязанность лежит на ее имени, принимающем после своей работы какое-то значение.
Задача 1 Написать функцию, которая возвращает среднее арифметическое двух переданных ей аргументов (параметров)
Написать функцию, которая возвращает среднее арифметическое двух переданных ей аргументов (параметров).
function average(c,d: real): real;
begin
average := (c + d) / 2;
end;
begin
readln(a,b);
writeln(average(a,b):5:2);
end.
Задача 2 Описать процедуру нахождения по заданной длине стороны треугольника и величинам двух прилежащих углов длин остальных сторон треугольника и величины третьего угла
Описать процедуру нахождения по заданной длине стороны треугольника и величинам двух прилежащих углов длин остальных сторон треугольника и величины третьего угла.
var
K,L,M,KL,LM,KM: real;
procedure triangle(var A,B,C,AB,BC,AC: real);
var radA, radB, radC: real;
begin
C := 180 — A — B;
radA := A * PI/180;
radB := B * PI/180;
radC := C * PI/180;
BC := (sin(radA) * AB) / sin(radC);
AC := (sin(radB) * AB) / sin(radC);
end;
begin
write(‘A = ‘); readln(K);
write(‘B = ‘); readln(L);
write(‘AB = ‘); readln(KL);
triangle(K,L,M,KL,LM,KM);
writeln(‘C = ‘,M:7:2);
writeln(‘BC = ‘,LM:6:2);
writeln(‘AC = ‘,KM:6:2);
Задача 3 Описать функцию вычисления f(x) по формуле: f(x)= x^2 при -2=2; 4 при x
Описать функцию вычисления f(x) по формуле: f(x)= x^2 при -2=2; 4 при xИспользуя эту функцию для n заданных чисел, вычислить f(x). Среди вычисленных значений найти наибольшее.
Result: ‘); for i:=1 to n do write(arr[i], ‘ ‘); writeln; writeln(‘max = ‘, max); readln; end
const
n = 5;
var
a, max: integer;
i: byte;
arr: array[1..n] of integer;
function func(x: integer): integer;
begin
if (x >= -2) and (x < 2) then
func := x * x
else
if x >= 2 then
func := x * x + 4 * x + 5
else
func := 4;
end;
begin
max := -32768;
for i:=1 to n do begin
write(‘a = ‘); readln(a);
arr[i] := func(a);
if arr[i] > max then
max := arr[i];
end;
write(‘Result: ‘);
for i:=1 to n do
write(arr[i], ‘ ‘);
writeln;
writeln(‘max = ‘, max);
ДЗ Написать функцию для обмена значений двух переменных
Написать функцию для обмена значений двух переменных
Подсказка
От пользователя требуется ввод двух чисел.
Эти значения должны быть присвоены двум переменным, причем значение первой должно быть меньше второй. Конечно, можно предупредить об этом пользователя, но возможно ему удобней будет и не знать о требованиях программы.
В коде программы можно реализовать процедуру, производящую обмен значений двух переменных, и вызывать ее после каждого очередного ввода пользователя.
Рефлексия Что вы узнали на уроке?
Что вы узнали на уроке?
Что было не понятно?
Вам была интересна сегодняшняя тема?
Источник: znanio.ru
MS-DOS и TASM 2.0. Часть 12. Процедуры (функции).
Процедуры в ассемблере будут рассмотрены в четырёх статьях, в которых мы изучим общие понятия и определения процедур, использование стека для передачи параметров, а также использование прерываний DOS — как разновидности функций ядра операционки (статьи 15-19: «Процедуры (функции)», «Стек», «Конвенции вызова функции», «Упрощаем вызов функции в TASM», «Прерывания DOS»).
Начнём изучать функции на примере нашей программы goblin.com. Сразу определимся, что понятия: процедура, функция, подпрограмма в языках программирования, включая ассемблер, являются синонимами и обозначают одно и то же. Именно в качестве равнозначных синонимов мы будем использовать эти названия.
Изучаем процедуры на примере goblin.com.
Пакет всего необходимого, включая исходники (DOS-1.rar) можно скачать с нашего сайта по ссылке.
Полный код нашей подопытной программы:
. model tiny ; for СОМ
. code ; code segment start
org 100h ; offset in memory = 100h (for COM)
start : main proc
mov ah , 09h
mov dx , offset prompt
mov ah , 01h
je mode _ man
je mode _ woman
call goblin
mov addrs , offset man ; указатель на процедуру в addrs
mode_woman :
mov addrs , offset woman ; указатель на процедуру в addrs
call word ptr addrs ; косвенный вызов процедуры
mov ax , 4c00h
mov ah , 09h
mov dx , offset mes _ man
woman proc
mov ah , 09h
mov dx , offset mes _ womn
woman endp
goblin proc
mov ah , 09h
mov dx , offset mes _ gobl
goblin endp
addrs dw 0 ;for procedure adress
prompt db ‘Are you Man or Woman [m/w]? : $’
mes_man db 0Dh , 0Ah , «Hello, Strong Man!» , 0Dh , 0Ah , ‘$’ ; строка для вывода. Вместо ASCII смвола ‘$’ можно написать машинный код 24h
mes_womn db 0Dh , 0Ah , «Hello, Beautyful Woman!» , 0Dh , 0Ah , ‘$’ ; строка для вывода
mes_gobl db 0Dh , 0Ah , «Hello, Strong and Beautyful GOBLIN!» , 0Dh , 0Ah , 24h ; строка для вывода. 24h = ‘$’ .
len = $ — mes _ gobl
Goblin.com включает в себя несколько подпрограмм:
- main proc
- man proc
- woman proc
- goblin proc
Каждая подпрограмма имеет определённую задачу и, будучи написанной один раз может вызываться в процессе исполнения программы неоднократно. Процедуры в ассемблере не являются обязательным элементом программы, а просто повышают её наглядность (в Си и СРР это не так). Процедура упрощает код, делает его более структурированным, сокращают его размер.
Вызов процедуры в ассемблере.
Вызов процедуры в ассемблере осуществляется командой call (call — вызов). После вызова, процедура исполняет свой код и программа возвращается в точку возврата (выполняет дальнейший код, следующий за вызовом — командой call).
Процедура может иметь свои аргументы — данные, которые ей предоставляются для обработки и результат (входные и выходные данные — in/out).
Процедура в ассемблере обозначается названием и начинается оператором proc (procedure — процедура). Заканчивается процедур оператором end proc (end procedure — конец процедуры) и командой ret (return — возврат). В главной функции (main в нашем случае) команда ret после выхода в систему DOS не обязательна.
имя_процедуры proc
…
тело процедуры (код)
…
ret
endp
Для удобной читаемости кода можно указывать имя (название) соответствующей процедуры также перед оператором endp.
имя_процедуры proc
…
тело процедуры (код)
…
ret
имя_процедуры endp
Необходимо понимать, что фактически имя процедуры в ассемблере является указателем на процедуру. Это позволяет организовать прямой и косвенный вызовы процедуры (адрес процедуры можно поместить в регистр, записать в блок памяти).
Работа с процедурами на примере программы goblin.com.
Процедуры man proc, woman proc, goblin proc идентичны (на примере woman proc):
Источник: assembler-code.com