
ЛАБОРАТОРНАЯ РАБОТА №8
Обработка символьной информации
Строка. Множество.
Строковые типы Delphi
Строковы тип определяет множество символьных цепочек (последовательностей символов).
Shortstring. Этот тип используется для объявления «короткой» строки.
Var
S:shortstring;
Переменной s выделяется память в объеме 256 байтов, из которых 255 байтов для значения строки, а один байт для хранения служебной информации.
Внутреннее представление переменной s: в нулевом байте хранится текущая длина строки в символьном формате, т.е. байт хранит символ, код которого равен количеству символов в строке; каждый байт, начиная с первого, используется для хранения самого строкового значения, при этом в одном байте хранится один символ;
String[n]. В определении типа параметр n определяет количество допустимых символов в строке.
Var
S:string[100];
Переменной s выделяется память в объеме 101 байта. Внутреннее представление полностью соответствует внутреннему представлению переменных типа shortstring.
String. Этот тип в Delphi используется для объявления длинной динамической строки. Максимальная длина строки 2Гб.
Var
S:string;
Переменная s является указателем на область памяти, в которой будет размещено строковое значение. Память переменной выделяется в размере: количество символов плюс один байт при выполнении следующих опреаций: при присваивании переменной значения; при вводе значения в переменную; с помощью процедуры setlength, используемой для массивов.
Внутреннее представление переменной s: последовательность байтов (строковое значение), за которым следует символ конца строки – символ с кодом нуль (терминальный нуль -#0).
AnsiString.
Максимальная длина строки 2Гб. Строковое значение в переменной этого типа завершается терминальным нулем. Но представление в памяти отличается от переменной string. Переменная типа AnsiString является указателем на облаcть памяти, где будет располагаться значение. Соответственно, это динамическая строка и память ей будет выделяться на этапе выполнения. Представление в памяти: последовательность символов строкового значения, затем терминальный нуль и за ним специальная область из четырех байтов – счетчик ссылок. Счетчик ссылок позволяет экономить память, он указывает какое количество переменных ссылаются на это строковое значение. Например,
Var
s1, s2:ansistring;
Begin
s1:=Строковое значение ;
s2:=s1;
End.
В счетчике переменной s1 после присваивания значения было установлено значение один, после присваивания переменной s2 указателя s1, счетчик переменной s1 установился в значение два, т.е. две строки ссылаются на одно значение. Таким образом в памяти хранится один экземпляр строки, но на нее ссылаются две переменных.
Примечание. Строка и массив по внутренней организации похожи, но не идентичны. Строка в отличие от массива хранит дополнительную информацию: либо это длина строки, либо это символ конца строки.
Операции над значениями строкового типа
Присваивания.
Знак операции присваивания :=.
Var
S, s1:string;
Sh:shortstring;
S5:string[5];
Begin
Sh:=’Что?’;
S5:=’Где?’;
S:=’Когда?’;
S1:=s
End.
Конкатенация (сцепление) строк.
Знак операции конкатенации +.
S1:=sh+s5+s;
В результате операций в переменной s1 будет храниться строка: Что?Где?Когда?.
Сравнение.
Равенство строк. Две строки равны, если их длины равны и они посимвольно равны. При посимвольном сравнении сравниваются коды элементов с одинаковыми индексами.
S:=’abc’; S1:=’abc’;
Неравенство строк. Строка s больше строки s1, если длина строки s больше строки s1. Например, S:=’abc’; S1:=’abcd’; т.е. строка S1 больше строки S.
Если строки имеют одинаковую длину, то больше та строка, у которой при посимвольном сравнении обнаружился символ с большим кодом. Например, S:=’adc’; S1:=’abc’; т.е. строка S больше S1.
Определение длины строки.
Эту операцию выполняет функция length(s), где s строковое значение. Результат функции значение целого типа – длина строки.
Var
S:string;
Begin
S:=’Что?Где?Когда’;
Writeln(‘В строке S ’, length(S), ‘ символов’);
End.
Копирование части строки.
Эту операцию выполняет функция copy(s,index,count), где: s – строка, index – индекс элемента строки s, count – количество копируемых элементов. Функция копирует count символов строки s, начиная с элемента с индексом index.
Пример копирования части строки
S:=’Что?Где?Когда’;
S1:=copy(s,5,4); //в строке s1 значение Где?
S1:= copy(s,i+1, length(s)-1);
Определение вхождения подстроки в строку.
Эту операцию выполняет функция pos(sub, s). Ее результатом будет индекс элемента, начиная с которого, подстрока sub полностью разместилась в строке s или 0, если подстрока sub не входит в строку s.
Пример использования операции
Var
S:string;
sub:shortstring;
Begin
S:=’Что?Где?Когда’;
sub:='Где?';
i:=pos(sub,S); //значение i=5
i:=pos('Почему?',S); //значение i=0
End.
Удаление из строки подстроки.
Для выполнения этой операции в Delphi используется процедура Delete(s,index,count), которая из строки s удаляет count символов, начиная с символа в позиции index. Параметр s в вызове процедуры должн быть представлен переменной.
Пример использования процедуры. Удалить из заданного предложения первое слово. Слова в предложении отделяются пробелом.
Var
S:string;
sub:shortstring;
Begin
S:='Первое слово должно быть удалено';
Delete(s,1,pos(' ',s)-1);
Writeln(s); //в s теперь текст: слово должно быть удалено
End.
Вставка строки в строку.
Для выполнения операции вставки в Delphi используется процедура Insert(sub,s,index), которая вставляет строку sub в позицию index строки s. После выполнения операции длина строки s увеличивается на длину строки sub. Параметр s в вызове процедуры должен быть представлен переменной.
Пример использования процедуры. Вставить слово «Последнее» в строку с текстом «слово должно быть удалено» перед первым словом.
Var
S:string;
sub:shortstring;
Begin
S:='слово должно быть удалено';
Insert('Последнее',s,1);
Writeln(s);
End.
Преобразование числа, представленного в числовом формате в строковый формат.
Для преобразования целого числа в строковый формат используется функция inttostr(x), где параметр x любого целого типа. Результатом функции является значение строкового типа.
Пример использования функции. В текст «План специальности xxxxxx» вместо xxxxxx вставить код специальности, представленный как целое число.
Var
S:string;
sub:shortstring;
x:integer;
Begin
S:='План специальности xxxxxx';
Writeln('Введите код специальности');
Readln(x);
Delete(s,20,6);
Sub:=inttostr(x);
Insert(sub,s,20);
Writeln(s);
End.
Для преобразования дробного числа в строковый формат используется функция floattostr(x), где параметр x любого вещественного типа. Результатом функции является значение строкового типа.
Преобразование числа, представленного в строковом формате в числовой формат.
Процедура Val(s,x,kod). Которая предназначена для преобразования строкового представления числа s в формат числовой переменной x. Параметр х может быть целого или вещественного типа. Параметр kod это переменная целого типа. Если преобразование выполнено успешно, то значение переменная kod равно нулю.
Функция strtoint(s). Параметр s строкового типа. Результатом функции является значение целого типа.
Функция strtofloat(s). Параметр s строкового типа. Результатом функции является значение вещественного типа.
Var
S:string;
X, kod:integer;
Y:float;
Begin
S:='123';
Val(s,x,kod); //kod=0
X:=strtoint(s);
S:='12.54';
Val(s,x,kod); //kod =3
Val(s,y,kod); //kod=0
Y:=strtofloat(s);
End.
Операции ввода-вывода.
Для ввода строковых значений в Delphi используется процедуры Read и Readln.
1) Пример поэлементного заполнения строковой переменной.
Var
S:string;
Sh:shortstring;
S5:string[5];
i:integer;
Begin
//заполнение переменной типа shortstring
For i:=1 to 10 do
Read(sh[i]);
S[0]:=chr(10);
//заполнение переменной типа string[5]
For i:=1 to 10 do
Read(s5[i]);
S[0]:=chr(5);
//заполнение переменной типа string
setLength(s,10);
For i:=1 to 10 do
Read(s[i]);
End.
2) Пример ввода строкового значения как единой последовательности символов.
Var
S:string;
Sh:shortstring;
S5:string[5];
i:integer;
Begin
Readln(sh);
Readln(s5);
Readln(s)
End.
Для вывода строковых значений в Delphi используется процедуры write и writeln. Вывод строкового значения можно выполнить поэлементно или как единой последовательности символов.
Примеры вывода строковых значений.
Var
S:string;
i:integer;
Begin
Readln(s):
//Посимвольный вывод строки
For i:=1 to length(s) do writeln(s[i]);
//вывод строки как единой последовательности символов
Writeln(s)
End.