Строковые типы данных (String)
Тип данных String (строка) специально предназначен для обработки строк (цепочек символов, то есть элементов типа char). Он не относится к простым типам данных и занимает промежуточное место между простыми и структурированными типами данных.
Тип String во многом похож на одномерный массив:
array[0..n] of char, где n <= 255.
Используя краткий и полный формат, переменную типа String можно описать следующим образом:
Var
S : string;
S1 : string[10];
S2 : string[255];
Если максимальный размер строки не указан, то он автоматически принимается равным 255 (максимально возможная длина строки).
Полный формат описания строк используется, если они используются в качестве параметров подпрограмм.
Строки могут выводиться на экран монитора посредством стандартных процедур Write и Writeln и вводиться с помощью стандартной процедуры Read или Readln.
Операции со строками
Существует два пути для обработки переменных типа String.
Первый путь предполагает обработку всей строки как единого целого, то есть единого объекта.
Например, присвоение строчной переменной за одну операцию значения целой строки символов:
Character_string1 := ‘Это – строка!’;
К строкам можно применять операцию конкатенации, которая обозначается знаком “+”. Конкатенация – это объединение строк.
Например,
Character_string1 := ‘Это’ + ‘ – ‘ + ‘строка!’;
Операциюслияния строк str1 и str2 выполняет и функция Concat(str1, str2).
Второй путь рассматривает строку как составной объект, состоящий из отдельных символов, то есть элементов типа Char, которые при обработке доступны каждый в отдельности по номеру их позиции. Иными словами, к любому символу в строке можно обратиться так же, как к элементу одномерного массива.
К отдельному символу строки можно применять те же операции, что и к переменной типа Char.
Например, взаимные операции присвоения значений:
Vars : string;
…..
s[1] := ‘A’;
Стандартные процедуры и функции для строк
ФункцияLength
Встроенная функция Length (длина) позволяет определить фактическую длину текстовой строки, хранящейся в указанной переменной (а не величину предельного размера строки, установленную при декларации).
Например,
Program Demo_Length;
Var
Words : string;
Begin
Write (‘Введите слово:’);
Readln (Words);
Writeln;
Writeln (‘Это слово состоит из ’, Length(Words) : 3, ‘ букв!’);
End.
Примечание. При подсчёте фактической длины строки, учитываются все входящие в неё символы, в том числе и пробелы.
Функция UpCase
Функция UpCase позволяет преобразовать символ любой литеры из строчного в прописной. Эта функция рассчитана на обработку отдельного символа. Поэтому для обработки строки символов с помощью этой функции приходиться организовывать цикл.
Например, замена всех строчных букв в строке на прописные:
Program Demo_ UpCase;
Var
Words : string;
i : integer;
Begin
Words := ‘Фирма Microsoft’;
For I :=1 to Length(Words) do Words[i] := UpCase(Words[i]);
Writeln (Words); {Выводиться текст ‘Фирма MICROSORT’}
End.
Примечание. Русские литеры не могут обрабатываться этой функцией (см. Задача 2).
Функция Copy
Функция Copy позволяет копировать фрагмент некоторой строки из одной переменной в другую. Вызывая функцию Copy, необходимо указывать следующие параметры:
· Имя строки, из которой должен извлекаться копируемый фрагмент;
· Позицию в строке, начиная с которой будет копироваться фрагмент;
· Число копируемых символов.
Пример,
Program Demo_Copy;
VarWords : string[79];
Word1, Word2, Word3 : string[20];
Begin
Words := ‘картографирование’;
WriteLn (Words);
Word1 := Copy(Words, 6, 4);
WriteLn (Word1); {на экран выводиться слово ‘граф’}
Word2 := Copy(Words, 2, 3);
WriteLn (Word2); { на экран выводиться слово ‘арт’}
Word3 := Copy(Words, 11, 3);
WriteLn (Word3); { на экран выводиться слово ‘ров’}
End.
Примечание. Сообщения об ошибке будет в случаях, если начальная или конечная позиции копируемого фрагмента находятся вне пределов исходной строки символов. Результатом выполнения операции в первом случае будет строка нулевой длины, во втором – фрагмент от начальной позиции копирования до конца исходной строки.
Функция Pos
Функция Pos может осуществить в некоторой строке поиск определенного фрагмента. Если заданный фрагмент в строке присутствует, то функция возвращает номер позиции в строке, с которой этот фрагмент начинается. Если фрагмент не найден, то функция возвращает нуль.
Например,
Program Demo_Pos;
Var
Words : string[79];
Search_Word : string[20];
Position : byte;
Procedure Search_stencil;
Begin
Position := Pos (Search_Word, Words);
If Position <> 0 then
Writeln (‘Фрагмент ” ’, Search_Word, ‘ ” содержится в ’, ‘слове ” ’ Words, ‘ ”, начиная с позиции ’, Position : 3)
Else
Writeln (‘Фрагмент ” ’, Search_Word, ‘ ” не содержится в ’, ‘слове ” ’ Words, ‘ ” .‘);
End;
Begin
Words := ‘Электрификация’;
Search_Word := ‘кац’;
Search_stencil;
Search_Word := ‘Кац’;
Search_stencil;
End.
Примечание. Функция Pos требует полного совпадения искомого фрагмента и фрагмента строки, в которой производиться поиск. Причём, большие и маленькие буквы считаются различными символами (“К” не идентично “к”).
Процедуры Insert и Delete
С помощью процедур Insert и Delete можем соответственно вставить фрагмент из одной строки в другую и удалить фрагмент из строки.
Процедура Insert в исходную строку, начиная с указанной позиции, вставляет какую-либо другую строку.
Например, оператор
Insert (Word1, Words, 4);
указывает, что необходимо в строку Words, начиная с 4-ой позиции (перед 4-ой позицией), вставить строку Word1.
Процедура Delete удаляет в исходной строке фрагмент определённой длины, начинающийся с указанной позиции.
Например, оператор
Delete (Words, 2, 3);
удаляет из строки Words фрагмент, состоящий из трёх символов и начинающийся со второй позиции.
Пример использования этих двух процедур на слове “компьютеризация”.
Program Demo_insert_delete;
Var
Words : string[79];
Word1 : string[20];
Begin
Writeln;
Words := ‘компьютеризация’;
Writeln (Words);
Delete (Words, 1,7);
Writeln (Words);
Delete (Words, 3, 2);
Writeln (Words);
Word1 := ‘Г’;
Insert (Word1, Words, 1);
Writeln (Words);
Word1 := ‘не’;
Insert (Word1, Words, 3);
Writeln (Words);
End.
В результате работы данной программы на экран будут выведены следующие строки:
компьютеризация
еризация
ерация
Герация
Генерация
Примечание. Во избежание ошибок при применении процедур Insert и Delete указанные в списке параметров позиции должны обязательно присутствовать в обрабатываемых строках.
Примечание. В ТП7.0 принята концепция жёсткой проверки соответствия типов. При этом строки, имеющие разную длину, считаются несовместимыми. Для ослабления жесткого контроля соответствия строковых типов применяют директиву компилятора $V (контроль длины строк). С помощью этой директивы можно указать компилятору, должен ли он проводить жёсткую проверку соответствия длин строк при передаче параметров в процедуры и функции или нет. Если поставить в тексте программы перед вызовом процедуры директиву {$V-}, то в качестве параметров, передаваемых в вызываемую процедуру, смогут фигурировать строки с длиной, отличающейся от декларированной в описании процедуры.
Например,
{$V-}
My_upcase(Words);
{$V+}
Вторая директива компилятору $V включает жёсткую проверку соответствия длин строк.
Процедура Val
Функция Val преобразует строковый аргумент в его численное значение.
В качестве первого параметра указывается переменная строкового типа, преобразованное значение которой заносится во вторую переменную целочисленного типа. В случае если преобразование прошло успешно, значение переменной code будет равно 0, в противном случае - код ошибки.
Например,
Program Demo_Val;
VarS : string;
A, code : integer;
Begin
S := ‘1234’;
Val(s, a, code);
If code = 0 then WriteLn (‘Строковая переменная хранит число: ’, А : 3)
Else WriteLn (‘Ошибка в преобразовании строкового значения в численное’);
End.
Функция Str
Функция Str преобразует численное значение аргумента в его строковое представление.
Например,
Program Demo_Str;
Var
S : string;
A : integer;
Begin
A := 1234;
S := Str (A);
WriteLn (‘Строковое значение равно ’, S);
End.
Хранение строк
Наряду с символами, представляющими содержание, в строке храниться её длина. Так как каждый символ строки занимает байт и для хранения длины реально введённой строки тоже требуется один байт памяти, то реальная длина области памяти (в байтах), выделяемая для переменной типа string, всегда на единицу больше декларированной.
Поле, хранящее реальную длину введённой строки, можно изменять, то есть присваивать данному полю некоторое значение.
Например,
Character_string[0] := Chr(7);
или
Character_string[0] := #7;
При использовании метода присваивания в качестве присваиваемой величины может выступать величина типа BYTE, преобразованная с помощью префикса # или функции CHR в величину типа CHAR. Такое преобразование необходимо, так как каждый элемент строки, включая показатель длины, должен представляться как символ
Например, внутреннее представление строковой переменной St=’ABCD’:
St=’ABCD’ | |||||
St[0] | St[1] | St[2] | St[3] | St[4] | St[5] |
#4 | ‘A’ | ‘B’ | ‘C’ | ‘D’ | ‘0’ |
Задача 10.1. Объявим строку, состоящую из 60 (_) символов. Выполнить вывод на экран фрагментов этой строки различной длины посредством изменения показателя длины строки.
Program Demo_String;
Var
Words : string[60];
Length_word : byte;
Begin
{Строка, состоящая из 60 символов}
Words := ‘____________________________________________________________’;
For Length_word := 1 to 12 do
Begin
{Установка длины строки}
Words[0] := Chr (Length_word*5);
{Вывод строки указанной длины}
Writeln (Words);
{Вывод пустой строки}
Writeln;
End;
End.
Задача 10.2. Преобразовать строчные литеры русского и английского алфавитов в прописные.
Program My_Function_UpCase;
Uses crt;
Var
Words : string;
Procedure Mu_UpCase (var Words : string);
{Данная программа обеспечивает полное преобразование строчных литер в прописные, включая литеры русского алфавита}
var i : byte; {Данная переменная необходима для организации цикла}
Procedure String_Manipulation (var Words : string; I : byte);
{Данная процедура осуществляет посимвольное преобразование строки}
Begin
words[i] := UpCase (Words[i]);
Case Words[i] of
‘а’ : Words[i] := ‘А’;
‘б’ : Words[i] := ‘Б’;
‘в’ : Words[i] := ‘В’;
{…} {Далее идут операторы для всех остальных литер русского алфавита}
end;
end;
Begin
for I := 1 to Length (Words) do String_Manipulation (Words, i);
end;
Begin
ClrScr;
Words := ‘’;
My_UpCase (Words);
Writeln (Words);
end.
Вопросы для самопроверки
1. Дайте определение строковых переменных?
2. Какие операции применимы к переменным строкового типа?
3. Какие можно осуществить операции с элементами строки?
4. Объясните назначение и применение функций и процедур, используемых при работе со строковыми переменными, таких как:
a. функция Length();
b. функция UpCase();
c. функция Copy();
d. функция Pos();
e. процедура Insert();
f. процедура Delete();
g. функция Val();
h. функция Str()?
5. Каким образом организуется хранение информации о длине строки?
Лабораторная работа №10