Подпрограммы, определенные пользователем в языке программирования Pascal

Язык программирования Turbo Pascal. Подпрограммы, определенные пользователем, их классификация и типы, оценка возможностей, процедуры и функции. Область действия идентификаторов. Способы обмена информацией. Решение типового задания на языке Паскаль.

Рубрика Программирование, компьютеры и кибернетика
Вид реферат
Язык русский
Дата добавления 21.03.2012
Размер файла 227,3 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Реферат

Подпрограммы, определенные пользователем в языке программирования Pascal

Введение

В широком смысле язык программирования - это фиксированная система обозначений и правил для алгоритмов и структур данных. Основой для языка программирования Pascal является латинский алфавит, десятичные цифры и правила, используемые для написания программ.

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

Данное учебное пособие призвано помочь развить навыки логического и алгоритмического мышления и изучить возможности использования процедур и функций при написании программ на языке Pascal. Данный язык был выбран автором для обучения основам программирования не случайно, ведь именно Pascal один из языков программирования, который помогает писать «структурированные» программы в таком виде, в котором структура программы должна непосредственно отражать структуру задачи. Эта особенность языка Pascal, а также его достаточная простота из-за интуитивной понятности его конструкций, позволила языку завоевать прочное место среди языков программирования. Современным достижением программирования является признание преимущества структурированных программ. Вот почему Pascal широко используется инженерами и научными работниками, является официальным языком международных олимпиад по информатике.

В настоящее время существует достаточно много версий данного языка. Наибольшее распространение получила версия языка, разработанная в 1992 году фирмой Borland International (Borland Pascal 7.0 и Turbo Pascal 7.0). Дальнейшее развитие языка привело к появлению Delphi - языка визуального программирования (фирма Borland). Освоение основ языка Pascal является необходимым условием для изучения Delphi - одного из наиболее мощных в настоящее время языков программирования.

Пособие состоит из Введения, трех глав и списка литературы.

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

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

1. Теоретическая часть

В данной работе рассмотрим:

- основы программирования на языке Turbo Pascal;

- подпрограммы, определенные пользователем;

- классификацию (процедуры и функции);

- параметры;

- классификацию параметров на формальные и фактические;

- область действия идентификаторов на примере блоков;

- способы обмена информацией;

1.1 Язык программирования Turbo Pascal

программирование паскаль язык пользователь

Pascal - это язык программирования, разработанный Никлаусом Виртом в 1970 в качестве языка обучения структурному программированию. Название языку дано в честь выдающегося французского математика, физика, литератора и философа Блеза Паскаля.

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

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

В качестве букв используются прописные и строчные буквы латинского алфавита и знак подчеркивания; в качестве цифр - арабские цифры от 0 до 9.

При написании программ применяются специальные символы: +, -, *, /, =, <, >, [], (), @, {},:,;, ', # (номер), $ (знак денежной единицы), ^ (тильда), пробел, точка и запятая.

Комбинации специальных символов могут образовывать составные символы:= (присваивание), <> (не равно). (диапазон значений), <= (меньше или равно), >= (больше или равно), (* *) - альтернатива {}, (.) - альтернатива [].

Неделимые последовательности знаков алфавита образуют слова, отделенные друг от друга разделителями и несущие определенный смысл в программе. Разделителем может служить пробел, символ конца строки, комментарий. Слова подразделяются на зарезервированные, стандартные идентификаторы и идентификаторы пользователя.

Зарезервированные слова являются составной частью языка и их нельзя использовать в качестве идентификаторов. В языке Паскаль зарезервированными являются следующие слова: and, array, begin, case, const, div, do, downto, else, end, file, for, forward, function, goto, if, in, label, mod, nil, not, of, or, packed, procedure, program, record, repeat, set, shl, shr, string, then, to, type, unit, until, uses, var, while, with, xor.

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

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

Структура системы программирования Turbo Pascal:

Программный блок, состоящий из 2 разделов:

1. Раздел описаний, в котором должны быть описаны все идентификаторы, встречающиеся в программе. Он представляет собой:

· список имен подключаемых библиотечных модулей (определяется зарезервированным словом uses);

· описание меток;

· описание констант;

· определение типов данных;

· описание переменных;

· описание процедур и функций;

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

2. Раздел операторов.

Данный раздел начинается со служебного слова Begin и заканчивается служебным словом End. Далее задаются действия над объектами программы, введенными в разделе описаний. Операторы, посредством которых эти действия производятся, разделяются точкой с запятой. После последнего слова End ставится точка.

Для лучшего восприятия текста программы и поиска ошибок рекомендуется следующая схема:

· зарезервированные слова program, procedure, function и т.д. пишутся строчными буквами;

· идентификаторы начинаются с прописных букв;

· операторы записываются строчными буквами;

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

Program <имя>(input, output); - заголовок

Uses <имя1, имя2..>; - список подключаемых библиотечных модулей

Label…; - раздел описания меток

Const…; - раздел описания констант

Type…; - раздел описания типов данных

Var…; - раздел описания переменных

Procedure <имя>; - описание процедур и запись их операторов

<основная часть процедуры>;

Function <имя>; - описание функций

<основная часть функции>;

Begin

<основная часть программы >

End.

1.2 Подпрограммы, определенные пользователем

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

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

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

Подпрограмма - это последовательность операторов, которые определены и записаны только в одном месте программы, однако их можно вызвать для выполнения из одной или нескольких точек программы.

Подпрограммы по структуре сходны с программой, но они обязательно, в отличии от программы, имеют оригинальное имя, которое указывается в заголовке. Подпрограммы описываются в разделе описаний, использующих (вызывающих) их программ (или подпрограмм). Обращение к подпрограмме по ее имени называется вызовом подпрограммы. Сразу после вызова подпрограммы начинают выполняться входящие в нее операторы; после выполнения последнего из них управление передается обратно в основную программу. Внутри подпрограммы, однако, может содержаться обращение к другим подпрограммам или к самой себе (рекурсивный вызов). Каждая подпрограмма определяется уникальным именем.

1.3 Классификация

В языке Паскаль имеется два вида подпрограмм - процедуры и функции. Все процедуры и функции Turbo Pascal можно разделить на две группы:

· стандартные процедуры и функции языка Turbo Pascal;

· процедуры и функции, определенные пользователем.

Первые входят в состав языка и вызываются для выполнения по строго фиксированному имени. Их текст скрыт от программиста, и он выступает по отношению к ним как пользователь готовых подпрограмм. Вторые разрабатываются и именуются самим пользователем. Все стандартные средства расположены в специализированных библиотечных модулях (SYSTEM, CRT, DOS, GRAPH, OVERLAY, PRINTAER и т.д.), которые имеют системные имена. Модуль SYSTEM подключается по умолчанию, все остальные при необходимости могут быть подключены с помощью зарезервированного слова USERS:

users Crt, Dos, Printer;

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

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

При вызове процедур и функций необходимо соблюдать следущие правила:

· количество фактических параметров должно совпадать с количеством формальных;

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

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

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

Отличие процедуры от функции:

1. Функция в отличие от процедуры возвращает единственное скалярное значение

2. Результат вычисления функции присваивается имени, а процедуре входит в список параметров.

3. Имя функции имеет тип.

4. Обращение к функции представляет операнд, а процедуры оператор.

1.3.1 Процедуры в языке Turbo Pascal

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

Структура процедуры на языке Turbo Pascal имеет следующий вид:

procedure <имя процедуры>(<описание формальных

параметров>);<директивы>;

{блок описания локальных меток, констант, типов

переменных, процедур и функция низшего уровня}

begin

{тело процедуры}

end;

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

<имя процедуры> (фактические параметры);

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

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

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

<имя процедуры> - идентификатор языка Turbo Pascal. При вызове процедуры формальные параметры заменяются фактическими параметрами. Формальные параметры резервируют место для фактических параметров. Через эти параметры происходит обмен данными процедуры с основной программой. Имена формальных параметров выбираются произвольно. При обращении к процедуре из основной программы количество и порядок следования фактических параметров должен в точности соответствовать количеству и порядку следования формальных параметров в заголовке процедуры. В противном случае обращение к процедуре может привести к ошибке. В частности, ошибка может возникнуть из-за несовпадения типов формального и фактического параметра.

Заголовок процедуры может выглядеть так:

procedure GG (a, b, c:integer); вызываться так: GG (3, n, m)

Здесь a, b, c-формальные параметры, а 3, n, m-фактические параметры

Таким образом в процедуру передаются значения: a=3, b=n, c=m

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

Например:

Procedure express (a, b, c: real; var x, y:real);

Var

z: real;

begin

z:=a+ b+ c;

x:=sqr(z);

y:=sqrt(z);

end;

Формальные входные параметры a, b, c принимают значения соответствующих фактических параметров a=7.6; b=6.8; c=9.5.

При этих значениях выполняется процедура. Результатом выполнения процедуры являются x, y, которые передают свои значения соответствующим фактическим параметрам x1, y1. Таким образом в основной программе будем иметь x1=20, y1=22.

В качестве фактических параметров могут быть константы, переменные, выражения, массивы. В качестве формальных параметров могут быть только переменные (константы и выражения недопустимы).

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

· Dec(i); {i:=i-1}

· inc(i); {i:=i+1}

· GotoXY (i, j); {перемещение курсора в указанную точку экрана с координатами i, j}

· str (x, S); {идентификатор численного типа x переводит в строковую переменную S: x>S.} {Требуется модуль Crt}

· Clrscr; {очистка экрана} {Требуется модуль Crt}

1.3.2 Функции в языке Turbo Pascal

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

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

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

function <имя функции>(<описание формальных

параметров>); <тип результата>; <директивы>;

{блок описания локальных меток, констант, типов,

переменных, процедур и функций низшего уровня}

begin

{раздел операторов}

<имя функции>:=<результат>

end;

Функция, также как и процедура, вызывается по ее имени:

<имя функции>(<фактические параметры>)

В теле функции обязательно должна быть хотя бы команда присвоения такого вида:

<Имя функции>:=<Выражение>;

Вызов функции можно делать непосредственно внутри выражения. При вызове функции тип не указывается.

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

Пусть имеется функция вычисления тангенса угла б:

function Tangent (alpha: real): real;

begin

Tangent:=sin(alpha)/cos(alpha)

{alpha - значение угла в радианах}

end;

Вызвать функцию можно следующим образом:

Tangent(Pi);

Здесь Pi - это фактический параметр функции, который в свою очередь является стандартной функцией языка Turbo Pascal возвращающей число р. Таким образом, в функции будем иметь следующее значение:

alpha = 3.1415926535897932385.

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

Пример.

Программа, в которой используется функция, которая возвращает значение: TRUE или FALSE, вот такого выражения - (4>12)<(5=x)

Function proverka: boolean; {начало описания функции}

Var

x:integer;

begin

write ('Введите число x: ');

readln(x);

proverka:=(4>12)<(5=x);

end; {конец описания функции}

begin

writeln(proverka); {вызов функции из основной программы}

end.

Итак, имя функции даем любое (например, proverka). Теперь, параметров нет, значит их не пишем, а пишем тип. Тип boolean - тип который возвращает значения TRUE или FALSE. Затем нужно описать переменную x (ее можно было описать и в основной программе). После этого пишем команды в самой функции и присваиваем значение выражения самой функции. Для того, чтобы функция возвращала какое-либо значение нужно в самой функции присвоить нужное значение.

Стандартные функции Турбо Паскаля

· abs(x); {модуль, абсолютная величина}

· exp(x); {еx - экспонента}

· sqr(x); {x2 - квадрат числа}

· sqrt(x); { - корень квадратный}

· ln(x); {вычисление натурального логарифма}

{ - вычисление логарифма по произвольному основанию}

{xa=exp (a*ln(x)) - возведение в степень}

· sin(x); {-вычисление синуса}

· cos(x); {-вычисление косинуса}

{tg(x) = sin(x)/cos(x) - вычисление тангенса}

{ctg(x) = cos(x)/sin(x) - вычисление котангенса}

· arctan(x); {вычисление арктангенса}

· round(x); {округление: x=4.9; y=round(x), ? y=5}

· trunc(x); {выделение целой части: x=4.9; y=trunc(x), ? y=4}

· i mod j; {остаток целочисленного деления 10 mod 3 > 1 {10:3=3 (1)}

· i div j; {целочисленное деление 10 div 3 > 3}

· chr(i); {по порядковому номеру i возвращает символ}

· ord(b); {функция, обратная предыдущей (возвращение порядкового номера)}

· int(r); {возвращение целой части числа}

· frac(r); {возвращение дробной части числа}

1.4 Параметры

программирование паскаль язык пользователь

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

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

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

Между формальными и фактическими параметрами должно быть полное соответствие:

- формальных и фактических параметров должно быть одинаковое количество;

- порядок следования фактических и формальных параметров должен совпадать;

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

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

var <имя праметра: имя типа>

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

Вызов процедуры производится оператором, имеющим следующий формат:

имя процедуры (список фактических параметров);

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

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

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

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

Два типа, скажем Т1 и Т2, являются тождественными, если является истинным одно из следующих утверждений: Т1 и Т2 представляют собой один и тот же идентификатор типа; Т1 объявлен как эквивалентный типу, тождественному Т2.

Второе условие означает, что Т1 не обязательно должен быть объявлен как непосредственно эквивалентный Т2. Следующее объявление типов:

Т1 = Integer;

Т2 = Т1;

Т3 = Integer;

Т4 = Т2;

означают, что Т1, Т2, Т3, Т4 и Integer являются тождественными типами. Следующие объявления типов

Т5 = set of Integer;

Т6 = set of Integer;

не определяют Т5 и Т6 как тождественные, поскольку set of Integer не является идентификатором типа. Две переменные, объявленные в одном и том же объявлении, например:

V1, V2: set of Integer;

имееют тождественные типы, поскольку их объявления не разделены. Объявления:

V1: set of Integer;

V2: set of Integer;

V3: Integer;

V4: Integer;

означают, что V3 и V4 имеют тождественный тип, а V1 и V2 нет.

1.5 Классификация параметров

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

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

Все формальные параметры можно разбить на четыре категории:

· параметры-значения (эти параметры в основной программе подпрограммой не меняются);

· параметры-переменные (эти параметры подпрограмма может изменить в основной программе);

· параметры-константы;

· параметры-процедуры и параметры-функции (т.е. параметры процедурного типа).

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

Тип формального параметра может быть практически любым, однако в заголовке подпрограммы нельзя вводить новый тип. Например, нельзя писать:

function Max (A: array [1..100] of real): real;

Чтобы правильно записать этот заголовок, следует в основной программе ввести тип-массив, а затем использовать его в заголовке:

type tArr = array [1..100] of real;

function Max (A: tArr): real;

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

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

Параметры - значения - используются для передачи исходных данных в подпрограмму. Формальные параметры при этом записываются через запятую с указанием их типов. Они получают значения фактических параметров, но не могут передавать свои значения фактическим параметрам.

Наиболее распространенный и простой способ. Параметр - обычная локальная переменная. Может использовать выражение. Любые действия внутри подпрограммы никак не отражаются на значениях переменной вне подпрограммы.

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

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

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

Описание:

<имя параметра>: <тип параметра>

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

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

procedure Inp (max, min: real; n:word);

function Mult (x, y:integer): real;

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

Inp (abs(z), - abs(t), 2*k);

M:= Mult (x+y, x-y);

M:= Mult (7, a div 3);

Пример. Функция вычисления максимального элемента в массиве. Пусть в основной программе определен тип-массив, массив этого типа и переменная целого типа type

tArr = array [1..100] of Integer;

var

Massiv: tArr;

Maxim: Integer;

Функция в этом случае может иметь вид:

function Max (Mas: tArr; N: Byte): Integer;

var Ma: Integer;

i: Byte;

begin

Ma:= Mas[l];

for i:= 2 to N do

f Ma < Mas[i] then

Ma:= Mas[i];

Max:= Ma end;

Теперь, например, для определения максимального числа из первых пяти чисел массива Massiv и записи его в переменную Maxim можно записать оператор:

Maxim: = Max (Massiv, 5);</p>

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

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

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

Описание:

var <имя параметра>: <тип параметра>

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

При передаче параметров-переменных в подпрограмму фактически через стек передаются их адреса в порядке, объявленном в заголовке подпрограммы. Следовательно, подпрограмма имеет доступ к этим параметрам и может их изменять.

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

Пример.

procedure MaxMin (A: tArr; var Max, Min: Real; N: Word);

Здесь Max, Min - параметры-переменные, А и N - параметры значения. Тип параметров-переменных может быть любым, включая и файловый. При вызове подпрограммы на месте параметра-переменной в качестве фактического параметра должна спользоваться переменная идентичного типа. Так, если формальный параметр имеет тип, определенный следующим образом:

type tArr = array [1..100] of Integer;

то и фактический параметр должен быть переменной или типизированной константой типа tArr.

Пример. Функция вычисления максимального элемента в массиве. Модифицируем подпрограмму, используя в качестве первого параметра параметр-переменную:

function Max (var Mas: tArr; N: Byte): Integer;

var Ma: Integer;

i: Byte;

begin

Ma:= Mas[l];

for i:= 2 to N do

if Ma < Mas[i] then

Ma:= Mas[i];

Max:= Ma

end;

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

1.5.3 Параметры-константы

Часто в качестве параметра в подпрограмму следует передать ту или иную переменную, но изменять ее подпрограмма не должна. В этом случае нежелательно передавать этот параметр как параметр-переменную. Можно его передать как параметр-значение, однако, если эта переменная имеет большой размер (массив, запись и т.д.), то копия такого параметра займет большую часть стека и даже может его переполнить. Это же приводит и к уменьшению быстродействия программы. В этой ситуации параметр лучше передать как параметр-константу. Такой параметр, если он структурированного типа, передается своим адресом, не предусматривается защита от его изменения. Использовать параметр-константу можно только в версии 7.0.

Описание:

const <имя параметра>: <тип параметра>

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

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

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

procedure elephant (const c123: integer;

i, j: integer;

a, b, c: real;

var f1: real);

Здесь c123 - параметр-константа, i и j - параметры-значения целого типа, a, b и c - параметра-значения вещественного типа, f1 - параметр-переменная вещественного типа.

Параметр-константа указывается в заголовке подпрограммы аналогично параметру-значению, но перед именем параметра записывается зарезервированное слово const. Действие слова const распространяется до ближайшей точки с запятой, т.е. в пределах одной группы.

Пример.

function NewString (const S: string): string;

Тип параметра-значения может быть любым за исключением файлового.

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

Параметр-константу нельзя передавать в другую подпрограмму в качестве фактического параметра.

Пример. Функция вычисления максимального элемента в массиве. Используем в качестве первого параметра параметр-константу:

function Max (const Mas: tArr; N: Byte): Integer;

var Ma: Integer;

i: Byte;

begin

Ma:= Mas[l];

for i:= 2 to N do

if Ma < Mas[i] then

Ma:= Mas [i];

Max:= Ma

end;

1.5.4 Параметры без типа

В Turbo Pascal можно использовать параметры-переменные и параметры-константы без указания типа. В этом случае фактический параметр может быть переменной любого типа, а ответственность за правильность использования того или иного параметра возлагается на программиста.

Пример.

function Equal (var Paraml, Param2; Len: Word): Boolean;

Здесь Param1, Param2 - параметры-переменные без типа (вместо них можно использовать, например, любые переменные простого типа, типа-массив, типа-запись и т.д.); Len - параметр-значение.

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

Пример. Функция вычисления максимального элемента в массиве. Рассмотрим другой вариант подпрограммы, используя в качестве первого параметра параметр-переменную без типа:

function Max (var Mas; N: Byte): Integer;
type

tArray = array [1..Maxint] of Integer;

{тип массива максимального размера}

var Ma: Integer;

i: Byte;

begin

Ma:= tArray(Mas) [1];

for i:= 2 to N do

if Ma < tArray(Mas) [i] then

Ma:= tArray(Mas) [i];

Max:= Ma

end;

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

1.5.5 Массивы и строки открытого типа

В версии 7.0 можно в качестве параметров-переменных использовать одномерные массивы и строки открытого типа, у которых не задаются размеры. В качестве фактического параметра в этом случае можно использовать массив или строку любого размера, однако массив должен состоять из тех же компонент, что и компоненты j открытого массива. Такие параметры введены для того, чтобы подпрограмма могла обрабатывать массив или строку любого размера. Фактический размер массива в этом случае может быть определен с помощью функции High. Открытый массив задается как и обычный массив, но только без указания типа индекса. Следует иметь в виду, что индексация элементов открытого массива всегда начинается с нуля, а максимальный индекс элемента равен значению функции High.

Пример. Функция вычисления максимального элемента в массиве. Рассмотрим вариант подпрограммы, используя в качестве передаваемого параметра массив открытого типа:

function Max (var Mas: array of Integer): Integer;

var Ma: Integer;

i: Byte;

begin

Ma:= Mas[0];

for i:= 1 to High(Mas) do {цикл до наибольшего индекса}

if Ma < Mas[i] then

Ma:= Mas[i];

Max:= Ma

end;

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

Разновидность открытого массива - открытая строка, которая может задаваться либо с помощью стандартного типа OpenString, либо с помощью типа string и использования ключа компилятора {$Р+} (см. п. 17.7.1), например заголовок процедуры, заполняющей каким-либо символом строку, может иметь вид:

procedure FillChar (var Str: OpenString; Ch: Char);

или

($p+)

procedure FillChar (var Str: string; Ch: Char);

1.5.6 Параметра-процедуры и параметры-функции

Параметры - процедуры - указываются после слова Procedure.

Параметры - функции - указываются после слова Function.

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

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

Для параметров-процедур и параметров-функций существуют те же правила, что и для других переменных процедурного типа: подпрограммы должны компилироваться с ключом ($F+) или иметь директиву far, не должны быть стандартными подпрограммами, не должны объявляться внутри других подпрограмм, не иметь директив inline или interrupt.

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

program EXAMPLE;

type

Func = function (X, Y: Integer): Integer;
($F+)

function Add (X, Y: Integer): Integer;

begin

Add:= X + Y

end;

function Multiply (X, Y: Integer): Integer;

begin

Multiply:= X * Y

end;

{$F-}

procedure PrintTable (A, B: Integer; Operation: Func);

{процедура печати таблицы}

var

i, j: Integer;

begin

for i:= 1 to A do

begin

for j:= 1 to В do

Write (Operation(i, j): 5);

WriteLn

end;

WriteLn

end;

begin {начало основной программы}

PrintTable (10, 10, Add);

PrintTable (10, 10, Multiply)

end.

1.6 Область действия идентификаторов

Имена в языках программирования принято называть идентификаторами. Есть идентификаторы переменных, констант, типов, функций и т.д.

Идентификаторы служат в качестве имен программ, модулей, процедур, функций, типов, переменных и констант. Идентификатором считается любая последовательность латинских букв или цифр, начинающаяся с буквы. Буквой считается также символ подчеркивания «_».

Например, a1, _h, b123 - идентификаторы, а 1a, ф2 - нет.

Любая подпрограмма представляет собой блок со своей областью описаний. Она может содержать внутри этого блока описания других процедур и функций, а также обращения к ним. Объекты, описанные внутри какого-либо блока, являются по отношению к нему локальными и не доступны внешним блокам. На них можно ссылаться только внутри блока, в котором они описаны. Под объектами понимаются имена констант, типов, переменных, процедур, функций. Объекты, описанные во внешних блоках и не описанные во внутренних, являются глобальными по отношению к внутренним и доступны как во внешних блоках, так и во внутренних. При совпадении имен глобальных и локальных переменных, локальные переменные отменяют действия глобальных в пределах области своего действия.

На рисунке 1.4.1 схематично представлены области действия отдельных идентификаторов:

Y - локальная переменная по отношению к блоку 4, недоступна в блоках 1,2,3.

K, L - локальная переменная для блока 2, недоступна в блоках1,3,4.

C - глобальная переменная по отношению к блоку 3, недоступна в блоках 1 и 2.

B, D - глобальные переменные для блоков 2,3,4. Доступны в блоках1,2,3,4.

T - общий тип.

Идентификатор А обозначает две разные переменные: А - областью действия которой являются блоки 1 и 2, и переменная А' - область действия которой блоки 3 и 4. То же самое с именем Х: одна переменная Х - с областью действия 1,2 и 3 блоки и переменная Х', которая действует только в блоке 4.

Рис. 1.4.1. Область действия отдельных идентификаторов

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

1.7 Способы обмена информацией

Обмен информацией с компьютером предполагает использование определенных средств ввода-вывода. В ЭВМ основным средством ввода является клавиатура, вывода - дисплей.

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

В языке Pascal она выглядит следующим образом:

Read (список переменных);

Например,

Var

A: Real; B: Integer; C: Char;

Begin

Read (A, B, C)

End.

Читается: «Ввести вещественную А, целую В и символьную С».

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

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

Примеры ввода данных с помощью процедуры ReadLn:

ReadLn (A, B, C);

ReadLn(X);

ReadLn(LogPer);

Процедура, которая позволяет выводить значения переменных (выражений) на экран, называется процедурой вывода.

В Pascal эта команда выглядит следующим образом

Write (список выражений)

Например

Write ('Выходное значение: ', C);

В списке вывода может быть либо одно выражение, либо последовательность выражений, разделенных между собой запятыми.

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

Примеры вывода данных:

Write (A, B, C);

WriteLn ('Корнем уравнения является ', X);

WriteLn(LogPer);

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

Процедура вывода с форматом для целого типа имеет вид:

WriteLn (A: N, B: M, C: L);

Здесь N, M, L - выражения целого типа, задающие ширину поля вывода значений.

При выводе вещественных значений Write(R) без указания формата выводит вещественное R в поле шириной 18 символов в форме с плавающей запятой в нормализованном виде. Для десятичного представления значения R применяется оператор с форматами вида WriteLn (R: N: M). В десятичной записи числа R выводится M (0 ? M ? 24) знаков после запятой, всего выводится N знаков.

2. Решение типового задания на языке программирования Паскаль

Пример 1.

Составим процедуру sq решения квадратного уравнения ax2 + bx + c = 0 в предположении, что дискриминант не отрицателен. С помощью этой процедуры решим квадратное уравнение 5.7y2 - 1.2y - 8.3 = 0.

var

y1, y2: real;

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

var

d: real;

begin

d:= b * b - 4 * a * c;

x1:= (-b + sqrt(d)) / (2 * a);

x2:= (-b - sqrt(d)) / (2 * a);

end;

begin

sq (5.7, -1.2, -8.3, y1, y2);

writeln ('y1 = ', y1, '; y2 = ', y2);

readln

end.

Пример 2.

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

Program Fn;

Var

A, B, C: Real;

Function Max (A, B: Real):Real; {Описываем функцию Max с формальными}

Begin {параметрами A и B, которая принимает}

If A>B Then Max:=A {значение максимального из них}

Else Max:=B {Здесь A и B - локальные переменные}

End;

Begin

Writeln ('Введите три числа');

Readln (A, B, C);

Writeln ('Максимальным из всех является ', Max (Max(A, B), C))

End.

Пример 3.

Задача: «Расположить в порядке неубывания три целых числа».

Program Pr;

Var

S1, S2, S3: Integer;

Procedure Swap (Var A, B: Integer); {Процедура Swap с параметрами-переменными}

Var C: Integer; {C - независимая локальная переменная}

Begin

C:=A; A:=B; B:=C {Меняем местами содержимое A и B}

End;

Begin

Writeln ('Введите три числа');

Readln (S1, S2, S3);


Подобные документы

  • История создания и развитие Pascal. Особенности пакета программирования Turbo. его возможности редактора текстов, компилятора и отладчика. Построения программы на языке Turbo Pascal, ее структура, типы алгоритмов, одномерные и многомерные массивы.

    курсовая работа [519,3 K], добавлен 25.06.2011

  • История появления и распространения Turbo Pascal - среды разработки для языка программирования Паскаль. Общий вид объявления файлового типа. Входная, выходная и промежуточная информация. Алгоритм решения задачи: словесный алгоритм, блок-схема, программа.

    курсовая работа [359,4 K], добавлен 05.01.2010

  • История и основы структурного программирования в среде Turbo Pascal. Работа с различными типами данных. Операторы языка. Работа с символьными и строковыми переменами, одномерным, двумерным массивами. Классификация компьютерных игр. Игры на языке Паскаль.

    курсовая работа [28,8 K], добавлен 06.05.2014

  • Структура и основные элементы языка Turbo Pascal. Алгоритм составления простейших программ на Turbo Pascal. Применение условного оператора и сильноветвящихся алгоритмов. Циклы с предусловием и постусловием, сочетание циклических и условных операторов.

    реферат [64,0 K], добавлен 20.03.2016

  • Сущность среды программирования Turbo Pascal. Разработка программы с учетом потребительских свойств. Особенности методов современной технологии программирования (пошаговой детализации, структурный, модульный принцип, метод иерархической декомпозиции).

    курсовая работа [57,1 K], добавлен 03.03.2011

  • История создания и развитие языка программирования Pascal, его версии. Особенности и порядок построения графика функции на языке Turbo Pascal с использованием декартовой системы координат. Блок схема алгоритма процедур, листинг и тестирование программы.

    курсовая работа [102,7 K], добавлен 23.12.2011

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

    учебное пособие [211,1 K], добавлен 30.03.2008

  • Понятие и содержание процедур и функций среды TP как логически самостоятельных фрагментов программы. Описание списка формальных параметров процедуры Pascal и преобразование подпрограммы в массив. Локализация имен и правила работы с модулями среды TP.

    презентация [154,6 K], добавлен 10.10.2013

  • Разработана программа решения двух задач на языке программирования Turbo Pascal. Спецификация задания. Описание входных и выходных данных. Математическая постановка задачи. Алгоритм ее решения. Описание и блок-схема программы. Результаты тестирования.

    курсовая работа [275,8 K], добавлен 28.06.2008

  • Разновидности и задачи подпрограмм в языке Турбо Паскаль, их локальные и глобальные параметры. Использование процедуры для выполнения законченной последовательности действий. Формат объявления функции, особенности рекурсивного оформления подпрограммы.

    реферат [20,0 K], добавлен 08.02.2012

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.