Buscar

Trabalhando com Vetores em Algoritmos

Prévia do material em texto

VETORES Prof. Cipriano Carneiro
DEFINIÇÃO
Vetores são estruturas estáticas que
armazenam diversas variáveis do mesmo
tipo e sequencialmente em memória. Eles
podem conter variáveis primitivas ou
complexas. E são acessáveis por índices.
(número inteiro que varia de 0 a n ou de
1 a n).
CADA ITEM EM UM VETOR É CHAMADO DE ELEMENTO, E CADA
ELEMENTO É ACESSADO PELA POSIÇÃO NUMÉRICA. COMO NA
ILUSTRAÇÃO ABAIXO AS POSIÇÕES SÃO NUMERADAS A PARTIR
DO 0. O 9O ELEMENTO, POR EXEMPLO, É ACESSADO NA POSIÇÃO
8.
ARRAYS E DIMENSÕES
ARRAYS UNI E BIDIMENSIONAIS
Sabe-se que um array é uma série de
elementos do mesmo tipo (primitivo ou não)
endereçáveis por um índice. Contudo, esse
índice pode ter mais de uma dimensão.
Aumentando, assim, a capacidade de
organização da informação na memória.
Na matemática chamamos de vetor os
arrays unidimensionais e matriz os arrays
bidimensionais.
QUAL A DIMENSÃO MÁXIMA DE UM 
ARRAY?
Arrays multidimensionais podem conter quantos índices forem necessários. Contudo,
a quantidade de memória necessária para armazenar um array multidimensional
cresce em proporção geométrica. Observe o exemplo:
 char seculo[100][365][24][60][60]
O array multidimensional acima armazenaria cada segundo dos próximos 100
anos. Apenas a declaração de tal estrutura consumiria 3 GB de memória!
Arrays multimensionais são apenas abstrações para os programadores, desde que
se obtenha o mesmo resultado, basta organizar o fator entre os índices. Por
Exemplo:
 int x[3][5]; é equivalente a int x[15];
Deve-se avaliar a relevância de arrays multidimensionais com cuidado;
Os mais utilizados são os uni e bidimensionais. Os bidimensionais carregam as
vantagens óbvias das operações com matrizes da matemática;
MATRIZ
A contrapartida clássica de uma matriz é o que
aprendemos na escola. Uma organização
endereçável pelo cruzamento de linhas e colunas.
(No exemplo um matriz (3x4)
0 1 2 3
DECLARANDO UM VETOR
C = Vetor [1..n] de inteiro; ou C = Vetor[n] de inteiro;
N = Vetor [1..n] de real; ou C = Vetor[n] de real;
C = Vetor [1..n] de cadeia; ou C = Vetor[n] de cadeia;
OBS.: algoritmicamente falando n pode ser
indeterminado, mas na prática para se criar um vetor
ele deve ser conhecido previamente. Lembre-se que
vetores são estruturas estáticas;
1. algoritmo "LeituraEscritaVetor"
2. var
3. vetorA : vetor[0..9] de real
4. i:inteiro
5. inicio
6. escreval("Digite 10 números inteiros: ")
7. para i de 0 ate 9 faca
8. escreva("Elemento[",i,"]: ")
9. leia(vetorA[i])
10. escreval()
11.fimpara
12.escreval(" ———- VETOR A ———-")
13.para i de 0 ate 9 faca
14. escreva(vetorA[i]," ")
15.fimpara
16.fimalgoritmo
EXEMPLO
Vamos analisar um algoritmo que leia 3
números inteiros e os coloque em ordem
crescente. A diferença do nosso primeiro
algoritmo, feito apenas considerando o
conhecimento da estrutura de decisão SE, é
que, desta vez, utilizaremos a estrutura de
vetor. E a solução servirá para mais do que
3 elementos. O que antes era inviável.
A IDEIA
TRABALHANDO JUNTOS TROCAMOS 
INFORMAÇÕES
Usam-se dois índices “i” e “j” para se descobrir o
menor de todos os elementos do vetor a medida
que avançamos nos seus valores armazenados.
O índice “j” é usado para garantir que os
números que estão para trás dele estejam em
ordem crescente. O índice “i” é usado para
“varrer” o vetor nesta busca a cada interação.
Mas, primeiro precisamos criar e ler o vetor com
os valores, vamos a primeira parte do algoritmo.
1. algoritmo "OrdemCrescente"
2. var
3. vetorA : vetor[0..2] de inteiro
4. i,j,menor,posmenor,temp:inteiro
5. inicio
6. temp<-0
7. escreval("Digite 3 números inteiros: ")
8. para i de 0 ate 2 faca
9. escreva("Elemento[",i,"]: ")
10. leia(vetorA[i])
11. escreval()
12.fimpara
Além dois índices i e j 
citados e do próprio 
vetor. Temos aqui outras 
variáveis que nos 
auxiliarão nesta solução. 
Basicamente neste 
primeiro trecho são lidos 
os valores do vetor e a 
variável temp é iniciada 
com o valor zero;
13. posmenor<--1
14. menor<-vetorA[j]
15. para j de 0 ate 2 faca
16. para i de j+1 ate 2 faca
17. Se vetorA[i]<menor entao
18. posmenor<-i
19. fimse
20. fimpara
21. se (posmenor>-1) entao
22. menor<-vetorA[posmenor]
23. temp<-vetorA[j]
24. vetorA[j]<-menor
25. vetorA[posmenor]<-temp
26. posmenor<--1
27. fimse
28. fimpara
Este é o coração da solução 
explicada no texto anterior. 
Entretanto, ela precisa de dois 
ajustes para funcionar 
completamente. Vamos descobrir 
que problemas são estes?!! 
Simular é um bom caminho.
A PARTE FINAL DO ALGORITMO
29.escreval(" ———- VETOR em ordem crescente ———-")
30.para i de 0 ate 2 faca
31. escreva(vetorA[i]," ")
32.fimpara
33.escreval()
34.fimalgoritmo
SIMULAÇÃO 1
1 3 2
1 2 3
A primeira sequencia OK. A 
segunda falha. Porque não mudo 
o foco de preocupação depois 
que encontro o menor número na 
primeira rodada. Encontrei o 
menor número. Então não preciso 
e não posso mais me preocupar 
com ele. Pois o foco agora é 
encontrar o segundo menor 
número e assim por diante. 
Basicamente abandono o menor 
número encontrado e passo a 
busca do próximo.
13. posmenor<--1
14. //menor<-vetorA[j]
15. para j de 0 ate 2 faca
16. menor<-vetorA[j]
17. para i de j+1 ate 2 faca
18. Se vetorA[i]<menor entao
19. posmenor<-i
20. fimse
21. fimpara
22. se (posmenor>-1) entao
23. menor<-vetorA[posmenor]
24. temp<-vetorA[j]
25. vetorA[j]<-menor
26. vetorA[posmenor]<-temp
27. posmenor<--1
28. fimse
29. fimpara
Este problema é 
resolvido, 
simplesmente, 
trocando-se a 
posição desta linha. 
Pois o objetivo é 
encontrar o menor 
número da rodada. 
Com esta linha fora 
do laço (e agora 
comentada) o menor 
número de todos vai 
atrapalhar o 
encontro do segundo 
menor, do terceiro 
menor, e assim por 
diante. Observe 
agora a linha 16.
SIMULAÇÃO 2
1 2 3 ok
1 3 2 ok
2 1 3 ok
2 3 1 ok
3 1 2 falha
3 2 1 ok
A solução tem que ser efetiva 
para todos os casos. Sem 
falhas. O que aconteceu com 
a sequencia apontada? 
Simule a sequencia que falha 
e explique. Qual a solução 
para consertarmos o 
algoritmo?
VAMOS FAZER AS ATIVIDADES 
(LISTA 7) FIM

Continue navegando