Глава 8. Матрицы. Многомерные массивы



В Си определены и многомерные массивы. Двумерный массив (матрицу) можно объявить так:

тип имя_переменной [ n ][ m ];

где n – количество строк в матрице(строки нумеруются от 0 до n -1), m – количество столбцов (столбцы нумеруются от 0 до m -1).

Например,

int h[10][15];

Описана матрица h, состоящая из 10 строк и 15 столбцов (строки нумеруются от 0 до 9, столбцы от 0 до 14).

Для обращения к элементу матрицы необходимо указать ее имя, и в квадратных скобках номер строки, а затем в квадратных скобках – номер столбца. Например, h[2][4] – элемент матрицы h, находящийся в третьей строке и пятом столбце.

В Си можно описать многомерные массивы, которые можно объявить с помощью оператора следующей структуры:

тип имя_переменной [ n 1][ n 2]…[ nk ];

Блок-схемы основных алгоритмов обработки матриц

Блок-схема ввода матрицы

Блок-схема вывода матрицы

Свойства матриц

Рассмотрим некоторые свойства матриц:

· если номер строки элемента совпадает с номером столбца (i = j), это означает что элемент лежит на главной диагонали матрицы;

· если номер строки превышает номер столбца (i > j), то элемент находится ниже главной диагонали;

· если номер столбца больше номера строки (i < j), то элемент находится выше главной диагонали.

· элемент лежит на побочной диагонали, если его индексы удовлетворяют равенству i + j 1 = n;

· неравенство i + j + 1 < n характерно для элемента находящегося выше побочной диагонали;

· соответственно, элементу лежащему ниже побочной диагонали соответствует выражение i + j + 1 > n.

 

 

Найти сумму элементов матрицы, лежащих выше главной диагонали

 

 

 

#include "stdafx.h"

#include <stdio.h>

void main(int argc, char* argv[])

{

float b,a[20][20],s;

int i,j,n,m;

printf("n=");scanf("%d",&n);

printf("m=");scanf("%d",&m);

printf("\n Vvedite A \n");

for(i=0;i<n;i++)

for(j=0;j<m;j++)

{

scanf("%g",&b);

a[i][j]=b;

}

printf("\n Matrica A\n");

for(i=0;i<n;i++)

{

for(j=0;j<m;j++)

printf("%g\t",a[i][j]);

printf("\n");

}

for(s=0, i=0;i<n;i++)

for(j=0;j<m;j++)

if (i<j) s+=a[i][j];

printf("\nS=%g\n",s);

}

 

Поиск максимального элемента и его индексов

 

Динамические матрицы

Й способ работы с динамическими матрицами.

При работе с динамическими матрицами следует помнить, что выделенный участок памяти под матрицу A(N,M) представляет собой участок памяти размером NxM элементов.

A=( тип *) calloc(n*m, sizeof( тип ))

или

A=( тип *) malloc(n*m*sizeof( тип ))

Поэтому для обращения к элементу Ai,j необходимо, но номеру строки i и номеру столбца j вычислить номер этого элемента k в динамическом массиве. Учитывая, то что в массиве элементы нумеруются с нуля k=i.M+j.

a[i][j] *(a+i*m+j)

ЗАДАЧА 1. Вычислить количество положительных элементов квадратной матрицы, расположенных по ее периметру и на диагоналях.

#include "stdafx.h"

#include <iostream.h>

#include <malloc.h>

int main(int argc, char* argv[])

{

float *a;

int i,j,n,k=0;

cout<<"n="; cin>>n;

cout<<"Vvod matrici"<<endl;

a=(float *)calloc(n*n,sizeof(float));

for(i=0;i<n;i++)

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

cin>>*(a+i*n+j);

cout<<"Matrica"<<endl;

for(i=0;i<n;i++)

{

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

cout<<*(a+i*n+j)<<"\t";

cout<<endl;

 }

for(i=0;i<n;i++)

{

if (*(a+i*n+i)>0) k++;

if( *(a+i*n+n-i-1)>0) k++;

}

cout<<"k="<<k<<endl;

for(i=1;i<n-1;i++)

{

if (*(a+0*n+i)>0 ) k++;

if (*(a+i*n+0)>0) k++;

if (*(a+(n-1)*n+i)>0) k++;

if (*(a+i*n+n-1)>0) k++;

}

cout<<"k="<<k<<endl;

if (n%2!=0 && *(a+(n-1)/2*n+(n-1)/2)>0) k--;

cout<<"k="<<k<<endl;

free(a);

return 0;

}


Дата добавления: 2019-09-13; просмотров: 718; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!