Билет 26
Модули Турбо паскаля. Их назначение.
Структура модуля. Использование готовых
модулей.
Модуль - это автономно компилируемая
программная единица, включающая в себя
различные разделы описаний (типов, констант,
переменных, процедур и функций) и, возможно,
некоторые исполняемые операторы (например,
присваивание переменным начальных значений
или установление связи между программными
и физическими именами файлов).
- Модуль - это автономно компилируемая
программная единица.
- Модуль
может быть подключен к любой паскаль-программе
или к другому модулю (программной единице).
- Модуль
включает в себя различные разделы описаний
(типов, констант, переменных, процедур
и функций).
- Модуль делится на две основные части:
интерфейсную (interface) и исполняемую (implementation). В интерфейсной части даются описания, которые могут использоваться в программной единице, к которой подключен модуль. В исполняемой части приводятся описания, доступные только внутри модуля.
- Кроме описаний,
модуль может содержать некоторые операторы,
подготавливающие условия для использования
модуля (например, присваивание переменным
начальных значений или установление
связи между программными и физическими
именами файлов). Такие операторы содержатся
в части модуля, которая называется инициализирующей. Эта часть не является обязательной.
- В Объектном
Паскале модуль также может иметь завершительную часть (finalization), состоящую из операторов, обеспечивающих грамотное завершение программной единицы, использующей модуль.
Структура модуля (ТП, ОП):
UNIT имя_модуля;
INTERFACE
интерфейсная_часть
IMPLEMENTATION
исполняемая_часть
[BEGIN
инициирующая_часть]
END.
Структура модуля (ОП):
UNIT имя_модуля;
INTERFACE
интерфейсная_часть
IMPLEMENTATION
исполняемая_часть
[INITIALIZATION
инициирующая_часть]
[FINALIZATION
завершающая_часть]
END.
Имя файла, содержащего модуль:
- Имя_модуля.pas
- При компиляции
ТП: Имя_модуля.pas => Имя_модуля.tpu
ОП: Имя_модуля.pas => Имя_модуля.dcu
Использование модулей:
- Если модуль использует другие модули, то предложение USES может стоять либо после слова INTERFACE, либо после слова IMPLEMENTATION. Модули, подключенные в интерфейсной части, доступны в любой точке рассматриваемого модуля; модули, подключенные в исполняемой части, доступны в любом месте модуля, за исключением интерфейсной части. Примеры использования модулем других модулей будут рассмотрены позже.
Билет 27
Символьная информация в Паскале.
СИМВОЛЬНЫЕ ДАННЫЕ ПРИНИМАЮТ
ЗНАЧЕНИЯ НА МНОЖЕСТВЕ ВСЕХ СИМВОЛОВ,
КОТОРЫЕ МОЖНО ВВЕСТИ С КЛАВИАТУРЫ КОМПЬЮТЕРА
Объявление символьных переменных
в Объектном Паскале:
Var a:char; b: widechar;
Символьный тип – порядковый:
- Все значения
упорядочены, так как имеют номер (код)
в таблице кодирования.
- К символьным
данным (как к данным любого порядкового
типа) применимы встроенные функции:
ORD(сh) – возвращает код символа сh;
CHR(x) – возвращает символ с кодом x; SUCC(сh) – определение следующего за сh символа по кодовой таблице;
PRED(сh) –определение предшествующего символа).
Строковые типы Объектного
Паскаля:
- Тип ShortString эквивалентен типу string Турбо Паскаля.
- Данные
типа AnsiString (могут содержать до 231 символов типа char.
- Тип WideString соответствует строкам максимальной длины до 230 символов типа widechar.
- Тип String: при {$H+} - AnsiString (по умолчанию), при {$H+} – ShortString.
- Типы AnsiString и WideString - ссылочные, динамические, типы; они имеют 8 служебных байтов (вместо одного нулевого у ShortString): служебные байты содержат длину строки
и ссылку на строку в динамической памяти
(куче).
- Объектный
Паскаль разрешает для определения длины
строки использовать только функцию LENGTH, а для установления нового значения длины
только процедуру
SetLength(строка, новая_длина_строки)
- Если для
обработки строк используются встроенные
подпрограммы, то длина строки отслеживается
автоматически, иначе программист должен
использовать SetLength.
Функции, работающие со строками:
- CONCAT(S1 ,S2,...,SN)-функция типа STRING; возвращает строку, представляющую собой сцепление (конкатенацию) строк-параметров S1,S2,...,SN. Конкатенацию строк можно также получить с помощью операции +.
- COPY(ST,INDEX,COUNT)-функция типа STRING; копирует из строки ST COUNT символов, начиная с символа с номером INDEX.
- LENGTH(ST)-функция типа INTEGER; возвращает длину строки ST.
- POS(SUBST,ST)-функция типа INTEGER; отыскивает в строке ST первое вхождение подстроки SUBST и возвращает номер позиции, с которой она начинается; если подстрока не найдена, возвращает нуль.
Процедуры, работающие со строками :
- DELETE(ST,INDEX,COUNT)-удаление COUNT символов из строки ST, начиная с символа с номером INDEX.
- INSERT(SUBST, ST, INDEX) - вставка подстроки SUBST в строку ST, начиная с символа с номером INDEX.
- STR(X[:WIDTH[:DECIMALS]],ST) -преобразование значения типа REAL или INTEGER в строку символов ST так, как это делает процедура WRITELN перед выводом; параметры WIDTH и DECIMALS, если они присутствуют, задают формат преобразования (WIDTH - длину числа, DECIMALS - длину дробной части; параметр DECIMAL имеет смысл указывать только для вещественных чисел).
- VAL(ST, X, CODE) - преобразование строки ST во внутреннее представление целого или вещественного числа Х; параметр CODE содержит нуль, если преобразование прошло успешно, в противном случае он содержит номер символа в строке ST, где обнаружен ошибочный символ; пробелы перед числом в строке ST должны отсутствовать.
Шаги обработки строки таблицы:
- выделение
смысловых полей -подстрок (с помощью функции COPY);
- преобразование некоторых полей из символьного представления в числовое (с помощью процедуры VAL);
- анализ
символьных полей с помощью функции POS;
- подготовка
строки выходных данных с помощью STR и CONCAT.
Билет 28
Переменные сложной структуры. Тип Запись.
Тип Запись:
- Запись - это переменная, состоящая из фиксированного числа компонент, вообще говоря, разного типа, причем каждая компонента имеет свое имя.
- Компоненты
записи также называются полями записи.
- Записи
используются для работы с данными, содержащими
в себе информацию разного типа (числовую,
символьную и т. д.); примеры таких документов:
платежные ведомости (фамилии и имена - символьная
информация, денежные суммы - числовая), карточки больных
в поликлинике, библиотечная информация.
Сравнение двух типов: массив
и запись:
- Компоненты
массива имеют одинаковый тип; компоненты
записи могут иметь разный тип (хотя могут
быть и однотипны).
- Для обращения
к элементу массива надо указать его номер
(индекс), при обращении к полю записи указывается
его имя.
Описание типа запись:
TYPE имя_типа = RECORD
список_1_имен_полей: тип_1;
список_2_имен_полей : тип_2;
. . .
список_N_имен_полей: тип_N;
END;
Память, занимаемая записью,
равна сумме объемов памяти полей (если
исключить из рассмотрения особенности,
связанные с выравниванием). В любом случае
для определения размера памяти записи
можно использовать функцию sizeof(переменная_или_тип).
Обращение к полю записи:
Имя_записи.Имя_поля
Пример.
VAR C:COMPLEX; D,D1:DATE; B:BOOK;
BEGIN . . . C.Re:=5; D.Month:=January; B.Author:='Smith';
{*} D1.Day:=6; D1.Month:=June; D1.Year:=1799;{*}
. .
Билет 29
Задача обработки данных, предоставленных
в табличной форме. Два варианта решения
с использованием строк и записей. Сравнение
этих вариантов.
- Программа,
использующая запись, алгоритмически
проще, чем программа со строками.
- Платой
за упрощение является разрушение структуры
таблицы при вводе: строка таблицы распределяется
по нескольким строкам экрана монитора
компьютера.
Вариант 30
Файлы в программировании:
- Файл - это последовательность однотипных компонент. Число компонент файла не ограничено. После последней компоненты файла стоит специальный код, называемый признаком конца файла; этот код обычно ставится автоматически, без участия программиста.
- В классическом
понимании файл рассматривается как абстрактное
обобщение данных на устройстве с последовательным
доступом, типичным представителем которого
является магнитная лента. В библиотеках
современных языков программирования,
конечно, имеются средства и для работы
с файлами прямого доступа.
Программное и физическое имена файлов:
- Программное
имя - это имя переменной файлового
типа.
- Физическое
имя - это имя устройства или файла
на диске.
- Существуют
специальные операторы, устанавливающие
соответствие (связывающие) программное
и физическое имена файла.
Текстовые и двоичные файлы:
- Текстовые файлы хранят информацию во внешнем представлении. Они имеют два основных признака: во-первых, их компонентами являются строки символов; во-вторых, эта символьная информация интерпретируется в соответствии с типом вводимых или выводимых переменных. Эти файлы являются обобщением данных на устройстве CON (т.е. вводимых с клавиатуры или выводимых на экран компьютера). Умение работать с текстовыми файлами необходимо даже начинающим программистам, так как на устройстве CON данные существуют малый промежуток времени, а обычно имеется потребность в их длительном хранении.
- Двоичный файл - это последовательность байтов; обмен информации между двоичным файлом и переменными программы происходит без преобразования. В Турбо Паскале рассматривается
два вида двоичных файлов: типизированные
и нетипизированные. В случае типизированных файлов байты файла разбиваются на ячейки в соответствии с типом компонент файла; например, для файла с базовым типом integer каждая пара байтов (для 32-разрядных компьютеров – четверка) рассматривается как целое значение; типизированные файлы хранят данные во внутреннем представлении. Для нетипизированных файлов представление
информации безразлично, файл рассматривается
как последовательность нулей и единиц.
Классический подход к работе
с файлами – основные шаги:
- Объявление файловой переменной – программного
имени файла – различно для разных видов
файлов
Var ИмяФайла: textfile; {ТП:text }
Var ИмяФайла: file of БазовыйТип;
Var ИмяФайла: file;
- Связывание программного и физического
имен файлов
AssignFile (ПрограммноеИмя, ФизическоеИмя);{в ТП Assign}
ПрограммноеИмя – переменная, описанная как файл;
ФизическоеИмя – имя файла на диске (полное) или имя устройства.
После оператора AssignFile в программе используется
только программное имя файла.
Пример:
Var f: text; …
Begin …
Assign( f, ‘d:\student\a.txt‘ );
{Далее используется только
f}
- Открытие файла (для чтения или для записи)
Reset (ИмяФайла); {открытие
файла для чтения}
Rewrite (ИмяФайла); {открытие
файла для записи}
Пример:
Var f: text; …
Begin …
Assign( f, ‘d:\student\a.txt‘ );
Reset(f); {или для записи Rewrite(f)}…
- Чтение из файла или запись в файл – различно
для разных видов файлов
Пока для примера рассмотрим чтение/запись
для текстовых файлов:
Read (ИмяФайла, СписокВвода);
Write (ИмяФайла, СписокВывода);
Пример: Read(n,a,b); Write(‘s=‘, s);{полная аналогия
консольному вводу-выводу}
Также можно использовать Readln и Writeln.
Замечание. При работе с файлами используется функция
EOF(ИмяФайла). EOF возвращает значение
True, если считан признак конца файла, и
значение False в противном случае.
EOF – сокр. от End Of File
CloseFile(ИмяФайла); {для ТП - Close
}
Закрытие файла предполагает следующие
действия:
- Сохранение
изменений в файле.
- Перерегистрация
файла в каталоге.
- Разрушение
связи между программным и физическим
именами файлов.
Открытие файла для чтения:
- Поиск файла
с заданным физическим именем; если не
найден, то сообщение об ошибке.
- Указатель
файла устанавливается на первую компоненту.
- Компонента,
на которой стоит указатель, считывается
в буфер.
- Если считан
признак конца файла, то функция EOF устанавливается в значение True, иначе – в значение False.
Открытие файла для записи:
- Поиск файла
с заданным физическим именем; если файл
не найден, то создается новый файл
- Содержимое
файла очищается.
- Указатель
файла устанавливается на конец файла
(после последней компоненты).
- Функция EOF устанавливается в значение True.
Открытие файла для дополнения:
- Поиск файла
с заданным физическим именем; если не
найден, то сообщение об ошибке.
- Указатель
файла устанавливается на конец файла
(после последней компоненты).
- Функция EOF устанавливается в значение True.
Билет 31
Динамические данные.
Динамические данные:
- описываются
не данные, а их адреса (указатели);
- распределяются
и уничтожаются в памяти на этапе выполнения
программы по специальным командам;
- место в
памяти – динамическая память (англ. куча – heap);
- время жизни
и область действия указателей определяется
как для обычных (локальных или глобальных)
переменных