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

Немного о генерации псевдослучайных чисел

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

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

int r = rand()%100;

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

int r = rand()%100 - 20;

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

int rnd(int min, int max) {

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

}

Наконец, реализовать функцию randomize() можно так:

void randomize() {

srand(time(0));

}

Не забудьте подключить библиотеку time.h.

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

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

randomize();

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

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

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

}

}

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

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

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];

}

}

}

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

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

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

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

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);

}

}

}

Если использовать сокращённую форму if-else, то заполнение примет следующий вид:

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

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

matrix[i][j] = (i==j || i==size-j-1) ?

0 : rnd(-9, 10);

}

}

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