Строковый тип данных String.
Строка - это последовательность символов кодовой таблицы ASCII. При использовании в выражениях строка заключается в апострофы. Количество символов в строке (длина строки) может динамически изменяться в пределах от 0 до 255. Для определения данных строкового типа используется идентификатор String, за которым следует заключенное в квадратные скобки значение максимально допустимой длины строки данного типа. Если это значение не указывается, то по умолчанию длина строки принимается равной 255 байтам.
Переменную строкового типа можно определить через описание типа в разделе определения типов или непосредственно в разделе описания переменных.
Туре <имя типа> = String [максимальная длина строки];
Var <идентификатор> : < имя типа >;
Переменную типа String можно задать и без описания типа:
Var <идентификатор> : String [максимальная длина строки];
Определение строкового типа устанавливает максимальное количество символов, которое может содержать строка. Строковые данные могут использоваться в программе также в качестве констант. Не допускается применение строковых переменных в качестве селектора в операторе Case.
Например:
Const Address = 'ул. Переверткина, 25'; {Строковая константа}
Type Flot = String [125]; {Длина строки 125 символов}
Var Fstr : Flot; {Описание с заданием типа}
Stl: String ; {По умолчанию длина строки - 255}
St2 : String [50]; {Длина строки - 50}
Nazv : String [280]; {Ошибка, длина Nazv превышает 255}
Тип String похож на одномерный массив символов, но в отличие от массива символов, количество символов в строке может меняться от 0 до N. К любому символу в строке можно обратиться так же, как к элементу массива, т.е. указав рядом с именем переменной типа String, в квадратных скобках индекс символа в строке.
Например:
St [2] - 2-ой символ в строке St;
St [i] -i-ый символ в строке St.
В самом начале строки (под нулевым номером) расположен байт, содержащий значение текущей длины строки. Поэтому для определения объема памяти в байтах, требуемой для размещения строки, к значению ее максимальной длины прибавляется 1. Например, для размещения в памяти переменных Fstr, St2 требуется соответственно 126 байтов и 51 байт.
Для строк применимы операции: операция объединения строк (конкатенация) и операция сравнения.
Операция объединения строк обозначается знаком плюс (но это не сложение).
Например:
Stl: ='abed';
St2: ='efk';
St:= Stl + St2;
Результат работы функции: St содержит 'abedefk'.
Если длина результирующей строки превысит допустимую длину (255), то «лишние» символы отбрасываются.
Перечислим операции сравнения: = ,> = ,>,<>,<, <=. Сравнивать можно строки разной длины. Сравнение осуществляется слева направо в соответствии с ASCII кодами символов. Считается, что отсутствующие символы в более короткой строке имеют код, меньше кода любого действительного символа. Например, 'АВ' больше, чем 'А'.
Тип данных String используется при обработке текстов, а это означает, что необходимо уметь:
-копировать часть строки;
-удалять часть строки;
-вставлять подстроку (т. е. часть строки) в данную строку;
-осуществлять поиск подстроки (т. е. часть строки) в данной строке.
Для реализации этих операций в Турбо-Паскале существуют стандартные процедуры и функции:
Функции и процедуры |
Назначение |
Length (Z: String): Integer |
Возвращает текущую длину строки Z |
Concat (Zi, [Z2,..., Z„] : String) : String; |
Возвращает слияние (конкатенацию) строк ZbZ2,...,Zn. |
Copy (Z: String; Index: Integer; Count: Integer): String; |
Возвращает подстроку строки Z длиной Count, начинающуюся с позиции Index. |
Pos (Substr: String; Z: String): Byte; |
Определяет первое вхождение подстроки Z в строку Substr и возвращает 0, если Z не содержит Substr или номер первого символа Substr в Z. |
Insert (Source: String; Var Z : String;Index: Integer); |
Вставляет в строку Z подстроку Source, начиная с позиции Index . |
Delete (Var Z: String; Index: Integer; Count: Integer); |
Удаляет из строки Z подстроку длиной Count, начинающуюся с позиции Index. |
Str (N : [:Width[:Decimals]]; Var Z: String); |
Преобразует числовое значение N в строковое Z. Возможно задание формата jpN. |
Val (Z; Var N; Var Code: Integer); |
Преобразует строковое значение Z (строку цифр) в значение числовой переменной N. |
Рассмотрим работу функций на конкретных примерах. Используются две процедуры, которые корректно удаляют и вставляют символы в строку. При удалении символов оставшаяся часть строки подтягивается к началу, чтобы занять образовавшуюся после удаления «дырку». При вставке, наоборот, строка раздвигается, чтобы вместить вставляемые символы.
Например, надо удалить из строки St пять символов, начиная с 1-ой позиции:
St: = 'река Волга';
Delete (St, 1, 5);
Получим: St = 'Волга'.
Пусть необходимо удалить все пробелы из начала строки st (пробелы в начале строки называются ведущими пробелами):
While st [1] = ‘ ‘ Do Delete (st, 1,1);
Аналогичный фрагмент можно написать для удаления пробелов из конца строки (завершающих пробелов):
While St [Length (St)] = ‘ ‘ do Delete (St, Length (St), 1);
Например, вставим подстроку S2 в строку S1, начиная с 16-ой позиции.
S1 : ='Я разрабатываю программы '; S2 : = 'хорошие';
Insert (S2, SI, 16);
В результате получим: S1 =' Я разрабатываю хорошие программы'.
При вставке в начало и конец строки действие процедуры Insert аналогично выполнению операции конкатенации. Так, в примере со вставкой звездочек в конец строки можно заменить s : = s + ' * ' на Insert (' * ', s, length (s) +1).
При вставке символов нужно обязательно контролировать длину полученной строки, чтобы не потерять последние символы. При такой потере никакого сообщения об ошибке не выдается.
Например, определим длину строки 123456789.
n : = Length ('123456789');
Результат работы функции n = 9.
Например, выделим из строки S1 пять символов, начиная с 1-ой позиции.
S1: =' Turbo Pascal';
S2: = Copy (S1, 1,5);
S3: = Copy (S1, 7, 3);
В результате получим S2 =' Turbo ', S3 =' Pas '.
Например, объединить три строки символов в строке s.
s: = Concat ('АА', 'XX', 'Y');
В результате s ='AAXXY'.
Функция Concat выполняет те же действия, что и операция конкатенации. Например, для приведенного случая то же самое можно было записать так:
s : = 'АА' + 'XX' + 'Y';
Рассмотрим результат работы функции pos. Он имеет целочисленный тип и равен номеру той позиции, в которой находится 1-ый символ подстроки. Если в строке подстроки не найдено, результат равен нулю.
S1 : = 'Turbo Pascal'; nl: = Pos ('Pascal', S1); n2 : = Pos ('паскаль', S1);
В результате nl = 7; n2 = 0 так как 'паскаль' и 'Turbo Pascal' - это разные строки.
Разработаем в качестве примера программу, проверяющую, является ли введенная совокупность символов именем месяца.
Program lab;
Uses winCrt;
Const inst: Array [1 .. 12] of String [10] = ('январь', 'февраль', 'март',
'апрель', 'май', 'июнь', 'июль',
'август', 'сентябрь', 'октябрь',
'ноябрь','декабрь');
Var Str: String [10];
i: Integer;
Month: Boolean;
Begin
ClrScr;
WriteLn ('Введите имя месяца:');
ReadLn (Str);
For i:=1 To 12 Do
If Str=inst[i] Then Month:=True;
If Month=True Then
writeln ('Введено имя месяца')
Else WriteLn('Heт имени месяца');
End.
Разработаем программу, определяющую количество гласных и согласных букв во вводимой строке.
Program Lab2;
Uses WinCrt;
Const n = 30;
Var a: String [n];
p: String [7];
g, s, i,j,k: Integer;
BEGIN
ClrScr;
p:='aejiouy';
WriteLn ('Введите текст:');
k:=0;
Repeat
k:=k+1;
Read (a[k]);
Until (k=n) Or (a[k]='.');
WriteLn;
g:=0;
s:=0;
For i:=1 To k Do
For j:=1 To 7 Do
If a[i] = p[j] Then g:=g+1;
s:=k-g-1;
WriteLn ('Гласных =', g);
WriteLn ('Согласных = ', s);
End.
Задания для самостоятельного выполнения
1. Составьте программу шифрования текстового сообщения. Можно использовать простейший способ шифрования, при котором шифровальщик задает ключ шифровки - целое число, определяющее величину смещения букв русского алфавита. Например, при значении ключа, равном 3, в тексте буква 'а' меняется на 'г' и т. д. Составьте программу дешифрования текстового сообщения, зашифрованного вашей программой.
2. Дана произвольная строка текста. Выполните сортировку ее символов в порядке возрастания их номеров в таблице ASCII. Например, если введено: 'сва' в результате должно быть получено 'авс'.
3. В заданной строке текста удалите первое и последнее слово.
4. Пусть вводится последовательность символов длиной 10. Посчитайте, сколько среди них цифр.
5. В заданной строке текста выведите самое короткое и длинное слово. Удалите эти слова.
6. В заданной строке текста необходимо выбрать все цифры и записать их в массив. Подсчитайте количество цифр.
7. Даны два слова. Составьте программу, определяющую, можно или нет из букв слова А составить слово В.
8. Если в заданный текст входит каждая из букв слова 'KEY', тогда в качестве ответа вывести слово 'YES', а иначе - слово 'NO'.
9. Дана строка символов. Определить, сколько в ней слов четной длины. Удалить из нее каждое слово четной длины.
10. Дана строка символов. Определить, сколько в ней слов нечетной длины. Удалить из нее каждое слово нечетной длины.
11. В заданной строке текста определите слова, которые начинаются и заканчиваются на одну и ту же букву.
12. Вывести значение true, если в заданном тексте буква 'а' встречается чаще, чем буква 'в', и значение false иначе.
13. Дана произвольная строка текста. Выясните, является ли она палиндромом, т. е. читается ли строка слева направо так же, как и справа налево.
14. Напечатайте заданную последовательность символов, заменяя каждую точку многоточием.
15. Ввести строку, содержащую только цифры. Удалить из строки все впереди стоящие нули.
16. Введите строку, содержащую только цифры. Удалите из строки все нули.