- •Глава 6
- •6.1. Понятие структурного типа
- •6.2. Регулярные типы (массивы)
- •6.3. Строковый тип
- •6.4. Комбинированные типы (записи)
- •6.4.1. Определение типа "запись"
- •6.4.2. Записи с вариантами
- •6.4.3. Оператор присоединения
- •6.5. Множественные типы
- •6.6. Файловые типы
- •6.7. Текстовые файлы
- •6.7.1. Определение текстового файла
- •6.7.2. Ввод числовых данных из текстовых файлов
- •6.7.3. Вывод числовых данных в текстовый файл
- •6.8. Ссылочные типы
- •6.8.1. Динамические переменные
- •6.8.2. Линейные списки
- •6.9. Типизированные константы
6.4.3. Оператор присоединения
Упростить обозначения при использовании комбинированного типа можно с помощью оператора присоединения: WITH P1,P2,...Pn DO S , где P1,P2,...Pn - переменные типа "запись", S - оператор. Внутри оператора S указываются только имена полей.
Пример 6.4.2. Данные о студенте содержат фамилию и адрес (улица, дом, квартира) . Задание - в тексте программы . PROGRAM Stadr;
VAR one : RECORD
fam : STRING;
adr : RECORD
ul : STRING[20];
dom : integer;
kv : integer
END
END;
BEGIN
{ Ввод данных о студенте "one" }
Write('Фамилия : '); ReadLn(one.fam);
Write('Улица : '); ReadlLn(one.adr.ul);
Write('Дом : '); ReadLn(one.adr.dom);
Write('Квартира : '); ReadLn(one.adr.kv);
{ Можно и так:
WITH one, adr DO
BEGIN
Write('Фамилия : '); ReadLn(fam);
Write('Улица : '); ReadLn(ul);
Write('Дом : '); ReadLn(dom);
Write('Квартира : '); ReadLn(kv);
END;
}
{А теперь отпечатаем}
WITH one DO
BEGIN
WriteLn('Фамилия : ', fam);
WITH adr DO
BEGIN
WriteLn('Улица : ', ul);
WriteLn('Дом : ', dom);
WriteLn('Квартира : ', kv)
END
END
END.
Задачи
6.4.1. Имеются данные о группе студентов. Необходимо определить: 1) количество девушек 1979 года рождения; 2) количество студентов с фамилией на "И"; 3) фамилию самого молодого студента; 4) фамилию самой молодой девушки.
6.4.2. Имеется набор точек на плоскости, заданных своими коорди-натами. Определить: 1) координаты точки, наиболее близкой к осям x,y. 2) координаты точки, наиболее удаленной от центра координат.
6.4.3. В трехмерном пространстве имеется набор светящихся точек разной яркости и массы. Определить: 1) суммарную массу всех точек; 2) координаты наиболее яркой точки; 3) координаты наиболее тяжелой точки; 4) яркость наиболее удаленной от центра координат; 5) расстояние между самой яркой и самой тяжелой.
6.5. Множественные типы
Множество так же, как и массив, строится из элементов одного базо-вого типа. Особенность множества: оно может содержать любое количество элементов одного базового типа, но все они должны быть различными. Мак-симальный размер множества в каждой реализации различен. В Турбо Пас-кале он равен 256.
Множественный тип задается следующим образом: TYPE typnam = SET OF T ,
где typnam - имя типа "множество"; T - базовый тип.
В языке Турбо Паскаль в качестве базового допускается любой упоря-доченный тип с количеством элементов не более 256, для целого типа - диа-пазон 0..255 .
Множество строится из своих элементов с помощью конструктора. Конструктор - это список элементов множества, заключенный в квадратные скобки. Элементы множества - выражения базового типа.
Примеры конструкторов множества: [1, 3, 11..44] [i+10, i-11] ['A'..'T', '+', '-'] [] . В последнем случае имеем дело с пустым множеством.
Для множеств определены операции:
* - пересечение,
+ - объединение,
- - разность, а также операции отношения:
= - равенство,
<> - неравенство,
- проверка на включение,
IN - проверка элемента на его принадлежность множеству (первый
операнд - базового, второй - множественного типа). Старшинство операций:
(пересечение) - (объединение, разность) - (отношения).
Пример 6.5.1. Вводить целые числа до тех пор, пока по крайней мере по разу будут введены числа из диапазона 0..9. Подсчитать общее количест-во введенных чисел из этого диапазона.
PROGRAM Diap;
VAR a,k : integer;
sint : SET OF 0..9;
BEGIN
sint:=[0..9];
k:=0;
WHILE sint<>[] DO
BEGIN
Write('Число: '); ReadLn(a);
IF a IN [0..9] THEN
BEGIN
sint:=sint-[a];
k:=k+1
END
END;
WriteLn('Количество из диапазона = ', k)
END.
А вот другой вариант программы :
PROGRAM Diap2;
VAR a,k : integer;
sint : SET OF 0..9;
BEGIN
sint:=[];
k:=0;
REPEAT
Write('Число : '); ReadLn(a);
IF a IN [0..9] THEN
BEGIN
sint:=sint+[a];
k:=k+1
END
UNTIL sint=[0..9];
WriteLn('Количество из диапазона = ', k)
END.
Пример 6.5.2. Ввести две строки символов. Выяснить, встречается ли каждый символ первой строки хотя бы один раз во второй строке. PROGRAM Every;
VAR a,b : STRING;
sa,sb : SET OF char;
k : integer;
BEGIN
Write('Строка 1:'); ReadLn(a);
Write('Строка 2:'); ReadLn(b);
sa:=[];
FOR k:=1 TO Length(a) DO
sa:=sa+[a[k]];
sb:=[];
FOR k:=1 TO Length(b) DO
sb:=sb+[b[k]];
IF sa <= sb { или sa*sb=sa }
THEN WriteLn('Да, встречаетя')
ELSE WriteLn('Нет, не встречается')
END.
Задачи
6.5.1. Отпечатать по одному разу все символы строки.
6.5.2. Имеется массив чисел, значения которых лежат в диапазоне 0..250. Определить, сколько среди них различных.
6.5.3. Имеется две строки символов. Определить те символы, которые присутствуют в обеих строках одновременно.