Baixe o app para aproveitar ainda mais
Prévia do material em texto
CIn.ufpe.br Computação Eletrônica Vetores e Matrizes Prof.: André Tiba akot@cin.ufpe.br Site da disciplina: www.cin.ufpe.br/~hfb/ce CIn.ufpe.br Problema • Como armazenar grandes quantidades de Informações nos programas? – Até agora, vimos construções de programação que permitem guardar uma única informação de cada vez: Variável e constante – Neste caso, a solução seria criar uma variável para cada valor que desejamos armazenar; • Porém, como fazemos se precisarmos armazenar centenas ou milhares de valores? – Criar centenas de variáveis não é uma boa solução, porém hoje veremos como podemos trabalhar de outra forma. CIn.ufpe.br Exemplo • A média aritmética de um conjunto de valores é dada pela seguinte expressão: – O programa abaixo calcula a média aritmética entre cinco valores: Como seria este programa se precisarmos calcular a média entre 200 valores? CIn.ufpe.br Solução: Variáveis compostas homogêneas • Interpretadas como um conjunto (coleção) de valores de um mesmo tipo de dados. • Podem ser: – Unidimensionais – Multidimensionais • Requerem uma sintaxe diferente para serem manipuladas. 4 CIn.ufpe.br Variáveis Compostas Unidimensionais • Vetores (Arrays) – Tipo de dado usado para representar uma coleção de variáveis de um mesmo tipo. – Estrutura de dados homogênea e unidimensional. – Sintaxe: tipo nome_do_vetor[tamanho]; – Tamanho representa o número de elementos; – O índice do vetor varia de 0 a (tamanho - 1); – Ex.: 5 0.0 0.0 0.0 0.0 0.0 Declara um vetor do tipo float com 5 posições CIn.ufpe.br Variáveis Compostas Unidimensionais • São uma coleção de caixinhas, onde cada caixinha armazena uma variável. • Semelhante a uma coleção de gavetas do armário agrupadas. • As variáveis são alocadas sequencialmente na memória, onde o endereço mais baixo corresponde ao primeiro elemento (índice 0) do vetor. • O acesso a cada posição do vetor é realizado utilizando-se seu índice: 6 0.0 0.0 0.0 0.0 0.0 Posições: nota[0] nota[1] nota[2] nota[3] nota[4] Índices: 0 1 2 3 4 CIn.ufpe.br Vetores • Um determinado elemento do vetor pode ser acessado usando o nome do vetor seguido do índice do elemento entre colchetes ([ ]) • A expressão notas[2] se refere ao 3º elemento do array abaixo (contendo o valor 1.9): • A expressão notas[2] representa um local para armazenar um float e pode ser utilizada da mesma forma que uma variável do tipo float. 2.5 3.2 1.9 4.1 2.0 notas[2] CIn.ufpe.br Vetores • Exemplo com o uso de vetores: Ler a nota de 5 alunos de uma disciplina e calcular a média. 8 Declara um vetor de 5 posições. Armazena o valor lido na i-ésima posição. Acessa o valor da i-ésima posição. CIn.ufpe.br Vetores e seus limites • Cuidado! Apesar do vetor do exemplo possuir cinco posições, o índice da última posição é 4 e acessar notas[5] causa falha de memória. • Ao utilizar o índice para referenciar um elemento do vetor, este índice deve permitir o acesso a um elemento válido (em um endereço da memória alocado para o vetor); • Índice deve variar de 0 a tamanho-1; • C não avisa quando o limite de um vetor é excedido! • Se o programador transpuser o fim do vetor durante a operação de atribuição, os valores serão armazenados em outros dados ou mesmo no código do próprio programa; 9 O programador tem a responsabilidade de verificar o limite do vetor! CIn.ufpe.br Vetores e seus limites • O acesso fora dos limites é um erro comum de programação no uso de vetores dentro de laços; – Deve-se prestar atenção na parte de teste do laço: 10 Deveria ser: i < 20 Onde está o erro? A posição pares[20] está fora do vetor! CIn.ufpe.br Vetores e seus limites 11 Compilador não acusa erros a soma deveria ter dez parcelas CIn.ufpe.br Vetores e seus limites 12 Saída correta do programa CIn.ufpe.br Vetores • A inicialização de vetores é realizada da seguinte forma: {expressões}, onde expressões representam expressões de tipos válidos separadas por vírgulas; • Vetores podem ser inicializados na declaração: • Ou, simplesmente: 13 Vetores só podem ser inicializados dessa forma em sua declaração! CIn.ufpe.br Vetores • No caso de utilizar inicializadores de vetores, note que: – Quando não especificado o tamanho, o compilador aloca espaço suficiente para armazenar todos os valores contidos na inicialização; • Quando o tamanho for especificado e houver a lista de inicialização: – Se há menos inicializadores que o tamanho especificado, os outros serão zero; ex: int v[5] = {2,7,3,1}; – Mais inicializadores que o necessário implica em um warning ex: int v[5] = {2,7,3,1,4,9}; 14 2 7 3 1 0 v[0] v[1] v[2] v[3] v[4] 2 7 3 1 4 v[0] v[1] v[2] v[3] v[4] CIn.ufpe.br Vetores • No caso de utilizar inicializadores de vetores, note que: – Quando não especificado o tamanho, o compilador aloca espaço suficiente para armazenar todos os valores contidos na inicialização; ex: int v[ ] = {2,7,3,1}; • Quando o vetor não for inicializado, o tamanho deve ser especificado na declaração ex: int v[4]; 15 2 7 3 1 v[0] v[1] v[2] v[3] CIn.ufpe.br Vetores • Em ‘C’, não existe declaração de vetor utilizando variáveis como tamanho. • O tamanho de um vetor tem que ser determinado em tempo de compilação, portanto deve ser utilizado um valor literal não uma variável. • Exemplo: • É possível fazer algo semelhante utilizando alocação dinâmica, assunto que será visto posteriormente. 16 Erro! nAlunos é desconhecido em tempo de compilação CIn.ufpe.br Vetores • Porém, pode-se utilizar constantes: 17 Altamente recomendável, pois facilita a legibilidade e a manutenção do código. Se for preciso aumentar o número de alunos basta modifica-lo em um local. CIn.ufpe.br Vetores como parâmetro de funções • Um vetor pode ser passado como argumento para uma função; – Parâmetro da função deve ser do tipo: tipo nome[] • Ao passar um vetor para uma função podemos modificar o conteúdo deste vetor dentro da função: – Passa-se na verdade o endereço do primeiro elemento do vetor na memória (veremos em breve!); – Os demais estão nas posições seguintes de memória; • Podemos passar também um elemento em particular de um vetor para uma função – O parâmetro deve ser do mesmo tipo do vetor. 18 CIn.ufpe.br Vetores: como parâmetro de uma função 19 Recebe um vetor float e o número de elementos como parâmetro e calcula a média Declaração de um vetor float de 10 posições Passa este vetor como argumento para a função “media” CIn.ufpe.br Vetor: modificando seu valor dentro de uma função 20 Recebe um vetor float, o número de elementos e um valor que será utilizado para modificar o vetor Declaração de um vetor float de 10 posições Passa este vetor juntamente com os outros valores como argumento para a função “incrementar” Imprime o vetor modificado por “incrementar” CIn.ufpe.br Vetor: posição de vetor como parâmetro de função 21 Recebe uma nota float, e a média com a qual a nota será comparada Declaração de um vetor com as notas já preenchidasPassa o valor na posição i do vetor como argumento para a função “aprovado” CIn.ufpe.br Variáveis Compostas Bidimensionais (matrizes) • Precisam de mais de um índice para endereçamento. • Funciona como um vetor de vetores: 22 Vetor de vetores CIn.ufpe.br Variáveis Compostas Bidimensionais (matrizes) • Exemplo 23 linhas colunas CIn.ufpe.br Variáveis Compostas Bidimensionais (matrizes) • Manipulação: 24 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 MATRIZ MATRIZ[2][3] CIn.ufpe.br Variáveis Compostas Bidimensionais (matrizes) • Matrizes – Em ‘C’, podemos definir um vetor em que cada posição temos um outro vetor (matriz). – Matriz é uma estrutura de dados homogênea bidimensional. – Sintaxe: tipo nome_da_matriz[tamanho1][tamanho2]; – tamanho1: representa o número de linhas da matriz; – tamanho2 o número de colunas. – As duas dimensões são, respectivamente, a quantidade de linhas e colunas da matriz. 25 CIn.ufpe.br Variáveis Compostas Bidimensionais (matrizes) 26 ... x[0][n-2] x[0][n-1] x[0][0] x[0][1] x[0][2] x é uma matriz bidimensional m x n. linha 1 col. 1 col. 2 col. 3 col. n-1 col. n ... x[1][n-2] x[1][n-1] x[1][0] x[1][1] x[1][2] linha 2 ... ... ... ... ... ... x[m-1][n-2] x[m-1][n-1] x[m-1][0] x[m-1][1] x[m-1][2] linha m CIn.ufpe.br Matrizes • A inicialização de uma matriz também pode ser • feita das seguintes formas: • Deve ser passada ao menos a segunda dimensão. • Uma forma alternativa seria preencher a matriz usando loops. 27 CIn.ufpe.br Matrizes • Exemplo: imprimindo o conteúdo de uma matriz utilizando laços aninhados: 28 CIn.ufpe.br Matrizes passadas por parâmetro • É necessário especificar a quantidade de colunas da matriz ou todas as dimensões: 29 CIn.ufpe.br Atividade 1 • Sendo V o vetor abaixo e as variaveis X=2 e Y=4, quais os valores de: 30 a) V[X+1] b) V[X] + 1 c) V[X+Y] d) V[8-V[2]] e) V[V[V[7]]] 0 1 2 3 4 5 6 7 8 9 2 6 8 3 10 9 1 21 33 14 CIn.ufpe.br Atividades adicionais - Vetores • Atv1: Construa um programa que preenche um vetor de inteiros de 15 números, colocando 0 nas posições pares e 1 nas ímpares. • Atv2: Construa um programa que lê, soma e imprime o resultado da soma de um vetor de inteiros de 10 posições. • Atv3: Construa um programa que multiplique os valores de um vetor de reais de 10 posições pelo valores de um outro vetor de reais de 10 posições. Os resultados das multiplicações devem ser armazenados num terceiro vetor. • Atv4: Leia um vetor de 8 posições e troque os 4 primeiros valores pelos 8 últimos e vice-versa. Escreva ao final o vetor obtido. • Calcule a norma ||v|| do vetor v[] = {1, 3, -4, 2, -3}. • Atv5: Reescreva o programa anterior utilizando uma função que retorne a norma de v. • Construa um programa onde o usuário digita as componentes de um vetor de tamanho N, esse vetor deve ser passado para uma função, que deve retornar a componente de maior valor absoluto. 31 CIn.ufpe.br Atividade 1 32 CIn.ufpe.br Atividade 2 33 CIn.ufpe.br Atividade 3 34 CIn.ufpe.br Atividade 4 35 CIn.ufpe.br Atividade 5 36 CIn.ufpe.br Desfio – bubble sort • Construa um programa que leia e guarde os elementos em um vetor de 20 posições. Em seguida o algoritmo ordena os elementos do vetor de acordo com o bubble sort: – O bubble sort, ou ordenação por flutuação (literalmente "por bolha"), é um algoritmo de ordenação dos mais simples. – A ideia é percorrer o vetor diversas vezes, a cada passagem fazendo flutuar para o topo o maior elemento da sequência. – Essa movimentação lembra a forma como as bolhas em um tanque de água procuram seu próprio nível, e disso vem o nome do algoritmo. 37 CIn.ufpe.br Desfio - Passo-a-passo • Tomemos o conjunto de números "5 1 4 2 8" , e classificar o vetor de número do menor para o maior usando bubble sort . Em cada etapa, os elementos escritos em negrito estão sendo comparados. Três passagens serão necessárias. • Primeiro passagem : – ( 5 1 4 2 8) para (1 5 4 2 8) , aqui , o algoritmo compara os dois primeiros elementos , e troca-os já que 5 > 1 . – (1 5 4 2 8) para (1 4 5 2 8), troca , já que 5> 4 – (1 4 5 2 8) para ( 1 4 2 5 8), troca, já que 5> 2 – ( 1 4 2 5 8) para ( 1 4 2 5 8), agora, uma vez que esses elementos já estão em ordem (5 < 8) , o algoritmo não os troca. • Segunda passagem: – ( 1 4 2 5 8) para (1 4 2 5 8), não troca – ( 1 4 2 5 8) para (1 2 4 5 8), troca, já que 4 > 2 – ( 1 2 4 5 8) para (1 2 4 5 8), não troca – ( 1 2 4 5 8) para (1 2 4 5 8), não troca • Agora, o vetor já está ordenado, mas nosso algoritmo não sabe disso. O algoritmo precisa de mais uma passagem inteira, sem qualquer troca para saber que está ordenado. • Terceira passagem : – ( 1 2 5 4 8 ) para ( 1 2 5 4 8 ), não troca – ( 1 2 5 4 8 ) para ( 1 2 5 4 8 ), não troca – ( 1 2 5 4 8 ) para ( 1 2 5 4 8 ), não troca – ( 1 2 5 4 8 ) para ( 1 2 5 4 8 ), não troca • Não houve troca: fim! (o algoritmo termina quando ocorre uma passagem por todo o vetor sem que haja nenhuma troca) 38 CIn.ufpe.br Atividade - desafio 39 CIn.ufpe.br Atividades adicionais - Matrizes • Atv6: Construa um algoritmo que efetue e apresente o resultado da soma entre duas matrizes 3 x 5. • Faça um programa que multiplica uma matriz 3 x 3 de inteiros por um escalar k = 5. • Refaça o programa anterior de forma que a multiplicação da matriz ocorra dentro de uma função (que retorna vazio). • Sejam a matiz A= {{1, 2, 3, 4}, {5, 6, 7, 8} {9, 10, 11, 12} , {13, 14, 15, 16} } e o vetor x = {-1, 2, 4, 0}, crie um programa que calcule y = A.xT. 40 CIn.ufpe.br Atividades adicionais - Matrizes • Leia uma matriz 5 x 5. Leia também um valor X. O programa deverá fazer uma busca desse valor na matriz e, ao final escrever a localização (linha e coluna) ou uma mensagem de “não encontrado”. • Atv7: Refaça o programa anterior utilizando uma função para comparar cada elemento da matriz com o valor de X. • Atv8: Dada uma matriz 3x3, elabore um algoritmo que escreva: – A diagonal principal – A diagonal secundária – A soma da linha 4 – A soma da coluna 2 – Tudo, exceto a diagonal principal 41 CIn.ufpe.br Atividades adicionais - Matrizes • Escolha uma matriz 4x4 e calcule: sua média 𝑎 = 𝑎𝑖𝑗 𝑁 𝑗=1 𝑁 𝑖=1 𝑁 e seu desvio padrão d = 𝑎−𝑎𝑖𝑗 2𝑁 𝑗=1 𝑁 𝑖=1 𝑁2 , • Reescreva o programa anterior, criando duas funções, uma para calcular a média, e a outra para calcular o desvio padrão. • Calcule o determinante de uma matriz 2x2, da sua escolha. • Calcule o determinante de uma matriz 3x3, da sua escolha. • DESAFIO 1: calcule o determinante de uma matriz 4x4, da sua escolha, baseando-se na experiências dos problemas anteriores. 42 CIn.ufpe.br Atividade 6 43 CIn.ufpe.br Atividade 7 44 CIn.ufpe.br Atividade 8 45
Compartilhar