Основы программирования (947332), страница 25
Текст из файла (страница 25)
Предусмотреть ввод размера обычной стипендии с клавиатуры.1435. МОДУЛЬНОЕ ПРОГРАММИРОВАНИЕБольшие программы обычно разрабатывают и отлаживают по частям. Целесообразно при.этом, чтобы каждая такая часть, называемая подпрограммой, была оформленатак, чтобы ее можно было использовать при решении аналогичной подзадачи в той жепрограмме или даже при решении других задач. В Borland Pascal реализованы два типаподпрограмм: процедуры и функции.5.1. Процедуры и функцииПроцедуры и функции представляют собой относительно самостоятельные фрагменты программы, соответствующим образом оформленные иснабженные именем (программные блоки). По правилам Borland Pascal программные блоки - такие же ресурсы, как типы и переменные. Соответственно, они также должны быть описаны перед использованием в разделе описаний программного блока, который их использует (основной программы иливызывающей подпрограммы).
Каждый блок имеет такую же структуру, какосновная программа, т.е. включает заголовок, раздел описаний и раздел операторов, но заканчивается не точкой, а точкой с запятой (рис. 5.1).Заголовок блока определяет форму вызова подпрограммы. В разделеописаний блока объявляют внутренние локальные ресурсы блока (переменные, типы, внутренние подпрограммы). Раздел операторов содержит инструкции подпрограммы в операторных скобках begin...end.Заголовки процедур и функций описываются по-разному. В отличие отпроцедуры функция всегда возвращает в точку вызова скалярное значение,адрес или строку.
Тип возвращаемого результата описывается в заголовкефункции (рис. 5.2).ЗаголовокблокаРазделописаний•——>РазделоператоровРис. 5.1. Синтаксическая диаграмма конструкции<Программный блок>1445. Модульное программирование- ^ procedure V ИдентификаторСписокпараметров- ^ function V Идентификатор—I I \1^Списокпараметров,<7>]•[результата!\^^Рис. 5.2. Синтаксические диаграммы конструкций<ЗаголоБок процедуры> {а) и <Заголовок функции> (б)Данные для обработки процедуры и функции получают из вызвавшей ихосновной программы или подпрограммы.
Для размещения рабочих полейподпрограммы могут объявлять новые типы и переменные в собственномразделе описаний. Результаты же они обычно должны возвращать вызвавшейпрограмме или подпрограмме.Из основной программы данные могут быть получены:• неявно - с использованием глобальных констант и переменных;• явно - через параметры.Неявная передача данных в подпрограммы. Каждой подпрограммедоступны все ресурсы программного блока, в разделе описаний которого этаподпрограмма объявлена. Ресурсы же основной программы доступны в любой подпрограмме. Они получили название глобальных.В свою очередь локальные ресурсы, объявленные в разделе описанийподпрограммы, из программного блока, в разделе описания которого она определена, не доступны.
В том случае, если в подпрограмме объявляется ресурс, имя которого совпадает с именем глобального ресурса, соответствующий глобальный ресурс в подпрограмме становится не доступным, «перекрывается».Например, на рис. 5.3 в разделе описаний основной программы объявлена подпрограмма А, в разделе описаний которой объявлена подпрограмма В.Переменная х доступна в обеих подпрограммах, так как она не перекрывается.
Переменная z основной программы в подпрограмме А не доступна, таккак эта подпрограмма перекрывает глобальную переменную z локальной. Вподпрограмме В используется значение z, определенное в подпрограмме А.Опыт показывает, что неявная передача данных в подпрограммы обычно приводит к большому количеству ошибок, которые достаточно сложно искать, так как неизвестно, какая подпрограмма с какими глобальными ресурсами работает.
Кроме того, подпрограммы, использующие глобальные дан145Часть 1. Основы алгоритмизации и процедурное программированиеProgram ex;Var xrreal; z:real;-----t":Procedui^ A;Var z: integer;PrdeodurfesB;Var irtfitegerK^Begin i:=z; x:=5;End;B^gin\-round(x);End;BeginEnd.Рис. 5.3. Перекрытие ресурсов в подпрограммахные, невозможно перенастроить на работу с другими значениями, что сокращает возможности их применения. Поэтому желательно использовать явнуюпередачу значений - через параметры.Передача данных через параметры. Список параметров описываетсяв заголовке подпрограммы (рис. 5.4).
Параметры, перечисленные в этом списке, получили название формальных, так как для их размещения не отводится память. При обращении к подпрограмме для каждого параметра должнобыть указано фактическое значение - литерал, константа или переменнаятого же типа, что и формальный параметр. Несоответствие типов и количества формальных и фактических параметров выявляется компилятором (иликомпоновщиком, если вызов подпрограммы происходит из другого модуля см. далее).
Нарушение порядка следования фактических параметров, еслиоvarИдентификатор'-*/ const VU|OLJ11 V уО ОТИПL/7VI параметра [ Т у^Рис. 5.4. Синтаксическая диаграмма конструкции <Список параметров>1465. Модульное программированиеэто нарушение не связано с несовпадением количества параметров или ихтипов, приводит к нарушению логики работы программы и часто может бытьобнаружено только при тестировании программы.В Borland Pascal параметры в подпрограмму могут передаваться тремяспособами:• как значения - в подпрограмму передаются копии значений параметров, и никакие изменения этих копий не возвращаются в вызывающую программу;• как переменные - в подпрограмму передаются адреса фактических параметров, соответственно все изменения этих параметров в подпрограмме насамом деле происходят с переменными, переданными в качестве фактических параметров; такие параметры при описании помечаются служебнымсловом var; в качестве фактических значений параметров-переменных нельзя использовать литералы\• как неизменяемые переменные (именованные константы) - в подпрограмму, так же как и в предыдущем случае, передаются адреса фактическихпараметров, но при попытке изменить значение параметра компилятор выдает сообщение об ошибке; такие параметры при описании помечаются служебным словом const.Вызов процедур и функций.
И процедура, и функция, используя параметры-переменные, могут изменять значения переменных основной программы. Но как отмечалось выше, функция отличается от процедуры тем,что кроме изменения значений параметров-переменных всегда возвращает вточку вызова скалярное значение, строку или указатель. Поэтому в телефункции обязательно наличие специальной переменной с именем функции,которой должно присваиваться значение.
Именно это значение и будет возвращено в место вызова функции в качестве ее результата. Вызов функции,таким образом, можно осуществлять в составе выражений везде, где возможно использование выражений (в операторе присваивания, в операторе вывода и т.д.), например:<переменная>:=<имя функции>(<фактические параметры>).Процедура же должна вызываться отдельным оператором, состоящим изимени процедуры и списка фактических параметров:<имя процедуры>(<фактические параметры>).Вызов процедуры и функции по-разному изображается на схеме алгоритма: вызов функции - в блоке «процесс» или блоке вывода, а для вызовапроцедуры используется специальный блок «предопределенный процесс».Схемы алгоритмов же самих подпрограмм в обоих случаях оформляются отдельно, причем вместо слова «начало» указывают имя подпрограммы, а вместо слова «конец» - указывают слово «возврат» или «return».147Часть 1. Основы алгоритмизации и процедурное программированиеС Начало Ji/С Stf(x,y,z) J..Вводa,b,c,d,e'Ip:=(x+y+z)/2IВыводStrf(.)+Stf(,п{ Конец jС Начало j./Return.IВводa,b,c,d,ep:=(x+y+z)/2Stp(a,b,e,SI)s=v:..ZstMT..iГ81р(х,у,г,5П.Stp(c,d,e,S2)j(ReturnjВыводSHS2fКонецjРис.
5.5. Схемы алгоритмов программы определения площадичетырехугольника с использованием функции {а) и процедуры (б)Пример 5.1. Разработать программу, которая определяет плоидадь четырехугольника по заданным длинам сторон и диагонали.Будем считать площадь четырехугольника как сумму площадей двухтреугольников, определенных по формуле Герона. Вычисление площади треугольника оформим как подпрограмму. Исходные данные такой подпрограммы - длины сторон треугольника. Подпрограмма не должна менять значенияпараметров, поэтому их можно передать как параметры-значения или параметры-константы. Результат работы этой подпрограммы - скалярное значение, значит, она может быть реализована как функция. Однако ее также можно реализовать как процедуру, которая возвращает результат через параметрпеременную.