Vetores - Dei-Isep

Propaganda
Algoritmia e Programação
APROG
Vetores
Algoritmia e Java
Nelson Freire (ISEP–DEI-APROG 2012/13)
1/32
Sumário
Arrays

Introdução
 Enquadramento
 Interesse
 Noção
 Tipos
 Vetor
 Matriz

Vetores
 Noções Básicas
 Interesse
 Ordenação de Vetores
 Métodos de Ordenação
 Troca Directa
 Bubble Sort
 Troca Directa
 Método
 Algoritmo
 Exemplo
 Variante
 Uso
 Declaração
 Java : Vetor é um Objeto
 Manipulação de Elementos
 Indicar/Modificar um Elemento
 Indicar/Modificar todos Elementos
 Transferência entre Módulos/Métodos
 Passagem de Parâmetros
 Retorno da Função
 Exemplos
Nelson Freire (ISEP–DEI-APROG 2012/13)
2/32
Arrays
Enquadramento
1/2
 Arrays
 São Estruturas de Dados Complexas
Nelson Freire (ISEP–DEI-APROG 2012/13)
3/32
Enquadramento
Arrays
2/2
 Categorias de Estruturas de Dados
 Simples
 Complexas
Classificação segundo
quantidade de valores
armazenados simultaneamente
 Simples
 Permitem armazenar um só valor, de cada vez
RAM
 Representam uma posição da memória principal (RAM)
INTEIRO
 Exemplos
REAL
 Algoritmia: INTEIRO, REAL, CARATER
 Java:
tipos primitivos (ex: int, long, float, double, char)
CARACTER
...
 Complexas
REAL
 Permitem armazenar múltiplos valores, ao mesmo tempo
...
ARRAY
 Exemplos: Arrays
REAL
 Permitem guardar um conjunto de valores do mesmo tipo (todos)
...
 Exemplos
TEXTO
 Notas de alunos
(conjunto de reais)
 Nomes de alunos
(conjunto de Strings)
 Representam conjunto de posições contíguas da RAM
Nelson Freire (ISEP–DEI-APROG 2012/13)
...
ARRAY
TEXTO
4/32
Interesse dos Arrays (introdução)
Arrays
1/2
 Problema
 Envolve grandes quantidades de valores relacionados entre si
 Exemplo
 Ler nomes e notas de 20 alunos obtidas numa disciplina
 Mostrar os nomes dos alunos cuja nota está acima da média
Nelson Freire (ISEP–DEI-APROG 2012/13)
5/32
Interesse dos Arrays (introdução)
Arrays
2/2
 Solução
 Usando apenas estruturas de dados simples
ED
TEXTO nome1, nome2, ..., nome20
INTEIRO nota1, nota2, ..., nota20, soma
REAL media
INÍCIO
// Leitura e soma
soma  0
LER(nome1, nota1)
soma  soma + nota1
LER(nome2, nota2)
soma  soma + nota2
...
LER(nome20, nota20)
soma  soma + nota20
// Média
media  soma / 20
// Escrita de alunos acima da média
SE (nota1>media) ENTÃO ESCREVER(nome1)
SE (nota2>media) ENTÃO ESCREVER(nome2)
...
SE (nota20>media) ENTÃO ESCREVER(nome20)
FIM
Nelson Freire (ISEP–DEI-APROG 2012/13)
42 variáveis
grande quantidade de código repetido
 Conclusão
Estruturas de dados simples podem
conduzir a soluções impraticáveis
 Solução viável
Estruturas de dados complexas
6/32
Arrays
Noção de Array
 Array
 Estrutura de dados complexa
 Armazena conjunto de valores
 Valores todos do mesmo tipo
 Exemplos
 Array de números inteiros
 Array de textos
 Dimensão é fixa
 Não modificável em tempo de execução (run-time)
Nelson Freire (ISEP–DEI-APROG 2012/13)
7/32
Tipos de Arrays
Arrays
 Tipos de Arrays
 Vetor
 Matriz
 Vetor
 Array Unidimensional
 Valores organizados de forma linear

12
15
...
20
14
Matriz
 Array Bidimensional
 Valores organizados em linhas e colunas
Nelson Freire (ISEP–DEI-APROG 2012/13)
11
24
...
27
5
56
...
...
...
...
1
8
...
34
18
8/32
Sumário
Arrays

Introdução de Arrays
 Enquadramento
 Interesse
 Noção
 Tipos
 Vetor
 Matriz

Vetores
 Noções Básicas
 Interesse
 Ordenação de Vetores
 Métodos de Ordenação
 Troca Directa
 Bubble Sort
 Troca Directa
 Método
 Algoritmo
 Exemplo
 Variante
 Uso
 Declaração
 Java : Vetor é um Objeto
 Manipulação de Elementos
 Indicar/Modificar um Elemento
 Indicar/Modificar todos os Elementos
 Transferência entre Módulos/Métodos
 Passagem de Parâmetros
 Retorno da Função
 Exemplos
Nelson Freire (ISEP–DEI-APROG 2012/13)
9/32
Noções Básicas
Vetores
 Vetor
 Constituído por conjunto de elementos
 Comprimento fixo
// Dimensão não modificável em tempo de execução
 Elementos organizados de forma linear
 Elementos armazenam valores, todos do mesmo tipo
 Exemplos: vetor só de reais ou vetor só de texto
 Elementos funcionam como variáveis simples
 Acesso aos elementos através de índices
 Índices
 Indicam posições dos elementos
 Números inteiros desde 0
 Último índice = comprimento-1
elemento 2
valor 10
elementos
12
15
10
20
...
13
14
índices
0
1
2
3
...
n-2
n-1
comprimento (ou dimensão) n
Nelson Freire (ISEP–DEI-APROG 2012/13)
10/32
Interesse
Vetores
 Armazenar
 Listas de valores
 Valores
 Todos do mesmo tipo
 Organizados de forma linear
 Exemplos
 Lista de notas de alunos a uma disciplina
(conjunto de números inteiros)
Português
12
18
15
 Lista de disciplinas de um ano escolar
(conjunto de Strings)
Disciplinas
APROG
ARQCP
ASIST
Nelson Freire (ISEP–DEI-APROG 2012/13)
11/32
Uso
Vetores
 Preciso Saber
 Declarar um vetor
 Java
 Vetor é um Objeto
 Manipular elementos de um vetor
 Um
 Todos
 Transferir um vetor entre módulos/métodos
 Passagem de Parâmetros
 Retorno da Função
Nelson Freire (ISEP–DEI-APROG 2012/13)
12/32
Declaração
Vetores
 Algoritmia
1/2
 Java
 Declaração 1: dimensão definida na declaração
Sintaxe: tipo nomeVetor[dimensão]
 Vetor é objeto // ver slide 15
 Nome do vetor é referência de objeto
tipo nomeVetor[ ] = new tipo[dimensão];
Ex: ED: TEXTO nomes[20]
String nomes[ ] = new String[20];
ou
tipo[] nomeVetor = new tipo[dimensão];
RAM
nomes[0]
String[] nomes = new String[20];
nomes[1]
nomes[2]
...
nomes[19]
19 = 20-1
Inicializações automáticas
 Tipo primitivo
 Numérico: 0
 Booleano: false
 Tipo referência: null
(Ex: String)
 Declaração 2: dimensão definida depois da declaração
Sintaxe:
tipo nomeVetor[ ]
criar nomeVetor[dimensão]
Ex: ED : TEXTO nomes[ ]
INÍCIO
criar nomes[20]
FIM
Nelson Freire (ISEP–DEI-APROG 2012/13)
tipo nomeVetor[ ];
nomeVetor = new tipo[dimensão];
String nomes[ ];
nomes = new String[20];
13/32
Declaração
Vetores
2/2
 Exemplos
// Algoritmia
ED
TEXTO nomes[20], paises[]
INTEIRO c
INÍCIO
...
c  lerComprimento()
criar paises[c]
...
FIM
...
// lerComprimento é função do programa
// Java
public class Exemplo_1 {
public static void main(String[] args) {
String nomes[] = new String[20];
...
String paises[];
...
// vetor criado ; elementos inicializados a null
int c = lerComprimento();
// lerComprimento é função particular do programa
paises = new String[c];
...
}
...
}
Nelson Freire (ISEP–DEI-APROG 2012/13)
14/32
Java : Vetor é um Objeto
Vetores
 Nome de vetor
 É referência do objeto que contém os seus elementos
// referência = endereço
 Exemplo
 Vetor nomes
String[] nomes = new String[20];
RAM
...
nomes
referência de objeto
...
nomes[0]
nomes[1]
nomes[2]
Objeto
...
nomes[19]
...
Nelson Freire (ISEP–DEI-APROG 2012/13)
15/32
Manipulação de Elementos
Vetores
 Elemento
 Pode ser manipulado individualmente
 Funciona como uma variável simples
 Identificado
 Nome do vetor
 Índice respetivo
 Indicar Elemento
 Algoritmia
 Java
 Sintaxe: nomeVetor[índice]
Ex:
nomes[5]
nomeVetor[índice];
nomes[5]
 Manipulações Típicas
 De um elemento
 De todos os elementos
Nelson Freire (ISEP–DEI-APROG 2012/13)
16/32
Manipulação de um Elemento
Vetores
 Algoritmia
 Java
 Atribuir um valor a um elemento
 Ex: guardar ou actualizar um elemento
 Sintaxe: nomeVetor[índice]  valor
Ex:
nomes[5]  "Ana"
nomeVetor[índice] = valor;
nomes[5] = "Ana";
 Atribuir o valor de um elemento a uma variável
 Sintaxe: variável  nomeVetor[índice]
Ex:
variável=nomeVetor[índice];
s  nomes[5]
s=nomes[5];
// s do tipo TEXTO
// s do tipo String
Nelson Freire (ISEP–DEI-APROG 2012/13)
17/32
Manipulação de todos os Elementos
Vetores
 Algoritmia
 Java
• Indicar todos os n elementos (n é comprimento vetor)
PARA (i0 ATÉ n-1 PASSO 1) FAZER
... nomeVetor[i] ...
FPARA
•
nomeVetor.length
(atributo)
for( i=0; i < nomeVetor.length; i++ ){
... nomeVetor[i] ...
}
Ex: Guardar no vetor n notas lidas do teclado
Scanner ler =new Scanner(System.in);
PARA (i0 ATÉ n-1 PASSO 1) FAZER
for(i=0; i<notas.length; i++){
LER( notas[i] )
FPARA
•
notas[i] = ler.nextInt();
}
Ex: Contar o número de notas superiores a 15
c0
PARA (i0 ATÉ n-1 PASSO 1) FAZER
SE ( notas[i] > 15 ) ENTÃO
cc+1
FSE
FPARA
Nelson Freire (ISEP–DEI-APROG 2012/13)
c=0;
for(i=0; i<notas.length; i++){
if ( notas[i] > 15 )
c++;
}
18/32
Arrays
Interesse dos Arrays
(conclusão)
 Problema

Ler os nomes e as notas de 20 alunos obtidas apenas numa disciplina e mostrar os nomes dos alunos cuja
nota está acima da média.
 Solução
 Estruturas de dados simples
ED:
TEXTO nome1, nome2, ..., nome20
INTEIRO nota1, nota2, ..., nota20, soma
REAL media
INÍCIO
// Leitura e soma
soma  0
LER(nome1, nota1)
soma  soma + nota1
LER(nome2, nota2)
soma  soma + nota2
...
LER(nome20, nota20)
soma  soma + nota20
// Média
media  soma / 20
// Escrita alunos acima da média
SE (nota1>media) ENTÃO ESCREVER(nome1)
...
SE (nota20>media) ENTÃO ESCREVER(nome20)
FIM
Nelson Freire (ISEP–DEI-APROG 2012/13)
 Arrays
ED: TEXTO nomes[20]
INTEIRO notas[20], soma, i
REAL media
5 variáveis
INÍCIO
// Leitura e soma
soma  0
PARA (i0 ATÉ 19 PASSO 1) FAZER
LER(nomes[i], notas[i])
soma  soma + notas[i]
FPARA
Muito
mais fácil
escrever
// Média
media  soma / 20
// Escrita alunos acima da média
PARA ( i0 ATÉ 19 PASSO 1 ) FAZER
SE ( notas[i]>media ) ENTÃO
ESCREVER( nomes[i] )
FPARA
Muito
mais fácil
escrever
FIM
19/32
Transferência entre Módulos/Métodos
Vetores
1/6
 Em Java
 Vetor é objeto  basta transferir referência desse objeto  indicar nome do vetor
 Exemplo
int[ ] notas = new int[20];
RAM
nome do vetor (objeto)
...
notas
referência de objeto
...
notas[0]
notas[1]
notas[2]
Objeto
...
notas[19]
...
Nelson Freire (ISEP–DEI-APROG 2012/13)
20/32
Vetores
Transferência entre Módulos/Métodos
2/6
 Formas de Transferir um Vetor
 Passagem de parâmetros
 Retorno da função
DEFINIR nome (..., tipo nomeVetor [ ], ...)
ED
// variáveis e constantes locais
INÍCIO
// corpo do procedimento
FDEF
Procedimento
DEFINIR tipo_retornado nome (..., tipo[ ] nomeVetor, ...)
ED
// variáveis e constantes locais
INÍCIO
// corpo da função
RETORNAR expressão_tipo_retornado
FDEF
Função
DEFINIR tipo[ ] nome (...)
ED tipo[ ] nomeVetor
INÍCIO
// corpo da função
RETORNAR nomeVetor
FDEF
Nelson Freire (ISEP–DEI-APROG 2012/13)
Função
21/32
Transferência entre Módulos/Métodos
Vetores
3/6
 Passagem de Parâmetros (1/2)
 Passada cópia da referência do vetor
DEFINIR tipo nome(..., tipo nomeVetor [ ], ...)
 Módulo acede ao vetor original  Pode modificar vetor original
 Parâmetro formal funciona como parâmetro de entrada e de saída
 Declaração de um parâmetro formal
 Para receber referência do vetor
 Algoritmia
 Java
Sintaxe: tipo nomeVetor[]
ou
tipo[] nomeVetor
Ex: DEFINIR ler( INTEIRO vetor[ ] , ...) ...
tipo nomeVetor[];
ou
tipo[] nomeVetor;
public static void ler( int vetor[], ...){...}
public static void ler( int[] vetor, ...){...}
 Chamada de um módulo
 Passar referência do vetor (i.e., nome do vetor)
 Algoritmia
Sintaxe: nomeVetor
Ex: ler(notas, ...)
Nelson Freire (ISEP–DEI-APROG 2012/13)
 Java
nomeVetor
ler(notas, ...);
22/32
Transferência entre Módulos/Métodos
Vetores
 Passagem de Parâmetros (2/2)
 Exemplo (Java)
RAM
vet
private static void m(int[] v){
v[2]=3;
}
}
referência x
...
public class Exemplo{
public static void main(String[] args){
int[] vet = new int[3];
vet[2] = 1;
m(vet);
System.out.println("vet[2]=" + vet[2]);
}
4/6
vet[0]
0
vet[1]
0
vet[2]
1
...
v
referência x
Na chamada de m
vet
referência x
...
// Programa escreve vet[2]=3
vet[0]
0
vet[1]
0
vet[2]
3
...
v
referência x
Na execução de m
Nelson Freire (ISEP–DEI-APROG 2012/13)
23/32
Transferência entre Módulos/Métodos
Vetores
5/6
 Retorno da Função
 Retornada referência do vetor
DEFINIR tipo[ ] nome(...)
ED tipo[ ] nomeVetor
INÍCIO
 Declaração do tipo_retornado da função
 Tipo vetor
// corpo da função
 Algoritmia
RETORNAR nomeVetor
FDEF
 Sintaxe: DEFINIR tipo[ ] nomeFunção ( ...) ...
Ex: DEFINIR INTEIRO[ ] filtrar(...) ...
 Java
public static tipo[ ] nomeMétodo(...){...};
public static int[ ] filtrar(...){...}
 Retorno
 Referência do vetor (i.e., nome do vetor)
 Algoritmia
 Sintaxe: RETORNAR nome_vetor
Ex: RETORNAR notas
Nelson Freire (ISEP–DEI-APROG 2012/13)
 Java
return nome_vetor;
return notas;
24/32
Vetores

Transferência entre Módulos/Métodos
6/6
Exemplos
import java.util.Scanner;
public class Notas {
public static void main(String[] args) {
int totNotas = lerTotalNotas();
int[] notas = lerNotas(totNotas);
float m = media(notas);
if(m<10)
incrementar(notas, m);
listar(notas);
}
private static int[] lerNotas(int n) {
Scanner ler = new Scanner(System.in);
int[] vec = new int[n];
for (int i = 0; i < vec.length; i++) {
System.out.println("Nota " + (i + 1) + ":");
vec[i] = ler.nextInt();
while (vec[i] < 0 || vec[i] > 20) {
System.out.println("Nota Inválida!!" +
"Insira a nota:" + (i + 1) + ":");
vec[i] = ler.nextInt();
}
}
return vec;
}
private static void listar(int[] vec) {
System.out.println("Listagem Notas:")
for (int i = 0; i < vec.length; i++)
System.out.println(vec[i]);
}
Nelson Freire (ISEP–DEI-APROG 2012/13)
private static float media(int[] v) {
float s=0;
for (int i = 0; i < v.length; i++)
s+=v[i];
return s/v.length;
}
private static int lerTotalNotas() {
Scanner ler = new Scanner(System.in);
System.out.println("Digite o nº notas:");
int n = ler.nextInt();
while (n <= 0) {
System.out.println("Valor Inválido!! "
+ "Insira novo nº de notas:");
n = ler.nextInt();
}
return n;
}
private static void incrementar(int[] notas,
float media) {
int d = 10 - (int) media;
if(d>0)
for (int i = 0; i < notas.length; i++)
if (notas[i] + d > 20)
notas[i] = 20;
else
notas[i] += d;
}
}
25/32
Sumário
Arrays

Introdução de Arrays
 Enquadramento
 Interesse
 Noção
 Tipos
 Vetores
 Matrizes

Vetores
 Noções Básicas
 Interesse
 Ordenação de Vetores
 Métodos de Ordenação
 Troca Directa
 Bubble Sort
 Troca Directa
 Método
 Algoritmo
 Exemplo
 Variante
 Uso
 Declaração
 Java : Vetor é um Objeto
 Manipulação de Elementos
 Indicar/Modificar um Elemento
 Indicar/Modificar todos os Elementos
 Transferência entre Módulos/Métodos
 Passagem de Parâmetros
 Retorno da Função
 Exemplos
Nelson Freire (ISEP–DEI-APROG 2012/13)
26/32
Ordenação de
Vetores
Métodos
 Há vários métodos
 Exemplos
 Troca Directa
 Bubble Sort
Nelson Freire (ISEP–DEI-APROG 2012/13)
27/32
Ordenação de
Vetores
Troca Directa : Método
1/5
 Ordenar, sucessivamente, os primeiros n-1 elementos do vetor (n = comprimento do vetor)
 Exemplo:
1ª Ordenação
2ª Ordenação
3ª Ordenação
 Ordenar o i-ésimo elemento
 Comparar esse elemento, sucessivamente, com cada um dos elementos seguintes
 Exemplo
i
i
i
Elemento 0:
j
j
i
j
i
Elemento 1:
j
j
i
Elemento 2:
j
 Após cada comparação, trocar os elementos comparados (i e j) se ...
 Ordenação crescente: v[j] < v[i]
6
5
...
...
menor
Nelson Freire (ISEP–DEI-APROG 2012/13)
Ordenação decrescente: v[j] > v[i]
2
8
...
...
maior
28/32
Ordenação de
Vetores
Troca Directa : Exemplo
2/5
 Ordenação Crescente
6
5
7
3
i
(i=0)
i
6
5
7
3
5
6
7
3
i
5
6
j
3
3
3
j
6
7
5
6
7
3
j
5
i
(i=1)
7
i
6
7
5
3
6
7
j
5
3
5
7
6
j
i
(i=2)
3
5
7
6
3
5
6
7
j
Nelson Freire (ISEP–DEI-APROG 2012/13)
29/32
Ordenação de
Vetores
Troca Directa : Algoritmo
3/5
 Algoritmo
 Ordenação Crescente
PARA ( i0 ATÉ n-2 PASSO 1 ) FAZER
comprimento do vetor (n)
PARA( j i+1 ATÉ n-1 PASSO 1 ) FAZER
SE ( v[j] < v[i] ) ENTÃO
0
tmp  v[i]
v[i]  v[j]
n-2
i
v[j]  tmp
j
FSE
i+1
FPARA
n-1
FPARA
 Ordenação Decrescente
• Única alteração
v[j] > v[i]
Nelson Freire (ISEP–DEI-APROG 2012/13)
30/32
Ordenação de
Vetores
Troca Directa : Exemplo de Ordenação Alfabética de Strings
4/5
 Algoritmo
 Java
ED:
public class TrocaDirecta{
public static void main(String[] args) {
String tmp, nomes[ ];
int i,j,n;
Scanner ler = new Scanner(System.in);
do {
System.out.print("N:")
n=ler.nextInt();
} while(n<=0);
nomes = new String[n];
...
for ( i=0; i<=n-2; i++ ) {
for( j=i+1; j<=n-1; j++ ) {
if ( nomes[j].compareTo( nomes[i] ) < 0 ) {
tmp = nomes[i];
nomes[i] = nomes[j];
nomes[j] = tmp;
}
}
TEXTO tmp, nomes[ ]
INTEIRO i, j, n
ALG
INÍCIO
REPETIR
LER(n)
ENQUANTO n<=0
criar nomes[n]
...
PARA ( i0 ATÉ n-2 PASSO 1 ) FAZER
PARA( j i+1 ATÉ n-1 PASSO 1 ) FAZER
SE ( nomes[j] < nomes[i] ) ENTÃO
tmp  nomes[i]
nomes[i]  nomes[j]
nomes[j]  tmp
FSE
FPARA
FPARA
...
FIM
Nelson Freire (ISEP–DEI-APROG 2012/13)
}
...
}
}
31/32
Ordenação de
Vetores
Troca Directa : Algoritmo mais Eficiente
5/5
 Algoritmo
 Ordenação Crescente
PARA ( i0 ATÉ n-2 PASSO 1 ) FAZER
comprimento do vetor (n)
menor  i
PARA( j i+1 ATÉ n-1 PASSO 1 ) FAZER
SE ( v[j] < v[menor] ) ENTÃO
0
n-2
i
menor  j
FSE
FPARA
j
i+1
n-1
SE ( menor != i ) ENTÃO
tmp  v[i]
v[i]  v[menor]
v[menor]  tmp
FSE
FPARA
 Ordenação Decrescente
 Única alteração
v[j] > v[i]
Nelson Freire (ISEP–DEI-APROG 2012/13)
32/32
Download