Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Лабораторная работа № 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

Символьные типы данных

Тип Размер в байтах Назначение
ANSIChar Хранение одного ANSI символа
WideChar Хранение одного UniCode символа
Char Сейчас эквивалентен ANSIChar

ANSI или UniCode символы объединяются в последовательности, которые называются строками. Самый простой способ организации строки – это массивы.

Var

S: array [0..255] of Char;

S: array [0..255] of WideChar;

Однако в языке Object Pascal предусмотрены более гибкие структуры для работы со строками. Таблица №2

Строковые типы данных

Тип Максимальная длина Требования к памяти Назначение
ShortString от 2 до 256 Обратная совместимость
AnsiString ~231 от 4 до 2 Гб Хранение ANSI символов
WideString ~230 от 4 до 2 Гб Хранение UniCode символов
String 255 или ~231 от 2 до 256 или от 4 до 2 Гб AnsiString или ShortString

Короткая строка (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 – формата.


Поделиться:

Дата добавления: 2015-08-05; просмотров: 64; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.005 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты