logo search
информ

29)Алгоритмы ввода вывода одномерного массива. Алгоритм ввода и вывода двумерного массива

Для считывания, вывода на экран и обработки двумерных массивов необходимо использовать вложенные циклы. Первый цикл – по первому индексу (то есть по всем строкам), второй цикл – по второму индексу, то есть по всем элементам в строках (столбцам). Например, вывести на экран двумерный массив в виде таблицы, разделяя элементы в строке одним пробелом можно следующим образом:

А считать двумерный массив с клавиатуры можно при помощи еще более простого алгоритма (массив вводится по строкам, то есть в порядке, соответствующему первому примеру):

Обработка двумерного массива

Обработка двумерных массивов производится аналогичным образом. Например, если мы хотим записать в массив таблицу умножения, то есть присвоить элементу A[i][j] значение i * j, это можно сделать следующим образом при помощи вложенных циклов:

for (i = 0; i < n; ++i)

{

for (j = 0; j < m; ++j)

{

A[i][j] = i * j;

}

}

Рассмотрим более сложную задачу и несколько способов ее решения. Пусть дан квадратный двумерный массив int A[n][n]. Необходимо элементам, находящимся на главной диагонали проходящей из левого верхнего угла в правый нижний (то есть тем элементам A[i][j], для которых i==j) присвоить значение 1, элементам, находящимся выше главной диагонали – значение 0, элементам, нахощящимся ниже главной диагонали – значение 2. То есть получить такой массив (пример для n==4):

1 0 0 0

2 1 0 0

2 2 1 0

2 2 2 1

Рассмотрим несколько способов решения этой задачи. Элементы, которые лежат выше главной диагонали – это элементы A[i][j], для которых i<j, а для элементов ниже главной диагоналиi>j. Таким образом, мы можем сравнивать значения i и j и по ним определять значение A[i][j]. Получаем следующий алгоритм:

for (i = 0; i < n; ++i)

{

for (j = 0; j < n; ++j)

{

if (i < j)

{

A[i][j] = 0;

}

else if (i > j)

{

A[i][j] = 2;

}

else

{

A[i][j] = 1;

}

}

}

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

Сначала заполним главную диагональ, для чего нам понадобится один цикл:

for (i = 0; i < n; ++i)

{

A[i][i] = 1;

}

Затем заполним значением 0 все элементы выше главной диагонали, для чего нам понадобится в каждой из строк с номером i присвоить значение элементам A[i][j] для j=i+1, ..., n-1. Здесь нам понадобятся вложенные циклы:

for (i = 0; i < n; ++i)

{

for (j = i + 1; j < n; ++j)

{

A[i][j] = 0;

}

}

Аналогично присваиваем значение 2 элементам A[i][j] для j=0, ..., i-1:

При вводе массива необходимо последовательно вводить 1-й, 2-й, 3-й и т.д.

элементы массива, аналогичным образом поступить и при выводе. Следовательно,

необходимо организовать цикл.

Блок-схемы алгоритмов ввода элементов массива изображены на рис. 6.3-6.4.

Рис 6.3 Алгоритм ввода массива Рис. 6.4. Алгоритм ввода массива

с использованием цикла с использованием

с предусловием безусловного цикла

Как видно, безусловный цикл удобно использовать для обработки всего

массива, и в дальнейшем при выполнении таких операций будем применять

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

Рассмотрим несколько примеров обработки массивов. Алгоритмы, с

помощью которых обрабатывают одномерные массивы, похожи на обработку

последовательностей (вычисление суммы, произведения, поиск элементов по

определенному признаку, выборки и т. д.). Отличие заключается в том, что в

массиве одновременно доступны все его компоненты, поэтому становится

возможной, например, сортировка его элементов и другие, более сложные

преобразования.