f := a * b; {ПЕРЕСЕЧЕНИЕ: множество F содержит те элементы множества A, которые есть и в множестве B. Множество F теперь содержит 2 элемента - ‘C’,’D’ }

if a = b {РАВЕНСТВО: сравниваются множества A и B. Если оба они содержат одинаковые элементы, то результат True, в противном случае – False. В данном случае A не равен B, т. к. A=[‘A’..’D’], а B=['C','D','R','W'], т. е. A=B - False}

then writeln('A=B')

else writeln('A<>B'); {Будет выведена строка ‘A<>B’}

if c <> a * b {НЕРАВЕНСТВО: сравниваются множества A и B. Если они отличаются друг от друга хотя бы одним элементом, то результат True, в противном случае – False. В данном случае C=[‘C’,’D’], и A*B=['C','D'] - т. е. в данном случае C равен A*B, следовательно, c<>a*b - False}

then writeln('C<>A*B')

else writeln('C=A*B'); {Будет выведена строка ‘C=A*B’}

if a >= c {ЯВЛЯЕТСЯ НАДМНОЖЕСТВОМ: сравниваются множества A и C. Если в множестве A содержатся все элементы множества C (причем в множестве A, кроме элементов множества C, могут быть и любые другие элементы), то результат True, в противном случае – False. В данном случае A=[‘A’..’D’], а С=['C','D'], т. е. множество A содержит все элементы множества C, следовательно, a>=c - True}

then writeln('A>=C') {Будет выведена строка ‘A>=C’}

else writeln('not A>=C');

if a<=b {ЯВЛЯЕТСЯ ПОДМНОЖЕСТВОМ: сравниваются множества A и B. Если все элементы множества A содержатся в множестве B (причем в множестве B, кроме элементов множества A, могут быть и любые другие элементы), то результат True, в противном случае – False. В данном случае A=[‘A’..’D’], а B=['C','D',’R’,’W’], т. е. все элементы множества A не содержатся в множестве B, следовательно, a<=b - False}

НЕ нашли? Не то? Что вы ищете?

then writeln('A<=B')

else writeln('not A<=B'); {Будет выведена строка ‘not A<=B’}

if 'A' in A {ПРИНАДЛЕЖНОСТЬ: проверяется, содержит ли множество A элемент ‘A’. Если содержит, то результат True, в противном случае – False. В данном случае A=[‘A’..’D’], следовательно, ‘A’ содержится в множестве A. Значит, ‘A’ in A - True}

then writeln('''A'' in A') {Будет выведена строка ‘ ‘A’ in A’}

else writeln('''A'' NOT in A')

end.

Пример использования множеств

Задача: сделать программу, обеспечивающую проверку знаний шестнадцатеричных цифр.

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

Замечание: в записи шестнадцатеричных чисел могут быть использованы цифры от ‘0’ до ‘9’ и латинские буквы – либо большие (от ‘A’ до ‘F’), либо маленькие (от ‘a’ до ‘f’).

Программа:

Program digitsOfHex;

Type

SetChar = set of char; {Множество символов}

Var

S: string; {Вводимая строка}

I: integer; {Счетчик цикла}

HexSymb: SetChar; {Множество всех шестнадцатеричных цифр}

InputSymb: SetChar; {Множество всех введенных символов}

TrueSymb: SetChar; {Множество правильно введенных символов}

ErrSymb: SetChar; {Множество ошибочно введенных символов}

MissSymb: SetChar; {Множество забытых символов}

{Процедура вывода символов, содержащихся в множестве S, на экран.

S - множество, Message - строка, выводимая перед выводом множества}

procedure WriteSetChar(message: string; S: SetChar);

var

C: char; {Выводимый символ}

begin

Write(message); {Вывод сообщения}

{Проход по всем мыслимым символам}

For c := #0 to #255 do

If c in S {Если символ C присутствует в множестве S}

then write(c,' '); {То этот символ выводится на экран}

Writeln;

end;

Begin

{Инициализация множеств}

HexSymb := ['0'..'9','a'..'f','A'..'F'];{Все возможные

шестнадцатеричные цифры}

InputSymb := []; {Множество введенных символов вначале пустое}

{Ввод строки с цифрами}

Writeln;

Writeln('Введите в одну строку все символы,’);

Writeln('используемые для записи шестнадцатеричных’);

Write (’ чисел: ');

ReadLn(s);

{Формирование множества всех введенных символов}

For I := 1 to length(s) do

InputSymb := InputSymb + [s[i]]; {Проходим в цикле по

всем символам введенной строки, добавляя

каждый символ в множество InputSymb}

{Формирование множества правильно введенных символов}

TrueSymb := InputSymb * HexSymb; {Правильно введенные

символы - это те символы из введенных, которые есть в

множестве шестнадцатеричных цифр}

{Формирование множества неправильно введенных символов}

ErrSymb := InputSymb - HexSymb; {Неправильно введенные

символы - это те символы из введенных, которых

нет в множестве шестнадцатеричных цифр}

{Формирование множества забытых (пропущенных) символов}

MissSymb := HexSymb - TrueSymb; {Пропущенные символы -

это те символы из множества шестнадцатеричных цифр,

которых нет в множестве правильно введенных}

{Вывод результатов}

Writeln;

{Проверка, ввел ли пользователь хотя бы один правильный символ}

If TrueSymb <> []

Then {Если ввел, то выводим все их на экран}

WriteSetChar('Вы ввели следующие правильные символы :',

TrueSymb)

Else {Если не ввел ни одного правильного, выдаем сообщение}

Writeln('Вы не ввели ни одного правильного символа!');

{Проверка, ввел ли пользователь хотя бы один неправильный

символ}

If ErrSymb <> []

Then {Если ввел, то выводим все их на экран}

WriteSetChar('Вы ввели следующие неправильные символы:',

ErrSymb)

Else {Если не ввел ни одного неправильного, выдаем сообщение}

Writeln('Вы не ввели ни одного неправильного’,

’ символа!!!');

{Проверка, забыл ли пользователь ввести хотя бы один правильный

символ}

If MissSymb <> []

Then {Если забыл, то выводим все забытые на экран}

WriteSetChar('Вы забыли ввести следующие символы :',

MissSymb)

Else {Если не забыл, выдаем сообщение}

Writeln('Вы ввели все возможные шестнадцатеричные’,

’ цифры!!!');

End.

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

пример Обработки массива строк

Задача “Поиск символов в тексте”

Рассмотрим обработку строк на примере следующей задачи:

С клавиатуры вводится n строк (n<=10). Каждая строка содержит не более 70 символов. Необходимо найти и вывести все гласные буквы (без повторений), которые встретились в этих строках.

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

В результате анализа задачи в ней были выделены следующие процедуры:

1. Ввод массива строк - ReadStrings.

2. Вывод массива строк - PrintStrings.

3. Определение множества символов в массиве строк - GetAllChars.

4. Вывод массива строк с подсветкой символов, входящих в указанное множество - PrintColorStrings.

5. Вывод множества символов - WriteSetChar.

6. Ожидание нажатия любой клавиши - WaitPressed.

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

Программа:

{

Вводится не более 10 строк.

Ищутся и выводятся на экран гласные буквы, находящиеся

во введенных строках.

}

uses crt; {В программе будут использоваться средства

консольного ввода-вывода, в том числе процедуры

textcolor и clrscr, и функции readkey}

Const

MaxLengthString = 70; {Максимальная длина строки}

MaxNumberStrings = 10; {Максимальное количество строк}

Type

TString = string[MaxLengthString]; {Строка, в которой может

храниться не более MaxLengthString символов}

SetChar = Set of char; {Множество символов}

ArrayTString = array [1..MaxNumberStrings] of TString;

{Массив строк}

{Процедура ReadString.

Ввод строк в массив str. N - количество реально введенных строк.}

procedure ReadStrings(var str: ArrayTString;

var N: Integer );

var

s : TString; {Строка для ввода}

begin

clrscr; {Очистка экрана}

{Вывод приглашения к вводу}

textcolor(LightGray); {Установка цвета для выводимого

на экран текста}

writeln;

writeln('Введите не более ', MaxNumberStrings,

' строк.');

writeln('Конец ввода - пустая строка:');

{Ввод строк}

n:=0; {Вначале введенных строк нет}

repeat

{Вывод номера вводимой строки}

textcolor(DarkGray); {Установка темно-серого цвета}

write(n+1,'> '); {Вывод номера - темно-серым цветом}

{Ввод строки}

textcolor(LightGray); {Установка серого цвета}

readln(s); {Ввод строки - серым цветом}

if s <> '' then {Если введена непустая строка}

begin

inc(n); {То вписываем ее в массив SS}

str[n] := s;

end;

until (n = MaxNumberStrings) or (s = ''); {Выход из цикла

ввода либо после ввода 10 строк,

либо после ввода пустой строки}

end;

{Процедура PrintStrings.

Выводятся на экран строки из массива str.

N - количество строк в массиве str.}

procedure PrintStrings(const str: ArrayTString;

N: Integer );

var

i: integer;

begin

clrscr; {Очистка экрана}

textcolor(LightBlue); {Цвет вывода - голубой}

writeln;

writeln('Вы ввели ', n, ' строк(у, и). Вот они:');

for i := 1 to n do

begin

{Номер строки выводится голубым цветом}

textcolor(LightBlue);

write(i:2, '> ');

{Сама строка выводится серым цветом}

textcolor(LightGray);

writeln( str[i] );

end;

end;

{Процедура GetAllChars.

Получаем все символы.

Заносит все символы, встретившиеся в массиве строк str,

в множество AllChars. N - количество строк в массиве str.}

procedure GetAllChars(const str: ArrayTString; N: Integer;

var AllChars: SetChar);

var

i, j : integer;

begin

AllChars := []; {Инициализация множества}

for i := 1 to n do {Для всех введенных строк}

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7