Страницы

Поиск по вопросам

среда, 1 января 2020 г.

Сложности с пониманием темы “Множества” в Turbo Pascal.

#pascal


Здравствуйте!
Снова обращаюсь к знатокам :)
Вопрос от новичка, который только-только начал
изучать Turbo Pascal и постепенно добрался
до темы «Множества».
Тема в общем смысле кажется понятной, но, в то же
время кажется, что… ничего совсем не понятно.
Если честно, в голове уже каша от изученного материала…
Но очень хочется понять эту тему, прежде, чем идти
в изучении дальше.
Ниже я привожу вопросы, на которые прошу Вас ответить.
Вопросов много. Я понимаю, что ответы на них могут
быть утомительными… Но если уж не на все, то хоть
 на некоторые из них, ответьте, пожалуйста.
Правильно ли я понимаю, что:
1. В памяти отводится по 1 биту под каждый элемент,
находящийся во множестве.
2. Перечислимый тип данных сам по себе является
множеством.
3. Не совсем понятно объявление множеств в программе.
а) 
type SetByte = set of byte;
var sb : SetByte;

Правильно ли я понимаю в данном случае, что:
а1) Множество задается в разделе type, потому что
по сути, создается необходимый пользовательский тип?
а2) В разделе var нужно объявить специальную переменную,
которая будет являться «представителем» того пользовательского
типа, который был создан в разделе type. Т.е. переменной
созданного множества.
а3) В программе можно будет выполнять все
обычные операции, предусмотренные ЯП, над
переменной, которая является «представителем»
множества.
a4) В данном случае sb ялвяется одним из элементов
множества SetByte. И таких элементов (переменных)
можно создать столько, сколько может вместить в
себя множество.
б) 
type SetChisla = set of 10..20;
var Index : SetChisla=[12,15,17];

б1) Понятно, что задается множество в диапазоне от
10 до 20. Но почему здесь не указывается какого
типа это множество? Или итак понятно, что это
целочисленный тип?
б2) Если уже определено, что множество задано
в диапазоне от 10 до 20, что значат цифры в
квадратных скобках? Здесь прописывается то,
что в заданном множестве будут присутствовать
именно эти три элемента: 12, 15 и 17? Т.е. происходит
обычная операция присваивания?
б3) Почему в качестве идентификатора переменной
множественного типа участвует ключевое слово index?
Может быть это опечатка автора учебного пособия?
в) 
type Symbol = set of char;
var Letter, Digits, Sign : Symbol;

в1) Почему можно создавать несколько переменных,
являющихся представителями одного и того же
множества? Как они взаимодействуют друг с другом?
г) 
type Month = (January, February, March, April, May, June, July, August,
            September, October, November, December);
   Season : set of Month;
var Winter, Spring, Summer, Autumn, Vacation, WarmSeason : Season;

г1) Здесь создано множество Season на основе перечислимого
типа?
г2) Какими тогда будут элементы этого множества?
January, February… December ? Или Winter…WarmSeason?
Или множество будет содержать
и отдельно заданные элементы и элементы, входящие
в перечислимый тип Month?
г3) Почему в строчке Season : set of Month;
стоит двоеточие, а не знак равно? Или это просто
опечатка в пособии?
д) var Operation : set of (Plus, Minus, Mult, Divid);
д1) Почему в данном случае происходит объявление
множества в разделе переменных? И почему опять
через : , а не через знак = ?
д2) После set of должен быть прописан тип данных,
которому принадлежат элементы множества. Тогда
в этом случае мне не понятно, какому типу принадлежат
элементы заданного множества?
е) var Param : set of 0..9=[0, 2, 4, 6, 8];
е1) Здесь задано множество целого типа?
е2) Во множество записали элементы 
0, 2, 4, 6, 8 ?
4. В пособии написано, что множества часто используются
как константы. Тогда, определив множество в разделе
const, нужно ли его прописывать в разделе type?
Прошу, пожалуйста, объясните доступным, понятным языком :)    


Ответы

Ответ 1



set — это тип. Можно создавать много переменных такого типа. 3а1 Не множество задается в разделе typе, а тип "множество чисел типа byte". 3a3 Переменные не являются представителями множества, а сами являются множествами, то есть содержат в себе элементы заданного типа. 3б2 type SetChisla = set of 10..20; означает, что в переменную типа SetChisla можно "положить" только числа от 10 до 20. var Index : SetChisla=[12,15,17]; множество Index типа SetChisla, в которое сразу положили числа 12, 15 и 17 3б3 index — это не ключевое слово 3д Тоже самое, Operation — это переменная типа "множество элементов перечислимого типа (Plus, Minus, Mult, Divid)". 3е Тоже самое, Param — переменная типа "множество целых чисел от нуля до девяти", и ей сразу задается значение [0, 2, 4, 6, 8]. 4 Пример: type SetDigit = set of 0..9; (* тип - множество цифр *) (* две константы этого типа - нечетные и четные цифры *) const odd_digits : SetDigit = [1, 3, 5, 7, 9]; even_digits : SetDigit = [0, 2, 4, 6, 8]; odd_digits2 : set of 0..9 = [1, 3, 5, 7, 9]; {тоже самое, что и odd_digits} PS Все разделы (const, var, type) можно чередовать: const minn = 10; maxn = 1000; type vector = array[1..max] of integer; var n, m : integer; const inf = 2147483647; var a : vector;

Ответ 2



да, скорее всего по одному биту, но это Вас тревожить не должно. Это личное дело компилятора, как он там все сделает. нет. Но с помощью перечислямого типа можно указать допустимые элементы для множества. 3 а1) да, можно в разделе type. Но можно и разделе var (в виде a:set of 1..10; а2) а если не объявить, то что будете делать с типом? а3) да. а4) нет. sb - это переменная, которая содержит множество, а не один элемент этого множества. б1) а здесь тип не принципиален. Главное, что бы он был перечисляем для компилятора. б2) var Index : SetChisla=[12,15,17]; здесь производится инициализация переменной-множества, и будет три элемента. б3) ну так решил автор. Насколько я помню, в турбопаскале это не было ключевым словом. А может просто не подумал. в1) а почему нельзя? можно. При этом только внутренние ограничения компилятора могут быть преградой. Как взаимодействуют? как попросите, так и будут. Можно сравнивать на равенство, на то, что одно множество является подмножеством другого, складывать множества. г1) да. г2) Winter, Spring, Summer, Autumn, Vacation, WarmSeason - это переменные множества, которые могут содержать месяца. г3) опечатка. д1) если нужна переменная-множество какого то типа только одна, то можно не объявлять пользовательский тип, а сразу, по месту объявить. Синтаксис правильный. д2) безименного типа. Просто есть некий тип множества без имени, указанные допустимые элементы. е1) не совсем. относитесь к ним как к элементам, а не числам. е2) да. 4) можно по разному определить множество const test:set of 0..9 = [0,2]; и не нужно ничего писать в раздел type:)

Комментариев нет:

Отправить комментарий