
- •Часть 1
- •1. With elem 50
- •2.1. Если поступившая запись предшествует корневой, идти в левое 98
- •2.2. Иначе – в правое поддерево. 98
- •Введение Основные этапы решения задач на эвм
- •Языки программирования
- •Трансляторы
- •1. Общие сведения о языке паскаль
- •1.1. Алфавит языка. Идентификаторы и зарезервированные слова
- •2. Данные в паскале. Простые типы данных
- •2.1. Целочисленный тип
- •2.2. Вещественный тип
- •2.3. Логический тип
- •2.4. Символьный тип
- •2.5. Перечисляемый тип
- •Var m1, m2: metall;
- •2.6. Ограниченный (диапазонный) тип данных
- •Над значениями ограниченного типа допустимы те же операции, что и над значениями базового типа, используемыми при задании в разделе определения типов. Если, к примеру, задано определение:
- •Var y:bukva;
- •3. Операции и выражения
- •2.1. Целочисленный тип
- •3.2. Арифметические выражения и операции
- •3.3. Логические операции и выражения
- •3.4. Операции отношения
- •3.5. Стандартные функции
- •3.6. Приоритеты операций
- •4. Структура программы
- •4.1. Раздел определения констант
- •4.2. Раздел определения типов
- •4.3. Раздел описания переменных
- •V: boolen;
- •4.4. Раздел описания процедур и функций
- •4.5. Раздел операторов
- •4.6. Директивы компилятора и управляющие символы
- •5. Операторы языка паскаль
- •5.1. Оператор присваивания
- •5.2. Оператор вывода информации
- •5.3. Оператор ввода информации
- •5.4. Составной оператор
- •5.5. Условный оператор
- •5.6. Оператор варианта case
- •5.7. Операторы цикла
- •5.7.1. Оператор цикла по счетчику (цикл с параметром )
- •Иденти-фикатор перемен-ной
- •I,n:integer; {I -пар-р цикла, n - его кон.Занч.}
- •X,s,p;integer;
- •5.7.2. Оператор цикла с предусловием
- •Пример составления таблицы переменных
- •Var a,Summa:real;
- •Inc (Summa, a);
- •5.7.3. Оператор цикла с постусловием
- •X,Summa:real;
- •6. Структурированные типы данных
- •6.1. Массивы
- •I,ne:integer;
- •6.1.1. Сортировка массивов
- •Vr:char;
- •Vr : char;
- •6.2. Строки
- •6.3. Множества
- •I : byte;
- •6.4. Записи
- •With elem
- •7. Типизированные константы
- •7.1. Типизированные константы скалярных типов
- •7.2. Типизированные константы - массивы и строки
- •7.3. Типизированные константы – множества
- •Var a: hvor;
- •I, j, k, simp: byte;
- •7.4. Типизированные константы – записи
- •8. Файлы
- •8.1. Типизированные файлы
- •8.2. Текстовые файлы
- •Var f : text;
- •9. Подпрограммы
- •9.1. Процедуры и функции
- •9.2. Процедуры и функции пользователя
- •Var p: real;
- •Var p: real;
- •9.3. Параметры подпрограмм
- •Var X: real; m: integer;
- •Var I : integer;
- •10. Рекурсии
- •10.1. Рекурсивные алгоритмы и определения
- •10.2. Рекурсивные процедуры и функции
- •Var f : longint ;
- •Var a, y, z : real;
- •10.3. Виды рекурсивных процедур
- •If условие
- •If условие
- •If условие then Recur ; then begin
- •Var k : integer;
- •Var c : char;
- •Var c : char;
- •11. Графика в паскале
- •11.1. Основы работы в графическом режиме
- •11.1.1. Аппаратная и программная поддержка графики
- •11.1.2. Запуск графической системы
- •Var Driver, Mode: integer;
- •Init Graph (Driver, Mode, Path);
- •11.1.3. Обработка ошибок
- •11.1.4. Закрытие видеорежима
- •11.2. Система координат дисплея
- •11.3. Экран и окно
- •11.4. Установка цвета, заполнения и палитры
- •11.5. Построение простейших геометрических образов
- •11.6. Работа с текстом OutText (X,y:integer; txt:string) – вывести строку txt с текущего положения указателя.
- •11.7. Вывод числовых значений
- •12. Программные модули
- •12.1. Структура программного модуля
- •Interface –интерфейсные раздел («видимая» часть модуля)
- •Implementation – раздел реализации («черный ящик»)
- •Interface
- •Var X:integer;
- •Implementation
- •Interface
- •X: integer;
- •Implementation
- •12.3. Ссылки на модули
- •Unit hlp _ sr;
- •Xa, ya, xb, yb, xc, yc: integer;
- •13. Динамическая память
- •Var a1: array[1..300,1..300] of integer.
- •13.1. Адресация памяти
- •13.2. Указатели
- •13.2.1. Операции с указателями
- •13.2.2. Нетипизированные указатели
- •X: integer;
- •13.2.3. Типизированные указатели
- •13.3. Создание и уничтожение динамических переменных
- •X: real;
- •13.4. Администратор кучи
- •Heapend содержит адрес конца кучи
- •13.5. Примеры использования указателей
- •Объявление
- •Var Pr:preco;
- •14. Использование указателей для организации связанных динамических структур
- •14.1. Списки
- •14.1.1. Алгоритмы работы со списками
- •14.2. Организация стека в динамической памяти
- •Var p, st :pstack; {st - указатель на вершину стека}
- •I: integer;
- •14.3. Очереди
- •14.4. Деревья
- •14.4.1. Организация деревьев в динамической памяти
- •14.4.2. Построение полного двоичного дерева
- •I,j :I nteger; I - значение инф. Поля очередной
- •Var p,h:pstack;
- •Inc(I); {создаем новый узел – вершину}
- •Inc(j); {переместим указатель t и переход
- •14.4.3. Алгоритмы работы с двоичными упорядоченными деревьями (деревьями поиска)
- •14.4.4. Рекурсивные алгоритмы работы с двоичными деревьями
- •I, X : integer;
- •Литература
- •Часть 1. Язык программирования Паскаль
6.3. Множества
Наряду с числом множество является фундаментальным математическим понятием. К операциям и отношениям со множествами сводится большинство математических моделей. Паскаль – один из немногих языков, который имеет встроенные средства для работы со множествами. Давайте посмотрим, как «переводятся» на Паскаль некоторые понятия теории множеств.
В математике рассматривают конечные и бесконечные множества, состоящие из произвольных элементов. В Паскале множества всегда конечные, причем состоят не более чем из 256 элементов. Все элементы множества должны быть одного порядкового типа (например, Integer, Word, Longint).
Пусть, например, необходимо задать множества целых чисел:
Обозначения в математике Обозначения в Паскале
{1, 2, 3} [1, 2, 3]
0 []
{1, 2,…N} [1…N]
В Паскале множество может быть задано выражениями, например
[2+x, 8-3].
Внутреннее представление множеств. Все значения множества представляются в памяти последовательностями битов одинаковой длины. За каждое значение базового типа «отвечает» 1 бит. Если множество содержит некоторый элемент, в соответствующем бите хранится 1, если не содержит – хранится 0.
Например:
var x, y : set of 1..10;
Внутреннее представление: x:=[] 0000000000
x: =[2,3,9] 0110000010
y: =[2..7] 0111111000
Операции над множествами сводятся к поразрядным логическим операциям над последовательностями битов. Например, объединение множеств выполняется путем поразрядного логического сложения битов. Объединение множеств x y
x : 0110000010
y: 0111111000
x y : 0111111010
Поскольку поразрядные операции входят в набор команд процессора ЭВМ, они выполняются очень быстро.
Множества в Паскале – это наборы однотипных, логически связанных между собой объектов, которые рассматриваются как единое целое. Причем характер связи подразумевается программистом и никак не контролируется Паскалем. Например, множество согласованных букв кириллицы; множество простых чисел от 1 до 100.
Каждый объект в множестве называется элементом множества. Все элементы множества должны принадлежать к одному из скалярных типов. Этот тип называется базовым типом. Базовый тип задается диапазоном или перечислением. Если множество не имеет элементов, оно называется пустым ([]).
Для изображения множеств используют квадратные скобки, в которые заключается перечень элементов.
Например: type
color=(white, red, black);
Number=set of 1..31; {явное описание}
Var
col: set of color; {неявное описание}
n1, n2: number;
etter: set of char; {неявное описание}
Попытка присвоить недопустимый символ вызовет прерывание. Контроль диапазонов можно установить опцией компилятора {$R+}.
Операции над множествами. В Паскале разрешены следующие операции над множествами: сравнения (=, , , ), (and), (or), разность множеств (-), включение в множество – in. Рассмотрим их назначение.
"=": два множества равны тогда и только тогда, когда они имеют одинаковые элементы. Порядок следования роли не играет.
1) A: set of 1, 2, 3, 4 B: set of 1, 3, 2, 4 A = B - true
2) A: set of 'a', 'b', 'c' B: set of 'a', 'b' A = B - false
« »: множества не равны, если они отличаются по значению хотя бы одного элемента.
В случае 1) A B – false;
в случае 2) A B – true.
«
»
используется для определения принадлежности
множеств. A
B,
если все элементы B
содержатся в множестве A.
«» – аналогично.
A: =1, 2, 3, 4 B: =2, 3, 4 A B true В А
B A true
«in» используется для проверки принадлежности какого-либо значения множеству. Пусть x='a', y='z', B – множество символов 'a'..'n'. Тогда x in B – true, y in B – false.
О
бычно
операция in
используется в условном операторе.
Например,
вместо:
if(a=1) or (a=5) or (a=7) or (a=11) or (a=15) then…,
можно записать: if a in [1,5,7,11,15] then…,
т. е. «in» позволяет более эффективно производить сложные проверки условий. При этом множество не обязательно предварительно описывать в разделе описаний.
Если необходимо проверить, не принадлежит ли n множеству A, можно записать: Not (n in A) (неверно: n Not in A).
Объединение множеств : «+». Объединением двух множеств является третье множество, содержащее элементы обоих множеств (выполняется путем поразрядного логического сложения).
Пусть A:=[1,2,3], B:=[4,5], C:=A+B, тогда C=[1, 2, 3, 4, 5].
Пересечение множеств : «».
Пусть A:=[1,2,3], B:=[1,4,2,5], тогда AB=[1, 2].
Пусть A:= ['A'..'Z'], B:= ['B'..'Y'], тогда AB=['B'..'Y'],
т. е. третье множество, которое содержит элементы, входящие одновременно в оба множества.
Разность множеств «-» (\- в математике) – третье множество, которое содержит элементы первого множества, не входящие во второе:
Пусть A := [1,2,3,4], B:= [3,4,1], тогда A-B=[2].
Пусть A := [x1,x2,x3,x4], B:= [x2,x3], тогда A-B=[x1, x4].
Преимущества использования типа set: значительно упрощаются сложные условия в операторе if, увеличивается степень наглядности, экономятся память, время компиляции и выполнения.
Отрицательные стороны: отсутствуют средства ввода-вывода элементов множеств.
П р и м е р ы
1. В считанном с клавиатуры тексте из строчных латинских букв удалить все гласные буквы, а согласные заменить на прописные. Признак конца ввода – точка. Например: pointer - > PNTR.
program Sets;
type
let='a'..'z';
var
gl : set of let;
tx : string;