В какой части программы описываются подпрограммы в языке паскаль

Цель работы: приобрести навыки в решении задач с использованием процедур, функций, подпрограмм.

Краткие теоретические сведения

При разработке программы иногда появляются повторяемые группы действий или возникает необходимость расчленить программу на функциональные модули, сделать ее структуру иерархической. Для этого во всех языках программирования существуют средства организации подпрограмм.

Для решения сложной задачи рекомендуется сначала алгоритм, а затем и программу разрабатывать «сверху вниз», от более общего пла­на к детальному. В таком виде главная программа соответст­вует укрупненному плану решения задачи, а ее команды — вызову соответствующей подзадачи, реализованной в виде под­программы.

Идя по такому пути создания программы, можно отдельные мелкие функции реализовывать сначала в виде не­больших подпрограмм, проверять их на контрольных примерах и, только убедившись в правильности работы, включать в состав основной программы. Это удобнее проделывать, имея в распоряжении язык, позволяющий полностью выделить под­программу из текста основной программы в виде отдельного модуля. Использование подпрограмм дает возможность разра­батывать программу по частям, поручать реализацию больших проектов группам разработчиков. В состав групп входят спе­циалисты данной науки или производства, из области которой решается задача, разрабатывающие алгоритм и структурирую­щие данные, а также программисты, объединяющие алгоритм и данные в программе для компьютера.

Урок 21. Подпрограммы. Функции на языке Паскаль

В Паскале подпрограмма является частью основной про­граммы, ее описание располагается между разделом var глав­ной программы и ее программным блоком (первым begin). Подпрограмм может быть несколько, их описания располага­ются в произвольном порядке одно за другим. Описание подпрограммы можно сравнить с записываемой в математике формулой «в общем виде», в которую при расчетах подставля­ются конкретные значения. Поскольку далеко не каждую за­дачу удается свести к некоторой формуле, но всегда можно за­писать алгоритм ее решения, подпрограмма — это та же инст­рукция по решению некоторой задачи. Как и формула, под­программа используется для различных данных, передаваемых из главной программы или других подпрограмм.

Подпрограмма — это специальным образом оформленный алго­ритм, который может многократно использоваться при реше­нии более общей задачи.

В Паскале различают два вида подпрограмм: процедуры и функции. Основное различие между ними заключается в том, что процедура получает в результате своей работы любое ко­личество данных, а функция — только одно значение.

Подпрограммы имеют структуру, аналогичную главной про­грамме. Они содержат заголовок со специальным словом — признаком подпрограммы, имя и, при необходимости, списки передаваемых на обработку и получаемых из подпрограммы данных. Затем могут располагаться все имеющиеся в главной программе разделы описаний: меток, констант, типов и пере­менных.

В этих разделах описываются данные, используемые только внутри подпрограммы и являющиеся промежуточными при ее выполнении. Такие данные называются локальными. В подпрограмме могут участвовать переменные, описанные в главной программе. Эти данные называются глобальными, их значения и подпрограмма, и главная программа берут из об­щей памяти.

Подпрограммы, процедуры и функции

При работе с подпрограммой всегда выделяется два этапа: описание подпрограммы, т. е. запись алгоритма решения за­дачи в специальной форме, и вызов подпрограммы — переда­ча ей данных на обработку из вызываемой программы, кото­рая, в свою очередь, может быть подпрограммой, и получение обратно результатов.

Рассмотрим способы организации подпрограмм в Паскале.

Процедура — подпрограмма, имеющая любое количество входных и выходных данных. Процедура может быть описана без параметров и с параметрами. Параметры — это данные из заголовка процедуры, как передаваемые ей на обработку, так и получаемые в виде результатов. Таким образом, с помощью параметров происходит обмен информацией между процеду­рой и вызывающей ее программой.

Процедуры без параметров.

Описание процедуры имеет вид:

procedure имя;

Процедура без параметров может реализовывать любой ал­горитм. Все переменные, над которыми производят действия операторы процедуры, определяются в вызывающей програм­ме, им присваиваются необходимые для выполнения процеду­ры значения.

Рассмотрим пример вычисления наименьшего общего кратного двух натуральных чисел НОК (X, Y), которое можно вычислить, используя наибольший общий делитель этих чи­сел, по формуле:

При составлении программы оформим как процедуру без параметров программу Р7 — вычисление НОД по алгоритму Евклида. Результат работы процедуры будет заносится в ячей­ку с именем М, переменная М описана как глобальный пара­метр и используется и главной программой, и процедурой.

Читайте также:
Как работать в программе мульти пульти

В программе будем вычислять НОК нескольких чисел, занеся их в массив С. Этот массив формируется в разделе констант главной программы. Если данные определяются в разделе констант, то они не требуют дополнительного описания в разделе переменных (var). Переменная Х сначала содержит зна­чение первого числа, а затем ей присваивается результат — НОК двух первых чисел. Переменная Y имеет своим значени­ем второе число из пары, для которой вычисляется наимень­шее общее кратное. Таким образом, при каждом шаге цикла вычисляется НОК двух чисел, первое из которых Х содержит результат предыдущего шага.

Вызов процедуры НОД вычисления наибольшего общего делителя осуществляется только по имени: NOD;

Рассмотрим пример выполнения программы вычисления НОК нескольких чисел.

Источник: studfile.net

Процедуры и функции — создание подпрограмм в Pascal

Использование подпрограмм является главной особенностью структурного программирования. Подпрограмма представляет собой составной оператор, объединяющий ряд простых операторов. При этом этот «составной оператор» оснащается именем и внешне оформляется как программа. В подпрограмме бывают свои константы и переменные, невидимые из глобальной области (основной программы).

Зачем нужны подпрограммы? Их использование удобно, когда в программе несколько раз решается одна и та же подзадача, но для разных наборов данных. Кроме того, использование подпрограмм естественно для человека, которому проще воспринимать логически связанные объекты, чем множество разнородных данных.

Программный код подпрограммы описывается единожды перед телом основной программы, затем из основной программы можно им пользоваться многократно. Обращение к этому программному коду из тела основной программы осуществляется по его имени (имени подпрограммы).

В большинстве языков структурного программирования подпрограммы существуют только в виде функций. В Паскале же их два типа: процедуры и функции. Их заголовки выглядят соответственно так:

procedure имя (параметры);

function имя (параметры): тип результата;

Между функциями и процедурами есть существенное отличие. Значение, полученное в результате выполнения кода функции, жестко соотносится с ее именем путем присвоения этому имени конкретного значения. Тип, который может принять вычисляемое значение, указывается в заголовке функции ( тип результата ).

Параметры не являются обязательным компонентом, однако их использование повышает гибкость процедуры или функции, т.к. они перестают быть привязанными к определенным данным.

Когда процедура или функция вызываются, то в скобках вместо формальных параметров, указываются фактические параметры (аргументы). Это могут быть либо конкретные значения, либо переменные из основной программы.

Тело подпрограммы, как и любого составного оператора на языке Паскаль, ограничивается скобками begin и end .

Примеры определения процедуры и ее вызововы из основной программы:

procedure box (s: char; w, h: integer); var i,j:integer; begin for i := 1 to h do begin for j := 1 to w do write(s); writeln end; end; begin box (‘+’, 10, 5); box (‘$’, 20, 3); end.

Результат выполнения программы:

Примеры определения функции и ее вызовов из основной программы:

var num: longint; function digits (n: longint): byte; var i: byte; begin i := 0; while n > 0 do begin n := n div 10; i := i + 1 end; digits := i end; begin write(‘Введите положительное число: ‘); readln(num); num := digits(num); writeln (‘Количество разрядов = ‘, num); end.

Результат выполнения программы:

Введите положительное число: 346114 Количество разрядов = 6

Формальные и фактические параметры

Формальные параметры – это наименование переменных, через которые передается информация из программы в подпрограмму, либо из подпрограммы в программу.

Когда процедура или функция вызывается в нее передаются фактические параметры.

При вызове подпрограммы машина производит следующие действия. Устанавливает взаимно однозначное соответствие между фактическими и формальными параметрами, затем управление передает подпрограмме. После того, как она завершит свою работу, управление передается вызывающей программе на оператор, следующий за вызовом подпрограммы.

Соответствие между фактическими и формальными параметрами должно быть следующим:
а) число фактических параметров должно быть равно числу формальных параметров;
б) соответствующие фактические и формальные параметры должны совпадать по порядку следования и по типу.

Соответствующие параметры не обязательно должны быть одинаково обозначены.

Параметры процедур могут быть четырех видов: параметры-значения, параметры-переменные, параметры-процедуры, параметры-функции.

Параметры-значения

Для параметров-значений машина при вызове процедур производит следующие действия: выделяет место в памяти для каждого формального параметра, вычисляет значение фактического параметра и записывает его в ячейку, соответствующую формальному параметру.

Читайте также:
Как сделать Microsoft powerpoint программой по умолчанию

Если фактический параметр есть имя переменной, например, r , то значение этой переменной пересылается в соответствующий формальный параметр, например, a . На этом всякая связь между a и r обрывается.

Если даже фактический и формальный параметры одинаково обозначены, в памяти ЭВМ эти параметры занимают разные ячейки. Это полезно знать, чтобы не допустить распространенной среди начинающих программистов ошибки – пытаться передать информацию из процедуры в вызывающую программу через параметр-значение. Пример:

var i: integer; procedure p(i: integer); begin i := i * 2 end; begin i := 2; p(i); writeln(‘ i = ‘, i); end.

В программе происходит засылка числа 2 в ячейку, отведенную для переменной i , затем идет обращение к процедуре p с фактическим параметром i = 2 . При этом значение 2 пересылается в другую ячейку, отведенную для формального параметра i . В этой ячейке после выполнения оператора i := i * 2 появляется число 4. Но после возврата из процедуры на оператор writeln программа «знает» только одну переменную i , которая по-прежнему содержит число 2. Поэтому программа выведет i = 2 .

Если формальный параметр есть параметр-значение, то соответствующим фактическим параметром должно быть выражение того же типа, что и формальный параметр.

Параметры-переменные

Если перед именем формального параметра стоит ключевое слово var, то такой параметр есть параметр-переменная. Примерами таких параметров служат x1 и x2 в заголовке:

procedure sq(a, b, c: real; var x1, x2: real);

Фактический параметр, соответствующий параметру-переменной, может быть только переменной (не константой и не выражением).

При вызове процедур (функций) параметры-переменные обрабатываются так: для формального параметра используется именно та ячейка, которая содержит соответствующий фактический параметр.

Через параметр-переменную можно передать результат выполнения процедуры:

var a, b: integer; procedure h(x: integer; var y: integer); begin x := x + 1; y := y + 1; writeln(x, y) end; begin a := 0; b := 0; h(a, b); writeln(a, b); end.

Результаты, выдаваемые процедурой h – это 11; основная ветка программы выводит 01.

Разберем пример. Фактический параметр a соответствует формальному параметру-значению x , а фактический параметр b – формальному параметру-переменной y . Под параметры a и x отведены две разные ячейки памяти, под b и y – одна и та же ячейка.

При вызове h(a, b) из ячейки a пересылается значение 0 в ячейку x , а в ячейку y засылается адрес ячейки b , содержащей 0, т.к. в процедуре h параметр x – это параметр-значение, а y – параметр-переменная.

При выполнении оператора x := x + 1 в ячейку x прибавляется 1 и в ячейке x окажется 1, а в ячейке a по-прежнему 0.

Выполнение оператора y := y + 1 имеет следующий смысл: «взять число из ячейки, адрес которой находится в y (т.е. из ячейки b ), прибавить 1 и заслать в ту же ячейку (т.е. в b ).

Поэтому в результате выполнения оператора y := y + 1 значение ячейки b станет 1. Оператор печати из процедуры выдаст содержимое ячейки x и ячейки y , т.е. 1 и 1. Оператор печати в программе напечатает содержимое a , которое осталось равным 0, и содержимое ячейки b , которое теперь равно 1.

Процедуры в Паскале допускают рекурсию, т.е. процедура может вызвать сама себя.

Если в процедуре p есть обращение к процедуре q , описанной ниже, то перед описанием p процедура q декларируется как forward: после заголовка процедуры q ставится двоеточие, а затем ключевое слово forward . В этом случае параметры процедуры описываются только в операторе с forward . В заголовке самой процедуры параметры опускаются.

procedure q(x: t1): forward; procedure p(x: y); begin q(a) end; procedure q; begin p(b) end;

Источник: pas1.ru

Урок 13. Процедуры и функции в Pascal. Часть 2

Процедуры и функции

Итак, сегодня мы с вами на learnpascal.ru продолжаем изучать функции и процедуры — важнейшую часть структурного программирования. В этом уроке мы рассмотрим только процедуры и функции. И даже не будем практиковаться, оставим это для последующих уроков.

Структура программы.

Программы на языке Паскаль состоят из заголовка программы, раздела описаний и тела программы. Раздел описаний может включать следующие подразделы: меток, констант, типов, переменных, процедур и функций. Последовательность подразделов в структуре программы произвольная, но естественно, что если вводится переменная нового типа, заданного в Туре, то подраздел Туре предшествует подразделу Var. Принцип нашего языка программирования «то, что используется, должно быть описано» сохраняется и для раздела описаний.

program ; label ; const ; type ; var ; ; begin ; end.

Читайте также:
Что значит код ошибки 604000 в программе xmeye

Структура процедуры и функции

Структура процедуры.

До этого момента времени мы использовали из раздела описаний только описание переменных и типов. На этом занятии мы начнем изучать процедуры.

Структура процедуры повторяет структуру программы. Отличия выделены «полужирным» шрифтом.

procedure (); label ; const ; type ; var ; ; begin ; end;

Напишу простую программу с процедурой, складывающей два числа.

var a, b, c: integer; procedure sum(x, y: integer; var z: integer); begin z := x + y; end; begin write(‘Введите два числа: ‘); readln(a, b); sum(a, b, c); writeln(c); end.

Итак, что вы видите? Точнее, что вам не понятно в данной программе? Я думаю, что вы не можете понять, почему перед z стоит var, а перед x, y — нет. Но всему свое время.

Процедуры и функции

Обратимся к примеру, приведенному на рисунке выше. Слева приведен фрагмент текста основной программы, справа — процедура. Как только в теле программы объявляется имя процедуры с параметрами, выполнение «главного» тела прекращается, и управление вычислительными процессами передается процедуре. После выполнения процедуры осуществляется возврат на оператор основной программы, следующий за вызовом процедуры.

Немножко теории:
В любой программе все переменные делятся на два типа: локальные и глобальные. В нашей программы переменные а, b, с — глобальные, а х, у, z — локальные. Глобальные переменные — это переменные из раздела описаний основной части программы, а локальные — из раздела описаний процедур и функций. Локальные переменные существуют только в течение времени работы процедуры, определяются (создаются) при её вызове и исчезают после завершении работы процедуры.

В программе определены переменные a, b, c. В процедуре x, y, z — её параметры, и они являются переменными процедуры. Причем между х, у и z существует большая разница.

Поясню ее очередным рисунком.

Параметры

Параметры.

При описании процедуры указывается список формальных параметров. Каждый параметр является локальным по отношению к описываемой процедуре, к нему можно обращаться только в пределах данной процедуры (в нашем примере х, у, z — формальные параметры). Фактические параметры — это параметры, которые передаются процедуре при обращении к ней (а, b, с — фактические параметры). Число и тип формальных и фактических параметров должны совпадать с точностью до их следования.

Параметры-значения.

Другими словами, передача параметров по значению. Копия фактического параметра становится значением соответствующего формального параметра. Внутри процедуры можно производить любые действия с данным формальным параметром (допустимые для его типа), но эти изменения никак не отражаются на значении фактического параметра, то есть каким он был до вызова процедуры, то таким же и останется после завершения ее работы (х, у — параметры-значения).

Параметры-переменные.

Другими словами, передача параметров по ссылке. Это те формальные параметры, перед которыми стоит идентификатор var. Передается адрес фактического параметра (обязательно переменной), после этого формальный
параметр становится его синонимом. Любые операции с формальным параметром выполняются непосредственно над фактическим параметром.

Структура функции

Функция выглядит почти так же, как и процедура. Почти единственное отличие в том, что заголовок функции начинается с ключевого слова Function и кончается типом возвращаемого данной функцией значения.

function (): ;

Кроме того, в теле функции обязательно должен быть хотя бы один оператор присваивания, где в левой части стоит имя функции или переменная result, а в правой — ее значение.

var a, b, c: integer; function sum(x, y: integer): integer; begin sum := x + y; end; begin readln(a, b); writeln(sum(a, b)); end.
var a, b, c: integer; function sum(x, y: integer): integer; begin result := x + y; end; begin readln(a, b); writeln(sum(a, b)); end.

Небольшое послесловие:

Каждая процедура должна иметь одну точку входа и одну точку выхода (то есть использование goto, break, exit нежелательно), использование глобальных переменных в процедуре следует свести к минимуму, взаимодействие с процедурой должно осуществляться (по возможности) только через параметры.
Постепенно вы должны отказаться от технологии неструктурированного программирования. Сегодня мы с вами осваиваем структурную технологию разработки программ, при этом на каждом этапе текущая задача разбивается на ряд подзадач, определяя тем самым некоторое количество отдельных подпрограмм. Концепция процедур и функций — один из механизмов второго витка развития технологий программирования, а именно, структурного проектирования.

Источник: learnpascal.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru