Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
9 - Матрицы.docx
Скачиваний:
6
Добавлен:
16.11.2019
Размер:
107.67 Кб
Скачать

Вывод ровных столбцов матрицы

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

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;

}

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