- •Часть II Оглавление
- •Строки. Процедуры и функции для работы со строками.
- •Множества. Операции над множествами.
- •Подпрограммы для работы со всеми типами файлов
- •Текстовые файлы
- •Бестиповые файлы
- •Типизированные файлы
- •Прямой доступ
- •Оператор with.
- •Вариантная запись.
- •Динамические структуры данных
- •Процедуры и функции. Рекурсия. Модули.
- •Основы объектно-ориентированного программирования
- •Графика
Множества. Операции над множествами.
Множество является одним из фундаментальных математических понятий. К операциям и отношениям с множествами сводится большинство математических моделей.
Объявление множеств
В языке программирования Free Pascal существует понятие множества, под которым понимается некоторый набор элементов, одно и того же базового типа. Базовый тип определяет перечень всех элементов, которые вообще могут содержаться в данном множестве.
Размер множества в Free Pascal всегда ограничен некоторым предельно допустимым количеством элементов. Во множествах допускаются только такие элементы, порядковые значения которых не выходят за границы 0..255. Отрицательные элементы множеств в Free Pascal не допускаются. Если же необходимо множество целочисленных объектов, то базовый тип должен быть объявлен, как диапазон типа byte. Для множеств, содержащих символы, подобных затруднений нет, т.к. базовый тип для них является char.
В Free Pascal для обозначения множеств используются квадратные скобки. Порядок элементов во множестве не имеет значения, кроме того, многократное повторение элементов не меняет множество. Например, множества [2, 4, 8] и [4, 8, 2, 2, 8, 8, 8] равны.
Элементы множества не упорядочены и не имеют индексов.
Объявление переменной типа множество имеет следующий вид:
var
переменная: set of тип;
Например:
var
ch: set of char;
Переменной ch - множество с базовым типом char.
Мы можем начала объявить тип множества, а потом использовать его для объявления переменных:
type
chset = set of char;
var
ch1, ch2: chset;
В качестве базового типа множества мы можем использовать тип перечисления, или некоторый его диапазон:
type
week = (Mon, Tue, Wed, Thu, Fri, Sat, Sun);
var
day: set of week;
letter1: set of 'А'..'Я';
Множество может быть объявлено типизированной константой, для этого в описании после знака равенства следует указать конструктор множества. Например:
const letter2: set of ['а'..'я'] = ['а', 'е', 'и', 'о', 'у', 'ы', 'у', 'ю', 'я'];
Множество letter2 – строчные, гласные буквы русского алфавита.
Построение множества
Чтобы во множестве появились элементы, необходимо выполнить оператор присваивания, в левой части которого стоит имя переменной-множества, а в правой — конструктор множества или некоторое выражение над множествами.
Конструктор множества — это заключенный в квадратные скобки перечень элементов, разделенных запятыми. В качестве элементов могут использоваться диапазоны значений:
begin
day := [Mon, Thu, Fri];
letter := ['E', 'R'..'Z']
end.
Порядок элементов множества, при задании диапазона важен.
Множество, в котором нет элементов, называется пустым. Например:
day := [ ];
Конструируя множества, можно использовать и переменные, текущие значения которых попадают в диапазон базового типа множества. Так, если ch1 и ch2 имеют тип char, то допустима следующая последовательность операторов:
ch1 := 'А';
ch2 := 'Б';
chs := [ch1, ch2, 'В'];
В результате получится множество ['А', 'Б', 'В'].
Действия над множествами
Над множествами выполнимы следующие операции: объединение (+), пересечение (*), разность (-) и симметрическая разность (><).
Объединение двух множеств A и B (A + B) – это новое множество, состоящее из элементов, принадлежащих множеству A или B, либо тому и другому одновременно.
var
ch1, ch2, ch3: set of byte;
begin
ch1:= [1, 2, 5];
ch2:= [2, 5, 7];
ch3:= ch1 + ch2 + [3, 5]; // ch3 = [1, 2, 3, 5, 7].
end.
Пересечение двух множеств A и B (A * B) – это множество, состоящее из элементов, одновременно принадлежащих множествам A и B.
ch3 := ch1 * ch2; // ch3 = [2, 5].
Разность двух множеств A и B (A – B) – это новое множество, состоящее из элементов множества A, не вошедших в множество B.
ch3 := ch1 – ch2; // ch3 = [1].
Симметрическая разность двух множеств A и B (A >< B) – это новое множество, состоящее из таких элементов, которые принадлежат либо только множеству А, либо только множеству В
ch3:= ch1 >< ch2; // ch3 = [1, 7].
Для вставки и удаления элементов множества в Pascal введены две процедуры:
include (имя множества, элемент)
exclude (имя множества, элемент)
Первая из них позволяет выполнить добавление одного элемента в указанное множество, а вторая удалить. Например:
include (ch1, 3); // ch1 = [1, 2, 3, 5].
exclude (ch2, 7); // ch2 = [2, 5].
Над множествами можно выполнять операции сравнения: (=, <>, >=, <=).
Два множества A и B равны (A = B), если каждый элемент множества A является элементом множества B и наоборот.
Два множества A и B не равны (A <> B), если они отличаются, хотя бы одним элементом.
Множество A является подмножеством множества B (A <= B, или B >= A), если каждый элемент из A присутствует в B.
Операция in позволяет сделать вывод, принадлежит ли данный элемент некоторому множеству.
Все операции сравнения множеств, а также операция in возвращают логическое значение true или false. Например:
X:=5
(x in ch1)=true, т.к. значение x является элементом множества ch1.
Для организации ввода-вывода элементов множества следует использовать вспомогательные переменные. Так же можно использовать множества, как элементы типизированных файлов.
Например.
var bs: set of byte;
i:byte;
begin
bs:=[3,2,6];
for i:=0 to 255 do
if i in bs then writeln(i);
readln;
end.
В сложных выражениях над множествами операции имеют следующие приоритеты:
*;
+, -, ><;
=, <>, <=, >=, in.
Задача.
Написать программу, которая в зависимости от введенного года, добавляет к нему правильное окончание. Например: 1 год, но 10 лет или 3 года.
Алгоритм решения задачи:
Слово "год" добавляется ко всем числам, последняя (или единственная) цифра которых равна 1.
"Года" - для оканчивающихся на 2, 3, 4. Во всех остальных случаях используется слово "лет".
Числа 11, 12, 13, 14 (или имеющие такой остаток от деления на 100) имеют "окончание" лет.
Реализация программы на языке Free Pascal.
var let, let11, god, goda: set of byte;
age, n: word;
begin
let:= [0,5,6,7,8,9];
let11:= [11,12,13,14];
god:= [1];
goda:= [2,3,4];
writeln('Введите количество лет: ');
readln(age);
if (age in let11) or (age mod 100 in let11) then
writeln(age, ' лет')
else
begin
n:= age mod 10;
if n in let then
writeln(age, ' лет')
else
if n in god then
writeln(age, ' год')
else
writeln(age, ' года')
end;
readln;
end.
Задания для самостоятельной работы:
Даны 2 символьных множества. Найти их пересечение, объединение и разность.
Дана строка.
Определить количество гласных и согласных букв.
Удалить все повторяющиеся символы.
*Вывести на экран те буквы, которые встречаются не менее 3-х раз.
Дана строка. Проверить ее на наличие недопустимых символов. В качестве первого символа допустимы только заглавные буквы. Остальные символы могут быть буквами, цифрами и знаком подчеркивания.
Дано целое число k. Вывести в убывающем порядке все цифры, которые используются в данном числе.
Компьютер генерирует 3 случайных числа в диапазоне от 1 до 5 включительно. Человек пытается их угадать. Программа выводит угаданные и не угаданные числа из тех, что сгенерировала программа, а также ошибочные числа пользователя.
Файлы
В языке программирования Free Pascal, предусмотрены инструменты для сохранения информации на внешних носителях, а также ее извлечения (чтения) оттуда.
Данные, хранящиеся на внешних устройствах, «организовываются в виде файлов». Под файлом понимается область памяти на внешнем запоминающем устройстве, содержащая определенную информацию. В эту конкретную область памяти можно помещать данные (операции ввода, записи), так и извлекать их оттуда (операции вывода, чтения).
В языке программирования Free Pascal для работы с данными, хранящимися в файлах, должны быть определены переменные файлового типа, через которые далее обеспечивается связь между файлом на диске и программой.
C точки зрения программиста все файлы можно разделить на три класса:
•типизированные;
•бестиповые;
•текстовые.
В программе файловые переменные задаются следующим образом:
var
переменная 1: text; // Текстовый файл
переменная 2: file; // Бестиповый файл
переменная 3: file of тип; // Типизированный файл
Типизированный файл также называется компонентным, причем компоненты могут быть любого типа, кроме файлового. Любой файл, в отличие от массива и записи, может содержать неограниченное количество элементов.
Чтобы не путать файлы в программе и файлы на диске, переменные файлового типа называют логическими файлами, а реальные устройства и файлы на диске - физическими файлами.
Для организации ввода-вывода в программе необходимо выполнить следующие действия:
объявить файловую переменную;
связать ее с физическим файлом;
открыть файл для чтения и/или записи;
выполнить операции ввода-вывода;
закрыть файл.
