мета-данные страницы
  •  
Загрузка не удалась. Возможно, проблемы с правами доступа?

Различия

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

Ссылка на это сравнение

Следующая версия
Предыдущая версия
pascal:procfandfun [18/10/2011 10:11] – создано ocapascal:procfandfun [06/05/2019 03:50] (текущий) – [Функции] ybezrukov
Строка 1: Строка 1:
-дд+====== Процедуры и функции ====== 
 + 
 +==== Процедуры ==== 
 +На уровне идей, всё ниже сказанное относится не только к языку Паскаль, но и к большинству других языков программирования. Исключением являются конкретные языковые конструкции (имён процедур), которые даны именно для Паскаля и некоторые механизмы реализации. 
 + 
 +**Процедура (подпрограмма)** -- большой (более или менее) фрагмент кода, который описан специальным образом один раз, но может вызываться из разных мест программы. Процедурами, а точнее -- **вызовами** стандартных процедур, являются многие "популярные" команды, такие, как команды ввода/вывода (//write//, //writeln//, //read// и //readln//).  
 + 
 +==== Описание и вызов процедур ==== 
 + 
 +Следует различать **описание** и **вызов** процедур. 
 + 
 +**Описание процедуры** определяет, что именно и каким образом делает процедура, а также как её следует использовать в программе. Считается, что описание каждой процедуры (возможно - уже в виде готового программного кода) существует всегда, но может быть скрыто от разработчика. В соответствии с описанием процедуры, при порождается и встраивается в готовую программу реальный программный код, который исполняется в программе в момент вызова процедуры.  
 + 
 +Не следует путать описание  процедуры в программе с описанием процедуры в справочной системе или в сопровождающей документации. Последнее -- просто текст, предназначенный для того, чтобы помочь программисту освоиться с применением процедуры.  
 + 
 +**Вызов процедуры**  -- это применение процедуры в конкретном месте текста программы. В готовой программе ему соответствует некоторый стандартный механизм, который позволяет передать управление на код процедуры и затем вернуть его обратно коду самой программы. 
 + 
 +**Объявление процедуры** -- редко встречающаяся конструкция, которая провозглашает, что мы планируем использовать определённым образом некоторую процедуру, полное описание которой будет предоставлено позже  в соответствующий момент. Примером является "косвенная рекурсия", когда процедура А использует в своём описании вызовы процедуры В, а процедура В, в свою очередь, использует вызовы процедуры А. Объявление процедуры указывает, что обращение к некоторому неописанному полностью объекту не является ошибкой, если производится в соответствии с этим объявлением. В готовом программном коде, соответствия объявлению нет, это механизм, который позволяет согласовать код программы с кодом процедуры  
 + 
 +==== Функции ==== 
 + 
 +**Функции** -- это специальный вид процедур, которые **возвращают** значения заранее оговоренного типа, т.е. вызовы функций могут заменять значения указанного типа в выражениях или в качестве параметров других процедур и функций. Например: 
 + 
 +''y:=sin(x);''                    // // 
 + 
 +''m:= round( i/j + frac(q) );''   // // 
 + 
 +''writeln(round(y));''            // // 
 + 
 +Их описание и применение несколько отличается от описания и применения просто "чистых" процедур. 
 + 
 +Во многих современных версиях языков программирования, функции могут использоваться как процедуры. Например: 
 + 
 +''while keypressed do readkey;''     // // 
 + 
 +Обратное - неверно. Неверный пример: 
 + 
 +''x:= z+read(z);'' // 
 + 
 + 
 +Процедуры можно разделять по нескольким критериям. В данном случае, говоря о стандартных процедурах, процедуры неявно различаются по месту расположения кода. А именно:  
 + 
 +  * **стандартные** добавляются в программу автоматически, пример -- //write//;  
 +  * **стандартные библиотечные**  требуют указания в программе на необходимость подключения дополнительных системных библиотек (пример -- //keypressed//, //readkey//, //delay// из CRT);  
 +  * **дополнительные библиотечные**  требуют установки в системе и подключения в коде программы дополнительных библиотек (пример -- //circle//, //setfillstyle//, //getcolor// из graph или из нашей библиотеки oglgraph); 
 +  * **собственные библиотечные**  требуют создания, установки в системе и подключения в коде программы дополнительных библиотек;  
 +  * **локальные** описываются в программе. 
 + 
 +Библиотеки могут  
 +  * поставляться изначально как стандартные, в составе инструментов разработчика вместе с компилятором, отладчиком и т.д. 
 +  * создаваться программистом или его коллегами для себя;   
 +  * создаваться и распространяться некоторой третьей стороной.   
 + 
 +Иначе говоря, Вы можете описать самостоятельно или получить со стороны специальным образом оформленный  маленький алгоритм (подпрограмму), решающий частную задачу, и включить его качестве простого действия в свой более сложный алгоритм (программу).  При этом, описание можно сделать таким образом, что ваш алгоритм будет применим к более или менее широкому набору объектов, с которыми работает общий алгоритм. 
 + 
 +Пример, на примере сортировки массива по возрастанию значений с помощью сортировки выбором.  
 + 
 +Идея сортировки в следующем: 
 +Массив рассматриваем как состоящий  в каждый момент работы программы из двух частей - сортированной и несортированной. Сами части будут меняться! 
 +В начале считаем, что несортированная часть занимает весь массив, а сортированная - всё остальное,   
 +1) Находим максимальный во всём массиве элемент. 
 +В рассматриваемой части массива 
 + 
 +<code pascal | Крайне общий алгоритм программы сортировки массива> 
 +uses allForSorting;         // Библиотека "Всё для сортировки".  
 +                            // Скорее всего - не существует в реальности. 
 +                            // Содержит ВСЁ (происхождение чего мы не хотим объяснять) 
 +const  
 +  n=1000;                   // Размер массива. Выбран по принципу - "а почему бы и нет?" 
 +type 
 +  ArrayType = array[1..N] of integer; 
 +                            // Описание типа ("устройства") сортируемого массива 
 +var 
 +  SortedA : ArrayType;      // Объявление самого сортируемого массива 
 +begin 
 +  FillArray (SortedA);      // Заполняем наш массив начальными значениями 
 +  PrintArray(SortedA);      // Показываем, что получилось. 
 +  SortArray (SortedA);      // Сортируем наш массив "таинственным способом"
 +  PrintArray(SortedA);      // Показываем, что получилось 
 +end.   
 +</code> 
 + 
 + 
 +Важно то, что с помощью механизма **передачи параметров**, подобный фрагмент кода способен выполнять одни и те же действия с разными объектами, т.е. значениями(константами), переменными и выражениями. Например, вычислять кубический корень из заданного числа, сортировать произвольный массив с элементами указанного типа, отбрасывать ненужные пробелы в указанной строке и т.д. 
 + 
 +**Описание процедуры** -- это общее описание алгоритма, реализующегося в процедуре, средствами используемого языка программирования.  Многие системы программирования позволяют получить программу, собранную из фрагментов, написанных на нескольких языках программирования. Например - с ассемблерными вставками, т.е. фактически - с непосредственным использованием команд процессора.  
 + 
 +В программе может содержатся **предварительное описание** или **объявление** процедуры, которое описывает, как должна вызываться процедура, т.е. указывает ее имя и порядок подстановки параметров, но не описывает алгоритма процедуры. В частности, оно используется для присоединения программ, написанных на ассемблере. 
 + 
 +**Вызов процедуры** -- применение ранее описанного алгоритма к конкретно указанным объектам уже при работе программы. 
 + 
 +При описании алгоритма процедуры, используются **формальные параметры**, которые не являются реальными объектами, доступными для дальнейшего использования в программе. При вызове процедуры, происходит подстановка 
 + 
 +**Функция** -- специальным образом оформленная процедура, которая **возвращает значение** определённого типа. Это означает, что вызов функции приводит в вычислению значения данного типа, которое может может быть использовано. Вызов функции одновременно является выражением и может быть использован везде, где может быть использовано другое выражение, вычисляющее значение данного типа, т.е. в качестве присваиваемого значения, в более сложном выражении или при подстановке параметра при вызове другой процедуры или функции. 
 + 
 + 
 + 
 +Например, алгоритм сортировки выбором (по возрастанию) требует нахождения максимального элемента на различных частях массива, а также. 
 + 
 +Большинство языков программирования позволяют оформлять многократно используемый код в виде процедур и/или функций. Целью написания процедур может быть: 
 + 
 +минимизация написания повторяющегося кода - когда программисту приходится несколько раз разрабатывать и описывать идентичные последовательности команд, решающих одинаковые задачи, подразумеваются излишние затраты времени разработчика; 
 +минимизация включения повторяющегося кода - когда в программу включается в различных местах программы множество одинаковых или практически одинаковых фрагментов; 
 + 
 +стандартизация кода 
 +   
 +