Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

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




 

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

 

Удаление

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

 

МНОЖЕСТВЕННЫЙ ТИП ДАННЫХ

Множество в языке Паскаль представляет собой на­бор различных элементов одного (базового) типа.

Базовый тип − это совокупность всех возможных элементов множества. Всего в базовом типе должно быть не более 256 различных элементов. Значение перемен­ной множественного типа может содержать любое ко­личество различных элементов базового типа − от нуля элементов (пустое множество) до всех возможных зна­чений базового типа (напомним, что их должно быть не более 256). Иными словами, возможными значениями переменных множественного типа являются все под­множества базового типа.

Множества, используемые в программе, могут быть описаны либо в разделеType:

 

Type <имя типа>=Set Of <тип элементов>;

Var <имя множества>: <имя типа>;

 

либо непосредственно в разделе описания переменных Var:

Var <имя множества>:

Set Of <тип элементов>;

Пример

Type mnog_Char=Set Of Char;

Var mn1: Set Of Char;

mn2: mnog_Char;

mn3: Set Of 'A'..'Z';

s1: Set Of Byte;

s2: Set Of 1000..1200;

Здесь mn1 и mn2 − это множества символов; так как различных символов всего 256, то тип Char можно использовать в качестве базового;

mn3 − множество больших латинских букв;

s1 − множество целых чисел (от 0 до 255); так как тип Byte содержит только целые числа от 0 до 255 (всего 256 различных чисел), его тоже можно использо­вать в качестве базового типа элементов;

s2 − множество целых чисел от 1000 до 1200.

Формирование (конструирование) множеств. В про­грамме элементы множества задаются в квадратных скоб­ках, через запятую. Если элементы идут подряд друг за другом, то можно использовать диапазон.

Пример

Type digit=Set Of 1..5;

Var s: digit;

Переменная s может принимать значения, состоя­щие из любой совокупности целых чисел от 1 до 5:

[ ] − пустое множество;

[I], [2], [3], [4], [5] − одноэлементные мно­жества;

[1, 2], [1, 3], ..., [2, 4], [4, 5] − двухэле­ментные (пара любых элементов);

[1, 2, 3], [1, 2, 4],..., [3, 4, 5] − трехэле­ментные (тройка элементов);

[1, 2, 3, 4], [1, 2, 3, 5], [1, 2 , 4, 5], [1, 3, 4, 5], [2, 3, 4, 5] − четырехэлементные;

[1, 2, 3, 4, 5] − полное множество (взяты все элементы базового типа).

 

Операции над множествами

Объединением двух данных множеств называется множество элементов, принадлежащих хотя бы одно­му из этих множеств. Знак операции объединения множеств в Паскале − "+".

Примеры

1) ['А','F']+['В','D']=['A','F','B','D'];

2) [1..3, 5, 7, 11]+[3..8, 10, 12, 15..20]=[1..8, 10..12, 15..20]

Пусть S1:=[1..5, 9], a S2:=[3 .. 7, 12]. Тог­да если S:=S1+S2, то S=[1..7, 9, 12].

Пусть A1:=['a'..'z']; A1:=A1+['A'].

Тогда А1=['А', 'a'..'z'].

Пересечением двух множеств называется множество элементов, принадлежащих одновременно и первому, и второму множеству. Знак операции пересечения мно­жеств в Паскале − "*".

Примеры

1) ['А', 'F']*['В', 'D']=[ ], так как общих элементов нет;

2) [1..3, 5, 7, 11]*[3..8, 10, 12, 15..20]=[3, 5, 7];

3) если S1:=[1..5, 9] и S2:=[3..7, 12], a S:=SI*S2, то S=[3. .5].

Разностью двух множеств называется множество, со­стоящее из тех элементов первого множества, которые не являются элементами второго. Знак операции вычи­тания множеств − "−".

Примеры

1) ['А', 'F']-['В', 'D']=['А', 'F'], так как общих элементов нет;

2) [1..3, 5, 7, 11]-[3..8, 10, 12, 15..20] =[1, 2, 11];

3) S1:=[1..5, 9]; S2:=[3..7, 12]; S:=S1-S2; Тогда S=[1, 2, 9];

4) А1:=['А'..'Z']; А1:=А1-['А']. Тогда А1=['В'..'Z'].

 










Последнее изменение этой страницы: 2018-05-31; просмотров: 204.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...