Ввод и вывод множеств
Следует помнить, что значения множественного типа нельзя вводить и выводить. Однако можно ввести значения элементов множества и добавить их к множеству, используя операцию объединения множеств, например:
S:=[]; {исходное множество пусто}
Read(n);
S: = S+[n]; {объединяем исходное множество и множество, содержащее введенный элемент}
Для того чтобы вывести элементы множества, используют специальный прием: в цикле проверяют вхождение во множество всех элементов базового типа и выводят те. которые входят во множество, например:
for i:='а' to ´z´ do
if i in S then Write(i:3);
Рассмотрим несколько примеров решения задач с использованием множеств.
Пример. Разработать программу, которая определяет, является ли введенное слово идентификатором, т.е. начинается ли оно с буквы или знака подчеркивания и не содержит ли специальных символов.
Строим множество символов, которые допустимы в качестве первого: это строчные и прописные буквы латинского алфавита и символ подчеркивания:
['A'.. 'Z', 'a'.. 'z', '_'].
Аналогично определяем множество допустимых символов, которые моryт встретиться, начиная со второго символа слова:
['A'.. 'Z', 'a'.. 'z', '_', '0'.. '9'].
Программа должна вводить строку, проверять допустимость первого символа, а затем в цикле проверять допустимость остальных символов.
Var st: string;
key: boolean;
i: integer;
Begin
WriteLn('Введите строку');
ReadLn(st);
if st[1] in ['A'.. 'Z', 'a'.. 'z', '_'] then {проверка первого символа}
begin
i:= 2;
key:= true;
while (i<=length(st)) and key do
{проверка остальных символов}
if st[i] in ['A'.. 'Z', 'a'.. 'z', '_', '0'.. '9'] then inc(i) else key: = false;
if key then WriteLn('Строка', st,' идентификатор.')
else WriteLn('Строка ',st,' содержит недопустимые символы.');
end
else Writeln('Строка ',st,' начинается с недопустимого символа.');
End.
Пример. Разработать программу для определения количества различных цифр в десятичной записи натурального числа.
Для получения требуемого результата модуль введенного числа преобразуем в строку симколов, а затем сформируем множество из этих символов. Теперь проверим, входят ли во множество цифры от 0 до 9, и те, которые входят, выведем на экран.
Var n: longint;
st: string;
key: boolean;
i: integer;
Begin
WriteLn('Введите число:'); ReadLn(n);
Str(abs(n),st);
mnoj:=[]; {в исходном состянии множество пусто}
for i: =1 to length(st) do
mnoj:=mnoj + [st[i]]; {формируем множество}
WriteLn('Запись числа ',n,' содержит следующие цифры:');
For j:='0' to '9' do {выводим цифры, вошедшие вo множество}
if j in mnoj then Wrtie(f+' ');
End.
Пример. Разработать программу, которая для строки символов, введенной с клавиатуры и состоящей из нескольких слов, разделенных пробелами, определяет множество гласных которые:
- встречаются в каждом слове строки;
- встречаются только в одном слове строки;
- встречаются хотя бы в одном слове строки;
- встречаются более чем в одном слове строки.
Для решения задачи определим тип «множество символов ASCII». Множество гласных букв русского языка зададим с помощью типизированной константы множественного типа. Определим неременные множественного типа для храпения результатов и промежуточных значений:
§ resl - множество гласных, входящих в каждое слово.
§ res2 - множество гласных, входящих не более чем в одно слово,
§ res3 - множество гласных предложения,
§ rеs4 - множество гласных, входящих более чем в одно слово.
§ mnsl - множество гласных, встретившихся в текущем слове.
В программе введем строку и будем последовательно выделять из нее слова. Дня каждого слова построим множество встретившихся гласных букв mnsl.
Если в строке содержится одно слово, то rеsl - rеs2 - res3 = mnsl, а множество res4 пусто.
Если в строке более одного слова, то каждое новое слово изменяет результирующие множества следующим образом:
1) множество гласных, входящих в каждое слово, будет равно пересечению уже найденною множества гласных, входящих в каждое слово, и множества гласных слова: resl ∩ mnsl;
2) множество гласных, входящих более чем в одно слово, res4 увеличится (объединение) на повторяющиеся буквы нового слова: res4 U (rеs3 ∩ mnsl);
3) множество гласных в предложении res3 увеличится (объединение) на множество гласных слова: res3 ∩ mnsl.
Множество гласных, входящих только в одно слово, res2 будем определять после обработки всех слов как разность множества гласных букв предложения и множества гласных, входящих более чем в одно слово предложения: res3 \ res4.
Type setchar=set of char;
Const G: setchar = ['a', 'я', 'y', 'ю','э', 'e', 'o', 'ё', 'и', 'ы']; {типизированная константа «множество гласных букв»}
Var res1, {множество гласных, входящих в каждое слово}
res2, {множество гласных, входящих только в одно слово}
res3, {множество гласных в предложении}
res4, {множество гласных, входящих более чем в одно слово}
mnsl: setchar; {множество гласных текущего слова}
st,slovo: string; ch: char;
i, к: integer; first: boolean;
Begin
WriteLn('Введите исходную строку!');
ReadLn(st); {читаем исходную строку}
st:=st+ ' '; {добавляем в конец пробел для простоты обработки}
first:=true; {признак «первое слово»}
while st<> " do {цикл выделения и обработки слов}
begin k:=pos(' ',st);
slovo:=Copy(st, l, k-l); {выделяем слово}
Delete(st,l,k); {удаляем слово из строки}
{определяем множество гласных, входящих в данное слово}
mnsl:=[]; {исходное состояние «пустое множество»}
for i:=1 to k-1 do
if slovo[i] in G then {если гласная буква, то)
nmsl:=mnsl+[slovo[i]]; {добавляем к множеству}
{формируем множества результатов}
if first then {если первое слово, то}
begin
res1:=mnsl; {входят в каждое слово}
res2:=mnsl; {входят не более чем в одно слово}
res3:=mnsl; {встретившиеся гласные}
res4:=[]; {входят более чем и одно слово}
first:=false; {выключаем признак «первое слово»}
end
else {если не первое слово предложения, то}
begin
resl:=resl*mnsl; {входят в каждое слово}
res4:=res4+res3*mnst; {входят более чем в одно слово}
res3:=res3+nmst; {встретившиеся гласные}
end
end;
res2:=res3-res4; {входящие в одно слово}
{выводим результаты Анализа предложения}
WriteLn('Гласные, которые входят в каждое слово:');
For ch:=#0 tо #255 do if ch in resl then Write(ch:2);
WriteLn;
WriteLn('Гласные, входящие только в одно слово:');
For ch:=#0 to #255 do if ch in res2 then Write(ch:2);
WrileLn;
WriteLn('Глacныe, входящие хотя бы в одна слова:');
For ch:=#0 to #255 do if ch in res3 then Write(ch:2);
WriteLn;
WriteLn('Гласные, входящие более чем в одно слово:');
for ch:=#0 to #255 do if ch in res4 then Write(ch:2);
WriteLn;
End.
Лекция 17.Файловый тип данных(2 часа)
Дата добавления: 2015-12-01; просмотров: 1448;