Модульное программирование на примере сортировки последовательностей

Автор работы: Пользователь скрыл имя, 21 Декабря 2011 в 21:16, курсовая работа

Краткое описание

Модульное программирование. Здесь основная идея заключалась в том, чтобы "спрятать" данные и процедуры внутри независимых программных единиц - модулей. Эту идею впервые реализовал Н. Вирт в алгоритмическом языке Modula (1975-1979 годы), а затем "подхватили" и остальные, распространенные в то время языки программирования. Например, известные системы программирования Turbo Pascal и Turbo С.

Содержимое работы - 1 файл

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

— 274.50 Кб (Скачать файл)

     В виде модулей в Borland Pascal реализованы библиотеки подпрограмм, использование которых существенно упрощает разработку программ.

     Вместе  с системой программирования на Borland Pascal поставляются следующие библиотеки:

  • System – основная библиотека – содержит описание всех стандартных процедур и функций, таких, как математические функции, функции преобразований, процедуры и функции обработки строки и т.п. Ресурсы данной библиотеки доступны любой программе без специального указания.
  • Crt – библиотека управления экраном в текстовом режиме – содержит описание переменных, констант и процедур и функций, обеспечивающих управление экраном, клавиатурой и динамиком.
  • Graph – библиотека управления экраном в графическом режиме – содержит описание переменных, констант и процедур и функций, обеспечивающих управление экраном в графическом режиме.
  • Dos – библиотека организации взаимодействия с операционной системой MS DOS – содержит описание процедур и функций, обеспечивающих обращение к функциям операционной системы.

     Поставляемые вместе с описанными модули Turbo3, Printer, Graph3, Overlay устарели и практически не используются.

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

  1. Основные  характеристики программного модуля

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

  • хороший модуль снаружи проще, чем внутри;
  • хороший модуль проще использовать, чем построить.

      Майерс  предлагает для оценки приемлемости программного модуля использовать более  конструктивные его характеристики:

  • размер модуля;
  • прочность модуля;
  • сцепление с другими модулями;
  • рутинность модуля (независимость от предыстории обращений к нему).

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

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

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

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

      В модульных языках программирования как минимум имеются средства для задания функционально прочных  модулей (например, модуль типа FUNCTION в  языке ФОРТРАН). Средства же для задания  информационно прочных модулей  в ранних языках программирования отсутствовали. Эти средства появились только в более поздних языках. Так в языке программирования Ада средством задания информационно прочного модуля является пакет.

      Сцепление модуля - это мера его зависимости по данным от других модулей. Характеризуется способом передачи данных. Чем слабее сцепление модуля с другими модулями, тем сильнее его независимость от других модулей. Для оценки степени сцепления Майерс предлагает упорядоченный набор из шести видов сцепления модулей. Худшим видом сцепления модулей является сцепление по содержимому. Таким является сцепление двух модулей, когда один из них имеет прямые ссылки на содержимое другого модуля (например, на константу, содержащуюся в другом модуле). Такое сцепление модулей недопустимо. Не рекомендуется использовать также сцепление по общей области - это такое сцепление модулей, когда несколько модулей используют одну и ту же область памяти. Такой вид сцепления модулей реализуется, например, при программировании на языке ФОРТРАН с использованием блоков COMMON. Единственным видом сцепления модулей, который рекомендуется для использования современной технологией программирования, является параметрическое сцепление (сцепление по данным по Майерсу) - это случай, когда данные передаются модулю либо при обращении к нему как значения его параметров, либо как результат его обращения к другому модулю для вычисления некоторой функции. Такой вид сцепления модулей реализуется на языках программирования при использовании обращений к процедурам (функциям).

      Рутинность  модуля - это его независимость от предыстории обращений к нему. Модуль называется рутинным, если результат (эффект) обращения к нему зависит только от значений его параметров (и не зависит от предыстории обращений к нему). Модуль называется зависящим от предыстории, если результат (эффект) обращения к нему зависит от внутреннего состояния этого модуля, изменяемого в результате предыдущих обращений к нему. Майерс не рекомендует использовать зависящие от предыстории (непредсказуемые) модули, так как они провоцируют появление в программах хитрых (неуловимых) ошибок. Однако такая рекомендация является неконструктивной, так как во многих случаях именно зависящий от предыстории модуль является лучшей реализаций информационно прочного модуля. Поэтому более приемлема следующая (более осторожная) рекомендация:

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

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

 

3. Текст файла проекта

Моя программа  состаит из 3 частей: основная(kyrsavik) и два модуля(MyGraph, Massiv).

Текст основной части:

program kyrsavik;

uses crt, massiv, MyGraph;

 
 

var mas:A;

 

procedure My;

 

var

v: integer;

s, s1: string;

tip_sort:integer;

begin

 

  s := vubor_faila;

v := vubor_zapoln;

  case v of

1: zap_c_klav(s);

2: zap_sl_ch(s);

3:begin

s1 := vubor_faila;

If (proverka(s1)=0) then

begin

zagruzka_is_fila(s1,s);

end

else

begin

file_not;

finish;

exit;

end;

end;

end;

 
 
 

tip_sort := vubor_metoda_sort;

  ris_ramki;

  vuvod_mass(s,0);

  sortirovka(s, tip_sort);

 

vuvod_mass(s,1);

vuvod_kol;

 
 

finish;

 

Текст модуля Massiv:

unit massiv;

 

interface

const n=5;

  Type A=array [1..n] of integer;

  Type filetype=file of integer;

 

var  kol_sr, kol_per:integer;

 

procedure zap_sl_ch(name:string);

procedure sohranenie_v_file(name: string; name1:string);

procedure zagruzka_is_fila (name:string; name1:string);

procedure sortirovka1(name:string);

procedure sortirovka2(name: string);

procedure sortirovka(name: string; tip:integer);

function MasF(var f:filetype; i:integer):integer;

procedure MasFSave(var f:filetype; i:integer; n:integer);

procedure sort(var f: filetype; lb, ub: integer);

procedure merge(var f: filetype; lb, split, ub: integer);

function proverka(s: string):integer;

implementation

 

procedure zap_sl_ch(name:string);           {§ Ї®«­Ґ­ЁҐ б«гз ©­л¬Ё зЁб« ¬Ё}

var i:byte;

r:integer;

F:file of integer;

begin

Assign(f,name);

{$I-}

rewrite(f);

{$I+}

 

For i:=1 to n do

begin

r := random(20);

write(f, r);

end;

close(F);

end;

 
 
 
 

procedure sohranenie_v_file(name:string; name1:string) ;  {б®еа ­Ґ­ЁҐ ¬ ббЁў  ў д ©«}

var i: integer;

r: integer;

f,f1: file of integer;

begin

Assign(f,name);

Assign(f1,name1);

reset(f);

{$I-}

rewrite(f1);

{$I+}

 

while not EOF(f) do

begin

read(f, r);

write(f1, r);

end;

close(f);

close(f1);

end;

 

procedure zagruzka_is_fila (name:string;name1:string);

Информация о работе Модульное программирование на примере сортировки последовательностей