Ввод и вывод множеств

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

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; просмотров: 1392;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.014 сек.