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.


 

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

85062. Национальные интересы России в современном мире. Основные угрозы национальным интересам и безопасности России 34.01 KB
  Национальные интересы России в современном мире. Основные угрозы национальным интересам и безопасности России Цель урока. Сформировать у учащихся представление о национальных интересах России как совокупности сбалансированных интересов личности общества и государства; убеждение в возрастании в современных условиях роли гражданина России в деле обеспечения национальных интересов России. Дать учащимся общее понятие об угрозе национальным интересам и безопасности России которую несут в себе последствия чрезвычайных ситуаций природного...
85063. Формирование общей культуры населения в области безопасности жизнедеятельности 32.12 KB
  Формирование общей культуры населения в области безопасности жизнедеятельности Цель урока. Систематизировать представления учащихся об общей культуре населения в области безопасности жизнедеятельности подчеркнув значение уровня культуры населения в области безопасности жизнедеятельности для обеспечения национальной безопасности России. Общая система обеспечения безопасности населения страны. Уровень культуры в области безопасности населения страны и национальная безопасность России.
85064. Опасные и чрезвычайные ситуации, общие понятия и определения, их классификация 31.06 KB
  Сформировать понимание недостижимости абсолютной безопасности населения и возрастания роли каждого человека в обеспечении личной безопасности в различных опасных и чрезвычайных ситуациях. Ключевые понятия в области безопасности жизнедеятельности. Подчеркнуть что человек на протяжении периода своего существования на Земле в первую очередь стремился расширить сферу своей жизнедеятельности и обеспечить свое благополучие и очень мало заботился об обеспечении безопасности своей жизнедеятельности. Не случайно обеспечением безопасности...
85066. Чрезвычайные ситуации природного характера, их причины и последствия 30.73 KB
  Чрезвычайные ситуации природного характера их причины и последствия Цель урока. Систематизировать знания учащихся о наиболее характерных опасных природных явлениях и чрезвычайных ситуациях природного происхождения возникающих на территории нашей страны. Повторить основные причины возникновения чрезвычайных ситуаций природного характера и их возможные последствия. Напомнить о необходимости знать местные признаки приближения опасного природного явления.
85067. Чрезвычайные ситуации техногенного характера, их причины и последствия 30.7 KB
  Сформировать у учащихся более полное представление о факторах опасности техносферы для безопасности жизнедеятельности населения страны обратив внимание на источники техногенных опасностей основные причины их возникновения. Сформировать убеждение что повышение уровня культуры в области безопасности жизнедеятельности всего населения страны это приоритетный путь повышения уровня безопасности жизнедеятельности личности общества и государства. Изучаемые вопросы Факторы опасности техносферы для безопасности жизнедеятельности населения страны....
85068. Военная угроза национальной безопасности России. Международный терроризм — угроза национальной безопасности России 35.59 KB
  Военная угроза национальной безопасности России. Международный терроризм угроза национальной безопасности России Цель урока. Познакомить учащихся с внешними внутренними и трансграничными угрозами национальной безопасности России в современном мире. Обоснованно показать учащимся возрастание роли Вооруженных сил России по обеспечению военной безопасности государства и укрепления Вооруженных сил РФ.
85069. Наркобизнес как разновидность проявления международного терроризма 33.03 KB
  Смертность среди наркоманов за последние 10 лет увеличилась: в Германии почти в 5 раз в Италии в 4 раза во Франции в 3 раза в России в 12 раз по данным Интерпола и ООН. была раскрыта наркоситуация в России на современном этапе. На конгрессе в частности говорилось: Масштабы и темпы распространения наркомании в стране таковы что ставят под вопрос физическое и моральное здоровье наших граждан стабильность общества затрагивая по существу вопросы национальной безопасности России. В настоящее время по данным специалистов в...
85070. Виды террористических актов, их цели и способы осуществления 30 KB
  Обобщить знания учащихся о терроризме как идеологии насилия и террористической деятельности. Познакомить с основными видами террористической деятельности и основными чертами современного терроризма. Изучаемые вопросы Терроризм и террористическая деятельность. Основные виды терроризма.