Простейшая модульность программы может достигаться за счет применения процедур и функций, однако этого не всегда достаточно. Если все подпрограммы содержатся в одном файле, то исправление единственной ошибки в какой-либо подпрограмме приведет к неизбежной перекомпиляции всего кода. А при современных размерах программ компиляция может длиться даже не минуты, а часы.
Кроме того, если коллектив программистов пишет одну большую программу (а именно в таких условиях работают сегодня все производители программного обеспечения), то каждому из них нужно обеспечить более или менее независимый "фронт работ". Даже два человека не могут одновременно исправлять один и тот же файл, иначе конфликт обновлений будет гарантирован. Что уж тут говорить о проектах, над которыми работают десятки и даже сотни человек! В такой ситуации
Несколько
Перечислим самые распространенные
Напомним, что этот
dec , inc, odd , pred, succ );chr , ord, round, trunc );break, continue, exit, halt );concat, copy, delete, insert, length, pos , str, val );dispose , freemem, getmem, new );addr );exclude, include, random, randomize, upcase ). служит для организации "хорошего" вывода на экран. Подробнее о содержимом этого
WinCrt предназначен для создания программ, поддерживающих простейший
позволяет производить вывод информации не на консоль, а на принтер (под операционной системой DOS).
WinPrn является аналогом для операционной системы Windows.
Dos позволяет обмениваться информацией с операционной системой. Системное время, прерывания, состояния параметров окружения, процедуры обработки процессов, работа с дисковым пространством - всем этим занимается Dos.
WinDos является аналогом Dos для операционной системы Windows.
Strings позволяет перейти от стандартных строк языка Pascal к строкам, ограниченным нулем. В отличие от обычных строк, чья длина не может превышать 255 символов, эти строки могут состоять из 65 535 символов, причем конец каждой такой строки помечен символом #0.
содержит разнообразнейшие подпрограммы, которые позволяют создавать на экране различные рисунки из многоцветных
предоставляет возможность делать большие программы оверлейными (многократно использующими одну и ту же область памяти).
WinApi отвечает за создание динамических
Для того чтобы
uses <имя_модуля>;
Если подключаемых
uses <имя_модуля_1>,...,<имя_модуля_N>;
Впрочем, совершенно не обязательно указывать имена всех
Все константы, типы данных, переменные, процедуры и функции, описанные в каком-либо
Например, вы можете пользоваться функцией , не объявляя и не описывая ее, поскольку эта функция включена в состав System, автоматически подключаемого к любой программе на языке Pascal. Если же вы захотите очистить экран монитора перед выдачей результатов, вам придется и воспользоваться содержащейся в нем процедурой clrscr (см. лекцию 14).
Перейдем теперь к детальному изучению структуры
В состав
unit <имя_модуля>;
interface {секция внешних связей}
implementation {секция реализаций}
begin {секция инициализации}
end.
Разберем каждую из этих секций отдельно.
В отличие от заголовка программы ( program <имя_программы>; ), который может и отсутствовать, заголовок unit <имя_модуля>; ) обязан присутствовать всегда.
Кроме того, очень полезно давать modul_1 желательно разместить в файле с именем modul_1.pas, и т.п.
Если для объявления какого-либо объекта нужны сведения об объекте, объявленном в другом
interface [uses <список_вспомогательных_модулей>;] [const <список_внешних_констант>;] [type <список_внешних_типов_данных>;] [var <список_внешних_переменных>;] [procedure <объявление_внешней_процедуры>;] [function <объявление_внешней_функции>;]
Например, пусть у нас есть два mod_const, содержащий описания базовых констант и типов данных, и mod1, использующий эти описания (мы приводим только
unit mod_const; interface const sto = 100; type one_to_sto = 1..sto; ... unit mod1; interface uses mod_const; const dvesti = 2*sto; type massiv = array[1..dvesti] of byte; var a: massiv; b: one_to_sto; function min(x,y:one_to_sto):one_to_sto; ...
(рис 13.1) Пример структуры модульной программыТеперь, если в каком-либо третьем
uses mod1;
то внутри этого третьего massiv, переменные a и b, а также функцию min. Необходимо отметить, что использовать константу sto третий
uses mod_const;
Если в
<имя_модуля>.<идентификатор>
Если имя
Например, если модульная программа имеет структуру, изображенную на рис. 13.1, то таблица доступности переменных будет выглядеть так:
| Связи | Способ обращения к одноименным переменным | |||||||
program prg; |
uses A,B,C; |
p |
a.p |
b.p |
c.p |
не видна | не видна | |
unit A; |
uses C,D,F; |
не видна | p |
не видна | c.p |
d.p |
f.p |
|
unit B; |
uses F; |
не видна | не видна | p |
не видна | не видна | f.p |
|
unit C; |
- | не видна | не видна | не видна | p |
не видна | не видна | |
unit D; |
- | не видна | не видна | не видна | не видна | p |
не видна | |
unit F; |
- | не видна | не видна | не видна | не видна | не видна | p |
|
Замечание: В
unit mod_1; interface uses mod_2; ... unit mod_2; interface uses mod_1; ...
Этот раздел forward здесь является излишним.
Кроме того, в этой же секции объявляются и описываются внутренние (невидимые вне
implementation [uses <список_вспомогательных_модулей>;] [const <список_внутренних_констант>;] [type <список_внутренних_типов_данных>;] [var <список_внутренних_переменных>;] [procedure <описание_внешней_процедуры>;] [function <описание_внешней_функции>;] [procedure <объявление_и_описание_внутренней_процедуры>;] [function <объявление_и_описание_внутренней_функции>;]
В отличие от
unit mod_1; interface ... implementation uses mod_2; ... unit mod_2; interface ... implementation uses mod_1; ...
Хороший пример реальной рекурсии при обращениях к
Смысл рекурсии здесь состоит в том, что вывод некоторого сообщения на заданную позицию экрана при помощи процедуры message, содержащейся в mod_1, может сгенерировать ошибку, сообщение о которой (процедура _error из mod_2 ) снова задействует процедуру message - но уже с другими параметрами.
unit mod_1;
interface
procedure message(x,y: byte; msg: string);
implementation
uses mod_2, crt;
procedure message;
begin if(x in [1..80-length(msg)]and(y in [1..25])
then begin gotoxy(x,y); {позиционирование курсора}
write(msg)
end
else _error('Сообщение не входит в экран')
{вызов процедуры из модуля mod_2}
end;
end.
unit mod_2;
interface
procedure _error(msg:string);
implementation
uses mod_1;
procedure _error;
begin message(1,25,msg); {вызов процедуры из модуля mod_1}
end;
end.
begin <произвольные_операторы> end.
Если сразу несколько
А подключает В (не важно, в какой именно секции), то В будет выполнена раньше, чем А.В и С подключаются на одном уровне (считаются равноправными), то их uses.Замечание: Последовательность
Если каждый C, D, F, A, B. Если же к головной программе
uses B,A,C;
то F, B, C, D, A.
Замечание: Если begin указывать не обязательно. Однако end. обязан закрывать текст
Если необходимо сделать так, чтобы несколько равноправных
(рис 13.2) Использование модуля определений
Исходные тексты .pas, а результаты их ..
Существует три варианта превращения модульной программы в исполняемый код.
.tpu отсутствует), то компилятор выдаст сообщение о недостающем файле. Если в текст какого-либо .pas, но файл .tpu остался прежним), то в исполняемый код программы будет включена старая версия этого В качестве примера мы приведем min и max для целых чисел, а также функцию возведения в степень. Все эти функции отсутствуют в System.
unit my_arifm; interface function min(a,b: longint): longint; function max(a,b: longint): longint; function deg(a,b: double): double; implementation function min; begin if a>b then min:= b else min:= a; end; function max; begin if a<b then max:= b else max:= a; end; function deg; begin deg:= exp(b*ln(a)) end; end.
Теперь, подключив этот tg, ctg, sec, arcsin, arсcos, arctg, arcctg, arcsec ) желающие могут добавить в этот
Аналогичным образом, полезно единожды написать и отладить подпрограммы, обрабатывающие
В лекции 8 мы уже говорили о том, что любая процедура или функция, по сути, является полноценной программой. Но если подпрограммы способны получать аргументы извне, то почему этого не могут делать сами программы?
Однако в языке Pascal нет нарушений единообразия: любая программа тоже способна получать аргументы во время начала работы. Для этого нужно лишь вызывать ее из командной строки следующим образом:
<имя_программы> <список_аргументов>
Список аргументов - это последовательность передаваемых в программу значений, разделенных пробелами или символами табуляции.
В System, автоматически подключаемом к любой программе на языке Pascal, имеются две функции, позволяющие программе принимать
Функция paramcount: word возвращает количество
Функция paramstr(k: word): string возвращает k -й
Если программа модульная, то обработку поступающих из командной строки аргументов удобнее всего занести в
Например:
program arguments;
var i,k,n: word;
begin
n:= paramcount;
writeln('Из командной строки поступило ',n,'
аргументов:');
for i:= 1 to n do
writeln(i,'-й аргумент = ',paramstr(i));
end.
Если теперь вызвать эту программу из командной строки, скажем, с такими аргументами:
arguments abcd -36 +25.062 -t /amp;
то на экране получится следующий результат:
Из командной строки поступило 5 аргументов: 1-й аргумент = abcd 2-й аргумент = -36 3-й аргумент = +25.062 4-й аргумент = -t 5-й аргумент = /amp;
Хорошим стилем считается включать в программу так называемый внешний help: если в нее можно передавать какие-либо аргументы из командной строки, необходимо сообщить потенциальному пользователю их возможные значения и смысл.
Чаще всего для отображения на экране внешней подсказки используются аргументы ? или /?.
Примером может служить краткая экранная подсказка хорошо известного архиватора arj.exe, которая появляется на экране в случае некорректного обращения к этой программе. Подсказка сообщает пользователю: а) имя программы; б) суть того, что именно появилось на экране; в) правила корректного вызова программы; г) примеры корректного вызова; д) краткий список возможных аргументов (команд и ключей).
ARJ 2.50a SHAREWARE Copyright (c) 1990-95 ARJ Software. Dec 12 1995 List of frequently used commands and switches. Type ARJ -? for more help. Usage: ARJ <command> [-<sw> [-<sw>...]] <archive_name> [<file_names>...] Examples: ARJ a -e archive, ARJ e archive, ARJ l archive *.doc <Commands> a: Add files to archive m: Move files to archive d: Delete files from archive t: Test integrity of archive e: Extract files from archive u: Update files to archive f: Freshen files in archive v: Verbosely list contents of archive l: List contents of archive x: eXtract files with full pathname <Switches> c: skip time-stamp Check r: Recurse subdirectories e: Exclude paths from names s: set archive time-Stamp to newest f: Freshen existing files u: Update files (new and newer) g: Garble with password v: enable multiple Volumes i: with no progress Indicator w: assign Work directory m: with Method 0, 1, 2, 3, 4 x: eXclude selected files n: only New files (not exist) y: assume Yes on all queries
Более подробно о правилах организации хорошего интерфейса мы расскажем в следующей лекции.
Простейшая модульность программы может достигаться за счет применения процедур и функций, однако этого не всегда достаточно. Если все подпрограммы содержатся в одном файле, то исправление единственной ошибки в какой-либо подпрограмме приведет к неизбежной перекомпиляции всего кода. А при современных размерах программ компиляция может длиться даже не минуты, а часы.
Кроме того, если коллектив программистов пишет одну большую программу (а именно в таких условиях работают сегодня все производители программного обеспечения), то каждому из них нужно обеспечить более или менее независимый "фронт работ". Даже два человека не могут одновременно исправлять один и тот же файл, иначе конфликт обновлений будет гарантирован. Что уж тут говорить о проектах, над которыми работают десятки и даже сотни человек! В такой ситуации
Несколько
Перечислим самые распространенные
Напомним, что этот
dec , inc, odd , pred, succ );chr , ord, round, trunc );break, continue, exit, halt );concat, copy, delete, insert, length, pos , str, val );dispose , freemem, getmem, new );addr );exclude, include, random, randomize, upcase ). служит для организации "хорошего" вывода на экран. Подробнее о содержимом этого
WinCrt предназначен для создания программ, поддерживающих простейший
позволяет производить вывод информации не на консоль, а на принтер (под операционной системой DOS).
WinPrn является аналогом для операционной системы Windows.
Dos позволяет обмениваться информацией с операционной системой. Системное время, прерывания, состояния параметров окружения, процедуры обработки процессов, работа с дисковым пространством - всем этим занимается Dos.
WinDos является аналогом Dos для операционной системы Windows.
Strings позволяет перейти от стандартных строк языка Pascal к строкам, ограниченным нулем. В отличие от обычных строк, чья длина не может превышать 255 символов, эти строки могут состоять из 65 535 символов, причем конец каждой такой строки помечен символом #0.
содержит разнообразнейшие подпрограммы, которые позволяют создавать на экране различные рисунки из многоцветных
предоставляет возможность делать большие программы оверлейными (многократно использующими одну и ту же область памяти).
WinApi отвечает за создание динамических
Для того чтобы
uses <имя_модуля>;
Если подключаемых
uses <имя_модуля_1>,...,<имя_модуля_N>;
Впрочем, совершенно не обязательно указывать имена всех
Все константы, типы данных, переменные, процедуры и функции, описанные в каком-либо
Например, вы можете пользоваться функцией , не объявляя и не описывая ее, поскольку эта функция включена в состав System, автоматически подключаемого к любой программе на языке Pascal. Если же вы захотите очистить экран монитора перед выдачей результатов, вам придется и воспользоваться содержащейся в нем процедурой clrscr (см. лекцию 14).
Перейдем теперь к детальному изучению структуры
В состав
unit <имя_модуля>;
interface {секция внешних связей}
implementation {секция реализаций}
begin {секция инициализации}
end.
Разберем каждую из этих секций отдельно.
В отличие от заголовка программы ( program <имя_программы>; ), который может и отсутствовать, заголовок unit <имя_модуля>; ) обязан присутствовать всегда.
Кроме того, очень полезно давать modul_1 желательно разместить в файле с именем modul_1.pas, и т.п.
Если для объявления какого-либо объекта нужны сведения об объекте, объявленном в другом
interface [uses <список_вспомогательных_модулей>;] [const <список_внешних_констант>;] [type <список_внешних_типов_данных>;] [var <список_внешних_переменных>;] [procedure <объявление_внешней_процедуры>;] [function <объявление_внешней_функции>;]
Например, пусть у нас есть два mod_const, содержащий описания базовых констант и типов данных, и mod1, использующий эти описания (мы приводим только
unit mod_const; interface const sto = 100; type one_to_sto = 1..sto; ... unit mod1; interface uses mod_const; const dvesti = 2*sto; type massiv = array[1..dvesti] of byte; var a: massiv; b: one_to_sto; function min(x,y:one_to_sto):one_to_sto; ...
(рис 13.1) Пример структуры модульной программыТеперь, если в каком-либо третьем
uses mod1;
то внутри этого третьего massiv, переменные a и b, а также функцию min. Необходимо отметить, что использовать константу sto третий
uses mod_const;
Если в
<имя_модуля>.<идентификатор>
Если имя
Например, если модульная программа имеет структуру, изображенную на рис. 13.1, то таблица доступности переменных будет выглядеть так:
| Связи | Способ обращения к одноименным переменным | |||||||
program prg; |
uses A,B,C; |
p |
a.p |
b.p |
c.p |
не видна | не видна | |
unit A; |
uses C,D,F; |
не видна | p |
не видна | c.p |
d.p |
f.p |
|
unit B; |
uses F; |
не видна | не видна | p |
не видна | не видна | f.p |
|
unit C; |
- | не видна | не видна | не видна | p |
не видна | не видна | |
unit D; |
- | не видна | не видна | не видна | не видна | p |
не видна | |
unit F; |
- | не видна | не видна | не видна | не видна | не видна | p |
|
Замечание: В
unit mod_1; interface uses mod_2; ... unit mod_2; interface uses mod_1; ...
Этот раздел forward здесь является излишним.
Кроме того, в этой же секции объявляются и описываются внутренние (невидимые вне
implementation [uses <список_вспомогательных_модулей>;] [const <список_внутренних_констант>;] [type <список_внутренних_типов_данных>;] [var <список_внутренних_переменных>;] [procedure <описание_внешней_процедуры>;] [function <описание_внешней_функции>;] [procedure <объявление_и_описание_внутренней_процедуры>;] [function <объявление_и_описание_внутренней_функции>;]
В отличие от
unit mod_1; interface ... implementation uses mod_2; ... unit mod_2; interface ... implementation uses mod_1; ...
Хороший пример реальной рекурсии при обращениях к
Смысл рекурсии здесь состоит в том, что вывод некоторого сообщения на заданную позицию экрана при помощи процедуры message, содержащейся в mod_1, может сгенерировать ошибку, сообщение о которой (процедура _error из mod_2 ) снова задействует процедуру message - но уже с другими параметрами.
unit mod_1;
interface
procedure message(x,y: byte; msg: string);
implementation
uses mod_2, crt;
procedure message;
begin if(x in [1..80-length(msg)]and(y in [1..25])
then begin gotoxy(x,y); {позиционирование курсора}
write(msg)
end
else _error('Сообщение не входит в экран')
{вызов процедуры из модуля mod_2}
end;
end.
unit mod_2;
interface
procedure _error(msg:string);
implementation
uses mod_1;
procedure _error;
begin message(1,25,msg); {вызов процедуры из модуля mod_1}
end;
end.
begin <произвольные_операторы> end.
Если сразу несколько
А подключает В (не важно, в какой именно секции), то В будет выполнена раньше, чем А.В и С подключаются на одном уровне (считаются равноправными), то их uses.Замечание: Последовательность
Если каждый C, D, F, A, B. Если же к головной программе
uses B,A,C;
то F, B, C, D, A.
Замечание: Если begin указывать не обязательно. Однако end. обязан закрывать текст
Если необходимо сделать так, чтобы несколько равноправных
(рис 13.2) Использование модуля определений
Исходные тексты .pas, а результаты их ..
Существует три варианта превращения модульной программы в исполняемый код.
.tpu отсутствует), то компилятор выдаст сообщение о недостающем файле. Если в текст какого-либо .pas, но файл .tpu остался прежним), то в исполняемый код программы будет включена старая версия этого В качестве примера мы приведем min и max для целых чисел, а также функцию возведения в степень. Все эти функции отсутствуют в System.
unit my_arifm; interface function min(a,b: longint): longint; function max(a,b: longint): longint; function deg(a,b: double): double; implementation function min; begin if a>b then min:= b else min:= a; end; function max; begin if a<b then max:= b else max:= a; end; function deg; begin deg:= exp(b*ln(a)) end; end.
Теперь, подключив этот tg, ctg, sec, arcsin, arсcos, arctg, arcctg, arcsec ) желающие могут добавить в этот
Аналогичным образом, полезно единожды написать и отладить подпрограммы, обрабатывающие
В лекции 8 мы уже говорили о том, что любая процедура или функция, по сути, является полноценной программой. Но если подпрограммы способны получать аргументы извне, то почему этого не могут делать сами программы?
Однако в языке Pascal нет нарушений единообразия: любая программа тоже способна получать аргументы во время начала работы. Для этого нужно лишь вызывать ее из командной строки следующим образом:
<имя_программы> <список_аргументов>
Список аргументов - это последовательность передаваемых в программу значений, разделенных пробелами или символами табуляции.
В System, автоматически подключаемом к любой программе на языке Pascal, имеются две функции, позволяющие программе принимать
Функция paramcount: word возвращает количество
Функция paramstr(k: word): string возвращает k -й
Если программа модульная, то обработку поступающих из командной строки аргументов удобнее всего занести в
Например:
program arguments;
var i,k,n: word;
begin
n:= paramcount;
writeln('Из командной строки поступило ',n,'
аргументов:');
for i:= 1 to n do
writeln(i,'-й аргумент = ',paramstr(i));
end.
Если теперь вызвать эту программу из командной строки, скажем, с такими аргументами:
arguments abcd -36 +25.062 -t /amp;
то на экране получится следующий результат:
Из командной строки поступило 5 аргументов: 1-й аргумент = abcd 2-й аргумент = -36 3-й аргумент = +25.062 4-й аргумент = -t 5-й аргумент = /amp;
Хорошим стилем считается включать в программу так называемый внешний help: если в нее можно передавать какие-либо аргументы из командной строки, необходимо сообщить потенциальному пользователю их возможные значения и смысл.
Чаще всего для отображения на экране внешней подсказки используются аргументы ? или /?.
Примером может служить краткая экранная подсказка хорошо известного архиватора arj.exe, которая появляется на экране в случае некорректного обращения к этой программе. Подсказка сообщает пользователю: а) имя программы; б) суть того, что именно появилось на экране; в) правила корректного вызова программы; г) примеры корректного вызова; д) краткий список возможных аргументов (команд и ключей).
ARJ 2.50a SHAREWARE Copyright (c) 1990-95 ARJ Software. Dec 12 1995 List of frequently used commands and switches. Type ARJ -? for more help. Usage: ARJ <command> [-<sw> [-<sw>...]] <archive_name> [<file_names>...] Examples: ARJ a -e archive, ARJ e archive, ARJ l archive *.doc <Commands> a: Add files to archive m: Move files to archive d: Delete files from archive t: Test integrity of archive e: Extract files from archive u: Update files to archive f: Freshen files in archive v: Verbosely list contents of archive l: List contents of archive x: eXtract files with full pathname <Switches> c: skip time-stamp Check r: Recurse subdirectories e: Exclude paths from names s: set archive time-Stamp to newest f: Freshen existing files u: Update files (new and newer) g: Garble with password v: enable multiple Volumes i: with no progress Indicator w: assign Work directory m: with Method 0, 1, 2, 3, 4 x: eXclude selected files n: only New files (not exist) y: assume Yes on all queries
Более подробно о правилах организации хорошего интерфейса мы расскажем в следующей лекции.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.