Document

Propaganda
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
Download