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

Различия

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

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

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
pascal:procfandfun [20/09/2012 10:06] 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//, //writeln//, //read// и //readln//. 
  
 Процедуры можно разделять по нескольким критериям. В данном случае, говоря о стандартных процедурах, процедуры неявно различаются по месту расположения кода. А именно:  Процедуры можно разделять по нескольким критериям. В данном случае, говоря о стандартных процедурах, процедуры неявно различаются по месту расположения кода. А именно: 
  
-  * **стандартные** добавляются автоматически,   +  * **стандартные** добавляются в программу автоматически, пример -- //write//;  
-  * **библиотечные**  требуют подключения внешних библиотек, т.е. наборов дополнительных описаний различных объектов (пример -- //keypressed//, //readkey//, //delay// из CRT), +  * **стандартные библиотечные**  требуют указания в программе на необходимость подключения дополнительных системных библиотек (пример -- //keypressed//, //readkey//, //delay// из CRT);  
 +  * **дополнительные библиотечные**  требуют установки в системе и подключения в коде программы дополнительных библиотек (пример -- //circle//, //setfillstyle//, //getcolor// из graph или из нашей библиотеки oglgraph)
 +  * **собственные библиотечные**  требуют созданияустановки в системе и подключения в коде программы дополнительных библиотек; 
   * **локальные** описываются в программе.   * **локальные** описываются в программе.
  
Строка 30: Строка 66:
                             // Скорее всего - не существует в реальности.                             // Скорее всего - не существует в реальности.
                             // Содержит ВСЁ (происхождение чего мы не хотим объяснять)                             // Содержит ВСЁ (происхождение чего мы не хотим объяснять)
- 
 const  const 
   n=1000;                   // Размер массива. Выбран по принципу - "а почему бы и нет?"   n=1000;                   // Размер массива. Выбран по принципу - "а почему бы и нет?"
-   
 type type
   ArrayType = array[1..N] of integer;   ArrayType = array[1..N] of integer;
Строка 39: Строка 73:
 var var
   SortedA : ArrayType;      // Объявление самого сортируемого массива   SortedA : ArrayType;      // Объявление самого сортируемого массива
- 
 begin begin
   FillArray (SortedA);      // Заполняем наш массив начальными значениями   FillArray (SortedA);      // Заполняем наш массив начальными значениями
Строка 45: Строка 78:
   SortArray (SortedA);      // Сортируем наш массив "таинственным способом".   SortArray (SortedA);      // Сортируем наш массив "таинственным способом".
   PrintArray(SortedA);      // Показываем, что получилось   PrintArray(SortedA);      // Показываем, что получилось
- 
 end.   end.  
- 
 </code> </code>
  
Строка 72: Строка 103:
 минимизация включения повторяющегося кода - когда в программу включается в различных местах программы множество одинаковых или практически одинаковых фрагментов; минимизация включения повторяющегося кода - когда в программу включается в различных местах программы множество одинаковых или практически одинаковых фрагментов;
  
-  стандартизация кода+стандартизация кода