Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Структура программы, содержащей процедуру (функцию)
program <имя>; <описательная часть основной прогаммы>; procedure <имя процедуры>; (function <имя функции>;) <описательная часть процедуры/функции>; begin <исполнительная часть процедуры/функции>; end; begin <исполнительная часть основной программы>; end.
Процедуры ( функции ) могут содержать любые операторы языка Паскаль и повторяют структуру основной программы, только текст процедуры ( функции) - заканчивается «;».
Процедуры
Процедура – это независимая именованная часть программы, которую после однократного описания можно многократно вызывать по имени. Первая строка любой процедуры:
procedure <имя>(<список формальных параметров>);
<имя> - уникальный идентификатор, строится по правилам составления имен простых переменных; <список формальных параметров> - список имен переменных с указанием их типа, передающих информацию в процедуру и возвращающих результаты в основную программу. Обращение к процедуре из основной программы:
<имя> (<список формальных параметров>);
<список фактических параметров> - список переменных или констант, разделенных запятыми. Например:
procedure prim(x:real; var s:integer; z,y:integer);
Описан заголовок процедуры где: x, z, y - передают информацию в процедуру; s - передает информацию в процедуру и возвращает результат - в основную (можно сказать процедура изменяет значение s, хотя значение s в основной программе может быть до процедуры и не определено). Чтобы формальный параметр возвращал результат в основную, его необходимо описать с использованием служебного слова var. Обращение к процедуре из основной: prim (x, s, z, y); ( имена фактических параметров x, s, z,y - совпадают с именами формальных) или prim (a, s1, b, 5); ( именами фактических параметров a, s1, b – не совпадают с именами формальных, а последний фактический параметр является числовой константой) Формальные и фактические параметры должны совпадать по типу, количеству и порядку следования. Фактические параметры должны быть описаны в основной программе. Они называются глобальными переменными и доступны как в основной программе, так и в процедуре. Формальные параметры отдельно в процедуре не описываются. Время существования глобальных переменных – от начала и до конца работы программы. Промежуточные переменные, которые используются только в процедуре, описываются в процедуре и называются локальными. Локальные переменные не доступны в основной программе. Время существования локальных переменных – от начала и до конца работы процедуры, в которой они описаны.
Вложенные процедуры
Директива forward
Если одна подпрограмма использует другую, а та, в свою очередь, использует первую, возникает проблема размещения этих процедур в программе. Какую из них поместить в программе первой? В этих случаях прибегают к директиве forward. Например: procedure pp1(a,b:integer):forward; procedure pp2(c: real); {Вторая процедура} var x,y:integer; begin … pp1(x, y); end; procedure pp1; {Первая процедура} var z:real; begin … pp2 (z); end; …
Задача.
Задан одномерный массив вещественных чисел. Найти максимальный элемент массива и определить его номер. Составим программу с использованием двух процедур: процедура ввода элементов массива; процедура поиска максимального элемента и определение его номера. Для передачи массива в процедуру введем пользовательский тип mas.
program PP; type mas=array[1..100] of integer; {пользовательский тип} var { глобальные переменные } a:mas; max:real; n,max,kmax:integer;
procedure input_mas(n:integer ; var a:mas ); var i:integer; {локальная переменная} begin for i:=1 to n do readln(a[ i ]); end; procedure max_m(n:integer; a:mas; var max,kmax:integer ); var i:integer; begin max:=a[1];kmax:=1; for i:=1 to n do if a[i]>max then begin max:=a[i]; kmax:=i; end; end; begin writeln(‘ Введите n<=100’) ; readln( n ); writeln (‘ Введите элементы массива ‘); input_mas(n,a); max_m(n,a,max,kmax ); writeln(‘max=’,max,‘kmax=’,kmax); readln; end.
Функции
Если результатом подпрограммы является только одно значение, то имеет смысл оформить такую подпрограмму в виде функции. Первая строка любой функции:
function <имя >(<список формальных параметров> ):<тип>;
<список формальных параметров> - список имен переменных с указанием их типа, передающих информацию в функцию; <имя> - возвращает результат в основную программу; <тип> - тип возвращаемого результата. Обращение из основной программы к функции возможно в структуре какого либо оператора, например оператора присваивания:
<переменная>:= <имя> (список фактических параметров);
Функция возвращает в основную программу только один результат через переменную, являющуюся именем функции. Эта переменная не должна быть описана в основной программе. В описательной части функции этой переменной должно быть присвоено какое-либо значение, иначе функция не возвращает никакого значения.
Задача. Составить программу вычисления n! с использованием функции. n! = 1* 2 * 3 * …* n
program factorial; {описательная часть основной программы} var n,k:integer; function fun(k:integer):integer; {описательная часть подпрограммы} var p,i:integer; begin {исполнительная часть подпрограммы} p:=1; for i:=1 to k do p:=p*i; fun:=p; end; { исполнительная часть основной программы } begin writeln('введите n'); readln(n); for k: = 1 to n do writeln(fun(k)); end.
n, k - глобальные переменные. p, i - локальные переменные. fun - имя функции, возвращает результат в основную программу. Имя функции в теле функции в операторах присваивания может стоять только слева от знака «:=» , поэтому использована дополнительная переменная p для подсчета произведения.
Пример программы с использованием подпрограмм Задача. Задан двумерный массив целых чисел. Определить количество четных чисел в массиве. Составим: процедуру ввода элементов массива; функцию подсчета количества четных чисел; процедуру вывода двумерного массива в виде матрицы.
program pp_1; type mas=array[1..10,1..10] of integer; var a:mas; n,m,i,j:integer ; { Процедура ввода массива } procedure input_mas(n,m:integer; var a:mas); begin for i:=1 to n do for j:=1 to n do readln(a[i,j]); end; {Функция подсчета количества нечетных чисел} function kol( n,m:integer; a:mas ):integer; var k:integer ; begin kol:=0; for i:=1 to n do for j:=1 to n do if not odd( a[ i,j ] ) then k:=k+1; kol:=k; end; {Процедура вывода матрицы} procedure print_mas(n,m:integer; a:mas); begin for i:=1 to n do begin for j:=1 to n do write( a[i,j],‘ ‘); writeln; end; end; { Исполнительная часть основной программы } begin writeln(‘Введите n<=10 , m<=10’); readln (n,m); writeln(‘Введите элементы массива по строкам’); input_mas(n,m,a); writeln(‘Исходная матрица’); print_mas(n,m,a); writeln(‘Количество нечетных чисел =’,kol(n,m,a)); readln; end. Вопросы для самоконтроля
|
|||||||||||||||||
Последнее изменение этой страницы: 2018-04-12; просмотров: 517. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |