РАБОТА СО СТРОКАМИ
Тип String (строка) в Турбо Паскале широко используется для обработки текстов. Этот тип является стандартным и во многом похож на одномерный массив символов Array [0..N] of Char. Значение N соответствует количеству символов в строке и может меняться от 0 до 255. Символы, входящие в строку, занимают позиции с 1 до N. Начальный байт строки с индексом 0 содержит информацию о ее длине, т.е. это символ с кодом, равным длине строки.
Можно, также описывать переменные типа String[K], где K - целое число не больше 255. Так определяются строки с длиной не больше K. Этот тип уже не является стандартным. С символами строки можно работать как с элементами массива из символов, но в отличие от массивов, строки можно вводить целиком, сравнивать друг с другом и сцеплять операцией "+".
ПРИМЕР: Работа со строками.
var s,x,y,z:string;
begin
x:='turbo';
y:='pascal';
z:=x+' '+y; { z='turbo pascal' }
s:=''; { пустая строка }
for c:='a' to 'z' do s:=s+c; { s='abcd..xyz' }
writeln(s);
end.
Сравнение строк выполняется посимвольно в соответствии с их кодами до первого несовпадения. Если одна из строк закончилась до первого несовпадения, то она считается меньшей. Пустая строка меньше любой строки.
ПРИМЕР: Сравнение строк.
'abcd' > 'abcD' { 'd'>'D' }
'abcd' > 'abc' { 'd'>'' }
'abc' < 'axxc' { 'b'<'x' }
'abcd' = 'abcd'
Существует ряд стандартных функций и процедур для работы со строками.
- Функция Length(s) выдает длину строки s.
- Функция Concat(s1,s2,..,sn) возращает строку s1+s2+..+sn.
- Функция Copy(s,p,k) возвращает фрагмент строки s, который начинается в позиции p и имеет длину k.
- Функция Pos(s1,s) ищет первое вхождение подстроки s1 в строку s и возвращает номер первого символа s1 в строке s или 0 если не нашли.
- Процедура Delete(s,p,k) удаляет из строки s фрагмент, который начинается в позиции p и имеет длину k.
- Процедура Insert(s,s1,p) вставляет в строку s подстроку s1, начиная с заданной позиции p.
Турбо паскаль позволяет производить преобразования числовых значений в строковые и наоборот. Для этого используются процедуры Str(X:n:d,S) и Val(S,X,e). Первая получает их числа X строку S с изображением этого числа, в которой не менее n символов и из них d знаков после запятой. Параметры n и d необязательные. Вторая процедура получает из строки S число X. При успешном результате e=0.
Задача 1.
Из заданной строки выделить подстроку длиной 6 знаков (либо до конца строки, если осталось меньше), которая начинается с первой встретившейся в строке, буквы ‘f’. Распечатать эту подстроку или выдать сообщение, что ее нет.
Решение:
Var s,s1:string; k:integer;
Begin
Readln(s);
k:=Pos('f', s);
If k=0 then writeln(‘Такой подстроки нет’)
Else begin S1:=copy(s,k,6);
writeln(s1);end;
End.
Алгоритм подсчета количества заданного символа в строке:
Var s:string; c:char; k, i: integer;
begin
Readln(s); read(c);
k:=0;
for i:=1 to length(s) do
if s[i]=c then k:=k+1;
Writeln(k);
End.
Алгоритм удаления всех пробелов в строке:
Var s:string; i: integer;
begin
Readln(s);
i:=1;
While i<= length(s) do
begin
if s[i]=‘ ‘ then delete(s,i,1) else i:=i+1;
End;
Writeln(s);
End.
Алгоритм поиска в строке подстроки длины k и подсчета количества:
Var s, s1:string; k, i: integer;
begin
Readln(s); readln(s1);
k:=length(s1);
for i:=1 to length(s)-k do
if copy(s, i,k)=s1 then k:=k+1;
Writeln(k);
End.
Алгоритм просмотра строки по словам:
Readln(s);
S:=s+' ';
repeat
k:=pos(' ',s);
c:=copy(s,1,k-1);
If {условие на с} then writeln(c);
delete(s,1,k);
until s='';
Задача 2.
Вводится текст, состоящий из слов, между которыми пробел. Поменяйте местами первое и последнее слово.
Решение:
Определим первое слово
k:=Pos(' ', s);
S1:=copy(s,1, k-1);
Определим последнее слово
i:=length(s);
While s[i]<>' ' do i:=i+1;
S2:=copy(s, i+1, length(s)-i);
Поменяем местами слова
Delete(s,i+1, length(s)-i);
Delete (s, 1, k-1);
S:=s2+s+s1;
Задача 3.
Вводится строка. Найдите все слова, содержащие букву «е».
Решение:
Рассмотрим подзадачу проверки содержит ли слово заданную букву. Реализуем решение подзадачи в виде подпрограммы-функции:
function yes(a:string):boolean;
var i: integer;
Begin
for i:=1 to length(a) do
if a[i]='e' then yes:=true else yes:=false;
end;
Решим основную задачу поиска всех слов, содержащих букву «е»
Readln(s);
S:=s+' ';
repeat
k:=pos(' ',s);
c:=copy(s,1,k-1);
If yes(c) then writeln(c);
delete(s,1,k);
until s='';
Алгоритм просмотра строки по словам:
Readln(s);
S:=s+' ';
repeat
k:=pos(' ',s);
c:=copy(s,1,k-1);
If {условие на с} then writeln(c);
delete(s,1,k);
until s='';
Задача 4.
Подсчитайте, сколько в заданном тексте содержится слов палиндромов.
Алгоритм решения:
- Составить подпрограмму проверки, является ли слово палиндромом. (Палиндром читается слева направо и справа налево одинаково).
- В основной программе выполнить поиск в строке по словам, проверяя для каждого взятого слова, является ли оно палиндромом.
- Если слово – палиндром, то насчитывать количество.
- Результат вывести на экран.
program z4;
var x,y:string;
i,j,k,l:integer; f:boolean;
function per(s:string):boolean;
var c:string;
k,l,i:integer;
begin
c:='';
for i:=length(s) downto 1 do begin
c:=c+s[i];end;
if s=c then per:=true else per:=false;
end;
begin
writeln(‘введи строку’); readln(x);
x:=x+' ';
repeat
k:=pos(' ',x);
c:=copy(x,1,k-1);
If per(c) then l:=l+1;
delete(x,1,k);
until x='';
end.
Задача 5.
Вводится строка. Найдите все слова, начинающиеся с заглавной буквы.
Решение:
В кодировочной таблице сначала располагаются заглавные буквы, затем строчные. Коды заглавных букв располагаются от 65 до 90 или от 192 до 223.
Readln(s);
S:=s+' ';
repeat
k:=pos(' ',s);
c:=copy(s,1,k-1); n:=ord(c[1]);
If (n>=65) and (n<=90) or (n>=192) and (n<=223) then writeln(c);
delete(s,1,k);
until s='';