Você está na página 1de 29

ESTRUTURA DE DADOS

Ricardo de Almeida (ricardo.almeida@univix.edu.br)

Agenda
1.

2.
3. 4.

5.

Relembrando... Alocao Esttica x Alocao Dinmica Vetores Bidimensionais: Matrizes Passagem de Matrizes para Funes Exerccios de Fixao

Relembrando...
Quais pontos foram vistos no ltimo captulo? Vetores.

Passagem de Vetores para Funes.


Alocao Dinmica. Vetores Locais a Funes.

Alocao Esttica x Dinmica


Alocao Esttica x Dinmica

Antes de tratar das construes de matrizes, vamos recapitular


alguns conceitos apresentados com vetores. A forma mais simples de declarar um vetor de inteiros em C mostrada a seguir:
int v[10]; /* Alocao Esttica de um vetor de inteiros */

ou, se quisermos criar uma constante simblica para a dimenso: #define N 10 int v[N]; /* A varivel que representa o vetor uma */ /* constante que armazena o endereo */ /* ocupado pelo primeiro elemento do vetor */

Uma limitao do uso de um vetor declarado estaticamente, seja como varivel global ou local, que precisamos saber de antemo a dimenso mxima do vetor.

Alocao Esttica x Dinmica


Alocao Esttica x Dinmica

Usando Alocao Dinmica, podemos determinar a dimenso do


vetor em tempo de execuo:
int *v; /* Alocao Dinmica de um vetor de inteiros */

v = (int *) malloc (n * sizeof (int)); /* Usando a funo malloc e sizeof */

Nesse fragmento de cdigo, n representa uma varivel com a dimenso do vetor, determinada em tempo de execuo. Aps a

alocao dinmica, acessamos os elementos do vetor da mesma


forma que os elementos de vetores criados estaticamente. Outra diferena importante: com a alocao dinmica, declaramos uma varivel do tipo ponteiro que posteriormente recebe o valor do endereo do primeiro elemento do vetor alocado dinamicamente.

Alocao Esttica x Dinmica


Alocao Esttica x Dinmica

Em tempo de execuo, podemos verificar que a dimenso


escolhida para um vetor tornou-se insuficiente (ou excessivamente grande),e necessitava de um redimensionamento. A funo realloc nos permite realocar um vetor preservando o contedo dos elementos, que permanecem vlidos aps a realocao:
int *v; /* Realocao Dinmica de um vetor de inteiros */
/* Usando a funo realloc */ v = (int *) realloc (v, m * sizeof (int));

Vale salientar que, sempre que possvel, optamos por trabalhar


com vetores criados estaticamente. Eles tendem a ser mais eficientes, j que os vetores alocados dinamicamente tm uma indireo a mais (primeiro acessa o valor do endereo armazenado na varivel ponteiro para depois acessar o elemento do vetor).

Matrizes
Como armazernar 3 notas de 3 alunos?
float aluno1Nota1, aluno1Nota2, aluno1Nota3; float aluno2Nota1, aluno2Nota2, aluno2Nota3; float aluno3Nota1, aluno3Nota2, aluno3Nota3;

Como armazernar 100 notas de 100 alunos?


float aluno1Nota1, aluno1Nota2, aluno1Nota3; float aluno2Nota1, aluno2Nota2, aluno2Nota3;

float aluno3Nota1, aluno3Nota2, aluno3Nota3;


. . . float aluno99Nota1, aluno99Nota2, aluno99Nota3; float aluno100Nota1, aluno100Nota2, aluno100Nota3;

Matrizes
Matriz

Discutimos

no

captulo anterior

construo de

conjuntos

unidimensionais usando vetores. A linguagem C tambm permite a construo de conjuntos bi ou multidimensionais. Neste captulo, discutiremos em detalhes a manipulao de matrizes, representadas por conjuntos bidimensionais de valores numricos. As construes apresentadas aqui podem ser estendidas para conjuntos de dimenses maiores.

Matrizes
Matriz

Uma matriz um arranjo bidimensional ou multidimensional de


alocao esttica e seqencial. A matriz uma estrutura de dados que necessita de um ndice para referenciar a linha e outro para referenciar a coluna para que seus elementos sejam endereados. Da mesma forma que um vetor, uma matriz definida com um tamanho fixo, todos os elementos so do mesmo tipo, cada clula

contm somente um valor e os tamanhos dos valores so os


mesmos (em C, um char ocupa 1 byte e um int 4 bytes).

Matrizes
Declarao de uma Matriz

<tipo> nome [<nmero de linhas>] [<nmero de colunas>];


Ex.: float nota[3][4]; Aps a declarao esttica de uma matriz, a varivel que representa a matriz, nota, representa um ponteiro para o primeiro vetor linha, composto por 3 elementos. Com isto, nota [1] aponta para o primeiro elemento do segundo vetor linha, e assim

por diante.

Matrizes
ndices de uma Matriz

Os elementos da matriz so acessados com indexao dupla.


A primeira posio de uma matriz tem ndice: [0][0]. A ltima posio de uma matriz tem ndice: [<nmero de linhas> - 1] [<nmero de colunas> - 1]

Matrizes
ndices de uma Matriz

Na indexao dupla nota [i][j]; o primeiro ndice, i, acessa a


linha, e o segundo ndice j, acessa a coluna. Como na linguagem C a indexao comea em zero, o elemento final da matriz acessado de acordo com a indexao [i-1][j-1]. Exemplo: float nota [3][4];

Matrizes
Inicializao de uma Matriz

As matrizes podem ser inicializadas na declarao:


float mat [4][3] = {{1,2,3}, {4,5,6}, {7,8,9}, {10,11,12}};

Ou podemos inicializar sequencialmente:


float mat [4][3] = {1,2,3,4,5,6,7,8,9, 10,11,12};

O nmero de elementos por linha pode ser omitido numa

inicializao, mas o nmero de colunas deve ser sempre fornecido.


float mat [ ][3] = {1,2,3,4,5,6,7,8,9, 10,11,12};

Matrizes
Alocao de uma Matriz

Matriz alocada em posies contguas de memria, organizados


linha a linha. Ex.: m = matriz 4 x 3 de reais com 12 elementos.

Matrizes
Exemplo 6.1: Cadastrar as Notas dos Alunos.
/* Exemplo 6.1 Cadastro das Notas dos Alunos */ #include <stdio.h> #include <stdlib.h> int main (void) { int a, n, i, j; float nota[100][100]; /* Solicitar o nmero de Alunos */ printf ("Informe o numero de alunos: "); scanf ("%d", &a); /* Solicitar o nmero de Notas */ printf ("Informe o numero de notas: "); scanf ("%d", &n);

Matrizes
/* Solicita as Notas dos respectivos Alunos */ for (i=0; i<a; i++) for (j=0; j<n; j++) { printf ("Digite a Nota %d, do Aluno %d: ", j+1, i+1); scanf ("%f", &nota [i][j]); } system("PAUSE"); return 0;

Matrizes
Exemplo 6.2: Aps cadastrar as Notas dos Alunos, calcule e apresente suas mdias.
/* Exemplo 6.2 Cadastro das Notas dos Alunos e Clculo das Mdias */ #include <stdio.h> #include <stdlib.h> int main (void) { int a, n, i, j; float media, nota[100][100]; /* Solicitar o nmero de Alunos */ printf ("Informe o numero de alunos: "); scanf ("%d", &a); /* Solicitar o nmero de Notas */ printf ("Informe o numero de notas: "); scanf ("%d", &n); printf ("\n");

Matrizes
/* Solicita as Notas dos respectivos Alunos */ for (i=0; i<a; i++) { media = 0.0; for (j=0; j<n; j++) { printf ("Digite a Nota %d, do Aluno %d: ", j+1, i+1); scanf ("%f", &nota [i][j]); media = media + nota [i][j]; } /* Calcula e Apresenta a Mdia das Notas*/ media = media / n; /* Apresenta a Mdia dos respectivos Alunos */ printf ("A Media do Aluno %d eh: %.2f \n\n", i+1, media);

system("PAUSE"); return 0;

Passagem de Matrizes para Funes


Passagem de Matriz para Funes Uma matriz nada mais do que um vetor bidimensional, ento de

forma anloga, recordemos como era a passagem para funes:

Passagem de Vetor para Funes Consiste em passar o endereo da primeira posio do vetor. Funo deve ter parmetro do tipo ponteiro para armazenar valor Passar um vetor para uma funo equivalente a Passar o

endereo inicial do vetor.


Elementos do vetor no so copiados para a funo. Argumento copiado apenas o endereo do primeiro elemento Chamada a funo passando vetor de int Funo deve ter um parmetro do tipo int *v

Passagem de Matrizes para Funes


Passagem de Matriz para Funes

Uma matriz criada estaticamente representada por um ponteiro


para um vetor linha com o nmero de elementos da linha. Quando passamos uma matriz para uma funo , o parmetro da funo deve ser desse mesmo tipo. Infelizmente, a sintaxe para represent-lo obscura. O prottipo de uma funo que recebe a matriz declarada ser:
void f (..., float (*mat) [3], ...);

Agora relembre e compare como a passagem de vetor


float media (int n, float *v);

Passagem de Matrizes para Funes


Passagem de Matriz para Funes

Uma segunda opo declarar o parmetro como matriz, com a


possibilidade de omitir o nmero de linhas.
void f (..., float mat [ ] [3], ...);

De qualquer modo, o acesso a elementos da matriz dentro da funo feito de forma usual, com indexao dupla.

Exemplo 6.3 de Matrizes:


Faamos o mesmo clculo da mdia, agora com passagem de matrizes para funes por valor, utilizando as funes: le_notas calcula_media

Passagem de Matrizes para Funes


/* Exemplo 6.3 Clculo das Mdias, agora por Funes */ #include <stdio.h> #include <stdlib.h> /* Funo para solicitar as Notas dos Alunos */ void le_notas (int pa, int pn, float pnota[][100]) { int i, j; for (i=0; i<pa; i++) { for (j=0; j<pn; j++) { printf ("Digite a Nota %d, do Aluno %d: ", j+1, i+1); scanf ("%f", &pnota [i][j]); } printf ("\n"); } }

Passagem de Matrizes para Funes


/* Funo para Calcular a Mdia das Notas de um Aluno */ void calcula_media (int pa, int pn, float pnota[][100]) { int i, j; float soma, media; for (i=0; i<pa; i++) { /* Calcula a Mdia dos respectivos Alunos */ soma = 0.0; for (j=0; j<pn; j++) { soma = soma + pnota [i][j]; } media = soma / pn; /* Apresenta a Mdia dos respectivos Alunos */ printf ("A Media do Aluno %d eh: %.2f \n", i+1, media); printf ("\n");

Passagem de Matrizes para Funes


int main (void) { int a, n, i, j; float nota[100][100]; /* Solicita o nmero de Alunos */ printf ("Informe o numero de alunos: "); scanf ("%d", &a); /* Solicita o nmero de Notas */ printf ("Informe o numero de notas: "); scanf ("%d", &n); printf ("\n"); /* Leitura das Notas passando a Matriz como Parmetro por Valor */ le_notas(a, n, nota); /* Clculo da Mdia passando a Matriz como Parmetro por Valor */ calcula_media(a, n, nota); system("PAUSE"); return 0;
for (i=0; i<a; i++) for (j=0; j<n; j++) printf ("A Nota %d, do Aluno %d eh: %.2f \n", j+1, i+1, nota[i][j]);

Exerccios Prticos de Fixao

Exerccios Prticos de Fixao


1 Faamos o mesmo clculo da mdia, executada no Exemplo 6.3, agora com passagem de matrizes para funes por

referncia.
Obs1.: Apresentar bibliografia e exemplos referenciando esta prtica. Obs2.: No utilizar Alocao Dinmica.

Obs3.: Utilizar as mesmas funes do exemplo anterior :


le_notas calcula_media

Matrizes
E como seria para trabalharmos com Alocao Dinmica em Matrizes? o que veremos no prximo captulo, quando discutirmos: Matriz representada por Vetor Simples; Matriz representada por Vetor de Ponteiros; Operaes com Matrizes.

Reviso
Quais pontos foram vistos nesta aula? Alocao Esttica x Alocao Dinmica.

Matrizes.
Passagem de Matrizes para Funes.

ESTRUTURA DE DADOS

Ricardo de Almeida (ricardo.almeida@univix.edu.br)