Модуль не представляет собой исполняемой программы, а только содержит набор средств для использования в исполняемой программе: типы данных, переменные, процедуры и функции. Исходный текст модуля имеет расширение .pas. Модуль компилируется отдельно от основной программы, откомпилированный модуль имеет расширение .tpu (Turbo Pascal Unit). Готовый откомпилированный модуль может быть использован в основной программе с помощью предложения uses, которое записывается сразуже после имени программы.
В Турбо Паскале имеются стандартные модули : DOS, CRT (Cathode Ray Tube, электронно-лучевая трубка), Printer, Graph, System и другие. Их не надо описывать, а можно сразу включать в программу предложением uses. Модуль System используется во всех программах, поэтому для него сделано исключение, его можно не включать в предложение uses, он будет подключен автоматически. Остальные модули требуют включения в предложение uses, если в программе используются ресурсы модуля, например, процедуры и функции.
Создание модулей на языке Pascal
Назначение стандартных модулей следующее. Модуль DOS использует системные ресурсы операционной системы MS-DOS . Возможно использование регистров, обслуживание прерываний, вызов других программ из программы на Паскале. Модуль CRT используется для обслуживания видеомонитора, клавиатуры, встроенного динамика. Процедуры очистки экрана clrscr и ожидание нажатия клавиши readkey содержатся именно в модуле CRT.
Модуль Graph содержит богатейший набор графических процедур и функций: проведение линий, работа с цветом, вызов графических примитивов, работа с текстом в графическом режиме, закраска замкнутых областей и т.п. Экран в графическом режиме рассматривается как набор пикселей. Модуль Printer служит для вывода информации на принтер.
Кроме стандартных модулей, в Турбо Паскале возможны модули пользователя, Они требуют описания, которое начинается ключевым словом языка unit и содержат 3 раздела: раздел интерфейса (interface), раздел реализации (implementation), раздел инициализации (необязательный).
После введения модулей Турбо Паскаль стал одним из наиболее распространенных языков профессионального программирования. С помощью модулей оказалось возможным выполнять большие работы коллективом программистов, разбив задачу на отдельные части, каждая из которых разрабатывается одним программистом.
За счет параллельной работы многих программистов срок разработки сокращается во много раз. Руководитель проекта распределяет работу и обеспечивает стыковку отдельных модулей в единое целое. При этом каждый программист может пользоваться своими идентификаторами, независимо от остальных. Совпадение идентификаторов в различных модулях не оказывает влияния на программу, т.к. каждый идентификатор используется в своем модуле.
Рассмотрим пример модуля для работы с комплексными числами. Комплексное число состоит из двух вещественных чисел, действительной и мнимой частей соответственно. Пусть имеются два комплексных числа x и y: x=a+bi; y=c+di. Здесь i квадратный корень из минус единицы (мнимая единица), причем i2= — 1. Если комплексное число z=e+fi, и z есть результат операции над x и y, то
Математические функции в Pascal — ABS, SQR, SQRT, DIV, MOD
z=x+y; e=a+c: f=b+d; (сложение)
z=x-y; e=a-c: f=b-d; (вычитание)
z=x*y; e=a*c-b*d: f=a*d+b*c; (умножение)
z=x/y; e=(a*c+b*d)/(c2+d2): f=(c*b-a*d)/(c2+d2): (деление)
Легко видеть, что при сложении и вычитании складываются и вычитаются соответственно действительные и мнимые части комплексных чисел, умножение и деление более сложны.
Для организации операций над комплексными числами представим каждое комплексное число в виде записи из двух полей вещественного типа: Re –действительная часть, Im – мнимая часть. Создадим модуль complex, в котором опишем комплексный тип com с двумя полями. В этом же модуле в разделе интерфейса опишем процедуры ad (сложение), su (вычитание), mu (умножение), di (деление) комплексных чисел (только заголовки). Тела процедур поместим в раздел реализации модуля. Раздел инициализации имеет вид:
Если раздел инициализации не содержит операторов, как в нашем примере, достаточно написать только end. Пример модуля complex.pas.
4. Если необходимо в двух модулях A и B пользоваться одними и теми же данными,
то обьявлять их в каждом из них — неверно, в этом случае обьявления будут отно-
сится к разным обьектам. В этом случае следует обьявить эти данные в секции связи
одного из модулей ( например A), а в другом (например в B ) предусмотреть ссылку на A.
Причём эту ссылку можно разместить в предложении USES секции связи модуля B .
Такой приём использовать невсегда можно. Ведь если модули ссылаются один на
другой, то предложения USES можно размещать только в секции реализации модуля A.
Тогда внешние обьявления одного модуля будут недоступны для другого. Если
же оператор USES поместить в секцию реализации, то нельзя будет использовать общие
обьявления для описания параметров процедур и функций. Поэтому предлагается сле-
Можно сформировать ещё один модуль C, в котором разместить только обьявления
разделяемых модулями A и B данных, а в секциях связи каждого из этих модулей
предусмотреть ссылки на этот третий модуль С. В тексте этого модуля С секция реали-
зации будет отсутствовать, но ключевой слово IMPLEMENTATION останется.
TYPE ShareRec = Record
Такой вариант является наиболее предпочтительным в тех случаях, когда одни и те же
данные используются несколькими модулями, между которыми существуют какие – то связи
и вводить новые не всегда возможно и целесообразно, логичнее создать новый модуль и
разместить в его секциии связи типы, константы и переменные, разделяемые каждым из
этих модулей. Вообще все глобальные обьявления типов, констант и переменных всегда
рациональнее размещать в отдельном модуле, на который при необходимости ссылаться
как из главной программы, так из каждого отдельного модуля.
Вопросы по теме 5:
- Что представляет из себя cтруктура программы, состоящая из модулей ?
- Как организовать обращения к переменным и константам из различных
модулей, используя уточнённые имена ?
3. Как организовать рекурсивные вызовы модулей ?
4. Как организовать глобальные обьявления для данных, используемых в
Задание по теме 5:
Представить схематически структуру программы, состоящей из нескольких
модулей с изображением ссылок к ним из различных модулей. Показать на
отдельной схеме обращение к переменным, имеющим одинаковые имена, из
различных модулей, составляющих данную программу.
Список использованной литературы
- Сергиевский М.В.,Шалашов А.В. ТУРБО ПАСКАЛЬ 7.0 Язык. Среда программирования.
Москва. Машиностроение. 1994 г.
2 . Немнюгин С.А. TURBO PASCAL. Практикум. ПИТЕР. Москва – Санкт-Петербург – и т.д.
Источник: nsportal.ru
Модуль (unit) на паскале
Был у меня блог на av-school.ru, который в скором времени, возможно, прекратит свое существование, поэтому я перенесу некоторые полезные посты из того блога в этот.
Задача на паскале была такая:
Написать модуль, подключение которого позволяло бы вставлятьудалять символ в любом месте строки, по указателю, заданному пользователем.
при этом дополнительные условия:
1. Нельзя использовать глобальные переменные
2. Необходимо реализовать модель + демонстрационную программу
3. Демка должна иметь удобный интерфейс.
4. Обязательно оформлять отдельные операции в процедурыфункции
5. Исходные данные берутся из input.txt
6. Результаты работы сохраняются в Output.txt
Для начала нужно проставить подзадачи.
1. Забить все процедуры в модуль
2. Написать функциюпроцедуру для удаления символов из строки
3. Написать функциюпроцедуру для добавления символов в строку
4. Сделать демку
Второй шаг — построение алгоритма. И не обязательно оформлять это красиво в блок-схему, как везде учат. Я, конечно, еще не столь опытен, что бы судить, но мне оформление в виде блок-схемы неудобно, это просто долго. А алгоритм для понимания лучше сделать. Я для себя решил проблему так: беру листик с бумагой и начинаю писать.
Просто последовательности-что за чем следует — без ветвлений и красивого оформления циклов.
Алгоритм, который я написал первоначально на листике был таким (Орфография сохранена):
1. Открытие
2. Чтение в STR
РАБОТА СО СТРОКОЙ
1. Измерение длины строки
2. Получение информации для вставки в строку
3. Получение указателя (Число — куда вставлять)
4. Пробежка по строке. Встаем в то место, где нужно вставить.
5. Копирование всего, что есть в строке после этого символа в Str2
6. Срезка строки
7. Вставляем символ
8. Вставляем из Str2 в Str
РАБОТА С ФАЙЛАМИ
1. Запись строки в выходной файл
2. Закрытие файла
То есть, мы получаем информацию из файла —> преобразуем эту информацию в строку и работаем уже с ней —> записываем ее в файл.
Начнем с открытия файла.
Procedure OpenFile(var f:text);
var
err: integer;
str: string;
begin
repeat
Write (‘Введите имя файла : ‘);
Readln (str);
Assign (F, str);
Reset(F);
err := IOResult;
if err<>0 then
begin
writeln(‘файла ‘,str,’ не существует.’);
end;
until (err=0) and (length(str)>0);
end;
В Var находятся 2 переменные:
Err — переменная для хранения информации об ошибке. Ее код.
Str — строка, содержащие имя файла
Попадая в тело процедуры, сразу направляемся в цикл, который будет выполняться , пока не откроется файл (IO код будет равен 0) и Длина имени файла будет больше нуля, или попросту будет подано имя файла.
Write (‘Введите имя файла : ‘); \ Вывод подскаски для пользователя — что от него хочет программа =)
Readln (str); \ Чтение введеной пользователем строки в переменную str (тип : String)
Assign (F, str); \ Связка текстовой переменной f (F: text — как входной параметр для функции) с файлом , имя которого написано в str.
и \ включение обработки исключительных ситуаций dos.
Reset(F); \ Открытие файла на чтение
err := IOResult; \ переменной для ошибок присваиваем значение системной переменной IOResult переменной для ошибок. Это рекомендуется делать, так как значение IOResult будет сменено при следующей операции с файлом. Если все в порядке — она вернет 0. Любые другие значения — это ошибки работы с файлами.
if err<>0 then \ Если код err неравен 0, тогда…
writeln(‘файла ‘,str,’ не существует.’); \ …вывести на экран строку «Файла не существует»
После открытия файла неплохо бы что-то с ним сделать. А в нашем случае это вставка и удаление.
Рассмотрим процедуру вставки в строку:
Procedure IncludeString(var f:text);
var
str, str2, includ, str3: string;
len, place: word;
begin
Reset (f);
Read (f, str);
len := length(str);
Writeln (‘введите добавляемые символ(ы): ‘);
Readln (includ);
Writeln (‘Место указателя’);
Readln (place);
if place > len then
Writeln(‘За пределами файла’);
str2 := copy(str, place, (len — place)+1);
Delete(str,place,(len — place)+1);
str3 := (str + includ+ str2);
Rewrite (f);
Writeln (f,Str3);
close (f);
end;
в блоке переменных 4 переменных строкового типа, а так же 2 типа Word, этот тип целесообразно использовать при работе со строками, так как максимальная длина строки 255 символов, этот тип ее полностью покрывает.
Reset (f); \ открытие файла на чтение
Read (f, str); \ чтение в строку str
len := length(str); \ получение длинны строки и помещение значения в переменную len
Writeln (‘введите добавляемые символ(ы): ‘); \ вывод текста на экран
Readln (includ); \ чтение информации с клавиатуры в строковую переменную include. Это будет наша подстрока для вставки
Writeln (‘Место указателя’); \ снова вывод текста
Readln (place); \ чтение с клавиатуры в переменную численного типа
if place > len then \ проверка вхождения указателя в пределы файла, если True, тогда
Writeln(‘За пределами файла’); \ указатель не входит в границы файла. выводим текст.
str2 := copy(str, place, (len — place)+1); \ Копирование подстроки в переменную str2.
первый = str = с какой строкой работаем
второй = pleaсe = откуда начинаем копирование
тетий = (Len -pleace) +1 = сколько символов копируем.
Delete(str,place,(len — place)+1); \ после этого строка затирается. параметры те же.
str3 := (str + includ+ str2); \ «склеиваем» строки
Rewrite (f); \ открываем файл на перезапись
Writeln (f,Str3); \ записываем новую строку
close (f); \ закрываем файл
Процедура для удаления символа:
Procedure DelChar(var f:text);
var
str: string;
len, place: word;
begin
Reset (f);
Read (f, str);
len := length (str);
Writeln(‘Место указателя’);
Readln (place);
if place > len then Writeln(‘за пределами файла’);
Delete (str, place, 1);
Rewrite (f);
Writeln (f,Str);
close (f);
end;
Строк здесь меньше — всего одна, а так же еще 2 переменные для хранения длины строки и указателя.
Reset (f); \ открытие на чтение
Read (f, str); \ чтение в строку
len := length (str); \ получение длины строки и запись значения в переменную len
Writeln(‘Место указателя’); \ вывод текста
Readln (place); \ чтение информации от пользователя
if place > len then Writeln(‘за пределами файла’); \ поверка вхождения указателя в границы файла
Delete (str, place, 1); \ удаление из строки str, начиная с места Pleace одного символа
Rewrite (f); \ открытия файла на перезапись
Writeln (f,Str); \ запись в файл
close (f); \ закрытие файла
после написания этих функций (а функции добавления и удаления я делал в программах) было проведено несколько тестов, что бы все работало.
Результат — все в порядке.
Источник: pyatnitsev.ru