Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Программные модули.






 

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

 

Стратегия пошаговой детализации предназначения для разработки любой программы как иерархии шагов проектирования, которые определяют задачи, затем расширяют задачи в разделы проекта в соответствии с требованиями задач. Каждая детализация задачи – часть программы, для которой задается спецификация в терминах функции частного значения, которой она должна удовлетворять. Эта функция описывает преобразования данных, которые должна выполнять часть программы.

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

· Данные, описанные в модуле, будут доступны только операторам процедур модуля и не доступны операторам вне модуля.

· Операторы внутри процедур модуля работают только с параметрами процедур и данным модуля и не работают с данными вне модуля.

Программный модуль обеспечивает механизм для хранения, обработки и выборки данных для программы. Иллюстрацией такого подхода является объявление файлов типа TEXT и операторы READ и WRITE, которые управляют такими файлами. Эти операторы предоставляют единственный способ для сохранения и выборки данных. Взаимодействие между модулем и остальной частью программы осуществляется через символьные параметры в операторах READ и WRITE.

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

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

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

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

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

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

 

Числа.

 

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

 

Как иллюстрация простого модуля который обеспечивает как сохранение/выборку так и вычисления рассмотрим задачу, которая включает счет до 999, например, подсчет пробелов в строке. В некоторых случаях требуется увеличивать счетчик по единице, или определить текущее значение, сохраняемое счетчиком, или обнулить счетчик. Для этого может быть разработан модуль, в котором счет организован в трех символьных переменных как в программе CountChars в разделе 1.6.3.

 

VAR

Ones, Tens, Hundreds: CHAR;

 

и процедуры:

 

Start {обнуляет счетчик}

Bump {Увеличивает счетчик на единицу}

Value(VAR V100, V10, V1: CHAR) {Возвращает значение счетчика}

 

Модуль разрабатывается таким образом, что после выполнения Start модуль содержит натуральное число из трех цифр. Если счетчик содержит 999, Bump не меняет значение счетчика. В Pascal-программе использующей этот модуль, переменные модуля должны быть помещены в раздел VAR.

 

 

{начало модуля счетчика}

 

{В разделе VAR}

Ones, Tens, Hundreds: CHAR;

 

{После раздела VAR}

PROCEDURE Start;

{Сбрасывает счетчик в ноль}

BEGIN{Start}

Ones: = '0';

Tens: = '0';

Hundreds: = '0'

END; {Start}

 

PROCEDURE Bump;

{Увеличивает 3-значный счетчик определенный Ones, Tens, Hundreds

на единицу, если он находится в диапaзоне от 0 до 999 }

PROCEDURE NextDigit(VAR Digit: CHAR);

BEGIN {NextDigit}

IF Digit = '0' THEN Digit: ='1' ELSE

IF Digit = '1' THEN Digit: ='2' ELSE

IF Digit = '2' THEN Digit: ='3' ELSE

IF Digit = '3' THEN Digit: ='4' ELSE

IF Digit = '4' THEN Digit: ='5' ELSE

IF Digit = '5' THEN Digit: ='6' ELSE

IF Digit = '6' THEN Digit: ='7' ELSE

IF Digit = '7' THEN Digit: ='8' ELSE

IF Digit = '8' THEN Digit: ='9' ELSE

IF Digit = '9' THEN Digit: ='0'

END; {NextDigit}

BEGIN {Bump}

NextDigit(Ones);

IF Ones = '0'

THEN

BEGIN

NextDigit(Tens);

IF Tens= '0'

THEN

BEGIN

NextDigit(Hundreds);

IF Hundreds= '0'

THEN

BEGIN

Ones: = '9';

Tens: = '9';

Hundreds: = '9'

END

END

END

END; {Bump}

 

PROCEDURE Value (VAR V100, V10, V1: CHAR);

{Возвращает содержимое счетчика}

BEGIN {Value}

V100: = Hundreds;

V10: = Tens;

V1: = Ones

END; {Value}

{Конец модуля счетчика}

 

Объявление трех переменных и трех процедур задет модуль счетчика, который может быть вставлен в любую программу, в которой есть необходимость в таком счетчике. Для соблюдения ограничений модуля достаточно, чтобы оставшаяся часть программы не использовала глобальные переменные Ones, Tens, Hundreds. Тогда счетчик полностью скрыт за тремя процедурами Start, Bump и Value.

Этот модуль счетчика может быть использован для решения задач подсчета количества пробелов в строке.

 

PROGRAM CountingBlanksInText(INPUT, OUTPUT);

VAR

Ch, X100, X10, X1: CHAR;

{Включить модуль счетчика}

BEGIN {CountingBlanksInText}

Start; {обнулить счетчик}

WHILE NOT EOF

DO

BEGIN

WHILE NOT EOLN

DO

BEGIN

READ(Ch);

IF Ch = ‘ ‘

THEN

BEGIN

Bump; {Увеличиваем счетчик на едеинцу}

Ch: = ‘#’;

END;

WRITE(Ch);

END;

READLN;

WRITELN

END;

WRITELN;

Value(X100, X10, X1); {получаем значение счетчика}

IF (X100 = ‘9’) AND (X10 = ‘9’) AND (X1 = ‘9’)

THEN

WRITELN(‘Количество пробелов как минимум 999’)

ELSE

WRITELN(‘Количество пробелов ’, X100, X10, X1)

END. {CountingBlanksInText}

 

INPUT:

Now is

the time for

all good men.

 

OUTPUT:

##Now#is#

the##time#for

all#good##men.

 

Количество пробелов 010

 

Для выделения, процедурные операторы, обращающиеся к счетчику, снабжены комментариями. В эхо ввода пробелы заменяются # чтобы они могли быть видны. Основная стоимость использования модуля в собранной программе – это дублирование переменных Hundreds, Tens и Ones в модуле переменными X100, X10, X1 в блоке вне модуля. Если бы вызов Value был удален, могли бы быть исключены и переменные X100, X10, X1 и значения Hundreds, Tens и Ones распечатаны напрямую. Но это нарушает ограничение, что данные описанные в модуле доступны только операторам внутри модуля. Несколько лишних переменных – небольшая цена за возможность повторного использования модуля, который тщательно проверен и протестирован раз и навсегда и использован многократно в других программах. Библиотека модулей может быть более полезной, чем библиотека процедур, если модули будут хорошо подобраны и правильно написаны.

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.