Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Глава8.doc
Скачиваний:
2
Добавлен:
16.04.2019
Размер:
253.95 Кб
Скачать

8.3. Обращение к элементам двумерного массива

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

Пример 8.4

x[2,1] – обращение к элементу массива x ñ с индексами 2 и 1;

zet[m,n] – обращение к элементу массива zet; индексы элемента m и n должны быть предварительно определены численно;

beta[i+2,k] – обращение к элементу массива beta; индексное выражение i+2 должно быть предварительно вычислено, а значение k определено.

8.4. Ввод-вывод двумерных массивов

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

Пример 8.5

Ввести матрицу С(6x11), нумерация индексов которой начинается с 0.

var i, k : integer ;

c : array [0..5,0..10] of real ;

begin

for i:=0 to 5 do

for k:=0 to 10 do

read (c [ i, k ]);

end.

В приведенном фрагменте цикл начинается с присваивания параметру i его начального значения, равного нулю, после чего выполняется внутренний цикл с параметром k, последовательно принимающим значения 0,1,2,...,10, т.е. вводятся элементы нулевой строки матрицы c[0,0], c[0,1], c[0,2], ..., c[0,10]. Далее произойдет возврат во внешний цикл, значение переменной i увеличится на 1. При новом значении i снова будет выполнен внутренний цикл, т.е. введены элементы следующей строки. Операции ввода будут продолжаться до тех пор, пока не будут введены все элементы массива.

Можно ввести эту же матрицу «по столбцам», для чего операторы внешнего и внутреннего циклов необходимо поменять местами.

Пример 8.6

Ввести массив, описанный в примере 8.5, «по столбцам». Вывести часть элементов этого массива, расположенных в строках с номерами 3, 4, 5 и в столбцах с номерами 7-10. Вывод осуществлять «по строкам».

begin

for k:=0 to 10 do

for i:=0 to 5 do read(c[i,k]);

for i:=3 to 5 do

for k:=7 to 10 do write(c[i,k]);

end;

Пример 8.7

Написать фрагмент программы, содержащий вывод матрицы C(10  20) в виде таблицы, содержащей 10 строк и 20 столбцов. Индексацию строк начать с –1, столбцов с 0.

program abcd;

var c:array [-1..8,0..19] of real;

i,j:integer;

begin

.

.

.

for i:=-1 to 8 do

begin

for j:=0 to 19 do write(c[i,j]:8:3);

writeln

end

end.

Тело внутреннего цикла содержит два оператора: for и writeln. После того, как оператор for выведет очередную строку матрицы, оператор writeln осуществляет переход на новую строку.

8.5. Программирование с использованием сложных циклов

Сложные циклы, как и простые, программируются с использованием операторов цикла, которые позволяют разработать компактную и простую для понимания программы. Наилучшим для программирования процессов обработки двумерных массивов является оператор for.

Использование операторов цикла при разработке программ подразумевает соблюдение нескольких простых правил:

1) передача управления из тела внешнего цикла в тело внутреннего возможна только через начало внутреннего цикла (рис.8.2);

Рис. 8.2. Варианты передачи управления из внешнего цикла во внутренний: 1 – правильно; 2 и 3 – неправильно.

2) передача управления из тела внутреннего цикла в тело внешнего возможна в двух случаях:

а) после того, как вычисления, предусмотренные телом внутреннего цикла выполнены заданное число раз, - это так называемый нормальный выход во внешний цикл;

б) посредством оператора передачи управления, который прерывает выполнение внутреннего цикла, если это предусмотрено алгоритмом задачи (рис.8.3).

Рис. 8.3. Варианты передачи управления из тела внутреннего цикла в тело внешнего: 1 – нормальный выход; 2 и 3 – выход «по условию».

Рассмотрим несколько задач, решение которых требует программирования сложных циклов.

Пример 8.8

Дан массив вещественных чисел A(10). Упорядочить этот массив по возрастанию его элементов, т.е. сделать так, чтобы каждый следующий элемент массива оказался бы больше предыдущего.

Рассмотрим один из наиболее простых алгоритмов, разработанных для задач такого рода.

Детализированный вариант Упрощенный вариант

алгоритма алгоритма

Идея этого алгоритма заключается в том, что элементы исходного массива сравниваются попарно - сначала a1 c a2, потом a2 c a3, далее a3 с a4 и т.д. Если первый элемент в паре больше второго, то меняют их численные значения, в результате чего первый элемент получает значение второго, а второй – первого. В противном случае никаких замен в паре не производят, а переходят к сравнению элементов второй пары.

Таким образом, происходит как бы постепенное «проталкивание» наибольшего элемента в конец массива, причем функцию «толкача» в алгоритме выполняет внутренний цикл. Как только наибольший элемент массива займет предназначенное ему последнее 10-е место, описанную процедуру повторяют с оставшимися неупорядоченными 9-ю элементами, в результате чего наибольший из оставшихся элемент займет последнее место в массиве и т.д.

Для получения искомого результата такую процедуру нужно выполнить девять раз, причем с каждым разом число повторений внутреннего цикла должно уменьшаться на 1.

Эту задачу решает внешний цикл. Его параметр, пробегая от повторения к повторению 9, 8, 7,..., 1 служит не только счетчиком числа повторений, но, в то же время, и наибольшим значением параметра внутреннего цикла.

program sort;

var i,k : integer ;

b : real ;

a : array [1..10] of real ;

begin

write (‘введите массив - ‘);

for i:=1 to 10 do readln (a [ i ]);

writeln (' исходный массив:);

for i:=1 to 10 do write (a [ i ]:5:2);

for i:=9 downto 1 do

for k:=1 to i do if a [ k ] > a [ k + 1] then

begin

b := a [ k ]; a [ k ] := a [ k + 1 ]; a [ k + 1 ] := b

end

writeln(' упорядоченный массив:');

for i:=1 to 10 do write (a [ i ]:5:2)

end.

Пример 8.9

Дана матрица A(20x20). Сформировать вектор C(20), каждый элемент которого есть произведение элементов столбца матрицы, за исключением элемента, лежащего на главной диагонали. Индексацию строк и столбцов исходной матрицы начать с нуля, индексацию элементов вектора с 10.

Численное значение p каждого элемента вектора C формируется во внутреннем цикле алгоритма, а запись в массив (C[n+10]:=p) – во внешнем после завершения очередного повторения тела внутреннего цикла.

Схема алгоритма

program massiv;

var b : array [0..19,0..19] of real ;

c : array [10..29] of real ;

p : real ; m,n : integer ;

begin

for m:=0 to 19 do

for n:=0 to 19 do read (b [m, n]);

for n:=0 to 19 do

begin

p:=1; for m:=0 to 19 do

if m <> n then {формирование произведения }

p := p b [m, n]; {элементов столбца матрицы }

{за исключением диагонального}

c[n + 10]:=p; {запись значения в массив С }

end;

for n:=10 to 19 do write (c[ n ]:10:3)

end.

Пример 8.10

Дана матрица MAT(5*5), состоящая из вещественных элементов. Поменять местами строки матрицы, содержащие максимальный и минимальный элементы.

program MinMax;

type m = array [1..5] of real ;

var mat : array [1..5] of m ;

str : m;

maxi, mini, i, j, i1, j1 : integer ;

begin

write (‘введите матрицу - ‘);

for i:=1 to 5 do

for j:=1 to 5 do read (mat[ i, j]);

i1:=1; j1:=1; {индексы минимального элемента }

i2:=1; j2:=1; {индексы максимального элемента}

for i:=1 to 5 do

for j:=1 to 5 do

if mat [ i, j] > mat[ i2, j2] then

begin

i2 := i; j2 := j {запомнить индексы

нового максимума}

end

else

if mat [i, j] < mat [i1, j1] then

begin

i1 := i; j1 := j; {запомнить индексы

нового минимума}

end;

str := mat[ i2 ]; {замена строки матрицы mat,}

mat [ i2 ] := mat[ i1 ]; {содержащей максимальный}

mat [ i1] := str; {элемент, строкой с мини-

мальным элементом и наоборот}

for i:=1 to 5 do

begin

for j:=1 to 5 do write (mat [ i, j]);

writeln

end

end.

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

Первая задача является разновидностью типовой задачи поиска максимума или минимума (пример 7.11).

Отличие от типовой заключается в том, что определяются не сами максимальный и минимальный элементы матрицы, а их индексы. Для хранения индексов в процессе счета используются переменные i1, j1 - для минимального элемента è i2, j2 - для максимального.

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

Схема алгоритма

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