Метод нисходящего проектирования. Подпрограммы в языке Паскаль. Стандартные модули языка Паскаль. Модульное программирование.

 

 

В практике программирования часто встречаются такие  случаи, когда по ходу выполнения программ приходится выполнять одни и те же вычисления или действия, но при различных исходных данных. Чтобы исключить повторение одинаковых записей и сделать тем самым программу проще и понятнее, можно выделить эти повторяющиеся вычисления в самостоятельную часть программы и использовать многократно по мере необходимости. Такая автономная часть программы, реализующая определенный алгоритм и допускающая обращение к ней из различных частей общей программы, называется подпрограммой.

Подпрограмма является частью другой программы и удовлетворяет требованиям, которые язык программирования предъявляет структуре программы. Разложение программы на взаимосвязанные, но замкнутые и логически завершенные компоненты, дает возможность выполнять разработку отдельных подпрограмм различными программистами более или менее независимо друг от друга. Кроме того, подпрограмма может быть рассмотрена как самостоятельный модуль со своими входными и выходными параметрами, что позволяет использовать ее в общем иерархическом подходе при конструировании алгоритма и программы по принципам нисходящего проектирования.

 Метод нисходящего проектирования программ основан на идее уровней абстракции, которые становятся уровнями модулей в разрабатываемой программе. На этапе проектирования строится схема иерархии, которая изображает эти уровни и позволяется сконцентрироваться сначала на том, что надо сделать  в программе, затем разрабатывать решение. При этом методе проектирования исходная задача, подлежащая решению, делится на ряд подзадач, которые подчиняются главной задаче. Это разбиение называют декомпозицией. Далее эти задачи делятся еще на более мелкие и т.д. до тех пор, пока не получатся задачи,  для решения которых требуются небольшие модули 3-5 строк. Такой метод позволяет упростить решение сложных задач. Паскаль имеет различные средства для деления программы на части. На верхнем уровне деления (больших задач) – это модули, на нижнем уровне (элементарных подзадач) – это процедуры и функции.

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

 

Описание процедур

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

Заголовок процедуры:

                        procedure <имя> (<список формальных параметров>)

·        procedure – это служебное слово,

·        <имя процедуры> определяется в соответствии с общими правилами описания идентификатора,

·        <список формальных параметров> - это перечень имен для обозначения исходных данных и результатов работы процедуры с указанием их типов.

Допускается описание процедур, которые не содержат списка формальных параметров:

procedure <имя>

 

Содержательная часть процедуры (тело процедуры) состоит из раздела описаний и раздела операторов. В составе описательной части процедуры могут быть другие процедуры или функции. Раздел операторов начинается с begin и заканчивается end; .

 

Пример 1. Оформить в виде процедуры алгоритм вычисления  

procedure STEP1 (n: integer; a: real; var y: real);

   var i: integer;

     begin y:=1; for i:=1 to n do  y:=y*a; end;

В описательной части данной процедуры определена переменная i, необходимая и имеющая смысл только внутри данной процедуры. Она называется локальной переменной. Значение локальной переменной не доступно в основной программе.

Пример 2. Оформить эту же процедуру в виде процедуры без параметра.

procedure STEP2;

   var i: integer;

     begin y:=1; for i:=1 to n do  y:=y*a; end;

В данном случае процедура STEP2 не содержит списка формальных параметров и работает с локальной переменной i. Переменные n, y, a являются глобальными по отношению к процедуре STEP2, значит, они должны быть описаны в основной программе и могут использоваться как внутри процедуры, так и в основной программе.

 

Обращение к процедурам

Описание процедуры или функции само по себе никакого действия не вызывает. Чтобы выполнить процедуру или функцию, необходимо обратиться к ней. Обращение к процедуре осуществляется с помощью специального оператора вызова процедуры, который имеет вид:

<имя> (<список аргументов>)

<имя> - имя процедуры, к которой происходит обращение,

<список аргументов> - это перечень конкретных значений и имен, подставляемых на место формальных параметров процедуры при ее выполнении.

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

Пример 3. Составить программу вычисления .

 

Program STEP3;

uses crt;

var m:integer; a,z:real;

procedure STEP1 (n: integer; x: real; var y: real);

   var i: integer;

   begin y:=1; for i:=1 to n do  y:=y*x; end;

begin clrscr;

writeln (‘Введите показатель и основание степени’);

write (‘m =  ’); readln (m); write (‘a =   ’); readln (a);

   if m = 0 then z:=1 else  if  m>0 then  STEP1(m, a, z)

              else STEP1(-m, 1/a, z);

writeln (‘z =   ’, z:5:3); readkey; end.

 

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

 

Пример 4. Составить программу как в  примере 3, используя процедуру без параметра.

Program STEP4; uses crt;

   var m:integer; a,z:real;

   procedure STEP2;

      var i:integer;

      begin z:=1; for i:=1 to m do z:=z*a; end;

begin clrscr; writeln (‘Введите показатель и основание степени’);

write (‘m = ’); readln (m);

write (‘a =  ’); readln (a);

   if m = 0 then z:=1 else

     if m>0 then STEP2 else begin m:=-m; a:=1/a; STEP2; end;

writeln (‘z =   ’, z:5:3); readkey; end.

 

 

 

 

Описание функций

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

Описание заголовка:

function <имя> (<список параметров>): <тип>

<список параметров> - это перечень формальных параметров с указанием их типа,

<тип> - это тип результата, т.е. значения функции.

Допускается описание функций без параметра

function <имя>: <тип>

В содержательной части подпрограммы-функции имени функции должно быть присвоено некоторое значение (значение ответа).

 

Пример 5. Оформить в виде функции алгоритм вычисления степени  .

function STEP5 (m: integer; a: real): real;

var i: integer;

begin y:=1; for i:=1 to m do y:=y*a; STEP5:=y; end;

 

Обращение к функциям

При обращении к функции обязательно должен быть использован оператор присваивания результата имени функции с указание фактических параметров. Если вызывается функция без параметра, то указывается только имя этой функции.

Пример 6. Вычислить , используя функцию с параметром.

 

Program STEP6; uses crt;

var m:integer; a,z,r:real;

function STEP5 (n: integer; x: real): real;

   var i: integer; y: real;

   begin y:=1; for i:=1 to n do y:=y*x; STEP5:=y; end;

begin clrscr;

writeln (‘Введите m и a ’); write (‘m =  ’); readln (m);

write (‘a =   ’); readln (a);

z:=STEP5(3,a)+STEP5(-3,1/a);

if  m=0 then r:=1 else if m>0 then r:=STEP5(m,a) else r:=STEP5(-m,1/a);

z: = (z/2)*r;

writeln (‘z =   ’, z:5:3); readkey; end.

 

Стандартные модули языка Паскаль

Раздел указания используемых модулей начинается с зарезервированного слова uses. Присутствие в программе предложения uses не обязательно. Оно описывается в случаях, если в программе используются константы, типы, переменные, процедуры и функции, определенные в стандартных модулях Турбо Паскаль, кроме модуля System, или в модулях, созданных пользователем.

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

Стандартный модуль System всегда используется по умолчанию и указывать его в предложении uses не нужно. Этот модуль поддерживает такие средства, как файловый ввод-вывод, обработка строк, операции с плавающей точкой, динамическое распределение памяти.

Остальные стандартные модули (наиболее часто используются модули CRT и GRAPH) автоматически не подключаются и, в случае использования, обязательно указываются в предложении uses. Рассмотрим назначение этих модулей:

 

Модульное программирование

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

Модуль состоит из заголовка модуля, интерфейса, исполнительской части, секции инициализации. Объявление модуля начинается с ключевого слова unit

unit <имя модуля>

Заголовок необходим для ссылки на модуль.

Интерфейсная часть модуля начинается служебным словом interface.

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

Раздел исполнительской части или реализации начинается служебным словом implementation. Он содержит тела процедур и функций, перечисленных в интерфейсной части модуля.

Раздел «инициализация» начинается с begin и содержит операторы, необходимые для инициализации модуля, т.е. операторы начальных установок, необходимых для запуска начальных установок модуля. Как правило, операторы инициализации не требуются, поэтому begin можно опустить.

Каждый модуль компилируется отдельно; результат компиляции – файл с расширением .tpu. Чтобы откомпилировать модуль, необходимо сначала сохранить его как любую другую программу с расширением .pas. Затем в меню Compile выполнить команду Make.  

 

Пример. Создать модуль математической функции.

 

Unit math; {заголовок модуля}

interface   {интерфейсная часть модуля}

function power (x: real; n: integer): real; {функция возведения числа в сепень}

function factor (n: integer): integer; {функция вычисления факториала от n}

implementation {исполняемая часть модуля}

    function power;

       var i:integer; y:real;

       begin y:=1; for i:=1 to n do y:=y*x; power:=y; end;

    function factor;

       var i,f:integer;

       begin f:=1; for i:=1 to n do f:=f*i; factor:=f; end;

  end.

 

 

Program Sum;

{Программа вычисляет приближенное значение суммы ряда S=1+x+x^2/2!+…

с точностью, заданной пользователем. Программа использует модуль Math}

uses crt,math; var x,u,eps,s:real; k: integer;

{u–слагаемое, eps–точность, s–сумма, k–число слагаемых}

begin

  write (‘Введите x’); readln(x);

  write (‘Введите eps’); readln (eps);

    s: = 0; u: = 1; k: = 0;

      while abs(u) > eps do begin

          s:=s+u; k:=k+1; u:=power(x,k)/factor(k);

      end;

writeln (‘Результат равен ’, s); readkey; end.

Hosted by uCoz