КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Лабораторная работа № 5
СТРОКИ Цель работы: изучить типы данных для работы с символьной информацией в среде Delphi, разработать методы для выполнения основных действий со строками и получить практический навык их использования.
Теоретические сведения Строка (String) – это структура данных, представленная в виде списка элементов и предназначенная для хранения символьной информации. Символьные данные включают в себя: прописные и строчные буквы, цифры, знаки пунктуации и специальные символы. Для представления этих элементов в электронном виде используют различные виды кодировок, одним из которых является стандарт ASCII (American Standard Code for Information Interchange). В нем каждому символу ставится в соответствие восьмибитовое число (1 байт), позволяющее задать 256 символов (28). Младшие 128 символов (0 ¸127) являются стандартными для ASCII кода, а старшие (128 ¸255) используются для поддержки национального языка в стандарте ANSI (American National Standard of Information). Значения последних зависят от установленного на данный момент в операционной системе набора символов (кодовой страницы). Для русской раскладки клавиатуры – номер кодовой страницы 866. ANSI стандарт не является единственно возможным. В последнее время широкое распространение получил UniCode стандарт. В нем каждому символу ставится в соответствие двух байтное число, что позволяет поддерживать до 65536 символов (216). Первые 128 UniCode символов соответствуют стандарту ASCII, а остальные используются для расширенного кодирования различных национальных языков. Для преобразования 'Символ – Код' и, наоборот, в языке Object Pascal предусмотрены две функции Ord и Chr. Функция Ord возвращает значение кода, который соответствует символу, а Chr – значение символа, которое соответствует его коду. Ord('A') = 65; Chr(65) = 'A'; Ord(Chr(65)) = 65; Chr(Ord('A')) = 'A'. В языке Object Pascal предопределены несколько типов данных для хранения символьной информации (таблица №1). Таблица №1 Символьные типы данных
ANSI или UniCode символы объединяются в последовательности, которые называются строками. Самый простой способ организации строки – это массивы. Var S: array [0..255] of Char; S: array [0..255] of WideChar; Однако в языке Object Pascal предусмотрены более гибкие структуры для работы со строками. Таблица №2 Строковые типы данных
Короткая строка (ShortString) представляет собой последовательность ANSI символов, первый байт которой отведен для хранения текущей длины строки – количества символов в ней. Рис. 1. Структура строки ShortString Несмотря на то, что длина строки может изменяться динамически (от 1 до 255), память под этот тип данных выделяется один раз во время компиляции программы. По умолчанию отводится 256 байт (1 байт для хранения длины строки и 255 – для символов). При необходимости можно ограничить длину строки, указав при объявлении новое значение в квадратных скобках. Var S1: ShortString; // память отводится для 255 элементов S2: ShortString[50];// память отводится для 50 элементов Для нахождения текущей длины строки S = 'ShortString' можно использовать библиотечную функцию Length или непосредственно обратиться к нулевому байту: Length(S) = 10 или S[0] =10. Чтобы изменить текущую длину строки необходимо воспользоваться библиотечной функцией SetLength или записать новое значение (не больше 255) в нулевой байт: SetLength(S, 20) или S[0] = 20. В настоящее время короткие строки практически не применяются, а тип ShortString оставлен в среде Delphi для совместимости с ранними версиями языка Pascal. Длинная строка (AnsiString) представляет собой последовательность ANSI символов, последний байт которой предназначен для хранения символа конца строки (#0). Переменная с типом AnsiString по своей структуре является указателем, т.е. занимает в памяти только 4 байта. В ней храниться адрес первой ячейки памяти, начиная с которой располагаются сами данные. Рис. 2. Структура строки AnsiString Память под переменную с этим типом выделяется автоматически, в зависимости от текущего числа символов в строке. Если AnsiString строка не содержит ни одного элемента, то указатель равен нулю (nil) и на его хранение требуется только 4 байта памяти. Если число символов в строке больше 0, то компилятор автоматически выделяет под них память, размещает в ней новые данные и добавляет в конец нулевой символ (#0). После этого указателю присваивается адрес первой ячейки памяти, начиная с которой были размещены сами символы. Так как переменная с типом AnsiString является указателем, то на одну и туже ячейку памяти могут ссылаться несколько переменных. При этом память под сами символы не выделяется, а происходит только увеличение на единицу счетчика ссылок на них. При изменении исходных данных счетчик ссылок уменьшается на единицу, а в памяти создается новая AnsiString строка. Когда счетчик ссылок уменьшится до нуля, символы из памяти будут удалены автоматически. Этот механизм получил название copy-on-write и позволяет существенно повысить эффективность использования AnsiString строк. Широкая строка (WideString) представляет собой последовательность UniCode символов, заканчивающуюся символом конца строки (#0). Рис. 3. Структура строки WideString Как и строка AnsiString, переменная с типом WideString является указателем, но в отличие от длинных строк в ней хранятся UniCode символы, которые занимают в памяти не один, а два байта (рис. 3). Кроме этого, широкие строки не поддерживают механизм Сopy-On-Write, что делает их применение менее эффективным по сравнению с AnsiString строками. Однако они необходимы для поддержки COM технологии в серверах и интерфейсах. Тип String является родовым как для строк AnsiString, так и для строк ShortString. Его значение зависит от директивы компилятора $H. Если она включена {$H+}, то тип String интерпретируется как AnsiString, если же она выключена {$H-}, то – как ShortString. В среде Delphi эта директива включена по умолчанию, т.е. тип String эквивалентен типу AnsiString. Изменить значение String на ShortString можно и без директивы $H, указав непосредственно длину строки в квадратных скобках. Var S1: String; // Строка AnsiString S2: String[50]; // Строка ShortString Строка PChar представляет собой указатель на массив ANSI символов с нулевым символом конца строки (#0). Этот вид строк является одной из самых простых структур данных, и используется для поддержки функций Windows API и языка С++. В отличие от строк AnsiString индексация символов начинается не с единицы, а с нуля. Кроме этого, тип PChar не имеет счетчика ссылок и длины строки (рис. 4). Рис. 4. Структура строки PChar Память под этот тип данных выделяется автоматически только при присвоении строковых констант. Во всех остальных случаях её необходимо выделять с помощью специальной функции SetLength. Для того чтобы узнать текущую длину строки необходимо воспользоваться библиотечной функцией Length: Length(S) = 6. Тип PChar совместим по присваиванию со строками AnsiString, но для обратной совместимости необходимо использовать явное преобразование типов. Var S1: String; S2: PChar = ‘Указатель’; Begin S1 := S2; // совместимы по присваиванию S2 :=PChar(S1); // явное преобразование типов end; Строки являются часто используемой структурой данных во всех языках программирования. Для работы с ними в среде Delphi предусмотрены стандартные процедуры и функции, действия которых можно представить в виде специального ADT – формата.
|