Опубликован: 06.09.2005 | Уровень: для всех | Доступ: свободно
Лекция 13:

Модульная структура программы

< Лекция 12 || Лекция 13: 1234 || Лекция 14 >

Пример модуля

В качестве примера мы приведем модуль, содержащий арифметические функции 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 ) желающие могут добавить в этот модуль самостоятельно.

Аналогичным образом, полезно единожды написать и отладить подпрограммы, обрабатывающие динамические структуры данных (списки, деревья, стеки и т.п.), сохранить их в специальном модуле, а затем пользоваться ранее проделанной работой вновь и вновь, не тратя времени на повторное программирование. Такой подход очень распространен в программировании вообще и носит несколько неуклюжее название " Повторное использование ранее созданных компонентов " 2" Возможность повторного использования ранее разработанных (программных) компонентов " является точным переводом английского термина reusability. Соответственно, reusable components - это компоненты, допускающие многократное использование. .

Передача аргументов из командной строки

В лекции 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

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

< Лекция 12 || Лекция 13: 1234 || Лекция 14 >
Евгения Поздеева
Евгения Поздеева
Ольга Стебакова
Ольга Стебакова

Вот фрагмент лекции 5 (статья 4):

Проверка множества на пустоту может быть осуществлена довольно просто:

pusto:= true;   for i:= 1 to N do 

if set_arr[i] then begin pusto:= false; break end; {мне кажется здесь должно быть так:

if set_arr[i]<>0 then begin pusto:= false; break end;}

Хотелось бы знать это ошибка в теории или я просто не поняла лекцию?