- •Лекция 15 Базовые алгоритмы работы с массивами
- •Обработка матриц
- •Построчная обработка
- •Обработка по столбцам
- •Обработка всей матрицы
- •Обход по «спирали» квадратной матрицы порядка n
- •Обработка части матрицы Обработка элементов главной или побочной диагоналей квадратной матрицы
- •Обработка элементов над(под) главной или побочной диагоналями квадратной матрицы
- •Вставка строки
- •Построение матриц
- •Примеры «Зеркальное отображение» матрицы относительно вертикальной оси, проходящей через ее середину
- •Нахождение минимального элемента матрицы и вычеркивание строки и столбца, на пересечении которых он находится
- •Нахождение сумм элементов квадратной матрицы на главной диагонали и на диагоналях, параллельных главной
- •Умножение матриц
Построение матриц
Элементы матрицы можно задать по некоторому специальному правилу в зависимости от ее индексов. Например:
for (int i=0; i<n; i++)
for (int j=0; j<m; j++)
A[i][j] =(i+1)*(j+1);
При построении матрицы можно использовать одно число. Например, построим матрицу А для заданных значений x и n:
Алгоритм следующий: очередной элемент «периметра матрицы» получаем так: умножаем предыдущий элемент на х и помещаем его в первую и последнюю строки, в первый и последний столбцы. Для этого достаточно одного цикла. Все «центральные» элементы обнуляем.
const n=5;
double x, A[n][n], T;
cin >> x;
A[0][0] = A[n-1][n-1] =1;
T=1;
for (int i=1; i<n; i++)
{T *=x;
A[0][i] = //элементы 0-й строки
A[i][0] = //элементы 0-го столбца
A[n-1][n-1-i] = //элементы (n-1)-й строки
A[n-1-i][n-1] = T; //элементы (n-1)-го столбца
}
for (int i=1; i<n-1; i++)
for (int j=1; j<n-1; j++)
A[i][j]=0;
Матрицу можно построить, используя один или несколько одномерных массивов. Например, задано b[n]. Сформировать матрицу по следующему правилу:
В таких задачах необходимо установить, от чего и как зависят индексы элементов матрицы и, возможно, значения ее элементов. В данном случае зависимость простая, поэтому получаем:
for (int i=0; i<n; i++)
for (int j=0; j<m; j++)
A[i][j]=b[i]+j;
Новую матрицу можно построить на основе одной или нескольких определенных к этому времени матриц. Например, задана матрица C[n][n]. Получим новую матрицу A[n][n] такой же размерности по следующему правилу: положительные числа исходной матрицы увеличим в 2 раза, а отрицательные уменьшим во столько же раз:
for (int i=0; i<n; i++)
for (int j=0; j<m; j++)
{ t=C[i][j];
A[i][j] = t>0 ? t*2: t/2;
}
Заметим, что старая матрица C сохранилась без изменения, а построенная разместилась на новом месте.
Если бы преобразовывалась исходная матрица, а измененные значения сохранялись на том же месте, то необходимо было записать в теле цикла:
{ t=C[i][j];
С[i][j] = t>0 ? t*2: t/2;
}
Примеры «Зеркальное отображение» матрицы относительно вертикальной оси, проходящей через ее середину
#include <iomanip>
#include <stdlib.h>
const int n=3;
const int m=5;
int main ()
{int a[n][m], i, j, x;
for (i=0; i< n; i++)
{for( j=0; j< m; j++)
{a[i][j] = rand();
cout << setw(10)<< a[i][j] << " ";
}
cout << endl;
}
cout <<endl << endl;
for (j=0; j< m/2; j++)
for( i=0; i< n; i++)
{x=a[i][j];
a[i][j] = a[i][m-(j+1)];
a[i][m-(j+1)]= x;
}
for (i=0; i< n; i++)
{for( j=0; j< m; j++)
cout << setw(10) << a[i][j] << " ";
cout << endl;}
_getch();
return 0;
}
Результат:
41 18467 6334 26500 19169
15724 11478 29358 26962 24464
5705 28145 23281 16827 9961
19169 26500 6334 18467 41
24464 26962 29358 11478 15724
9961 16827 23281 28145 5705
