Buscar

Aula 06 Vetores & Matrizes

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

Continue navegando