Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Структура программы, содержащей процедуру (функцию)




 

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 для подсчета произведения.

 

Пример программы с использованием подпрограмм

Задача.

Задан двумерный массив целых чисел. Определить количество четных чисел в массиве.

Составим: процедуру ввода элементов массива;

функцию подсчета количества четных чисел;

процедуру вывода двумерного массива в виде матрицы.

 

  1. Таблица идентификаторов

 

Наименование переменной Обозначения в программе
1 Имя массива a
2 Количество строк n
3 Количество столбцов m
4 Индексы массива I,j

 

  1. Листинг программы.

 

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.

Вопросы для самоконтроля

  1. В каких случаях прибегают к построению подпрограмм?
  2. В каком месте программы располагаются функции или процедуры?
  3. Что такое процедура?
  4. Какова структура процедуры?
  5. Как передается информация в процедуру?
  6. Каким образом возвращаются результаты работы процедуры в основную программу?
  7. Какое соответствие должно быть между формальными и фактическими параметрами?
  8. Какие переменные называются глобальными? Время существования глобальных переменных?
  9. Какие переменные называются локальными? Время существования локальных переменных?
  10. Когда используют директиву forward?
  11. В каких случаях целесообразно прибегать к построению функций?
  12. Как передается информация в функцию?
  13. Каким образом возвращается результат работы функции в основную программу?

 










Последнее изменение этой страницы: 2018-04-12; просмотров: 459.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...