- •Тема 9. Матрицы Понятие матрицы
- •Матрицы в программировании
- •Инициализация матрицы
- •Вывод матрицы на экран
- •Вывод ровных столбцов матрицы
- •Заполнение матрицы
- •Работа с матрицей заранее не известного размера
- •Немного о генерации псевдослучайных чисел
- •Заполнение матрицы случайными числами
- •Обработка матрицы
- •Заполнение матрицы с условием
- •Обработка строк и столбцов по отдельности
- •Комбинированная обработка матрицы
Вывод ровных столбцов матрицы
Рассмотрим одну тонкость, связанную с выводом матриц, да и всех прочих таблиц. Изменим немного инициализацию матрицы:
const int m = 4, n = 5;
int matrix[m][n] = {
{1, 20, 50, 40, 3},
{5, 68, 7, 4, 60},
{1, 2, 57, 4, 3},
{9, 8, 7, 6, 0},
};
Затем выведем её на экран при помощи созданного выше кода и увидим, что столбцы матрицы окажутся неровными:
Эта проблема возникает из-за того, что некоторые элементы матрицы занимают одну позицию, а другие – две. Консольные шрифты являются моноширинными (ширина каждого символа одна и та же), поэтому для того, чтобы столбцы выводились ровно, нужно сделать так, чтобы ширина поля как-то дополнялась пробелами, если символ всего один.
Для этого существуют так называемые модификаторы вывода. Некоторые модификаторы называются флагами форматирования. В настоящий момент нас интересует модификатор, позволяющий задать ширину поля, которое отводится под выводимое значение. Он задаёт минимальную ширину поля, в которое выводится значение.
for (int i=0; i<m; i++) {
for (int j=0; j<n; j++) {
cout.width(2);
cout << matrix[i][j] << " ";
}
cout << endl;
}
По умолчанию пустые клетки заполняются пробелами, однако с помощью функции fill() можно задать любой другой:
for (int i=0; i<m; i++) {
for (int j=0; j<n; j++) {
cout.fill('*');
cout.width(2);
cout << matrix[i][j] << " ";
}
cout << endl;
}
Наконец, выравнивание ячеек можно задать по левому краю:
for (int i=0; i<m; i++) {
for (int j=0; j<n; j++) {
cout.setf(ios::left);
cout.fill('*');
cout.width(2);
cout << matrix[i][j] << " ";
}
cout << endl;
}
Заполнение матрицы
Заполнение матрицы осуществляется аналогично её выводу: необходимо заполнить элементы во всех строках и столбцах. Делается это при помощи вложенных циклов. Например, следующий фрагмент кода заполняет матрицу одними единицами:
const int size = 5;
int matrix[size][size];
for (int i=0; i<size; i++) {
for (int j=0; j<size; j++) {
matrix[i][j] = 1;
}
cout << endl;
}
Обратите внимание, что в данном случае матрица является квадратной, поскольку количество строк и столбцов одинаково.
Работа с матрицей заранее не известного размера
До настоящего момента мы задавали размер матрицы в виде константы, однако встаёт вопрос: «Что делать, если размер матрицы заранее не известен?» Подобная ситуация возникает, например, если размер матрицы требуется ввести с клавиатуры. В таком случае следует выделить память под матрицу с запасом, а фактический размер ввести с клавиатуры:
const int max_size = 100;
int matrix[max_size][max_size];
int size;
cout << "Enter matrix size:" << endl;
cin >> size;
for (int i=0; i<size; i++) {
for (int j=0; j<size; j++) {
matrix[i][j] = 1;
}
}
for (int i=0; i<size; i++) {
for (int j=0; j<size; j++) {
cout << matrix[i][j] << " ";
}
cout << endl;
}