Pontifícia Universidade Católica de São Paulo Departamento de Ciência da Computação LP: Laboratório de Programação Apontamento 12 Prof. ISVega Abril de 2004 Interação com o Usuário CONTEÚDO 12.1Módulo console................... 1 12.2Serviços de Objetos Screen............ 3 12.3Serviços de Objetos Keyboard........... 4 12.4 Aplicações com o Módulo console.jar..... 5 Exercícios.......................... 9 Objetivos Apresentar uma biblioteca de interação com o usuário. Estudar exemplos de uso da biblioteca. 12.1 Módulo console A interação básica entre um usuário e um sistema computacional envolve a presença de um mecanismo para entrada de dados e comandos, e outro para apresentação dos resultados da computação. Tais mecanismos são normalmente conhecidos pelos nomes keyboard e screen (respectivamente). A Figura 12.1 ilustra o padrão do fluxo de informação entre usuários e sistemas computacionais que se utilizam destes mecanismos. 1
Usuário Screen Keyboard console Figura 12.1: Mecanismos básicos de interação entre usuários e sistemas computacionais. Dá-se o nome de console ao conjunto keyboard-screen. Do ponto de vista de programação, entretanto, trabalha-se com abstrações destes mecanismos. O módulo console contém a classe Keyboard que pode ser utilizada em um programa para acesso aos mecanismos físicos de interação de entrada do sistema computacional. O módulo console oferece recursos para administrar o acesso aos dispositivos de comunicação de entrada externa com o sistema computacional. Pacote console.jar Para ser utilizado no ambiente Java, este módulo foi codificado no pacote console.jar, que disponibiliza a classe Console e duas interfaces desta classe para interação entre um usuário e uma aplicação: Keyboard e Screen (Figura 12.2). Este módulo corresponde ao pacote "console.jar" em Java. console <<interface>> Screen <<create>> Console <<interface>> Keyboard <<create>> Figura 12.2: Classes do módulo console. Comando import Em um programa, o acesso a estes elementos força a presença do seguinte comando Java no início do arquivo: import console.console; import console.keyboard; import console.screen; Estes comandos Java incorporam os nomes Console, [Keyboard e Screen no universo de identificadores que podem ser utilizados na escrita de classes com comunicação externa com o usuário. Copyright c 1998-2004, Dr. Italo S. Vega 12-2
Pacotes Opcionais no Ambiente Java O ambiente de desenvolvimento Java admite extensões funcionais por um mecanismo conhecido por optional packages. Com este mecanismo, desenvolvedores podem extender a funcionalidade básica do ambiente Java. Pacotes opcionais são incluídos em arquivos com extensão.jar, sendo instalados nos diretórios: <diretório de instalação do JRE>\lib\ext <diretório de instalação do SDK>\jre\lib\ext com JRE sendo o Java Runtime Environment, e SDK o Sun Development Kit. Exemplo 12.1 Supondo que os diretórios JRE e SDK sejam: JRE c:\arquivos de programas\java\j2re1.4.2 02 SDK c:\j2sdk1.4.2 02 então o pacote opcional console.jar deve ser copiado para os diretórios: c:\arquivos de programas\java\j2re1.4.2 02\lib\ext c:\j2sdk1.4.2 02\jre\lib\ext A partir deste momento, aplicações que fazem uso de Console e Keyboard podem ser desenvolvidas e compiladas normalmente. 12.2 Serviços de Objetos Screen Um objeto da classe Screen modela a tela do computador. Serviços típicos deste objetos seguem o padrão writeprimitivo(), onde Primitivo pode ser: Byte, Short, Int, Long, Float, Double, Boolean ou String. A Figura 12.3 apresenta serviços adicionais oferecidos por este objeto. <<interface>> Screen + writechar(valor : char) : void + writeint(valor : int) : void + writefloat(valor : float) : void + writedouble(valor : double) : void + writestring(valor : String) : void + newline() : void + newline(x : int) : void + print(x : String) : void + println(x : String) : void Figura 12.3: Serviços do objeto Screen. Descrição dos Serviços int writebyte(byte x) // escreve o byte x int writeshort(short x) // escreve o short x int writeint(int x) // escreve o int x char writelong(long x) // escreve o long x Copyright c 1998-2004, Dr. Italo S. Vega 12-3
float writefloat(float x) // escreve o float x double writedouble(double x) // escreve o double x double writeboolean(boolean x) // escreve o boolean x String writestring(string x) // escreve o String na x void print(string msg) // Imprime msg sem pular linha void println(string msg) // Imprime msg pulando uma linha void newline() // Pula uma linha void newline(int n) // Pula "n" linhas 12.3 Serviços de Objetos Keyboard Um objeto do tipo Keyboard modela o teclado do computador. As operações oferecidas por um objeto deste tipo são listadas na Figura 12.4. <<interface>> Keyboard + readchar() : char + readchar(msg : String) : char + readint() : int + readint(msg : String) : int + readfloat() : float + readfloat(msg : String) : float + readdouble() : double + readdouble(msg : double) : double + readstring() : String + readstring(msg : String) : String Figura 12.4: Operações de um objeto do tipo Keyboard. Descrição dos Serviços Os serviços de um Keyboard são utilizados para obter um valor digitado pelo usuário durante a execução de um passo de computação. Neste passo, o cálculo é suspenso até que o usuário digite o valor solicitado. Cada serviço obtém um valor com tipo específico: a obtenção de caracteres é feita com a ativação da operação readchar():char; no caso de números, pode-se ativar a operação readint():int, que retorna um valor do tipo int; e assim por diante. Estes serviços também podem ser ativados, passando-se um texto a ser apresentado para o usuário, antes do bloqueio da computação. O texto pode conter uma pergunta caracterizando a natureza do valor a ser digitado pelo usuário. Na maior parte dos casos, esta será a forma preferida de serviços a serem solicitados a um Keyboard. Exemplo 12.2 Para solicitar que o usuário digite um número inteiro, a seguinte codificação pode ser feita: obtenção de um número inteiro public Keyboard t; public int x; public void obterx() { t = Console.getKeyboard(); Copyright c 1998-2004, Dr. Italo S. Vega 12-4
x = t.readint( "x? " ); Este trecho de código deve ser inserido em uma classe, como mostrado a seguir: lab//exemploint.java import console.console; import console.keyboard; public class ExemploInt { obtenção de um número inteiro public static void main( String[] args ) { ExemploInt exemplo = new ExemploInt(); exemplo.obterx(); System.out.println( "x= " + exemplo.x ); O método main() estabelece a rota principal dos passos desta computação. primeiro lugar, cria-se um objeto exemplo da classe ExemploInt. Ao receber a mensagem obterx(), este objeto solicita que o usuário digite um número int. Para o usuario, aparece o texto "x? ", indicando que a computação está suspensa, aguardando que ele digite um valor. Após a digitação (que se encerra quando o usuário pressiona a tecla <enter>), o valor é armazenado na variável x, interna ao objeto exemplo. O valor digitado pelo usuário encontra-se armazenado na variável empregado.x. Este valor é apresentado na última linha do método main(). Em 12.4 Aplicações com o Módulo console.jar Exemplo 12.3 O cálculo da área de um círculo a partir do seu raio pode ser feito aplicando-se a fórmula (Figura 12.5): area = πr 2 r área Figura 12.5: Elementos para o cálculo da área de um círculo. Copyright c 1998-2004, Dr. Italo S. Vega 12-5
A obtenção do valor do raio do círculo pode ser codificado como: Obtenção do raio do círculo public double raio; public void obterraio() { t = Console.getKeyboard(); raio = t.readdouble( "Raio? " ); De posse deste valor, codifica-se o cálculo da área: Cálculo da área do círculo public double area; public void calculararea() { area = Math.PI * raio * raio; O programa final pode ser montado, compondo-se os trechos de código anteriores na classe Circulo: lab//circulo.java import console.console; import console.keyboard; public class Circulo { Obtenção do raio do círculo Cálculo da área do círculo public Keyboard t; public static void main( String[] args ) { Circulo c = new Circulo(); // <- (1) c.obterraio(); // <- (2) c.calculararea(); // <- (3) System.out.println( c.area ); // <- (4) Copyright c 1998-2004, Dr. Italo S. Vega 12-6
A operação main() define os passos da rota de execução principal: 1. Cria-se o objeto c:circulo. 2. Envia-se a mensagem para obter o valor do raio. 3. Envia-se a mensagem para que o círculo c calcule a sua área. 4. Apresenta-se, no monitor, o valor da variável area, interna ao objeto c. Este valor representa a área do círculo. Exemplo 12.4 A média de um aluno é calculada pela fórmula: MF = P1 + P2 2 A determinação do valor da nota da prova P1 pode ser descrita pelo seguinte trecho de código: Determinação da nota da prova P1 public double p1; public void obterp1() { t = Console.getKeyboard(); p1 = t.readdouble( "P1? " ); A determinação do valor da nota da prova P2 segue um padrão similar: Determinação da nota da prova P2 public double p2; public void obterp2() { t = Console.getKeyboard(); p2 = t.readdouble( "P2? " ); Com os valores das notas das provas armazenadas nas variáveis p1 e p2, o cálculo da média final pode ser feito e armazenado na variável mf da seguinte forma: Cálculo da média das notas public double mf; public void calcularmf() { mf = (p1 + p2) / 2.0; O programa pode ser montado, compondo-se os trechos de código anteriores na classe Aluno: Copyright c 1998-2004, Dr. Italo S. Vega 12-7
lab//aluno.java import console.console; import console.keyboard; public class Aluno { Determinação da nota da prova P1 Determinação da nota da prova P2 Cálculo da média das notas public Keyboard t; public static void main( String[] args ) { Aluno a = new Aluno(); // <- (1) a.obterp1(); // <- (2) a.obterp2(); // <- (3) a.calcularmf(); // <- (4) System.out.println( a.mf ); // <- (5) A operação main() define os passos da rota de execução principal: 1. Cria-se o objeto a:aluno. 2. Envia-se a mensagem para obter a nota da P1. 3. Envia-se a mensagem para obter a nota da P2. 4. Envia-se a mensagem para que o aluno a calcule a média final. 5. Apresenta-se, no monitor, o valor da variável mf, interna ao objeto a. Este valor representa a média das notas das provas. Copyright c 1998-2004, Dr. Italo S. Vega 12-8
EXERCÍCIOS 12.1 INSTALAÇÃO DO C O N S O L E.J A R Tarefa 12.1.1 Tarefa 12.1.2 lib\ext Tarefa 12.1.3 Tarefa 12.1.4 jre\lib\ext Tarefa 12.1.5 Localize o diretório JRE no seu ambiente de trabalho. Copie o arquivo console.jar para o diretório Localize o diretório SDK no seu ambiente de trabalho. Copie o arquivo console.jar para o diretório Crie o arquivo Teste.java no diretório ex12.1: lab//teste.java import console.console; public class Teste { public static void main( String[] args ) { Console.getScreen().println("Instalacao OK"); Tarefa 12.1.6 Compile o arquivo de teste com o seguinte comando: javac Teste.java Tarefa 12.1.7 Execute o arquivo de teste com o seguinte comando: java Teste A frase "Instalacao OK" deve aparecer na tela do computador. 12.2 USO DO KEYBOARD Tarefa 12.2.1 Crie o arquivo ExemploInt.java no diretório ex12.2: Tarefa 12.2.2 Digite, neste arquivo, o código apresentado no exemplo 12.2. Tarefa 12.2.3 javac ExemploInt.java Tarefa 12.2.4 java ExemploInt Compile o arquivo ExemploInt.java com o seguinte comando: Execute o programa ExemploInt.class com o seguinte comando: A computação ficará suspensa até que você digite um número inteiro. Tarefa 12.2.5 Reexecute o programa ExemploInt.class, mas digite, ao invés de um número inteiro, uma frase (ex.: "fim"). Qual valor é armazenado na variável exemplo.x? Copyright c 1998-2004, Dr. Italo S. Vega 12-9
12.3 CÁLCULO DE ÁREAS Tarefa 12.3.1 Crie o arquivo Circulo.java no diretório ex12.3: Tarefa 12.3.2 Digite, neste arquivo, o código apresentado no exemplo 12.3. Tarefa 12.3.3 Execute o programa e confira os resultados na seguinte tabela: Raio Área 1 3.141592653589793 5 78.53981633974483 85 22698.006922186254 12.4 CÁLCULO DE MÉDIAS Tarefa 12.4.1 Crie o arquivo Aluno.java no diretório ex12.4: Tarefa 12.4.2 Digite, neste arquivo, o código apresentado no exemplo 12.4. Tarefa 12.4.3 Preencha a seguinte tabela de avaliações: Aluno P1 P2 MF Zé 3.7 4.8 Ana 6.3 8.5 Gil 2.4 9.9 Copyright c 1998-2004, Dr. Italo S. Vega 12-10