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 (i0 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 (i0 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
c0
PARA (i0 ATÉ n-1 PASSO 1) FAZER
SE ( notas[i] > 15 ) ENTÃO
cc+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 (i0 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 ( i0 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 ( i0 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 ( i0 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 ( i0 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