Стандартные процедуры и функции
Паскаль предоставляет в распоряжение программиста целый ряд встроенных функций и процедур, предназначенных для обработки строк. Рассмотрим наиболее важные из них.
Удаление
Для удаления из строки фрагмента используется процедура Delete(Str, n, m), которая вырезает из строки Str m символов начиная с n−го, таким образом, сама строка изменяется.
Пример
Str1:='ABCDEFGH';
Delete(Str1, 3, 4);
Writeln(Str1);
После выполнения этих операторов из строки будут удалены 4 символа начиная с 3−го, то есть строка будет такой: Str1='ABGH'.
Вставка
Для вставки подстроки в строку используется процедура Insert(Str1, Str2, n), которая вставляет строку Str1 в строку Str2 начиная n−го символа, при этом первая строка остается такой же, как и была, а вторая получает новое значение.
Пример
Str1:='ABCDEFGH';
Str2:='abcdefgh';
Insert(Str1, Str2, 3);
В результате выполнения данной процедуры строка будет такой: Str2='abABCDEFGHcdefgh'. Этот же результат будет и после выполнения такой последовательности операторов:
Str2:='abcdefgh';
Insert(‘ABCDEFGH’, Str2, 3);
Копирование
Функция Copy(Str, n, m) копирует m символов строки Str начиная с n−го символа, при этом исходная строка не меняется
Пример 1
Str1:='ABCDEFGH';
Str2:='abcdefgh';
Str3:=Copy(Str1, 4, 3);
Writeln(Str3);
Writeln(Copy (Str2, 4, 3));
Значение переменной Str3='DEF'. А на экран будут выведены следующие строки:
DEF
def
Пример 2
Предскажите результат работы программы.
Program Example_127;
uses crt;
vara, b, c, d, e: string[15];
Begin
clrscr;
a:='стихотворение';
b:=copy(a, 1, 4);
c:=copy(a, 2,4);
d:=copy(a, 6, 8);
e:=copy(a, 7, 3);
writeln(b, ', ',c, ', ',d, ', ',e);
readln;
End.
Длина строки
Под длиной строки понимается фактическое (а не максимально возможное!) количество символов в строке. Это значение можно найти при помощи функции Length(Str), результат которой − целое число, равное количеству символов.
Пример
Str1:='ABCDEFGH';
Str2:='мама мыла раму.';
k1:=Length(Str1);
k2:=Length(Str2);
В результате значения целых переменных будут равны: k1=8, k2=15.
Поиск подстроки
Имеется функция, определяющая позицию подстроки в строке, − Pos(Str1, Str2). Результат этой функции − целое число, и оно определяет номер элемента, с которого начинается первое вхождение подстроки Str1 в строку Str2. Если Str1 не входит в Str2, то значение функции равно 0.
Пример 1
Strl:='CDE'; Str2:='ABCDEFGH';
kl:=Pos(Str1, Str2);
k2:=Pos(Str2, Str1);
Значение переменной k1 равно 3, так как строка Str1 входит в строку Str2 с третьего символа, а значение k2 равно 0.
Пример 2
k1:=Pos(' ша',' Наша Таня громко плачет.')
В этом случае значение k1 равно 3, так как функция Pos возвращает номер элемента, начиная с которого подстрока встречается первый раз.
Пример 3
Program Example_128;
uses crt;
var a, b, c: string[100];
m, n: integer;
Begin
clrscr;
a:='Жил-был в норе под землей хоббит';
b:='был';
c:='хоббит';
m:=pos(b, a);
n:=pos(c, a);
writeln(b, '-', m); {был-5}
writeln(c, '-', n); {Хоббит-27}
End.
Числа и строки
Часто возникает необходимость получить строковое представление числа и наоборот (например, получить строку '13' из числа 13). Для работы с числами и строками применяются две процедуры.
Str(N, Str1) − переводит числовое значение N в строковое и присваивает результат строке Str1, причем можно переводить как целые числа, так и вещественные.
Примеры
Str(1234, Str1) − после выполнения Str1='1234';
Str (452.567, Str1) − переводим вещественное число с фиксированной запятой, результат Str1='452.567';
Str(4.52567е+2, Str1) − переводим вещественное число в экспоненциальной форме, результат Str1='4.52567e+2',
Вторая процедура выполняет обратное действие. Val(Str, N, К) − переводит строковое значение в числовое. Если данная строка действительно является записью числа (целого или вещественного), то значение К=0, а N − это искомое число, иначе К будет равно номеру первого символа, с которым процедура 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;
Val('12-45', n, k) k=3, так как знак "−" в записи чисел может быть только на первом месте;
Val('2,567m', n, k) k=2, так как разделительным знаком между целой и дробной частями является точка, а не запятая;
Val ('5.87с-5') k=5, так как символ 'с' не должен встречаться в записи вещественного или целого числа.
Решение задач
Пример 1
Сколько раз в данной строке встречается символ 'a'?
Решение
Опишем функцию, которой будем передавать строку. Результат выполнения − целое число.
Program Example_129;
Function Q_Ch(st: String): Byte;
Var i, k: Byte;
Begin
k:=0; {Просматриваем все символы строки,
их количество равно длине строки;
если очередной символ равен 'а',
то увеличиваем счетчик}
For i:=1 To Length(st) Do
If st[i]='a' Then Inc(k);
Q_Ch:=k;
End;
Пример 2
Если в строке нечетное число символов, то удалить средний.
Решение
Program Example_130;
Procedure Del(Var st: String);
Var k: Byte;
Begin
k:=Length(st);
If k Mod 2=1 Then
Delete(st, k Div 2+1,1);
End;
Пример 3
Заменить все вхождения подстроки 'del' на 'Insert'.
Решение
Пока такая подстрока встречается, необходимо находить номер первого символа очередного вхождения подстроки 'del' , удалять 'del' и вставлять 'Insert'.
Program Example_131;
Procedure Ins(Var st: String);
Var k: Byte;
Begin
While Pos ('del', st)<>0 Do
Begin
k:=Pos ('del', st);
Delete(st, k, Length ('del'));
Insert('Insert', st, k);
End;
End;
Пример 4
Дана строка, состоящая из нескольких слов, между словами один пробел, в конце строки − точка. Подсчитать количество слов и вывести на экран только те из них, которые начинаются с буквы 'а' (слов не больше 30).
Решение
Разобьем предложение на отдельные слова и каждое будем хранить как элемент массива строк.
Program Example_132;
Const n=30;
Type Myarray_Str=Array [1..n] Of String;
Var A: Myarray_Str;
str: String[255];
k: Byte;
Procedure Init(Var b: Myarray_Str);
Var i: Integer;
Begin
k:=1; {Пока не встретится пробел,
формируем очередное слово k, прибавляя
по одной букве}
For i:=1 To Length(str)-1 Do
If str[i]<>' ' Then b[k]:=b[k]+str[i]
Else
{Если это не последний символ, то
увеличиваем счетчик слов и начинаем
формировать очередное слово}
If i<>Length(str)-1 Then
Begin Inc(k); b[k]:=' 'End;
End;
Begin
Writeln('Введите предложение');
Readln(str);
Init(A);
Writeln('Всего слов: ',k);
{Просматриваем все слова, если первый
символ очередного слова равен букве
'а', то выводим его}
For i:=1 To k Do If A[i][1]='a'
Then Write(A[i],' ');
Readln;
End.
Пример 5
Подсчитать сумму цифр, входящих в данную строку.
Program Example_133;
Function Sum(st: String): Integer;
Var i, d: Byte; s,k: Integer;
Begin
s:=0;
For i:=1 To Length(st) Do
Begin
Val(st[i], d, k);
If k=0 Then s:=s+d;
End;
Sum:=s;
End;
Пример 6
Строка символов представляет собой некоторый текст, слова в котором разделены одним или более пробелами. Преобразовать эту строку так, чтобы все слова разделялись ровно одним пробелом, а ведущие и хвостовые пробелы отсутствовали.
Решение
Program Example_134;
var s: string;
Begin
writeln('Введите строку текста с
пробелами');
readln(s);
while pos(' ', s)>0 do
delete (s, pos (' ', s),1);
{Пока в строке существуют два рядом
стоящих пробела, удаляем один из них}
if s[1]=' ' then
delete(s, length (s), 1);
if s[length(s)]=' ' then
delete(s, length(s), 1);
readln;
End.
Пример 7
Дана строка символов следующего вида:
p1q1p2q2p3q3...qnpn
где pi − целое неотрицательное число, а qi − знак арифметического действия из набора (+,-,*). Написать программу вычисления значения введенного выражения, предполагая, что действия выполняются согласно правилам арифметики.
Решение
Пока в строке присутствуют знаки умножения, мы находим первый из них. Выделяем числа, стоящие слева и справа, удаляем соответствующуе часть строки (число, знак умножения, число) и вставляем на это же место результат умножения выделенных чисел друг на друга. Остальные действия выполняются по порядку. Корректность введенного выражения будет проверена по ходу вычислений.
Program Example_135;
var pq, p1, p2: string;
m,n, k, l, j: word;
Begin
writeln('Введите арифметическое
выражение');
readln(pq);
while pos('*', pq)>0 do
{цикл для выполнения всех
действий умножения}
Begin
p1:=' ';
k:=pos('*', pq);
while (k>1) and (pq[k-1]
in ['0'..'9']) do
Begin
k:=k-1;
p1:=pq[k]+p1 {формируем число,
стоящее справа от знака умножения}
end; {while}
p2:=' ';
l:=pos('*', pq);
while (l<length(pq)) and (pq[l+1]
in ['0'..'9']) do
Begin
l:=l+1;
p2:=p2+pq[l]; {формируем число,
стоящее справа от знака умножения}
end; {while}
val(p1, n, j);
if j>0 then
Begin
writeln('ошибка в выражении');
halt
end; {if}
val(p2, m, j);
if j>0 then
Begin
writeln('ошибка в выражении);
halt;
end; {if}
j:=m*n;
str(j, p1);
delete(pq, k, l-k+1);
{часть строки удаляем}
insert (p1, pq, k);
{вставляем результат умнож.}
end; {while} {все умножения выполнены}
while (pos('+',pq)>0) or
(pos('-',pq)>0) do
Begin
p1:=' ';
k:=1;
while (pq[k] in ['0'..'9']) do
Begin
p1:=p1+pq[k];
k:=k+1;
end; {while}
p2:=' ';
l:=k;
while (l<length(pq)) and (pq[l+1]
in ['0'..'9']) do
Begin
l:=l+1;
p2:=p2+pq[l];
end; {while}
val(p1, n, j);
if j>0 then
Begin
writeln('ошибка в выражении');
halt;
end; {if}
val(p2, m, j);
if j>0 then
Begin
writeln('ошибка в выражении');
halt;
end; {if}
case pq[k] of
'+': j:=n+m;
'-': j:=n-m;
end; {case}
str(j, p1);
delete(pq, 1, l);
insert(p1, pq, 1)
end; {while}
{все сложения и вычитания выполнены}
val(pq, n, j);
if j>0 then
Begin
writeln('ошибка в выражении');
halt;
end; {if}
writeln('=', pq);
readln;
End.
Оператор halt − стандартная процедура, которая завершает выполнение программы и выполняет возврат в операционную систему.
Пример 8
Подсчитать, сколько букв а в тексте.
ProgramExample_136;
uses crt;
var a: string;
i, s: integer;
Begin
clrscr;
writeln('Введите текст');
readln(a);
s:=0;
for i:=1 to length(a) do
Begin
if (copy (a, i, 1)= 'a') or
(copy(a, i, 1)= 'A') then
s:=s+1;
end;
writeln('В заданном тексте буква <a>
встречается ', s, ' раза');
End.
Пример 9
Найти сумму двух целых чисел, которые вводятся с клавиатуры, а также сумму цифр каждого из цифр.
Program Example_137;
uses crt;
var a, b, c1, c2, i, k, s, sa, sb: integer;
ca, cb: string[5];
Begin
clrscr;
s:=0; sa:=0; sb:=0;
write('Задайте 1-е число'); readln(a);
write('Задайте 2-е число'); readln(b);
s:=a+b;
str(a, ca); str(b, cb);
for i:=1 to length(ca) do
Begin
val(copy(ca, i, 1), c1, k);
sa:=sa+c1;
end;
for i:=1 to length(cb) do
Begin
val(copy(cb, i, 1), c2, k);
sb:=sb+c2;
end;
writeln(' Сумма чисел равна ',s);
writeln(' Сумма цифр 1-го числа= ', sa)
writeln(' Сумма цифр 2-го числа= ', sb);
readln;
End.
Пример 10
Определить, каких цифр в числе больше: четных или нечетных.
ProgramExample_138;
uses crt;
var a: string[5];
b: string[1];
i, k, s, sn, x: integer;
Begin
clrscr;
s:=0; sn:=0
write('Задайте число'); readln(a);
for i:=1 to length(a) do
Begin
b:=copy(a, i, 1);
val(b, x, k);
if x mod 2=0 then s:=s+1
else sn:=sn+1;
end;
if s>sn then
writeln('четных цифр больше');
if s<sn then
writeln('нечетных цифр больше');
if s=sn then writeln('Одинаково');
End.