Стандартные процедуры и функции

Паскаль предоставляет в распоряжение программиста целый ряд встроенных функций и процедур, предназна­ченных для обработки строк. Рассмотрим наиболее важ­ные из них.

Удаление

Для удаления из строки фрагмента используется про­цедура 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.

Наши рекомендации