60936

Процедуры без параметров. Примеры написания и вызова

Конспект урока

Педагогика и дидактика

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

Русский

2014-05-22

78.5 KB

0 чел.

                           Т Е М А   9.

                            ПРОЦЕДУРЫ.

1. Процедуры без параметров. Примеры написания и вызова.

    Каким  бы  универсальным  ни  был  язык программирования, для

решения  задач в конкретной предметной области он неполон, поэтому

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

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

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

завершенных   действий  в  виде  поименованных  групп  операторов,

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

типа подпрограмм :

    1. процедуры без параметров;

    2. процедуры с параметрами;

    3. функции.

    Все  эти  типы подпрограмм близки как по конструкции, так и по

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

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

(что   выражается   в   использовании   процедур   и   функций  при

программировании)  позволяет  делать программу структурированной и,

как   следствие,   легко   читаемой,   легко   отлаживаемой,  легко

модифицируемой, надежной.

    Размер  отдельной  процедуры  или  функции не должен превышать

некоторого  максимального  размера  -  порядка  50-60  строк  (одна

страница текста).

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

модульной.  Модули  такой  программы сами могут состоят из модулей.

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

Главное  при  этом, чтобы каждая из процедур выполняла законченное,

ясно  выраженное  действие,  суть  которого  должна быть отражена в

имени этой процедуры.

2. Процедуры без параметров.

    Процедурой   в  языке  Паскаль  называется  последовательность

операторов,  с  которой  связано  некоторое  имя.  Для  того, чтобы

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

имя. Такое обращение к процедуре называется оператором процедуры.

    Использование  процедур  предоставляет  возможность  присвоить

последовательности операторов имя и использовать это имя в качестве

ее  сокращенной  записи  в  тех  местах  программы, где встречается

соответствующая последовательность действий.

    Процедура имеет следующий формат :

                 procedure <имя процедуры>;

                           <тело процедуры>;

    Имя процедуры - это любой идентификатор.

Тело процедуры – это блок, имеющий структуру, совпадающую со

структурой тела программы.

    Описание  процедуры  -  часть  программы,  начинающаяся словом

procedure  и заканчивающаяся точкой с запятой - помещается в раздел

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

само  по  себе  не  вызвает никаких действий. Процедура выполняется

тогда,  когда  ее  имя  в  качестве оператора процедуры встречается

в теле программы.

3. Примеры.

    Рассмотрим использование процедур без параметров на примерах.

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

    Стандартные  (или  встроенные)  процедуры  -  это  те, которые

определены   в  соответствующей  версии  языка  Паскаль.  Операторы

ввода/вывода,  графики  и  работы  со  строковыми  данными являются

обращениями  к соответствующим процедурам по их имени. Единственное

отличие  состоит  в  том,  что  мы пока рассматриваем процедуры без

параметров,  а большинство встроенных процедур использует параметры

(о чем будет сказано на последующих уроках).

3.2. Задача :

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

косинуса  угла,  изменяющегося в диапазоне от 0■ до 45■ с шагом в 1

градус.

    Рассмотрим два варианта решения этой задачи.

    1. Без использования процедур :

  program TableCos ( Input, Output );

  const

    Width = 40;

    Last = 45;

  var

    j       : integer;

    Arg,

    Cosinus : real;

  begin

    Writeln ( 'Таблица значений функции косинус : ' );

    for j := 1 to Width do                    { <─┐ }

        Write ( '-' );                        { <─┤ }

    Writeln;                                  { <─┤ }

                                              {   │ }

    Writeln ( ' Угол            Косинус' );   {   │ }

                                              {   │ }

    for j := 1 to Width do                    { <─┤ }

        Write ( '-' );                        { <─┤ }

    Writeln;                                  { <─┤ }

                                              {   │ }

    for j := 0 to Last do                     {   │ }

        begin                          { ┌────────┴──────┐ }

           Arg     := j * Pi / 180;    { │ повторяющиеся │ }

           Cosinus := Cos ( Arg );     { │   фрагменты   │ }      

           Writeln ( i, Cosinus );     { │   программы   │ }      

        end;                           { └────────┬──────┘ }      

                                              {   │ }

    for j := 1 to Width do                    { <─┤ }

        Write ( '-' ) ;                       { <─┤ }

    Writeln;                                  { <─┘ }

  end.

    2. С использованием процедуры :

  program TableModuls ( Input, Output );

  const

    Last = 45;

  var

    i       : integer;

    Arg,

    Cosinus : real;

  procedure DrawLine;

      const

          Width = 40;

      var

          j : integer;

      begin

         for j := 1 to Width do

             Write ( '-' );

         Writeln;

      end { DrawLine };

  begin        { Начало тела программы }

    Writeln ( 'Таблица значений функции косинус : ' );

    DrawLine;

    Writeln ( ' Угол            Косинус' );

    DrawLine;

    for i := 0 to Last do

        begin

            Arg := i * pi / 180;

            Cosinus := Cos ( Arg );

            Writeln ( i, Cosinus:3:1 );

        end;

    DrawLine;

  end.

    Фрагмент, предназначенный для изображения строки из черточек,

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

трехкратным  обращением  к  процедуре  DrawLine. Модульный вариант

позволяет  сократить  программу  и  сделать  ее  более  понятной и

наглядной.

    Если  мы  захотим  изменить  длину  строки  черточек,  то  все

изменения  достаточно провести в процедуре, не обращаясь к основной

программе.  Более  того,  если  мы захотим вывести на экран таблицу

значений  другой  функции, то процедуру DrawLine можно использовать

без каких-либо изменений.

4. Понятия "локальной" и "глобальной" переменной.

    В  процедуре  можно  объявлять  константы,  переменные, другие

процедуры  и функции. Раздел описателей в процедурах имеет такую же

структуры, как и в основной программе.

    Объявленные  внутри процедуры переменные называются локальными

по отношению к данной процедуре. ОНИ НЕ ДОСТУПНЫ ВНЕ ЕЕ. Изменения,

происходящие  с  такими  переменными внутри процедуры, не влияют на

значения  переменных  с  такими  же именами, но которые описаны вне

данной процедуры.

    Переменная,  используемая  в  процедуре,  но описанная вне ее,

называется  глобальной  по  отношению  к  данной  процедуре.  Любое

изменение этой переменной внутри процедуры изменяет ее значение вне

процедуры.

    Говорят,  что  процедура  имеет  "побочные  эффекты", если она

изменяет  значение  хотя  бы  одной  глобальной  переменной. Обычно

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

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

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

локальными переменными и параметрами.

5. Пример программы, иллюстрирующей принцип локализации.

               program Nest;

               var

                  a, b : integer;

               procedure NestEgg;

                  var

                     a, x : char;

                  begin

                     a := '!';

                     x := '?';

                     b := b + 1;

                  end;

               begin

                  a := 0;

                  b := 100;

                  NestEgg;

                  Writeln ( a, b );

               end;

    Переменная  "x" - локальная  для  процедуры  NestEgg,  поэтому

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

ней.

    Переменная  "b" - глобальная  для  NestEgg,  она  известна и в

программе   и  в  процедуре.  Поскольку  в  процедуре  нет  другого

объявления  для  переменной "b", то  все изменения, происходящие со

значением "b" в процедуре, сохраняются и после выхода из нее.

    Переменная "a" в основной программе принадлежит к целому типу,

но  в  процедуре  NestEgg  имеется своя собственная переменная "a",

относящаяся  к  типу  char.  Переменная  "a"  из  главной программы

недоступна  в  процедуре  NestEgg.  Все  изменения, происходящие со

значением "a" в процедуре, теряют свой смысл при выходе из нее.

    Следовательно,  в  результате  работы  программы Nest на экран

будут выведены два числа : 0 и 101.

    В турбо-Паскале введено расширение языка, благодаря которому в

процедуре  могут  быть  доступны  как  локальные  относительно  нее

переменные,  так  и  переменные  с  такими  же именами, описанные в

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

обращение к переменным в процедуре выполняется следующим образом. К

локальным переменным обращение реализуется просто по их имени (т.е.

как  в  стандарте языка). Для обращения к переменным, одноименным с

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

форма :

                <имя_программы>.<имя_переменной>.

    Здесь :

           <имя_программы>  - имя программы, указанное в заголовке

                              программы - "program ..."

           <имя_переменной> - идентификатор  переменной, указанный

                              в  разделе  описатетей  переменных -

                              "var ...".

    С учетом этого программу Nest можно преобразовать так, чтобы в

процедуре    NestEgg    были   доступны   одноименные   переменные,

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

               program Nest1;

               var

                  a, b : integer;

               procedure NestEgg;

                  var

                     a, x : char;

                  begin

                     a := '!';

                     x := '?';

                     b := b + 1;

                     Nest1.a := Nest1.a + 12;

                  end;

               begin

                  a := 0;

                  b := 100;

                  NestEgg;

                  Writeln ( a, b );

               end;

    В   результате  работы  программы  Nest1  на  экране  появятся

следующие значения переменных : 12 и 101.

    В  языке  Паскаль  существуют  средства,  позволяющие  сделать

процедуру  более  гибкой. Это достигается благодаря использованию в

процедурах так называемых параметров.

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

    Дополним  формат  описания процедуры следующим образом. После

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

(с помощью которых в процедуру передаются данные) и их типы.

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

формальными   параметрами.   

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

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

параметры заменяются фактическими в ПОРЯДКЕ ИХ ПЕРЕЧИСЛЕНИЯ.

    С   использованием   параметров   процедуру   DrawLine   можно

преобразовать следующим образом :

procedure DrawLinePar ( First, Last : integer; s : char );

   var

      j : integer;

   begin

      for j := First to Last do

          Write ( s );

      Writeln;

   end;

    Обращение к процедуре DrawLinePar может иметь вид :

                   DrawLinePar ( 10, 25, '*' );

                               или

                  DrawLinePar ( n, k, Symbol );

    Здесь n и k  - переменные типа integer;

          Symbol - переменная типа char.

    Такой   способ   передачи   параметров   процедуре  называется

ПЕРЕДАЧЕЙ  ПО  ЗНАЧЕНИЮ.  При  этом значение фактического параметра

делается  доступным для процедуры. Его можно использовать в работе,

изменять  каким-либо образом. Но эти изменения проявляются только в

пределах  процедуры,  т.е.  являются  локальными.  Они НЕ ВЛИЯЮТ на

фактический параметр вне процедуры.

7. Параметры-переменные.

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

параметров,   следует   изменить   способ   передачи  параметров  в

процедуру.  Новый способ называется ПЕРЕДАЧЕЙ ПО ИМЕНИ. В заголовке

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

образом :

         ПЕРЕД ИДЕНТИФИКАТОРОМ ФОРМАЛЬНОГО ПАРАМЕТРА В

      ЗАГОЛОВКЕ ПРОЦЕДУРЫ УКАЗЫВАЕТСЯ КЛЮЧЕВОЕ СЛОВО "var".

    При использовании передачи данных по имени выполнение оператора

вызова   процедуры  приводит  к  отождествлению  адреса  хранения  в

компьютере  формального  параметра  с  фактическим, тем самым любое

изменение  формального параметра вызывает соответствующее изменение

фактического параметра.

    Рассмотрим  этот  способ  передачи данных на примере. Составим

программу,   которая  по  задаваемым  вещественным  числам  x  и  y

вычисляет

                       u = Max ( x+y, x*y )

                                и

                       v = Max ( 0.5, u ).

    Решение     этой     задачи     с     использованием    только

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

program Max ( Input, Output );

var

   x, y, u, v, s : real;

procedure Max2 ( r1, r2 : real );

   begin

       if ( r1 > r2 )

                    then

                        s := r1

                    else

                        s := r2;

   end;

begin

   Readln ( x, y );

   Max2 ( x + y, x * y );

   u := s;

   MAx2 ( 0.5, u );

   v := s;

   Writeln ( ' u = ', u, '   v = ', v );

 end.

    Решение   задачи   с   использованием   параметров-значений  и

параметров-переменных производится следующей программой:

program MaxVar ( Input, Output );

var

   x, y, u, v : real;

procedure Max2Var ( r1, r2 : real, var Res : real );

   begin

       if ( r1 > r2 )

                     then

                         Res := r1

                     else

                         Res := r2;

   end;

begin

   Readln ( x, y );

   Max2Var ( x + y, x * y, u );

   MAx2Var ( 0.5, u, v );

   Writeln ( ' u = ', u, '   v = ', v );

end.

8. Параметры производных типов.

    При  описании  формальных  параметров в заголовке процедуры их

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

Поэтому,  если  формальные параметры принадлежат не к простому типу

(см.  классификацию  типов  данных  в  уроке  No.4), то в программе

необходимо использовать следующие элементы :

    var

       Massiv : array [ 1 .. 12, 1 .. 3 ] of real;

                              . . .

    procedure Matrix ( var Max : real; Mas1 : Massiv );

     ┌──────────────────────────────────────────────────────┐

     │ Использование в заголовке процедуры конструкций типа

     └────────┐ array [ 1 .. 12, 1 .. 3 ] of real ┌─────────┘

              └──────┐   или аналогичных   ┌──────┘

                     │                     │

                     │ !!! НЕДОПУСТИМО !!! │

                     └─────────────────────┘

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

               формальных и фактических параметров.

1. Если   переменная   используется   только   в   процедуре  и  не

  используется  в  главной  программе,  то  ее следует описывать в

  процедуре  (т.е.  там,  где  это возможно, следует использовать,

  локальные переменные).

2. Во  избежание  ошибок  в  качестве  имен  формальных  параметров

  рекомендуется  использовать  идентификаторы,  не  используемые в

  программе для других целей.

3. При вызове процедуры фактические параметры необходимо задавать в

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

  иначе   будет   неправильно   установлено   соответствие   между

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

  соблюдаться  строгое соответствие типов формальных и фактических

  параметров.

4. Если  некоторый формальный параметр представляет собой результат

  работы    процедуры,    то    его    следует    описывать    как

  параметр-переменную. Если же формальный параметр является только

  аргументом   (входным  параметром)  процедуры,  то  его  следует

  объявлять как параметр-значение.

5. В   качестве   параметров   процедуры   можно   в  свою  очередь

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

  применения будет изложена в материале урока No.74.


 

А также другие работы, которые могут Вас заинтересовать

53444. Інтелектуальна гра як одна із форм роботи з обдарованими учнями 422 KB
  Уровень коммуникативной интеллектуальной и творческой активности ребенка в игре зависит от уровня сложности характера игры отношения к ней ребенка и позиции взрослого. Принцип адекватности игры системе социальных отношений в обществе. Принцип рефлексивного последействия который заключается не просто в фиксации результатов игры а в анализе собственных действий каждого участника игры. Для эффективного педагогического воздействия игры на ее участников необходимо согласовывать “просчитывать†складывающиеся в группе отношения.
53445. Інтелектуальна педагогічна гра «Що? Де? Коли?» 121.5 KB
  Гра проводиться між педагогічними працівниками, де гравці пізнають, запам’ятовують нове, орієнтуються в нових ситуаціях, розвивають свою увагу, вивчають свої сильні та слабкі сторони при взаємодії з іншими педагогами, проводять аналіз допущених помилок. В складі команд можуть бути члени методичних комісій або викладачі і майстри виробничого навчання.
53446. Операции над бинарными деревьями 22.87 KB
  Бинарное (Двоичное дерево поиска (англ. binary search tree, BST)) дерево - это конечное множество элементов, которое либо пусто, либо содержит один элемент, называемый корнем дерева, а остальные элементы множества делятся на два непересекающихся подмножества
53447. Формування інформативної компетентності старшокласників засобами Інтернету 50.5 KB
  Чому так відбувається Глобальна мережа Інтернет містить багато різноманітної інформації як корисної енциклопедії новини навчальні сайти тощо так і зовсім некорисної для старшокласників порносайти сайти про насилля. Тому вчителю інформатики дуже важливо навчити учнів орієнтуватися у морі інформації до якої дає доступ мережа Інтернет: обирати потрібну інформацію із заданого питання аналізувати її вірно інтерпретувати. [1] Діяльність вчителя [2] з питання формування інформатичної компетентності старшокласників зводиться до: підбору...
53448. Ukraine is my native country 34.5 KB
  The capital of Ukraine if Kyiv. It is one of the most beautiful cities in the world. It is situated on the banks of the Dnipro River. The streets of Kyiv are wide and nice. They are lined up with chestnut trees. Kyiv is known as the scientific, industrial and cultural centre of the country. The people of our state are proud of their capital and love it with all their hearts. A lot of tourists visit Kyiv and enjoy its beauty and majesty.
53449. Впровадження інтерактивного навчання на уроках німецької мови 8.72 MB
  Актуальність змісту Розширення пізнавальних можливостей учнів, зокрема, у здобуванні, аналізі та застосуванні інформації з різних джерел, можливість перенесення отриманих умінь, навичок та способів діяльності на різні предмети та позашкільне життя учнів.
53451. Інтерактивна гра. «Права людини» 37 KB
  Проблеми Як їх вирішити Членам команд пропонується проблема яку потрібно вирішити. Проблема перша Одна жінка зпоміж членів групи любить співати але на жаль вона співає безперестанку. Чи ви: а нічого не робите і дозволяєте їй співати коли б вона цього незабажала б вимагаєте щоб вона переставала співати коли хтось іде поруч із нею Проблема друга Кілька людей яких поранило при посадці затримують ваш рух і ви побоюєтесь що в такому темпі ви не встигнете добратися до буйка поки не...
53452. Процедура Bubble_sort и ее особенности 18.77 KB
  Сортировка простыми обменами, сортиро́вка пузырько́м (англ. bubble sort) — простой алгоритм сортировки. Для понимания и реализации этот алгоритм — простейший, но эффективен он лишь для небольших массивов.