- •Глава 6
- •6.1. Понятие структурного типа
- •6.2. Регулярные типы (массивы)
- •6.3. Строковый тип
- •6.4. Комбинированные типы (записи)
- •6.4.1. Определение типа "запись"
- •6.4.2. Записи с вариантами
- •6.4.3. Оператор присоединения
- •6.5. Множественные типы
- •6.6. Файловые типы
- •6.7. Текстовые файлы
- •6.7.1. Определение текстового файла
- •6.7.2. Ввод числовых данных из текстовых файлов
- •6.7.3. Вывод числовых данных в текстовый файл
- •6.8. Ссылочные типы
- •6.8.1. Динамические переменные
- •6.8.2. Линейные списки
- •6.9. Типизированные константы
6.3. Строковый тип
Для удобства работы с массивами символов в языке Турбо Паскаль введен строковый тип STRING .
При описании переменных строкового типа указывается максимальная длина строки n. Максимально возможная длина строки n = 255 символов.
Примеры описаний:
CONST n = 50;
VAR a : STRING[n];
b : STRING .
Для строки a максимальное количество символов - 50, для строки b- 255.
Каждой компоненте величины типа STRING отводится один байт. Нумерация элементов - от единицы. Нулевой байт содержит информацию о фактическом количестве символов в строке .
Над данными строкового типа возможны операции конкатенации и отношения.
Операция конкатенации обозначается знаком "+" и реализует объединение строк. Например, в результате выполнения операторов:
a:='начало';
b:=a + '*добавка';
WriteLn((b)
будет отпечатано
начало*добавка.
Для операций отношения действуют следующие правила: а) более короткая строка считается меньше длинной; б) если длины сравниваемых строк равны, то происходит поэлементное сравнение символов этих строк с учетом упорядоченности в списке ASCII.
При выполнении присваивания a := b происходит перепись символов из строки a в строку b в количестве, не превышающем n - максимального размера строки a . Заметим, что при выполнении поэлементных присваиваний, например, a[k]:='z' , не происходит корректировка значения текущей длины строки даже если символ 'z' будет записан после последнего символа.
Для работы со строками язык Турбо Паскаль имеет несколько стан-дартных функций и процедур.
Функция Length(st:STRING):integer |
возвращает значение текущей длины строки st. |
Функция Concat(S1,S2...Sn:STRING): STRING |
выполняет слияние строк S1,S2...Sn (аналог операции конкатенации) |
Функция Copy(st:STRING; nom:integer; kol:integer):STRING |
возвращает подстроку, выделенную из строки st длиной kol символов, начиная с символа с номером nom . |
Процедура Delete(VAR st:STRING; nom:ineger; kol:integer) |
удаляет из строки st подстроку длиной kol символов, начиная с символа с номером nom . |
Процедура Insert( st:STRING; VAR stn:STRING; nom:integer) |
вставляет строку st в строку stn, начиная с символа с номером nom. |
Процедура Pos( st:STRING; stn:STRING):byte |
производит поиск подстроки st в строке stn. Результат - номер позиции под-строки st в строке stn. Если подстрока не найдена то результат равен нулю. |
Пример 6.3.1. Демонстрация работы со строками .
PROGRAM Strdemo;
CONST n=50;
VAR a,b,St : STRING[n];
k,kp : integer;
BEGIN
{ Ввести две строки символов (a,St) }
Write('Строка a : '); ReadLn(a);
Write('Строка St : '); ReadLn(St);
{ В строке "a" подсчитать количество символов "+" }
kp:=0;
FOR k:=1 TO n DO
IF a[k]='+' THEN kp:=kp+1;
WriteLn('Количество "+" = ', kp);
{ Записать в строку "b" все прописные буквы } { латинского алфавита из строки "a" }
b:=''; { пустая строка }
FOR k:=1 TO Length(a) DO
IF (a[k]>='A') AND (a[k]<='Z') THEN b:=b+a[k];
WriteLn('Получилась строка:', b);
{ "Вычистить" строку St, оставив в ней только буквы } { русского алфавита и круглые скобки }
FOR k:=Length(St) DOWNTO 1 DO
CASE St[k] OF
'А'..'Я' , 'а'..'п' , 'р'..'с' , '(' , ')' :
ELSE Delete(St,k,1)
END;
WriteLn('Результат:', St);
{ А теперь перед каждой открывающей скобкой вставить } { звездочку, а после закрывающей - точку }
FOR k:=Length(St) DOWNTO 1 DO
CASE St[k] OF
'(' : Insert('*', St , k);
')' : Insert('.', St , k+1)
END;
WriteLn('После обработки:', St)
END.
В двух последних случаях длина строки в процессе обработки изме-няется, поэтому для правильной работы программы приходится перемещать-ся по строке справа налево .
Задачи
6.3.1. В строке символов подсчитать количество букв латинского ал-фавита.
6.3.2. Выяснить, имеется ли в строке хотя бы один символ “#“ .
6.3.3. Выполнить зеркальное отображение строки символов относи-тельно середины (т.е. перевернуть строку, не строя новой).
6.3.4. В строке определить номер позиции, в которой впервые встре-чается символ "+".
6.3.5. Имеется массив слов (массив строк, в каждой строке - одно слово). Выявить все слова-перевертыши (например: кок, потоп).
6.3.6. Имеется массив фраз. Выявить все фразы-перевертыши (напри-мер: а роза упала на лапу Азора).
6.3.7. Подсчитать, сколько раз в строке символов встречается каждая буква латинского алфавита.