Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Алгоритмические языки высокого уровня. Курс лекций

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
940 Кб
Скачать

Такую запись можно заменить более компактной:

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

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