Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Электронный конспект по программированию часть 2.doc
Скачиваний:
145
Добавлен:
13.02.2016
Размер:
17.09 Mб
Скачать

Алгоритмы для работы с матрицами

Перебор элементов матрицы

В отличие от одномерных массивов, для перебора всех элементов матрицы надо исполь-

зовать двойной цикл. Ниже показано, как найти минимальный элемент в массиве и его индексы.Сначала считаем, что минимальным является элемент A[0][0] (хотя можно начать и с любого другого), а затем проходим все элементы, проверяя, нет ли где еще меньшего. Так же, как и для одномерного массива, запоминаются только индексы, а значение минимального элемента «вытаскивается» прямо из массива.

float A[M][N], i, j, row, col;

...

row = col = 0; // сначала считаем, что A[0][0] - минимальный

for ( i = 0; i < M; i ++ ) // просмотр всех строк

for ( j = 0; j < N; j ++ ) // просмотр всех столбцов

if ( A[i][j] < A[row][col] ) {

row = i; // запомнили новые индексы

col = j;

}

printf ("Минимальный элемент A[%d][%d]=%d",

row, col, A[row][col]);

Работа с отдельными элементами

Рассмотрим квадратную матрицу N на N. Выведем на экран обе ее диагонали (главную

диагональ и перпендикулярную ей). С главной диагональю все просто – в цикле выводим все элементы, у которых номера строки и столбца равны, то есть A[i][i] для всех i от 0 до N-1.

Вторую диагональ формируют такие элементы:

A[0][N-1], A[1][N-2], A[2][N-3], ..., A[N-1][0]

Обратим внимание, что каждый следующий элемент имеет номер строки на 1 больше, а номер столбца – на 1 меньше. Таким образом, сумма номеров строки и столбца постоянна и равна N-1. Тогда, зная номер строки i можно сразу сказать, что на второй диагонали стоит ее элемент A[i][N-1-i].

\

Перестановка строк и столбцов

Пусть надо переставить две строки с индексами i1 и i2. Это значит, что для каждого

столбца j надо поменять местами элементы A[i1][j] и A[i2][j] через временную переменную (она называется temp).

for ( j = 0; j < N; j ++ ) {

temp = A[i1][j];

A[i1][j] = A[i2][j];

A[i2][j] = temp;

}

Преобразование в одномерный массив

Иногда надо скопировать матрицу A размером M на N в одномерный массив B размером

M*N. Очевидно, что при копировании по строкам (сначала первая строка, затем вторая и т.д.)элемент первой строки A[0][j] надо скопировать в B[j], элементы второй строки A[1][j] в B[N+j] и т.д. Отсюда следует, что для любой строки i элемент A[i][j] копируется в B[i*N+j]. теперь осталось только в двойном цикле перебрать все элементы матрицы.

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

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

B[i*N+j] = A[i][j];

Заметим, что если надо провести какую-то операцию со всеми или некоторыми (стоящими

подряд) элементами матрицы и для одномерного массива уже есть соответствующая процедура, ее можно использовать, учитывая, что имя строки массива (например, A[0]) является указателем на начальный элемент этой строки. При этом надо учитывать, что в памяти элементы матрицы расположены по строкам. Например, функция вычисления суммы элементов (см. массивы) может применяться для матрицы так:

s0 = Sum(A[0], N); // сумма строки 0

s14 = Sum(A[1], 4*N); // сумма строк 1-4

sAll = Sum(A[0], M*N); // сумма всех строк

Сортировка

Мы уже научились сортировать массивы целых и вещественных чисел, а теперь надо сор-

тировать строки. Можно придумать разные способы, но наиболее часто встречается алфавитная сортировка. При сортировке строк возникают две проблемы.

1. Определить, какая из двух строк «меньше», то есть какая из двух должна стоять выше.

2. Сортировка массивов чисел предусматривает перестановку элементов массива. В случае строк это связано с копированием больших объемов данных, что крайне невыгодно.Начнем с первой. Мы говорили, что есть функция сравнения строк strcmp, которая возвращает нуль, если строки равны, и не нуль, если они разные. Оказывается, эта функция возвращает «разность» этих строк, то есть разность кодов их первых отличающихся символов.Если функция вернула отрицательное число, то первая строка «меньше» второй и стоит по алфавиту раньше, если положительное – наоборот. Здесь надо учитывать, что сравнение идет по таблице кодов, и коды заглавных букв меньше, чем коды строчных (и для русских, и для английских).

Вторая проблема более серьезная и решается с помощью указателей. Сначала выделим в

памяти массив указателей на строки и сделаем так, чтобы i-ый указатель указывал на i-ую

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