Pascal-Паскаль
Программирование. Множества Pascal-Паскаль
- Скачено бесплатно: 9293
- Куплено: 414
- Pascal-Паскаль->Программирование. Множества Pascal-Паскаль
Программирование. Множества Pascal-Паскаль
Множества Pascal-Паскаль
Еще одним фундаментальным классом данных являются данные, структурированные в виде множеств.
О перечисляемых типах
Мы уже рассматривали три скалярных типа, которые, в принципе, являются перечисляемыми типами, – это boolean, char и integer. В самом деле, ведь каждый из этих типов можно задать следующим образом:
(Представление #xxx означает, что должен быть взят символ, чей код в таблице ASCII равен xxx).
Это базовые типы, которые не требуется задавать каждый раз, уже определены в системе именно таким образом. Кроме них имеется еще несколько интервальных типов, с некоторыми из которых мы знакомы:
Переменные, имеющие эти типы, могут принимать значения, лежащие в границах соответствующих интервалов.
Для работы с перечисляемыми типами существуют следующие функции, которые хранятся в библиотеке системных функций, и программист имеет к ним доступ:
Пользователь имеет возможность описать собственный перечисляемый тип данных. В общем виде это описание выглядит так:
В скобках перечисляются все возможные значения, которые может принимать переменная данного типа. Следует запомнить, что названия значений нельзя давать по-русски(это важно!).
Например, мы можем описать тип данных color и перечислить семь основных цветов:
При этом значения получают номера в порядке их перечисления, начиная с 0. Поэтому для данного типа справедливыми будут отношения элементов:
Для того чтобы придать переменной множественного типа значение, используют конструктор множества – перечисление элементов множества через запятую в квадратных скобках. Например,
Конструктор множества может содержать диапазон значений базового типа. Тогда во множества включаются все элементы диапазона. Например,
Обе формы конструирования множеств могут сочетаться. Например,
Конструктор вида [] обозначает пустые множества.
В программе можно использовать множественны тип как константы, в этом случае их определяют следующим способом:
Можно множественный тип определить как типизированную константу:
При описании множественного тип как констант допускается использование знака “+” (слияние множеств). Например,
Операции над множественными типами Паскаля
С множественными типами Паскаля можно выполнять действия объединения, исключения и пересечения.
Объединение множественных типов содержит элементы, которые принадлежат хотя бы одному множеству, при этом каждый элемент входит в объединение только один раз. Операция объединения множеств обозначается знаком ‘+’.
Пример множественных типов Паскаля
Возможно объединять множественные типы и отдельные элементы. Например,
Исключение определяется как разность множественных типов, в котором из уменьшаемого исключаются элементы, входящие в вычитаемое. Если в вычитаемом есть элементы, отсутствующие в уменьшаемом, то они никак не влияют на результат. Операция исключения обозначается знаком ‘-‘.
Пример исключения множественных типов Паскаля
Пресечение множественных типов– множества, содержащие элементы, одновременно входящие в оба множества. Операция пересечения множеств обозначается знаком ‘*’.
Пример пересечения множественных типов
Операции отношения множественных типов Паскаля
Наряду с рассмотренными выше операциями, над значениями множественного типа определены и некоторые операции отношения. Операндами операций над множественными значениями в общем случае являются множественные выражения. Среди операций отношения над значениями множественного типа особое место занимает специальная операция проверки вхождения элемента во множества, обозначаемая служебным словом in. В отличие от остальных операций отношения, в которых значения обоих операндов относятся к одному и тому же множественному типу значений, в операции in первый операнд должен принадлежать базовому типу, а второй – множественному типу значений, построенному на основе этого базового типа. Результатом операции отношения, как обычно, является логическое значение (true или false).
Операция сравнения на равенство множественных типов Паскаля. Множества считаются равными (эквивалентными), если все элементы одного множества присутствуют в другом и наоборот. Для операции сравнения на равенство или неравенство используются символы ‘=’ и ‘<>‘.
Тогда операция A=D имеет значение true, а операция A<>D имеет значение false.
Проверка включения. Одно множество считается включенным в другое (одно множество является подмножеством другого), если все его элементы содержатся во втором множестве. Обратное утверждение может быть и несправедливым. Операции проверки включения обозначаются ‘ =’.
Pascal | Лекция №8
Понятие множества. Множественный тип данных
СОДЕРЖАНИЕ:
- Понятие множества
- Конструктор множества
- Описание множеств
- Операции над множествами
- Пример программы с использованием множества
Понятие множества
Понятие множества в математике является одним из основных и обозначает некоторую неупорядоченную совокупность объектов, которые называются элементами множества. Например, множество простых чисел, множество жильцов одной улицы, множество букв алфавита и т.д. Из приведенных примеров видно, что множества могут содержать подмножества (множество жильцов одной улицы состоит из подмножеств людей, живущих в разных домах на этой улице).
Следует обратить внимание на две основных особенности множеств:
- во множестве могут содержаться элементы только одного, базового типа (например, множество простых чисел не может содержать еще и буквы);
- порядок элементов множества не фиксируется.
Например, такая совокупность элементов <1, 2, abc, . >вообще не считается множеством, а совокупности <1, 2, 5, 8>и <8, 1, 5, 2>– эквивалентные множества.
Для представления такого типа данных и для реализации некоторых моментов математического аппарата теории множеств в Паскале существует множественный тип данных (множества).
Множеством называется совокупность однотипных элементов, рассматриваемых как единое целое. В Паскале могут быть только конечные множества. Число элементов исходного множества в Турбо Паскале не может быть больше 256, а порядковые номера элементов (т.е. значения функции Ord) должны находиться в пределах от до 255.
В отличие от элементов массива элементы множества не пронумерованы, не упорядочены. Каждый отдельный элемент множества не идентифицируется, и с ним нельзя выполнить какие-либо действия. Действия могут выполняться только над множеством в целом.
Тип элементов множества называется базовым типом. Базовый тип может быть любой простой тип (стандартный, перечисляемый или ограниченный), за исключением типов Integer и Real, т.к. в этом случае мощность множества будет превышать 256.
Исходя из особенностей внутреннего представления множеств, можно сделать два основных вывода:
- в множестве не может быть одинаковых элементов, что согласуется и с нашими математическими знаниями;
- все операции над множествами выполняются значительно эффективней, чем над другими структурами данных.
Конструктор множества
Конкретные значения множества задаются с помощью конструктора множества, представляющего собой список элементов, заключенный в квадратные скобки. Сами элементы могут быть либо константами, либо выражениями базового типа.
Примеры задания множеств с помощью конструктора:
[3, 4, 7, 9, 12] – множество из пяти целых чисел;
[1..100] – множество целых чисел от 1 до 100;
[‘a’, ‘b’, ‘c’] – множество, содержащее три литеры a, b, c;
[‘A’..’Z’, ‘?’, ‘!’] – множество, содержащее все прописные латинские буквы, а также знаки ? и !.
Символы [] обозначают пустое множество, т.е. множество, не содержащее никаких элементов.
Не имеет значения порядок записи элементов множества внутри конструктора. Например, [1, 2, 3] и [3, 2, 1] эквивалентные множества.
Каждый элемент во множестве учитывается только один раз. Пример: множество [1, 2, 3, 4, 5] эквивалентно [1..5].
Описание множеств
Для задания типа множества используются зарезервированные слова Set и Of, а затем указываются элементы этого множества, как правило, в виде перечисления или диапазона.
Множества могут быть описаны двумя способами:
- Typeимя_типа=Set Ofбазовыйтип;
Var имя_множества: имя_типа;
- Varимя_множества:SetOfбазовый тип;
Здесь базовый тип — тип элементов, входящих во множество.
Нельзя вводить значения во множественную переменную оператором ввода и выводить оператором вывода. Множественная переменная может получить конкретное значение только в результате выполнения оператора присваивания следующего формата:
Кроме того, выражения могут включать в себя операции над множествами.
Операции над множествами
В Паскале реализованы основные операции теории множеств. Это объединение, пересечение, разность множеств. Во всех таких операциях операнды и результаты есть множественные величины одинакового базового типа.
- Объединение множеств. Объединением двух множеств A и B называется множество, состоящее из всех элементов, принадлежащих хотя бы одному из множеств A и B. Знак операции объединения в Паскале +.
Пример: [1, 2, 3, 4] + [3, 4, 5, 6] ? [1, 2, 3, 4, 5, 6]
- Пересечение множеств. Пересечением двух множеств AиB называется множество, состоящее из всех элементов принадлежащих одновременно множеству A и множеству B. Знак операции пересечения в Паскале *.
Пример: [1, 2, 3, 4] * [3, 4, 5, 6] ? [3, 4]
- Разность множеств. Разностью двух множеств A и B называется множество, состоящее из элементов множества A, не принадлежащих множеству B. Знак операции пересечения в Паскале —.
Пример: [1, 2, 3, 4] — [3, 4, 5, 6] ? [1, 2]
[3, 4, 5, 6] — [1, 2, 3, 4] ? [5, 6]
Очевидно, что операции объединения и пересечения – перестановочны, а разность множеств – не перестановочная операция.
- Операции отношения. Множества можно сравнивать между собой, т.е. для них определены операции отношения. Результатом отношения является логическая величина true или false. Для множеств применимы все операции отношения, за исключением > и
Отношение | Результат | |
True | False | |
A = B | Множества A и B совпадают | В противном случае |
A<>B | Множества A и B не совпадают | В противном случае |
A | Все элементы A принадлежат B | В противном случае |
A>=B | Все элементы B принадлежат A | В противном случае |
Тогда операции отношения дадут следующие результаты:
Операция | Результат |
M=[4, 7, 3, 3, 9] | true |
M<>[7, 4, 3, 9] | false |
[3, 4] | true |
[] | true |
M>=[1..10] | false |
M | true |
- Операция вхождения. Эта операция устанавливает связь между множеством и скалярной величиной, тип которой совпадает с базовым типом множества. Если x – такая скалярная величина, а M – множество, то операция вхождения записывается так: xInM. Результат – логическая величина true, если значение x входит в множество M, и false — в противном случае.
Пример для описанного выше множества: 4 In M — true, 5 In M – false.
Пример программы с использованием множества
Пусть дана строка символов с точкой в конце строки. Нужно определить число различных букв, входящих в данную строку.
1-й вариант:
2-й вариант:
Контрольные вопросы
- Что такое множество?
- Назовите две основные особенности множеств.
- Что называют конструктором множеств?
- Как описываются множества в Паскале?
- Какие операции можно осуществлять с множествами?
Множество – это набор взаимосвязанных по какому-либо признаку или группе признаков однотипных элементов. Множественный тип в Паскаль относится к структурированным типам данных.
Каждый отдельный элемент может входить в структуру только один раз. Считается, что элементы множества являются неупорядоченными.
Для описания множественного типа используется следующая конструкция:
type имя типа > = set of базовый тип
Множество формируется на основе базового типа. Базовым типом в PascalABC.NET может быть любой тип данных, в том числе строковой.
Множественный тип может быть задан, в том числе, без предварительного описания, например:
- type
- colorSet = set of (red, green, blue);
- strSet = set of string;
- var
- colS: colorSet;
- examS: strSet;
- digS, numS: set of integer;
- letterS: set of char;
Переменная типа множество может включать в себя несколько значений базового типа, при этом каждый элемент входит в структуру только один раз. Значение типа множество формируется с помощью конструкции следующего вида:
[список значений]
Списком значений могут быть перечисленные через запятую, выражения базового типа или их диапазоны (для порядковых типов) в виде a..b . Если список значений пуст, то множество пустое. По присваиванию пустое множество является совместимым множеством любого типа.
- examS := [‘Информатика’, ‘Математика’, ‘Физика’];
- digS := [1..7];
- numS := [1..3, 5, 7];
- colS := [];
Для добавления элементов к множеству используется:
- стандартная процедура Include (sSet, x)
- конструкция sSet += [x]
Для удаления элементов из множества используется:
- стандартная процедура Exclude (sSet, x)
- конструкция sSet -= [x]
Операции над множествами
Над множествами в в PascalABC.NET определены операции объединение, пересечение, разность, группа операций отношения, операция in .
- = (равенство): два множества считаются равными, если они совпадают, причем порядок элементов в сравниваемых множествах значения не имеет;
- <> (неравенство): два множества считаются не равными, если они не совпадают: отличаются по количеству элементов или по значению хотя бы одного элемента;
- >= (нестрого содержит): результат А >= В , равен true , если все элементы В содержатся в А;
- (нестрогое вложение): результат А , равен true , если все элементы A содержатся в B;
- > (строго содержит): результат А > В , равен true , если все элементы В содержатся в А и при этом множество А содержит хотя бы на один элемент больше;
- (строгое вложение): результат А , равен true , если все элементы A содержатся в В и, при этом, множество В содержит хотя бы на один элемент больше;
Например (в этом и следующих примерах: digS = [1..7], numS = [1..3, 5, 7] ):
writeln(digS > numS); результат True
Операция in применяется для проверки принадлежности элемента множеству. Обычно данная операция используется с условным оператором, например:
- if ‘Информатика’ in examS then
- writeln(‘YES’)
- else
- writeln(‘NO’);
Операция объединение + : результатом объединения двух множеств является множество, в котором содержаться элементы обоих множеств, например:
- numS := numS + digS;
- writeln(numS);
Операция пересечение * : результатом пересечения двух множеств является множество, в котором содержится элементы, входящие одновременно в оба множества, например:
- numS := numS * digS;
- writeln(numS);
Операция разность — : результатом разности двух множеств является множество, в котором содержится элементы первого множества, не входящие во второе множество.
- digS := digS — numS;
- writeln(digS);
Copyright © 2014-2018, Урок информатики
Все права защищены
лабы по информатике, егэ
лабораторные работы и задачи по программированию и информатике, егэ по информатике
Pascal: Занятие № 13. Записи в Паскале
Записи в Паскале
Записи в Паскале – структурированный комбинированный тип данных. Запись состоит из определенного числа компонент, называемых полями, которые могут быть разного типа.
Описание записи в Паскале
Общий вид описания типа record в Паскаль:
var = record : ; : ; . end;
Рассмотрим примеры объявления и создания записи в Паскале.
type mydate = record month: 1..12; day: 1..31; year: integer end; var d: mydate;
В примере переменная mydate — запись, состоящая из трех полей: month , day и year . Каждое поле содержит соответственно данные: целое число в пределах от 1 до 12 — номер месяца (интервальный тип), целое число от 1 до 31 — число месяца (интервальный тип), целое число — год.
Обращение к полям записи
type mydate = record month: 1..12; day: 1..31; year: integer end; var d: mydate; begin d.day:=1; d.month:=12; readln(d.year); writeln(d.day,’/’,d.month,’/’,d.year); end.
Записи в виде двумерной таблицы
Часто записи используются в виде двумерной таблицы, каждый столбец которой имеет свой тип.
Таким образом, если описана двумерная таблица, то ее начальные значения задаются как вектор, каждый компонент которого является записью.
Рассмотрим пример использования записи-таблицы:
1 | 2 | 3 | |
---|---|---|---|
Day | 2 | 14 | 14 |
Month | 1 | 2 | 12 |
Year | 1985 | 1987 | 1989 |
Задать данные таблицы в виде записи. Объявить массив дней рождения и вывести дату первого дня рождения.
type zap1= record day:1..31; month: 1..12; year: 1900..2100; end; var birthdays:array[1..100] of zap1; begin birthdays[1].day:=2; birthdays[2].day:=14; birthdays[3].day:=14; birthdays[1].month:=1; birthdays[2].month:=2; birthdays[3].month:=12; birthdays[1].year:=1985; birthdays[2].year:=1987; birthdays[3].year:=1989; writeln(birthdays[1].day); end.
Использование конструкции with при работе с записями
При работе с записями есть возможность избавиться от постоянного префикса в виде обращения к названию переменной. Сравним два примера:
type zap1= record day:1..31; month: 1..12; year: 1900..2100; end; var my_birthday: zap1; begin my_birthday.day:=17; my_birthday.month:=4; my_birthday.year:=1993; . end.
type zap1= record day:1..31; month: 1..12; year: 1900..2100; end; var my_birthday: zap1; begin with my_birthday do begin day:= 17; month:= 3; year:= 2004; end; . end.
Во втором примере значительно проще обращаться к полям записи, избавившись от префикса, благодаря with
Записи при работе с файлами
type t_subscriber = record surname: string[20]; tel: LongInt; end; var subscriber: t_subscriber; f: file of t_subscriber; i: Integer; begin Assign(f,’notebook.dat’); Rewrite(f); for i:=1 to 5 do begin with subscriber do begin Write(‘Surname: ‘); ReadLn(surname); Write(‘Phone: ‘); ReadLn(tel); end; Write(f, subscriber); end; Close(f); end.
Рассмотрим пример последовательного доступа к типизированному файлу с использованием записей:
type t_subscriber = record surname: string[20]; tel: integer; end; var subscriber: t_subscriber; f: file of t_subscriber; s: string; begin Assign(f,’z:pascal.dat’); rewrite(f); subscriber.surname:=’ivanov’; subscriber.tel:=36233357; write(f,subscriber); subscriber.surname:=’petrov’; subscriber.tel:=236244475; write(f,subscriber); close(f); Reset(f); while not Eof(f) do begin Read(f, subscriber); with subscriber do begin Str(tel,s); if Copy(s,1,3) = ‘362’ then tel := tel+2000000; end; Seek(f,FilePos(f)-1); // возврат указателя назад Write(f,subscriber); Writeln(subscriber.surname, ‘ ‘,subscriber.tel); end; Close(f); end.
Множества в Паскале
Множества в Паскале — это некоторое собрание элементов, одно и того же базового типа.
В качестве базового типа может выступать любой простой порядковый тип. Базовым типом не могут быть вещественные числа (real не порядковый тип) и строки (не простой и не порядковый тип).
Размер множества в Turbo Pascal всегда ограничен некоторым предельно допустимым количеством элементов. Во множествах допускаются только такие элементы, порядковые значения которых не выходят за границы 0..255. В Turbo Pascal в целочисленных множествах могут присутствовать только числа от 0 до 255.
Отрицательные элементы множеств в Turbo Pascal не допускаются. Поэтому базовыми типами не могут быть типы shortint, integer, longint.
Таким образом, если необходимо множество целочисленных объектов, то базовый тип для Turbo Pascal должен быть объявлен как диапазон типа byte . Для множеств, содержащих символы, базовым типом должен быть тип char .
type week_days = (Mon, Tue, Wed, Thu, Fri, Sat, Sun); var work_days: set of week_days; begin work_days:=[Mon, Wed, Thu]; end.
Из примера видно, что множества (тип set ) задаются путем перечисления значений, разделенных запятыми и заключенных в квадратные скобки.
Синтаксис:
name_set:=[expr1, expr2, … exprn];
type letters = set of char; var ch1,ch2:letters; .
Переменные ch1 и ch2 из примера также не могут быть выведены на экран и их значения не могут быть запрошены при помощи оператора read .
Возникает логичный вопрос: как же тогда работать с множествами в Паскале?
Чтобы ответить на данный вопрос, сначала рассмотрим операции, выполняемые над множествами.
Действия над множествами
Объединение двух множеств A и B ( A + B ) – это новое множество, состоящее из элементов, принадлежащих множеству A или B либо тому и другому одновременно
Пример:
Пересечение двух множеств A и B ( A * B ) – это множество, состоящее из элементов, одновременно принадлежащих множествам A и B .
Пример:
var ch1, ch2, ch3: set of char; begin ch1:=[‘a’, ‘b’, ‘d’]; ch2:=[‘m’, ‘d’, ‘e’]; ch3:=ch1 * ch2; <Результат: ch3 = [‘d’] >end.
Разность двух множеств A и B ( A – B ) – это новое множество, состоящее из элементов множества A , не вошедших в множество B .
Пример:
var ch1, ch2, ch3: set of char; begin ch1 := [‘a’, ‘e’, ‘t’]; ch2 := ch1 – [‘e’]; < [‘a’, ‘t’] >ch3 := [‘m’, ‘n’, ‘t’] – ch2; < [‘m’, ‘n’] >end.
Множества и операция IN в Паскале
Операция in необходима для поиска определенного элемента в величине типа set , т.е. в множестве.
Так, если x есть элемент множества a , то ( x in a ) дает true .
type week_days=(Mon, Tue, Wed, Thu, Fri); var work_days: set of week_days; begin work_days:=[Mon, Wed]; if Mon in work_days then writeln (‘понедельник — рабочий день’) else writeln (‘понедельник — не рабочий день’) end.
var work_days,days_off: set of byte; begin work_days:=[1, 2]; days_off:=[6, 7]; if 1 in work_days then writeln (‘понедельник — рабочий день’) else writeln (‘понедельник — не рабочий день’); if 6 in days_off then writeln (‘суббота — выходной день’) else writeln (‘суббота — не выходной день’); end.
var voron, vorona, voroni: set of byte; number:integer; begin voron:=[5,6,7,8,9,10]; vorona:=[1]; voroni:=[2,3,4]; writeln (‘введите количество ворон’); readln(number); if number in voron then writeln (‘на ветке ‘, number,’ ворон’); if number in vorona then writeln (‘на ветке ‘, number,’ ворона’); if number in voroni then writeln (‘на ветке ‘, number,’ вороны’) end.
var m : set of char; s : string; i : byte; begin write(‘строка: ‘); readln(s); m :=[]; i := 1; while i
Posted in
<Для любого количества ворон:>
var
vorona, voroni: set of byte;
number: integer;
x: string;
begin
vorona := [1];
voroni := [2, 3, 4];
x := »;
writeln(‘введите количество ворон’);
readln(number);
if (number mod 100 14) then
if number mod 10 in vorona then
x := ‘а’
else if number mod 10 in voroni then
x := ‘ы’;
writeln(‘на ветке ‘, number, ‘ ворон’ + x)
end.