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 |


