Você está na página 1de 27

Matrizes

INF1005 Programao I 33B


Prof. Gustavo Moreira
gmoreira@inf.puc-rio.br

matrizes

tpicos
declarao (alocao esttica)
operaes com matrizes

referncia
Captulo 8 da apostila
Captulo 6 do livro

vetores bidimensionais: matrizes


declarando com [linhas] e [colunas]:
152

float m[4][3];
6.0

j inicializando:

linha 4

float m[4][3] = {
{5.0, 10.0,
{2.0, 2.0,
{3.0, 4.0,
{5.0, 5.0,
};

5.0

9.0},
3.0},
5.0},
6.0}

m[3] [0]
linha 3

5.0
4.0
3.0

m[2] [0]
linha 2

coluna j

5.0

3.0
2.0
2.0

linha i

m[2][1]

5.0

10.0

9.0

2.0

2.0

3.0

3.0

4.0

5.0

5.0

5.0

6.0

m[1] [0]
linha 1

9.0
10.0
5.0

104

m[0][0]
3

vetores bidimensionais: matrizes

outras formas de inicializar a mesma matriz:


float m[4][3] =
{5.0, 10.0, 9.0, 2.0, 2.0, 3.0, 3.0, 4.0, 5.0, 5.0, 5.0, 6.0};
float m[ ][3] =
{5.0, 10.0, 9.0, 2.0, 2.0, 3.0, 3.0, 4.0, 5.0, 5.0, 5.0, 6.0};

5.0

10.0

9.0

2.0

2.0

3.0

3.0

4.0

5.0

5.0

5.0

6.0
4

passando matriz alocada estaticamente


para funes
prottipos de funes que recebem matrizes:
void imprime_matriz (int linhas, int cols, float (*mat)[3]);

ou
void imprime_matriz (int linhas, int cols, float mat[ ][3]);

void imprime_matriz (int linhas, int colunas, float mat[ ][3])


{
int i, j;
for (i=0; i < linhas; i++)
for (j=0; j < colunas; j++)
printf("linha %d, coluna %d: elemento %f\n", i, j, mat[i][j]);
}

exerccios

1.

EX. 01

Considerando que a matriz abaixo representa um conjunto de


3 notas de 4 alunos, escreva um programa que calcule e
imprima a mdia de cada aluno e a mdia da turma.
float m[4][3] =
{5.0, 10.0, 9.0, 2.0, 2.0, 3.0, 3.0, 4.0, 5.0, 5.0, 5.0, 6.0};

2.

Modifique o programa para ler do teclado a posio" de um


aluno (de 1 a 4) e imprimir a sua mdia. O programa deve
continuar lendo nmeros de aluno at que um nmero invlido
seja fornecido pelo usurio.

3.

Modifique o programa anterior para ler as notas dos alunos de


um arquivo notas.txt.

exerccio

EX. 02

Escreva uma funo que receba uma matriz quadrada NxN e


verifique se ela simtrica. A funo deve retornar 1 caso a matriz
seja simtrica; ou 0, caso contrrio. Considere que N foi definido
da seguinte maneira:
#define N 4
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
7

exerccio

EX. 02

Escreva uma funo que receba uma matriz quadrada NxN e


verifique se ela simtrica. A funo deve retornar 1 caso a matriz
seja simtrica; ou 0, caso contrrio. Considere que N foi definido
da seguinte maneira:
#define N 4
int simetrica (double mat[ ][N])
{
int i, j;
for (i=0; i < N; i++) {
for (j=0; j < i; j++) {
if (mat[i][j] != mat[j][i]) {
return 0;
}
}
}
return 1;
}

exerccio

EX. 03

Escreva uma funo que calcule a transposta de uma matriz


quadrada NxN. Considere que N foi definido da seguinte maneira:
#define N 4
void cria_transposta(double orig[][N], double transp[][N])
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
9

exerccio

EX. 03

Escreva uma funo que calcule a transposta de uma matriz


quadrada NxN. Considere que N foi definido da seguinte maneira:
#define N 4
void cria_transposta(double orig[][N], double transp[][N])
{
int i, j;
for (i=0; i < N; i++) {
for (j=0; j < N; j++) {
transp[j][i] = orig[i][j];
}
}
}

10

exerccio

EX. 04

Assumindo que no haja espao alocado para uma segunda


matriz, escreva uma funo que transponha uma matriz quadrada
NxN, sobrescrevendo a matriz original. Considere que N foi
definido da seguinte maneira:
#define N 4
void transpoe(double mat[][N])
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
11

exerccio

EX. 04

Assumindo que no haja espao alocado para uma segunda


matriz, escreva uma funo que transponha uma matriz quadrada
NxN, sobrescrevendo a matriz original. Considere que N foi
definido da seguinte maneira:
#define N 4
void transpoe(double mat[][N])
{
int i, j;
for (i=0; i < N; i++) {
for (j=0; j < i; j++) {
double t = mat[i][j];
mat[i][j] = mat[j][i];
mat[j][i] = t;
}
}
}

12

exerccio

EX. 05

Escreva uma funo que multiplique uma matriz quadrada NxN por
um escalar. Considere que N foi definido da seguinte maneira:
#define N 4
void mat_mult_escalar (double orig[][N], double mult[][N], double valor)
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
13

exerccio

EX. 05

Escreva uma funo que multiplique uma matriz quadrada NxN por
um escalar. Considere que N foi definido da seguinte maneira:
#define N 4
void mat_mult_escalar (double orig[][N], double mult[][N], double valor)
{
int i, j;
for (i=0; i < N; i++) {
for (j=0; j < N; j++) {
mult[i][j] = valor * orig[i][j];
}
}
}

14

exerccio

EX. 06

Escreva uma funo que multiplique uma matriz NxN por um vetor
de tamanho N. Considere que N foi definido da seguinte maneira:
#define N 4
void mat_mult_vetor (double mat[][N], double orig[], double mult[])
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
15

exerccio

EX. 06

Escreva uma funo que multiplique uma matriz NxN por um vetor
de tamanho N. Considere que N foi definido da seguinte maneira:
#define N 4
void mat_mult_vetor (double mat[][N], double orig[], double mult[])
{
int i, j;
for (i=0; i < N; i++) {
mult[i] = 0.0;
for (j=0; j < N; j++) {
mult[i] = mult[i] + mat[i][j] * orig[j];
}
}
}

16

exerccio

EX. 07

Escreva uma funo que multiplique duas matrizes NxN. Considere


que N foi definido da seguinte maneira:
#define N 4
void mat_mult_matriz (double a[][N], double b[][N], double c[][N])
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
17

exerccio

EX. 07

Escreva uma funo que multiplique duas matrizes NxN. Considere


que N foi definido da seguinte maneira:
#define N 4
void mat_mult_matriz (double a[][N], double b[][N], double c[][N])
{
int i, j, k;
for (i=0; i < N; i++) {
for (j=0; j < N; j++) {
c[i][j] = 0.0;
for (k=0; k < N; k++) {
c[i][j] = c[i][j] + a[i][k] * b[k][j];
}
}
}
}

18

matrizes dinmicas
C s permite alocao dinmica de conjuntos unidimensionais
cria-se uma abstrao conceitual de matriz

para uma matriz mat de dimenses m x n, cria-se um


vetor vmat
dimenso do vetor vmat: m * n
float *vmat;
vmat = (float *) malloc (m * n * sizeof(float));

elemento mat[i][j] passa a ser o elemento vmat [ i * n + j]

19

matriz como vetor de ponteiros


cada elemento armazena o endereo do primeiro
elemento de cada linha

int i;
float **mat; /* vetor de ponteiros */
/* aloca vetor de m ponteiros */

mat = (float**) malloc (m*sizeof(float*));


/* aloca vetor de n elementos (colunas) em cada
linha */

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


mat[i] = (float*) malloc(n*sizeof(float));
20

operaes com matrizes

transposta de matriz representada como vetor simples


/* Soluo 1: matriz m x n alocada como vetor simples */
float* transposta (int m, int n, float* mat)
{
int i, j;
float* trp;
/* aloca matriz transposta com n linhas e m colunas */
trp = (float*) malloc (n * m * sizeof(float));
/* preenche
for (i=0; i
for (j=0;
trp[

matriz */
< m; i++)
j < n; j++)
j * m + i ] = mat[ i * n + j ];

return trp;
}

21

operaes com matrizes


transposta de matriz representada como vetor de
ponteiros
/* Soluo 2: matriz alocada como vetor de ponteiros */
float** transposta (int m, int n, float** mat)
{
int i, j;
float** trp;
/* aloca matriz transposta com n linhas e m colunas */
trp = (float**) malloc (n * sizeof(float*));
for (i=0; i<n; i++)
trp[i] = (float*) malloc(m * sizeof(float));
/* preenche matriz */
for (i=0; i<m; i++)
for (j=0; j<n; j++)
trp[ j ] [ i ] = mat[ i ][ j ];
return trp;
}

22

operao com matrizes transposta


/* Soluo 1: matriz m x n alocada como
vetor simples */

/* Soluo 2: matriz m x n alocada como


vetor de ponteiros */

float* transposta (int m, int n, float* mat)


{
int i, j;
float* trp;

float** transposta (int m, int n, float** mat)


{
int i, j;
float** trp;

/* aloca matriz transposta com


n linhas e m colunas */
trp = (float*) malloc (n * m *
sizeof(float));

/* aloca matriz transposta com


n linhas e m colunas */
trp = (float**) malloc (n * sizeof(float*));
for (i=0; i<n; i++)
trp[i] = (float*) malloc(m *
sizeof(float));

/* preenche matriz */
for (i=0; i < m; i++)
for (j=0; j < n; j++)
trp[ j * m + i ] = mat[ i * n + j ];

/* preenche matriz */
for (i=0; i<m; i++)
for (j=0; j<n; j++)
trp[ j ] [ i ] = mat[ i ][ j ];

return trp;

return trp;
}

23

matrizes simtricas

matriz n x n, onde mat[i][j] = mat [j][i]


em vez de armazenar n2 valores, pode-se
armazenar apenas os valores da diagonal e
1
2
3
abaixo dela

s = 1 + 2 + 3 + ... + n =

4
n (n + 1)
2

24

matrizes simtricas

para acessar o elemento mat[i][j], precisamos


pular 1+2+...+i elementos para acessar a linha
i e mais j para acessar a coluna
1

mat[i][j]
mat[2][1]

i = 2, j = 1

s = 1 + 2 + 3 + ... + n =

4
n (n + 1)
2

v[i*(i+1)/2+j]
v[4]

k = i*(i+1)/2 + j
k=4
25 25

matrizes simtricas
/* Soluo 1: matriz alocada como vetor simples
*/
float* cria (int n)
{
int s = n*(n+1)/2;
float* mat = (float*)
malloc(s*sizeof(float));
return mat;
}

float acessa (int n, float* mat, int i, int j)


{
int k; /* ndice do elemento no vetor */
if (i<0 || i>=n || j<0 || j>=n) {
printf("Acesso invlido!\n);
exit(1);
}
if (i >= j) /* se estiver na diagonal ou
abaixo */
/* acessa elemento representado */
k = i*(i+1)/2 + j;
else
/* acessa elemento simtrico */
k = j*(j+1)/2 + i;
return mat[k];
}

/* Soluo 2: matriz alocada como vetor de


ponteiros */
float** cria (int n)
{
int i;
float** mat = (float**)
malloc(n*sizeof(float*));
for (i=0; i<n; i++)
mat[i] = (float*)
malloc((i+1)*sizeof(float));
return mat;
}
float acessa (int n, float** mat, int i, int j)
{
if (i<0 || i>=n || j<0 || j>=n) {
printf("Acesso invlido!\n);
exit(1);
}
if (i >= j) /* se estiver na diagonal ou
abaixo */
/* acessa elemento representado */
return mat[ i ] [ j ];
else
/* acessa elemento simtrico */
return mat[ j ][ i ];
}
26

dvidas?
Prof. Gustavo Moreira
gmoreira@inf.puc-rio.br

27

Você também pode gostar