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.


 

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

83227. Планирование аудиторской проверки в ООО «Чернухинские водопроводные сети» 86.86 KB
  Планирование аудита включает в себя составление плана ожидаемых работ и разработку аудиторской программы. Задачи курсовой работы: рассмотреть предварительное планирование; оценить систему бухгалтерского учета и внутреннего контроля в ходе аудита; рассчитать уровень существенности и аудиторский рис в ООО Чернухинские водопроводные сети...
83228. Государственная кадастровая оценка земель города Пензы 163.24 KB
  Массовая оценка недвижимости – это процесс определения стоимости целых групп объектов недвижимости в котором используются как обычные методы оценки так и специфические методы. Выгода массовой оценки недвижимости заключается в том что в результате массовой оценки недвижимости получаются корректные данные о стоимости объектов недвижимости...
83230. Разработка игры «Сбей самолет» 1.22 MB
  Компьютерные игры часто создаются на основе фильмов и книг; есть и обратные случаи. С 2011 года компьютерные игры официально признаны в США отдельным видом искусства. Компьютерные игры оказали столь существенное влияние на общество, что в информационных технологиях отмечена устойчивая тенденция к геймификации для неигрового...
83231. ИССЛЕДОВАНИЕ ДВИГАТЕЛЬНОЙ АКТИВНОСТИ У ДЕТЕЙ МЛАДШЕГО ШКОЛЬНОГО ВОЗРАСТА 106 KB
  Потребность в двигательной активности является как известно важнейшей общебиологической особенностью организма. Однако развитие современной цивилизации привело к тому что большинство современных школьников живёт в условиях пониженной двигательной активности что не благоприятно отражается на здоровье и физиологических возможностях...
83232. АНАЛИЗ УЧЕТА ОСНОВНЫХ СРЕДСТВ НА ПРИМЕРЕ МУП «ТАГИЛСПЕЦДОРРЕМСТРОЙ» 68.68 KB
  Целью курсовой работы является изучить теоретический материал, действующие в настоящее время нормативные акты в сфере учета основных средств, быть в курсе последних изменений законодательства, проанализировать на примере деятельность предприятия в данной области бухгалтерского и финансового учета.
83233. Диагностика внимания у детей младшего школьного возраста 2.95 MB
  Цель исследования – стандартизация проведенных методик на 2-3 классах. Задачи исследования: рассмотреть теории внимания, свойства и виды внимания; отобразить особенности развития внимания в младшем школьном возрасте; изучить проблемы диагностики внимания младших школьников; провести эмпирическое исследование внимания младших школьников...
83234. Процесс производства пластиковых окон отдела ООО «Европрофиль» 237.3 KB
  Первая глава посвящена анализ требований к качеству в ООО Европрофиль Во второй главе проводится анализ нормативной документации по охране труда и экологической безопасности В третьей главе рассматриваются анализ экономических затрат В четвертой главе проводится программа мероприятий по устранению несоответствий.
83235. Разработка программы для вычисления одного из интегралов одним из методом 422.96 KB
  В этой работе выполнено численное вычисление определенного интеграла методом прямоугольников(9) и трапеций(10). Двумя разных интегралов (1), (2) и за один запуск программы выполняется вычисление одного из интегралов одним из методом. Выбор интеграла и метода решения производится с помощью меню, организованного в диалоговом окне.