Обработка строк с помощью процедур и функций
В Паскале имеется набор стандартных процедур и функций для работы со строками. Рассмотрим некоторые из этих процедур и функций и их действие на примере следующих строковых констант:
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оставим программу, которая будет выполнять последовательные преобразования слов «холестерин - холерик - болеро».
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.