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.


 

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

73444. Оцінка збитків від дорожньо-транспортних випадків 31.76 KB
  Збиток у результаті дорожньотранспортного випадку містить у собі кілька складових: збиток від загибелі й поранення людей; збиток від ушкодження транспортних засобів; збиток від псування або втрати вантажу; збиток від ушкодження дорожніх споруджень.
73445. Оцінка та розрахунок витрат при загибелі 72.62 KB
  Оцінка збитку в результаті загибелі й поранення Оцінка загибелі людини що не мала родини Оцінка загибелі людини що мала родину Збиток від важкого поранення людини що одержала інвалідність Для вартісної оцінки збитку суспільства в результаті загибелі й поранення людину методом загальних...
73446. ОБЛАШТУВАННЯ ІНЖЕНЕРНО-ТЕХНІЧНИМИ СПОРУДАМИ АВТОМОБІЛЬНИХ ДОРІГ 51 KB
  Проектування автомобільних доріг Облаштування автомобільних доріг Інженерно-технічні споруди на автомобільних дорогах До облаштування доріг відносяться технічні засоби організації дорожнього рухові дорожні огородження та знаки розмітка напрямні пристрої мережі освітлення системи...
73447. Особенности формирования классного коллектива в начальной школе 133.5 KB
  Коллектив представляет собой устойчивую, привычную систему сплочённых взаимоотношений воспитанников и для его основания необходимы определённые условия. Необходимо объединить детей, построить объединяющие коллективные отношения.
73448. Неолитическая революция 132.5 KB
  Она привела к оседлости значительному росту производительности труда с получением регулярного избыточного продукта и как результат - росту численности и плотности населения общественному разделению труда развитию социальной дифференциации общества новых идей и взглядов.
73449. Особенности грамматического строя речи у детей старшего дошкольного возраста при ОНР III уровня 132 KB
  Цель исследования: выявить наиболее эффективные методики для обследования грамматического строя речи детей с общим недоразвитием речи III уровня. Задачи исследования: Изучить психолого-педагогическую литературу по проблеме исследования...
73450. Современный взгляд на педагогическое наследие А.С. Макаренко 129.5 KB
  Антон Семенович Макаренко яркая личность в области педагогики и социального проектирования ХХ века. Его наследие составляют педагогические сочинения в восьми томах: результаты педагогической деятельности, художественно-педагогические произведения и материалы педагогической практики...
73451. Особенности работы педагога по формированию здорового образа жизни у школьников 128.5 KB
  Правильное отношение к своему здоровью следует формировать у человека с детства, чтобы воспитать гармонично развитую, здоровую личность. В последние годы одной из ведущих стала идея валеологизации образования, согласно которой здоровье детей рассматривается как приоритетная ценность...
73452. Мокьюментари как особый вид киноискусства (на материале фильмов «Первые на луне», «Ноги – атавизм») 127 KB
  На современном этапе развития киноискусства особое внимание уделяется проблеме жанра в кино. Вследствие синтеза различных видов кинематографических произведений появляется большое количество смежных жанров использующих приемы сразу нескольких типов кино.