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