MC102 - Algoritmos e Programação de
Computadores
12ª Aula - Matrizes
Amanda Meincke Melo
Instituto de Computação/Unicamp
1º Sem/2005
Roteiro
Vetores (Exemplos)
Matrizes
Leituras Complementares
15/04/2005
2/34
Vetores
O que estes programas fazem?
(em papel)
15/04/2005
3/34
Matrizes
Estrutura bastante conhecida
Uma Definição em Álgebra Linear:
“Uma matriz é um agrupamento retangular de
números. Os números neste agrupamento
são chamados entradas da matriz.” (Howard
e Rorres, 2001:41)
15/04/2005
4/34
1º Exemplo Prático :-)
Você precisa organizar melhor seu tempo
para conseguir estudar todas as
disciplinas da faculdade e não ficar
sobrecarregado(a) no período de provas.
Para ajudá-lo(a) nesta tarefa, um amigo
sugeriu que você contabilize as horas que
tem dedicado para estudar cada disciplina
(fora da sala de aula) em uma grade
Disciplina X Dia da Semana.
15/04/2005
5/34
Disciplina X Dia da Semana
Seg
Ter
Q ua
Q ui
Sex
Sab D om
D1
D2
D3
D4
D5
D6
15/04/2005
6/34
Organizada a grade, seu amigo o
questionou:
Qual o dia da semana em que você está
mais sobrecarregado?
Qual o dia da semana em que você está
menos sobrecarregado?
Em média, quantas horas você tem
estudado por dia?
E nos finais de semana?
Quantas horas por semana você tem
dedicado para estudar cada disciplina?
15/04/2005
7/34
Para qual disciplina você tem dedicado mais
tempo de estudo? Quanto tempo?
Para qual disciplina você dedicado menos
tempo de estudo? Quanto tempo?
...
Tem sobrado tempo para você conseguir
dormir, pelo menos, 6 horas por dia?
Tem sobrado tempo para algum lazer?
Finalmente, como você tem utilizado seu
tempo?
15/04/2005
8/34
Só com este exemplo já dá para perceber
o potencial de modelar um problema
utilizando matrizes
Existem outros tantos no mundo real!
15/04/2005
9/34
2º Exemplo Prático
Pesquisa de Campo (Exemplo 4/Aula 11)
Seu programa o(a) ajuda a tabular os
seguintes dados, relacionados a cada
entrevistado
Sexo
Idade
Altura
Peso
15/04/2005
10/34
Entrevistados X Dados
S exo
Id a d e
A ltu ra
Peso
E1
E2
...
E N -1
EN
15/04/2005
11/34
Seu programa também o(a) ajuda a obter
as seguintes informações:
Total de entrevistados
Dados de um determinado entrevistado
Dados do entrevistado mais jovem
Dados do entrevistado mais velho
Se existem entrevistados menores de idade
Se existem entrevistados com 60 anos ou
mais
15/04/2005
12/34
Número de mulheres entrevistadas
Número de homens entrevistados
Altura média das mulheres
Altura média dos homens
Altura média dos entrevistados
Peso médio das mulheres
Peso médio dos homens
Peso médio dos entrevistados
...
15/04/2005
13/34
Outro Exemplo
Realizar operação com Matrizes
Identificar se duas matrizes são iguais
Somar e subtrair matrizes
Multiplicar uma matriz por um escalar
Calcular a combinação linear de matrizes
Multiplicar duas matrizes
Determinar se um produto entre matrizes está
definido
Particionar matrizes
...
15/04/2005
14/34
Matrizes em programação
Tipo de dado usado para representar uma
certa quantidade de dados na memória de
tipo homogêneo (de mesmo tipo),
utilizando o mesmo identificador
Um vetor, por exemplo, pode ser
considerado um tipo de dado matriz,
entretanto, unidimensional
15/04/2005
15/34
Matrizes
Veremos
Como este tipo de dado representa a
memória
Como este tipo de dado é representado pela
linguagem C
Como acessar cada elemento de uma matriz
de forma precisa
15/04/2005
16/34
Representação da Memória
Cada elemento de uma matriz fica
disposto seqüencialmente na memória
(alocação seqüencial), entretanto, para
facilitar o entendimento podemos
representá-la visualmente de outra
maneira
A próxima transparência ilustra uma
matriz bidimensional mxn, que nos
ajudará a entender como a linguagem C
trata este tipo de dado
15/04/2005
17/34
Representação da linguagem C para
uma Matriz Bidimensional mxn
| | | | ... |
| | | | ... |
| | | | ... |
0
1
2
...
| | | | ... |
m-1
15/04/2005
0
1
2
3
n-1
18/34
Exemplo 1
Vamos resolver parte do 2º Exemplo
Prático para entender como manipular
matrizes com a linguagem C
Os dados precisam ser de tipo
homogêneo
Para começar: que tipo você escolheria para
representar as informações (idade, sexo,
altura, peso) dos entrevistado?
15/04/2005
19/34
Sintaxe C para declaração de uma matriz:
tipo identificador[numero de linhas][numero de colunas];
Declaração
#include <stdio.h>
int main () {
int e = 0; //Auxilia a fazer referência a um entrevistado
int d = 0; //Auxilia a fazer referência aos dados de um entrevistado
int entrevistados[50][4]; /* declaração de uma matriz bidimensional de 50
linhas e 4 colunas: as linhas representam os entrevistados (ex.
entrevistados[0], entrevistados[1], ..., entrevistados[49]), enquanto que as
colunas representam cada dado de um entrevistado: (entrevistados[e][0] é
seu sexo: 0 para sexo feminino e 1 para sexo masculino;
entrevistados[e][1] é sua idade: um inteiro maior que zero;
entrevistados[e][2] é sua altura em centímetros: um inteiro maior que zero;
entrevistas[e][3] é o peso em gramas: um inteiro maior que zero */
/* Código do restante do programa */
return 0;
15/04/2005
}
Na declaração de uma matriz
bidimensional, o número de
linhas e o número de
colunas devem ser uma
constante inteira!
20/34
Declaração (uso de constante)
#include <stdio.h>
#define N_LINHAS 50 //número máximo de entrevistados
#define N_COLUNAS 4
int main () {
int e = 0;
int d = 0;
int entrevistados[N_LINHAS][N_COLUNAS];
/* Código do restante do programa */
return 0;
}
15/04/2005
O número de linhas e o
número de colunas de uma
matriz bidimensional podem
ser dados por uma constante
inteira definida.
21/34
Cuidado!
#include <stdio.h>
int main () {
int e = 0;
int d = 0;
int n_linhas = 50, n_colunas = 4;
int entrevistados[n_linhas][n_colunas];
/* Código do restante do programa */
return 0;
}
15/04/2005
Na declaração, o
valor inteiro para
indicar o número de
linhas ou colunas de
um vetor não pode
estar em uma
variável.
22/34
Referência a uma Entrada
Existe uma sintaxe na linguagem C para
acesso a uma entrada de uma matriz
Para nosso exemplo
entrevistados[0][0] //Sexo do 1º entrevistado
entrevistados[0][1] //Idade do 1º entrevistado
entrevistados[0][2] //Altura do 1º entrevistado
entrevistados[0][3] //Peso do 1º entrevistado
...
entrevistados[49][3] /*Peso do 50º
entrevistado, se for o caso*/
15/04/2005
23/34
Referência a uma Entrada
Podemos usar uma variável inteira para indicar
o índice de uma matriz. Exemplo:
entrevistados[e][0] //Sexo do entrevistado e
entrevistados[e][1] //Idade do entrevistado e
entrevistados[e][2] //Altura do entrevistado e
entrevistados[e][3] //Peso do entrevistado e
entrevistados[e][d] /*Dado do entrevistado e: se d for
0, indica o sexo; se d for 1, indica a idade; se d for 2,
é a altura; se d for 3, indica o peso*/
•Como e e d são variáveis,
precisam ser declaradas
15/04/2005
•Também devem conter valores
válidos no momento em que forem
24/34
utilizadas para indexar a matriz
Referência a uma Entrada
Também podemos utilizar expressões que
resultem em um número inteiro válido. Exemplo:
entrevistados[0][N_COLUNAS - 1] /* Peso do
primeiro entrevistado */
entrevistados[e][d++]
Consideremos que:
•N_COLUNAS é uma constante
inteira que representa número de
colunas da matriz
•e e d são variáveis do tipo inteiro
15/04/2005
25/34
Cuidado!
Os índices de uma matriz devem variar entre 0
(zero) e o número de linhas menos 1 (um), e 0
(zero) e o número de colunas menos 1 (um)
Ao acessar valores inválidos seu programa
pode ser finalizado pelo Sistema Operacional
Voltando ao nosso exemplo...
15/04/2005
26/34
Sintaxe C para referenciar um elemento:
identificador[índice][outro índice];
Referência a uma Entrada
#include <stdio.h>
#define N_LINHAS 50 //número máximo de entrevistados
#define N_COLUNAS 4
int main () {
int e = 0;
int d = 0;
int entrevistados[N_LINHAS][N_COLUNAS];
/* O programa deve:
- ler os dados, organizando-os na matriz
- viabilizar as pesquisas sobre os dados
*/
return 0;
}
15/04/2005
27/34
Pequeno Desafio...
E se você também quisesse guardar o
nome dos entrevistados?
15/04/2005
28/34
Inicialização de Matrizes
Assim como em variáveis e vetores, podemos
atribuir um valor inicial a uma matriz no
momento de sua criação
Exemplo:
int grade[6][7] = {
0, 0, 2, 0, 2, 0, 2,
0, 2, 0, 2, 0, 2, 0,
0, 1, 0, 2, 0, 0, 0,
0, 0, 4, 0, 0, 4, 0,
0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 1, 0, 1, 0
15/04/2005
};
29/34
Exemplo 2
Operação com matrizes
Cálculo da Matriz Transposta
Adição de Matrizes
Multiplicação de Matrizes
15/04/2005
30/34
Matrizes Multidimensionais
Exemplos de declaração:
int C[3][3][3];
float H[4][4][4][4];
Exemplos de acesso a um elemento:
C[0][0][0]
C[2][2][2]
C[i][j][k]
C[i][j][MAX_K-1]
H[0][0][0][0]
H[3][3][3][3]
15/04/2005
Consideremos que:
•i, j e k são variáveis do tipo inteiro
•MAX_K é uma constante inteira o
número máximo de elementos da
dimensão K
31/34
Dica para o Laboratório 06
A tarefa de Laboratório 06 está baseada
no 2º Exemplo Prático
Adapte o programa da aula para obter
também as seguintes informações:
Existe um entrevistado com idade x?
Há quantas mulheres com altura entre 1,60m e
1,80m (exclusive)? Qual a idade e o peso de cada
uma delas?
Qual o peso médio dos homens com mais de 60
anos?
15/04/2005
32/34
Leitura Complementar
C Completo e Total (3ª edição)
Capítulo 4
(disponível no Xerox)
15/04/2005
33/34
Referência
Howard, A.; Rorres C. Álgebra Linear com
Aplicações (trad. Claus Ivo Doering), 8ª
edição, Bookman, Porto Alegre, 2001,
572p.
15/04/2005
34/34
Download

matrizes - Instituto de Computação