Массивы. Задачи комбинированной обработки массивов

Массив — это структурированный тип данных, состоящий из фиксированного числа элементов одного типа. Тип элементов массива называется базовым. Число элементов массива фиксируется при описании и в процессе выполнения программы не меняется (можно использовать часть массива).

Доступ к элементу массива реализуется указанием имени массива и в квадратных скобках индекса(ов). Индексы элементов массива — это выражения любого скалярного типа за исключением вещественных.

Определять массивы можно двумя способами:

1-ый способ:

Var

имя_массива : array [ индексный_тип ] of базовый_тип ;

2-ой способ:

Type

имя_типа_массива = array [ индексный_тип ] of базовый_тип ;

Var

имя_массива : имя_типа_массива ;

Индексный тип (это тип-диапазон) определяет границы изменения значений индекса(ов). Если задан один индекс, то массив называется одномерным, если два — двумерным, если nn -мерным. Одномерные массивы используются для представления векторов, двумерные — для представления матриц.

Пример 4.1 (описания массивов):

1-ый способ:

Var

A, B : array [ 1..10 ] of Real ; { одномерные массивы }

С : array [ 1..5, 1..10 ] of Integer ; { двумерный массив }

2-ой способ:

Type

Mas1 = array [ 1..10 ] of Real ;

Mas2 = array [ 1..5, 1..10 ] of Integer ;

Var

A, B : Mas1 ;

C : Mas2 ;

Тогда обращаться к элементам массивов можно по индексам: A[ I ], B[ j ], C[ i, j ] и т.д.

Пример 4.2 (индексный тип можно задать с использованием констант, которые описаны в разделе описания констант):

Const

maxN = 5 ;

maxM = 10 ;

Var

С : array [ 1.. maxN, 1.. maxM ] of Integer ;

Примеры 4.3 (другие способы описания многомерных массивов):

Двумерные массивы:

Var

С : array [ 1.. 5 ] of array [ 1..10 ] of Integer ;

«Правильное» обращение к элементам массива: C[ I ][ j ].

Трехмерные массивы:

1. Var

A : array [ инд_тип_1 ] of array [ инд_тип_2 ] of array [ инд_тип_3 ] of баз_тип ;

Обращение к элементам: A [ I ][ j ][ k ] ;

2. Var

A : array [ инд_тип_1 ] of array [ инд_тип_2, инд_тип_3 ] of баз_тип ;

Обращение к элементам: A [ I ][ j, k ] ;

3. Var

A : array [ инд_тип_1, инд_тип_2 ] of array [ инд_тип_3 ] of баз_тип ;

Обращение к элементам: A [ i, j ][ k ] ;

4. Var

A : array [ инд_тип_1, инд_тип_2, инд_тип_3 ] of баз_тип ;

Обращение к элементам: A [ i, j, k ].

 

Массив можно описать и с помощью типизированных констант:

Const

Vect : array [ 1..5 ] of Byte = ( 1, 6, 3, 8, 5 ) ;

Matr : array [ 1..4, 1..6 ] of Integer =

( ( 1, 6, 3, 5, 2, 4 ) ,

( 7, 2, 5, 4, 3, 2 ) ,

( 3, 1, 6, 3, 8, 5 ) ,

( 5, 2, 8, 5, 5, 4 ) ) ;

 

Элементы массива располагаются в памяти последовательно. Многомерные массивы располагаются таким образом, что самый правый индекс возрастает самым первым. Например, массив A[ 3, 3 ] будем располагаться следующим образом: A[ 1, 1 ], A[ 1, 2 ], A[ 1, 3 ], A[ 2, 1 ], A[ 2, 2 ], A[ 2, 3 ], A[ 3, 1 ], A[ 3, 2 ], A[ 3, 3 ].

Действия над массивами

Действия над массивами в целом

Для работы с массивом как единым целым, используется идентификатор массива без указания индекса в квадратных скобках. Массивы, участвующие в этих действиях должны иметь одинаковые типы индексов и одинаковые типы компонент. Над массивом как единым целым можно произвести следующие действия:

1. A = B (проверить массивы на равенство).

2. A <> В (проверить массивы на неравенство).

3. A := В.


Действия над элементами массива

1. Инициализация массива (заключается в присвоении каждому элементу массива одного и того же значения)

§ одномерного

For i := 1 to N do

A[ i ]:= 0 ;

§ двумерного

For i := 1 to N do

For j := 1 to M do

B[ i, j ]:= 0 ;

2. Ввод элементов массива

§ одномерного

Write ( ‘Введите размерность массива N=’ ) ;

ReadLn ( N ) ;

WriteLn ( ‘Введите элементы массива’ ) ;

For i := 1 to N do

Begin

Write ( ‘A[’, i, ‘]= ’ ) ;

ReadLn ( A[ i ] )

End ;

§ двумерного

Write ( ‘Введите размерность массива N, M’ ) ;

ReadLn ( N, M ) ;

WriteLn ( ‘Введите элементы массива’ ) ;

For i := 1 to N do

For j := 1 to M do

Begin

Write ( ‘B[’ , i, ‘,’ , j, ‘]=’ ) ;

ReadLn ( B[ i, j ] )

End ;

3. Вывод элементов массива

§ одномерного

WriteLn ( ‘Вектор А: ’ ) ;

For i := 1 to N do

Write ( A[ i ] : 5 ) ;

WriteLn ;

§ двумерного

WriteLn ( ‘Матрица В: ’ ) ;

For i := 1 to N do

Begin

For j := 1 to M do

Write ( B[ i, j ] : 5 ) ;

WriteLn

End ;


4. Поиск нулевых элементов (их количества) в массиве

§ в одномерном

k := 0 ;

For i := 1 to N do

If A[ I ] = 0 then k := k + 1 ;

§ двумерном

k := 0 ;

For i := 1 to N do

For j := 1 to M do

If B[ i, j] = 0 then k := k + 1 ;

5. Нахождение минимального элемента массива и его места

§ одномерного

min := A[ 1 ] ;

i_min := 1 ;

For i := 1 to N do

If A[ i ] < min then

Begin

min := A[ i ] ;

i _min := i

End ;

§ двумерного

min := B[ 1, 1 ] ;

i_min := 1 ;

j_min := 1 ;

For i := 1 to N do

For j := 1 to M do

If B[ i, j ] < min then

Begin

min := B[ i, j ] ;

i_min := i ;

j_min := j

End ;

6. Перестановка минимального и первого элементов в массиве

§ одномерном

r := A[ 1 ] ;

A[ 1 ]:= A[ i_min ] ;

A[ i_min ]:= r ;

§ двумерном

r := B[ 1, 1 ] ;

B[ 1, 1 ]:= B[ i_min, j_min ] ;

B[ i_min, j_min ]:= r ;


7. Нахождение суммы положительных элементов массива

§ одномерного

sum := 0 ;

For i := 1 to N do

If A[ i ] > 0 then sum := sum + A[ i ] ;

§ двумерного

sum := 0 ;

For i := 1 to N do

For j := 1 to M do

If B[ i, j ] > 0 then sum := sum + B[ i, j ] ;

8. Нахождение произведения нечетных элементов

§ одномерного

pr := 1 ;

For i := 1 to N do

If ( A[ i ] mod 2) <> 0 then

pr := pr *A[ i ] ;

§ двумерного

pr := 1 ;

For i := 1 to N do {Функция Odd(X) возвращает значение}

For j := 1 to M do {истина, если X - нечетно }

If Odd( B[ i, j ] ) then

pr := pr *B[ i, j ] ;

9. Нахождение суммы положительных элементов выше главной диагонали (включая элементы диагоналей).

Элементы на главной диагонали характеризуются тем, что индекс i = j . Для элементов побочной диагонали для любого i индекс столбца j = n – i + 1 . Элементы областей выше, ниже главной или побочной диагоналей можно задать или порядком изменения индексов или условиями, накладываемыми на индексы:

i = 1, 2, …, n; j = 1, 2, …, i; i = 1, 2, …, n; j = i, i+1, …, n

или i >= j или i <= j

i = 1, 2, …, n; j = 1,2,…, n-i+1; i = 1, 2, …, n; j = n-i+1, …, n

или n – i + 1 >= j или n – i + 1 <= j

sum := 0 ;

For i := 1 to n do

For j := i to n do

If B[ i, j ] > 0 then sum := sum + B[ i, j ] ;


10. Поменять местами максимальный элемент на главной диагонали и минимальный элемент ниже побочной.

Max := B[ 1, 1 ] ;

I_max := 1 ;

 

For i := 1 to n do

If B[ i, i ] > Max then

Begin

Max := B[ i, i ] ;

I_max := i

End ;

 

 

Min := B[ 1, n ] ;

I_min := 1 ;

J_min := n ;

 

For i := 1 to n do

For j := n – i + 1 to n do

If B[ i, i ] < Min then

Begin

Min := B[ i, i ] ;

I_min := i ;

J_min := j

End;

 

 

R := B[ I_max, I_max ] ;

B[ I_max, I_max ]:= B[ I_min, J_min ] ;

B[ I_min, J_min ]:= R ;

11. Дана квадратная матрица В размерности nxn. Построить вектор А, где аi — сумма положительных элементов i-ой строки матрицы.

For i := 1 to n do

Begin

S:= 0 ;

For j := 1 to n do

If B[ i, j ] > 0 then S := S+ B[ i, j ] ;

A[ i ]:= S

End ;

 


12. Дана квадратная матрица В размерности nxn. В каждом столбце оставить без изменения максимальный элемент столбца, остальные элементы заменить нулями.

For j := 1 to n do

Begin

 

Max := B[ 1, j ] ;

I_max := 1 ;

 

For i := 1 to n do

If B[ i, j ] > Max then

Begin

Max := B[ i, j ] ;

I_max := i

End ;

 

 

For i := 1 to n do

If I_max <> i then B[ i, j ]:= 0

 

End ;


Пример: Дан целочисленный вектор A(n), поменять местами максимальный и минимальный элементы вектора. На печать выдавать исходный вектор, максимальный, минимальный элементы, полученный вектор.

Program Example_Vect ;

Uses Crt ;

Const

N_max = 10 ;

Var

N, max, i_max, min, i_min, r : Integer ;

A : array [ 1..N_max ] of Integer ;

Begin

Clrscr ;

 

Write( ‘Введите размерность массива N (<=’ , N_max, ’): ’ ) ;

ReadLn ( N ) ;

 

WriteLn ( ‘Введите элементы массива’ ) ;

For i := 1 to n do { ввод элементов вектора}

Begin

Write ( ‘A[‘, i, ’]=’ ) ;

ReadLn ( A[ i ] )

End ;

 

WriteLn ( ‘Исходный вектор А:’ ) ;

For i := 1 to n do { вывод вектора}

Write ( A[ i ] : 5 ) ;

WriteLn ;

 

 

min := A[ 1 ] ; {нахождение минимального элемента}

i_min := 1 ; {и его индекса}

For i := 1 to n do

If A[ i ] < min then

Begin

min := A[ i ] ;

i_min := i

End ;

 

max := A[ 1 ] ; {нахождение максимального элемента}

i_max := 1 ; {и его индекса}

For i := 1 to n do

If A[ i ] > max then

Begin

max := A[ i ] ;

i_max := i

End ;

 

WriteLn ( ‘Минимальный элемент A[‘, i_min, ‘]=‘ , min ) ;

WriteLn ( ‘Максимальный элемент A[‘, i_max, ‘]=‘ , max ) ;

 

r := A[ i_min ] ; {перестановка}

A[ i_min ]:= A[ i_max ] ;

A[ i_max ]:= r ;

 

WriteLn (‘Полученный вектор А: ‘) ;

For i := 1 to n do {вывод полученного вектора}

Write ( A[ i ] : 5 ) ;

WriteLn ;

End .