Заполнение массива элементами
ВВЕДЕНИЕ
В методической разработке рассмотрен один из структурированных типов Турбо-Паскаль – массивы. Показаны способы описания массивов, заполнение массивов конкретными значениями, вывод массивов на экран. Особое внимание уделяется двумерным массивам – матрицам. Рассмотрены программы, которые позволяют производить следующие действия над матрицами: упорядочивать элементы матриц в строках или в столбцах по возрастанию или убыванию, удалять и менять местами строки или столбцы матриц, перемножать матрицы, получать матрицы заданного вида, переставлять блоки матриц, производить вычисления в матрицах.
В конце методической разработки приведены варианты домашнего задания. Прочитав текст задания на странице 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, в матрице А меняются местами строки с максимальным и минимальным элементами. Затем элементам матрицы В присваиваются соответствующие элементы матрицы А.