- •Глава 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
Структурные
типы
данных
6.1. Понятие структурного типа
Помимо простых типов, в языке Паскаль существуют структурные типы данных. Как структурные операторы строятся из других операторов, так и структурные типы данных строятся из других типов. Поэтому можно говорить как о компонентах структурных типов, так и о методах образования этих типов.
Существует четыре структурных типа данных:
- массив, или регулярный тип;
- запись, или комбинированный тип;
- множество;
- файл.
В программах структурный тип вводится с помощью описания типа, например: TYPE tm = array[1..10] OF real; tr = RECORD x,y : real; k : integer END .
Здесь введено два структурных типа:
tm - массив,
tr - запись. Теперь переменные соответствующих типов могут быть описаны следующим образом: VAR a,bor : tm; kor : tr . Впрочем, возможно и такое описание:
VAR a,bor : ARRAY[1..10] OF real .
Для структурных типов допустимо использование оператора присва-ивания (за исключением типа FILE ), например: Bor := a . При этом происходит покомпонентное присваивание значений переменной a переменной bor.
6.2. Регулярные типы (массивы)
Массив состоит из фиксированного числа компонент (элементов). Все компоненты - обязательно одного типа, называемого базовым.
Тип "массив" определяется следующим образом:
TYPE typnam = ARRAY [T1] OF T2 ,
где typnam - имя нового типа;
T1 - тип индекса (ограниченный или перечислимый);
T2 - базовый тип (любой).
Доступ к любому элементу массива осуществляется по имени переменной-массив и индексу. Индексом может быть любое выражение типа T1 (типа индекса). Примеры описаний:
CONST n=20;
VAR mem : ARRAY[0..20] OF real;
ch : ARRAY[-10..n] OF char;
b : ARRAY['c'..'u'] OF Boolean;
zom : ARRAY[FALSE..TRUE] OF integer;
{ или zom : ARRAY[Boolean] OF integer; }
k : integer;
Примеры присваиваний: mem[6] := 2.5; k : =zom[5<7]; ch[5] : ='k'; b['r'] : = 4<=6 .
Как уже отмечалось, в качестве элементов массива могут быть данные любых, в том числе и структурных типов. Если элементами массива являются массивы, то говорят о многомерных массивах. Например:
VAR a : ARRAY[1..10] OF ARRAY[0..5] OF real;
.......
b:=a[5][2] . Для многомерных массивов возможна сокращенная форма записи:
VAR a : ARRAY[1..10,0..5] OF real;
.....
b : =a[5,2] . Заметим: что в качестве разделителя индексов используется запятая.
Количество индексов определяет размерность массива. Одномерные массивы иногда называют векторами, двумерные - матрицами.
Пример 6.2.1. Ввести одномерный массив чисел. Вычислить сумму всех элементов массива.
PROGRAM Sumarr;
CONST n = 20;
VAR a : ARRAY[1..n] OF real;
k : integer;
sum : real;
BEGIN
FOR k:=1 TO n DO
BEGIN
Write('a[', k:2, ']=? ');
ReadLn(a[k])
END;
sum:=0;
FOR k:=1 TO n DO sum:=sum+a[k];
WriteLn('Сумма =',sum)
END.
Пример 6.2.2. В одномерном массиве вещественных чисел определить наибольший элемент. PROGRAM Maxarr;
CONST n = 10;
VAR k : integer;
max : real;
arr : ARRAY[1..n] OF real;
BEGIN
Write('Массив из', n:3, ' чисел = ? ');
FOR k:=1 TO n DO Read(arr[k]);
max:=arr[1];
FOR k:=2 TO n DO
IF arr[k]>max THEN max:=arr[k];
WriteLn('Макс.элемент =', max)
END.
Обратим внимание на то, что по сравнению с предыдущим примером здесь несколько иначе вводится массив, а именно: на одно единственное приглашение через разделитель задается нужное количество элементов.
Пример 6.2.3. Имеется двумерный массив целых чисел. Построить одномерный массив, записав в него только четные отрицательные элементы исходного массива.
PROGRAM Mas2;
CONST m=6; n=4; kk=m*n ;
VAR i,j,k : integer;
a : ARRAY[1..m,1..n] OF integer;
b : ARRAY[1..kk] OF integer;
BEGIN
FOR i:=1 TO m DO
BEGIN
Write('Строка', i:2, ' = ');
FOR j:=1 TO n DO Read(a[i,j])
END;
k:=0;
FOR i:=1 TO m DO
FOR j:=1 TO n DO
IF (a[i,j]<0) AND NOT Odd(a[i,j])
THEN BEGIN
k:=k+1;
b[k]:=a[i,j]
END;
IF k=0 THEN Write('Выходной массив пуст')
ELSE FOR i:=1 TO k DO Write(b[i]:7);
WriteLn
END.
ввод массива
(a)
k := 0
для i от 1 до m
для j от 1 до
n
(ai,j<0)и(ai,j
четное)?
да
k := k+1
bk
:= ai,j
k = 0 ?
да
нет
сообщение :
для i от 1 до k
"выходной
массив
пуст"
печать bk
Рис.6.1. Схема
к примеру 6.2.3
Пример 6.2.4.В двумерном массиве чисел каждую строку (начиная со второй), содержащую хотя бы один отрицательный элемент, заменить первой строкой.
ввод массива
(a)
для i от 2 до m
j := 0
j := j+1
otr := (ai)j<0
до otr или (j=n)
otr
- истинно ?
да
перепись a1
®
aj
печать массива
(a)
Рис.6.2. Схема
к примеру 6.2.4
PROGRAM Strmatr;
CONST m=4; n=3;
VAR i,j : integer;
otr : Boolean;
a : ARRAY[1..m] OF ARRAY[1..n] OF real;
BEGIN
FOR i:=1 TO m DO
BEGIN
Write('Строка', i:2, ' : ');
FOR j:=1 TO n DO Read(a[i][j]);
ReadLn
END;
FOR i:=2 TO m DO
BEGIN
j:=0;
REPEAT
j:=j+1;
otr:=a[i][j]<0
UNTIL otr OR (j=n);
IF otr THEN a[i]:=a[1];
END;
FOR i:=1 TO m DO
BEGIN
Write('Строка', i:2, ' : ');
FOR j:=1 TO n DO Write(a[i][j]:15, ' ');
WriteLn
END;
END.
Заметим, что переменная k является текущим индексом при форми-ровании выходного массива и несет информацию о фактически записанном в массив количестве элементов.
Задачи
6.2.1. В одномерном массиве целых чисел определить: а) сумму отрицательных; б) количество кратных 9; в) индекс наименьшего элемента .
6.2.2. Вычислить 10 значений функции для x от a с шагом h (a,h - вводятся) и результат поместить в массив.
6.2.3. Выяснить, имеется ли в одномерном массиве целых чисел хотя бы одно число, одновременно оканчивающееся цифрой 7 и кратное 7.
6.2.4. Имеется одномерный массив. Необходимо: а) построить новый массив, в котором элементы расположены в обратном порядке; б) перестроить исходный массив, расположив элементы в обратном поряд-ке.
6.2.5. Вычислить сумму отрицательных элементов двумерного масси-ва.
6.2.6. Имеется квадратная матрица. Все элементы главной диагонали заменить нулями.
6.2.7. В одномерном массиве целых чисел найти наибольший отри-цательный элемент и его индекс.
6.2.8. Имеется одномерный массив чисел. Построить другой массив, записав в него только те элементы исходного, которые меньше двух соседних (слева и справа).
6.2.9. Имеется одномерный массив чисел целого типа. Определить, какая цифра в этих числах встречается чаще всех.