Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Языки программирования (пособие).doc
Скачиваний:
6
Добавлен:
01.07.2025
Размер:
965 Кб
Скачать
☆

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

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

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},

};

Вывод такой матрицы на экран приведен к тому, что столбцы окажутся неровными (рис. 18). Эта проблема возникает из-за того, что некоторые элементы матрицы занимают одну позицию, а другие – две. Консольные шрифты являются моноширинными (ширина каждого символа одна и та же), поэтому для того, чтобы столбцы выводились ровно, нужно сделать так, чтобы ширина поля как-то дополнялась пробелами, если символ всего один.

Рисунок 18. Матрица с элементами из разного числа знаков; столбцы оказываются неровными

Для этого существуют так называемые модификаторы вывода. В настоящий момент нас интересует модификатор, позволяющий задать ширину поля, которое отводится под выводимое значение (рис .19).

for (int i=0; i<m; i++) {

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

cout.width(2);

cout << matrix[i][j] << " ";

}

cout << endl;

}

Рисунок 19. Использование модификатора ширины поля позволяет отображать столбцы ровными

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

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;

}

Рисунок 20. Заполнение пустых позиций символом "звездочка"

Наконец, выравнивание ячеек можно задать по левому краю (рис. 21):

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;

}

Рисунок 21. Выравнивание текста в ячейках по левому краю

4.1.6Заполнение матрицы в автоматическом режиме

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

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;

}

Рисунок 22. Матрица, заполненная единицами

4.1.7Работа с матрицей заранее не известного размера

До настоящего момента мы задавали размер матрицы в виде константы, но что делать, если размер матрицы заранее не известен, например, он должен быть задан пользователем. В таком случае следует выделить память под матрицу с запасом, а фактический размер задать через переменную (рис. 23):

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;

}

Рисунок 23. Заполненная единицами матрица, размер которой вводит пользователь