Лабораторное занятие №9 Описание перечисляемого типа; Описание множественного типа данных, его структура;

advertisement
1
Лабораторное занятие №9
ПЕРЕЧИСЛЯЕМЫЙ ТИП. МНОЖЕСТВА
Цели:
 Описание перечисляемого типа;
 Описание множественного типа данных, его структура;
 Получение навыков в организации ввода/вывода значений перечисляемого и множественного
типов;
 Решение задач с использованием перечисляемого и множественного типа.
Перечисляемый тип – тип данных, заданный списком принадлежащих ему
значений.
Type <имя типа>=(<значение 1>,<значение 2>,<значение 3>…);
Объявление перечисляемого типа описывает множество значений, которые может
принимать переменная данного перечисляемого типа.
В качестве значений
запрещается использовать значения стандартных типов.
Пример 1
Type WorkDay=(Mon, Tue, Wed, Thu, Fri);
Season= (Spring, Summer, Autumn, Winter);
Следующие описания типов некорректны:
Type Dig=(1, 2, 3, 4, 5,6, 7, 8, 9);
Symbol=(‘1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’);
WeekDay=( ‘Mon’, ‘Tue’, ‘Wed’, ‘Thu’, ‘Fri’,‘Sat’,‘Sun’);
Так же, как и к переменным других порядковых типов, к переменным перечисляемого типа
применимы функции Ord, Pred, Succ.
Пример 2
PROGRAM PRIMER_TIPA;
TYPE ZNAK=(MINUS, PLUS, DEL, MULT);
VAR Z:ZNAK;
BEGIN
Z:=PLUS;
WRITELN(ORD(Z):3);
{результат - 1}
WRITELN(ORD(PRED(Z)):3); {результат - 0}
Z:=SUCC(SUCC(Z));
{z=mult}
WRITELN(ORD(SUCC(Z)):3); {ошибка}
END.
В отличие от данных других типов Pascal не поддерживает операции ввода/
вывода значений перечисляемого типа. При необходимости программист сам должен
организовать ввод/вывод таких данных, чаще всего с помощью оператора CASE.
2
Пример 3
Type Product=(Bread, Butter, Cheese, Milk);
Procedure Output_Assort(X:Product);
Begin
Case X Of
Bread: Writeln('Хлеб');
Butter: Writeln('Масло');
Cheese: Writeln('Сыр');
Milk:
Writeln('Молоко');
End;
End;
Множественный тип объявляется как совокупность неповторяющихся элементов
некоторого базового типа.
TYPE <имя множества>=SET OF <базовый тип>;
Допускается объявлять только конечные множества, кол-во элементов которых может
меняться от 0 до 255. Базовым типом может быть любой порядковый тип, за
исключением типов Shortint, Integer, Word и Longint, кол-во элементов которых
превышает 255. В качестве базового могут использоваться диапазоны этих типов.
Порядок расположения элементов во множестве никак не фиксируется.
Пример 4
Type
Digits=set of 1..100;
{множественный тип чисел от 1 до 100}
Setchar=set of char;
{тип множества символов}
Letter=set of ‘a’..’z’; {множество символов от ‘a’ до ’z’}
Var
Mychar:setchar;
{переменная множественного типа чисел от 1 до 100}
Mydig: digits;
Simst:letter;
Number:set of 1..10;
{переменная-множество чисел от 1 до 10}
Cif:set of 0..9;
{множество цифр от 0 до 9}
Kods:set of #0..#255; {множество символов ASCII-таблицы}
Значением переменной множественного типа является множество. Конкретные
значения переменных и констант множественного типа определяются с помощью
конструктора множества.
Пример 5
Mychar:=[ ];
Mydig:=[2,3,5,7,11];
Simst:=[‘a’, ’d’, ’f’, ’h’];
Number:=[1, 2, 3..7];
3
ОПЕРАЦИИ НАД МНОЖЕСТВАМИ
Операция
Пример
[1..7]+[4..5,8,60]
Объединение (+)
[1..7]*[4..5,8,60]
Пересечение (*)
[1..7]–[4..5,8,60]
Дополнение (–)
Операции отношения [‘a’,’b’]=[‘b’,’a’]
[4,5,6]=[4..6]
(=,<>,<=,>=)
[‘c’,’b’,’d’]>=[‘c’,’d’]
10 in [2,4,6,8,10,12,14]
Операция проверки
вхождения элемента
во множество (in )
Результат
[1..8,60]
[4..5]
[1..3,6,7]
True
True
True
True
Следует помнить, что значения множественного типа нельзя вводить и
выводить. Однако можно ввести значения элементов множества и добавить их к
множеству, используя операцию объединения множеств.
VAR S: SET OF CHAR;
N: CHAR;
BEGIN
S:=[ ];
READ(N);
S:=S+[N];
Чтобы вывести элементы множества, используют специальный прием: в цикле
проверяют вхождение во множество всех элементов базового типа и выводят те,
которые входят во множество.
VAR S: SET OF CHAR;
I: CHAR;
BEGIN
FOR I:=’A’ TO ‘Z’ DO
IF I IN S THEN WRITE (I:3);
Пример 6
Пример программы, которая подсчитывает количество слов, содержащих
специальные символы @, #, $, %, &.
program mnog;
const mnoj:set of char=['@','#','$','%','&'];
var st,st1,s:string;
i,p,kol:byte;
flag:boolean;
Begin
writeln('Введите строку:');
readln(st);
st:=st+' '; kol:=0;
repeat
p:=pos(' ',st);
s:='';
s:=copy(st,1,p-1);
delete(st,1,p);
i:=1;
flag:=false;
4
while (i<=length(s))and not flag do
if s[i] in mnoj then flag:=true else inc(i);
if flag then inc(kol);
until p=0;
writeln('Кол-во слов=',kol);
readln
end.
Пример 7
Разработать программу, которая для строки символов, введенной с
клавиатуры и состоящей из нескольких слов, разделенных пробелами,
определяет множество гласных, которые встречаются в каждом слове
строки.
PROGRAM GLASN;
Type SetChar=set of char;
Const Glas:SetChar=['a','e','u','i','o'];
Var mnog,Mnog_Res:SetChar;
Str,sl:string;
p:byte;
procedure vivod (m:SetChar); {вывод множества}
var i:char;
begin
for i:='a' to 'z' do
if i in m then write(i:2);
end;
begin
writeln('Vv. str:');
readln(str);
str:=str+' ';
mnog_res:=glas;
while str<>'' do
begin
p:=pos(' ',str);
sl:=Copy(str,1,p-1);
delete(str,1,p);
mnog:=[];
for p:=1 to length(sl) do
if sl[p] in glas then mnog:=mnog+[sl[p]];
mnog_res:=mnog_res*mnog;
end;
vivod(mnog_res);
readln;
end.
УПРАЖНЕНИЯ
Задание 1. Дана строка. Сформировать множество символов данной строки.
5
Задание 2. Дана строка, состоящая из последовательности целых чисел в символьном
изображении. Числа разделены пробелом (345 6578 1235 54 658). Разработайте
программу, которая формирует множество цифр, которые присутствуют в записи всех
чисел последовательности.
Задание 3. Разработать программу, которая для строки символов, введенной с
клавиатуры и состоящей из нескольких слов, разделенных пробелами, определяет
множество гласных, которые:
 Встречаются только в одном слове строки;
 Встречаются хотя бы в одном слове строки.
Задание 4. В техникуме имеются секции по следующим видам спорта: лыжи, коньки,
хоккей, регби и самбо. Списки учащихся, занимающихся тем или иным видом спорта,
представлены в виде множеств. Разработать программу, которая определяет учеников:
 посещающих лыжную секцию и самбо;
 занимающихся во всех секциях;
 занимающихся только в одной секции.
Задание 5. Дан текст, содержащий несколько слов, разделенных пробелом, в конце
точка. Разработайте программу, которая, используя множественный тип, удаляет из
текста все слова, содержащие хотя бы одну цифру. Вывести исходный и
преобразованный тексты. Если таких слов нет, вывести об этом сообщение.
Задание 6. Дана строка, содержащая последовательность слов. Разработайте
программу, которая используя множественный тип, вычеркивает из каждого слова
буквы I,j,k,l,m,n. Вывести исходную и преобразованную строки.
Задание 7. Дана строка, содержащая последовательность слов, разделенных пробелом.
Разработать программу, которая формирует множество символов, встречающихся в
каждом слове и множество символов, встретившихся в тексте единственный раз.
Контрольные вопросы:
1.
2.
3.
4.
5.
6.
Какие ограничения определены на перечисляемый тип?
Какие ограничения определены для множественного типа?
Как осуществляется ввод элементов множества с клавиатуры?
Как осуществляется вывод множества?
Как определить результат пересечения множеств?
Какие элементы входят в дополнение множеств А и В (А-В)?
Download