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.


 

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

25143. Проблема буття у філософії 39.5 KB
  Проблема буття у філософії Онтологія вчення про буття. Вперше проблема сформульована Парменідом з якого і починається аналіз проблеми буття у європейській традиції.Що розуміється під буттям І є має нічого що не належало б до буття Парменід.Категорія буття Онтологічне значення методу Сократ Буття як ейдос ПлатонДіалектика буття і небуття як умова розрі нення істини і заблудження.
25144. Філософія Просвітництва: основні засади 23 KB
  Філософія Просвітництва: основні засади Взагалі у широкому сенсі Просвітництво є епохою в історії людства що збігається утвердженням капіталізму і відповідно руйнуванням феодалізму. Цікавими є погляди різних мислителів на епоху просвітництва. Вихідні ідеї епохи Просвітництва: культ науки відповідно Розуму прогрес людства. Усі праці діячів Просвітництва мають у собі ідею апології Розуму його світлої сили.
25145. Mожливості та межі наукового пізнання 32 KB
  Різні види пізнання порізному виконують цю роль. Тому основна задача наукового пізнання вияснити закони у відповідності з якими змінюються та розвиваються обєкти. Орієнтація науки на вивчення обєктів котрі можуть бути включені в діяльність чи актуально чи потенційно як можливі обєкти її майбутнього перетворення і їх дослідження як таких що підкоряються загальним законам розвитку та функціонування складає головну особливість наукового пізнання.
25146. Р. Дж. Колінгвуд Ідея історії 29 KB
  Колінгвуд Ідея історії Ідея Історії безперечно найвідоміша книга Колінгвуда. Колінгвуд вважає що 4 тисячі років тому попередники нашої цивілізації не володіли тим що ми називаємо ідеєю історії. Можна виокремити 4 основні характеристики історії критерії історичної свідомості історичності як такої за Колінгвудом: 1. науковий характер історії.
25147. Поняття та ідеї як форми мислення 27.5 KB
  Копніна при визначенні логіки наукового дослідження проведено визначення поняття та ідей як форм наукового дослідження. Поняття характеризується як структурно складене утворення основу якого складають предмет думки та ознаки що його приписуються. Складеність поняття виявляє можливість відокремлення ознак від одного предмету та встановлення їх відношення до іншого предмету. Оперування поняттями дозволяє через визначення ознак формувати уявлення про ідеальний предмет як носій даних ознак.
25148. Лінійні і циклічні моделі історії 27.5 KB
  Лінійні і циклічні моделі історії Будьяке дослідження історії передбачає вирішення проблем природи історичного процесу його структури рушійних сил напрямку розвитку. Спроби осмислення послідовності наступності конкретних історичних періодів дозволили створити деякі узагальнені структуровані цілісні образи історії. Лінійні моделі це образ історії як незворотньої послідовності подій; геометричним аналогом цієї моделі спрямованості історії є пряма. Найчастіше зустрічається прогресивна лінійна модель історії згідно з якою поступ прогрес...
25149. Аналітична філософія 23 KB
  У широкому сукупність напрямків що характеризуються підвищеною увагою до мови а саме застосуванням методів логічного та лінгвістичного аналізу мови для вирішення філософських проблем. Головні завдання: дослідження мови з метою виявлення структури думки досягнення прозорого співвідношення мови та реальності чітке розмежування значимих та пустих висловлювань осмислених та беззмістовних фраз тощо. Рассел зосередився на аналітичних можливостіх символічної логіки і дослідженню основ математикию Мур же займався аналізом філософських понять...
25150. Поняття проблеми в сучасній методології науки 29.5 KB
  Поняття проблеми в сучасній методології науки Чуйко В. Саме ситуація проблеми є умовою та джерелом самого пізнання оскільки саме пізнання провокується незнанням. Гносеологічне значення поняття проблеми в науці полягає в тому що через неї розгортається висхідне фундаментальне протиріччя процесу пізнання: протиставлення наявного вже досягнутого рівня пізнання і нового.
25151. Поняття трансцедентальної філософії у Канта 28.5 KB
  Виокремлює три здатності людської душі яким відповідають три його критики здатність пізнання критика чистого розуму здатність бажання критика практичного розуму здатність до почуття задоволення і незадоволення критика здатності до судження. В пізнанні не наше уявлення узгоджується з предметом а предмет узгоджується з нашим уявленням тобто людина сама конструює предмет свого пізнання. Трансцедентальне всяке пізнання яке займається не стільки предметами скільки видами нашего пізнання предметів оскільки це пізнання є можливим...