ЗАПОЛНЕНИЕ МАССИВА ЭЛЕМЕНТАМИ

ВВЕДЕНИЕ

 

В методической разработке рассмотрен один из структурированных типов Турбо-Паскаль – массивы. Показаны способы описания массивов, заполнение массивов конкретными значениями, вывод массивов на экран. Особое внимание уделяется двумерным массивам – матрицам. Рассмотрены программы, которые позволяют производить следующие действия над матрицами: упорядочивать элементы матриц в строках или в столбцах по возрастанию или убыванию, удалять и менять местами строки или столбцы матриц, перемножать матрицы, получать матрицы заданного вида, переставлять блоки матриц, производить вычисления в матрицах.

В конце методической разработки приведены варианты домашнего задания. Прочитав текст задания на странице 21, легко заметить соответствия между пунктами задания и разделами методической разработки. Так, например, пункту 1 задания соответствуют примеры из раздела 2 (ЗАПОЛНЕНИЕ МАССИВА ЭЛЕМЕНТАМИ); примеры, подобные пункту 2 задания можно найти в разделе 4 (ДЕЙСТВИЯ НАД МАТРИЦАМИ) методического пособия и т.д. Поэтому, подробно изучив примеры данного методического пособия и пояснения к ним, не возникнет сложностей при выполнении домашнего задания.

 

ОПИСАНИЕ МАССИВОВ

 

Одним из видов структурированного типа данных являются массивы. Массив состоит из определенного количества компонентов одинакового типа. Доступ к компонентам массива, осуществляется с помощью индексов. Индексом может быть произвольное выражение порядкового типа, заключенное в квадратные скобки. Допустимый диапазон индексов определяется в описании массива.

Описание массива имеет следующий вид:

<имя типа>= ARRAY [<тип индексов>] OF <тип элементов>;

где ARRAY, OF – ключевые слова;

<имя типа> – любой правильный идентификатор;

<тип индексов> – используется любой порядковый тип, но обычно тип– диапазон, в котором задаются границы изменения индексов;

<тип элементов> – любой тип Турбо-Паскаля.

Пример: TYPE COLOR = (red, green, blue);

H = 0..20;

L = ARRAY [BYTE] OF BOOLEAN;

VAR A : ARRAY [COLOR] OF H;

B : L;

C : ARRAY [H] OF REAL;

Тип L связан с набором массивов с индексами типа BYTE и элементами типа BOOLEAN. Переменная А является массивом с индексами типа COLOR и элементами типа H. Переменная B является массивом типа L, то есть с индексами типа BYTE и элементами типа BOOLEAN. Переменная C является массивом с индексами типа 0..20 и элементами типа REAL.

В качестве <типа элементов> можно использовать другой массив.

Пример:

TYPE MAS=ARRAY [1..2] OF ARRAY [1..2] OF INTEGER;

Тип MAS связан с набором массивов с индексами типа 1..2 и элементами, являющимися в свою очередь массивами с индексами 1..2 и элементами типа INTEGER.

Тип MAS можно заменить следующим:

TYPE MAS = ARRAY [1..2, 1..2] OF INTEGER;

VAR D : MAS;

В данном случае переменная D является двумерным массивом. Массив D содержит 4 элемента целого типа.

Имя элемента массива содержит имя массива и индексное выражение, заключенное в квадратные скобки. Индексное выражение может быть любым порядковым выражением того же типа, что и тип индексов в описании массива. Для рассмотренных выше массивов возможно использование следующих имен элементов массивов: A [red]; B[40]; C[10]; D[1,2].

В соответствии с правилом по которому переменной любого типа может быть присвоено значение такого же типа, возможно присваивание целого массива с помощью одного оператора.

Пример: VAR E, F : ARRAY [1..10] OF REAL;

Для данного описания возможно следующее присваивание: F:=E;

После этого присваивания все 10 элементов массива F получат те же значения, что и в массиве E.

 

ЗАПОЛНЕНИЕ МАССИВА ЭЛЕМЕНТАМИ

 

Для ввода с клавиатуры конкретных значений элементов массивов используются процедуры READ и READLN.

Пример 1. Ввести с клавиатуры конкретные значения элементов заданного двумерного массива.

PROGRAM PR1;

TYPE MAS = ARRAY [1..2, 1..2] OF REAL;

VAR A : MAS;

i, j : INTEGER;

BEGIN

FOR i:=1 TO 2 DO

FOR j:=1 TO 2 DO BEGIN

WRITE ('A [ ',i,', ',j,' ] = ');

READLN (A[i, j]);

END;

END.

Пояснения к программе: В качестве типа элементов двумерного массива A используется вещественный тип, а в качестве типа индексов массива A используется тип-диапазон, границами которого являются целые числа. Такое описание соответствует структуре матрицы.

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

Пример 2. Заполнить матрицу A размера (6*6) элементами, образованными по закону .

PROGRAM PR2;

VAR A : ARRAY [1..6, 1..6] OF REAL;

i, j : INTEGER;

BEGIN

WRITELN (' матрица А ');

FOR i:=1 TO 6 DO BEGIN

FOR j:=1 TO 6 DO BEGIN

А[i, j]:=SQRT(i)+SIN(j)/COS(j);

WRITE (A[i, j]:7:1);

END;

WRITELN;

END;

END.

Пояснения к программе: В данной программе каждый матрицы A определяется в соответствии с заданной формулой. Элементы матрицы выводятся на экран в виде прямоугольной таблицы.

 

ВЫВОД МАССИВОВ НА ЭКРАН

 

Для вывода массивов на экран используют процедуры WRITE и WRITELN.

Пример 3. Вывести матрицу A размера (6*6) на экран. При этом будем предполагать, что элементы матрицы A уже заданы (способы задания матриц приведены в примерах 1–2).

PROGRAM PR3;

VAR A :ARRAY [1..6,1..6] OF REAL;

i, j : INTEGER;

BEGIN

WRITELN (' матрица А ');

FOR i:=1 TO 6 DO BEGIN

FOR j:=1 TO 6 DO WRITE (A[i, j]:7:1);

WRITELN;

END;

END.

Пояснения к программе: Элементы матрицы A выводятся на экран в виде прямоугольной таблицы. Расстояние между столбцами матрицы задается форматом вывода элементов A[i, j].

После выполнения каждого пункта задания, текст которого приведен на странице 19, необходимо осуществлять вывод матрицы на экран. Использование процедуры вывода матрицы на экран позволит уменьшить объем программы и сделать ее более наглядной. Рассмотрим пример.

Пример 4. Получить матрицу A(7*6), образованную по закону и вывести ее на экран, используя подпрограмму.

PROGRAM PR4;

TYPE MAS = ARRAY [1..7, 1..6] OF REAL;

VAR A : MAS;

i, j : INTEGER;

PROCEDURE W (ms, ns : INTEGER; AS : MAS);

BEGIN

FOR i:=1 TO ms DO BEGIN

FOR j:=1 TO ns DO WRITE (AS[i, j]:7:1);

WRITELN;

END;

END;

BEGIN

FOR i:=1 TO 7 DO

FOR j:=1 TO 6 DO A[i, j]:=i + SIN(j)/COS(j);

WRITELN (' матрица A ');

W(7, 6, A);

END.

Пояснения к программе: В используемой процедуре W формальными параметрами являются ms, ns – переменные, определяющие количество строк и столбцов выводимой матрицы соответственно; AS – переменная, определяющая имя выводимой матрицы.

 

ДЕЙСТВИЯ НАД МАТРИЦАМИ

 

Одним из пунктов задания является выполнение каких-либо преобразований над матрицами. Такими преобразованиями могут быть: упорядочивание элементов матрицы в строках или в столбцах по возрастанию или убыванию; удаление строк или столбцов; смена положения строк или столбцов матрицы. Рассмотрим примеры.

Пример 5.Упорядочить элементы в строках заданной матрицы B размера (6*6) по убыванию.

PROGRAM PR5;

VAR B : ARRAY [1..6, 1..6] OF REAL;

i, j, k : INTEGER;

bk : REAL;

BEGIN

{Ввести элементы матрицы В (способы задания матриц приведены в примерах 1, 2)}

FOR i:=1 TO 6 DO

FOR j:=1 TO 6 DO

FOR k:=1 TO 6 DO

IF B[i, j]>B[i, k] THEN BEGIN bk:=B[i, j];

B[i, j]:=B[i, k];

B[i, k]:=bk;

END;

{Вывод на экран матрицы B (смотрите примеры 3, 4)};

END.

Пояснения к программе: В этом примере используется сортировка обменом. Первый цикл с параметром i фиксирует строку матрицы В. В каждой строке, последовательно сравниваются пары соседних элементов и при выполнении условия оператора IF, эти элементы меняются местами. Тем самым наибольший элемент переставляется в начало строки.

Если необходимо упорядочить элементы в столбцах, то первый цикл должен быть с параметром j, то есть сначала фиксируется столбец матрицы.

Если необходимо упорядочить элементы в строках или в столбцах по возрастанию, то нужно поменять условие оператора IF, то есть вместо операции сравнения > (больше), использовать – < (меньше).

Пример 6. Удалить столбец, содержащий максимальный элемент матрицы A размера (6*7). Результат данного действия занести в матрицу B.

PROGRAM PR6;

VAR A : ARRAY [1..6, 1..7] OF REAL;

B : ARRAY [1..6, 1..6] OF REAL;

i, j, jmax : INTEGER;

max : REAL;

BEGIN

{Ввести элементы матрицы A (способы задания матриц приведены в примерах 1, 2)}

max:=A[1, 1];

jmax:=1;

FOR i:=1 TO 6 DO

FOR j:=1 TO 7 DO

IF A[i, j]>max THEN BEGIN max:=A[i, j];

jmax:=j;

END;

FOR i:=1 TO 6 DO

FOR j:=1 TO 6 DO

IF j >= jmax THEN B[i, j]:=A[i, j+1]

ELSE B[i, j]:=A[i, j];

{Вывод на экран матрицы B (см. примеры 3, 4)};

END.

Пояснения к программе: В первой части данной программы определяется максимальный элемент матрицы A. Переменной jmax присваивается номер столбца, содержащий максимальный элемент. Далее элементам матрицы B присваиваются соответствующие элементы матрицы A, за исключением тех элементов матрицы A, которые находятся в столбце jmax.

Пример 7. Поменять местами строки с максимальным и минимальным элементами матрицы A размера (6*6). Результат данного действия занести в матрицу B.

PROGRAM PR7;

TYPE Stroka = ARRAY [1..6] OF REAL;

VAR A,B : ARRAY [1..6] OF Stroka;

Bs : Stroka;

i, j, imax, imin : INTEGER;

max, min : REAL;

BEGIN

{Ввести элементы матрицы A (способы задания матриц приведены в примерах 1, 2)}

max:=A[1, 1];

imax:=1;

min:=A[1, 1];

imin:=1;

FOR i:=1 TO 6 DO

FOR j:=1 TO 6 DO BEGIN

IF A[i, j]>max THEN BEGIN max:=A[i, j];

imax:=i;

END;

IF A[i, j]<min THEN BEGIN min:=A[i, j];

imin:=i;

END;

END;

Bs:=A[imin];

A[imin]:=A[imax];

A[imax]:=Bs;

B:=A;

{Вывод на экран матрицы B (см. примеры 3, 4)};

END.

Пояснения к программе: В данном примере задается тип Stroka содержащий 6 элементов типа REAL. Переменные A,B являются массивами, содержащие 6 элементов типа Stroka. Определяются строки, в которых находятся максимальный и минимальный элементы матрицы А и переменным imax и imin присваиваются номера этих строк. Используя дополнительную переменную Bs типа Stroka, в матрице А меняются местами строки с максимальным и минимальным элементами. Затем элементам матрицы В присваиваются соответствующие элементы матрицы А.