Обработка строк с помощью процедур и функций

В Паскале имеется набор стандартных процедур и функций для работы со строками. Рассмотрим некоторые из этих процедур и функций и их действие на примере следующих строковых констант:

const

Sl:='обитатель';

S2:='лесов_';

S3:='кабан';

1) Concat (А, B,.. Z) - функция строкового типа, которая возвращает значение сцепленных строк А, В,.. Z.

Исходные строки в новой строке следуют в том порядке, в каком они указаны в списке параметров.

Примеры с использованием строковых констант:

Выражение Результат
Concat (Sl, S2, S3) обитатель лесов кабан
Concat (S3, Sl, S2) кабан обитатель лесов

2) Delete (t.poz.n)- процедура удаления N символов в строке Т, начиная с позиции под номером Poz.

Пример:

Выражение Результат
Delete (Sl, 4, 2) 'обитель'
Delete (S3, 1, 2) 'бан'

3) Insert (T,S, Poz) - процедура вставки строки Т в строкуS, начиная с позиции poz.

Пример действия процедуры вставки:

Выражение Результат
Insert (S3, Sl,6) ‘битакабантель’

4) Copy (т, Poz,N) - функция строкового типа, которая возвращает значение подстроки длиной N, начиная с позиции Poz в исходной строке Т.

Пример:

Выражение Результат
Copy (Sl, 3, 2) 'ит'
Copy (S2,2,3) 'аба'

5) Length (Т) - функция целого типа, которая возвращает значение длины строки Т.

Пример:

Выражение Результат
Length (Sl) 9
Length (S2) 5
Length (S3) 5

6) Poz (T1,T2) - функция целого типа, которая обнаруживает в строке Т2 первое появление подстроки Т1. Функция возвращает номер позиции, в которой находится первый символ подстроки Т1.

Если подстрока Т1 не найдена, то результатом будет 0.

Рассмотрим действие этой функции на примере двух строк:

'един' (строка Т1)

'объединение' (строка Т2).

Выражение Poz (Tl, T2) будет иметь результатом число 4.

Примеры использования строковых процедур:

1. Cоставим программу, которая будет выполнять последовательные преобразования слов «холестерин - холерик - болеро».

Обработка строк с помощью процедур и функций - student2.ru

2. PAS\PAS\62.delete(st,n,2); insert('m',st,n);

{Проверить, есть ли в данном тексте буква 'б', если есть,

то заменить последнюю из них на букву 'a'}

program ZAD_62;

uses CRT;

var a,st:string[100]; {буквы русские}

k,i:integer;

BEGIN

ClrScr;

a:='В тексте нет буквы <б>';

write('Введите текст: ');

readln(st);

for i:=1 to length(st) do

if st[i]='б' then

begin

a:='В тексте есть буква <б>';

k:=i;

end;

if a='В тексте есть буква <б>'

then

begin

delete(st,k,1);

insert('a',st,k);

end;

writeln(a);

writeln('Результат:',st);

readln;

END.

3. PAS\PAS\59.PAS pos(b,st); delete(st,n,2); insert('m',st,n);

program ZAD_59;

var st,b:string;

n:integer;

BEGIN

ClrScr;

write('Введите текст:');readln(st);

writeln('введите соч букв');

readln(b);

repeat

n:=pos(b,st);

if n<>0 then

begin

delete(st,n,2);

insert('m',st,n);

end;

until(n=0);

writeln(st);

readln

END.

4.program ZAD_57; Нахождение данного слова в тексте.

var t,s:string;

n:integer;

BEGIN

ClrScr;

Write('Введите текст:');

readln(t);

write('Введите слово:');

readln(s);

n:=pos(s,t);

if n=0 then

writeln('текст не содержит этого слова')

else writeln('текст содержит слово');

readln

end.

Контрольные вопросы

1. Что понимается под строковой величиной?

2. Как выполнить присвоение значения строковой величине?

3. Каковы правила сравнения строк?

4. Перечислите известные вам процедуры и функции работы со строками.

Упражнения

1. Составьте программу, которая в произвольном слове заменяет все буквы 'а' на 'о'.

2. Напишите программу, обращающую введенное слово: последняя буква становится первой, предпоследняя - второй и т.д.

Массив

Массив -упорядоченные данные одного типа.

Массивом часто обозначают характеристики объектов одного типа, имеющих одинаковые единицы измерения.

Массив состоит из элементов, имеющих порядковые номера, т. е. элементы массива упорядоченны.

Элементы массива имеют:

1. порядковый номер (индекс);

2. и значение.

Значение присваивается:

1. отдельно каждому элементу массива,

2. либо сразу всем элементам массива.

Таким образом, если обьекты одного типа обозначить именем, например "A", то элементы обьекта будут A[1], A[2] и т. д.

Массив может быть многомерным (без ограничения), но занимать не более 65520 байт.

В квадратных скобках указан номер элемента.

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

К элементам массива можно обращаться только по их номеру (индексу).

Значения элементам массива присваиваются также как и другим переменным с учетом типа массива.

Если элементы массива имеют один индекс, то массив называется одномерным или линейным, либо массив - вектор.

Значения элементов одномерного массива обычно выводят на экран или бумагу в виде столбца или строки.

В некоторых случаях удобно элементы массива пронумеровывать двумя независимыми индексами, такие массивы называются двумерными или матрицами.

Значения элементов двумерного массива обычно выводят на экран в виде таблицы.

Если элементы массива имеют три независимых индекса, то массив называется трехмерным.

Значения элементов трехмерного массива обычно выводят на экран в виде набора таблиц.

Примеры описания:

VAR M1: array[1..200] of integer;

A1: array[100..200] of real;

ch1: array['A'..'Z'] of char;

ch2: array[0..255] of char;

{ М1, A1 - одномерные массивы целых и вещественных чисел}

{ сh1, ch2 - одномерные массивы символов}

Примеры присвоения значения:

M1[1]:=5; M1[2]:=8; M1[3]:= M1[1]; M1[100]:=32;

A1[101]:=0.2; A1[102]:=2.31; ch1['B']:='C'; ch2[1]:='!'

Тип-диапазон и перечислимый тип задаются программистом.

Примеры описания:

TYPE Date_M= 1..31; ;{тип диапазон}

Rush_b= 'А..Я'; ;{тип диапазон}

Lat_b= 'A..Z';{тип диапазон}

Otmetka= (2,3,4,5);{перечислимый тип}

Ball= (1,2,3,4,5,6,7,8,9,10);{перечислимый тип}

VARt1,t2:Date_M;

c1:Ruch_b;

s1:Lat_b;

a1,a2:Otmetka;

b:Ball;

Примеры присвоения значения:

t1:= 10;

c1:='Л';

s1:='F';

a1:=5;

b:=8;

Линейные массивы

Линейным массивом можно обозначить, например, оценки учеников класса.

Каждая оценка является значением элемента массива оценок "A" и имеет порядковый номер (индекс).

Значение индекса указывается в квадратных скобках после имени массива.

Можно создать массив фамилий "S" учеников класса.

Значением элемента массива будет фамилия ученика, а индексом - порядковый номер по списку.

Пусть дан список фамилий учеников и их оценки:

N Фамилии оценки
1. Иванов
2. Петров
3. Сидоров
4. Титов
. . . . . . .
30. Якупов

Описание массивов:

Var A: array[ 1. . 30 ] of byte;

S: array[ 1. . 30 ] of string;

{или} SO: array[ 1. . 30 ] of string[12];

7.13. Присвоение значений элементам массива:

"A" - A[1]:= 5; A[2]:= 4; и т. д.

"S " - S[1]:= 'Иванов'; S[2]:= 'Петров'; и т. д.

Приведем таблицу обозначений и соответствия элементам массива, их значений и индексов:

Номер элемента (индекс) i  
Элементы массива "S “ S[ 1 ] S[ 2 ] S[ 3 ] S[ 4 ] S[ i ] S[ 30 ]
Значения элементов Иванов Петров Сидоров Титов . . . Якупов
Элементы массива "A “ A[ 1 ] A[ 2 ] A[ 3 ] A[ 4 ] A[ i ] A[ 30 ]
Значения элементов . . .

Если известна зависимость, по которой изменяются значения элементов массива, то присвоение значений удобно проводить в операторах цикла c параметром или с условием. Например:

Присвоим значения элементам массива "y" по зависимости: y=sin(x),

где x= Pi * i/180, 0<= i <=180 .

For i:= 0 to 180 Do y[i]:= sin(Pi * i/180);

Например:

Присвоим значения семи элементам массива "A" оператором Readln:

For i:= 1 to 7 Do

Begin

Write( ' Введите A[ ' , i , ' ] = ' );

Readln( A [ i ] )

end;

При выводе массива на экран удобно размещать данные в виде таблицы - в несколько колонок.

Для вывода обозначений переменных ("шапки таблицы") можно использовать операторы вывода символов в цикле.

Например:

Шапка для вывода в три пары колонок значений переменных "S" и "A":

For j:=1 to 66 do Write('-'); Writeln;

For j:=1 to 3 do Write('|_ _ Фамилия _ _| _ оценка _|'); Writeln;

For j:=1 to 66 do Write('-'); Writeln;

- Эта шапка занимает 66 позиций (по ширине экрана в текстовом режиме размещается 79 символов и пробел).

- ОператорWriteln; переводит курсор на новую строчку.

Например:

В этом случае данные таблицы полностью не умещаются на экране и можно задержать прокрутку экрана при выводе данных, применяя оператор Readln после вывода, например, 20 строк.

Вывод значений ста элементов массивов "S" и "A" в три пары колонок, произведем операторами:

For i:= 1 to 100 do

Begin

Write('|', s[i]:11,'|', a[i]:8, '|');

if (i mod 3) = 0

Then Writeln;

if (i mod 60) = 0

Then

Readln

end;

В цикле удобно определять:

- сумму элементов массива,

- наибольший (наименьший) элемент

- создавать новые массивы, удовлетворяющие некоторому условию.

Пример:

s:= 0;

for i:= 1 to 100 do

s:= s + a[i]; { s - сумма элементов массива }

a_max:= a[1];

for i:= 1 to 100 do{ поиск наибольшего элемента a[j] }

if a[i] > a_max

Then

begin a_max:= a[i];

j:= i

end;

j:= 0; k:= 0;

for i:=1 to 100 do {создание новых массивов с элементами: b[j] >=0, c[k] <0}

if a[i] >= 0 then begin j:= j+1; b[j]:= a[i] end

Else

begin k:= k+1; c[k]:= a[i] end;

j:= 0; k:= 8;

for i:= 1 to 100 do {создание массива номеров "M" для элементов: a[i] > a[k]}

if a[i] > a[k] then begin j:= j+1; M[j]:= i end;

Примеры:

1. program ZAD_18; минимальный элемент массива [1..5].

var i,min:integer;

a:array[1..5] of integer;

BEGIN

ClrScr;

writeln('Введите элементы таблицы');

for i:=1 to 5 do readln(a[i]);

min:=a[1];

for i:=1 to 5 do if a[i]<min then min:=a[i];

writeln('min=',min);

readln

END.

2. program ZAD_19; максимальный элемент массива [1..7]

var i,max:integer;

a:array[1..7] of integer;

BEGIN

ClrScr;

writeln('Введите элементы таблицы');

for i:=1 to 7 do readln(a[i]);

max:=a[1];

for i:=1 to 7 do if a[i]>max then max:=a[i];

writeln('max=',max);

readln

END.

3. PAS\PAS\73.PAS Сумма элементов массива[1..100].

program ZAD_73;

uses CRT;

var n,i,j,Summa,k:integer;

a:array[1..100] of integer;

BEGIN

ClrScr;Summa:=0;

write('Введите кол-во элементов массива: ');readln(n);

writeln('Введите элементы массива');

for i:=1 to n do read(a[i]);

for i:=1 to n do

begin

for j:=1 to n do if a[i]=a[j] then k:=k+1;

if k=1 then Summa:=Summa+a[i];

k:=0;

end;

writeln;

writeln('Summa=',Summa);

END.

4. PAS\PAS\66.PAS 'число нулевых элементов массива [1..p]',s

program nol;

const p=10;

var a:array[1..p] of real;s,i:integer;

begin

writeln('введите массив');

for i:=1 to p do

read(a[i]);

s:=0;

for i:=1 to p do

begin

if a[i]=0 then s:=s+1;

end;

writeln ('число нулевых элементов ',s);

end.

5.PAS\PAS\67.PAS 'Сумма элементов массива [1..100] меньших 5:',s)

program ZAD_67;

uses CRT;

var a:array[1..100] of integer;

i,n:integer;

s:integer;

begin

clrscr;

writeln('Введите количесво элементов массива: ');

readln(n);

writeln('Введите элементы массива: ');s:=0;

for i:=1 to n do

begin

readln(a[i]);

if a[I]<5 then s:=s+a[i];

end;

writeln('Сумма элементов меньших 5:',s);

readln

end.

6. PAS\PAS\68.PAS {Даны два одномерных массива A,B:array[1..100]. Проверить есть ли в них одинаковые элементы}

Program ZAD_68;

uses CRT;

var A,B:array[1..100]of integer;

i,j,n,m:integer;

r:string;

BEGIN

ClrScr;

write('Введите размерность массива A: ');readln(n);

writeln('Введите массив А:');

for i:=1 to n do readln(A[i]);

write('Введите размерность массива B: ');readln(m);

writeln('Введите массив B:');

for i:=1 to m do readln(B[i]);

r:='Одинаковых элементов нет';

for i:=1 to n do

for j:=1 to m do

if A[i]=B[j] then r:='Есть одинаковые элементы';

writeln(r);

readln

END.

7.PAS\PAS\69.PAS Минимальный и максимальным эл-ты одномерного массива [1..10]

PROGRAM FFSFS;

VAR i,s,r,n:integer;

a:array[1..10] of integer;

BEGIN

readln(n);

for i:=1 to n do

readln(a[i]);

s:=a[1];

for i:=1 to n do

if a[i]>s then s:=a[i];

for i:=1 to n do

if a[i]<s then r:=a[i];

writeln('мin=',r,' max=',s);

readln

END.

8. PAS\PAS\70.PAS {Посчитать число неотрицательных элементов массива[1..100]}

Program ZAD_70;

uses CRT;

var a:array[1..100]of integer;

i,n,k:integer;

BEGIN

ClrScr;

k:=0;

write('Введите размерность массива: ');readln(n);

for i:=1 to n do

begin

readln(a[i]);

if a[i]>=0 then k:=k+1;

end;

writeln;

writeln(k,' неотрицательных элементов');

readln;

END.

9. PAS\PAS\71.PAS {В массиве B[1..100]заменить все отрицательные элементы на противоположные}

program ZAD_71;

uses CRT;

var b:array[1..100]of integer;

i,n:integer;

BEGIN

ClrScr;

write('Введите размерность массива: ');readln(n);

for i:=1 to n do

begin

readln(b[i]);

if b[i]<0 then b[i]:=-b[i];

end;

writeln;

for i:=1 to n do write(b[i],' ');

readln;

END.

10. PAS\PAS\74A.PAS {Заменить в одномерном массиве[1..100]все положительные элементы на -1}

program r;

uses crt;

var a,b:array[1..100] of integer;

i,j,n:integer;

begin

clrscr;

readln(n);

for i:=1 to n do

begin read(a[i]);

if a[i]>0 then a[i]:=-1;

write(a[i]);

end;

end.

11. PROGRAM ZAD_15; 'Количесво элементов больших, меньших и равных 6: ',S) ;

Uses Crt;

VAR A:ARRAY[1..10] OF integer;

S,D,I:INTEGER;

BEGIN

ClrScr;

WRITEln('Введите элементы таблицы:');

FOR I:=1 TO 10 DO READLN(A[I]);

S:=0;D:=0;

FOR I:=1 TO 10 DO

IF A[I]>6 THEN S:=S+1 else D:=D+1;

WRITELN('Количесво элементов больших 6: ',S) ;

WRITELN('Количесво элементов меньших и равных 6: ',D) ;

readln

END.

12.program 17; подсчет кол-ва отрицательных и пол-х чисел в таблице.

var A:array[1..10] of integer;

i:integer;

z1,z2:integer;

begin

writeln('введите таблицу A[1..10]');

for i:=1 to 10 do

readln(a[i]);

z1:=0;z2:=0;

for i:=1 to 10 do

begin

if a[i]>0 then z1:=z1+1;

if a[i]<0 then z2:=z2+1;

end;

writeln('z1=',z1,' z2=',z2);

readln

end.

13. program qw;

var a:array[1..10] of integer;

i:integer;

begin

writeln('введите массив');

for i:=1 to 10 do

readln(a[i]);

for i:=1 to 10 do

if a[i]>0 then a[i]:=-1;

for i:=1 to 10 do

writeln(a[i]);

end.

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