Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
л_15_Массивы_алгоритмы.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
205 Кб
Скачать
☆

Построение матриц

Элементы матрицы можно задать по некоторому специальному правилу в зависимости от ее индексов. Например:

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