- •Лекции (черновики).
- •Интегрированная среда Turbo Pascal (Borland Pascal)
- •Главное меню Turbo Pascal
- •2. Введение в язык Паскаль. Структура программы на Паскале.
- •3. Вывод сообщений на экран.
- •4. Этапы создания программы.
- •Лекция №4 Переменные, типы. Стандартные типы. Операции. Присваивание.
- •1. Идентификаторы.
- •2. Метки.
- •3. Числа.
- •4. Строки.
- •5. Комментарии.
- •6. Описание констант.
- •7. Типы.
- •8. Пользовательские типы.
- •9. Операции.
- •10. Описание переменных. …
- •11. Оператор присваивания. Операторы языка Паскаль.
- •1. Оператор присваивания.
- •2. Оператор процедуры.
- •3. Оператор перехода.
- •4. Условный оператор.
- •If Выражение then Оператор1 else Оператор2;
- •If Выражение then Оператор;
- •5. Составной оператор.
- •6. Оператор выбора.
- •7. Оператор цикла с предусловием.
- •8. Оператор цикла с постусловием.
- •9. Оператор цикла с параметром (со счётчиком).
- •Массивы.
- •Работа со строками.
- •Работа с файлами.
- •Подпрограммы.
- •Процедуры модуля Graph
- •Функции модуля Graph
- •Вывод точки
- •Цветовая шкала
- •Вывод линии
- •Построение прямоугольников
- •Стандартные стили заполнения
- •Вывод текста
- •Вывод численных значений
- •Множества.
- •Указатели
- •Динамические переменные
- •Указатели на процедуры и функции
- •Динамическая память
- •Адреса и указатели
- •Оъбявление указателей
- •Выделение и освобождение динамической память
- •Использование указателей
- •Пример 6.1
- •Процедуры и функции для работы с динамической памятью
- •Администратор кучи
Множества.
Тип "множество" является одним из сложных типов данных системы
программирования Turbo Pascal 7.0.
Тип "множество" является множеством всевозможных сочетаний объек-
тов исходного порядкового типа. Число элементов исходного множества в
Turbo Pascal не должно превышать 256. Все значения базового типа, об-
разующие конкретные значения множественного типа, должны быть различ-
ны. Порядок "расположения" элементов в множестве никак не фиксируется.
Это соответствует принятой в математике трактовке множества как бес-
повторной неупорядоченной совокупности объектов.
Описание (декларация) типа множество.
-------------------------------------
Для задания типа "множество" следет использовать служебные слова
set и of, а затем указать элементы этого множества, как правило, в ви-
де перечисления или диапазона, например:
Type
Alfa = set of 'A'..'Z';
Ten = set of 0..9;
Count = set of (Plus, Minus);
Введя тип "множество", можно задать переменные этого типа.
Var
CAlfa: Alfa;
U233: Ten;
Так же как и для других структурированных типов тип множество
можно задать непостредственно при задании переменных.
Var
CAlfa: set of 'A'..'Z'
Operation: set of (Plus, Minus);
U233: set of 0..9;
C: set of char;
Присвоение для переменных типа множество.
-----------------------------------------
Множеству можно в программе присвоить то или иное значение. Обыч-
но значение задаётся с помощью так называемого конструктора множества.
Конструктор задаёт множество элементов с помощью перечисления в квад-
ратных скобках выражений, значения которого дают элементы этого мно-
жества. Допустимо использовать диапазоны элементов.
CAlfa := ['A', 'B', 'C'];
C := [chr(0)..chr(31), 'D', 'F'];
В каждое множество включается и т.н. пустое множество [], не со-
держащее никаких элементов. Конструктор множества можно использовать и
непосредственно в операциях над множествами.
Операции над множествами.
---------------------------
Так же как и в математике в системе программирования Turbo Pascal
7.0 над множествами применимы следующие операции:
+ - объединение множеств. C := A+B;
------------------------------------
Каждый элемент множества C является элементом либо множества A,
либо множества В.
+---+ +---+ A+---+
¦ААА¦ + ¦ВВВ¦ = ¦С+-+-+B
¦ААА¦ ¦ВВВ¦ ¦С¦С¦С¦
+---+ +---+ +-+-+С¦
+---+
- - разность множеств. C := A-B;
---------------------------------
Каждый элемент множества C является элементом множества A, но не
является элементом множества В.
+---+ +---+ A+---+
¦ААА¦ - ¦ВВВ¦ = ¦С+-+-+B
¦ААА¦ ¦ВВВ¦ ¦С¦ ¦ ¦
+---+ +---+ +-+-+ ¦
+---+
* - пересечение множеств. C := A*B;
-----------------------------------
Каждый элемент множества C является элементом множества A и B од-
новременно.
+---+ +---+ A+---+
¦ААА¦ * ¦ВВВ¦ = ¦ +-+-+B
¦ААА¦ ¦ВВВ¦ ¦ ¦С¦ ¦
+---+ +---+ +-+-+ ¦
+---+
= - проверка эквивалентности двух множеств. A = B;
---------------------------------------------------
Множество A равно множеству B, если каждый элемент множества A
является элементом множества B, и наоборот, каждый элемент множества B
является элементом множества A. Результат операции логическая величи-
на.
<> - проверка неэквивалентности двух множеств. A <> B;
-------------------------------------------------------
Множество A не равно множеству B, если множество A содержит хотя
бы один элемент, не являющийся элементом множества B, или (и) наобо-
рот, множество B содержит хотя бы один элемент, не являющийся элемен-
том множества A. Результат операции логическая величина.
<= - проверка, является ли левое множество подмножетвом правого.
----------------------------------------------------------------
A <= B; Множество A является подмножеством множества B, если все
элементы множества A являются элементами множества B. Результат опера-
ции логическая величина.
>= - проверка, является ли правое множество подмножеством левого.
-----------------------------------------------------------------
A >= B; Действие операции аналогично действию предыдущей опера-
ции. Результат операции логическая величина.
in - проверка, входит ли элемент (слева) в множество (справа).
--------------------------------------------------------------
C in B; Результат операции логическая величина.
Примеры программ.
------------------
ПРИМЕР 1.
---------
Из множества целых чисел 1..20 выделить: множество чисел, деля-
щихся на 6 без остатка; множество чисел делящихся на 2 или на 3 без
остатка. Вывести содержимое этих множеств на экран.
Program a6_23;
Var
N6 : set of integer; {множество чисел, делящихся на 6}
N23 : set of integer; {множество чисел, делящихся на 2 и 3}
k: integer; {параметр цикла с параметром}
Begin
N6 := []; {"обнуление" множества N6}
N23 : = []; {"обнуление" множества N23}
{ формирование множеств
---------------------}
For k:=1 to 20 do begin
if k mod 6 = 0 then N6 := N6 + [k];
if (k mod 2 = 0) or (k mod 3 = 0) then N23 := N23 + [k];
end;
{ вывод содержимого множеств
--------------------------}
Writeln(' На 6 без остатка делятся числа: ');
for k:=1 to 20 do
if k in N6 then write(k:3);
Writeln;
Writeln(' На 2 или 3 без остатка делятся числа: ');
for k:=1 to 20 do
if k in N6 then write(k:3);
Readln; { пауза }
End.
ПРИМЕР 2.
---------
Ввести строку символов, состоящую из латинских букв цифр и пробе-
лов. Осуществить проверку правильности введённых символов.
Program Verify_string;
Var
s: string;
m: set of char;
k: integer;
Done: boolean;
Begin
{ формирование контрольного множества символов
-------------------------------------------- }
m := [ '0'..'9', 'A'..'Z', 'a'..'z', ' '];
{ ввод строки
----------- }
Writeln(' Введите строку: ');
Readln(s);
{ проверка правильности строки
---------------------------- }
done := true;
for k:=1 to Length(s) do
if not (s[k] in m) then done := false;
{ вывод результата
---------------- }
if done then
writeln('Правильная строка. ');
else
writeln('Неправильная строка. ');
Readln; { пауза }
End.
Записи.
Запись представляет собой совокупность ограниченного числа логически связанных компонент, принадлежащих к разным типам. Компоненты записи называются полями, каждое из которых определяется именем. Поле записи содержит имя поля, вслед за которым через двоеточие указывается тип этого поля. Поля записи могут относиться к любому типу, допустимому в языке Паскаль, за исключением файлового типа.
Описание записи в языке Паскаль осуществляется с помощью служебного слова record, вслед за которым описываются компоненты записи. Завершается описание записи служебным словом end.
Например, телефонный справочник содержит фамилии и номера телефонов, поэтому отдельную строку в таком справочнике удобно представить в виде следующей записи:
type TRec = Record
FIO: String[20];
TEL: String[7]
end;
var rec: TRec;
Описание записей возможно и без использования имени типа, например:
var rec: Record
FIO: String[20];
TEL: String[7]
end;
Обращение к записи в целом допускается только в операторах присваивания, где слева и справа от знака присваивания используются имена записей одинакового типа. Во всех остальных случаях оперируют отдельными полями записей. Чтобы обратиться к отдельной компоненте записи, необходимо задать имя записи и через точку указать имя нужного поля, например:
rec.FIO, rec.TEL
Такое имя называется составным. Компонентой записи может быть также запись, в таком случае составное имя будет содержать не два, а большее количество имен.
Обращение к компонентам записей можно упростить, если воспользоваться оператором присоединения with.
Он позволяет заменить составные имена, характеризующие каждое поле, просто на имена полей, а имя записи определить в операторе присоединения:
with rec do оператор;
Здесь rec - имя записи, оператор - оператор, простой или составной. Оператор представляет собой область действия оператора присоединения, в пределах которой можно не использовать составные имена. Например для нашего случая:
with rec do begin
FIO:='Иванов А.А.';
TEL:='2223322';
end;
Такая алгоритмическая конструкция полностью идентична следующей:
rec.FIO:='Иванов А.А.';
rec.TEL:='2223322';
Инициализация записей может производиться с помощью типизированных констант:
type
RecType = Record
x,y: Word;
ch: Char;
dim: Array[1..3] of Byte
end;
const
Rec: RecType = ( x: 127;
y: 255;
ch: 'A';
dim: (2, 4, 8) );
Подробнее..
Особой разновидностью записей являются записи с вариантами, которые объявляются с использованием зарезервированного слова case. С помощью записей с вариантами вы можете одновременно сохранять различные структуры данных, которые имеют большую общую часть, одинаковую во все структурах, и некоторые небольшие отличающиеся части.
Например, сконструируем запись, в которой мы будем хранить данные о некоторой геометрической фигуре (отрезок, треугольник, окружность).
type
TFigure = record
type_of_figure: string[10];
color_of_figure: byte;
...
case integer of
1: (x1,y1,x2,y2: integer);
2: (a1,a2,b1,b2,c1,c2: integer);
3: (x,y: integer; radius: word);
end;
var figure: TFigure;
Таким образом, в переменной figure мы можем хранить данные как об отрезке, так и о треугольнике или окружности. Надо лишь в зависимости от типа фигуры обращаться к соответствующим полям записи.
Заметим, что индивидуальные поля для каждого из типов фигур занимают тем не менее одно адресное пространство памяти, а это означает, что одновременное их использование невозможно.
В любой записи может быть только одна вариантная часть. После окончания вариантной части в записи не могут появляться никакие другие поля. Имена полей должны быть уникальными в пределах той записи, где они объявлены.
Динамическая память
В IBM PC-совместимых компьютерах память условно разделена на сегменты. Компилятор формирует сегменты кода, данных и стека, а остальная доступная программе память называется динамической (хипом).
Динамические переменные создаются в хипе во время выполнения программы. Обращение к ним осуществляется через указатели. С помощью этих переменных можно обрабатывать данные, объем которых до начала выполнения программы не известен. Память под такие данные выделяется блоками, которые связываются друг с другом. Этот способ хранения данных называется динамическими структурами.