Алгоритмические языки высокого уровня. Курс лекций
.pdfТакую запись можно заменить более компактной:
type
mas = array[1..5, 1..10] of integer;
Таким образом можно описывать многомерные массивы. Глубина вложенности массивов произвольная, поэтому количество элементов в списке индексных типов (размерность массива) не ограничена (од- нако не может быть более 65520 байт).
Работа с многомерными массивами почти всегда связана с орга- низацией вложенных циклов. Так, чтобы заполнить двухмерный мас- сив (матрицу) случайными числами, используют конструкцию вида:
for i:=1 to m do for j:=1 to n do
a[i,j]:=random(10);
Для «красивого» вывода матрицы на экран используется цикл:
for i:=1 to m do begin
for j:=1 to n
do write(a[i,j]:5); writeln;
end;
Двухмерные массивы можно представить в виде прямоугольной таблицы или матрицы. Рассмотрим матрицу А размерности 2×3 (со- стоящую из двух строк по три элемента в каждой).
a11 |
a12 |
a13 |
|
A = |
a22 |
a23 |
. |
a21 |
|
||
Положение каждого элемента определяется двумя числами: номе- ром строки и номером столбца. Например, а12 – это элемент, стоя- щий в первой строке и во втором столбце.
Объявление двухмерного массива.
I способ. Можно просто объявить массив в разделе описания пе- ременных:
Const n=2; m=3;
Var A : Array[1..n,1..m] of < тип элементов>;
II способ.
Const n=2; m=3;
Type
61
Myarray= Array[1..n,1..m] of < тип элементов >; Var A : myarray;
Методы решения задач обработки одномерных массивов могут применяться и для двухмерных массивов. Поскольку положение эле- мента в двухмерном массиве описывается двумя индексами (пер- вый – номер строки, второй – номер столбца), программы для реше- ния большинства матричных задач строятся на основе вложенных циклов. Обычно внешний цикл организуется по строкам матрицы, т.е. в нем выбирается требуемая строка матрицы, а внутренний цикл – по столбцам матрицы, в нем выбирается элемент строки. Для присваивания значений элементам массива могут быть использованы операторы присваивания и операторы ввода.
Пример программы (одномерные и двухмерные массивы)
Описание 1: ввод, вывод элементов массива.
Program Array_1;
Const |
n=10; |
m=12; |
|
Type |
mas |
= |
array[1..n] of integer; |
Var |
i,j |
: |
integer; |
M1: mas; {одномерный массив}
M2 : array[1..n,1..m] of integer; {двухмерный массив} begin
writeln('введите элементы одномерного массива');
for i:=1 to n do {Заполнение одномерного массива с кла- виатуры}
readln(M1[i]);
writeln('Вывод одномерного массива:'); for i:=1 to n do write(M1[i]:5);
for i:=1 to n do {Заполнение двухмерного массива по фор- муле}
for j:=1 to m do M2[i,j]:=2*i+j; writeln('Вывод двухмерного массива:');
for i:=1 to n do { Вывод массива в виде матрицы } begin { вывод i-строки массива}
for j:=1 to m do write(M2[i,j]:5);
writeln; {Переход на начало следующей строки} end;
end.
Описание 2: суммирование элементов массива.
Program Array_2;
Const n=10; m=12;
62
Var |
i,j,Sum1,Sum2 : integer; |
|
M1: |
array[1..n] of integer; |
{одномерный массив} |
M2 : array[1..n,1..m] of integer; {двухмерный массив} begin
for i:=1 to n do {Заполнение массивов по формуле} begin
M1[i]:=i;
for j:=1 to m do M2[i,j]:=i*j;
end;
Sum1:=0; Sum2:=0; {суммирование массивов} for i:=1 to n do
begin
Sum1:= Sum1+M1[i];
for j:=1 to m do Sum2:= Sum2+M2[i,j]; end;
writeln('Вывод сумм: Sum1=',Sum1:5,'Sum2=', Sum2:5); end.
Описание 3: суммирование диагональных элементов матрицы.
Program Array_3; |
|
Const |
n=10; m=12; |
Var |
i,j,Sum1,Sum2 : integer; |
M2 : array[1..n,1..m] of integer; {двухмерный массив} |
|
begin |
|
for i:=1 to n |
do {Заполнение матрицы по формуле} |
|
for j:=1 to |
m do M2[i,j]:=i*j; |
|
Sum1 := 0; |
|
|
for i := 1 to |
n do |
{Суммирование диагональных элементов |
матрицы} |
|
|
Sum1:= Sum1 |
+ M2[i,i]; |
|
writeln('Вывод сумма диагональных элементов: Sum=',Sum1:5); end.
Описание 4: суммирование элементов строк матрицы с получе- нием результата в виде вектора.
Program Array_4; |
|
|
|
Const |
n=10; m=12; |
|
|
Var |
i,j,Sum1,Sum2 : integer; |
|
|
M1: array[1..n] of integer; |
{одномерный |
массив} |
|
M2 : array[1..n,1..m] of integer; {двухмерный |
массив} |
||
begin |
|
|
for i:=1 to n |
do {Заполнение матрицы по формуле} |
|
for j:=1 to |
m do M2[i,j]:=i*j; |
|
for i := 1 to |
n do |
{Суммирование элементов строки матри- |
цы} |
|
|
begin
Sum1 := 0;
for j:=1 to m do
63
begin
Sum1:= Sum1 + M2[i,j]; {Суммирование элементов строки матрицы}
end;
M1[i]:=Sum1; {заполнение вектора} end;
writeln('Вывод вектора:');
for i:=1 to n do write(M1[i]:5);
end.
Описание 5: перестановка строк Nom1 и Nom2 в матрице.
Program Array_5; Const n=10; m=12;
Var i,j,c,Nom1,Nom2 : integer;
M2 : array[1..n,1..m] of integer; {двухмерный массив} begin
readln(Nom1,Nom2);
for i:=1 to n do {Заполнение матрицы по формуле} for j:=1 to m do M2[i,j]:=i*j;
for j:=1 to m do begin
c := M2[Nom1,j]; M2[Nom1,j] := M2[Nom2,j]; M2[Nom2,j] := c;
end;
end.
Описание 6: включение, удаление k-го элемента в массиве.
Program Array_6; |
|
|
Const |
n=10; |
|
Var |
i,j,K_Element,ZH : integer; |
|
M1: array[1..n] of integer; |
{одномерный массив} |
|
begin |
|
|
readln(ZH); |
|
|
for i:=1 to n do {Заполнение одномерного массива с клавиату- ры}
readln(M1[i]);
{включение элемента ZH в K_Element-ю позицию массива} for i := n downto k do
M1[i + 1] := M1[i]; M1[k] := ZH;
n := n + 1 ;
{удаление K_Element-го элемента из массива} n := n – 1 ;
for i := K_Element to n do M1[i] := M1[i + 1];
end;
end.
64
Описание 7: транспонирование квадратной матрицы.
Program Array_7;
Const |
n=10; m=12; |
Var |
i,j, p : integer; |
M2 : array[1..n,1..m] of integer; {двухмерный массив} begin
for i:=1 to n do {Заполнение матрицы по формуле} for j:=1 to m do M2[i,j]:=i*j;
{транспонирование квадратной матрицы} for i := 1 to n – 1 do
for j := i + 1 to n do begin
p := M2[i, j];
M2[i, j] := M2[j, i]; M2[j, i] := p;
end;
end.
Описание 8: умножение матрицы на вектор, умножение матриц.
Program Array_8; |
|
|
Const |
n=10; m=12; |
|
Var |
i,j,s : integer; |
|
M1,c: array[1..n] of integer; |
{одномерный массив} |
|
M2,M3,cM: array[1..n,1..m] of integer; {двухмерный массив} begin
for i:=1 to n do {Заполнение массивов по формуле} begin
M1[i]:=i;
for j:=1 to m do M2[i,j]:=i*j;
end;
{умножение матрицы на вектор} for i := 1 to n do
begin
s := 0;
for j := 1 to m do
s := s + M2[i, j]* M1[j]; c[i] := s;
end;
{умножение матрицы на матрицу} for i:=1 to n do
for j:=1 to m do begin
s:= 0;
for l:=1 to k do
s:= s + M2[i,l]*M3[l,j]; cM[i,j]:= s;
end;
writeln('Вывод: умножение матрицы на вектор:');
65
for i:=1 to n do write(c[i]:5); writeln('Вывод: умножение матриц');
for i:=1 to n do for j:=1 to m do
write(сM[i,j]:5);
end.
Описание 9: преобразование матрицы в одномерный массив, по- иск минимального (максимального) элемента массива, матрицы.
Program Array_9; |
|
|
Const |
n=10; m=12; |
|
Var |
i,j,max,maxIJ,index,indexi,indexj: integer; |
|
M1: array[1..n] of integer; |
{одномерный массив} |
|
M2: array[1..n,1..m] of integer; {двухмерный массив} |
||
begin |
|
|
for i:=1 to n do {Заполнение массивов по формуле} |
||
begin |
|
|
|
M1[i]:=i; |
|
|
for j:=1 to m do M2[i,j]:=i*j; |
|
end; |
|
|
{преобразование матрицы в одномерный массив} |
||
for i := 1 to n do |
|
|
for j := 1 to m do |
|
|
|
M1[(i – 1)*m + j] := M2[i, j]; |
|
{поиск минимального (максимального) элемента в массиве} max := M1[1]; index := 1;
for i := 2 to n do if M1[i] > max then begin
max : = M1[ i ]; index := i;
end;
{поиск минимального (максимального) элемента в матрице} maxIJ:= а[1, 1]; indexi := 1; indexj := 1;
for i := 2 to n do for j := 1 to m do
if M2[i, j] > maxIJ then begin
maxIJ := M2[i, j]; indexi := i; indexj := j;
end; writeln('Вывод массива:');
for i:=1 to n do write(M1[i]:5); writeln('Вывод матрицы');
for i:=1 to n do for j:=1 to m do
write(M2[i,j]:5);
end.
66
Сортировка массива – это расстановка элементов массива в не- котором порядке. В отсортированном массиве поиск элемента можно осуществлять, не просматривая весь массив. Пример отсортирован- ного массива – это, например, список телефонов в справочнике, спи- сок фамилий в адресной книге и т.д. Существуют следующие виды сортировок: по возрастанию, по убыванию. Разнообразие методов сортировки достаточно велико. Каждый метод имеет свои преиму- щества и недостатки, поэтому он оказывается эффективнее других при некоторых конфигурациях данных и аппаратуры. Все методы можно выделить в 3 большие группы: сортировка выбором, сорти-
ровка обменом и сортировка вставками (включениями), на основе которых строятся другие, более совершенные методы сортировки. Рассмотрим методы сортировки элементов массива размерности N в порядке их возрастания.
Сортировка методом простого выбора.
Этот метод сортировки обычно применяется для массивов, не со- держащих повторяющихся элементов. Для поставленной задачи можно действовать следующим образом:
1)выбрать максимальный элемент массива;
2)поменять его местами с последним элементом (после этого наи- больший элемент будет стоять на своем месте);
3)повторить пп. 1) – 2) с оставшимися n – 1 элементами, т.е. рас- смотреть часть массива, начиная с первого элемента до предпослед- него, найти в ней максимальный элемент и поменять его местами с предпоследним (n–1)-м элементом массива и т.д., пока не останется один элемент, уже стоящий на своем месте.
Всего потребуется n–1 раз выполнить эту последовательность действий. В процессе сортировки будет увеличиваться отсортиро- ванная часть массива, а неотсортированная, соответственно, умень- шаться.
Пусть исходный массив А состоит из 10 элементов и имеет вид:
5 13 7 9 1 8 16 4 10 2.
После сортировки массив должен выглядеть так:
1 2 4 5 7 8 9 10 13 16.
Процесс сортировки представлен ниже. Максимальный элемент текущей части массива заключен в кружок, а элемент, с которым происходит обмен, – в квадратик. Скобкой отмечена отсортирован- ная часть массива.
67
1-й шаг: рассмотрим весь массив и найдем в нем максимальный элемент – 16 (он стоит на седьмом месте); поменяем эго местами с последним элементом.
Максимальный эле- мент помещен на свое место.
2-й шаг: рассмотрим часть массива с первого до девятого элемента. Максимальный элемент этой части стоит на втором месте и имеет зна- чение 13. Поменяем его местами с последним элементом этой части.
Отсортированная часть массива состоит теперь уже из двух элементов.
3-й шаг: снова уменьшим рассматриваемую часть массива на один элемент. Здесь нужно поменять местами второй элемент (его значе- ние 10) и последний элемент этой части (его значение 4).
В отсортированной части массива теперь стало 3 элемента.
4-й шаг: аналогично шагу 3
5-й шаг: максимальный элемент этой части массива является по- следним в ней, поэтому его нужно оставить на своем месте.
Далее повторяем процесс сортировки.
6-й шаг:
7 шаг:
8-й шаг:
68
9-й шаг:
Итог: 1 2 4 5 7 8 9 10 13 16
Для программной реализации этого процесса необходимо органи- зовать цикл по длине рассматриваемой части массива, которая изме- няется от n до 2. В качестве начального значения максимума разумно взять значение последнего элемента рассматриваемой части.
Алгоритм сортировки:
For i:=n downto 2 Do Begin
{ найти максимальный элемент из a[1],…, a[i]; }
{запомнить его индекс в переменной k; }
{если i<>k, поменять местами a[i] и a[k]
End; }
Пример программы
Описание: сортировка методом простого выбора.
Program sorting; var i,j,k:integer;
a: array [1..50] of integer; m, n :integer;
begin
Writeln(‘введите размер массива’); Readln(n);
for i:=1 to n do read(a[i]); for i:=n downto 2 do
begin k:=i; m:=a[i];
for j:=1 to i-1 do if a[j]>m then
begin
k:=j; m:=a[k]; end;
if k<>i then begin
a[k]:=a[i]; a[i]:=m; end;
end;
writeln;
for i:=1 to n do write(a[i]: 4);
end.
69
Сортировка методом простого обмена
Сортировка методом простого обмена может быть применена для любого массива. Этот метод заключается в последовательных про- смотрах массива слева направо (от начала к концу) и обмене местами соседних элементов, расположенных «непрерывно», т.е. таких, что i<j и a[i]>a[j]. Опишем этот метод подробнее.
Начнем просмотр с первой пары элементов (a[1] и a[2]). Если первый элемент этой пары больше второго, то меняем их мес- тами, иначе оставляем их без изменения. Затем берем вторую пару элементов (a[2] и a[3]), если a[2] > a[3], то меняем их местами, и так далее. На первом шаге будут просмотрены все пары элементов массива a[i] и a[i+1] для i от 1 до n-1. В результате максимальный элемент массива переместится в конец массива. Поскольку самый большой элемент находится на своем месте, рассмотрим часть массива без него, т.е. с 1 до (n-1) эле- мента, повторим предыдущие действия для этой части массива, в ре- зультате чего второй по величине элемент массива переместится на последнее место рассматриваемой части массива, т.е. на (n-1) ме- сто во всем массиве. Эти действия продолжают до тех пор, пока ко- личество элементов в текущей части массива не уменьшится до двух. В этом случае необходимо выполнить последнее сравнение и упоря- дочить последние два элемента. При сортировке выполняется n-1 просмотр массива (этот метод также называют методом «пузырька»).
Пример программы
Описание: сортировка методом простого обмена.
Program sorting2; var i,j,k:integer;
a: array [1..50] of integer; n,t:integer;
begin
writeln('введите размер массива'); readln(n);
for i:=1 to n do read(a[i]); for k:=1 to n-1 do
for i:=1 to n-k do if a[i]>a[i+1] then
begin
t:=a[i]; a[i]:=a[i+1]; a[i+1]:=t;
end;
writeln;
for i:=1 to n do write(a[i]:5); end.
70
