Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
6.DOC
Скачиваний:
0
Добавлен:
09.11.2018
Размер:
100.86 Кб
Скачать

86

Глава 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. Имеется одномерный массив чисел целого типа. Определить, какая цифра в этих числах встречается чаще всех.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]