// Importa a classe Scanner, que será usada para leitura de dados
import java.util.Scanner;
public class Sum {
public static void main(String[] args) {
// Cria um objecto Scanner para ler da entrada padrão ("standard input")
Scanner stdin = new Scanner(System.in);
// Chama o método nextInt() para ir buscar o próximo inteiro
int a = stdin.nextInt();
int b = stdin.nextInt();
// Imprime a soma dos dois números
System.out.println(a+b);
}
}
import java.util.Scanner;
public class Count {
public static void main(String[] args) {
Scanner stdin = new Scanner(System.in);
// Ciclo para iterar sobre todas as linhas do input
int counter = 0;
while (stdin.hasNextLine()) {
counter++;
String s = stdin.nextLine();
System.out.println(counter + ": " + s);
}
}
}
Exercício 3) Usando arrays
import java.util.Scanner;
public class ReadNumbers {
// Escrever os numeros guardados num array no stdout
static void writeArray(int v[]) {
for (int i=0; i<v.length; i++)
System.out.println("v[" + i + "] = " + v[i]);
}
public static void main(String[] args) {
Scanner stdin = new Scanner(System.in);
int v[] = new int[10]; // Cria um novo array com espaço para 10 inteiros
int n = stdin.nextInt(); // Ler a quantidade de numeros que se seguem
for (int i=0; i<n; i++) // Ler os numeros a partir do stdin
v[i] = stdin.nextInt();
writeArray(v); // Chamar procedimento que escreve
}
}
- Executando o código.
Compile e execute este código, redirecionando o input a partir do ficheiro numbers.txt
$ java ReadNumbers < numbers.txt
- Posições do array por preencher.
Substitua o 10 no início do input por um 5 e execute novamente o programa. O que acontece? Porquê? Note como o atributo length de um array indica o tamanho que foi alocado, e não o número de posições "preenchidas". Note também qual o valor por omissão de um inteiro.
- Saindo fora dos limites do array. (ArrayIndexOutOfBoundsException)
Mude o ficheiro de input para passar a conter 11 números (mude a primeira linha para 11 e acrescente um número no final da segunda linha) e execute novamente o programa. O que acontece? Porquê? Note que ao contrário do C, o Java indica explicitamente quando saimos fora dos limites de um array.
Modifique o programa para passar a aceitar uma qualquer quantidade de números inteiros (a que for indicada na primeira linha de input) e teste a sua alteração.
- Calculando a amplitude.
Acrescente uma função que recebe um array e devolve um inteiro indicando a amplitude (diferença entre máximo e mínimo) dos valores guardados no array. Teste o seu funcionamento e certifique-se funciona independentemente da magnitude dos números (podem ser tão pequenos - incluindo números negativos - ou grandes como quiserem, assumindo que cabem num int).
Exercício 4) O meu primeiro problema no Mooshak

Nesta unidade curricular vamos usar o sistema Mooshak para avaliar automaticamente os programas feitos (ver ajuda do Mooshak).
- Para qualquer submissão é possível visualizar o resultado obtido em cada um dos testes feitos ao código submetido. É também possível aceder aos testes públicos onde o programa submetido não responde correctamente. Para isso basta carregar no resultado da submissão, que aparece a sublinhado na listagem.
Para aceder ao sistema use o seu login (sem "up")
e password correspondente à conta que tem no
DCC.
(se tiver problemas em aceder envie um email ao docente Pedro
Ribeiro)
- Resolva e submeta com sucesso o problema [ED183] Estatísticas
Dicas:
- Este problema é uma continuação do exercício anterior (falta acrescentar uma nova função para calcular a média)
- Para imprimir um double com duas casas decimais pode usar a instrução printf (como no C). Por exemplo, imprimir uma variável x com duas casas decimais seria System.out.printf("%.2f\n", x);
Exercício 5) Mais dois problemas no Mooshak
Para consolidar os conhecimentos destas duas primeiras aulas, submeta os seguintes problemas no Mooshak:
- Resolva e submeta com sucesso o problema [ED120] Desenhando um Losango
Algumas dicas:
- Este problema é essencialmente igual a algo sugerido na aula anterior;
- Para o resolver apenas necessita de saber como usar ciclos. Quantos pontos existem na primeira linha? E na segunda? E na terceira? E cardinais?
- Resolva e submeta com sucesso o problema [ED121] Palíndromos
- Para a leitura do input pode usar o que aprendeu exercicio 2 desta aula;
- Se quiser aceder ao i-ésimo caracter de uma String pode usar o método char charAt(int i), como viu na aula anterior.
- Primeiro converta a a linha lida numa string só com letras minúsculas (sem espaços e pontuações). Faça para isso uma função que receba uma string e devolva a mesma string com os espaços retirados e todas as maiúsculas convertidas em minúsculas. Para isso é útil conhecer a classe Character, que contém várias funções para lidar com caracteres. Em particular:
- A função boolean Character.isLetter(char c) indica se o caracter c é uma letra;
- A função char Character.toLowerCase(char c) converte o caracter para a sua versão minúscula
- Faça agora uma outra função que recebe uma string e devolve um valor booleano indicando se a string é ou não um palíndromo, sendo que pode aplicar esta função à linha já sem espaços e maiúsculas.
Exercícios extra para consolidação de conhecimentos
- Faça um programa para simular um autómato celular elementar.
- Pode ler sobre o que é por exemplo no Wolfram MathWorld ou na Wikipedia.
- A ideia será algo como receber como input o número da regra (um inteiro de 0 a 255), o tamanho n da "linha" e o número g de gerações, e mostrar no ecrã o estado das g primeiras gerações supondo que começa com uma única célula activa no meio da linha.
- Pode ver online exemplos do resultado esperado das várias regras.
- Faça um programa para traduzir texto para código morse e vice-versa.
Exercício de Desafio
Para esta semana o desafio tem a ver com a eficiência algorítmica. Deve tentar resolver o seguinte problema, que está disponível para submissão no Mooshak:
Devem submeter para verificar se a solução não só está correcta do ponto de vista do que calcula, mas também se está suficientemente eficiente e consegue responder em menos de um segundo seja qual for o input dentro das restrições dadas. Um programa correcto, mas não eficiente, irá obter resolver parcialmente o probema (passa nos testes "pequenos", mas excede o limite de tempo nos testes "grandes").
Para este problema não vou dar nenhuma dica, ficando à espera de ver os vossos programas :)
Nota: é também agora possível submeter o desafio da semana anterior no Mooshak de EDados.