Aula 4 Ciclos, matrizes e String Na aula passada … Variáveis e operadores: char a = ‘z’; int x = 45 + 23; int y = x + 1; String nome = new String(“Doris Lessing”); boolean b = (x >= 0 && x <= 10); Instruções de selecção: if (x >= 0 && x <= 10) System.out.println(“x está entre 0 e 10”); else System.out.println(“x não está entre 0 e 10”); 2 2007/2008 Enquanto (condição) Fazer... Fazer... Enquanto (condição) Ciclos Para... De... Até (condição) ... Fazer... inicialização condição inicialização F instruções V condição F V instrução1 V instruções condição F Enquanto... Fazer... 3 Fazer... Enquanto instrução2 Para... Fazer... 2007/2008 Instrução while while(condição) { Guarda instruções/passo; executadas enquanto a condição for verdadeira } Normalmente as instruções podem dividir-se em dois grupos: { acções / instruções; progresso ; Progresso: Instrução para Garantir que o ciclo termina. Passo = acção + progresso } 4 2007/2008 Ciclos while (condição) {passo; progresso;} inicialização condição F V instruções: - passo/acção - progresso While... do... 5 2007/2008 Exemplo: Contar até <n> import java.util.Scanner; public class Contagem { public static void main(String[] parametros){ Scanner teclado = new Scanner (System.in); System.out.println(“Se quer contar até ... n ... introduza n : ”); int n = teclado.nextInt(); int i = 1; while(i != n + 1) { (condição) Guarda System.out.print (i + “ “); ++i; } Acção Passo System.out.println(“ ”); System.out.println(“Terminou.”); Progresso } } Exemplo Contagem.java 6 2007/2008 Exemplo: Cálculo de potência (xn) Potência: xn = x·x·x·…·x (n vezes) Desenvolver o algoritmo: Descrever como se calcula a potência usando: enquanto … fazer: variáveis, expressões e operações Exemplo PotenciaWhile.java 7 2007/2008 Exemplo: Cálculo de potência (xn) import java.util.Scanner; public class PotenciaWhile { public static void main(String[] args){ Scanner teclado = new Scanner(System.in); System.out.println("Cálculo de x elevado a n."); System.out.print("Valor de x: "); int x = teclado.nextInt(); System.out.print("Valor de n: "); int n = teclado.nextInt(); int i = 0, r = 1; // se n=0 então i=n e r=1 (não se executa o ciclo) while(i != n) { r = r * x; // Exemplo PotenciaWhile.java ++i; } System.out.println("A potência " + n + " de " + x + " é: " + r + " ."); } } 8 2007/2008 Estrutura de um ciclo (for) Guarda: o contrário da condição de paragem Executada uma vez antes do ciclo começar for(inicialização; guarda; progresso){ acção (uma ou mais instruções) } Progresso: Executado sempre que encontra a chaveta final do “for” Acção: Executado sempre que a guarda seja verdadeira 9 2007/2008 Ciclos for (init; condição; progresso) {passo;} inicialização condição F V - passo - progresso For... 10 2007/2008 Exemplo: Cálculo de potência (xn) Potência: xn = x·x·x·…·x (n vezes) Desenvolver o algoritmo: Descrever como se calcula a potência usando: para todos os números (i) de … até … fazer: variáveis, expressões e operações PotenciaFor.java 11 2007/2008 Exemplo: Cálculo de potência (xn) import java.util.Scanner; public class Potenciafor { public static void main(String[] args){ Scanner teclado = new Scanner(System.in); System.out.println("Cálculo de x elevado a n."); System.out.print("Valor de x: "); int x = teclado.nextInt(); System.out.print("Valor de n: "); int n = teclado.nextInt(); int r = 1; for (int i = 0; i != n; ++i) { // Exemplo PotenciaFor.java r = r * x; } System.out.println("A potência " + n + " de " + x + " é: " + r + " ."); } } 12 2007/2008 Estrutura de um ciclo do-while inicialização O passo deste ciclo do { passo / instruções; } while( guarda ); (com uma ou mais instruções) é executado sempre pelo menos uma vez Tal como no ciclo while o passo é { acção progresso } 13 2007/2008 Ciclos do {passo; progresso;} while (condição) instruções: - passo/acção - progresso V condição F Do... While... 14 2007/2008 Utilidade do ciclo do-while Problema: Criar um menu com 3 opções e, para as duas primeiras indicar qual a que o utilizador escolheu: Pratos do dia: Opção 1: Pataniscas de bacalhau Opção 2: Lasanha vegetariana Opção 3. Saír 15 2007/2008 Utilidade do ciclo do-while Exemplo de interacção com o programa: 1. Opção 1: Pataniscas de Bacalhau 2. Opção 2: Lasanha vegetariana 3. Sair do programa 1 Escolheu a opção 1 1. Opção 1 Pataniscas de Bacalhau Introdução de dados pelo utilizador: usar Scanner.nextInt(); 2. Opção 2 Lasanha vegetariana 3. Sair do programa 2 Escolheu a opção 2 1. Opção 1 Pataniscas de Bacalhau 2. Opção 2 Lasanha vegetariana 3. Sair do programa 3 Escolheu a opção 3 Terminou 16 2007/2008 Utilidade do ciclo do-while import java.util.Scanner; public class Menu { public static void main(String[] args) { Scanner teclado = new Scanner(System.in); int opcao = 0; do { System.out.println("Opção 1: Pataniscas de bacalhau "); System.out.println("Opção 2: Lasanha vegetariana "); System.out.println("Opção 3. Saír "); System.out.println("Escolha a sua opção: "); opcao = teclado.nextInt(); if (opcao > 0 && opcao <= 3) { System.out.println("Opção escolhida: " + opcao); } else { System.out.println("Opção inválida. "); } } while (opcao != 3); System.out.println("Terminou."); } } 17 2007/2008 while (condição) {passo; progresso;} do {passo; progresso;} while (condição) for (init; condição; progresso) {passo;} Ciclos inicialização acção inical Guarda condição instruções: - passo/acção - progresso F V condição F V - passo instruções: - passo/acção - progresso While... do 18 V condição F do... While - progresso for... 2007/2008 while (i != n) {r = r*x; ++i;} do {System.out.println(i); ++i;} while (i != 6) for (i = 0; i != 100; ++i) {System.out.println(“Java”);} Ciclos - Exemplos ler x, n; int i = 1; int i = 1, r = x; i != n Escrever(i); ++i; F V int i = 0; i != 100 F V Escrever (“Java”); r = r * x; ++i; V i != 6 F ++i; Exemplo While... do ( Calcular xn ) do... While ( Escrever de 1 a 5 ) for... ( Escrever Java 100 vezes ) Uso típico Ciclos Indeterminados Validação de dados Ciclos Determinados 19 2007/2008 Ler três inteiros e escrevê-los por ordem inversa public class Inversor { public static void main(String[] parametros) { (...) System.out.println("Introduza três inteiros:”); int a = teclado.nextInt(); int b = teclado.nextInt(); int c = teclado.nextInt(); System.out.println(c); System.out.println(b); Como generalizar para 1000, por exemplo? System.out.println(a); } } 20 2007/2008 Ler 1000 inteiros e escrevê-los por ordem inversa Basta substituir acrescentar 997 variáveis, e 997 println(), obviamente … public class Inversor { public static void main(String[] parametros) { (...) System.out.println("Introduza 1000 inteiros:”); int a0 = teclado.nextInt(); int a1 = teclado.nextInt(); Pouco prático… ... int a999 = teclado.nextInt(); System.out.println(a999); System.out.println(a998); ... System.out.println(a0); } } 21 2007/2008 Ler 1000 inteiros e escrevê-los por ordem inversa public class Inversor { public static void main(String[] parametros) { System.out.println("Introduza 1000 inteiros:”); int[] valores = new int[1000]; ? Criação / alocação do espaço para 1000 inteiros } } Declaração de uma matriz de inteiros 22 2007/2008 Sintaxe Tipo dos elementos Nome da matriz double[] m = new double[4]; Número de elementos m[2] = 2.2; double x = m[3]; System.out.println(m[1]); Como uma variável Indexações 23 2007/2008 Organização Recordar noção de Referência double[] m = new double[4]; m: double[4] m[0]: m[1]: m[2]: m[3]: 0 0 0 0 Índices: 1º elemento: índice 0 2º elemento: índice 1 … nº elemento: índice n-1 24 2007/2008 Inicialização double[] m = new double[4]; Notação mais simples, mas não esquecer que ‘m’ é uma referência! m: double[4] m[0]: m[1]: m[2]: m[3]: 0 0 0 0 Com zero! 25 2007/2008 Inicialização explícita (I) double[] m = {0.0, 1.1, 2.2, 3.3}; m: double[4] 26 m[0]: m[1]: m[2]: m[3]: 0 1.1 2.2 3.3 2007/2008 Inicialização explícita (II) double[] m = {}; Atenção: não há espaço reservado. m[0] = 0; // erro m: double[0] 27 2007/2008 Matrizes com mais de uma dimensão int n = 10; // não é obrigatório que n seja constante em Java char[][] m = new char[n][n]; // valor inicial é o char cujo código é 0 m: char[10][10] m[0][0] m[0][1] m[0][2] m[0][3] m[0][4] … m[0][10] … m[10][10] m[1][0] m[1][1] m[1][2] m[1][3] m[1][4] … 28 2007/2008 Ciclos com matrizes Voltando ao problema da inversão de n números dados pelo utilizador: Para resolver o problema precisamos de 2 ciclos: Directo • Do primeiro ao elemento final, 0 -> 999 Inverso • Do último ao elemento inicial, 999 -> 0 29 2007/2008 Ler 1000 inteiros e escrevê-los por ordem inversa public class Inversor { public static void main(String[] parametros) { Constante! final int número_de_valores = 1000; Scanner teclado = new Scanner(System.in); System.out.println("Introduza “ + número_de_valores + “ inteiros:”); int[] valores = new int[número_de_valores]; for(int i = 0; i != valores.length; ++i) valores[i] = teclado.nextInt(); for(int i = valores.length - 1; i != -1; --i) System.out.println(valores[i]); } } Ver: Matriz1000.java 30 2007/2008 Particularidades das matrizes Inicialização explícita exaustiva Dimensão imutável São sempre referências Atribuições e comparações são entre referências Indexação fora dos limites int[] m = {0, 1, 2}; m[-1] = -1; m[3] = 3; Que sucede? Programa aborta! Os índices são verificados em tempo de execução. Tipos válidos para indexar uma matriz: byte, short, int, char 31 2007/2008 Cadeias de caracteres Tipo de dados: String Imutáveis: não se podem modificar São referências “Contêm” operações 32 2007/2008 Definição de instâncias (I) String s; s: referência para String Não foi criada cadeia de caracteres. ? String s = null; 33 Quando não se pretende, inicialmente, criar a cadeia de caracteres. Em geral não é boa ideia. 2007/2008 Definição de instâncias (II) String a = “ISCTE”; String b = “ISCTE”; a: referência para String : String ISCTE b: referência para String 34 2007/2008 Definição de instâncias (III) String a = new String(“ISCTE”); char[] caracteres = { ‘I’, ‘S’, ‘C’, ‘T’, ‘E’ }; String b = new String(caracteres); a: referência para String : String ISCTE b: referência para String : String ISCTE 35 2007/2008 Comprimento String s = “Introdução à Informática”; System.out.println(s.length()); Mostra 24. Nota: length() ≠ length 36 (método associado à determinação da dimensão de uma matriz) 2007/2008 Obter caracteres individuais String s = “Introdução à Informática”; System.out.println(s.charAt(0)); System.out.println(s.charAt(14)); System.out.println(s.charAt(23)); Mostra a Mostra n Mostra I 37 2007/2008 Concatenação e sub-cadeias String s1 = “Introdução à ”; String s2 = “Informática”; String s3 = s1.concat(s2); ou String s3 = s1 + s2; String a = s3.substring(0, 10); Do 0 ao 10, exclusive String b = s3.substring(13); Concatena s1 com s2: s3 fica com “Introdução à Informática” a fica com “Introdução” b fica com “Informática” Do 13 até ao fim 38 2007/2008 Comparação if(s1 == s2) Comparação entre referências: Não deve ser usado! System.out.println(“Referenciam a mesma cadeia”); if(s1.equals(s2)) System.out.println(“Guardam cadeias com igual valor”); Se … Devolve … s1 < s2: … int negativo s1 = s2: … zero if(s1.compare(s2) < 0) s1 > s2: … int positivo System.out.println(s1 + “ aparece antes de “ + s2 + “ no dicionário.”); 39 2007/2008 Encontrar um caracter ou uma sub-cadeia numa cadeia String s = “Introdução à Informática”; int i = s.indexOf(‘I’); i fica com 0 int j = s.indexOf(‘x’); j fica com -1 int k = s.indexOf(‘r’, 10); int l = s.indexOf(“Info”); int m = s.indexOf(“info”); k fica com 17, 1º ‘r’ após a posição 10 l fica com 13 m fica com -1 n fica com 13 int n = s.indexOf(“In”, 10); 40 2007/2008 A reter... Ciclos: Matrizes: Indicam quantas vezes (ou em que condições) um conjunto de instruções é repetido Séries indexáveis de variáveis do mesmo tipo String: Classe de variáveis onde se guardam palavras ou frases Têm um conjunto de propriedades, ao contrário das variáveis primitivas Nota: pode consultar informação os métodos que integram a classe String (cadeia) em: Classe String - métodos 41 2007/2008 A ler... Capítulo 4: Y. Daniel Liang, "Introduction to Java Programming", 5ª Edição, Prentice-Hall, 2005. ISBN: 0-13-185721 - 5 42 2007/2008 Aula 4: Sumário Instrução while Sintaxe Semântica Exemplo de ciclos simples Inicialização, guarda, passo (acção e progresso) As instruções for e do-while Prática da construção de ciclos Matrizes: Objecto com instâncias do mesmo tipo Sintaxe: definição e inicialização Tamanho de uma matriz: length Indexação Cadeias de caracteres 43 2007/2008