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

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

Примеры:

1) [1, 2, 3, 4] + [3, 4, 5, 6] => [1, 2, 3, 4, 5, 6]

2) []+[‘a’..’z’]+[‘A’..’E’, ‘k’] => [‘A’..’E’, ‘a’..’z’]

3) [5<4, true and false] + [true] => [false, true]

Пересечением двух множеств A и B называется множество, состоящее из элементов, одновременно входящих во множество A и во множество B.

Знак операции пересечения в Паскале «*»

Примеры:

1) [1, 2, 3, 4] * [3, 4, 5, 6] => [3, 4]

2) [‘a’..’z’]*[‘A’..’E’, ‘k’] => [‘k’]

3) [5<4, true and false] * [true] => []

Разностью двух множеств A и B называется множество, состоящее из элементов множества A, не входящих во множество B.

Примеры:

1a) [1, 2, 3, 4] - [3, 4, 5, 6] => [1, 2]

1b) [3, 4, 5, 6] - [1, 2, 3, 4] => [5, 6]

2a) [‘a’..’z’]-[‘A’..’E’, ‘k’] => [‘a’..’j’, ‘i’..’z’]

2b) [‘A’..’E’, ‘k’] - [‘a’..’z’] => [‘A’..’E’]

3a) [5<4, true and false] - [true] => [false]

3b) [true] - [5<4, true and false] => [true]

Операция вхождения. Это операция, устанавливающая связь между множеством и скалярной величиной, тип которой совпадает с базовым типом множества. Если x — такая скалярная величина, а M — множество, то операция вхождения записывается так: x in M.

Результат — логическая величина true, если значение x входит в множество M, и false — в противном случае.

Например, 4 in [3, 4, 7, 9] –– true, 5 in [3, 4, 7, 9] –– false.

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

1) Натуральное число n является двухзначным. Вместо выражения (n >= 10) and (n <=99) можно записать n in [10..99].

2) Символ c является русской буквой. Вместо выражения (c >= ‘А’) and (c <= ‘Я’) or (c>=‘а’) and (c<=‘п’) or (c>=‘р’) and (c<=‘я’) пишем c in [‘А’.. ‘Я’, ‘а’.. ‘п’, ‘р’.. ‘я’] и т.д.

Добавить новый элемент в множество можно с использованием операции объединения. Например, a:= a+[5] Для этих же целей в Turbo Pascal 7.0 предназначена процедура Include: include (M, A) M – множество, A – переменная того же типа, что и элементы множества M. Тот же пример можно записать так: Include (a, 5)

Исключить элемент из множества можно с помощью операции «разность множеств». Например, a:= a-[5] Для этих же целей в Turbo Pascal 7.0 предназначена процедура Exclude: exclude (M, A) M – множество, A – переменная того же типа, что и элементы множества M. Тот же пример можно записать так: Exclude (a, 5)

Работа со строками

Строка - это массив символов, т.е. элементов типа char. В Паскале строке соответствует тип данных String.

var Имя_строки: string [Длина];

Если длина не указана, выделяется память под строку до 255 символов.

var s1:string;

s2:string[20];

s3:array [1..20] of string;

Здесь s2 – строка из 20 символов, s3 – массив из 20 строк, под каждую из которых будет выделено до 256 байт памяти (дополнительный байт нужен для хранения длины строки).

Операции со строками:

Присвоить строке значение - оператор присваивания.

s1:='А.И. Иванов';

s1[3]:=’В’; {символу присвоили символ!}

s2:='1999';

s3[1]:='Информатика';

s3[2]:='';

Ввести строку с клавиатуры: только оператор readln (т.к. ввод строки должен завершаться нажатием Enter!).

Вывести строку на экран: можно использовать как, Write так и Writeln

s2:='SUMMA';

Write (s2); - будет выведено SUMMA

Writeln ('Сумма':10); - будет выведено _ _ _ _ _ Сумма

Соединить 2 строки - оператор сложения.

s1:='1999' + ' год';

s3[3]:=s1+' '+s2;

Если при сложении строк превышена максимальная длина строки, лишние символы отсекаются. Можно также использовать стандартную функцию Concat.

Сравнить 2 строки: операции сравнения. Правила:

· строки равны только при одинаковом наборе символов и одинаковой длине;

· иначе происходит поэлементное сравнение символов по их кодам: '0'<'1'<...<'9'<'A'<...<'Z'<'a'<...<'z'<символы кириллицы

Стандартные подпрограммы обработки строк:

function Length (s:string):integer - определить длину строки в символах;

function Copy (str:string; N,L:integer): string - возвращает часть строки str длиной L, начиная с позиции N;

procedure Insert (s0:string; var s: string; N: integer) - в строку s вставляет строку s0, начиная с позиции N;

procedure Delete (var s:string; N,L:integer) - в строке s удаляет L символов, начиная с позиции N;

Function Pos (s0, s:string): integer - возвращает позицию, начиная с которой строка s0 содержится в строке s или 0, если s0 не содержится в s;

Procedure Str (X: real; var s:string);

Procedure Str (X: integer; var s:string) - преобразует число X в строку s;

Procedure Val (s:string; var X: real; var error:integer);

Procedure Val (s:string; var X: integer; var error:integer); - преобразует строку s в число X. Если преобразовать удалось, error=0, иначе error=номеру первого непреобразуемого символа.

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

Пр: Разбираем предложение на слова и выводим каждое слово

var s,w:string;

p:integer;

begin

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

readln (s);

p:=1;

while p<>0 do begin

p:=pos (' ',s);

if p>0 then w:=copy (s,1,p-1)

else w:=s;

writeln (w);

delete (s,1,p);

end;

end.

Алгоритм работы этой программы очень прост - до тех пор, пока в строке s есть хотя бы один пробел, вся часть строки до пробела копируется в строковую переменную w (слово). Если пробелов уже нет, то вся строка – это одно слово. После обработки слова (в нашем случае – это вывод его на новую строку экрана оператором writeln) обработанная часть строки вместе с пробелом удаляются из s – чтобы следующий шаг цикла не нашел то же самое слово. Первый недостаток такого подхода – не учтены лишние пробелы между словами. Избавимся от них с помощью следующего примера.

Пр: Удаляем лишние пробелы между словами

{... }

p:=1;

while p<>0 do begin

p:=pos (' ',s);

if p>0 then delete (s,p,1);

end;

if s[1]=' ' then delete (s,1,1);

if s[length(s)]=' ' then delete (s, length(s),1);

writeln (s);

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

Пр. Работаем со строкой как с массивом символов (считаем кол-во пробелов в строке)

var s:string;

k,i:integer;

begin

writeln ('Text?');

readln (s);

k:=0;

for i:=1 to length (s) do

if s[i]=' ' then k:=k+1;

writeln ('k=',k);

end.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: