Студопедия  
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Множества. Паскаль позволяет оперировать с множествами как с типами данных.

Читайте также:
  1. МНОЖЕСТВА
  2. Множества
  3. Множества
  4. Множества
  5. Множества и операции над ними.
  6. Множества и операции над ними.
  7. Множества и способы их задания
  8. Множества. Подмножества.
  9. На операциях с предметными множествами

Паскаль позволяет оперировать с множествами как с типами данных.

Пример:
Type
Symbolset = Set Of ' '.. '_';
Color = (White, Blue, Red);
Colorset = Set Of Color;
T1= Set Of 0..9;
Var
C: Color;
Colset: Colorset;
T: Integer;
Tset: T1;

Множества - наборы однотипных объектов, каким-либо образом связанных между собой. Характер связей лишь подразумевается программистом и никак не контролируется Турбо-Паскалем. Максимальное количество элементов множества - 256.

Два множества считаются эквивалентными тогда и только тогда, когда все элементы их одинаковы, причём порядок следования элементов безразличен.

Описание:
<имя типа> = Set Of <базовый тип>, где <базовый тип> есть любой порядковый тип кроме Word, Integer, Longint. Для задания множества используется конструктор множества (((:: =))). Список спецификаций элементов множества, отделяемых друг от друга запятыми; список обрамляется [ ]. Спецификациями элементов могут быть константы или выражения базового типа, а так же тип - диапазон того же базового типа:
Type
Digitchar = Set Of '0'..'9';
Digit =Set Of 0..9;
Var
S1, S2, S3: Digitchar;
S4, S5, S6: Digit;
begin
................
S1: = ['1', '2', '3'];
S2: = ['3', '2', '1'];
S3: = ['2', '3'];
S4: = [0..3, 6];
S5: = [4, 5];
S6: = [3..9];

Операции над множествами:

* пересечение (S4*S6 = [3,6]; S4*S5 = [4])
+ объединение (S4+S5 = [0, 1, 2, 3, 4, 5, 6])
- разность, содержит элементы из 1-го, которые не принадлежат второму (S6-S5 = [3, 6, 7, 8, 9])
= проверка эквивалентности (S4=S4 = true; S5=S4 = false)
<> проверка неэквивалентности (S4<&gtS4 = false; S5<&gtS4 = true)
<= проверка вхождения (True если 1-е содержится во втором).
>= (наоборот).
in проверка принадлежности.

Пример:
Алгоритм получение простых чисел.
Const
N = 100;
Type
Set_Of_Num = Set Of 1..N;
Var
N1, Next, I: Word;
Begset, Primerset: Set_Of_Num;
Begin
Begset:= [2..N];
Primerset:= [1];
Next:=2;
While Begset <> [ ] Do
Begin
N1:= Next;
While N1 <= N Do
Begin
Begset:= Begset - [N1];
N1:= N1 + Next;
End;
Primerset:= Primerset + [Next];
Repeat
Inc(Next);
Until (Next In Begset) Or (Next > N);
End;
For I:=1 To N Do
If I In Primerset Then
Write(I: 8);
Writeln;
End.

Итак, над множествами допустимы четыре операции:

• объединение (+)
• пересечение (*)
• разность (-) (содержит элементы из 1-го, которых нет во 2-ом).
• операция in - позволяет определить, принадлежит элемент множеству или нет.

В программе множество задаётся в виде списка элементов, заключённого в квадратные скобки:

Colset:= [White, Red];
Colset:= [ ];
Tset:= [1, 7, 5];
Tset:= [0... 3, 6, 9];
Tset:= [8 Mod4, 15 Div 5];

Можно использовать операции сравнения.

Пример: из файла вводится текст, содержащий символы от "+" до "[". Требуется рассчитать символы текста в порядке кода ASCII (из повторно встречающихся выводить только один):

Program Sort
Var
S: Char;
Sets: Set Of '+'..'[';
I: '+'..'[';
Begin
Sets:= [ ];
Read(S);
While Not Eof Do
Begin
While Not Eof Do
Begin
Sets: = Seets + [S];
Read(S);
End;
End;
Writeln;
For I: ='+' To '[' Do
If I In Sets Then
Write (I);
Writeln;
End.

Записи

Запись - наиболее общий и гибкий структурированный тип в Паскале.

Запись состоит из фиксированного числа компонентов, называемых полями, которые могут быть различных типов. Этим запись существенно отличается от массива, все компоненты которого должны быть одного и того же типа и доступ к компонентам осуществляется не по индексам (номерам), а по именам.

Пример:
Type
Date = Record
Year: Integer;
Month: 1..12;
Day: 1..31;
End;
Book = Record
Title: String [40];
Author: String [50];
Entry: Date;
End;
Var
D1: Date;
B: Book;

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

Пример1:
D1.Day:=25;
B.Author:= "Levy";
B.Entry.Year:= 1980;

а можно и

B. Entry: = 1980; так как Year первое поле Date.

Пример2: В памяти находится массив из 1000 элементов, каждый из которых имеет тип записи Book. Определить количество книг, год издания которых меньше или равен 1600 году. Для каждого из таких элементов массива распечатать название книги, имя автора, год издания:

Program Rarity;
Type
Date = Record
...........
End;
Book = Record
...........
End;
Var
S, I: Integer;
Mas: Array[1..1000] Of Book;
Begin
S:= 0;
For I:= 1 To 1000 Do
If Mas[I].Entry.Year <= 1600 Then
Begin
Write (Mas[I].Title,}', ',Mas[I].Author,',', ',Mas[I].Entry.Year: 6);
S:= S+1;
End;
Writeln ('Число Книг', S: 4);
End.

Оператор присоединения With.
Можно сократить длинные обозначения элементов записи:

With имя записи Do оператор.

Оператор With открывает область действия, содержащую имена полей указанной переменной типа записи так, что эти имена фигурируют в качестве имён переменных. Кроме экономии места при написании программ, оператор With экономит так же время при выполнении программы, так как ссылка на запись подготавливается только один раз.

Пример:
With B Do
Begin
Title: = '... ';
Author:= '... ';
End;

эквивалентно

B.Title: = '... ';
B.Author:= '... ';

Запись с вариантами

Вариантная часть начинается со слова Case. Это означает, что в записях можно задавать тип, содержащий определения нескольких вариантов структуры. Различие может касаться как числа компонент, так и их типов. Запись может содержать только одну вариантную часть (экономия памяти). Вариантная часть сама может содержать варианты (вложения).

Пример:
Type
N = String [20];
Status = (Женат, Вдов, Разведён, Холост);
Date = Record
Mo: 1..12;
Day: 1..31;
Year: Integer;
End;
Person = Record
Name: N;
Sex: (Муж, Жена);
Birth: Date;
Case Ms: Status Of
Женат, Вдов: (MDate: Date);
Разведён: (Date: Date; First: Boolean);
Холост: (Indept: Boolean);
End.

Замечательная особенность - наложение в памяти вариантных полей, то есть дополнительная возможность преобразования типов:

Var
M = Record
Case Byte Of
0: (By: Array[0..3] Of Byte);
1: (Wo: Array[0..3] Of Word);
2: (Lo: Longint);
End;
..............
With M Do
Begin
Lo:......;
If By [3] = 2 Then...;

Case Of, открывающее вариантную часть не имеет ничего общего с ветвлением Case Of; в данном случае это директива компилятору, сигнализирующая о том, что последующие поля нужно разместить начиная с одной и той же ячейки памяти, поэтому, если изменяется одно из полей - вариантов, изменяются и все остальные. Поле выбора должно быть порядкового типа.

В Турбо-Паскале, в отличие от классики, переменной, описанной в поле ключа выбора, можно присваивать значения, но это ни как не влияет на выбор поля. Значения констант выбора могут быть произвольными и даже повторяющимися. Вместо поля выбора можно иставить лишь идентификатор какого - либо типа, но в таком случае в программе невозможно будет узнать, каким из альтернативных полей используется память, а значит и то, значение какого типа там лежит, но это не всегда и нужно.

Пример:
Type
Rec1 = Record
A: Byte;
B: Word;
End;
Rec2 = Record
C: Longint;
Case X: Byte Of
1: (D: Word);
2: (E: Record);
Case Boolean Of
3: (F: Rec1);
3: (G: Single);
'3': (C: Word);
End;
End;

Var
2: Rec2
..........
R.X: = 255;
If R.E.G = 0 Then
Writeln (0K)
Else
Writeln (R.E.G);
Имена полей должны быть уникальными в пределах той записи, где они объявлены, однако если записи содержат поля-записи то есть вложены одна в другую, имена могут повторяться на разных условиях вложенности.




Дата добавления: 2014-12-19; просмотров: 34 | Поможем написать вашу работу | Нарушение авторских прав




lektsii.net - Лекции.Нет - 2014-2024 год. (0.009 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав