Baixe o app para aproveitar ainda mais
Prévia do material em texto
TT214 – Linguagem e Técnica de Programação I 1º Semestre – 2013 Prof. Suelen Mapa de Paula 1 Aula 7 Contatos Suelen Mapa de Paula suelenmapa@gmail.com suelen@dca.fee.unicamp.br Monitor: ??? 2 Ementa da aula Matrizes Bidimensionais Definições Armazenando dados em uma matriz; Lendo dados de uma matriz; Verificação de limites; Inicialização de matrizes; Matrizes N-Dimensionais Exercícios Referências **Parte deste material foi baseado nas aulas do professor Guilherme Coelho, sob a autorização do mesmo. 3 Definição Vimos nas aulas anteriores que a linguagem C é capaz de trabalhar com estruturas de dados chamadas vetores; Vetor: é um conjunto de posições consecutivas de memória, identificadas por um mesmo nome, individualizadas por índices e cujo conteúdo é do mesmo tipo; Exemplo: vetor de inteiros 4 ... int notas[10]; /* declara vetor de inteiros * com 10 posições */ notas[2] = 7; /* atribui o valor 7 à * posição 3 do vetor */ ... Definição Uma matriz pode ser vista como um agrupamento de vários vetores. Ou até mesmo como vetores de vetores; A capacidade de representação e manipulação de matrizes em um programa é muito útil em diversas aplicações, tais como: Armazenamento de imagens, onde cada imagem pode ser considerada uma matriz de pixels; Realização de cálculos envolvendo álgebra linear; Armazenamento de dados de clientes; ... 5 Definição A forma mais simples de uma matriz é a bidimensional, que pode ser vista como uma organização de dados em uma “tabela” com um dado número de linhas e de colunas. Mas também existem matrizes com mais dimensões. 6 Matrizes Bidimensonais Correspondem às matrizes a que estamos acostumados a ver no ensino básico; Exemplo: matriz bidimensional com NLIN linhas e NCOL colunas 7 #define NLIN 80 #define NCOL 100 int main() { int m[NLIN][NCOL]; } • Neste exemplo, m é um vetor de elementos que, por sua vez, são vetores de valores do tipo inteiro. Matrizes Bidimensionais Como declarar um tipo matriz bidimensional? 8 tipo nome_da_matriz [NLIN] [NCOL]; linha coluna Exemplo: float notas [3][6]; char letras [6][100]; int num [5][4]; Quando vamos preencher ou ler uma matriz em C, o índice mais à direita varia mais rapidamente que o índice à esquerda. Armazenando dados 9 #include<stdio.h> void main (){ float notas [3][2]; int l,c,cont; cont=1; for (l=0;l<3;l++){ printf("Digite as notas do aluno %d: ",cont); for (c=0;c<2;c++){ scanf("%f",¬as[l][c]); } cont++; } } Saída 10 Digite as notas do aluno 1: 5.0 6.0 Digite as notas do aluno 2: 9.0 5.0 Digite as notas do aluno 3: 4.0 10.0 Lendo os dados 11 #include <stdio.h> void main(){ float notas [3][2] = {5.0, 6.0,9.0,5.0,4.0,10.0}; int l,c,cont; cont=1; for (l=0;l<3;l++){ printf("Notas do aluno %d: ",cont); for (c=0;c<2;c++){ printf("%.2f \t",notas[l][c]); } cont++; printf("\n"); } } Saída 12 Digite as notas do aluno 1: 5.0 6.0 Digite as notas do aluno 2: 9.0 5.0 Digite as notas do aluno 3: 4.0 10.0 Verificação de limites 13 Cabe ao programador garantir que os índices de uma matriz estão dentro da faixa permitida. Lembre-se também: Ao determinar o tamanho da matriz que armazena strings (variável do tipo char), temos que reservar espaço para o terminador nulo (\0). Portanto, ao declarar o comprimento da string, ele deverá ser no mínimo um caracter maior que o tamanho da string que se pretende armazenar. Ex: char matriz [2][4]={“FPI”, ”Lua”}; Inicialização Da mesma forma que vetores unidimensionais, matrizes também podem ser inicializadas na própria declaração, com os valores colocados entre “{“ “}” e separados por vírgulas; No entanto, é importante notar que cada elemento deste vetor também será um vetor, e deve ser inicializado como tal. E isso pode ser feito de várias maneiras int m1[3][3] = { {0, 1, 2}, {3, 4, 5},{6, 7, 8} }; char nomes [3][10] = {“Joao”,”Maria”,”Jose”}; 14 Valores correspondentes à primeira linha da matriz Valores correspondentes à segunda linha da matriz Valores correspondentes à terceira linha da matriz Por isso a definição de vetores de vetores! Exemplo de aplicação 15 Exemplo de aplicação: soma de matrizes quadradas #include <stdio.h> #define N 20 int main() { int m1[N][N], m2[N][N], m3[N][N]; int l, c, nlin, ncol; printf("Entre com os num de linhas e colunas\n"); scanf("%d %d",&nlin,&ncol); /* nlin e ncol < 20*/ printf("Entre com os elementos da matriz 1\n"); for (l=0; l < nlin; l++) //percorre linhas for (c=0; c < ncol; c++) //percorre colunas scanf("%d",&m1[l][c]); // continua Exemplo de aplicação 16 // continuação: printf("Entre com os elementos da matriz 2\n"); for (l=0; l < nlin; l++) //percorre linhas for (c=0; c < ncol; c++) //percorre colunas scanf("%d",&m2[l][c]); /* soma as matrizes */ for (l=0; l < nlin; l++) for (c=0; c < ncol; c++) m3[l][c] = m1[l][c] + m2[l][c]; // continua Exemplo de aplicação 17 // continuação: /* imprime o resultado */ printf("Resultado: \n"); for (l=0; l < nlin; l++) { for (c=0; c < ncol; c++) printf("%2d ",m3[l][c]); printf("\n"); } return 0; } Matrizes N-dimensionais Pela definição, vimos que uma matriz bidimensional é um vetor cujos elementos são vetores de dados (inteiros, caracteres etc.); Podemos estender esta definição para matrizes N- dimensionais: Tridimensionais: vetores cujos elementos são matrizes bidimensionais (vetores de vetores de dados); Quadridimensionais ... 18 int main() { int m[2][2][3] = {{{1, 2, 3}, {3, 2, 1}}, {{5, 6, 7}, {8, 9, 9}}}; } Matrizes N-dimensionais 19 Ilustração de uma matriz tridimensional: Fonte: http://goo.gl/RQwkQ Linearização de Matrizes Algumas vezes desejamos armazenar matrizes de dados em vetores unidimensionais: Esta é a forma como geralmente matrizes são armazenadas em memória; 20 Linearização de Matrizes Sendo assim, como converter as coordenadas de uma matriz para a posição de um vetor? Suponha uma matriz m bidimensional: Com N_LIN linhas e N_COL colunas; Dados são armazenados linha a linha (da linha 0 até a linha N_LIN-1) sequencialmente no vetor (como figura no slide anterior); O elemento m[l, c] da matriz será armazenado na posição: k = l*N_COL + c; O elemento k do vetor corresponderá ao elemento m[l, c] da matriz, onde: l = k / N_COL c = k % N_COL 21 Linearização de Matrizes Exemplo: N_LIN = 4, N_COL = 4 22 m[1, 1] k = l*N_COL + c k = 1*4+1 = 5 k = 13: l = k/N_COL = 13 / 4 = 3 c = k%N_COL = 13 % 4 = 1 Exercícios ATENÇÃO: Os exercícios de número 1, 2 e 4 deverão ser entregues (em um arquivo .ZIP), via Teleduc, até o dia 04/10/2013. Um deles será sorteado e corrigido. A correção deste exercício, combinada com a correção dos exercícios solicitadosnos demais tópicos, terá nota equivalente a uma atividade do Susy. Estes exercícios devem ser feitos individualmente. 1. Escreva um programa que receba do usuário as dimensões NUM_LIN e NUM_COL (não maiores que 20) e os dados de uma matriz bidimensional, e imprima a matriz transposta na tela. 23 Exercícios 2. Escreva um programa que receba do usuário as dimensões NUM_LIN e NUM_COL (não maiores que 20) e os dados de uma matriz bidimensional, converta-a em um vetor e imprima na tela os valores armazenados neste vetor. 3. Escreva um programa que leia as dimensões e os dados de duas matrizes bidimensionais (com não mais que 20 linhas e 20 colunas) e imprima na tela o resultado da multiplicação destas duas matrizes. Caso as dimensões das duas matrizes não permitam a multiplicação, o usuário deverá ser notificado. 24 Exercícios 4. Escreva um algoritmo que leia um inteiro N (0 ≤ N ≤ 100), correspondente a ordem de uma matriz M de inteiros, e construa a matriz de acordo com o exemplo abaixo. A cada inteiro lido como entrada, deve ser impresso a matriz correspondente, de acordo com o exemplo: 25 Referências MIZRAHI, V. V., Treinamento em Linguagem C – Curso Completo – Módulo 1. 2a Edic ̧a ̃o, Pearson Makron Books, 2005. 26
Compartilhar