Строковый тип данных
Строка — упорядоченная последовательность символов.
Тип string (строка) не входит в стандартный язык Паскаль, но он прочно вошел во все известные компиляторы с этого языка.
Количество символов в строке называется ее длиной. Длина строки может лежать в диапазоне от 0 до 255.
При описании строковой переменной в квадратных скобках может быть указан ее максимальный размер, не превосходящий 255. Если такой размер опущен, то считается, что длина строки может достигать 255 символов.
Все переменные строковых типов совместимы между собой при выполнении различных операций (+) над строками.
В переменных строкового типа удобно хранить последовательности символов, обозначающие имена собственные, например, фамилии людей или географические названия. Именно для подобных данных над строками были введены операции сравнения. (Сравнение строк производится слева направо до первого несовпадающего символа. Та строка считается больше, в которой первый несовпадающий символ имеет больший номер в таблице символьной кодировки). Кроме того, можно выделить несколько общих операций над строками, которые часто применяются при решении совершенно различных задач. Эти операции были оформлены в виде стандартных процедур и функций.
Строковые процедуры
val(s,n,i) — переводит строку s в число (вещественное или целое, согласно типу переменной n), если строка s не является изображением числа соответствующего типа по правилам Паскаля, то значение переменной i будет отлично от нуля, при удачной конвертации значение i равно нулю;
str(i,s) — переводит число в его строковое представление;
delete(s,i,n) — удаляет из строки s n символов, начиная с символа с номером i;
insert(s1,s,i) — вставляет в строку s подстроку s1, перед символом с номером i
Строковые функции
copy(s,i,n) — выделяет из строки s подстроку длиной n, начиная с символа i;
concat(s1,s2,…,sN) — выполняет сцепление (конкатенацию) строк s1,s2,…,sN в одну строку;
length(s) — определяет реальную длину строки; результат – значение целого типа;
pos(s1,s) — выдает целое число – номер позиции в строке s, с которой начинается подстрока s1; если подстрока не найдена, то выдает ноль
Строковые переменные в языке Pascal описываются следующим образом:
var s: string [50];
(string в переводе строка). Объявление строки максимальной (255) длины еще короче:
var s: string;
Пример присваивания:
s:='String переводится как строка';
Ввод/вывод строк.
Для того, чтобы ввести строку s, достаточно написать readln(s); А чтобы вывести: writeln(s); И все!!! Т.е. вводятся и выводятся строки не поэлементно, как массивы, а целиком.
Pascal позволяет выполнять операции сравнения двух строк. Сравнение происходит посимвольно слева направо: сравниваются коды соответствующих символов до тех пор, пока не нарушится равенство или не кончится одна из строк (или обе сразу), при этом сразу делается вывод о знаке неравенства. Две строки называются равными, если они равны по длине и совпадают посимвольно.
Склеивание
Под склеиванием понимается последовательное объединение нескольких строк
, после выполнения оператора s:='Иван' + ' Васильевич'; в переменной s будет содержаться строка 'Иван Васильевич'. Как, Вы уже поняли, операция сложения строк обозначается +.
Даны две строки. Объединить их в одну в порядке следования, разделив одним пробелом.
Решение:
Program pr3;
var s1, s2, s: string;
begin
writeln (’введите первую строку’);
readln(s1);
writeln (’введите вторую строку’);
readln(s2);
s : =Concat(s1, ’ ’, s2);
{или s : = s1+’ ’+ s2;}
writeln(’получили строку == ’,s);
end.
Длина строки.
Под длиной строки понимается фактическое (а не максимально возможное!) количество символов в строке. Это значение можно найти при помощи функции Length(str), результат которой – целое число, равное количеству символов
Подсчитать сколько раз в данной строке встречается символ ’a’.
Решение:
Program pr1;
var s: string;
i, k: integer;
begin
writeln (’введите строку’);
readln(s);
k:=0;
for i:=1 to length(s) do
if s[i]=’a’
then k:=k+1;
writeln(’количество символов а равно’,k);
end.
Определить сколько во введенной непустой строке символов ‘a’
program n5_1;
var
a:string;
k,n,i:integer;
begin
writeln('BB a');readln(a);
n:= length(a); {определяем длину строки}
{проходим по строке от 1-го символа до последнего, просматриваем по одному символу и сравниваем с ‘a’, если а[i]=‘а’, то считаем количество}
for i:=1
to n
do if a[i]=' а'
then k:=k+1;
if k0
then writeln('к-во букв "а"=',k)
else writeln('букв "а" в строке нет');
readln
end.
Дана программа подсчета количества букв А в строковой переменной:
Var t :string;
i,k:integer;
begin
k:=0;
t:=’ А роза упала на лапу Азора’;
for i:=1 to length (t) do
if t [i]=’a’ then k:=k+1;
writeln (k);
end.
Проверить, имеется ли в линейной записи заданной математической формулы баланс открывающих и закрывающих скобок.
Program Balance;
Uses Crt;
Var S: String; n, k, i : Integer;
BEGIN ClrScr;
Write('Введите линейную запись математической формулы :');
ReadLn(S);
i:=1; k:=0; n:=Length(S);
While (k=0) and (ido
begin
If S[i] = '(' then k:=k + 1;
If S[i] = ')' then k:=k - 1;
i:=i+1
end;
If k=0 then Write('Есть баланс ') else Write('Нет баланса ');
ReadLn
END.
Дана строка. Получить новую строку, путем записи символов в обратном порядке.
Решение:
Program pr4;
var s1, s: string;
i: integer;
begin
writeln (’введите строку’);
readln(s);
s1 : =’’; {начальное значение новой строки – пустой текст}
for i:=1 to length(s) do
s1:=s[i]+s1;
writeln(’обращенная строка == ’,s1);
end.
Дано произвольное слово. Проверить, является ли оно палиндромом. Примеры палиндромов: казак, шалаш, мадам.
program n_5_2;
var x,x1:string;
n,i:integer;
begin
writeln ('введите слово');
readln(x);
x1:=''; {х1 присваиваем значение пустой строки}
for i:=length(x) downto 1 do {проходим по введенному слову справа
x1:=x1+x[i]; на лево и формируем перевернутое слово х1}
if x1=x {сравниваем исходное и перевернутое слово}
then writeln('перевёртыш')
else writeln('не перевёртыш');
readln;
end.
Дано слово. Записать каждый символ по два раза.
Пример ввода: Пример вывода:
дождь ддоожжддьь
Program stroki;
Var
s : string;
d,i : longint;
begin
readln(s); d:=length(s);
For i:=1 to d do write(s[i],s[i]);
end.
Дано слово. Между всеми буквами вставить символ '-'.
Пример ввода: Пример вывода:
дождь д-о-ж-д-ь
Program stroki;
Var
s : string;
d,i : longint;
begin
readln(s); d:=length(s);
For i:=1 to d-1 do write(s[i],'-');
write(s[d]);
end.
Дано слово. Добавить к слову это же слово, но только перевернутое.
Пример ввода: Пример вывода:
дождь дождььджод
Program stroki;
Var
s,p : string;
d,i : longint;
begin
readln(s); d:=length(s);
p:='';
For i:=1 to d do p:=s[i]+p;
writeln(s,p);
end.
Удаление из строки фрагмента.
Для удаления из строки фрагмента используется процедура Delete(str,n,m), которая вырезает из строки str m символов начиная с n-го, таким образом, сама строка изменяется.
Пример: Str1:=’abcdefgh’;
Delete(str1,3,4);
writeln(str1);
После выполнения этих операторов из строки будут удалены четыре символа начиная с третьего, т.е. строка будет такой: str1=’abgh’.
Если в строке нечетное число символов, то удалить средний.
Решение:
program del;
var
st:string;
k: byte;
begin
writeln('введите строку');
readln(st);
k:=length(st);
if k mod 2=1
then delete(st, k div 2 +1, 1);
writeln('измененная строка: ',st);
end.
Вставка подстроки в строку.
Для вставки подстроки в строку используется процедура insert(str1, str2,n), которая вставляет строку str1 в строку str2 начиная с n-го символа, при этом первая строка остается такойже, как и была, а вторая получает новое значение.
Пример: str1:=’ABCDEFGH’;
str2:=’abcdefgh’;
insert(str1, str2,3);
В результате выполнения данной процедуры строка будет такой: str2=’abABCDEFGHcdefgh’. Этот же результат будет и после выполнения такой последовательности операторов:
str2:=’abcdefgh’;
insert(‘ABCDEFGH’, str2,3);
Дана строка. Заменить в ней все вхождения подстроки ’ааа’ на подстроку ’а’.
Решение:
Пока такая подстрока встречается, необходимо находить номер первого символа очередного вхождения подстроки ’ааа’, удалять ’ааа’ и вставлять ’а’.
program zamena1;
var
st:string;
k: byte;
begin
writeln('введите строку');
readln(st);
While Pos('aaa',st)0 do
begin
k:=Pos('aaa',st);
delete(st,k,length('aaa'));
insert('a',st,k);
end;
writeln('измененная строка: ',st);
end.
Дана строка. Заменить в ней все вхождения подстроки ’child’ на подстроку ’children’.
Решение:
На первый взгляд эта задача аналогична предыдущей, но та подстрока которую мы заменяем, входит в ту подстроку, которой мы заменяем. Поэтому решение этой задачи способом, рассмотренным в примере 2, приведет к зацикливанию. Будем решать эту задачу путем перебора всех символов строки (аналогично удалению и вставке элементов в одномерном массиве).
program zamena2;
var
s1,k,s,st:string;
i,d: byte;
begin
writeln('введите строку');
readln(st);
s:='child';
d:=length(s);
s1:='children';
for i:=length(st)-d+1 downto 1 do
begin
k:=copy(st,i,d);
if k=s
then begin
delete(st,i,d);
insert(s1,st,i);
end;
end;
writeln('измененная строка: ',st);
end.
Копирование.
Функция copy(Str,n,m) копирует m символов строки str начиная с n-го символа, при этом исходная строка не меняется.
Пример: str1:=’ABCDEFGH’;
str2:=’abcdefgh’;
str3:=copy(str1,4,3);
Writeln(str3);
Writeln(copy(str2,4,3));
writeln(str1);
Значение переменной str3=’DEF’. А на экран будут выведены следующие строки:
DEF
def
ABCDEFGH
Подсчитать сколько раз в данной строке встречаются сочетания символов ’ова’.
Решение:
Program pr2;
var s: string;
i, k: integer;
begin
writeln (’введите строку’);
readln(s);
k:=0;
for i:=1 to length(s)-2 do
if copy(s,i,3)=’ова’
then k:=k+1;
writeln(’количество символов а равно’,k);
end.
Дана программа подсчета количества сочетаний «ая» в строковой переменной:
Program strok;
Var
t :string;
i,k:integer;
begin
k:=0;
t:=’Красная прекрасная ужасная’;
for i:=1 to length (t)-1 do
if copy(t,i,2)=’aя’
then k:=k+1;
writeln (k);
end.
Поиск подстроки в строке.
Имеется функция, определяющая позицию подстроки в строке, – POS(str1,str2). Результат этой функции – целое число, и оно определяет номер элемента, с которого начинается первое вхождение подстроки str1 в строку str2. Если str1 не входит в str2, то значение функции равно 0.
Пример:
Дано слово. Сформировать новое слово, в котором будут находится все цифры.
Пример ввода: Пример вывода:
A1B222a3cdjhs42442124 1222342442124
Program stroki;
Var
s,p,x : string;
d,i : longint;
begin
readln(s);
d:=length(s);
x:='1234567890';
p:='';
For i:=1 to d do
if pos(s[i],x)0
then p:=p+s[i];
writeln(p);
end.
Дано предложение, состоящее из двух слов и в конце предложения стоит точка. Первое слово - существительное, второе слово - число. Надо вывести число.
Пример ввода: Пример вывода:
МИСТИКА 18237. 18237
Program stroki;
Var
s,p : string;
pr,pt : longint;
begin
read(s);
pr:=pos(' ',s);
pt:=pos('.',s);
p:=copy(s,pr+1,pt-pr-1);
write(p);
end.
Дано слово. Удалить ненужные символы, '12abc,.' , в слове.
Пример ввода: Пример вывода:
1МbИСaТ,ИКА2. МИСТИКА
Program stroki;
Var
s,p,x : string;
i,d : longint;
begin
readln(s);
x:='12abc,.';
p:='';
d:=length(s);
For i:=1 to d do
if pos(s[i],x)=0 then p:=p+s[i];
writeln(p);
end.
Числа и строки.
Часто возникает необходимость получить строковое представление числа и наоборот (например, получить строку '13' из числа 13). Для работы с числами и строками применяются две процедуры.
Str(n, S) – переводит числовое значение n в строковое и присваивает результат строке S, причем можно переводить как целые числа, так и вещественные.
Примеры
str(1234, s) – после выполнения s=’1234’;
str(452.567,s) – переводим вещественное число с фиксированной запятой, результат s=’452.567’;
Val(str,n,k) – переводит строковое значение в числовое. Если данная строка действительно является записью числа (целого или вещественного), то значение k=0, а n – это искомое число, иначе k будет равно номеру первого символа, с которым процедура Val “не справилась”.
Примеры
Val(‘1234’, n, k) – n=1234, k=0;
Val(‘234.56’, n, k) – n =234.56, k=0;
Val(‘2.3456e+2’, n, k) – n=2.3456e+2, k=0;
Дана строка. Выяснить, является ли она записью целого числа.
Решение:
program ex1;
var
st:string;
v,c: integer;
begin
writeln('введите строку');
readln(st);
val(st,v,c);
if c=0
then writeln('v=',)
else writeln(‘не является‘);
end.
Преобразовать число х в строку.
Решение:
program ex2;
var
st:string;
x: integer;
begin
writeln('введите x');
readln(x);
Str(x, s);
writeln(s);
end.
Дана строка. Подсчитать сумму встречающихся в ней цифр.
Решение:
program ex3;
var
s:string;
v,c,sum,i: integer;
begin
writeln('введите строку');
readln(s);
sum:=0;
for i:=1 to length(s) do
begin
val(s[i],v,c);
if c=0
then sum:=sum+v;
end;
writeln('sum=',sum);
end.
Дана строка. Удалить из нее все символы не являющиеся цифрами.
Решение:
program ex3;
var
s:string;
v,c,i: integer;
begin
writeln('введите строку');
readln(s);
i:=1;
While ilength(s) do
begin
val(s[i],v,c);
if c0
then delete(s,i,1)
else inc(i);
end;
writeln('строка без букв –',s);
end.
Дана строка содержащая цифры. Найти произведение этих цифр.
Program chisla;
var
a:string; i,code,s,p:integer;
begin
writeln ('введите строку');
readln (a);
p:=1;
for i:=1 to length(a) do begin
if (a[i]='0') or (a[i]='1') or (a[i]='2') or (a[i]='3') or (a[i]='4') or (a[i]='5') or (a[i]='6') or (a[i]='7') or (a[i]='8') or (a[i]='9')
then begin val(a[i],s,code); p:=p*s; end;
end;
writeln ('p=',p);
readln;
end.
Дано слово. Определить, состоит ли слово из одних цифр.
Пример ввода: Пример вывода:
How No
Пример ввода: Пример вывода:
123456 Yes
Program stroki;
Var
s,x : string;
d,i : longint;
begin
readln(s); d:=length(s);
x:='1234567890';
i:=1;
While (i0) do i:=i+1;
if id
then writeln('Yes')
else writeln('No');
end.
Дано слово. Проверить, есть ли в составе слова цифры.
Пример ввода: Пример вывода:
How No
Пример ввода: Пример вывода:
It567ае Yes
Program stroki;
Var
s,x : string;
d,i : longint;
begin
readln(s); d:=length(s);
x:='1234567890';
i:=1;
While (i
if id
then writeln('No')
else writeln('Yes');
end.
Дано два слова. Если все символы первого слова встречаются во втором слове (символы могут встречаться не по порядку), то вывести 'Yes', иначе - 'No'.
Формат ввода: Формат вывода:
s1 - первое слово Yes/No
s2 - второе слово
Пример ввода: Пример вывода:
МИСТИКА Yes
ГИМНАСТИКА
Пример ввода: Пример вывода:
ГРИМ No
ГИМНАСТИКА
Program stroki;
Var
sl1,sl2 : string;
i,d : longint;
begin
readln(sl1);
readln(sl2);
d:=length(sl1);
i:=1;
While (i0) do i:=i+1;
if id
then writeln('Yes')
else writeln('No');
end.
Дана строка строчных английских букв. Преобразовать ее в строку заглавных букв.
Решение:
Var
s: string;
i: byte;
begin
Writeln('введите строку');
Readln(s);
for i:=1 to length(s) do
s[i]:=UpCase(s[i]);
writeln(s);
end.
Дано слово. Если встречаются подряд одинаковые символы то вывести их.
Пример ввода: Пример вывода:
kdbbfjgkdjbnbbbbghjhjgkkk bbbbbbkkk
Program stroki;
Var
s,p : string;
d,i,j : longint;
begin
readln(s); s:=s+'_'; d:=length(s); p:='';
For i:=1 to d-1 do
if s[i]=s[i+1]
then p:=p+s[i]
else begin
if p'' then p:=p+s[i];
write(p);
p:='';
end;
end.
Дано слово. Вывести новое слово, состоящее из различных символов.
Пример ввода: Пример вывода:
kdbbfjgkdjbnbbbbghjhjgkkk kdbfjgnh
Program stroki;
Var
s,w : string;
i,d : longint;
begin
readln(s); d:=length(s);
w:=s[1];
For i:=2 to d do
if pos(s[i],w)=0 then w:=w+s[i];
write(w);
end.