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