Матрицы (двухмерные массивы)
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

 

Массивы называются двухмерными, если элементы массива расположены в виде таблицы. При этом каждый элемент массива имеет два индекса, первый показывает номер строки, а второй - номер столбца, на пересечении которых он расположен.

       Формат описания двухмерного массива:

<тип> <имя_массива> [размер1][размер2];

Здесь

<тип> — тип элементов массива (int, float, char, структуры),

<имя_массива> записывается по правилам идентификаторов;

[размер1][размер2] - размерность двухмерного массива, т.е. количество строк и столбцов в массиве, указывается в виде целочисленной константы или константного выражения. Величина - (размер1*размер2) определяет количество ячеек оперативной памяти, зарезервированной для массива.

Например:

а ) float b[3][5];

б) const n=3, m=5; int A[n][m],

где n — количество строк (первая, левая размерность), m — количество столбцов или количество элементов в строке (вторая, правая размерность). Матрица располагается в оперативной памяти и занимает непрерывный участок, объём которой равен

n *m*sizeof(int),

где int — тип элементов матрицы.

Основные действия с двухмерными массивами

I . Инициализация массива. Тот или иной способ инициализации массива используется в зависимости от специфики конкретной задачи.

а) инициализация массива при его описании:

int A[n][m]= {{1, -2, 3, -4, 5},

{ 10, 20, 33, -40},

{-11, 22, 300, 400, 500}};

Если в строке указано меньше элементов, чем требуется, то остальные инициализируются нулями. У нас во второй строке с номером 1 (нумерация и строк, и столбцов начинается с нуля) последний элемент будет нулевым.

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

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

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

cin >>A[i][j];

Но в этом варианте в каждой строке набираем одно число, и не видно, элемент с каким номером вводим. Желательно, чтобы вводимые элементы матрицы на экране располагались так, как в математической записи, то есть элементы строки матрицы должны

вводиться из одной строки экрана. Это можно выполнить, например, следующим образом:

for ( y=wherey(), i=0; i<n; i++, y++)

{ gotoxy(1, y); cout<<"i="<<i;

for (x=5, j=0; j<m; j++, x+=5)

{ gotoxy(x,y);

cin >>A[i][j];

} }

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

Randomize();

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

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

A[i][j]=random(100);

Если по условию задачи требуется, чтобы числа матрицы принадлежали интервалу [r1, r2), где r2>r1, то в цикле следует записать A[i][j]=random(r2-r1)+r1; Этот метод можно использовать при отладке программы, если на элементы матрицы нет ограничений.

д) Элементы матрицы можно задать также по некоторому специальному правилу (закону), например:

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

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

A[i][j]=(i+1)*(j+1);

Сформированную так матрицу для некоторых задач легче анализировать.

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

II . Вывод матриц.

а) Простой вывод в виде таблицы можно выполнить, используя два цикла for для вывода элементов первой строки, затем второй и т.д.

Кроме этого можно предложить следующий вариант вывода:

cout <<”\n”;

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

{     printf("\n"); // Переход на новую строку экрана.

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

printf ("%5 d ", A [ i ][ j ]);

}

При таком выводе числа столбцов будут выровнены благодаря наличию формата %5d, т. е. независимо от размерности чисел они будут выводиться друг под другом. Напомним, что для вещественных чисел необходимо указать, например, формат %7.2f. В этом фрагменте важно место оператора printf ("\n"). Если символ “\n” записать во внутреннем цикле (printf ("\n%5d", A[i][j])), то в каждой строке экрана будет выводиться по одному числу. Необходимо также обратить внимание на расстановку фигурных скобок.

Иногда для наглядности целесообразно элементы матрицы в зависимости от условия выводить разным цветом. Например, положительные числа вывести цветом C1 на фоне C2, а отрицательные и нулевые — наоборот, цветом С2 на фоне С1, где С1 и С2 — целые числа, определяющие цвет. Это реализуется, например, следующим образом:

void MyColors ( int C 1, int C 2)//пользовательская функция для задания цвета

{ textcolor(C1);

textbackground (C2); }

void  main()

{ textbackground(3); clrscr(); // Очищает и закрашивает экран

const n=4,m=6; float A[n][m];

// Пример формирования вещественной матрицы

// случайным образом

randomize();

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

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

A[i][j]=(random(50)-40)/100. + random(5);

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

{ cout<<endl; // Переход на новую строку экрана.

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

{ if (A[i][j]>0) MyColors(2,15); // Изменение цветов

else MyColors(15,2);

cprintf ("%7.2f", A[i][j]);

}

} getch();

}

Типы алгоритмов на обработку матриц (двухмерных массивов)

Ввиду многообразия задач по рассматриваемой теме сделана попытка классификации некоторых простых матричных задач.

Построчная обработка

К такому типу относятся задачи, в которых для каждой строки матрицы требуется найти её некоторый параметр. Таким параметром может быть, например, сумма, количество всех элементов строки или элементов с некоторым условием, наименьший (наибольший) элемент среди всех или части элементов строки и т. д. К этому классу можно отнести и задачи типа “есть ли нуль в строке матрицы?”. Их особенность в том, что не обязательно надо анализировать все элементы строки.

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

Дата: 2018-12-28, просмотров: 257.