lec_05_06.ppt
- Количество слайдов: 47
Символьные строки Строка символов, или символьная строка, - ОД, хранящий последовательность символов. Спецификация (что задается) · Строки фиксированной длины. При объявлении ОД указывается определенная фиксированная длина. Строка другой длины обрезается или дополняется пробелами до заданной длины. • Строки переменной ограниченной длины: • Память выделяется для максимально возможной строки. При выполнения программы длина строки может меняться от 0 до заданной длины. • Строки переменной длины: • Память выделяется для фактической строки при выполнении программы 1
Строки, оканчивающиеся нулем, или нультерминированные строки - особый вид строк ( С, Object Pascal). Строка реализована как массив символов за последним символом записывается символ с кодом 0, или нуль-символ (#0). 1 и 2 подходы к представлению строк: память для ОД распределяется статически - на этапе компиляции. 3 и 4 подходы: память распределяется динамически - во время выполнения программы. 2
Реализация Для ограниченных строк переменной длины используется дескриптор, указывающий максимальную и фактическую длину строки, содержащейся в ОД. Для представления строк неограниченной длины используется динамическое управление ресурсами памяти. На аппаратном уровне обычно поддерживаются только строки постоянной длины Для реализации остальных способов используется программное моделирование. Все операции основаны на программном моделировании. 3
строка фиксированной длины, хранящаяся в 32 -битных блоках 4
строка ограниченной переменной длины с дескриптором (текущая длина, максимальная длина) 5
строка неограниченной длины, хранящаяся в 32 -битных блоках 6
строка неограниченной длины, реализованная как непрерывный массив символов, заканчивающийся нуль-символом 7
Тип-строка, или строковый тип в Delphi Идентификатор длина память Short. String, String[n] 255 до 256 байт String ~231 до 2 GB Wide. String ~230 до 2 GB Нуль-терминированные строки Type TMy. Null. Term. String = array[0. . 15] of Char; (или через указатель тип PСhar) Реализация String, Wide. String – выделяется 4 байта для адреса начала строки, память для строки выделяется во время выполнения программы (хранятся коды символов, завершаемые#0) 8
Short. String = String[255] Объявление пользовательского строкового типа: type идентификатор = string[длина]; длина - целая константа <=255. Занимаемая память (в байтах): длина + 1 Указанная длина - максимально возможная, то есть строковая переменная объявляется с “запасом”. Длина строки может изменяться в ходе выполнения программы. Изображение значений: ‘символ 1 символ 2. . . ’ 9
Операции сравнения < > = <> <= >= конкатенация (соединение) + Правила выполнения операции сравнения: строки сравниваются посимвольно слева направо до первого несовпадения. 10
Присваивание S : = выражение типа string (char) возможно в любом случае: длина S > длины выражения; длина S < длины выражения (лишняя часть обрезается справа); 11
Функции и процедуры для работы со строковыми величинами Length(S) Функция для определения текущей длины строки S : возвращает целое число. Copy (S, N, K) Функция для выделения части строки S: - возвращает часть строки S, начиная с N-ого символа, и состоящую из K символов. Pos(S 1, S 2) Функция для определения вхождения строки S 1 в строку S 2 : - возвращает номер первого символа, начиная с которого S 1 входит в S 2. Значение функции = 0, если S 1 не входит в S 2. 12
Процедура для удаления части строки S: Delete (S, N, K) - удаляет часть строки S, начиная с N-ого символа, и состоящую из K символов. Процедура для вставки строки S 1 в строку S 2: Insert (S 1, S 2, N) - вставляет строку S 1 в строку S 2, начиная с N-ого символа. 13
Тип-запись Множество значений состоит из совокупностей элементов различных типов. Элементы записи называются полями и могут быть любого типа. Объявление типа: type идентификатор = [packed] record идентификатор поля : тип поля; ……. . end; 14
Выравнивание полей (1, 2, 4, 8) Project-Options-Compiler =packed 15
Записи с вариантами (не все версии) type TFigure = record X, Y: integer; case Kind: integer of 0: (Width, Height: integer); //прямоугольник 1: (Radius: integer); // окружность end; var Z: TFigure; … case Z. Kind of 0: readln(Z. Width, Z. Height); 1: readln(Z. Radius); end; … 16
Операции записи целиком: сравнения = <> по полям : все операции, допустимые для данного типа поля. Обозначение отдельных полей переменной типа запись: Имя_переменной. Имя_поля Присваивание целиком для однотипных записей; по полям с учетом совместимости типов. 17
Оператор WITH - вынесение идентификатора записи за оператор: with идентификатор записи do оператор или составной оператор; { можно не указывать идентификатор записи} Ввод записей: С клавиатуры или текстового файла – только по полям по правилам для соответствующего типа полей. Вывод записей: На экран или в текстовый файл – только по полям по правилам для соответствующего типа полей. 18
Тип-множество Множество значений определяется множеством сочетаний объектов базового множества (все подмножества). Базовое множество значений состоит из перечислений и/или диапазонов значений любого порядкового типа. Объявление типа: type имя=set of <базовое множество> type Digits = set of ’ 0’. . ’ 9’; 19
Реализация Множество хранится как массив битов. Каждый бит указывает, является ли элемент принадлежащим объявленному множеству или нет. Максимальное число элементов множества 256, данные типа множество могут занимать не более 32 байт. Число байтов, выделяемых для данных : Byte. Size = (max div 8) - (min div 8) + 1, max и min — верхняя и нижняя границы базового типа Номер байта для конкретного элемента Е : Byte. Number = (E div 8) - (min div 8), номер бита внутри этого байта: Bit. Number = E mod 8 20
Изображение значений типа множество: [список значений и/или диапазонов]. Не имеет значения порядок записи элементов: [1, 2, 3] = [3, 2, 1] Каждый элемент в множестве учитывается только один раз: [1, 2, 3, 4, 5] = [1. . 5]. Операции: результат - множество объединение множеств + разность множеств пересечение множеств * результат - Boolean сравнения = <> <= >= проверка вхождения отдельного элемента в множество: элемент in множество 21
Файловый тип Предоставляет средства для хранения информации на внешних носителях и работы с ней. Значение - последовательность компонент одного (базового) типа. Базовый тип может быть любым, кроме файлового. Объявление типа type идентификатор типа = file of базовый тип; 22
Типизированный файл - файл с указанным базовым типом. Текстовый файл (стандартный тип!) - состоит из символьных строк произвольной длины. Идентификатор типа текстового файла: Text. File Работа с файлами в программе выполняется через файловые переменные. 23
Файловая переменная - представитель внешнего файла в программе. Объявление файловой переменной: var список переменных: файловый тип; Примеры. var f. Text : Text. File; f 1, f 2 : file of Integer; 24
При работе с файлами используется понятие текущего указателя файла. Текущий указатель файла - указывает на определенную компоненту файла. Нумерация компонент ведется с 0. Текущая компонента - компонента, соответствующая текущему указателю. Операции чтения и записи выполняются с текущими компонентами. 25
Операции над файлами Установочные и завершающие. Ввод и вывод. Перемещения по файлу Специальные. Все эти операции осуществляются с помощью стандартных процедур и функций для работы с файлами. 26
Установочные и завершающие операции procedure Assign. File(F, S: String); связывает файловую переменную F с внешним файлом, имя которого записано в переменной или константе S. Процедура должна быть выполнена до открытия файла. procedure Close. File(F); закрывает внешний файл, с которым связана файловая переменная F. 27
procedure Reset(F); открывает уже существующий внешний файл, с которым связана файловая переменная F. Текущий указатель устанавливается на начало файла. Текстовый файл, открытый процедурой Reset, может использоваться только для чтения. Типизированный файл может использоваться и для чтения, и для записи. 28
procedure Rewrite(F); открывает новый внешний файл, имя которого задано процедурой Assign. File. !!!Если такой файл уже существовал, то вместо него будет создан новый. Текущий указатель устанавливается на начало файла. Текстовый файл, открытый процедурой Rewrite, может использоваться только для записи. Типизированный файл может использоваться и для чтения, и для записи. 29
Перемещения по файлу function EOF(F): Boolean; принимает значение True , если текущий указатель находится за последней компонентой файла (в конце файла), в противном случае - False 30
Специальные операции (для любых файлов) procedure Erase(F); уничтожает файл, с которым связана файловая переменная F. procedure Rename(F; S: String); переименовывает файл, с которым связана файловая переменная F, новое имя - S. Обе процедуры могут быть выполнены только после закрытия файла. 31
Операции над текстовыми файлами Установочные и завершающие procedure Append(F); открывает уже существующий внешний файл, с которым связана файловая переменная F, для записи. Текущий указатель устанавливается в конец файла. 32
Перемещения по файлу function EOLN(F): Boolean; принимает значение True , если текущий указатель установлен на признаке конца строки или в конце файла, в противном случае - False. Примечание. Функция используется при чтении из файла не строками, а отдельными символами или числами. function Seek. EOF(F): Boolean; пропускает пробелы, знаки табуляции и признаки конца строки и устанавливает текущий указатель или в конце файла, или на первом значимом символе. Функция принимает значение True , если текущий указатель установлен в конце файла, и значение False в противном случае. 33
function Seek. EOLN(F): Boolean; пропускает пробелы и знаки табуляции и устанавливает текущий указатель или в конце строки, или на первом значимом символе. Функция принимает значение True , если текущий указатель установлен в конце строки, и значение False - в противном случае. 34
Ввод и вывод procedure Read(F; <список ввода>); <список ввода> - список переменных целого, вещественного, символьного типа или String. Процедура читает значения переменных из файла, с которым связана F- файловая переменная. procedure Read. Ln(F; <список ввода>); Непрочитанная часть строки вместе с признаком конца строки (код 0 D 0 A) пропускается, то есть, выполняется переход к новой строке файла. Примечание. При вводе чисел разделителями могут быть один или несколько пробелов, знаки табуляции и признак конца строки 35
procedure Write(F; <список вывода>); <список вывода> - список выражений целого, вещественного, символьного, логического типа или String. Процедура выводит значения выражений в файл, с которым связана F- файловая переменная. Для выражений можно указать формат вывода, аналогично случаю вывода на экран. procedure Write. Ln(F; <список вывода>); Выводимая информация завершается признаком конца строки (код 0 D 0 A), то есть, выполняется запись в файл признака конца строки. 36
Операции над типизированными файлами Перемещения по файлу function File. Size(F): Long. Int; возвращает количество компонент файла (размер файла). function File. Pos(F): Long. Int; возвращает значение текущего указателя файла (номер текущей компоненты). procedure Seek (F; N: Long. Int); устанавливает текущий указатель на компоненте с номером N. 37
Специальные операции Для типизированных файлов возможно удаление части файла с помощью стандартной процедуры: procedure Truncate(F); удаляет часть файла, с текущей компоненты и до конца. Пример: удаление последней компоненты файла Seek(F, File. Size(F) -1); Truncate(F); 38
Ввод и вывод procedure Read(F; <список ввода>); <список ввода> - список переменных базового типа. Процедура читает значения переменных из файла, с которым связана F- файловая переменная. procedure Write(F; <список вывода>); <список вывода> - список выражений базового типа. Процедура выводит значения выражений в файл, с которым связана F- файловая переменная. 39
function IOResult: Integer; возвращает - число 0, если последняя операция ввода/вывода завершилась успешно, - другое число в противном случае. При использовании IOResult необходимо установить директиву игнорирования ошибок ввода/вывода (I/O-checking) {$I-} а затем вновь ее переключить {$I+} 40
Нетипизированные, или бестиповые файлы Бестиповые файлы применяются для быстрой работы с данными на физическом уровне в соответствии с их внутренним форматом. Объявление файловой переменной: var f: file; 41
Процедуры и функции для работы с бестиповыми файлами procedure Reset(F, Size); procedure Rewrite(F, Size); Параметр Size определяет размер пересылаемого элемента информации в байтах (по умолчанию Size =128) Универсальное значение Size для физического доступа к любым файлам =1 42
Ввод и вывод procedure Block. Read(F, Buf, N, Result); читает из файла N или менее (если достигнут конец файла) компонент и помещает их в переменную Buf. Необязательный параметр Result возвращает фактическое количество считанных компонент. Максимальный размер переносимой информации= N* Size 43
procedure Block. Write(F, Buf, N, Result); выводит в файл N или менее (если заполнится диск) компонент из переменной Buf. Необязательный параметр Result возвращает фактическое количество записанных компонент. Максимальный размер переносимой информации= N* Size 44
Пример - копирование бестипового файла. При открытии надо указать размер компоненты в байтах. Для считывания всего файла его размер должен быть кратен размеру компоненты. Этому требованию всегда удовлетворяет Size=1 Чтение идет по несколько компонент. Оптимальный объем информации – 512 байт (объем физ. сектора на диске). Следовательно, при Size=1, N=512. 45
procedure …………. ; const Size=1; Buf. Size=512; var F 1, F 2: File; Read. Result, Write. Result: Word; Buf: array[1. . Buf. Size] of char; … begin … 46
Assign. File(F 1, ‘…’); Reset(F 1, Size); Assign. File(F 2, ‘…’); Rewrite(F 2, Size); repeat Block. Read(F 1, Buf. Size, Read. Result); Block. Write(F 2, Buf, Read. Result, Write. Result); until (Read. Result=0) or (Read. Result <> Write. Result); if Read. Result=0 then Message. Dlg(‘OK’, mt. Information, [mb. OK], 0) else Message. Dlg(‘диск переполнен’, mt. Error, [mb. OK], 0); Close. File(F 2); Для Windows Close. File(F 1); приложений end; 47


