quarta-feira, 4 de abril de 2012

Uso da classe Scanner

Um exercício que todas as pessoas que estão aprendendo a utilizar o Java se deparam é com a entrada e saída a partir de uma tela de texto. Vamos mostrar um exemplo simples utilizando a classe Scanner.

/*
 * Funcao: Le uma sequencia de números inteiros positivos da entrada,

 * imprime o menor e o maior
 * Condicao de final de programa: entrada negativa
 * Autor: Henrique
 */

import java.util.Scanner;

public class MostraMinMax {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int n = 1;      // numero da entrada de dados. começa em um
    int num;        // guarda a entrada de dados
    int nMin = 0;   // guarda o valor minimo da sequencia
    int nMax = 0;   // guarda o valor máximo da sequencia

    do {
        System.out.print("Entre com o inteiro # " + n + ": ");
        num = sc.nextInt();
        if (num >= 0) {
            if (n == 1) { // guarda a primeira entrada
              nMin = num;
              nMax = num;
            } else {
              if (num < nMin) nMin = num;
              if (num > nMax) nMax = num;
            }
              n++; // incrementa o contador
        }
    } while (num >= 0); // sai se digitamos um numero negativo

    n--;
    if (n == 0) {
          System.out.println("Nao foi feita entrada valida...");
    } else {
          System.out.println("O numero de entradas digitadas: " + num);
          System.out.println("O menor numero                : " + nMin);
          System.out.println("O maior numero                : " + nMax);
    }
  }
}


Notem alguns pontos bacanas deste programinha:
  • usamos a estrutura de programação
    • do {comandos} while {condição de parada}
  • o comando if quando tem somente um comando na condição then pode ser escrito sem as chaves usando o formato
    • if (testes) comando;
  • a classe Scanner lê um inteiro usando nextInt, mas possui ainda diversas outras variações como nextFloat, nextLine, nextByte, nextBoolean etc. Vale a pena dar uma olhada na definição da classe na documentação do Java (veja aqui).
  • reparem na criação do objeto sc da classe Scanner:
    • new Scanner(System.in);
      • a criação é feita utilizando uma InputStream, no nosso caso é um System.in que é a InputStream padrão.
      • O interessante desta solução é que a InputStream poderia ser uma porta serial, um arquivo local ou remoto, um site ...
Vamos ver os resultados:

Existem algumas variações que podem ser feitas no programa, como por exemplo eliminar o teste "if (n == 1) { ...". Como fazer isto? Veja abaixo o pedaço do código alterado:

    // usamos o subterfúgio de inicializar as variáveis com os valores minimo e
    // máximo para uma variável inteira.
    // note que nMin recebe o valor MÁXIMO e vice versa
    int nMin = Integer.MAX_VALUE;   // guarda o valor minimo da sequencia
    int nMax =
Integer.MIN_VALUE;   // guarda o valor máximo da sequencia

    do {
        System.out.print("Entre com o inteiro # " + n + ": ");
        num = sc.nextInt();
        if (num >= 0) {
           if (num < nMin) nMin = num;
           if (num > nMax) nMax = num;
           n++; // incrementa o contador
        }