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

4.1.8Заполнение матрицы случайными числами

Для заполнения матрицы псевдослучайными числами можно создать функцию, генерирующую числа из произвольного диапазона. Все-таки, хорошо знакомая нам функция rand() генерирует числа только из диапазона от 0 до 32767.

Ограничить диапазон можно с помощью взятия остатка от деления:

int rnum = rand()%100;

Число rnum будет псевдослучайным из диапазона от 0 до 99. Сместить диапазон можно посредством прибавления минимально желаемого значения. Например,

int r = rand()%100 - 20;

Теперь rnum будет псевдослучайным числом из диапазона от -20 до 79. Реализуем описанные действия в виде функции:

int rnd(int min, int max) {

return rand()%(max-min) + min;

}

Чтобы псевдослучайная последовательность всегда была разной, следует задать начальное значение при помощи функции srand() из библиотеки time.h и передать в нее, например, текущее время; тем самым получится аналог процедуры randomize() в Паскале.

void randomize() {

srand(time(0));

}

С использованием созданных функций rnd() и randomize() заполнение матрицы псевдослучайными числами (рис. 24) будет выглядеть так:

randomize();

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

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

matrix[i][j] = rnd(-99, 100);

}

}

Рисунок 24. Матрица, заполненная псевдослучайными числами

4.1.9Заполнение матрицы с условием

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

Для решения задачи нужно понять, как отличить, принадлежит ли элемент одной из диагоналей или нет. Главная диагональ задается условием, что номер строки равен номеру столбца: i==j; для побочной диагонали условие следующее: i==size-j-1. Единица отнимается из-за того, что индексация элементов начинается с нуля, а не с единицы. Результат будет таким (рис. 25):

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

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

if (i==j || i==size-j-1) {

matrix[i][j] = 0;

} else {

matrix[i][j] = rnd(-9, 10);

}

}

}

Рисунок 25. Матрица, в которой на диагоналях расположены нули

4.1.10Обработка матрицы

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

int sum = 0;

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

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

sum += matrix[i][j];

}

}

Поиск максимального элемента матрицы имеет следующий вид:

int max = 0;

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

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

if (max < matrix[i][j]) {

max = matrix[i][j];

}

}

}

4.1.11Обработка строк и столбцов

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

int sum = 0;

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

sum += matrix[0][j];

}

А теперь вычислим суммы элементов во всех строках (рис. 26):

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

int sum = 0;

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

sum += matrix[i][j];

}

cout << "Строка " << i << " ";

cout << "Сумма = " << sum << endl;

}

Рисунок 26. Вычисление суммы элементов построчно

Вычислить сумму элементов всех столбцов можно так (рис. 27):

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

int sum = 0;

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

sum += matrix[i][j];

}

cout << "Столбец " << j << " ";

cout << "Сумма = " << sum << endl;

}

Рисунок 27. Вычисление суммы элементов по столбцам

В этом примере цикл по i находится внутри, поскольку вначале нужно пробежаться по элементам столбца, а потом – по столбцам (используя переменную j).