![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Описание процедур и функций
Процедуры и функции представляют собой относительно самостоятельные фрагменты программы, соответствующим образом оформленные и снабженные именем (программные блоки). По правилам Borland Pascal программные блоки - такие же ресурсы, как типы и переменные. Соответственно, они также должны быть описаны перед использованием в разделе описаний программного блока, который их использует (основной программы или вызывающей подпрограммы). Каждый блок имеет такую же структуру, как основная программа, т.e. включает заголовок, раздел описаний и раздел операторов, но заканчивается не точкой, а точкой с запятой. Заголовок блока определяет форму вызова подпрограммы. В разделе описаний блока объявляют внутренние локальные ресурсы блока (переменные, типы, внутренние подпрограммы). Раздел операторов содержит инструкции подпрограммы в операторных скобках begin...end. Заголовки процедур и функций описываются по-разному. В отличие от процедуры функция всегда возвращает в точку вызова скалярное значение, адрес или строку. Тип возвращаемого результата описывается в заголовке функции. Данные для обработки процедуры и функции получают из вызвавшей их основной программы или подпрограммы. Для размещения рабочих полей подпрограммы могут объявлять новые типы и переменные в собственном разделе описаний. Результаты же они обычно должны возвращать вызвавшей программе или подпрограмме. Из основной программы данные могут быть получены: · неявно, с использованием глобальных констант и переменных; · явно через параметры. Неявная передача данных в подпрограммы. Каждой подпрограмме доступны все ресурсы программного блока, в разделе описаний которого эта подпрограмма объявлена. Ресурсы же основной программы доступны в любой подпрограмме. Они получили название глобальных. В свою очередь локальные ресурсы, объявленные в разделе описаний подпрограммы, из программного блока, в разделе описания которого она определена, не доступны. В том случае, если в подпрограмме объявляется ресурс, имя которого совпадает с именем глобального ресурса, соответствующий глобальный ресурс в подпрограмме становится не доступным, «перекрывается». Опыт показывает, что неявная передача данных в подпрограммы обычно приводит к большому количеству ошибок, которые достаточно сложно искать, так как неизвестно, какая подпрограмма с какими глобальными ресурсами работает. Кроме того, подпрограммы, использующие глобальные данные невозможно перенастроить на работу с другими значениями, что сокращает возможности их применении. Поэтому желательно использовать явную передачу значений - через параметры. Передача данных через параметры. Список параметров описывается в заголовке подпрограммы. Параметры, перечисленные в этом списке, получили название формальных, так как для их размещения не отводится память. При обращении к подпрограмме для каждого параметра должно быть указано фактическое значение литерал, константа или переменная, того же типа, что и формальный параметр. Несоответствие типов и количества формальных и фактических параметров выявляется компилятором (или компоновщиком, если вызов подпрограммы происходит из другою модуля -см. далее). Нарушение порядка следования фактических параметров - это нарушение не связано с несовпадением количества параметров или их типов, приводит к нарушению логики работы программы и часто может быть обнаружено только при тестировании программы. В Borland Pascal параметры в подпрограмму могут передаваться тремя способами: · как значения - в подпрограмму передаются копии значений параметров, и никакие изменении этих копий не возвращаются в вызывающую программу; · как переменные - в подпрограмму предаются адреса фактических параметров, соответственно все изменения этих параметров в подпрограмме на самом деле происходят с переменными, переданными в качестве фактических параметров; такие параметры при описании помечаются служебным словом var; в качестве фактических значений параметров-переменных нельзя использовать –литералы. · как неизменяемые переменные (именованные константы) — в подпрограмму, так же как и в предыдущем случае, передаются адреса фактических параметров, но при попытке изменить значение параметра компилятор выдает сообщение об ошибке: такие параметры при описании помечаются служебным словом const. Вызов процедур и функции. И процедура, и функция, используя параметры-переменные, могут изменять значения переменных основной программы. По как отмечалось выше, функция отличается от процедуры тем, что кроме изменения значений параметре в переменных всегда возвращает в точку- вызова скалярное значение, строку или указатель. Поэтому в теле функции обязательно наличие специальной переменной с именем функции, которой должно присваиваться возвращаемое значение. Именно это значение и будет возвращено в место вызова функции в качестве ее результата. Вызов функции, таким образом, можно осуществлять в составе выражений везде, где возможно использование выражений (в операторе присваивания, в операторе вывода и т.д. Процедура же должна вызываться отдельным оператором, состоящим из имени процедуры и списка фактических параметров: < имя процедуры> (< фактические параметры>). Вызов процедуры и функции по-разному изображается па схеме алгоритма: вызов функции - в блоке «процесс» или блоке вывода, а для вызова процедуры используется специальный блок «предопределенный процесс». Схемы алгоритмов же самих подпрограмм в обоих случаях оформляются отдельно, причем вместо слова «начало» указывают имя подпрограммы, а вместо слова «конец» - указывают слово «возврат» или «return». Пример. Разработать программу, которая определяет площадь четырехугольника по заданным длинам сторон и диагонали. Будем считать площадь четырехугольника как сумму площадей двух треугольников, определенных по формуле Герона. Вычисление площади треугольника оформим как подпрограмму. Исходные данные такой подпрограммы -длины сторон треугольника. Подпрограмма не должна менять значения параметров, поэтому их можно передать как параметры-значения или параметры-константы. Результат работы этой подпрограммы - скалярное значение, значит, она может быть реализована как функция. Однако ее также можно реализовать как процедуру, которая возвращает результат через параметр-переменную. Ниже приведены тексты соответствующих программ. Вариант с использованием функции: Var A, B, C, D, E: real; {глобальные переменные} {описание функций} Function Stf(const X, Y, Z: real): real; Var p: real; {локальная переменная} begin {раздел операторов функции} p: =(X+Y+Z)/2; Stf: = sqrt(p*(p-X)*(p*Y *(p-Z); end; {раздел операторов основной программы} Begin Writeln('Введите длины сторон и диагонали'); Readln(А, B, C, D, Е); Write ('Площадь четырехугольника', Stf(A, B, E)+StflC, D, E): 7: 3); End Вариант с использованием процедуры: Program ex; Var A, B, C, D, E: reaI; S1, S2: real; {глобальные переменные} {описание процедуры} Procedure Stp(const: X, Y, Z: real; var S: real); Var p: real; {локальная переменная} begin {раздел операторов процедуры } p: =(X+Y+Z)/2; S: =sqrt(p*(p-X)*(p- Y)*(p-Z)); end; {раздел операторов основной программы} Begin WriteLn('Bвeдите длины сторон и диагонали'); ReadLn(A, B, C, D, E); Stp(A, B, E, S1); {вызов процедуры} Stp(C, D, E.S2); {вызов процедуры) Writeln('Площадь четырехугольника ', S1+S2: 7: 3); End. Использование параметров структурных типов, таких как массивы, строки (кроме типа string), множества, записи, файлы, имеет одну общую особенность: тин таких параметров должен быть предварительно объявлен к инструкции описания типа type. Например: Type mas = array[1..10] of real; Str80=string[80]; procedure A(M: mas; fout: str80);... Пример. Разработать подпрограмму суммирования элементов массива размерности 10 целых чисел. Поскольку результат - скалярное значение, то будем использовать подпрограмму-функцию. Описание типа «массив из 10 целых чисел» должно быть выполнено отдельно в разделе описаний. Новый тип mas затем используется при объявлении массива а и при объявлении типа массива, передаваемого через параметр-значение. Полный текст программы представлен ниже. Program ex; Type mas=array[1..10] of integer; {тип «массив из 10 целых чисел»} Var a: mas; i, n: integer; function sum(b: mas; n: integer): integer; Var s: integer; i: integer; Begin s: =0; for j: =1 to n do s: =s+b[i]; sum: =s; End; Begin ReadLn(n); for i: =1 to n do Read(a[i]); ReadLn; WriteLn('Сумма = ', sum(a, n)); End. В соответствии с рекомендациями структурного программирования реализация и отладка программы также должны выполниться поэтапно. Сначала реализуют основную программу, используя вместо подпрограмм следующего уровня «заглушки» (подпрограммы, у которых отсутствуют операторы между begin и end). Затем реализуют эти подпрограммы, используя заглушки вместо подпрограмм следующего уровня и т.д.
Лекция 13. Схема передачи параметров-значений и параметров-переменных(2 часа)
|