Programação I 1.º Semestre 2009/2010 2.º Trabalho DATA DE ENTREGA: 23 DE NOVEMBRO DE 2009 Objectivos: Neste trabalho pretende-se que os alunos adquiram prática na utilização de instruções de controlo de fluxo, métodos e arrays. PARTE I 1. Considere os seguintes programas e indique, justificando, qual é o valor final da variável var após a execução de cada um deles. Programa 1: int var = 1; char c = 'B'; switch (c) { case 'a': case 'A': var = 5; break; case 'b': case 'B': var++; case 'c': case 'C': var *= 50; break; default: var = 33; } Programa 2: int i=5, var=0, j; while (--i > 0) { for (j = 0; j < i; ++j) var += i + j; } Programa 3: int[] var = new int[9]; int i; for (i = 0; i < 9; i++) var[i] = 8-i; for (i = 0; i < 9; i++) var[i] = var[var[i]]; 2. Implemente o método public static int genRandom(int inf, int sup) da classe MathUtils que retorna um valor inteiro aleatório no intervalo [inf; sup]. A implementação deve usar o método Math.random. (consulte http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Math.html#random()) Realize um programa que utilize o método genRandom para produzir valores aleatórios de n nos seguintes intervalos: • • • • 0 ≤ n ≤ 9 1 ≤ n ≤ 100 -1 ≤ n ≤ 1 -3 ≤ n ≤ 11 3. Indique, justificando qual é a saída produzida pelo seguinte extracto de código: public class Ex4 { public static void fill(int[] a) { for (int i = 0; i < a.length; i++) a[i] = 'A' + i; } public static void print(int[] a, int[] b) { for (int i = 0; i < b.length; i++) System.out.println((char)a[i] + " " + (char)b[i]); } public static void main (String[] args){ int a[], b[] = null; a = new int[5]; fill(a); b = a; b[2] = 'X'; print(a, b); } } Se a instrução b=a; fosse omitida o que aconteceria? PARTE 2 Implemente os seguintes métodos estáticos e públicos da classe Grupo2: 1. void genNumbers(int inf, int sup), que mostra no standard output todos os números compreendidos entre inf e sup que resultam do produto de três números naturais consecutivos. Exemplo: Sejam inf=50 e sup=230. A saída produzida é 60 120 210 pois 3*4*5=60, 4*5*6=120 e 5*6*7=210. 2. boolean isNarcissisticNumber(int n), que deverá devolver true se o número recebido como parâmetro for um número narcisista. Um número diz-se narcisista quando o seu valor é igual ao somatório de cada algarismo elevado ao número de algarismos que o compõem. Por exemplo, o número 153 é narcisista, pois 153 = 13 + 33 + 53 = 1 + 27 + 125, e o número 1634 é narcisista pois 1634=14 + 64 + 34 + 44 = 1 + 1296 + 81 + 256. Realize a implementação do exercício sem usar funções da classe Math. 3. Faça um programa que apresente o Triângulo de Pascal para n "linhas" sendo o valor n lido do standard input. A seguir apresenta-se o Triângulo de Pascal para n igual a 6. 1 1 1 1 1 1 3 4 5 1 2 1 3 6 10 1 4 10 1 5 1 Processamento de Strings 4. Elabore um programa que leia uma linha de texto do standard input e apresente no standard output: • • • a maior palavra (considerando a ordem alfabética) e a sua posição relativa (começando em 1) dentro da linha de texto; a palavra com maior número de caracteres e a sua posição relativa dentro da linha de texto; a linha que resulta da inversão da ordem das palavras da linha de texto original, isto é, a última palavra passa a ser a primeira, a penúltima passa a ser a segunda, e assim sucessivamente. Exemplo: ENTRADA SAÍDA Maior palavra por ordem alfabetica: Sao - posicao: 5 Palavra de maior dimensao: Martinho, - posicao: 6 Estamos na altura do Sao Martinho, epoca das castanhas e agua-pe. Frase invertida: agua-pe. e castanhas das epoca Martinho, Sao do altura na Estamos 5. Realize o método public static String format(String s) que efectua a seguinte formatação da string recebida em parâmetro: retirar os espaços iniciais, espaços finais, e espaços entre palavras, deixando apenas um espaço a separar cada palavra; colocar a primeira letra de cada palavra em maiúscula e o resto em minúsculas. O método retorna a string formatada. Exemplo: ENTRADA s = “ jose lUiS estEVES SAÍDA cardosO ” “Jose Luis Esteves Cardoso” PARTE 3 Implemente os seguintes métodos estáticos e públicos da classe Grupo3: 1. int[] removeDups(int[] a), que recebe o array de inteiros a e devolve um novo array, mas sem os valores repetidos e de dimensão adequada, a estritamente necessária para armazenar os valores sem as repetições. ENTRADA a = {-3, 1, 4, 3, 1, 2, -3, 1} SAÍDA Retorna {-3, 1, 4, 3, 2} 2. int union(int[] a1, int[] a2, int[] res) que realiza a união de dois conjuntos de números inteiros (assuma que cada conjunto não contém elementos repetidos), representados pelos arrays a1 e a2. O resultado da união é colocado no array res passado em argumento. Assuma que res é construído previamente com dimensão suficiente para albergar o resultado da união. O método retorna o número de elementos efectivos do conjunto união. Implemente e compare informalmente dois algoritmos: o primeiro, em que os conjuntos recebidos são representados por sequências não ordenadas de inteiros; e o segundo, em que são recebidas sequências ordenadas de forma crescente. ENTRADA (sequências não ordenadas) a1 = {-4, 1, 7, 5, -2}; a2 = {-3, 1, -2, 3}; res = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0} ENTRADA (sequências ordenadas de forma crescente) a1 = {-4, -2 , 1, 5, 7}; a2 = {-3, -2, 1, 3}; res = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0} SAÍDA res = {-4, 1, 7, 5, -2, -3, 3, 0, 0, 0} (a ordenação dos elementos é arbitrária) Retorna 7 SAÍDA res = {-4, -3, -2, 1, 3, 5, 7, 0, 0, 0} Retorna 7 3. int intersection(int[] a1, int[] a2, int[] res) que realiza a intersecção de dois conjuntos de números inteiros, representados pelos arrays a1 e a2. Implemente igualmente as duas abordagens indicadas no ponto 2. ENTRADA (sequências não ordenadas) a1 = {0, -4, 1, 7, -6, 5, -2, -1}; a2 = {-3, 1, -2, 3, -4}; res = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0} ENTRADA (sequências ordenadas de forma crescente) a1 = {-6, -4, -2 , -1, 0, 1, 5, 7}; a2 = {-4, -3, -2, 1, 3}; res = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0} SAÍDA res = {-4, 1, -2, 0, 0, 0, 0, 0, 0, 0} (a ordenação dos elementos é arbitrária) Retorna 3 SAÍDA res = {-4, -2, 1, 0, 0, 0, 0, 0, 0, 0} Retorna 3