You are on page 1of 154

Java: A Linguagem de Programao

por Prof. Dr. Paulo Roberto Gomes Luzzardi

e-mail /msn/facebook/orkut luzzardi@atlas.ucpel.tche.br e-mail pluzzardi@gmail.com Home Page http://infovis.ucpel.tche.br/luzzardi http://graphs.ucpel.tche.br/luzzardi Grupo de TV Digital Interativa http://www.tvdi.inf.br/site/ Grupo de Computao Grfica http://infovis.ucpel.tche.br

Verso 1.37 14-04-2012

Bibliografia DEITEL, H. M. and DEITEL, P. J. Java, como programar, 4 ed.: Porto Alegre: Bookman, 2003 (ISBN 85-363-0123-6).

Pelotas, segunda-feira, 14 de abril de 2012 (20:56:04 pm)

Sumrio
1. Arquitetura de um programa em Java ..................................................................................... 5 1.1 Elementos bsicos de um programa em Java ......................................................... 5 1.2 Elementos bsicos de um mtodo esttico ........................................................... 5 1.3 Como compilar um programa em Java via Terminal ........................................... 5 1.4 Como executar um programa em Java via Terminal ........................................... 5 1.5 Pasta contendo os projetos/arquivos em Java .................................................. 5 2. Estrutura de um programa em Java .......................................................................................... 6 2.1 Identificadores ..................................................................................................................... 6 2.2 Comentrios do programador ........................................................................................... 6 2.3 Regras gerais para escrever um programa em Java ........................................ 7 2.4 Palavras reservadas do Java ........................................................................................ 8 2.5 Declarao de variveis .................................................................................................. 8 2.5.1 Onde as variveis podem ser declaradas ..................................................... 8 2.5.2 Inicializao de variveis ................................................................................ 10 2.6 Constantes ............................................................................................................................... 10 2.6.1 Constantes hexadecimais e octais ................................................................. 10 2.6.2 Constantes Strings ................................................................................................... 11 2.6.3 Constantes especiais .............................................................................................. 11 2.7 Comandos do pr-processador do Java ................................................................... 11 2.7.1 O comando import ........................................................................................................ 11 3. Tipos de dados ................................................................................................................................... 12 3.1 Tipos bsicos ........................................................................................................................ 12 3.2 Escrevendo uma classe em Java ................................................................................. 12 3.2.1 Conceitos bsicos ......................................................................................................... 12 3.2.2 Referncia this .............................................................................................................. 14 3.2.3 Lista de Exerccios sobre Classes ................................................................... 15 3.3 Sobrecarga de mtodos em Java ................................................................................. 27 4. Mtodos de entrada e sada de dados ................................................................................ 29 4.1 Entrada de dados via teclado .................................................................................... 29 4.2 Sada de dados via tela ................................................................................................ 30 5. Operadores ............................................................................................................................................ 32 5.1 Operadores aritmticos .................................................................................................. 32 5.2 Operadores relacionais .................................................................................................. 32 5.3 Operadores lgicos ............................................................................................................ 32 5.4 Incremento e decremento ................................................................................................ 33 5.5 Operador de atribuio .................................................................................................. 33 5.6 Casts ........................................................................................................................................... 34 5.7 Expresses ............................................................................................................................... 35 6. Mtodos para funes matemticas padres .................................................................... 36 6.1 Math.abs .................................................................................................................................... 36 6.2 Math.asin ................................................................................................................................. 36 6.3 Math.acos ................................................................................................................................. 36 6.4 Math.atan ................................................................................................................................. 36 6.5 Math.sin .................................................................................................................................... 36 6.6 Math.cos .................................................................................................................................... 36 6.7 Math.tan .................................................................................................................................... 37 6.8 Math.exp .................................................................................................................................... 37 6.9 Math.pow .................................................................................................................................... 37 6.10 Math.sqrt ............................................................................................................................... 37 6.11 Math.log ................................................................................................................................. 37 6.12 Double.parseDouble ......................................................................................................... 37 6.13 Integer.parseInt .............................................................................................................. 37 6.14 Long.parseLong ................................................................................................................... 37 6.15 Math.log10 ............................................................................................................................. 37

6.16 Math.random .......................................................................................................................... 38 6.17 Math.PI .................................................................................................................................... 38 6.18 Converso de graus para radianos ........................................................................ 38 7. Comandos ................................................................................................................................................. 39 7.1 Tipos de comandos .............................................................................................................. 39 7.1.1 Sequncia ......................................................................................................................... 39 7.1.2 Seleo ............................................................................................................................. 39 7.1.3 Repetio ......................................................................................................................... 40 7.2 Comando if ............................................................................................................................... 41 7.2.1 if encadeados ............................................................................................................... 42 7.3 O comando switch ................................................................................................................. 42 7.4 Comando while ........................................................................................................................ 45 7.5 O comando for ........................................................................................................................ 46 7.6 O loop do { } while ......................................................................................................... 48 7.7 Interrupo de loops ....................................................................................................... 48 7.7.1 O comando break .......................................................................................................... 48 7.7.2 O comando continue ................................................................................................... 49 7.8 O mtodo System.exit () ................................................................................................ 49 8. Sada formatada (System.out.printf) ................................................................................ 50 9. Lista de exerccios (comandos) ............................................................................................ 51 10. Vetores, Matrizes e Strings ................................................................................................. 55 10.1 Vetores .................................................................................................................................... 55 10.2 Strings .................................................................................................................................... 55 10.3 Matrizes (Multidimensional) .................................................................................... 56 10.4 Vetor de Strings .............................................................................................................. 57 10.5 Inicializao de matrizes e vetores ................................................................. 58 10.6 Inicializao de um vetor de caracteres ....................................................... 58 10.7 Inicializao de matrizes multidimensionais ............................................. 58 10.8 Inicializao de vetores e matrizes sem tamanho .................................... 58 10.9 Classificao de dados ou ordenao (sort) ................................................ 60 10.10 Lista de exerccios (vetores) ............................................................................. 61 11. Manipulao de Strings ............................................................................................................. 64 11.1 Mtodos para manipular Strings ............................................................................. 64 11.2 Lista de exerccios (Strings) ............................................................................... 68 12. Mtodos estticos definidos pelo programador ........................................................ 70 12.1 Valores de retorno ......................................................................................................... 71 12.2 Passagem de parmetros por valor ........................................................................ 73 12.3 Passagem de parmetros por referncia ............................................................ 74 12.4 Mtodos que devolvem valores no-inteiros .................................................. 74 12.5 Argumentos do main (String [] args) ................................................................. 75 12.6 Recursividade ..................................................................................................................... 76 12.7 Lista de Exerccios (mtodos) ............................................................................... 78 13. Classes (Interface ou Coleo) existentes em Java (Container) ................ 81 14. Entrada e sada em disco (Arquivos) .............................................................................. 95 14.1 Mtodos para manipular arquivos em Java ....................................................... 95 14.2 Abertura de um arquivo texto ................................................................................. 97 14.3 Listar um diretrio ....................................................................................................... 98 14.4 Manipulao de um arquivo de palavras ............................................................ 98 14.5 Arquivo Texto ................................................................................................................... 101 14.6 Lista de exerccios (arquivos) ........................................................................... 104 15. Conceitos diversos em Java .................................................................................................. 108 15.1 Operadores bit a bit ................................................................................................... 108 15.2 Formas abreviadas de Java ....................................................................................... 108 16. Listas Lineares: Pilha, Fila e Fila Circular ...................................................... 109 16.1 Implementao de um lista em vetor ................................................................. 109 16.2 Implementao de uma Pilha .................................................................................... 113

16.3 Implementao de uma Fila ....................................................................................... 114 16.4 Implementao de uma Fila Circular ................................................................. 115 17. Tratamento de erros .................................................................................................................. 118 17.1 Tratamento de excees .............................................................................................. 119 17.2 Tratamento de erros: Entrada de nmero inteiro via teclado ....... 119 17.3 Tratamento de erros: Diviso por zero .......................................................... 119 17.4 Tratamento de exceo com Exception ............................................................... 120 17.5 Tratamento de exceo com MyException .......................................................... 121 17.6 Exceo em ArrayList ................................................................................................... 121 17.7 Excees criadas pelo programador ................................................................... 122 18. Herana em Java ............................................................................................................................ 125 18.1 Herana simples ............................................................................................................... 125 18.2 Controle de acesso na definio de uma classe derivada ................. 125 18.3 Tipos de acessos (especificadores de acesso) ......................................... 127 18.4 Lista de exerccios sobre Herana ................................................................... 128 18.4.1 Herana (primeiro) ................................................................................................... 128 18.4.2 Herana (segundo) ..................................................................................................... 129 18.4.3 Herana (terceiro) ................................................................................................... 130 19. Coletor de Lixo (Garbage Collector) ............................................................................ 132 20. Construtor e finalizador em Java ................................................................................... 133 21. Applets em Java ............................................................................................................................ 134 22. Threads em Java ............................................................................................................................ 138 23. Sockets em Java ............................................................................................................................ 139 24. Data e Hora em Java .................................................................................................................. 141 25. Glossrio em Java ....................................................................................................................... 142 26. Curiosidades do Java ................................................................................................................ 145 27. Classe Object ................................................................................................................................. 146 28. Classe ArrayDeque ....................................................................................................................... 148 29. Formatar um double, float ou int ................................................................................... 151 30. Leitura e gravao de objetos (registro) em Arquivos ................................... 152 30.1 Gravao de objetos em um arquivo binrio de objetos ...................... 152 30.2 Leitura objetos em um arquivo binrio de objetos ............................... 153

1. Arquitetura de um programa em Java


1.1 Elementos bsicos de um programa em Java
package nome_do_pacote; public class nome_da_classe { // depois de compilado: nome_da_classe.class public static void main(String[] args) { corpo_do_programa; System.exit(0); } } Programa Fonte: nome_da_classe.java Classe Java Compilada: nome_da_classe.class (ByteCode) // mtodo principal

// finalizar o programa definitivamente

1.2 Elementos bsicos de um mtodo esttico


public static tipo_de_retorno nome_do_mtodo(tipo_do_agumento nome_do_argumento, ...) { corpo_do_mtodo; return(valor_de_retorno); }

1.3 Como compilar um programa em Java via Terminal


$ javac Teste.java <enter> $ // gera um arquivo Teste.class

1.4 Como executar um programa em Java via Terminal


$ java Teste <enter> $

1.5 Pasta contendo os projetos/arquivos em Java


/Users/luzzardi/NetBeansProjects /Users/Luzzardi/Documents/NetBeansProjects /home/luzzardi/NetBeansProjects // MacOsX // Windows // Linux - Ubuntu

2. Estrutura de um programa em Java


2.1 Identificadores So os nomes criados pelo programador para fazer referncia a variveis, constantes, argumentos, atributos e mtodos. Regras para a criao de identificadores: O primeiro caracter pode ser uma letra, ( $ ) ou sublinha ( _ ); Os caracteres seguintes devem ser letras, nmeros ou sublinhas; No h limite de caracteres; No permitido a utilizao de caracteres em branco (caracter espao); Podem ser letras maisculos e minsculos.

Convenes: Sempre comear um identificador com uma letra e no "$" ou "_". Os caracteres $ e _ nunca devem ser usados. Use nomes completos em vez de abreviaes confusas. Palavras-chaves e palavras reservadas da linguagem no podem ser usadas como identificadores. Se o identificador tiver mais de um nome, o primeiro deve comear com letra minscula e os demais devem comear com letras maisculas (int numeroDentes = 0). int numeroDentes = 32; double inflacao; char a, _a; // _a deve ser evitado

Exemplos em variveis:

Exemplos em constantes: final char letra = A; final int tamanho = 10; final double d = 123.45; Exemplos de argumentos: public int Div(int x, int y) { public boolean strChr(String s, char ch) { Exemplos de atributos: private int numElementos; private int []vetor; private int topo; x = raizQuadrada(y); System.out.println(Valor: + inverso(n));

Exemplos em mtodos:

Observao: o mtodo inverso definido pelo programador (1/n). 2.2 Comentrios do programador Os comentrios do programador so linhas de cdigo que no so compiladas pelo compilador, ou seja, servem apenas como anotaes (documentao) para serem lembradas mais tarde (por exemplo, quando forem feitas manutenes no programa). Em Java os comentrios podem ser feitos de duas formas: /* Assim pode ser usado para comentrio de vrias linhas */ // Isto um comentrio de uma linha apenas

Um comentrio, pode ainda, utilizar vrias linhas do programa. Veja o exemplo abaixo:
/* ---------------------------------------------------Mtodo: STRING Argumentos de entrada: x, y Argumentos de sada: c[], t[] Retorno: Sem Retorno ------------------------------------------------------- */

2.3 Regras gerais para escrever um programa em Java Um programa em Java constitudo de uma ou mais classes delimitadas por chaves { }, onde uma destas classes, obrigatoriamente possui um mtodo chamada main(). As principais regras so: Letras maisculas e minsculas so tratadas como caracteres diferentes; O formato do texto livre; O mtodo main(){} especifica onde o programa comea e termina de ser executado; Todos os comandos so terminados por ponto e vrgula; Todas as variveis devem ser declaradas; { mtodo comea a ser executado; } mtodo termina de ser executado. (1): Imprimir a data no seguinte formato: [Data:

Programa exemplo dd/mm/aaaa].

// -------------------------------------------- Fonte: Prog1.java package prog1; public class Prog1 { public static void main(String[] args) { int dia, mes, ano; dia = 12; mes = 6; ano = 2006; System.out.printf("Data: %02d/%02d/%04d\n", dia, mes, ano); System.exit(0); } }

ou
// -------------------------------------------- Fonte: Prog1.java package prog1; public class Prog1 { public static void main(String[] args) { int dia = 12; int mes = 6; int ano = 2006; System.out.println("Data: " + dia + "/" + mes + "/" + ano); System.exit(0); } }

2.4 Palavras reservadas do Java abstract catch do final implements long private static throw void const boolean break char class double else finaly float import instanceof native new protected public super switch throws transient volatile while goto (no usadas) byte continue extends for int null return synchronized true case default false if interface package short this try

Observao: As palavras reservadas no podem ser utilizadas pelo programador como nome de variveis, constantes, argumentos, atributos ou mtodos, ou seja, no servem como identificadores. 2.5 Declarao de variveis Sintaxe: tipo_dado_base lista_de_variveis; tipo_dado_base: deve ser um tipo de dado vlido (boolean, char, int, byte, short, long, float, double ou void) lista_de_variveis: um ou mais identificadores separados por vrgula. Exemplo: int i, j ,k; float a, b; char ch; 2.5.1 Onde as variveis podem ser declaradas Definidas fora de todas os mtodos, incluindo o mtodo main() so chamadas de variveis globais e podem ser acessadas em qualquer parte do programa. Estas variveis so alocadas estaticamente na memria RAM (Random Access Memory Memria de acesso randmico). Quando definidas dentro de um mtodo so chamadas de variveis locais e s podem ser acessadas dentro deste mtodo. Estas variveis so alocadas dinamicamente na memria RAM. Na declarao de parmetros formais (argumentos) de um mtodo. Sendo estas locais e alocadas dinamicamente na memria RAM.

Observao: Memria ROM (Read Only Memory Memria somente de leitura). Alocao de memria: (Reserva de espao de memria (RAM) para alocar uma varivel) Alocao esttica de memria: Tipo de alocao de memria em que uma varivel alocada (tem um espao reservado) na memria RAM durante toda a execuo do programa. Este espao de memria desalocado somente quando o programa acaba. Alocao dinmica de memria: Tipo de alocao de memria em que uma varivel alocada (tem um espao reservado) na memria RAM temporariamente. Este espao de memria desalocado quando o espao no mais necessrio (coleta automtica de lixo garbage collector).

Programa exemplo (2): O programa realiza uma operao de potncia Xy.


// -------------------------------------------- Fonte: Prog2.java package prog2; import java.util.Scanner; public class Prog2 { static double resultado; public static void main(String[] args) { // definio das variveis locais Scanner entrada = new Scanner (System.in); String s; double base, expoente; // mtodo que permite imprimir na tela em modo texto System.out.print("Base: "); // mtodo que permite entrada de dados via teclado em terminal texto s = entrada.nextLine(); // mtodo que converte String em double base = Double.parseDouble(s); System.out.print("Expoente: "); s = entrada.nextLine(); expoente = Double.parseDouble(s); // chamada do mtodo POT resultado = POT(base, expoente); // mtodo que imprime na tela com formatao do nmero System.out.printf("Resposta = %7.2f\n", resultado); // termina o programa System.exit(0); } // ---------------------------------- mtodo esttico POT static double POT (double x, double y) { // corpo do mtodo POT definido pelo programador // os argumentos x e y so variveis locais // definio de uma varivel local double resp; resp = Math.exp(Math.log(x) * y); return(resp); // retorno do mtodo } } // importar classe Scanner // definio da classe Prog2 // varivel global

Variveis globais: resultado Variveis locais: base, expoente, resp, x, y Compilar por linha de comandos (via terminal):
$ javac Prog2.java <enter> $ // gera arquivo Prog2.class

Executar por linha de comandos (via terminal):


$ java Prog2 <enter> // executa o arquivo Prog2.class

2.5.2 Inicializao de variveis Em Java possvel fornecer valores iniciais a maioria das variveis ao mesmo tempo em que elas so declaradas, colocando um sinal de igual e uma constante aps o nome da varivel. tipo_dado_base nome_da_varivel = constante; Exemplos:
char ch = 'a'; // tipo_dado_base nome_da_varivel = constante_caracter String s = Pelotas; // tipo_dado_base nome_da_varivel = constante_string int n = 0; // tipo_dado_base nome_da_varivel = constante_inteira float y = 123.45f; // tipo_dado_base nome_da_varivel = constante_real double z = 123.45; int [] v = {10, 20, 30}; // vetor unidimensional int [][] t = {{1, 2}, {3, 4}, {5, 6}}; // matriz bidimensional String [] cidade = {Pelotas, Rio Grande, Poa}; char [] caracter = {S, s, N, n};

2.6 Constantes Valores fixos que o programa no pode alterar. As constantes podem ser de qualquer tipo bsico. Tipo char int float String Exemplos de constantes 'a' 'n' 1 123 123.23 "Java" '9' 2100 -234 4.34e-3
(classe String)

2.6.1 Constantes hexadecimais e octais A linguagem de programao Java permite especificar constantes inteiras em octal. Uma constante octal comea com um 0 (zero) antes dos demais nmeros. Exemplos: int hexadecimal = 0xf; int octal = 011; Observaes: Qualquer nmero octal formado por oito nmeros ( 0 .. 7 ). Qualquer nmero hexadecimal formado por dezesseis nmeros (0 ..9, A, B, C, D, E, F).
// 15 em decimal // 9 em decimal

// ------------------------------------------------------------- Fonte: Hexadecimal.java package hexadecimal; public class Hexa { public static void main(String[] args) { for (int decimal = 0;decimal <= 16; decimal++) { String hexaDecimal = Integer.toHexString(decimal); System.out.println("Decimal: " + decimal); System.out.println("Hexadecimal: " + hexaDecimal); // int hexaToDecimal = Integer.parseInt(hexaDecimal, 16); // System.out.println("Hexadecimal para Decimal: " + hexaToDecimal); } } }

10

2.6.2 Constantes Strings Uma String um conjunto de caracteres delimitados por aspas duplas. Em Java existe uma classe especfica para trabalhar com Strings (classe String). Uma String finalizada pelo caracter especial \0 (chamado de null). Exemplo: String s = "UCPel"; \0 igual a null
0 U 1 C 2 P 3 e 4 l 5 null

Figura 1: String Memria ocupada: 6 bytes Observao: 'a' diferente de "a"


'a' ocupa 1 byte na memria RAM ( do tipo char) "a" ocupa 2 bytes na memria (toda String terminada com o caracter null)

A palavra null quer dizer nulo. Vetor de Strings:


String [] s = {Paulo, Roberto, Gomes, Luzzardi};

Vetor de caracteres:
char [] s = {'U', 'C', 'P', 'e', 'l'}; char ch = \0;

2.6.3 Constantes especiais As constantes especiais so usadas para representar caracteres que no podem ser inseridos pelo teclado. So elas: Tabela 1: Constantes especiais
Constante \b \f \n \r \t \ \ \\ \o \x Significado Retrocesso Alimentao de formulrio Nova linha Retorno de carro <CR> Tab horizontal Aspas duplas Aspas simples Barra invertida Constante octal Constante hexadecimal

2.7 Comandos do pr-processador do Java 2.7.1 O comando import O comando import faz o compilador incluir um pacote de classes dentro do programa fonte. Cada pacote possui diversas classes.
import java.util.Scanner; // pacote java.util e a classe Scanner import javax.swing.*; // pacote javax.swing e avisa que vai usar uma das classes import java.awt.Graphics2d; // pacote java.awt e a classe Graphics2d

Na URL abaixo voc encontra as diversas api Java:


URL: http://java.sun.com/j2se/1.5.0/docs/api/ Resumo: Um pacote possui um conjunto de classes.

11

Exemplo: import javax.swing.JOptionPane; Pacote: javax.swing Classe: JOptionPane Chamada de um dos Mtodos da classe JOptionPane: JOptionPane.showMessageDialog(); Sintaxe: nomeClasse.nomeMtodo(lista_de_argumentos); // chamada de mtodos estticos

3. Tipos de dados
3.1 Tipos bsicos A tabela abaixo exibe os oito (8) tipos de dados bsicos que podem ser utilizados pelo programador para definir suas variveis. Na Tabela 2 so exibidos os tipos bsicos, a quantidade de bits, a faixa de valores vlida e o nmero de bytes que cada tipo de dados ocupa na memria RAM (memria principal) ou em disco (quando armazenados na memria secundria). Tabela 2: Tipos de dados
Tipo boolean char byte short int long float double Bytes 1 2 1 2 4 8 4 8 Bits 8 16 8 16 32 64 32 64 Faixa de valores true ou false 0 65.535 -128 127 -32.768 32.767 -2.147.483.648 2.147.483.647 -2E63 2E63-1 1.40239846e-46 3.40282347e+38 4.94065645841246544e-324 1.7976931348623157e+308

3.2 Escrevendo uma classe em Java 3.2.1 Conceitos bsicos O paradigma orientado objetos possui cinco componentes bsicos: objetos (possui atributos e mtodos), mensagens (chamada dos mtodos), classes (tipo de dado), instncias (criao de objetos new) e mtodos (funes definidas pelo programador que manipulam os atributos). Objetos, mensagens, classes, instncias e mtodos Objetos so entidades lgicas que contm atributos (dados armazenados em variveis) e mtodos (funes) que manipulam estes dados. Um objeto pode ser definido atravs de um tipo de dado chamado classe (class). Resumo: a) Atributos: So as variveis definidas e declaradas para cada objeto. b) Mtodos: So as funes definidas pelo programador que serviro para manipular os atributos. c) Mensagens: So as chamadas dos mtodos. d) Classe: um tipo de dado definido por class. Uma classe no um objeto, sim uma descrio do objeto. e) Instncia: Os objetos so instncias de uma classe. Resumidamente, objetos so instncias de classes que respondem as mensagens atravs dos mtodos escritos pelo programador.

12

Exemplo de uma classe Vetor:


// -------------------------------------------------------- Vetor.java package testavetor; public class Vetor { // -------------------------- atributos private int[] vetor; private int n; private int max; // ------------------------------ construtor Vetor(int tam) { max = tam; vetor = new int[max]; n = 0; } // ------------------------------ add public void add(int valor) { if (n < max) { vetor[n] = valor; n++; } else { System.out.println("Erro: Vetor excedeu Limite"); } } // ------------------------------ exibe public void exibe() { System.out.print("Vetor: ["); for (int i = 0; i < n; i++) { System.out.print(vetor[i] + " "); } System.out.println("]"); } } // ----------------------------------------------- TestaVetor.java package testavetor; public class Main { public static void main(String[] args) { Vetor v = new Vetor(5); v.add(10); v.add(20); v.add(30); v.add(40); v.add(50); v.exibe(); v.add(60); // testar o limite do vetor de 5 elementos v.exibe(); System.exit(0); } } Resultado do Programa: Vetor: [10 20 30 40 50 ] Erro: Vetor excedeu Limite Vetor: [10 20 30 40 50 ]

Tente implementar os seguintes mtodos para a classe Vetor:


v.remove(); v.exibe();

13

System.out.println("Total de Elementos: " + v.length()); int pri = v.primeiro(); System.out.println("Primeiro: " + pri); int ult = v.ultimo(); System.out.println("ltimo: " + ult); boolean flag = v.existe(20); if (flag) { System.out.println("Existe elemento 20"); } else { System.out.println("No Existe elemento 20"); } v.removeElemento(elemento); v.exibe(); v.removePosicao(1); v.exibe();

Uma linguagem de programao orientada objetos precisa suportar quatro propriedades: abstrao, encapsulamento, herana e polimorfismo. Abstrao Objetos devem representar dados do mundo real. Encapsulamento (encapsulao) Os objetos possuem internamente atributos e mtodos agrupados no mesmo local, onde os mtodos manipulam os atributos. Polimorfismo (grego: muitas formas) a capacidade de objetos diferentes reagirem segundo a sua funo a uma ordem padro. Significa que o nome de um objeto pode ser utilizado para vrios propsitos ligeiramente diferentes, ou seja, ... uma interface, vrios mtodos ... . A caracterstica de polimorfismo utilizada na sobrecarga de mtodos e sobrecarga de operadores. Herana o processo pelo qual uma classe de objetos pode adquirir as propriedades de outra classe de objetos, em outras palavras, um objeto herda as caractersticas de outro (herana simples) ou vrios objetos (herana mltipla). Vantagens da Orientao a Objetos: (a) reutilizao de cdigo, (b) proteo aos dados; (c) organizao ou estruturao dos dados em forma de classes e objetos; (d) sobrecarga de mtodos e de operadores; (e) criao de pacotes de classes e (f) conjunto de diversos pacotes (apis: java2d, java3d, swing, awt, etc). Em Java, o programador pode criar suas prprias classes. Uma classe possui duas partes distintas: atributos (variveis) e mtodos (funes ou procedimentos) que manipulam estes atributos. 3.2.2 Referncia this Em java, quando um mtodo de uma classe chamado, passado automaticamente um argumento que uma referncia para o objeto que gerou a chamada. Esta referncia chamada this, ou seja, a referncia this referencia o objeto que chamou o mtodo. Cada objeto tem acesso a uma referncia a ele prprio, chamada this. Esta referncia faz referncias aos atributos e mtodos de um objeto.

14

Exemplo da utilizao da referncia this:


// -------------------------------------------------------- Data.java package testadata; import java.text.DecimalFormat; public class Data { // ------------------------------- atributos private int dia, mes, ano; // ------------------------------- construtor Data(int dia, int mes, int ano) { this.dia = dia; this.mes = mes; this.ano = ano; } // ------------------------------- sobrecarga do mtodo toString public String toString() { DecimalFormat form = new DecimalFormat("00"); String data = "Data: "+ form.format(dia) + "/" + form.format(mes) + "/" + ano; return(data); } } // ----------------------------------------------------------- TestaData.java package testadata; public class TestaData { public static void main(String[] args) { Data data = new Data(3, 9, 2011); System.out.println(data); System.exit(0); } } Resultado do Programa: Data: 03/09/2011

3.2.3 Lista de Exerccios sobre Classes 3.2.3.1 Dado o seguinte Circulo e seus mtodos: programa principal, implemente a classe

// ------------------------------------------ TestaCirculo.java package testacirculo; public class TestaCirculo { public static void main(String[] args) { Circulo circ = new Circulo(); circ.setaRaio(3); circ.calculaArea(); double area = circ.getArea(); System.out.printf("rea: %.2f\n", area); System.exit(0); 2 Observao: area = pi . raio onde pi 3.1416

} }

15

Crculo double area, raio setaRaio calculaArea getArea Diagrama de classe

3.2.3.2

Dado o seguinte programa principal, implemente a classe PesoIdeal e seus mtodos:

// --------------------------------------------- Peso.java package peso; public class Peso { public static void main(String[] args) { PesoIdeal piHomem = new PesoIdeal('H', 1.67); PesoIdeal piMulher = new PesoIdeal('m', 1.65); piHomem.calculaPesoIdeal(); System.out.printf("Peso Ideal Homem: %.2f\n", piHomem.getPesoIdeal()); piMulher.calculaPesoIdeal(); System.out.printf("Peso Ideal Mulher: %.2f\n", piMulher.getPesoIdeal()); System.exit(0); } }

Resultado do Programa: Peso Ideal Homem: 63,41 Peso Ideal Mulher: 57,77

Clculo do Peso Ideal:


PIH = 72,7 x altura 58 PIM = 62,1 x altura 44,7 PesoIdeal double altura, pi char sexo calculaPesoIdeal getPesoIdeal Diagrama de classe

3.2.3.3

Dado o seguinte programa principal, implemente a classe CPF e seus mtodos:

// --------------------------------------------------------------- ValidaCPF.java package validacpf; public class ValidaCPF { public static void main(String[] args) { String s = "123456789"; CPF cpf = new CPF(s); int digitoVerificador = cpf.verificaCPF(); System.out.printf("Digito verificador: %02d\n", digitoVerificador); System.out.printf("CPF: %s-%02d\n", s , digitoVerificador); System.exit(0); } } Resultado do Programa: Digito verificador: 09 CPF: 123456789-09

16

CPF String cpf verificaCPF Diagrama de classe


Como calcular os Dgitos do CPF: Entrada: CPF: 123456789 1) Primeiramente pega-se os dgitos da base do CPF e se faz a soma da multiplicao individual dos dgitos, iniciando por 10 e indo at 2 como exemplificado abaixo: 1 2 3 4 5 6 7 8 9 x x x x x x x x x 10 9 8 7 6 5 4 3 2 ---------10 + 18 + 24 + 28 + 30 + 30 + 28 + 24 + 18 = 210 2) O valor do primeiro dgito o resultado da subtrao de 11 pelo resto da diviso da soma acima por 11. Se este valor for 10 ou 11, o dgito 0 (zero), do contrrio o prprio valor. No exemplo em questo o dgito encontrado calculado conforme v-se a seguir: 11 - (210 % 11) = 10 3) O clculo do segundo dgito feito da mesma forma que o primeiro, porm com os 9 dgitos da base do CPF e o primeiro dgito verificador encontrado, iniciando por 11 e indo at 2. 1 x 11 -11 2 x 10 -+ 20 3 4 x x 9 8 --+ 27 + 32 5 6 7 8 9 0 x x x x x x 7 6 5 4 3 2 ------+ 35 + 36 + 35 + 32 + 27 + 0 = 255

4) O valor do segundo dgito o resultado da subtrao de 11 pelo resto da diviso da soma acima por 11. Se este valor for 10 ou 11, o dgito 0 (zero), do contrrio o prprio valor. No exemplo em questo o dgito encontrado calculado conforme v-se a seguir: 11 - (255 % 11) = 9 Sada: CPF vlido 123.456.789-09 ou 123456789-09

3.2.3.4

Dado o seguinte programa principal, implemente a classe DiaSemana e seus mtodos:

// ------------------------------------------------------- TestaDiaSemana.java package testadiasemana; public class TestaDiaSemana { public static void main(String[] args) { DiaSemana dia = new DiaSemana(18, 12, 2007); dia.verificaDiaSemana(); dia.exibeDiaSemana(); System.exit(0); } } Resultado do Programa: Dia da Semana: Tera-Feira DiaSemana int dia, mes, ano String semama verificaDiaSemana exibeDiaSemana Diagrama de classe

17

Como calcular o Dia da Semana: Deve-se calcular o Dia do Sculo: Para qualquer clculo com datas essencial que se disponha do Dia do Sculo para a(s) data(s) em questo. O Dia do sculo o nmero de dias decorridos desde o inicio do sculo (1 de janeiro de 1901) at a data em questo. Se usa como referncia 1901 porque a maioria das datas com as quais se trabalha ainda so do sculo passado. L por 2040 ou mais poder se mudar para 2001. A frmula (vlida para datas entre 1901 e 2099) a seguinte: Dia_do_Seculo = (ano - 1901) * 365 + (ano - 1901) DIV 4 + dia + (ms - 1) *31 - [(ms * 4 + 23) DIV 10] * [(ms + 12) DIV 15] + [(4 - ano MOD 4) DIV 4) * [(ms + 12) DIV 15] Entrada: Dia [1..31]: 18 Ms [1..12]: 12 Ano [1901..2099]: 2007

Dia_do_Seculo = 39.068 (para a data acima) Verificao do Dia da Semana: Para saber o Dia_da_Semana basta dividir por 7 e entrar com o resto na tabela abaixo: 0 1 2 3 4 5 6 Segunda Tera Quarta Quinta Sexta Sbado Domingo

Sada: 18/12/2007 uma Tera-Feira Observao: DIV diviso inteira de dois nmeros e MOD o resto inteiro da diviso de dois nmeros

3.2.3.5

Dado o seguinte programa principal, implemente a classe Data e seus mtodos:

// ------------------------------------------------- TestData.java package testdata; public class TestData { public static void main(String[] args) { Data data = new Data(); data.setaData(4, 9, 2011); data.extenso(); System.exit(0);

} }

Resultado do Programa: Data: 4 de setembro de 2011 Data int dia, mes, ano setaData extenso Diagrama de classe

3.2.3.6

Implemente os mtodos sortForcaBruta classe Vetor vista no item 3.2.

bubleSort

na

v.sortForcaBruta(); v.exibe(); v.bubbleSort();

18

v.exibe();

3.2.3.7

Dado o seguinte programa principal, implemente a classe Pessoa e seus mtodos.

// --------------------------------------------------- TestaPessoa.java package testapessoa; public class TestaPessoa { public static Pessoa p1 Pessoa p2 Pessoa p3 void main(String[] args) { = new Pessoa(); = new Pessoa(); = new Pessoa();

p1.setaDados("Paulo Roberto", 1962, 'm'); p2.setaDados("Renato Luis", 1965, 'm'); p3.setaDados("Francisco Carlos", 1959, 'm'); p1.calculaIdade(); p2.calculaIdade(); p3.calculaIdade(); p1.exibePessoa(); p2.exibePessoa(); p3.exibePessoa(); System.exit(0); } } Resultado do Programa: Nome: Paulo Roberto Idade: 49 ano(s) Sexo: Masculino Nome: Renato Luis Idade: 46 ano(s) Sexo: Masculino Nome: Francisco Carlos Idade: 52 ano(s) Sexo: Masculino Pessoa String nome, ano char sexo setaDados calculaIdade exibePessoa Diagrama de classe

3.2.3.8

Dado o seguinte programa principal, implemente a classe Pessoa e seus mtodos.

// ----------------------------------------------------- TestaPessoa2.java package testapessoa2; public class TestaPessoa2 { public static void main(String[] args) { Pessoa [] pessoa = new Pessoa[3]; pessoa[0] = new Pessoa(); pessoa[0].setaDados("Paulo Roberto", 1962, 'm'); pessoa[0].calculaIdade(); pessoa[0].exibePessoa(); pessoa[1] = new Pessoa(); pessoa[1].setaDados("Renato Luis", 1960, 'm'); pessoa[1].calculaIdade(); pessoa[1].exibePessoa(); pessoa[2] = new Pessoa(); pessoa[2].setaDados("Francisco Carlos", 1959, 'm'); pessoa[2].calculaIdade();

19

pessoa[2].exibePessoa(); } } Resultado do Programa: Nome: Paulo Roberto Idade: 49 ano(s) Sexo: Masculino Nome: Renato Luis Idade: 51 ano(s) Sexo: Masculino Nome: Francisco Carlos Idade: 52 ano(s) Sexo: Masculino Pessoa String nome, ano char sexo setaDados calculaIdade exibePessoa Diagrama de classe System.exit(0);

3.2.3.9

Dado o seguinte programa principal, implemente a classe Pessoa e seus mtodos.

// -------------------------------------------------- Pessoas.java package pessoas; public class Pessoas { public static void main(String[] args) { Pessoa pessoa = new Pessoa(7); pessoa.insereDados("Beatriz", 11); pessoa.insereDados("Debora", 13); pessoa.insereDados("Ftima", 15); pessoa.insereDados("Geni", 16); pessoa.insereDados("Carla", 12); pessoa.insereDados("Eva", 14); pessoa.insereDados("Ana", 10); pessoa.exibeDados(); pessoa.sort(); pessoa.exibeDados(); System.exit(0); } } Resultado do Programa: Lista Nome: Nome: Nome: Nome: Nome: Nome: Nome: Lista Nome: Nome: Nome: Nome: Nome: Nome: Nome: de Pessoas Beatriz Debora Ftima Geni Carla Eva Ana de Pessoas Ana Beatriz Carla Debora Eva Ftima Geni Pessoa String [] nome int [] idade

Idade: Idade: Idade: Idade: Idade: Idade: Idade: Idade: Idade: Idade: Idade: Idade: Idade: Idade:

11 13 15 16 12 14 10 10 11 12 13 14 15 16

20

int n insereDados exibeDados sort Diagrama de classe

3.2.3.10

Dado o seguinte programa principal, implemente a classe Agenda e seus mtodos.

// ------------------------------------------------------- TestAgenda.java package testagenda; public class TestAgenda { public static void main(String[] args) { Agenda agenda = new Agenda(5); agenda.insereTelefone("Ana", "99811234"); agenda.insereTelefone("Beatriz", "99812345"); agenda.insereTelefone("Carla", "99813456"); agenda.insereTelefone("Debora", "99814567"); agenda.insereTelefone("Eva", "99815678"); agenda.insereTelefone("Ftima", "99816789"); String fone = "99815678"; String nome = agenda.consultaNome(fone); if (nome.compareTo("") != 0) { System.out.println("Nome: " + nome + " - Telefone: " + fone); } else { System.out.println("ERRO: Usurio no Encontrado"); } fone = "99810123"; nome = agenda.consultaNome(fone); if (nome.compareTo("") != 0) { System.out.println("Nome: " + nome + " - Telefone: " + fone); } else { System.out.println("ERRO: Usurio no Encontrado"); } System.exit(0);

} }

Resultado do Programa: ERRO: Excedeu limite do Vetor Nome: Eva - Telefone: 99815678 ERRO: Usurio no Encontrado Agenda String [] nome String [] fone int n int max insereTelefone consultaNome Diagrama de classe

A seguir o programa teste (TestVetor) proposto anteriormente:


// ------------------------------------------------- TestVetor.java package testvetor; public class TestVetor { public static void main(String[] args) { Vetor v = new Vetor(5); v.add(10); v.add(20); v.add(30); v.add(40); v.exibe(); v.add(50); v.exibe();

21

} }

v.add(60); v.exibe(); v.remove(); System.out.println("Total de Elementos: " + v.length()); int pri = v.primeiro(); System.out.println("Primeiro: " + pri); int ult = v.ultimo(); System.out.println("ltimo: " + ult); int elemento = 20; boolean flag = v.existe(elemento); if (flag) { System.out.println("Existe elemento: " + elemento); } else { System.out.println("No Existe elemento: " + elemento); } v.removeElemento(elemento); v.exibe(); v.removePosicao(1); v.exibe(); System.exit(0);

// -------------------------------------------------- vetor.java package testvetor; public class Vetor { // ------------------ atributos private int[] v; private int n; private int max; // ------------------ construtor Vetor(int max) { this.max = max; v = new int[this.max]; n = 0; } // ------------------ add public void add(int valor) { if (n < max) { v[n] = valor; n++; } else { System.out.println("ERRO: Excedeu o Limite do Vetor"); } } // ------------------ remove public void remove() { if (n > 0) { n--; } else { System.out.println("ERRO: Vetor Vazio"); } } // ------------------ removeElemento public void removeElemento(int valor) { if (n > 0) { for (int i = 0; i < n; i++) { if (valor == v[i]) { for (int j = i; j < n - 1; j++) { v[j] = v[j + 1]; } n--; break; } }

22

} else { System.out.println("ERRO: Vetor Vazio"); }

// ------------------ removePosicao public void removePosicao(int posicao) { if (n > 0 && posicao > 0 && posicao < n) { for (int j = posicao; j < n - 1; j++) { v[j] = v[j + 1]; } n--; } else { System.out.println("ERRO: Vetor Vazio"); } } // ------------------ primeiro public int primeiro() { if (n > 0) { return (v[0]); } else { return (-1); } } // ------------------ ultimo public int ultimo() { if (n > 0) { return (v[n - 1]); } else { return (-1); } } // ----------------- exibe public void exibe() { System.out.print("Vetor: ["); for (int i = 0; i < n-1; i++) { System.out.print(v[i] + " "); } System.out.println(v[n-1] + "]"); } // ----------------- length public int length() { return (n); } // ----------------- existe public boolean existe(int valor) { for (int i = 0; i < n; i++) { if (v[i] == valor) { return (true); } } return (false); } } Resultado do Programa: Vetor: [10 20 30 40] Vetor: [10 20 30 40 50] ERRO: Excedeu o Limite do Vetor Vetor: [10 20 30 40 50] Total de Elementos: 4 Primeiro: 10 ltimo: 40 Existe elemento: 20 Vetor: [10 30 40]

23

Vetor: [10 40]

Exemplo da definio de uma classe Data:


// ----------------------------------------------- Fonte: Data.java package data; public class Data { private int dia, mes, ano; // atributos da classe // construtor da classe

public Data(int dd, int mm, int aa) { dia = dd; mes = mm; ano = aa; }

// ------------------------------- sobrecarga do mtodo toString public String toString() { return(dia + "/" + mes + "/" + ano); } }

Programa exemplo que utiliza a classe Data:


// --------------------------------------------- Fonte: Main.java package data; public class Main { public static void main(String[] args) { Data data = new Data(16, 3, 2010); System.out.println(data); } }

Exemplo da definio de uma classe Calculadora:


// -------------------------------------------------------- Fonte: Calculadora.java package calc; import javax.swing.*; public class Calculadora { // ............................................. lista de atributos da classe private double x, y, resp; private char op; private int erro; // ............................................. mtodos pblicos da classe public Calculadora () { erro = 0; } // construtor

// ---------------------------- entradaDados public void entradaDados() { String s; s = JOptionPane.showInputDialog("Digite um Valor: "); x = Double.parseDouble(s); do { s = JOptionPane.showInputDialog("Operador [+ - * / Rr Pp Ss Cc Tt]: "); op = s.charAt(0); } while (!strChr("+-*/RrPpSsCcTt", op)); if (!strChr("RrSsCcTt", op)) { s = JOptionPane.showInputDialog("Digite outro Valor: ");

24

y = Double.parseDouble(s); } } // ---------------------------- operaCalculadora public void operaCalculadora() { final double pi = 3.14158; double rads; switch (op) { case '+': case '-': case '*': case '/':

resp = soma(x, y); break; resp = subtracao(x, y); break; resp = multiplicacao(x, y); break; if (y == 0) erro = 1; // divisao por zero else resp = divisao(x, y); break; if (x < 0) erro = 2; // raiz negativa else resp = raizQuadrada(x); // Raiz Quadrada break; resp = power(x, y); break; resp = seno(x); break; resp = cosseno(x); break; // potencia // seno // cosseno

case 'R': case 'r':

case 'P': case 'p': case 'S': case 's': case 'C': case 'c': case 'T': case 't':

if (x == 90 || x == 180) { erro = 3; } else { resp = tangente(x); // tangente } break;

} } // ---------------------------- exibeCalculadora public void exibeCalculadora() { switch (erro) { case 1: JOptionPane.showMessageDialog(null, "Erro: Divisao por Zero", "Calculadora", JOptionPane.PLAIN_MESSAGE); break; case 2: JOptionPane.showMessageDialog(null, "Erro: Raiz Complexa", "Calculadora", JOptionPane.PLAIN_MESSAGE); break; case 3: JOptionPane.showMessageDialog(null, "Erro: Tangente Infinita", "Calculadora", JOptionPane.PLAIN_MESSAGE); break; default: JOptionPane.showMessageDialog(null, "Resposta: " + resp, "Calculadora", JOptionPane.PLAIN_MESSAGE); } } // ................................................ mtodos privados da classe // ---------------------------- strChr private boolean strChr(String s, char ch) { for (int i = 0; i < s.length(); i++) { if (s.charAt(i) == ch) { return(true); }

25

} return(false); } // ---------------------------- soma private double soma(double x, double y) { return(x + y); } // ---------------------------- subtracao private double subtracao(double x, double y) { return(x - y); } // ---------------------------- multiplicacao private double multiplicacao(double x, double y) { return(x * y); } // ---------------------------- divisao private double divisao(double x, double y) { if (y == 0) { erro = 1; return(-1); } return(x / y); } // ---------------------------- raizQuadrada private double raizQuadrada(double x) { return(Math.sqrt(x)); } // ---------------------------- power private double power(double x, double y) { return(Math.pow(x, y)); } // ---------------------------- seno private double seno(double x) { final double pi = 3.14158; double rads; rads = x * pi / 180.0; return(Math.sin(rads)); } // ---------------------------- cosseno private double cosseno(double x) { final double pi = 3.14158; double rads; rads = x * pi / 180.0; return(Math.cos(rads));

// ---------------------------- tangente private double tangente(double x) { final double pi = 3.14158; double rads; rads = x * pi / 180.0; return(Math.tan(rads)); } }

Programa exemplo que utiliza a classe Calculadora:

26

// ---------------------------------------------- Fonte: Calc.java package calc; public class Calc { public static void main(String[] args) { Calculadora calc = new Calculadora(); calc.entradaDados(); calc.operaCalculadora(); calc.exibeCalculadora(); } }

Programa exemplo que mostra outra forma de usar a funo strChr oriunda da linguagem C usando o mtodo indexOf:
// --------------------------------------------------- Fonte: strchr.java package strchr; import java.util.Scanner; public class strChr { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String nome, s; do { System.out.print("Nome: "); nome = entrada.nextLine(); int n = nome.length(); System.out.println(nome + " seu nome tem " + n + " caracteres"); do { System.out.print("Continua [S/N]? " ); s = entrada.nextLine(); } while ("SsNn".indexOf(s) == -1); } while ("Nn".indexOf(s) == -1); // } while ("S".equalsIgnoreCase(s)); System.exit(0);

} }

Modificadores de Acesso: public: Os atributos e mtodos tornam-se pblicos, ou seja, qualquer outro mtodo pode chamar ou utilizar estes atributos e/ou mtodos. private: Somente os mtodos da classe (membros) da classe podem chamar ou utilizar atributos ou mtodos privados. protected: Utilizado em herana simples de classe (construo de subclasses), ou seja, uma subclasse herda todos os atributos e mtodos da classe base (superclasse). Deixa acessvel os atributos e/ou mtodos para todas as outras classes (classe base) e subclasses (classe derivada).

3.3 Sobrecarga de mtodos em Java Java permite que mtodos estticos sejam sobrecarregados, desta forma, o retorno, nmero de argumentos ou mesmo o tipo de dados dos argumentos possam ser diferentes.
// ------------------------------------------ Fonte: SobreCarga.java package sobrecarga;

27

public class SobreCarga { public static void main(String[] args) { imprime("Pelotas-RS"); imprime(123.45); imprime(123.45f); imprime(123); imprime('A'); } static void imprime(String s) { System.out.println("String: " + s); } static void imprime(double d) { System.out.println("Double: " + d); } static void imprime(float f) { System.out.println("Float: " + f); } static void imprime(int i) { System.out.println("Inteiro: " + i); } static void imprime(char ch) { System.out.println("Caracter: " + ch); } }

28

4. Mtodos de entrada e sada de dados


A seguir so mostrados alguns mtodos que permitem fazer entrada de dados via teclado e sada de dados via monitor (tela).

4.1 Entrada de dados via teclado


A seguir visto um exemplo de entrada de dados usando o pacote Scanner. Programa exemplo (8): Entrada de Dados via teclado em terminal de texto usando a biblioteca Scanner.
// ---------------------------------------------- Fonte: Prog8.java package Prog8; import java.util.Scanner; public class Prog8 { public static void main(String[] args) { Scanner input = new Scanner (System.in); String s; int x; System.out.print("Inteiro: "); s = input.nextLine(); x = Integer.parseInt(s); System.out.println("Valor: " + x); System.exit(0); // ou x = input.nextInt();

} }

A seguir visto um exemplo de entrada de dados usando o pacote swing. Programa exemplo (9): Entrada de dados via teclado em caixa de dilogo grfica sobreposta a interface usando a biblioteca swing.
// --------------------------------------------- Fonte: Prog9.java package Prog9; import javax.swing.*; public class Prog9 { public static void main(String[] args) { String s; s = JOptionPane.showInputDialog("String: "); int x = Integer.parseInt(s); JOptionPane.showMessageDialog(null, "Inteiro: " + x, "Resultado", JOptionPane.PLAIN_MESSAGE); // JOptionPane.showMessageDialog(null, "Inteiro: " + x); // funciona tambm, pois os dois ltimos argumentos podem ser suprimidos System.exit(0); } } // carrega toda a biblioteca swing

A seguir visto um exemplo de entrada de dados usando o pacote java.io (BufferReader e InputStreamReader). Programa exemplo (10): Entrada de dados via teclado em terminal textual usando as bibliotecas BufferedReader e InputStreamReader .

29

// ----------------------------------------------- Fonte: Prog10.java package Prog10; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Prog10 { public static void main(String[] args) throws IOException { BufferedReader userInput = new BufferedReader (new InputStreamReader(System.in)); System.out.print("Nome: "); String nome = userInput.readLine(); Integer n = nome.length(); System.out.println("Nome: " + nome + " tem " + nome.length() + " caracteres"); System.exit(0); } }

4.2 Sada de dados via tela


A seguir visto um exemplo de sada de dados na tela usando o mtodo System.out.print. Programa exemplo (11): Sada de dados via tela usando o mtodo System.out.print, System.out.println ou System.out.printf.
// -------------------------------------------- Fonte: Prog11.java package Prog11; import java.util.Scanner; public class Prog11 { public static void main(String[] args) { Scanner entrada = new Scanner (System.in); String s; int x; System.out.print("Inteiro: "); s = entrada.nextLine(); x = Integer.parseInt(s); System.out.println("Valor: " + x); System.out.printf("Valor: %03d\n ", x); System.exit(0);

} }

A seguir visto um exemplo de sada de dados na tela usando o pacote swing. Programa exemplo (12): Sada de dados via tela em caixa de dilogo grfica sobreposta a interface usando a biblioteca swing.
// ------------------------------------------ Fonte: Prog12.java package Prog12; import javax.swing.*; public class Prog12 { public static void main(String[] args) { String s; s = JOptionPane.showInputDialog("String: "); // carrega toda a biblioteca swing

30

int x = Integer.parseInt(s); JOptionPane.showMessageDialog(null, "Inteiro: " + x, "Resultado", JOptionPane.PLAIN_MESSAGE); System.exit(0); } }

Sintaxe:
JOptionPane.showMessageDialog(null, x = + x, Ttulo, JOptionPane.PLAIN_MESSAGE);

null significa que a mensagem ser centralizada x = + x significa que sair na caixa de dialogo x = 5 (por exemplo) Ttulo significa o ttulo da caixa de dilogo JOptionPane.PLAIN_MESSAGE significa caixa sem cone Tabela 3: Tipos de cones
Tipo de cone cone de erro cone de informao i cone de advertncia ! cone de pergunta ? Sem cone Tipo de Mensagem JOptionPane.ERROR_MESSAGE JOptionPane.INFORMATION_MESSAGE JOptionPane.WARNING_MESSAGE JOptionPane.QUESTION_MESSAGE JOptionPane.PLAIN_MESSAGE

31

5. Operadores
So smbolos especiais que obrigam determinadas operaes. Estas operaes comparativas ou lgicas. 5.1 Operadores aritmticos So operadores que realizam uma operao matemtica. Tabela 4: Operadores aritmticos
Operador aritmtico + * / % -- ++ Ao Subtrao Adio Multiplicao Diviso Resto inteiro da diviso Decremento/incremento

o compilador a executar podem ser aritmticas,

Precedncia dos operadores aritmticos (Hierarquia nas Operaes) Tabela 5: Precedncia dos operadores aritmticos
Hierarquia 1 2 3 4 5 6 Operao Parnteses Mtodos ++ -- (menos unrio) * / % + -

Observao: Quando houver duas ou mais operaes de mesma hierarquia, o compilador executa-as da esquerda para a direita. 5.2 Operadores relacionais So operadores que permitem comparar valores, ou seja, utilizados principalmemte em comandos que possuem condies. Tabela 6: Operadores relacionais
Operador > >= < <= == != Ao Maior que Maior ou igual a Menor que Menor ou igual Igual a Diferente de

so

5.3 Operadores lgicos So condio. Exemplo: operadores utilizados em comandos que tem mais de uma

if (condio1 && condio2 || condio3) Tabela 7: Operadores lgicos


Operador lgica && ou & || ou | ! Ao AND (e) OR (ou) NOT (no)

32

Observao: $$ e || so chamados Short Circuit Operator, ou seja, quando o resultado das condies no puder mais ser alterado, h um truncamento nas prximas condies. Precedncia (Hierarquia dos operadores) Tabela 8: Precedncia dos operadores relacionais e lgicos
Hierarquia 1 2 3 4 5 Operao ! > >= < == != && ||

<=

Observao: As expresses que utilizam operadores relacionais e lgicos retornam 0 (zero) para falso e !0 (no zero) para verdadeiro, ou seja: true diferente de 0 (!= 0) 5.4 Incremento e decremento So operadores aritmticos que permitem realizar operaes de soma e subtrao de forma simplificada. ++ adiciona (1) ao operando subtrai (1) ao operando As seguintes operaes so equivalentes: x++; x = x + 1; x--; x = x - 1; Observao: Os operadores (++ ou --) podem ser colocados antes ou depois do operando. Quando precede seu operando, Java efetua a operao de incremento ou decremento antes de utilizar o valor do operando. Quando o operador vier depois do operando, Java utiliza o valor do operando antes de increment-lo ou decrement-lo. Exemplo: Equivalncia x = 10; y = ++x; x = 10; y = x++; 5.5 Operador de atribuio O operador de atribuio o sinal de igual =. A sintaxe do operador de atribuio pode ser escrito em uma das seguintes formas: varivel varivel varivel varivel = = = = constante; varivel; expresso; mtodo(x); x x x x = = = = 3; y; a + b; Math.sqrt(y); // // // // y ser 11 x ser 11 y ser 10 x ser 11 x = 10; x = x + 1; y = x; x = 10; y = x; x = x + 1; e false igual 0 (== 0)

33

Programa exemplo (13): O programa calcula a idade de uma pessoa.


// ------------------------------------------ Fonte: Prog13.java package Prog13; import java.util.Scanner; public class Prog13 { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; int idade, ano_atual, ano_nasceu; // leitura do ano atual System.out.print("Ano ATUAL: "); s = entrada.nextLine(); ano_atual = Integer.parseInt(s); System.out.print("Ano de NASCIMENTO: "); s = entrada.nextLine(); // leitura do ano de nascimento ano_nasceu = Integer.parseInt(s); // atribuio clculo da idade idade = ano_atual - ano_nasceu; System.out.println("Sua IDADE eh " + idade); System.exit(0); } }

A linguagem de programao Java permite utilizar o operador de atribuio em expresses, junto com operadores matemticos, lgicos, relacionais, chamada de mtodos, e outros (como foi mencionado acima). if ((produto = x * y) < 0) Funcionamento: Primeiramente Java atribui o valor x * y a varivel produto, para depois avaliar a expresso, ou seja, comparar se o produto menor (<) que zero. 5.6 Casts possvel forar que o resultado de uma expresso seja de um determinado tipo. Para tanto deve ser utilizado uma construo chamada de cast, ou seja, pode ser utilizado para "tipar" uma varivel com um tipo diferente do resultado da expresso. varivel = (tipo) expresso; Programa exemplo (14): O programa imprime na tela o resultado de uma diviso.
// -------------------------------------------- Fonte: Prog14.java package Prog14; import java.util.Scanner; public class Prog14 { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; int x, y; float resp; System.out.print("x = ");

34

s = entrada.nextLine(); x = Integer.parseInt(s); System.out.print("y = "); s = entrada.nextLine(); y = Integer.parseInt(s); // necessrio um cast (float) pois a diviso de dois resp = (float) x / y; // inteiros resulta em um inteiro System.out.printf("Divisao = %.2f\n", resp); System.exit(0); } }

Observao: Em Java, o tipo resultante de um inteiro dividido por outro inteiro um inteiro, logo, deve-se utilizar um cast (float) para que o tipo resultante atribudo a varivel resp seja float. 5.7 Expresses Uma expresso em Java qualquer combinao vlida de operadores (aritmticos, relacionais, lgicos), constantes, variveis e mtodos. Exemplo: c = Math.sqrt (a) + b / 3.4;

35

6. Mtodos para funes matemticas padres


Java possui uma classe: Math que possui diversos mtodos para resolver funes matemticas. Algumas so descritas a seguir: 6.1 Math.abs O mtodo Math.abs retorna o valor positivo (absoluto). Sintaxe: int Math.abs(int x); float Math.abs(float x); long Math.abs(long x); double Math.abs(double x);

6.2 Math.asin O mtodo Math.asin retorna o valor do arco seno. A varivel x deve estar em radianos. Sintaxe: double Math.asin (double x); Faixa: -pi / 2 pi / 2 6.3 Math.acos O mtodo Math.acos retorna o valor do arco cosseno. A varivel x deve estar em radianos. Sintaxe: double Math.acos (double x); Faixa: 0 pi 6.4 Math.atan O mtodo Math.atan retorna o valor do arco tangente. A varivel x deve estar em radianos. Sintaxe: double Math.atan (double x); Faixa: -pi / 2 pi / 2 6.5 Math.sin O mtodo Math.sin retorna o valor do seno. A varivel x deve estar em radianos. Sintaxe: double Math.sin (double x); Faixa: -1 1 6.6 Math.cos O mtodo Math.cos retorna o valor do cosseno. A varivel x deve estar em radianos. Sintaxe: double Math.cos (double x); Faixa: -1 1

36

6.7 Math.tan O mtodo Math.tan retorna o valor da tangente. A varivel x deve estar em radianos. Sintaxe: double Math.tan (double x); 6.8 Math.exp O mtodo Math.exp retorna o valor do expoente (ex). Sintaxe: double Math.exp (double x); 6.9 Math.pow O mtodo Math.pow (power) retorna o valor da potncia (xy). Sintaxe: double Math.pow (double x, double y); 6.10 Math.sqrt O mtodo quadrada. Math.sqrt (square root) retorna o valor da raiz

Sintaxe: double Math.sqrt (double x); 6.11 Math.log O mtodo Math.log retorna o valor do logaritmo natural. Sintaxe: double Math.log (double x); 6.12 Double.parseDouble O mtodo Double.parseDouble converte string em ponto flutuante. Sintaxe: double Double.parseDouble (String s); 6.13 Integer.parseInt O mtodo aInteger.parseInt converte uma string em inteiro. Sintaxe: int Integer.parseInt (String s); 6.14 Long.parseLong O mtodo Long.parseLong converte uma string em inteiro longo. Sintaxe: long int Long.parseLong (String s); 6.15 Math.log10 O mtodo Math.log10 retorna o logartmo na base 10. Sintaxe: double Math.log10 (double x);

37

6.16 Math.random O mtodo Math.random retorna um nmero double aleatrio. Sintaxe: double Math.random (void); Faixa: 0.0 100.0
public static int geraNumeroAleatorio(int n) { int num = 1 + (int)(Math.random() * n); return(num); } // gera um nmero de 1 at n

6.17 Math.PI O mtodo Math.PI retorna o valor do pi radianos. Sintaxe: double Math.PI (void); Valor: 3.141592653589793 6.18 Converso de graus para radianos

Figura 2: Converso de graus para radianos Converso de graus para radianos: rads = graus * Math.PI / 180.0; Converso de radianos para graus: graus = rads * 180.0 / Math.PI;

38

7. Comandos
7.1 Tipos de comandos 7.1.1 Sequncia So comandos, que no fluxo de controle do programa, so sempre executados passando a execuo para a prxima instruo, ou seja, todos os comandos de seqncia so executados desde que eles no dependem de um comando de seleo. Exemplo: (todas as instrues abaixo so de seqncia)
System.out.print("Digite uma letra: "); // imprime na tela s = entrada.nextLine(); // entrada de dados via teclado resp = valor * 1.25; // atribuio um comando de seqncia

7.1.2 Seleo So comandos, que no fluxo de controle do programa, permitem a seleo entre duas ou mais instrues, ou seja, este tipo de comando faz com que alguns comandos no sejam executados. Exemplo:
if (numero % 2 == 0) { // testa se o nmero par ou mpar System.out.println("Nmero: PAR"); } else { System.out.println("Nmero: MPAR"); }

ou Programa Exemplo (15): Programa extrai a raiz quadrada de um nmero.


// ------------------------------------------ Fonte: Prog15.java package Prog15; import java.util.Scanner; public class Prog15 { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; double x, raiz; System.out.print("Digite um valor: "); s = entrada.nextLine(); x = Double.parseDouble(s); if (x < 0) { // esta instruo s executada se o valor de x for negativo x = Math.abs(x); } raiz = Math.sqrt(x); System.out.printf("Raiz Quadrada: %.2f\n", raiz); System.exit(0); } }

Operador Ternrio (?): Funcionamento: Se a condio for verdadeira, executa comando1 seno executa comando2.

39

condio ? comando1 : comando2; | ^ ^ | | | +--------+ | | | +-------------------+ Exemplo (1): int menor = x <= y ? x : y; // se x <= y ... menor = x; // se x > y ... menor = y; Exemplo (2): int menor; x <= y ? menor = x : menor = y; // se x <= y ... menor = x; // se x > y ... menor = y;
// --------------------------------------------------------------- Fonte: Ternario.java package ternario; import java.util.Scanner; public class Ternario { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; System.out.print("Digite um valor: "); s = entrada.nextLine(); int x = Integer.parseInt(s); System.out.print("Digite outro valor: "); s = entrada.nextLine(); int y = Integer.parseInt(s); int menor = x < y ? x : y; System.out.println("menor: " + menor); int maior = x > y ? x : y; System.out.println("maior: " + maior); System.exit(0); } }

7.1.3 Repetio So comandos, que no fluxo de controle do programa, permitem a repetio de uma ou mais instrues. Programa Exemplo (16): O programa exibe na tela de 0 at 9.
// ----------------------------------------------- Fonte: Prog16.java package prog16; public class Prog16 { public static void main(String[] args) { final int n = 10; int i = 0; do { System.out.println("n = " + i); i++; } while (i < n); System.exit(0); } }

40

7.2 Comando if O comando if um comando de seleo que permite selecionar um comando entre dois outros comandos (comandos simples) ou dois conjuntos de comandos (comandos compostos). Isto feito atravs da avaliao de uma condio. O resultado desta avaliao (teste da condio) pode ser verdadeiro (true) ou falso (false). Dependendo deste resultado um dos comandos executado e o outro no. Sintaxe: if (condio) { comando 1; } else { comando 2;
}

ou

if (condio) { comando; }

Observao: O else opcional. Se a condio for avaliada como verdadeira (qualquer valor diferente de 0), o comando 1 ser executado, caso contrrio (condio falsa, valor igual a zero) o comando 2 ser executado. Comando 1, comando 2 ou comando podem ser simples ou compostos (quando h mais de um comando ligado a outro, deve-se utilizar chaves ({ }). Veja exemplos abaixo if (condio) { comando 1; comando 2; } else { comando 3; comando 4; } if (condio) { comando 1; comando 2; comando 3; }
// todos os comando so compostos

Programa exemplo (17): O usurio digita um nmero e o programa diz se este par ou mpar.
// ------------------------------------------- Fonte: Prog17.java package prog17; import javax.swing.*; public class Prog17 { public static void main(String[] args) { String s; int numero; s = JOptionPane.showInputDialog("Digite um nmero: "); numero = Integer.parseInt(s); if ((numero % 2) == 0) { JOptionPane.showMessageDialog(null, "Nmero PAR", "Nmeros", JOptionPane.PLAIN_MESSAGE); } else { JOptionPane.showMessageDialog(null, "Nmero IMPAR", "Nmeros", JOptionPane.PLAIN_MESSAGE); } System.exit(0); } }

41

7.2.1 if encadeados Um if aninhado (ou encadeado) um comando if dentro de outro comando if ou if ... else. Programa exemplo (18): O usurio digita um nmero e o programa diz se este zero, positivo ou negativo.
// -------------------------------------------- Fonte: Prog18.java package prog18; import javax.swing.*; public class Prog18 { public static void main(String[] args) { String s; int num; s = JOptionPane.showInputDialog("Digite um nmero: "); num = Integer.parseInt(s); if (num == 0) { JOptionPane.showMessageDialog(null, "Nmero Zero", "Verifica", JOptionPane.PLAIN_MESSAGE); } else { if (num > 0) { JOptionPane.showMessageDialog(null, "Nmero Positivo", "Verifica", JOptionPane.PLAIN_MESSAGE); } else { JOptionPane.showMessageDialog(null, "Nmero Negativo", "Verifica", JOptionPane.PLAIN_MESSAGE); } } System.exit(0); } }

7.3 O comando switch O comando switch um comando de seleo que permite selecionar um comando entre vrios outros comandos. Isto feito atravs da comparao de uma varivel a um conjunto de constantes. Cada um dos comandos est ligado a uma constante. Sintaxe: switch (varivel) { case constante_1 : seqncia de comandos; break; case constante_2 : seqncia de comandos; break; . . . default: seqncia de comandos; } O programa testa uma varivel sucessivamente contra uma lista de constantes inteiras ou caracteres (int ou char). Depois de encontrar uma coincidncia, o programa executa o comando ou bloco de comandos que estejam associados quela constante. O comando default executado se no houver nenhuma coincidncia.

42

O comando break utilizado para obrigar a sada do comando switch. A opo default opcional. Observao: A varivel no pode ser uma String e nem real (float ou double). Programa exemplo (19): O programa recebe um dgito de 0 9 e imprime na tela, este dgito, por extenso. Neste exemplo a varivel dgito inteira.
// ---------------------------------------------- Fonte: Prog19.java package prog19; import javax.swing.*; public class Prog19 { public static void main(String[] args) { String s; int digito; s = JOptionPane.showInputDialog("Digito: "); digito = Integer.parseInt(s); switch (digito) { case 0: JOptionPane.showMessageDialog(null, "Zero", "Digito", JOptionPane.PLAIN_MESSAGE); break; case 1: JOptionPane.showMessageDialog(null, "Um", "Digito", JOptionPane.PLAIN_MESSAGE); break; case 2: JOptionPane.showMessageDialog(null, "Dois", "Digito", JOptionPane.PLAIN_MESSAGE); break; case 3: JOptionPane.showMessageDialog(null, "Trs", "Digito", JOptionPane.PLAIN_MESSAGE); break; case 4: JOptionPane.showMessageDialog(null, "Quatro", "Digito", JOptionPane.PLAIN_MESSAGE); break; case 5: JOptionPane.showMessageDialog(null, "Cinco", "Digito", JOptionPane.PLAIN_MESSAGE); break; case 6: JOptionPane.showMessageDialog(null, "Seis", "Digito", JOptionPane.PLAIN_MESSAGE); break; case 7: JOptionPane.showMessageDialog(null, "Sete", "Digito", JOptionPane.PLAIN_MESSAGE); break; case 8: JOptionPane.showMessageDialog(null, "Oito", "Digito", JOptionPane.PLAIN_MESSAGE); break; case 9: JOptionPane.showMessageDialog(null, "Nove", "Digito", JOptionPane.PLAIN_MESSAGE); break; default: JOptionPane.showMessageDialog(null, "ERRO: No um Dgito", "Digito", JOptionPane.PLAIN_MESSAGE); } System.exit(0); } }

Programa exemplo (20): O programa recebe um dgito de 0 9 e imprime na tela, este dgito, por extenso. Neste exemplo a varivel dgito caracter, por causa disto as constantes esto entre apostrofes.
// ----------------------------------------- Fonte: prog20.java package prog20; import javax.swing.*;

43

public class Prog20 { public static void main(String[] args) { String s; char digito; s = JOptionPane.showInputDialog("Digito: "); digito = s.charAt(0); switch (digito) { case '0': JOptionPane.showMessageDialog(null, "Zero", "Digito", JOptionPane.PLAIN_MESSAGE); break; case '1': JOptionPane.showMessageDialog(null, "Um", "Digito", JOptionPane.PLAIN_MESSAGE); break; case '2': JOptionPane.showMessageDialog(null, "Dois", "Digito", JOptionPane.PLAIN_MESSAGE); break; case '3': JOptionPane.showMessageDialog(null, "Trs", "Digito", JOptionPane.PLAIN_MESSAGE); break; case '4': JOptionPane.showMessageDialog(null, "Quatro", "Digito", JOptionPane.PLAIN_MESSAGE); break; case '5': JOptionPane.showMessageDialog(null, "Cinco", "Digito", JOptionPane.PLAIN_MESSAGE); break; case '6': JOptionPane.showMessageDialog(null, "Seis", "Digito", JOptionPane.PLAIN_MESSAGE); break; case '7': JOptionPane.showMessageDialog(null, "Sete", "Digito", JOptionPane.PLAIN_MESSAGE); break; case '8': JOptionPane.showMessageDialog(null, "Oito", "Digito", JOptionPane.PLAIN_MESSAGE); break; case '9': JOptionPane.showMessageDialog(null, "Nove", "Digito", JOptionPane.PLAIN_MESSAGE); break; default: JOptionPane.showMessageDialog(null, "ERRO: No um Dgito", "Digito", JOptionPane.PLAIN_MESSAGE); } System.exit(0); } }

Programa exemplo (21): O programa constri um menu com trs mtodos: incluso, alterao e trmino.
// ------------------------------------------ Fonte: prog21.java package prog21; import java.util.Scanner; public class Prog21 { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; char opcao; System.out.println("[I]ncluso"); System.out.println("[A]lterao"); System.out.println("[T]rmino"); System.out.print("Qual a opo: "); s = entrada.nextLine(); opcao = s.charAt(0); switch (opcao) { case 'i': case 'I': inclusao(); break; case 'a': case 'A': alteracao(); break; case 't':

44

} }

case 'T': termino(); break; default: System.out.println("ERRO: Opo Invlida");

static void inclusao() { System.out.println("Opo Escolhida: Incluso"); } static void alteracao() { System.out.println("Opo Escolhida: Alterao"); } static void termino() { System.out.println("Opo Escolhida: Trmino"); } }

7.4 Comando while O comando while um comando de repetio que permite executar um comando (simples) ou vrios comandos (composto) diversas vezes. Isto feito atravs da avaliao de uma condio. Enquanto a condio for verdadeira os comandos so repetidos. Quando a condio se tornar falsa o comando while finalizado. O teste da condio feita no incio do comando, ou seja, antes que todos os comandos sejam executados. Observao: Note que os comandos podem no ser executados nenhuma vez, basta a condio comear como falsa. Sintaxe: while (condio) { comando; } while (condio) { comando 1; comando 2; } Condio: Qualquer expresso vlida em Java com resultado 0 (false) ou !0 (true). Na condio podem ser utilizados ainda variveis, constantes, mtodos, operadores (aritmticos, relacionais e lgicos). Funcionamento do comando: O loop (lao) repetido enquanto a condio for verdadeira. Quando a condio se tornar falsa o controle do programa passa para a prxima instruo. O lao while verifica a condio no incio do lao, por causa disto, normalmente, a varivel de controle do lao deve ser inicializado. Exemplo:
int i = 0; // inicializao da varivel de controle while (i <= 10) { // condio i <= 10 System.out.printf(i = %d\n, i); i = i + 1; // incremento }

ou

Comando: Pode ser um comando vazio, simples ou composto que sero repetidos. Comando vazio: while (1); // comando while no repete nenhum comando for (int i = 0; i <= 1000; i++); // comando for no repete nenhum comando Verifique: Note que no final dos dois comandos (while e for) existe apenas um ponto-e-vrgula, isto o sinal de comando vazio, ou seja,

45

os comandos while e for que caracterizando comandos vazios.

teriam

outros

comandos

no

os

tem,

Problema freqente de digitao: Muitas vezes o programador insere um ponto-e-vrgula no final de um comando for ou while por engano. Isto um grave problema, pois este ponto-e-vrgula (inserido acidentalmente) faz com que os comandos que seriam repetidos, no so. Veja o exemplo abaixo: Exemplo:
for (int x = 1; x <= 10; x++); // note o ponto-e-vrgula no final do comando for System.out.printf(x = %d\n, x); // impresso x = 11 na tela, porque?

Explicao: O comando System.out.printf no faz parte do comando if devido ao ponto-e-vrgula no comando for. O comando for termina quando a varivel de controle x chega ao valor 11. Comando correto: for (int x = 1; x <= 10; x++) { System.out.printf(x = %d\n, x); }

Programa exemplo (22): O programa imprime caracteres de A at Z na tela.


// ----------------------------------------- Fonte: Prog22.java package prog22; public class Prog22 { public static void main(String[] args) { char letra = 'A'; // inicializao da varivel de controle while (letra != 'Z') { System.out.printf ("Letra: %c\n", letra); letra++; // incremento } } }

7.5 O comando for O comando for um comando de repetio que permite executar um comando (comando simples) ou vrios comandos (comando composto) diversas vezes. Isto feito atravs da avaliao de uma condio. Enquanto a condio for verdadeira os comandos so repetidos. Quando a condio se tornar falsa o comando for finalizado. Sintaxe: for (inicializao; condio; incremento ou decremento) { comando; }

Exemplos: Com uma varivel de controle:


for (int i = 0;i < 9;i++) { System.out.println(i); }

Com duas varivel de controle:


for (int i = 1, int j = 5;i != j;i++, j--) { System.out.println(i + - + j); }

46

Inicializao: um comando de atribuio (ou vrios, separados por vrgula) que o compilador utiliza para inicializar a(s) varivel(is) de controle do lao. Condio: uma expresso qualquer, que testa a varivel de controle do lao contra algum valor para determinar quando o lao terminar. Incremento ou decremento: Define a maneira como a(s) varivel(is) de controle do lao sero alteradas aps a repetio do lao. O lao (for) repetido enquanto a condio verdadeira. A condio sempre testada no comeo do lao. Qualquer uma das 3 partes do comando for (inicializao; condio; incremento) podem ser qualquer expresso vlida em Java.

Programa exemplo (23): O programa imprime de 1 at 10 na tela.


// --------------------------------------------- Fonte: prog23.java package prog23; public class Prog23 { public static void main(String[] args) { for (int i = 1; i <= 10; i++) { // inicializao: i = 1 System.out.printf("%d\n",i); // condio: i <= 10 } // incremento: i++ }

Programa exemplo (24): O programa imprime na tela:


// --------------------------- Fonte: Prog24.java package prog24; public class Main { public static void main(String[] args) { for (int i = 1,int j = 9; i != j; i++,j--) { System.out.printf("i = %d - j = %d\n", i ,j); } } }

i i i i

= = = =

1 2 3 4

j j j j

= = = =

9 8 7 6

O lao for equivalente ao seguinte comando: inicializao; while (condio) { comando; incremento; } ou inicializao; do { comando; incremento; } while (condio);

// ou decremento

// ou decremento

47

7.6 O loop do { } while O comando do ... while um comando de repetio que permite executar um comando (comando simples) ou vrios comandos (comando composto) diversas vezes. Isto feito atravs do teste de uma condio. Enquanto a condio for verdadeira os comandos so repetidos. Quando a condio se tornar falsa o comando do ... while finalizado. O teste da condio feita no final do comando, ou seja, depois que os comandos so executados (Note que os comandos so executados pelo menos uma vez). Sintaxe: do { comando; } while (condio); Repete o lao enquanto a condio for verdadeira. Testa a condio no final, fazendo com que o lao seja executado pelo menos uma vez.

Programa exemplo (25): Imprime na tela de 1 at 10.


// ----------------------------------------------- Fonte: Prog25.java package prog25; public class Main { public static void main(String[] args) { int i = 1; do { System.out.printf("%d\n",i); i++; } while (i <= 10); } }

7.7 Interrupo de loops 7.7.1 O comando break Quando o programa encontra o comando break dentro de um lao, ele imediatamente encerra o lao, e o controle do programa segue para o prximo comando aps o lao. Programa exemplo (26): O programa imprime na tela a tecla digitada pelo usurio at que ele digite <F> ou <f>.
// ---------------------------------------------- Fonte: Prog26.java package prog26; public class Prog26 { public static void main(String[] args) throws Exception { char tecla; do { System.out.print("Tecla ou [F]im: tecla = (char) System.in.read(); if (tecla == 'F' || tecla == 'f') // encerra o lao quando o usurio teclar 'F' break; } System.out.printf("Tecla: %c "); { ou 'f' Codigo: %d\n",

48

} while (true); } }

tecla, (int) tecla); // lao eterno

7.7.2 O comando continue O comando continue em vez de forar o encerramento, fora a prxima interao do lao e "pula", ou seja, no executa o cdigo que estiver depois do comando continue. Programa exemplo (27): O programa imprime na tela somente os nmeros pares de 0 at 100.
// ------------------------------------------ Fonte: Prog27.java package prog27; public class Prog27 { public static void main(String[] args) { for (int i = 0; i < 100; i++) { if (i % 2 == 1) { // 0 par, 1 impar continue; } // imprime somente nmeros pares System.out.printf("Par: %d\n", i); } } }

Nos laos while e do {} while um comando continue faz com que o controle do programa execute diretamente o teste da condio e depois continue o processo do lao. No caso do comando for, o programa primeiro executa o incremento (ou decremento) do lao e, depois, executa o teste da condio antes de finalmente fazer o lao continuar. 7.8 O mtodo System.exit () O mtodo System.exit aborta o programa em qualquer situao. Modo de usar: System.exit(0); ou System.exit(1);

49

8. Sada formatada (System.out.printf)


Como na linguagem C, as sadas (impresses) na tela podem ser formatadas em Java. Sintaxe: System.out.printf ("string de controle", lista de variveis); String de controle: Formada pelos caracteres que o mtodo imprime na tela, e pelos comandos de formatao (%c, %s, %d, %f) que definem a maneira como as variveis sero impressas e caracteres especiais (\n, \t, ...). Tabela 9: Comandos de formatao
Cdigo %s %d %i %o %u %x %X %f %e %g %E %G %c %% Tipo String int int int int int int float float float float float char nada Formato String (vetor de caracteres) Inteiro decimal com sinal Inteiro decimal com sinal Inteiro octal sem sinal Inteiro decimal sem sinal Inteiro hexadecimal sem sinal (com a, b, c, d, e, f) Inteiro hexadecimal sem sinal (com A, B, C, D, E, F) Valor com sinal da forma [-]dddd.dddd Valor com sinal da forma [-]d.dddd e [+/-]ddd Valor com sinal na forma e ou f baseado na preciso do valor dado Mesmo que e, mas com E para expoente Mesmo que g, mas com E para expoente Um caracter O caracter % impresso

Flags (Bandeiras):
(-) no com (+) (#) Alinha o resultado esquerda. Preenche o restante do campo com brancos. Se colocado, alinha o resultado direita e preenche o restante esquerda zeros ou brancos. O resultado sempre comea com o sinal + ou Especifica que o argumento ser impresso usando uma das formas alternativas

Formas alternativas:
0 x ou X colocado zeros (0) antes do argumento colocado 0x (ou 0X) antes do argumento

Especificadores de largura do campo a ser impresso (exemplos): Tabela 10: Especificadores de largura do campo
Prefixo %-+#0 %-+# %-+0 %-+ %-#0 %-# %-0 %%+#0 %+# %+0 %+ %#0 %# %0 % 6d +00555 +555 +00555 +555 000555 555 000555 555 +00555 +555 +00555 +555 000555 555 000555 555 6o 01053 01053 01053 1053 001053 01053 01053 1053 01053 01053 01053 1053 001053 01053 001053 1053 8x 0x0022b 0x22b 000022b 22b 0x00022b 0x22b 0000022b 22b 0x0022b 0x22b 000022b 22b 0x00022b 0x22b 0000022b 22b 10.2e +5.50e+000 +5.50e+000 +5.50e+000 +5.50e+000 05.50e+000 5.50e+000 05.50e+000 5.50e+000 +5.50e+000 +5.50e+000 +5.50e+000 +5.50e+000 05.50e+000 5.50e+000 05.50e+000 5.50e+000 10.2f +000005.50 +5.50 +000005.50 +5.50 0000005.50 5.50 0000005.50 5.50 +000005.50 +5.50 +000005.50 +5.50 0000005.50 5.50 0000005.50 5.50

50

9. Lista de exerccios (comandos)


9.1 Escreva um programa em Java que recebe dois valores via teclado: cateto adjacente (b) e cateto oposto (a) e calcula o valor da hipotenusa dado pela seguinte frmula:
Frmula: h2 = a2 + b2

Exemplo (Tela): Cateto adjacente (b): 3 <enter> Cateto oposto (a): 4 <enter> Hipotenusa: 5

9.2 Escreva um programa em Java que l 4 notas via teclado: n1, n2, n3 e n4 obtidas por um aluno em 4 avaliaes. Calcule a mdia utilizando a seguinte frmula:
n1 + n2 * 2 + n3 * 3 + n4 Mdia = --------------------------7 A seguir imprima na tela a mdia e o conceito do aluno baseado na seguinte tabela:

Mdia 9,0 ou acima de 9,0 entre 7,5 (inclusive) e 9,0 entre 6,0 (inclusive) e 7,5 abaixo de 6,0

Conceito A B C D

9.3 Escreva um programa em Java que recebe via teclado: comprimento da circunferncia. O programa deve calcular e imprimir na tela o dimetro e o raio da circunferncia (veja exemplo abaixo).
Exemplo: Comprimento da circunferncia: 36 <enter> Dimetro: 11.46 Raio: 5.73 Continua [S/N]? N <enter> comprimento da circunferncia = 2 . PI . raio dimetro = 2 . raio Observao: Programa termina se usurio digitar N ou n na pergunta: Continua [S/N]?

9.4 Desenvolva um programa em Java que recebe via teclado: peso da carne que ser vendida (em quilos) e preo por quilo. O programa deve calcular e imprimir na tela o total a pagar, o valor pago ao ICMS (17%) e o lucro lquido do aougue.
Exemplo (Tela): Peso: 3.5 <enter> Preo por Kg (R$): 4.90 <enter> Total a pagar: 17.15 ICMS (17%): 2.91 Lucro lquido do aougue (R$): 14.24

51

Sair [S/N]? n <enter> Peso: 1.5 <enter> Preo por Kg (R$): 9.00 <enter> Total a pagar: 13.5 ICMS (17%): 2.29 Lucro lquido do aougue (R$): 11.21 Sair [S/N]? S <enter>

9.5 Escreva um programa em Java que recebe via teclado: tipo de animal [1] Gado, [2] Eqinos ou [3] Ovinos, preo unitrio do animal e quantidade de animais comprados. O programa deve calcular e imprimir na tela: preo total pago e a comisso do escritrio de remate (gado 5%, eqinos - 7% e ovinos - 3%), conforme exemplo abaixo:
Exemplo (Tela): Tipo de animal [1] Gado, [2] Eqinos ou [3] Ovinos: 1 <enter> Preo unitrio do animal (R$): 200 <enter> Quantidade de animais: 10 <enter> Preo total pago (R$): 2100.00 Comisso a pagar (R$): 100.00 Continua [S/N]? s <enter> Tipo de animal [1] Gado, [2] Eqinos ou [3] Ovinos: 2 <enter> Preo unitrio do animal (R$): 1000 <enter> Quantidade de animais: 1 <enter> Preo total pago (R$): 1070.00 Comisso a pagar (R$): 70.00 Continua [S/N]? N <enter>

9.6 Reescreva o programa anterior recebendo via teclado uma letra para o tipo de animal [G]ado, [E]qinos ou [O]vinos, preo unitrio do animal e quantidade de animais comprado. O programa deve calcular e imprimir na tela: preo total pago e a comisso do escritrio de remate (gado: 5%, eqinos: 7% e ovinos: 3%), conforme exemplo abaixo:
Exemplo (Tela): Tipo de animal [G]ado, [E]qinos ou [O]vinos: g <enter> Preo unitrio do animal (R$): 200 <enter> Quantidade de animais: 10 <enter> Preo total pago (R$): 2100.00 Comisso a pagar (R$): 100.00 Continua [S/N]? s <enter>

9.7 Escreva um programa em Java que recebe via teclado: a data de hoje da seguinte forma: dia, ms, ano e a sua idade, da seguinte forma: anos, meses e dias vividos. O programa deve calcular e imprimir a data de nascimento no seguinte formato: dd/mm/aaaa.
Exemplo (Tela): Qual a data de hoje: Dia: 16 <enter> Ms: 6 <enter> Ano: 2003 <enter> Qual a sua idade: Anos: 41 <enter> Meses: 4 <enter> Dias: 6 <enter> Data de Nascimento: 10/02/1962 Continuar [S/N]? s <enter>

9.8 Escreva um programa em Java que recebe via teclado um nmero inteiro de 0 99. O programa deve imprimir na tela este nmero por extenso (conforme exemplo abaixo). O programa termina quando o usurio digitar 0 (zero).
Exemplo: Nmero [0..99]: 23 <enter> Vinte e trs Nmero [0..99]: 45 <enter>

52

Quarenta e cinco Nmero [0..99]: 0 <enter>

9.9 Escreva um programa em Java que recebe via teclado: quantidade de litros vendidos, tipo de combustvel ([A]lcool, [G]asolina ou [D]iesel) e o tipo de pagamento ([P]razo ou [V]ista). O programa deve calcular e imprimir na tela: total prazo, desconto e o total vista. O programa termina quando o usurio digitar 'N' ou 'n' na pergunta "Continua [S/N]?".
Tela de execuo: Quantidade de litros? 50 <enter> Tipo de combustvel [A]lcool, [G]asolina ou [D]iesel ? G <enter> Tipo de pagamento [P]razo ou a [V]ista ? V <enter> Total prazo (R$) : 109.50 Desconto (R$): 5.48 Total vista (R$): 104.02 Continua [S/N]? N <enter> Valores: lcool - 1,23 Gasolina - 2,19 Diesel - 1,46 Desconto vista: 5%

9.10 Escreva um programa em Java que recebe via teclado duas notas: nota1 e nota2. O programa deve imprimir na tela a mdia, o conceito do aluno (dado pela tabela abaixo) e a situao (aprovado, exame ou reprovado):
Conceito A B C D Nota1 + Nota2 Mdia = ----------------2 Mdia 9,0 10,0 7,0 8,9 6,0 6,9 0,0 5,9 Exemplo: Nota1: 7 <enter> Nota2: 8 <enter> Mdia: 7.5 Conceito: B Situao: Aprovado Sair [S/N]? s <enter> Situao Aprovado Aprovado Exame Reprovado

Observao: Programa termina se o usurio digitar S ou s na pergunta: Sair [S/N]?

9.11 Escreva um programa em Java que recebe via teclado uma temperatura e o tipo de converso (converter para: [C]elsius ou [F]ahrenheit). Calcule e imprima na tela a temperatura correspondente a solicitao do usurio, conforme exemplos abaixo:
Exemplo: Temperatura: 30 <enter> Tipo de converso (converte para: [C]elsius ou [F]ahrenheit): F <enter> Temperatura em Fahrenheit: 86 Continua [S/N]? S <enter> Temperatura: 86 <enter> Tipo de converso (converte para: [C]elsius ou [F]ahrenheit): C <enter> Temperatura em Celsius: 30 Continua [S/N]? n <enter> C 9 . --- = 5

Frmula:

F -

32

9.12 Escreva um programa em Java que recebe via teclado: graus (0 360), minutos (0 59) e segundos (0 59). O programa deve calcular e imprimir na tela o ngulo em graus, dado pela seguinte frmula:
ngulos em graus = graus + minutos ---------60 + segundos ---------3600

53

Exemplo: Graus: 45 <enter> Minutos: 45 <enter> Segundos: 45 <enter> ngulo em Graus: 45.76 Continua [S]im ou [N]o? S <enter> Graus: 45 <enter> Minutos: 10 <enter> Segundos: 15 <enter> ngulo em Graus: 45.17 Continua [S]im ou [N]o? N <enter> Observao: Imprimir mensagens de erro se os valores de entrada estiverem fora da faixa: ERRO: Graus fora da faixa, ERRO: Minutos fora da faixa ou ERRO: Segundos fora da faixa.

9.13 Escreva um programa em Java que recebe via teclado: sexo ([M]asculino ou [F]eminino), altura e peso da pessoa. O programa deve calcular e imprimir na tela: peso ideal, diferena de peso e situao (MAGRO, IDEAL ou GORDO) (conforme exemplo abaixo):
Exemplo: Sexo [M]asculino ou [F]eminino: M <enter> Altura: 1.65 <enter> Peso: 92 <enter> Peso Ideal: 62.0 Diferena de Peso: 30.0 Situao: GORDO Sair [S/N]? s <enter>

PIM = 72,7 x altura 58 PIF = 62,1 x altura 44,7

MAGRO IDEAL GORDO -------------------|-------------------|---------------------5% pi 5% Observao: Programa termina se o usurio digitar S ou s na pergunta: Sair [S/N]?

54

10. Vetores, Matrizes e Strings


Um vetor uma coleo de variveis de mesmo tipo (agregados homogneos) que so referenciadas pelo mesmo nome, utilizando-se um ndice para diferencia-los. Um vetor consiste em locaes contguas de memria, ou seja, os elementos encontram-se em sequncia (contiguidade fsica). O menor endereo corresponde ao primeiro elemento, e o maior corresponde ao ltimo elemento. Uma vantagem na utilizao de um vetor poder armazenar vrios valores (elementos), na memria RAM, ao mesmo tempo, permitindo, por exemplo, compar-los e classific-los. Exemplo: Vetor unidimensional de inteiros (idades). Tabela 11: Exemplo de um vetor unidimensional ndice Valor 0 24 1 12 2 36 3 41 10.1 Vetores Vetor (matriz de uma dimenso - 1D) um tipo especial de matriz que possui apenas um ndice, ou seja, permite armazenar variveis unidimensionais (permite representar uma tabela). tipo_dado [] nome_do_vetor = new tipo_dado [nmero_de_elementos]; Onde: tipo_dado: tipo de dado de cada elemento (char, byte, int, short, long, float, double). nome_do_vetor: nome da varivel que ir representar o vetor nmero_de_elementos: nmero total de elementos do vetor primeiro elemento: 0 ltimo elemento: nmero_de_elementos 1 nmero de bytes ocupados na memria RAM: nmero_de_elementos x quantidade_de_bytes_de_um_elemento Exemplo: int [] x = new int[10];
// 10 elementos: x[0] x[9]

primeiro elemento: x[0] ltimo elemento: x[nmero_de_elementos 1], ou seja, x[9] nmero de bytes: 10 x 4 = 40 bytes (um inteiro ocupa 4 bytes) 10.2 Strings Um objeto do tipo String (cadeia de caracteres) pode ser copiado para um vetor de caracteres. Veja o exemplo a seguir: ASCII: Americam Standard Code for Information Interchange. url: http://www.asciitable.com Programa Exemplo (28): Programa cpia String para um vetor de caracteres. todos os caracteres de uma

55

// ----------------------------------------- Fonte: Prog28.java package prog28; import java.util.Scanner; public class Prog28 { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; System.out.print("String: "); s = entrada.nextLine(); int n = s.length(); char [] vetorCaracter = new char[n]; for (int i = 0;i < s.length();i++) { vetorCaracter[i] = s.charAt(i); } System.out.print("Vetor: "); for (int i = n - 1;i >= 0;i--) { System.out.print(vetorCaracter[i]); } System.out.println(); } }

10.3 Matrizes (Multidimensional) tipo_dado [][] nome_matriz = new tipo_dado [tamanho][tamanho]; Exemplo: float [][] y = new float [5][5];
// matriz 2D

Para acessar o elemento 3, 4 da matriz y, deve-se escrever y[3][4]. Note que o primeiro elemento y[0][0] e o ltimo elemento y[4][4]. O total de elementos 25. Programa Exemplo (28a): O programa possui uma matriz bidimensional para gerar e exibir na tela n palpites para a Mega Sena.
// ------------------------------------------- Fonte: Prog28a.java package prog28a; import javax.swing.*; public class Prog28a { public static void main(String[] args) { int n = entradaDados(); int [][] sena = new int [n][6]; geraPalpites(n, sena); sort(n, sena); exibePalpites(n, sena); System.exit(0); } // --------------------------- entradaDados static int entradaDados() { String s; s = JOptionPane.showInputDialog("Numero de Palpites: "); int n = Integer.parseInt(s); return(n); } // --------------------------- geraPalpites static void geraPalpites(int n, int [][] sena) {

56

int num; boolean repetido; for (int i = 0;i < n;i++) { for (int j = 0;j < 6;j++) { do { num = (int) (1 + (Math.random() * 60)); System.out.println(num); repetido = testaRepetido(num, sena[i]); if (!repetido) { sena[i][j] = num; } } while (repetido); } } } // --------------------------- testaRepetido static boolean testaRepetido(int num, int [] sena) { for (int i = 0;i < 6;i++) { if (num == sena[i]) { return(true); } } return(false); } // --------------------------- sort static void sort(int n, int [][] sena) { for (int k = 0;k < n;k++) { for (int i = 0;i < 5;i++) { for (int j = i+1;j < 6;j++) { if (sena[k][i] > sena[k][j]) { int temp = sena[k][i]; sena[k][i] = sena[k][j]; sena[k][j] = temp; } } } } } // --------------------------- exibePalpites static void exibePalpites(int n, int [][] sena) { for (int i = 0;i < n;i++) { String extenso = ""; for (int j = 0;j < 6;j++) { extenso = extenso + sena[i][j] + " "; } JOptionPane.showMessageDialog(null, "Palpite: JOptionPane.PLAIN_MESSAGE); } } }

"

extenso,

"Mega

Sena",

10.4 Vetor de Strings Para criar um vetor de Strings, deve-se utilizar um vetor de Strings. Exemplo: String [] nome = new String[3]; nome[0] = UCPel; nome[1] = UCS; nome[2] = UFPel; String [] s = {Pelotas, Rio Grande, Bag};

57

Tabela 12: 0 0 U 1 U 2 U

Exemplo 1 C C F

de um 2 P S P

vetor de strings 3 4 5 e l null null e l null

Cria um vetor com trs Strings. Para acessar uma String em particular deve-se especificar o ndice entre colchetes, ou seja, nome[0], nome[1] ou nome[2]. 10.5 Inicializao de matrizes e vetores tipo_dado [][] nome_matriz = {lista_valores}; lista_valores: lista de constantes separadas compatveis em tipo com o tipo base da matriz. Exemplo: int [] i = {0,1,2,3,4,5,6,7,8,9}; por vrgulas que so

// 10 elementos

Observao: Quando um vetor declarado e inicializado (ao mesmo tempo) o nmero de elementos (neste caso 10) pode ser suprimido, ou seja, neste caso opcional (veja exemplo anterior). 10.6 Inicializao de um vetor de caracteres char [] nome_vetor Exemplo: = {lista_de_caracteres};

char [] str = {s, i, m}; 0 s 1 i 2 m

10.7 Inicializao de matrizes multidimensionais int [][] y = { {1,1}, {2,4}, {3,9}, {4,16} }; y[0][0] y[0][1] y[1][0] y[1][1] = = = = 1 1 2 4 y[2][0] y[2][1] y[3][0] y[3][1] = = = = 3 9 4 16

10.8 Inicializao de vetores e matrizes sem tamanho Na inicializao de uma matriz (ou vetor), se no for especificado seu tamanho, ento o compilador Java cria uma matriz (ou vetor) grande o suficiente para conter todos os inicializadores presentes. Exemplo: char [] s = {p,a,u,l,o};
// s ocupa 5 bytes

Programa exemplo (29): O programa permite armazenar n nomes e idades em dois vetores.
// ---------------------------------------------- Fonte: prog29.java package prog29; import java.util.Scanner; public class Prog29 {

58

public static void main(String[] args) throws Exception{ Scanner entrada = new Scanner(System.in); String s; String [] nome; int [] idade; int numElementos; char ch; System.out.print("Numero de Elementos: "); s = entrada.nextLine(); numElementos = Integer.parseInt(s); nome = new String[numElementos]; idade = new int[numElementos]; for (int i = 0;i < numElementos;i++) { System.out.print("Nome: "); nome[i] = entrada.nextLine(); System.out.print("Idade: "); s = entrada.nextLine(); idade[i] = Integer.parseInt(s); } for (int i = 0; i < numElementos; i++) { System.out.printf("| %-41s | %d | \n", nome[i], idade[i]); } } }

Programa exemplo (30): O programa realiza a soma de duas matrizes (A e B) bidimensionais, gerando uma matriz resultante C.
// ---------------------------------------------- Fonte: Prog30.java package prog30; import java.util.Scanner; public class Main { public static void main(String[] args) { final int MAX = 10; Scanner entrada = new Scanner(System.in); String s; int [][] a = new int [MAX][MAX]; int [][] b = new int [MAX][MAX]; int [][] c = new int [MAX][MAX]; int col, lin, j, m, n; System.out.print("Informe a ORDEM da MATRIZ: (mxn)\n"); do { System.out.printf("Nmero de linhas (m): "); s = entrada.nextLine(); m = Integer.parseInt(s); } while (m < 1 || m > MAX); // m de 1 10 do { System.out.print("Nmero de colunas (n): "); s = entrada.nextLine(); n = Integer.parseInt(s); } while (n < 1 || n > MAX); // n de 1 10 for (lin = 1;lin <= m;lin++) { for (col = 1;col <= n;col++) { System.out.printf("A[%d,%d] = ",lin,col); s = entrada.nextLine(); a[lin][col] = Integer.parseInt(s); System.out.printf("B[%d,%d] = ",lin,col); s = entrada.nextLine(); b[lin][col] = Integer.parseInt(s); } } System.out.println(); for (lin = 1;lin <= m;lin++) { for (col = 1;col <= n;col++) { c[lin][col] = a[lin][col] + b[lin][col]; System.out.printf("C[%d,%d] = %d\n",lin,col,c[lin][col]); } } } }

59

10.9 Classificao de dados ou ordenao (sort) Para exemplificar melhor as variveis do tipo vetor, abaixo so mostrados dois tipos de ordenao, tambm chamado sort (classificao de dados): Programa exemplo (31): O programa classifica os nomes digitados pelo usurio.
// -------------------------------------------- Fonte: Prog31.java package prog31; import java.util.Scanner; public class Prog31 { public static void main(String[] args) { String [] nome; int numElementos; Scanner entrada = new Scanner(System.in); String s; System.out.print("Numero de Elementos: "); s = entrada.nextLine(); numElementos = Integer.parseInt(s); nome = new String[numElementos]; for (int i = 0;i < numElementos;i++) { System.out.print("Nome: "); nome[i] = entrada.nextLine(); } for (int i = 0; i < numElementos - 1; i++) { for (int j = i+1; j < numElementos; j++) { if (nome[i].compareTo(nome[j]) > 0) { String temp = nome[i]; nome[i] = nome[j]; nome[j] = temp; } } } System.out.printf("\nNomes ORDENADOS\n"); for (int i = 0; i < numElementos; i++) { System.out.printf("Nome: %s\n", nome[i]); } } }

Observao: O mtodo compareTo descrito no prximo captulo. Programa exemplo (32): O programa utiliza um mtodo de sort chamado bubble sort (mtodo da bolha) para classificar nomes.
// ------------------------------------------- Fonte: Prog32.java package prog32; import java.util.Scanner; public class Prog32 { public static void main(String[] args) { String [] nome; int numElementos; Scanner entrada = new Scanner(System.in); String s; boolean sort; System.out.print("Numero de Elementos: "); s = entrada.nextLine(); numElementos = Integer.parseInt(s); nome = new String[numElementos];

60

for (int i = 0;i < numElementos;i++) { System.out.print("Nome: "); nome[i] = entrada.nextLine(); } int k = numElementos - 1; do { sort = false; for (int i = 0; i < k; i++) { if (nome[i].compareTo(nome[i+1]) > 0) { String temp = nome[i]; nome[i] = nome[i+1]; nome[i+1] = temp; sort = true; } } k--; } while (sort); System.out.printf("\nNomes ORDENADOS\n"); for (int i = 0; i < numElementos; i++) { System.out.printf("Nome: %s\n", nome[i]); } } }

10.10 Lista de exerccios (vetores) 10.10.1 Escreva um programa em Java que recebe via teclado um conjunto de letras (mximo 20). Armazene todas as letras em um vetor (letras) at que o usurio digite um F ou f. Logo aps copie todas as letras (em ordem inversa) para outro vetor (inverso). Ao final imprima os dois vetores.
Exemplo: Letra: Letra: Letra: Letra: Letra: LIMA AMIL L I M A f <enter> <enter> <enter> <enter> <enter>

10.10.2 Escreva um programa em Java que recebe via teclado: nmero de idades e as respectivas idades. Armazene todas as idades em um vetor (idade). Logo aps a entrada de todas as idades, o programa deve receber via teclado: idade para consulta. O programa deve imprimir na tela, o nmero de idades antes da idade de consulta e o nmero de idades depois da idade de consulta.
Exemplo: Nmero de idades: 6 <enter> Idade: 30 <enter> Idade: 60 <enter> Idade: 10 <enter> Idade: 50 <enter> Idade: 20 <enter> Idade: 40 <enter> Idade para consulta: 50 <enter> Antes: 3 Depois: 2 Continua [S/N]? n <enter>

10.10.3 Escreva um programa em Java que recebe via teclado um conjunto de nmeros inteiros (mximo 50). Armazene todos os nmeros inteiros em um vetor at que o usurio digite 0 (zero). Logo aps permita ao usurio consultar um nmero informando o seu valor. O programa deve imprimir na tela a posio do nmero no vetor ou ERRO: Nmero no encontrado (veja exemplos abaixo):
Exemplo: Nmero: 50 <enter> Nmero: 30 <enter> Nmero: 20 <enter>

61

Nmero: 10 <enter> Nmero: 40 <enter> Nmero: 0 <enter> Valor: 20 <enter> Posio no vetor: 2 Valor: 40 <enter> Posio no vetor: 4 Valor: 60 <enter> ERRO: Nmero no encontrado Valor: 0 <enter> Observao: O programa termina quando o usurio digitar 0 (zero).

10.10.4 Escreva um programa em Java que recebe via teclado "n" conceitos (A, B, C, D e E) (mximo 25) at que o usurio digite F ou f. Armazene todos os conceitos em um vetor (conceito). Imprima na tela o nmero de alunos: aprovados (A, B e C), reprovados (D) e os infreqentes (E).
Exemplo: Conceito: B <enter> Conceito: A <enter> Conceito: E <enter> Conceito: B <enter> Conceito: D <enter> Conceito: C <enter> Conceito: A <enter> Conceito: E <enter> Conceito: f <enter> 5 Aprovado(s) 1 Reprovado(s) 2 Infreqente (s)

10.10.5 Escreva um programa em Java que recebe via teclado n (mximo 50) nomes. A entrada dos nomes termina quando o usurio digitar apenas <enter>. Logo aps a entrada de todos os nomes o programa deve permitir a entrada via teclado de uma letra. O programa deve imprimir na tela todos os nomes que comeam com a letra especificada pelo usurio. O programa termina quanto o usurio digitar (nada) na entrada da letra (conforme exemplos abaixo):
Exemplo: Nome: Paulo <enter> Nome: Roberto <enter> Nome: Renato <enter> Nome: Pedro <enter> Nome: Fabio <enter> Nome: <enter> Letra: R <enter> Nome: Roberto Nome: Renato Letra: P <enter> Nome: Paulo Nome: Pedro Letra: T <enter> Letra: <enter>

10.10.6 Escreva um programa em Java que recebe via teclado n 30) nomes e idades. A entrada dos dados termina quando o digitar 'N' ou 'n' na pergunta "Continua [S/N]?". Logo aps a de todos os dados o programa deve imprimir na tela todos os idades desde o mais velho at o mais novo.
Exemplo: Nome: Ana <enter> Idade: 12 <enter> Continua [S/N]? s <enter> Nome: Beatriz <enter> Idade: 13 <enter> Continua [S/N]? s <enter> Nome: Carla <enter> Idade: 14 <enter> Continua [S/N]? N <enter>

(mximo usurio entrada nomes e

62

Carla Beatriz Ana

14 13 12

63

11. Manipulao de Strings


A linguagem Java possui uma classe especifica para manipular strings, ou seja, cadeia de caracteres.

11.1 Mtodos para manipular Strings


Considere que: String s = Pelotas; A seguir so descritos os manipular objetos do tipo String. principais mtodos que permitem

Sintaxe: char charAt(int index); Retorna o caracter do ndice especifiado. Modo de usar: String s = Pelotas; ch = s.charAt(0); // ch = P; Onde: char ch; Sintaxe: int compareTo(Object o); Compara a String com um Objeto. Sintaxe: int compareTo(String anotherString); Compara duas Strings lexicograficamente. Sintaxe: int compareToIgnoreCase(String str); Compara duas Strings lexicograficamente, ignorando mausculas e minsculas. Sintaxe: String concat(String str); Concatena a String especificada no fim desta String. Sintaxe: boolean contentEquals(StringBuffer sb); Retorna true se e somente se esta String representa sequncia de caracteres do que a StringBuffer especificada. a mesma diferenas entre

Sintaxe: static String copyValueOf(char[] data); Retorna uma String que representa a sequncia de caracteres do vetor especificado. Sintaxe: static String copyValueOf(char[] data, int offset, int count); Retorna uma String que representa uma sequncia de caracteres do vetor especificado. Sintaxe: boolean endsWith(String suffix); Testa se esta String termina com o sufixo especificado. Sintaxe: boolean equals(Object anObject); Compara esta String com o objeto especificado. Sintaxe: boolean equalsIgnoreCase(String anotherString); Compara esta String com outra String, ignorando maisculas minsculas. e

Sintaxe: byte[] getBytes(); Codifica esta String em uma sequncia de bytes usando o conjunto de caracteres, armazenando o resultaod em um novo vetor de bytes. Sintaxe: byte[] getBytes(String charsetName);

64

Codifica esta String em uma sequncia de bytes usando o conjunto de caracteres do nome, armazenando o resultado dentro do novo vetor. Sintaxe: void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin); Cpia esta seqncia de caracteres em um vetor de caracteres destino. Sintaxe: int hashCode(); Retorna o cdigo hash desta String. Sintaxe: int indexOf(int ch); Retorna o ndice dentro desta seqncia da caracter especificado ou -1 se no encontrar. primeira ocorrncia do

Sintaxe: int indexOf(int ch, int fromIndex); Retorna o ndice dentro desta String da primeira ocorrncia caracter especificado, iniciando a busca no ndice espeficidado. Sintaxe: int indexOf(String str); Retorna o ndice dentro desta substring especificada. String da primeira ocorrncia

do

da

Sintaxe: int indexOf(String str, int fromIndex); Retorna o ndice dentro desta String da primeira ocorrncia substring especificada, iniciando a busca no ndice espeficidado. Sintaxe: String intern(); Retorna uma representao cannica da String objeto.

da

Sintaxe: int lastIndexOf(int ch); Retorna o ndice dentri desta String da ltima ocurrncia do caracter especificado. Sintaxe: int lastIndexOf(int ch, int fromIndex); Retorna o ndice dentro desta String da ltima ocurrncia do caracter especificado, pesquisando para trs comeando no ndice especificado. Sintaxe: int lastIndexOf(String str); Retorna o ndice dentro desta seqncia da ocorrncia mais direita da subseqncia especificada. Sintaxe: int lastIndexOf(String str, int fromIndex); Retorna o ndice dentro desta String da ltima ocorrncia da substring especificada, buscando para trs comeando o ndice especificado. Sintaxe: int length(); Retorna o comprimento desta String. Sintaxe: boolean matches(String regex); Diz se esta seqncia corresponde a expresso regular ou no. Sintaxe: boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len); Testa se duas regies das Strings so iguais. Sintaxe: boolean regionMatches(int toffset, String other, int ooffset, int len); Testa se duas regies das Strings so iguais. Sintaxe: String replace(char oldChar, char newChar);

65

Retorna uma nova String resultante da troca de todas as ocorrncias do oldChar nesta String com newChar. Sintaxe: String replaceAll(String regex, String replacement); Substitui cada subseqncia da seqncia de caracteres que corresponde a expresso regular com a substituio dadas. Sintaxe: String replaceFirst(String regex, String replacement); Substitui as primeiras substrings dessa String que corresponde expresso regular com a substituio dadas. Sintaxe: String[] split(String regex); Divide essa String em pedaos em torno da expresso regular. Sintaxe: String[] split(String regex, int limit); Divide essa String em pedaos em torno da expresso regular. Sintaxe: boolean startsWith(String prefix); Testa se esta String comea com o prefixo especificada. Sintaxe: boolean startsWith(String prefix, int toffset); Testa se essa String comea com o prefixo especificad comeando no ndice especificado. Sintaxe: CharSequence subSequence(int beginIndex, int endIndex); Retorna uma nova String de caracteres que uma subseqncia desta seqncia. Sintaxe: String substring(int beginIndex); Retorna uma nova String que uma substring desta String. Sintaxe: String substring(int beginIndex, int endIndex); Retorna uma nova String que uma substring desta string. Sintaxe: char[] toCharArray(); Converte esta String em um novo vetor de caracteres. Sintaxe: String toLowerCase(); Converte todos os caracteres desta String para minsculos. Sintaxe: String toString(); Este objeto (que j uma String) retornado. Sintaxe: String toUpperCase(); Converte todos os caracteres desta String para maisculos. Sintaxe: String trim(); Retorna uma cpia desta String. Sintaxe: static String valueOf(boolean b); Retorna uma representao String do argumento boolean. Sintaxe: static String valueOf(char c); Retorna uma representao String do argumento char. Sintaxe: static String valueOf(char[] data); Retorna uma representao String do argumento char []. Sintaxe: static String valueOf(char[] data, int offset, int count); Retorna uma representao String do argumento char [[].

66

Sintaxe: static String valueOf(double d); Retorna uma representao String do argumento double. Sintaxe: static String valueOf(float f); Retorna uma representao String do argumento float. Sintaxe: static String valueOf(int i); Retorna uma representao String do argumento int. Sintaxe: static String valueOf(long l); Retorna uma representao String do argumento long. Sintaxe: static String valueOf(Object obj); Retorna uma representao String do argumento Object. Exemplos: a) Exemplo do uso de toUpperCase e toLowerCase:
// ----------------------------------------------------- Fonte: ToUpperCase.java package touppercase; public class ToUpperCase { public static void main(String[] args) { String s = "Paulo Roberto Gomes Luzzardi"; System.out.println("Nome: " + s); System.out.println("Nome: " + s.toUpperCase()); System.out.println("Nome: " + s.toLowerCase()); System.exit(0); } } Resultado do Programa: Nome: Paulo Roberto Gomes Luzzardi Nome: PAULO ROBERTO GOMES LUZZARDI Nome: paulo roberto gomes luzzardi

b) Exemplo do uso de length, charAt e indexOf:


// ------------------------------------------------------ Fonte: Inverte.java package inverte; import java.util.Scanner; public class Inverte { public static void main(String[] args) { Scanner input = new Scanner(System.in); String s; int n; char op; do { System.out.print("Nome: "); s = input.nextLine(); System.out.print("Invertido: "); n = s.length(); // nmero for (int i = n-1;i >= 0;i--) { System.out.print(s.charAt(i)); // } System.out.println(); do { System.out.print("Continua [S/N]? "); s = input.nextLine(); op = s.charAt(0); } while ("SsNn".indexOf(op) == -1); // } while ("Ss".indexOf(op) != -1); // } while

de caracteres da String s acesso a cada caracter de s

verifica se op SsNn ("S".equalsIgnoreCase(s));

67

System.exit(0); } } Resultado do Programa: Nome: pelotas Invertido: satolep Continua [S/N]? s Nome: satolep Invertido: pelotas Continua [S/N]? N

c) Exemplo do uso de String.format:


// -------------------------------------------- Fonte: StringFormat.java package stringformat; import javax.swing.*; public class StringFormat { public static void main(String[] args) { float numero = 123.4567f; String formato = String.format("%.3f", numero); JOptionPane.showMessageDialog(null, "Peso Ideal: " + formato); // System.out.printf("Peso Ideal: %.4f\n", pesoIdeal); System.exit(0);

} }

11.2 Lista de exerccios (Strings) 11.2.1 Escreva um programa em Java que recebe via teclado um nome. Logo aps a entrada do nome imprima: nmero de letras maisculas, nmero de letras minsculas, nmero de vogais e o nmero de consoantes, conforme exemplo abaixo:
Exemplo: Nome: Universidade Catlica de Pelotas <enter> (3) Letras maisculas (26) Letras minsculas (14) Vogais (15) Consoantes

11.2.2 Escreva um programa em Java que recebe via teclado uma palavra e uma letra. Logo aps a entrada do nome e da letra imprima o nmero de letras que existe no nome ou ERRO: No existe a letra (?) na palavra (?), conforme exemplo abaixo:
Exemplo: Palavra: Luzzardi <enter> Letra: z <enter> 2 letra(s) Continua [S]im ou [N]o? S <enter> Palavra: Luzzardi <enter> Letra: w <enter> ERRO: No existe a letra (w) na palavra (Luzzardi) Continua [S]im ou [N]o? N <enter> quando o usurio digitar N ou n na

Observao: O programa deve ser encerrado pergunta: Continua [S]im ou [N]o?.

11.2.3 Escreva um programa em Java que recebe via teclado uma palavra (mximo 20 letras) e uma posio. O programa deve imprimir na tela, a letra antecessora, a letra (da referida posio) e a letra sucessora, conforme exemplo abaixo:
Exemplo: Palavra: Universidade <enter> Posio: 7 <enter>

68

Antecessora: s Letra: i Sucessora: d Observao: O programa deve imprimir na tela as seguintes mensagens de erro, se for o caso: Letra antecessora no existe, Letra sucessora no existe ou Posio invlida.

11.2.4 Escreva um programa em Java que recebe via teclado um nome. O programa deve imprimir, na tela, as palavras do nome em ordem inversa, uma por linha, conforme exemplo abaixo:
Exemplo: Nome: Paulo Roberto Gomes Luzzardi <enter> Luzzardi Gomes Roberto Paulo

11.2.5 Escreva um programa em Java que recebe via teclado um nome. Logo aps a entrada do nome o programa deve imprimir (EM LETRA MAISCULA) o sobrenome da pessoa, conforme exemplos abaixo:
Exemplo: Nome: Paulo Roberto Gomes Luzzardi <enter> Sobrenome: LUZZARDI Sair [S/N]? N <enter> Nome: Renato Souza <enter> Sobrenome: SOUZA Sair [S/N]? s <enter>

Observao: O programa termina quando o usurio digitar S ou s na pergunta: Sair [S/N]?

11.2.6 Escreva um programa em Java que recebe via teclado um nome. Logo aps a entrada do nome o programa deve imprimir na tela: sobrenome, primeiro nome e demais nomes abreviados, conforme exemplos abaixo:
Exemplo: Nome: Paulo Roberto Gomes Luzzardi <enter> Autor: Luzzardi, Paulo R. G. Sair [S/N]? N <enter> Nome: Renato Lima Souza <enter> Autor: Souza, Renato L. Sair [S/N]? s <enter>

Observao: O programa termina quando o usurio digitar S ou s na pergunta: Sair [S/N]?

11.2.7 Escreva um programa em Java que recebe via teclado o nome de um estado. Logo aps a entrada do nome do estado imprima: a sigla do estado (2 letras maisculas), conforme exemplos abaixo:
Exemplo: Estado: Rio Grande do Sul <enter> Sigla: RS Estado: so paulo <enter> Sigla: SP Estado: rio de janeiro <enter> Sigla: RJ Estado: <enter>

Observao: O programa encerra quando o usurio digitar apenas <enter> na entrada do nome do estado.

11.2.8 Escreva um programa em Java que recebe via teclado uma palavra, incio e fim. Logo aps a entrada de todos os dados imprima a string resultante ou ERRO: Fim invlido ou Incio invlido, conforme exemplos abaixo:
Exemplo: Palavra: universidade <enter> Incio: 7 <enter> Fim: 11 <enter>

69

String resultante: idade Continua [S/N]? s <enter> Palavra: eletricidade <enter> Incio: 7 <enter> Fim: 15 <enter> ERRO: Fim Invlido Continua [S/N]? N <enter> Observao: O programa termina quando o usurio digitar N ou n na pergunta: Continua [S/N]?.

12. Mtodos estticos definidos pelo programador


A linguagem de programao Java permite que o programador crie e utilize seus prprios mtodos estticos. Forma Geral:
static tipo_do_retorno nome_do_mtodo (tipo_dado_base parmetros ou argumentos) { tipo_dado_base variveis; corpo do mtodo; } return(x);

tipo_do_retorno: Especifica o tipo de dado que ser retornado pelo mtodo. O retorno do mtodo feito pelo comando return (valor). Parmetros ou argumentos: uma lista, separada por vrgulas, com os nomes das variveis (e seus tipos) que recebero os argumentos quando o mtodo for chamado ou executado. Mtodo procedural: um tipo especial de mtodo que no possui retorno, ou seja, simplesmente um procedimento. Um mtodo deste tipo void. Exemplo: Programa que gera 10 nmeros aleatrios, usando um mtodo esttico escrito pelo programador.
// ----------------------------------------------- Fonte: rand.java package rand; public class Rand { public static void main(String[] args) { for (int i = 1;i <= 10;i++) { System.out.println("Valor: " + random(10)); } } // ----------------------------------------------- random static int random (int n) { int t; t = (int) (Math.random() * n); return(t); } }

Chamada do mtodo: n = random(10); Programa exemplo (33): calcula o inverso 1/x. O

// retorna um nmero aleatrio entre 0 e 9

programa

possui

um

mtodo

esttico

que

// ---------------------------------------------- Fonte: Prog33.java

70

package prog33; import java.util.Scanner; public class Prog33 { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; double inv, x; System.out.print("x: "); s = entrada.nextLine(); x = Double.parseDouble(s); inv = inverso (x); // chamada do mtodo inverso System.out.printf("Inverso = %.2f\n", inv); System.exit(0); } // ----------------------------- Mtodo definido pelo programador static double inverso (double x) { double i; i = (double) 1 / x; return(i); } }

12.1 Valores de retorno Todas os mtodos, exceto aqueles que so declaradas como sendo do tipo void, devolvem um valor. O valor devolvido (retornado) pelo mtodo atravs do comando return. Normalmente so escritas trs tipos de mtodos: a) Mtodos que efetuam operaes com os parmetros e retornam um valor com base nas operaes. Programa exemplo (34): O programa calcula e imprime na tela o valor da potncia xy atravs de um mtodo esttico chamado: potencia.
// --------------------------------------------- Fonte: Prog34.java package prog34; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; double base,resp; int expoente; System.out.print("Base: "); s = entrada.nextLine(); base = Double.parseDouble(s); System.out.print("Expoente: "); s = entrada.nextLine(); expoente = Integer.parseInt(s); // chamada do mtodo potencia resp = potencia(base, expoente); System.out.printf("Potencia = %7.2f\n",resp); System.exit(0); } // ----------------------------- Mtodo definido pelo programador

71

static double potencia (double x, int y) { double valor; valor = Math.exp ( Math.log (x ) * y ); return(valor); } }

b) Mtodos que manipulam informaes e retornam um simplesmente indica o sucesso ou o fracasso da manipulao.

valor

que

Programa exemplo (35): O programa calcula e verifica o determinante de uma equao de segundo grau atravs de um mtodo esttico chamado: verificaDeterminante.
// ------------------------------------------ Fonte: Prog35.java package prog35; import java.util.Scanner; public class Prog35 { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; float a, b, c; int retorno; System.out.print("a = "); s = entrada.nextLine(); a = Float.parseFloat(s); System.out.print("b = "); s = entrada.nextLine(); b = Float.parseFloat(s); System.out.print("c = "); s = entrada.nextLine(); c = Float.parseFloat(s); retorno = verificaDeterminante(a,b,c); if (retorno == 0) { System.out.println("Determinante ZERO"); } else { if (retorno > 0) { System.out.println("Determinante POSITIVO"); } else { System.out.println("Determinante NEGATIVO"); } } System.exit(0); } // ------------------------ mtodo definido pelo programador static int verificaDeterminante (float a, float b, float c) { float det; det = b * b - 4 * a * c; if (det == 0) { return(0); } else { if (det > 0) { return(1); } else { return(-1); } } } }

72

c) Mtodos que procedimentos.

no

retornam

nenhum

valor,

ou

seja,

so

puramente

Programa exemplo (36): O programa possui um mtodo esttico que limpa toda a tela em modo texto atravs do mtodo chamado: imprimeNumero.
// -------------------------------------- Fonte: Prog36.java package prog36; import java.util.Scanner; public class Prog36 { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; int x; float y; System.out.print("Digite um Numero: "); s = entrada.nextLine(); x = Integer.parseInt(s); imprimeNumero(x); System.out.print("Digite outro Numero: "); s = entrada.nextLine(); y = Float.parseFloat(s); imprimeNumero(y); System.exit(0); } // ----------------------------- ImprimeNumero static void imprimeNumero(int n) { System.out.println("Numero digitado foi " + n); } // ----------------------------- ImprimeNumero static void imprimeNumero(float n) { System.out.println("Numero digitado foi " + n); } }

Observao: Note que o mtodo imprimeNumero foi sobrecarregado, ou seja, ele funciona quando o argumento int ou float. 12.2 Passagem de parmetros por valor Forma de chamada de um mtodo, onde o valor do argumento apenas copiado para o parmetro formal do mtodo. Portanto, alteraes feitas nos parmetros no tero efeito nas variveis utilizadas para cham-la. Programa exemplo (37): O programa possui um mtodo que desenha um retngulo na tela.
// ------------------------------------------- Fonte: Prog37.java package prog37; public class Main { public static void main(String[] args) { desenhaRetangulo(1, 1, 20, 10); } // ------------------------ desenhaRetangulo static void desenhaRetangulo (int ci, int li, int cf, int lf) { int c, l;

73

for (l = li; l <= lf; l++) { for (c = ci; c <= cf; c++) { System.out.print("#"); } System.out.println(); } } }

Onde: ci li cf lf

-> -> -> ->

coluna inicial linha inicial coluna final linha final

Ateno: Os argumentos do mtodo recebem, respectivamente: ci=1, li=1, cf=20 e lf=10. 12.3 Passagem de parmetros por referncia A passagem de parmetros ou argumentos por referncia em Java acontece somente com qualquer tipo de dado do tipo vetor, matriz ou objetos, ou seja, no possvel fazer passagem de argumento por referncia com variveis do tipo: char, byte, int, short, long, flaot ou double. Programa exemplo (38): O programa tem um mtodo que troca o valor de duas variveis.
// ------------------------------------------------- Fonte: Prog38.java package prog38; public class Prog38 { public static void main(String[] args) { int [] x = {3, 4}; // foi impresso na tela Vetor: 3 | 4 System.out.printf("Vetor: %d - %d\n", x[0], x[1]); troca(x); // foi impresso na tela Vetor: 4 | 3 System.out.printf("Vetor: %d - %d\n", x[0], x[1]); } // ------------------------------------- troca static void troca (int [] x) { int temp = x[0]; x[0] = x[1]; x[1] = temp; } }

12.4 Mtodos que devolvem valores no-inteiros Todas os mtodos que devolvem valores no-inteiros devem ter seu tipo de retorno declarado.
tipo_do_retorno nome_do_metodo (tipo_dado_base parmetros);

Programa exemplo (39): O programa calcula e imprime na tela a diviso de dois valores usando um mtodo esttico chamado diviso.
// ------------------------------------------ Fonte: prog39.java

74

package prog39; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; int x, y; float resposta; System.out.printf("x = "); s = entrada.nextLine(); x = Integer.parseInt(s); System.out.printf("y = "); s = entrada.nextLine(); y = Integer.parseInt(s); resposta = divisao( x, y); System.out.printf("Diviso = %7.2f\n",resposta); } // ----------------------------- mtodo definido pelo programador static float divisao (int x, int y) { return( (float) x / y ); } }

12.5 Argumentos do main (String [] args) O mtodo esttico main possui um argumento args intrnsecos utilizados para receber parmetros da linha de comando do Sistema Operacional. args Vetor de Strings Programa exemplo (40): O programa recebe parmetros do Operacional (uma palavra qualquer) e imprime a palavra em inverso. O programa deve ser executado via terminal do Operacional da seguinte forma: Execuo pela linha de comandos (terminal): $ java Prog40 pelotas <enter> Resultado na tela: satolep Programa recebe: argv[0] = pelotas
// --------------------------------------- Fonte: Prog40.java package prog40; public class Prog40 { public static void main(String[] args) { int n, argc = args.length; if (argc != 1) { System.out.printf("Sintaxe: Prog40 <palavra>\n"); } else { System.out.print("Palavra: "); n = args[0].length(); for (int i = n-1; i >= 0; i--) { System.out.printf("%c", args[0].charAt(i));

Sistema sentido Sistema

75

} }

} System.out.println(); }

Programa exemplo (41): O programa deve receber parmetros pelo Sistema Operacional (conjunto de caracteres) e deve ordenar (coloca em ordem alfabtica), imprimindo-os a seguir. Execuo pela linha de comandos: $ java Prog41 dbeacgf <enter> Resultado na tela: abcdefg Programa recebe: agv[0] = dbeacgf
// ------------------------------------- Fonte: Prog41.java package prog41; public class Prog41 { public static void main(String[] args) { int argc = args.length; int numCar; if (argc != 1) { System.out.printf("Sintaxe: Prog41 <palavra> \n"); } else { numCar = args[0].length(); char [] ch = new char[numCar]; for (int i = 0;i < numCar;i++) { ch[i] = args[0].charAt(i); } for (int i = 0; i < numCar-1; i++) { for (int j = i+1; j < numCar; j++) { if (ch[i] > ch[j]) { char temp = ch[i]; ch[i] = ch[j]; ch[j] = temp; } } } for (int i =0;i < numCar;i++) { System.out.printf("%c", ch[i]); } System.out.printf("\n");

} } }

12.6 Recursividade Um mtodo recursivo, se esta, fizer uma chamada a si prpria. Programa exemplo (42): O programa calcula o fatorial de um nmero recursivamente.
// ------------------------------------------ Fonte: Prog42.java package prog42; import java.util.Scanner; public class Prog42 {

76

public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; int n; long fat; do { do {

System.out.printf("n = "); s = entrada.nextLine(); n = Integer.parseInt(s); } while (n < 0 || n > 19); fat = fatorial(n); System.out.printf("Fatorial: %d\n", fat); } while (n != 0);

// ----------------------------------------- fatorial static long fatorial(int num) { if (num == 0) { return 1; } return(num * fatorial(num - 1)); } }

// recursividade

Programa exemplo recursivamente.

(43):

programa

calcula

soma

de

um

nmero

// ------------------------------------------- Fonte: Prog43.java package prog43; import java.util.Scanner; public class Prog43 { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; int n; long sum; do { System.out.printf("n = "); s = entrada.nextLine(); n = Integer.parseInt(s); } while (n < 0 || n > 19); if (n > 0) { sum = soma(n); System.out.printf("Soma: %d\n", sum); } } while (n != 0); } // ----------------------- soma static long soma(int n) { long s; if (n == 1) { return(1); } s = n + soma(n-1); return(s); } } do {

// recursividade

77

12.7 Lista de Exerccios (mtodos) 12.7.1 Escreva em Java o mtodo nmeroPalavras. O mtodo recebe uma String (nome) e retorna o nmero de palavras do nome (veja exemplo abaixo):
// ------------------------------------------------------ Fonte: teste.java package teste; import java.util.Scanner; public class Teste { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String nome; int n; System.out.print("Nome: "); nome = entrada.nextLine(); n = numeroPalavras(nome); System.out.printf("Seu nome tem %d palavra(s)\n", n);

// ---------------------------- numeroPalavras }

Exemplo: Nome: Paulo Roberto Gomes Luzzardi <enter> Seu nome tem 4 palavra(s) 12.7.2 Escreva em Java o mtodo verificaQuadrante. O mtodo recebe um valor para x e um valor para y e retorna o nmero do quadrante (1, 2, 3 ou 4).
// --------------------------------------------------------- Fonte: teste.java package teste; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; int x, y, n; System.out.print("x: "); s = entrada.nextLine(); x = Integer.parseInt(s); System.out.print("y: "); s = entrada.nextLine(); y = Integer.parseInt(s); n = verificaQuadrante(x, y); System.out.printf("Quadrante: %d\n", n); } } // ---------------------------- verificaQuadrante

Exemplo: x: 1 <enter> y: 2 <enter> Quadrante: 1

| 2 | 1 ________________________ | 3 | 4

78

12.7.3 Escreva o mtodo: final_da_placa. O mtodo recebe uma placa de automvel no formato: xxx9999 e retorna o ltimo dgito da placa.
// ------------------------------------------------------------ Fonte: teste.java package teste; import java.util.Scanner; public class Teste { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String placa; char fim; System.out.print("Qual a placa de seu carro [xxx9999]: "); placa = entrada.nextLine(); fim = finalPlaca(placa); System.out.printf("Final da Placa : %c\n", fim);

// ---------------------------- finalPlaca }

Exemplo: Qual a Placa de seu carro [xxx9999]: IDJ7345 <enter> Final da Placa : 5 12.7.4 Escreva o mtodo numVogais. O mtodo recebe uma String (nome) e retorna a quantidade de vogais da String.
// ------------------------------------------------------------ Fonte: teste.java package teste; import java.util.Scanner; public class Teste { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String nome; int vogais; System.out.print("Nome: "); nome = entrada.nextLine(); vogais = numVogais(nome); System.out.printf("Vogais: %d\n", vogais); } // -------------------------- numVogais }

Exemplo: Nome: Paulo <enter> Vogais: 3 12.7.5 Escreva o mtodo calculaHipotenusa. O mtodo recebe o cateto adjacente (b) e o cateto oposto (a) e retorna o valor da hipotenusa dado pela seguinte frmula: Frmula: h2 = a2 + b2

// ------------------------------------------------------------ Fonte: teste.java package teste;

79

import java.util.Scanner; public class Teste { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; float a, b, h; System.out.print("Cateto Adjacente: "); s = entrada.nextLine(); a = Float.parseFloat(s); System.out.print("Cateto Adjacente: "); s = entrada.nextLine(); b = Float.parseFloat(s); h = calculaHipotenusa(a, b); System.out.printf("Hipotenusa: %f\n", h); } // ---------------------------- calculaHipotenusa }

Exemplo: Cateto Adjacente: 3 <enter> Cateto Oposto: 3 <enter> Hipotenusa: 3 12.7.6 Escreva em Java o mtodo calculaReajuste. O mtodo recebe o valor do salrio e o ndice de reajuste e retorna o salrio atualizado.
// ------------------------------------------------------------ Fonte: teste.java package teste; import java.util.Scanner; public class Teste { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; float salario, indice, reajuste; System.out.print("Salrio (R$): "); s = entrada.nextLine(); salario = Float.parseFloat(s); System.out.print("ndice de Reajuste: "); s = entrada.nextLine(); indice = Float.parseFloat(s); reajuste = calculaReajuste(salario, indice); System.out.printf("Salrio Atualizado (R$): %.2f\n", reajuste); } // ---------------------------- calculaReajuste }

Exemplo: Salrio (R$): 1000 <enter> ndice de Reajuste: 10 <enter> Salrio Atualizado (R$): 1100

80

13. Classes (Interface ou Coleo) existentes em Java (Container)


Java possui diversas classes pr-existentes chamadas container. Um container ou coleo simplesmente um objeto que agrupa mltiplos elementos em uma nica unidade. As colees so utilizadas para armazenar, recuperar e manipular dados agregados. A seguir pode-se ver algumas classes, colees ou implementaes existentes em Java: Tabela 13: Lista de Container
Container Array DList SList HashMap OrderedMap HashSet OrderedSet PriorityQueue Queue Stack Deque Descrio Array expansvel Lista Duplamente Encadeada Lista Encadeada Simples fast associative container associative container fast set or multiset set or multiset array-based heap Fila (Interface) Pilha Fila Dupla (duas entradas e duas sadas)

Collection FrameWork (Colees) Pacote: import java.util.*; Uma coleo um objeto que representa um grupo de objetos. Um Collection Framework uma arquitetura para representar e manipular colees independente dos detalhes de sua implementao. Uma coleo composta de Interfaces e Implementaes. Interfaces

Figura 3: Arquitetura das Interfaces Implementaes Sets(Conjuntos): HashSet, LinkedHashSet, TreeSet, EnumSet Lists (Listas): Vector, Stack, LinkedSet, ArrayList

81

Queue (Filas): PriorityQueue Maps: HashTable, HashMap, LinkedHashMap, WeakHashMap, IdentityHashMap, TreeMap A seguir so descritos alguns destes elementos:

Vector (Vetor)
import java.util.Vector; A classe Vector utilizada em uma estrutura armazenada em um vetor, ou seja, uma lista de elementos. de dados

A seguir so descritos os principais mtodos da classe Vector. Sintaxe: void add(int index, Object element); Insere um elemento especificado na posio especificada no Vetor. Sintaxe: boolean add(Object o); Anexa o elemento especificado no fim do Vetor. Sintaxe: boolean addAll(Collection c); Anexa todos os elementos da coleo especificada no final do Vetor, na ordem que eles so retornados pelo iterador da coleo especificada. Sintaxe: boolean addAll(int index, Collection c); Insere todos os elementos na coleo especificada no Vetor na posio especificada. Sintaxe: void addElement(Object obj); Adiciona o componente especificado no tamanho em um. Sintaxe: int capacity(); Retorna a corrente capacidade do Vetor. Sintaxe: void clear(); Remove todos os elementos do Vetor. Sintaxe: Object clone(); Retorna um clone do Vetor. Sintaxe: boolean contains(Object elem); Testa se um objeto especfico um componente do Vetor. Sintaxe: boolean containsAll(Collection c); Retorna true se o Vetor contm todos os especfica. elementos da coleo fim do Vetor, aumentando se

Sintaxe: void copyInto(Object[] anArray); Copia os componentes do Vetor para o Array especificado. Sintaxe: Object elementAt(int index); Retorna o componente especificado pelo index. Sintaxe: Enumeration elements(); Retorna uma enumerao dos componentes do Vetor. Sintaxe: void ensureCapacity(int minCapacity);

82

Aumenta a capacidade do Vetor, se necessrio, estando certo que de poder armazenar o nmero de componentes especificados pelo argumento mincapacity. Sintaxe: boolean equals(Object o); Compara o objeto especificado com o Vetor pela igualdade. Sintaxe: Object firstElement(); Retorna o primeiro componente (o item de index 0) do Vetor. Sintaxe: Object get(int index); Retorna o elemento da posio especificada do Vetor. Sintaxe: int hashCode(); Retorna o valor do cdigo hash do Vetor. Sintaxe: int indexOf(Object elem); Procura a primeira ocorrncia de um dado argumento, testando a igualdade pelo mtodo equals. Sintaxe: int indexOf(Object elem, int index); Procura pela primeira ocorrncia de um dado argumento, comeando a busca pelo index, e testando pela igualdade usando o mtod equals. Sintaxe: void insertElementAt(Object obj, int index); Insere o objeto especificado como um componente no Vetor no index especificado. Sintaxe: boolean isEmpty(); Testa se o Vetor no tem componentes. Sintaxe: Object lastElement(); Retorna o ltimo componente do Vetor. Sintaxe: int lastIndexOf(Object elem); Retorna o index da ltima ocorrncia Vetor. do objeto especificado no

Sintaxe: int lastIndexOf(Object elem, int index); Procura para trs por um objeto especificado, comeando no index especificado e retorna um index para ele. Sintaxe: Object remove(int index); Remove o elemento da posio especificada no Vetor. Sintaxe: boolean remove(Object o); Remove a primeira ocorrncia do elemento especificado no Vetor, se o Vetor no contm o elemento, ele no alterado. Sintaxe: boolean removeAll(Collection c); Remove do Vetor todos os elementos que contm a coleo especificada. Sintaxe: void removeAllElements(); Remove todos os componentes do Vetor e seta o tamanho em zero. Sintaxe: boolean removeElement(Object obj); Remove a primeira (menor indexado) ocorrncia do argumento do Vetor. Sintaxe: void removeElementAt(int index); Deleta o componente com index especificado.

83

Sintaxe:protected void removeRange(int fromIndex, int toIndex); Remove da lista todos os elementos escolhidos entre o fromIndex (inclusive) e toIndex (exclusive). Sintaxe: boolean retainAll(Collection c); Mantm somente os elementos do Vetor especificada. que contm a coleo

Sintaxe: Object set(int index, Object element); Troca o elemento da posio especificada do especificado.

Vetor

com

elemento

Sintaxe: void setElementAt(Object obj, int index); Seta o componente com index especificado do Vetor para o objeto especificado. Sintaxe: void setSize(int newSize); Seta o tamanho do Vetor. Sintaxe: int size(); Retorna o nmero de componentes do Vetor. Sintaxe: List subList(int fromIndex, int toIndex); Retorna uma viso da poro da Lista entre fromIndex (inclusive) e toIndex (exclusive). Sintaxe: Object[] toArray(); Retorna um array contendo todos correta. os elementos no Vetor na ordem

Sintaxe: Object[] toArray(Object[] a); Retorna um array contendo todos os elementos no Vetor ordem correta; o tipo runtime do array especificado retornado. Sintaxe: String toString(); Retorna uma string do Vetor, elemento. contendo uma representao de cada

Sintaxe: void trimToSize(); Ajusta a capacidade do Vetor para a atual dimenso do Vetor. Programa Exemplo (3): Exemplo de um vetor usando a classe Vector.
// ------------------------------------------- Fonte: Prog3.java package Prog3; import java.util.Vector; import javax.swing.JOptionPane; public class Prog3 { public static void main(String[] args) { Vector vetor = new Vector(); String s, extenso = ""; int u = -1, nodo; do { u++; s = JOptionPane.showInputDialog("Nodo: "); nodo = Integer.parseInt(s); if (nodo != 0) { vetor.add(nodo); // vetor.add(u, nodo); } } while (nodo != 0); extenso = vetor.toString();

84

int n = vetor.size(); /* ------------------------------------------------- outra forma for (int i = 0; i < n;i++) extenso = extenso + vetor.get(i) + " "; ---------------------------------------------------------------*/ JOptionPane.showMessageDialog(null, "Elementos: " + n + "\nVetor: " + extenso, "Vector", JOptionPane.PLAIN_MESSAGE); } }

Programa Exemplo (3a): Exemplo de um vetor usando a classe Vector, inserindo em uma determinada posio.
// --------------------------------------------- Fonte: Prog3a.java package prog3a; import java.util.Vector; import javax.swing.*; public class Prog3a { public static void main(String[] args) { Vector vetor = new Vector(); String s, extenso = ""; int nodo, pos; do { s = JOptionPane.showInputDialog("Nodo: "); nodo = Integer.parseInt(s); if (nodo != 0) { s = JOptionPane.showInputDialog("Posicao: "); pos = Integer.parseInt(s); if (pos >= 0 && pos <= vetor.size()) { vetor.add(pos, nodo); } else { JOptionPane.showMessageDialog(null, "ERRO: Posio Invlida ", "Vector", JOptionPane.PLAIN_MESSAGE); } } exibeVector(vetor); } while (nodo != 0); int n = vetor.size(); for (int i = 0; i < n;i++) extenso = extenso + vetor.get(i) + " "; JOptionPane.showMessageDialog(null, "Elementos: " + n + "\nVetor: " + extenso, "Vector", JOptionPane.PLAIN_MESSAGE); } static void exibeVector(Vector vetor) { System.out.printf("Indice: "); for (int i = 0;i < vetor.size();i++) { System.out.printf("%2d ", i); } System.out.println(); System.out.print(" Vetor: "); for (int i = 0;i < vetor.size();i++) { System.out.printf("%2d ", vetor.get(i)); } System.out.println(); }

Programa Exemplo (3b): Exemplo de um vetor usando a classe Vector e a classe ArrayList, inserindo inteiros e caractere (uso do toArray).
// -------------------------------------------- Fonte: toArray.java package toarray; import java.util.*;

85

public class toArray { public static void main(String[] args) { ArrayList lista = new ArrayList(); lista.add(10); lista.add(30); lista.add(40); lista.add(1, 20); System.out.println("ArrayList: " + lista); Object [] objeto = lista.toArray(); System.out.print("Objetos: "); for(int i = 0;i < lista.size();i++) { System.out.print(objeto[i] + " "); } System.out.println(); Vector vetor = new Vector(); vetor.add('A'); vetor.add('C'); vetor.add('D'); vetor.add(1, 'B'); System.out.println("Vector: " + vetor); Object [] objet = vetor.toArray(); System.out.print("Objetos: "); for(int i = 0;i < vetor.size();i++) { System.out.print(objet[i] + " "); } System.out.println(); System.exit(0); } }

Stack (Pilha)
import java.util.Stack; A classe Stack utilizada para armazenar elementos em uma Pilha. A seguir so descritos os principais mtodos da classe Stack. Sintaxe: boolean empty(); Testa se a pilha est vazia. Sintaxe: Object peek(); Verifica o objeto que est no topo da pilha sem remov-lo da pilha. Sintaxe: Object pop(); Remove o objeto do topo da pilha e returna o valor do objeto. Sintaxe: Object push(Object item); Insere um item no topo da pilha. Sintaxe: int search(Object o); Retorna a posio baseado na posio de onde o objeto se encontra da pilha. Programa Exemplo (4): Exemplo de uma pilha usando a classe Stack.
// --------------------------------------------- Fonte: Prog4.java package Prog4;

86

import java.util.Stack; import javax.swing.*; public class Prog4 { public static void main(String[] args) { Stack pilha = new Stack(); String s, extenso = ""; int nodo; do { s = JOptionPane.showInputDialog("Nodo: "); nodo = Integer.parseInt(s); if (nodo != 0) { pilha.push(nodo); } } while (nodo != 0); do { extenso = extenso + pilha.pop() + " "; } while (!pilha.empty()); JOptionPane.showMessageDialog(null, "Pilha: " + extenso, "Stack", JOptionPane.PLAIN_MESSAGE); } }

Queue (Fila)
import java.util.Queue; A interface Queue utilizada para armazenar elementos em uma Fila. A seguir so descritos os principais mtodos da interface queue. Sintaxe: E element(); Recupera, mas no remove, o primeiro da fila. Sintaxe: boolean offer(E o); Insere um elemento especificado dentro desta fila, se possvel. Sintaxe: E peek(); Recupera, mas no remove, o primeiro desta fila, retornando null se esta fila est vazia. Sintaxe: E poll(); Recupera e remove o primeiro desta fila, ou null se esta fila est vazia. Sintaxe: E remove(); Recupera e remove o primeiro desta fila. Programa Exemplo (5): Exemplo de uma fila usando a classe Queue + LinkedList.
// -------------------------------------- Fonte: Prog5.java package Prog5; import java.util.LinkedList; import java.util.Queue; import javax.swing.*; public class Prog5 { public static void main(String[] args) { Queue fila = new LinkedList(); // Fila com uma Lista Encadeada Simples String s, extenso = ""; int nodo;

87

do { s = JOptionPane.showInputDialog("Nodo: "); nodo = Integer.parseInt(s); if (nodo != 0) { fila.offer(nodo); } } while (nodo != 0); do { extenso = extenso + fila.poll() + " "; } while (!fila.isEmpty()); JOptionPane.showMessageDialog(null, "Fila: " + extenso, "Queue", JOptionPane.PLAIN_MESSAGE); } }

Observao: No programa exemplo, a fila (queue) foi implementada como uma lista encadeada simples (LinkedList). Diferenas entre Classe e Interface Uma interface em Java uma classe abstrata onde todos os mtodos so abstratos (abstract) e pblicos (public), e todos os atributos so estticos (static) e constantes tipadas (final). Ela semelhante a especificao de uma classe abstrata pura, com uma diferena: os mtodos das classes abstratas podem ou no ser implementados nas classes que a estendem, j os mtodos das interfaces tem que ser obrigatoriamente implementados nas classes que as implementam. Uma interface permite estabelecer uma padronizao que deve ser obedecida pela classe que a implementa. Quando uma classe implementa uma interface, ela deve garantir que todas as funcionalidades especificadas pela interface estaro presentes na classe. A sintaxe da declarao de uma interface parecida na definio de classes, porm seu corpo define apenas as assinaturas dos mtodos e constantes contidos na interface.

Arrays (array)
import java.util.Arrays; A classe Arrays pode ser utilizada em variveis do tipo vetor. Exemplo: final int MAX = 50; int [] vetor = new int[MAX];

A seguir so descritos os principais mtodos da classe Array. Sintaxe: static int binarySearch(byte[] a, byte key); Procura em um vetor de byte especificado por um valor especfico usando algoritmo binrio de busca. Sintaxe: static int binarySearch(char[] a, char key); Procura em um vetor de char especificado por um valor especfico usando algoritmo binrio de busca. Sintaxe: static int binarySearch(double[] a, double key); Procura em um vetor de double especificado por um valor especfico usando algoritmo binrio de busca. Sintaxe: static int binarySearch(float[] a, float key);

88

Procura em um vetor de float especificado por um valor especfico usando algoritmo binrio de busca. Sintaxe: static int binarySearch(int[] a, int key); Procura em um vetor de int especificado por um valor especfico usando algoritmo binrio de busca. Sintaxe: static int binarySearch(long[] a, long key); Procura em um vetor de long especificado por um valor especfico usando algoritmo binrio de busca. Sintaxe: static int binarySearch(Object[] a, Object key); Procura em um vetor de Object especificado por um valor especfico usando algoritmo binrio de busca. Sintaxe: static int binarySearch(short[] a, short key); Procura em um vetor de short especificado por um valor especfico usando algoritmo binrio de busca. Sintaxe: static boolean deepEquals(Object[] a1, Object[] a2); Retorna true se os dois arrays especifiados so iguais. Sintaxe: static int deepHashCode(Object[] a); Retorna o cdigo hash baseado na localizao do array especificado. Sintaxe: static String deepToString(Object[] a); Retorna em forma de string a localizao do array especificado. Sintaxe: static boolean equals(boolean[] a, boolean[] a2); Retorna true se os dois arrays especificados de boolean iguais. so

Sintaxe: static boolean equals(byte[] a, byte[] a2); Retorna true se os dois arrays especificados de byte so iguais. Sintaxe: static boolean equals(char[] a, char[] a2); Retorna true se os dois arrays especificados de char so iguais. Sintaxe: static boolean equals(double[] a, double[] a2); Retorna true se os dois arrays especificados de double so iguais. Sintaxe: static boolean equals(float[] a, float[] a2); Retorna true se os dois arrays especificados de float so iguais. Sintaxe: static boolean equals(int[] a, int[] a2); Retorna true se os dois arrays especificados de int [] so iguais. Sintaxe: static boolean equals(long[] a, long[] a2); Retorna true se os dois arrays especificados de iguais. long [] so

Sintaxe: static boolean equals(Object[] a, Object[] a2); Retorna true se os dois arrays especificados de Object [] so iguais. Sintaxe: static boolean equals(short[] a, short[] a2); Retorna true se os dois arrays especificados de short so iguais. Sintaxe: static void fill(boolean[] a, boolean val); Atribui um valor booleano especificado para cada elemento da matriz de booleanos.

89

Sintaxe: static void fill(boolean[] a, int fromIndex, int toIndex, boolean val); Atribui um valor booleano especificado para cada elemento da faixa da matriz de booleanos. Sintaxe: static void fill(byte[] a, byte val); Atribui um valor byte especificado para cada elemento da matriz de bytes. Sintaxe: static void fill(byte[] a, int fromIndex, int toIndex, byte val); Atribui um valor byte especificado para cada elemento da faixa da matriz de bytes. Sintaxe: static void fill(char[] a, char val); Atribui um valor char especificado para cada elemento da matriz de caracteres. Sintaxe: static void fill(char[] a, int fromIndex, int toIndex, char val); Atribui um valor char especificado para cada elemento da faixa da matriz de caracteres. Sintaxe: static void fill(double[] a, double val); Atribui um valor double especificado para cada elemento da matriz de doubles. Sintaxe: static void fill(double[] a, int fromIndex, int toIndex, double val); Atribui um valor double especificado para cada elemento da faixa da matriz de doubles. Sintaxe: static void fill(float[] a, float val); Atribui um valor float especificado para cada elemento da matriz de floats. Sintaxe: static void fill(float[] a, int fromIndex, int toIndex, float val); Atribui um valor float especificado para cada elemento da faixa da matriz de floats. Sintaxe: static void fill(int[] a, int val); Atribui um valor int especificado para cada elemento da matriz de ints. Sintaxe: static void fill(int[] a, int fromIndex, int toIndex, int val); Atribui um valor int [] especificado para cada elemento da faixa da matriz de inteiros. Sintaxe: static void fill(long[] a, int fromIndex, int toIndex, long val); Atribui um valor long [] especificado para cada elemento da faixa da matriz de inteiros longos. Sintaxe: static void fill(long[] a, long val); Atribui um valor long [] especificado para cada elemento da matriz de longs.

90

Sintaxe: static void fill(Object[] a, int fromIndex, int toIndex, Object val); Atribui um valor Object [] especificado para cada elemento da faixa da matriz de objetos. Sintaxe: static void fill(Object[] a, Object val); Atribui um valor Object especificado para cada elemento da matriz de Objects. Sintaxe: static void fill(short[] a, int fromIndex, int toIndex, short val); Atribui um valor short [] especificado para cada elemento da faixa da matriz de inteiros curtos. Sintaxe: static void fill(short[] a, short val); Atribui um valor short [] especificado para cada elemento da matriz de inteiros curtos. Sintaxe: static int hashCode(boolean[] a); Retorna o cdigo hash com base no contedo da array especificada. Sintaxe: static int hashCode(byte[] a); Retorna o cdigo hash com base no contedo da array especificada. Sintaxe: static int hashCode(char[] a); Retorna o cdigo hash com base no contedo da array especificada. Sintaxe: static int hashCode(double[] a); Retorna o cdigo hash com base no contedo da array especificada. Sintaxe: static int hashCode(float[] a); Retorna o cdigo hash com base no contedo da array especificada. Sintaxe: static int hashCode(int[] a); Retorna o cdigo hash com base no contedo da array especificada. Sintaxe: static int hashCode(long[] a); Retorna o cdigo hash com base no contedo da array especificada. Sintaxe: static int hashCode(Object[] a); Retorna o cdigo hash com base no contedo da array especificada. Sintaxe: static int hashCode(short[] a); Retorna o cdigo hash com base no contedo da array especificada. Sintaxe: static void sort(byte[] a); Ordena o array especificado de byte em ordem ascende numrica. Sintaxe: static void sort(byte[] a, int fromIndex, int toIndex); Ordena a faixa do array especificado de byte em ordem ascende numrica. Sintaxe: static void sort(char[] a); Ordena o array especificado de char em ordem ascende numrica. Sintaxe: static void sort(char[] a, int fromIndex, int toIndex); Ordena a faixa do array especificado de char em ordem ascende numrica. Sintaxe: static void sort(double[] a); Ordena o array especificado de double em ordem ascende numrica.

91

Sintaxe: static void sort(double[] a, int fromIndex, int toIndex); Ordena a faixa do array especificado de double em ordem ascende numrica. Sintaxe: static void sort(float[] a); Ordena o array especificado de float em ordem ascende numrica. Sintaxe: static void sort(float[] a, int fromIndex, int toIndex); Ordena a faixa do array especificado de float em ordem ascende numrica. Sintaxe: static void sort(int[] a); Ordena o array especificado de int em ordem ascende numrica. Sintaxe: static void sort(int[] a, int fromIndex, int toIndex); Ordena a faixa do array especificado de int em ordem ascende numrica. Sintaxe: static void sort(long[] a); Ordena o array especificado de long em ordem ascende numrica. Sintaxe: static void sort(long[] a, int fromIndex, int toIndex); Ordena a faixa do array especificado de long em ordem ascende numrica. Sintaxe: static void sort(Object[] a); Ordena o array especificado de Object em ordem ascende numrica, de acordo com a ordem natutal dos elementos. Sintaxe: static void sort(Object[] a, int fromIndex, int toIndex); Ordena a faixa do array especificado de Object em ordem ascende numrica. Sintaxe: static void sort(short[] a); Ordena o array especificado de short em ordem ascende numrica. Sintaxe: static void sort(short[] a, int fromIndex, int toIndex); Ordena a faixa do array especificado de short em ordem ascende numrica. Sintaxe: static String toString(boolean[] a) Retorna uma string o contedo do array de boolean especificado. Sintaxe: static String toString(byte[] a); Retorna uma string o contedo do array de byte especificado. Sintaxe: static String toString(char[] a); Retorna uma string o contedo do array de char especificado. Sintaxe: static String toString(double[] a); Retorna uma string o contedo do array de double especificado. Sintaxe: static String toString(float[] a); Retorna uma string o contedo do array de float especificado. Sintaxe: static String toString(int[] a); Retorna uma string o contedo do array de int [] especificado. Sintaxe: static String toString(long[] a); Retorna uma string o contedo do array de long [] especificado.

92

Sintaxe: static String toString(Object[] a); Retorna uma string o contedo do array de Object [] especificado. Sintaxe: static String toString(short[] a); Retorna uma string o contedo do array de short [] especificado. Programa Exemplo (6): Exemplo de programa que usa a classe Arrays para ordenar (sort) um vetor.
// --------------------------------------------- Fonte: Prog6.java package Prog6; import java.util.Arrays; import javax.swing.JOptionPane; public class Prog6 { public static void main(String[] args) { final int MAX = 5; int [] vetor = new int[MAX]; int u = -1, n = 0, x; String s; do { u++; // ultimo elemento n++; // numero de elementos s = JOptionPane.showInputDialog("Valor: "); x = Integer.parseInt(s); if (x != 0) { vetor[u] = x; } else { u--; } } while (x != 0 && n < MAX); Arrays.sort(vetor); String extenso = Arrays.toString(vetor); /* for (int i = 0;i < vetor.length;i++) { if (vetor[i] != 0) { extenso += vetor[i] + " "; } } JOptionPane.showMessageDialog(null, "Array: " + extenso, "Array", JOptionPane.PLAIN_MESSAGE); } }

*/

ArrayList (lista de arrays)


A classe Vector. ArrayList possui os mesmos mtodos da classe

Programa Exemplo (7): Programa mostra um exemplo de dois arrays que armazenam respectivamente: nomes e idades.
// ------------------------------------------- Fonte: Prog7.java package Prog7; import java.util.ArrayList; public class Prog7 {

93

public static void main(String[] args) { ArrayList <String> nome = new ArrayList <String> (); nome.add("Paulo Roberto"); nome.add("Renato Luis"); nome.add("Francisco Carlos"); nome.add("Ana Maria"); nome.add("Julia Helena"); ArrayList idade = new ArrayList (); idade.add(48); idade.add(46); idade.add(50); idade.add(53); idade.add(52); int n = nome.size(); for (int i = 0;i < n;i++) { System.out.printf("Nome: %-20s Idade: %d\n", nome.get(i), idade.get(i)); System.exit(0); } } }

94

14. Entrada e sada em disco (Arquivos)


Em Java possvel manipular arquivos atravs da classe File (Arquivo). 14.1 Mtodos para manipular arquivos em Java A seguir so arquivos em Java: descritos os principais mtodos para manipular

Sintaxe: boolean canRead(); Testa se o aplicativo pode ler o arquivo indicado pelo pathname (caminho) indicado. Sintaxe: boolean canWrite(); Testa se o aplicativo pode modificar para o arquivo indicado pelo pathname (caminho) indicado. Sintaxe: int compareTo(File pathname); Compara dois pathnames lexicograficamente. Sintaxe: int compareTo(Object o); Compara o pathname com outro objeto. Sintaxe: boolean createNewFile(); Cria um novo arquivo vazio com o nome do pathname, se e somente se um arquivo com este nome ainda no existe. Sintaxe: static File createTempFile(String prefix, String suffix); Cria um arquivo vazio no diretrio de arquivos temporrios, usando o prefixo e o sufixo dado para gerar o seu nome. Sintaxe: static File createTempFile(String prefix, String suffix, File directory); Cria um novo arquivo vazio no diretrio especificado, usando o prefixo e o sufixo dado pela String para gerar o seu nome. Sintaxe: boolean delete(); Deleta o arquivo ou diretrio informado no pathname. Sintaxe: void deleteOnExit(); Solicita que o arquivo ou diretrio indicado por este pathname ser excludo quando a mquina virtual termina. Sintaxe: boolean equals(Object obj); Testa se o pathname igual ao objeto indicado. Sintaxe: boolean exists(); Testa se o arquivo ou diretrio indicado para este pathname existe. Sintaxe: File getAbsoluteFile(); Retorna a forma absoluta do pathname. Sintaxe: String getAbsolutePath(); Retorna uma String absoluta do pathname. Sintaxe: File getCanonicalFile(); Retorna a forma cannica do pathname. Sintaxe: String getCanonicalPath(); 95

Retorna uma String cannica do pathname. Sintaxe: String getName(); Retorna o nome do arquivo ou diretrio indicado pelo pathname. Sintaxe: String getParent(); Retorna uma String do caminho pai, esse caminho abstrato, ou nulo se este caminho no nome de um diretrio pai. Sintaxe: File getParentFile(); Retorna o caminho abstrato pai deste caminho, ou nulo se este caminho no nome de um diretrio pai. Sintaxe: String getPath(); Converte este pathname em uma String do pathname. Sintaxe: int hashCode(); Calcula o cdigo hash para este pathname. Sintaxe: boolean isAbsolute(); Testa se este pathname absoluto Sintaxe: boolean isDirectory(); Testa se o arquivo indicado diretrio. por este caminho (pathname) um

Sintaxe: boolean isFile(); Testa se o arquivo indicado por este caminho (pathname) um arquivo (file). Sintaxe: boolean isHidden(); Testa se o arquivo indicado por este caminho (pathname) um arquivo escondido. Sintaxe: long lastModified(); Retorna o tempo em que o arquivo modificado pela ltima vez. indicado por este caminho foi

Sintaxe: long length(); Retorna o comprimento do arquivo indicado pelo pathname. Sintaxe: String[] list(); Retorna um vetor de Strings com os nomes dos arquivos e diretrios no diretrio indicado por este caminho. Sintaxe: String[] list(FilenameFilter filter); Retorna um vetor de Strings com os nomes de arquivos e diretrios no diretrio indicado por este caminho que satisfaam o filtro especificado. Sintaxe: File[] listFiles(); Retorna um vetor de pathnames indicando os arquivos no diretrio indicado por este caminho. Sintaxe: File[] listFiles(FileFilter filter); Retorna um vetor de pathnames indicando os arquivos e diretrios no diretrio indicado por este caminho que satisfaam o filtro especificado. Sintaxe: File[] listFiles(FilenameFilter filter);

96

Retorna um vetor de pathnames indicando os arquivos e diretrios no diretrio indicado por este caminho que satisfaam o filtro especificado. Sintaxe: static File[] listRoots(); Lista o sistema de arquivos disponveis principais(root). Sintaxe: boolean mkdir(); Cria o diretrio chamado por este caminho. Sintaxe: boolean mkdirs(); Cria o diretrio chamado por este pathname, incluindo os diretrios pai necessrios, mas inexistentes. Sintaxe: boolean renameTo(File dest); Renomeia o arquivo indicado pelo pathname. Sintaxe: boolean setLastModified(long time); Define o tempo da ltima modificao do arquivo ou diretrio chamado por este caminho. Sintaxe: boolean setReadOnly(); Marca o arquivo ou diretrio chamado por este caminho que s so permitidas operaes de leitura. Sintaxe: String toString(); Retorna uma String pathname deste caminho. Sintaxe: URI toURI(); Constri um arquivo: URI que representa esse caminho. Sintaxe: URL toURL(); Converte este caminho em um arquivo: URL. 14.2 Abertura de um arquivo texto A seguir sero vistos alguns programas exemplos mostrando a manipulao de arquivos em Java. Programa exemplo (44): O programa abre um arquivo texto e exibe o nmero de bytes do referido arquivo.
// ----------------------------------------- Fonte: prog44.java package prog44; import java.io.File; public class Prog44 { public static void main(String[] args) { String nomeArquivo = "/Users/luzzardi/teste.txt"; File arqTexto = new File(nomeArquivo); long bytes; if (arqTexto.exists()) { bytes = arqTexto.length(); System.out.println("Arquivo: " + nomeArquivo); System.out.println("Bytes: " + bytes); } System.exit(0); } }

97

14.3 Listar um diretrio Programa exemplo (45): O programa exibe na tela (lista) os arquivos e diretrios do pathname especificado.
// ------------------------------------------- Fonte: Prog45.java package prog45; import java.io.File; public class Prog45 { public static void main(String[] args) { File diretorio = new File("//Users//luzzardi"); String [] arquivos = diretorio.list(); for (int i = 0;i < arquivos.length; i++) { File filho = new File(diretorio, arquivos[i]); System.out.println(filho.getAbsolutePath()); } System.exit(0); } }

Programa exemplo (46): O programa exibe na tela (lista) os arquivos e diretrios do pathname especificado pelo usurio.
// -------------------------------------------- Fonte: Prog46.java package prog46; import java.io.File; import java.util.Scanner; public class Prog46 { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); System.out.print("Pathname: "); String nomeDiretorio = entrada.nextLine(); File diretorio = new File(nomeDiretorio); String [] arquivos = diretorio.list(); for (int i =0;i<arquivos.length; i++) { File filho = new File(diretorio, arquivos[i]); System.out.println(filho.getAbsolutePath()); } System.exit(0);

} }

14.4 Manipulao de um arquivo de palavras A seguir so mostrados alguns programas exemplos que manipulam um arquivo contendo palavras. Veja o formato no exemplo abaixo: 5 <enter> carambola beringela abacate ervilha damasco Programa exemplo (47): O programa permite criar um arquivo de palavras (palavras.dat) permitindo a gravao destas palavras.
// --------------------------------------------- Fonte: Prog47.java package prog47;

98

import java.io.File; import java.io.FileWriter; import java.util.Scanner; public class Prog47 { public static void main(String[] args) throws Exception { Scanner entrada = new Scanner(System.in); String diretorio = "/Users/luzzardi"; File arquivo = new File(diretorio, "palavras.dat"); if (!arquivo.exists()) { FileWriter file = new FileWriter(arquivo); System.out.print("Nmero de Palavras: "); String s = entrada.nextLine(); int numPalavras = Integer.parseInt(s); file.write((byte)numPalavras); file.write('\n'); for (int i = 1;i <= numPalavras;i++) { System.out.print("Palavra: "); byte a = (byte) System.in.read(); while(a != '\n') { file.write(a); a = (byte) System.in.read(); } file.write('\n'); } file.close(); } else { System.out.println("ERRO: Arquivo j existe"); } System.exit(0); } }

Exemplo de gravao no arquivo palavras.dat: Numero de palavras: 5 <enter> Palavra: carambola <enter> Palavra: beringela <enter> Palavra: abacate <enter> Palavra: ervilha <enter> Palavra: damasco <enter> Arquivo gerado: 5 carambola beringela abacate ervilha damasco Programa exemplo (48): O programa permite abrir o arquivo de palavras (palavras.dat) e exibe-os na tela.
// ------------------------------------------ Fonte: Prog48.java package prog48; import java.io.File; import java.io.FileReader; public class Prog48 { public static void main(String[] args) throws Exception { String diretorio = "/Users/luzzardi"; File arquivo = new File(diretorio, "palavras.dat"); byte a;

99

} }

if (arquivo.exists()) { FileReader file = new FileReader(arquivo); int numPalavras = file.read(); file.read(); for (int i = 1;i <= numPalavras;i++) { System.out.print("Palavra: "); a = (byte) file.read(); while(a != '\n') { System.out.printf("%c", a); a = (byte) file.read(); } System.out.println(); } file.close(); } else { System.out.println("ERRO: Arquivo no existe"); } System.exit(0);

Programa exemplo (49): O programa permite consultar o arquivo de palavras (palavras.dat). Para tanto solicitado, ao usurio, o nmero do registro para ser calculado a posio deste registro no arquivo. Logo aps o registro exibido na tela.
// ----------------------------------------- Fonte: Prog49.java package prog49; import java.io.*; import java.util.*; public class Prog49 { public static void main(String[] args) throws Exception { Scanner entrada = new Scanner(System.in); String s; String diretorio = "/Users/luzzardi"; File arquivo = new File(diretorio, "palavras.dat"); FileInputStream in = new FileInputStream(arquivo); InputStreamReader conversor = new InputStreamReader(in); BufferedReader buffer = new BufferedReader(conversor); FileReader file = new FileReader(arquivo); if (arquivo.exists()) { System.out.println("Arquivo: " + arquivo); int numPalavras = file.read(); // descarta a primeira linha String temp = buffer.readLine(); System.out.println("Total de Palavras: " + numPalavras); String [] linha = new String[numPalavras + 1]; for (int i = 0;i < numPalavras;i++) { linha[i] = buffer.readLine(); } buffer.close(); in.close(); file.close(); int pos; do { System.out.print("Posio [1.." + numPalavras + "] ou [0] Sair: "); s = entrada.nextLine(); pos = Integer.parseInt(s); if (pos >= 1 && pos <= numPalavras) { System.out.println("Palavra: " + linha[pos - 1]); } else { if (pos != 0) { System.out.println("ERRO: Posio Invlida"); } }

100

} while (pos != 0); } else { System.out.println("ERRO: Arquivo no existe"); } System.exit(0); } }

14.5 Arquivo Texto A seguir contendo: mostrado um programa que l um arquivo texto

a) Total de Palavras b) Lista de Palavras (nome de frutas) Arquito Texto: Frutas.txt


15 abacaxi abacate banana pitanga goiaba morango carambola kiwi laranja bergamota tomate uva caqui lima jaca // ---------------------------------------------- Fonte: Leitura.java package leitura; import java.io.*; public class Leitura { public static void main(String[] args) { int linhas = 0; int max = 0; String palavras [], linha; String nomeArquivo = "/Users/luzzardi/Frutas.txt"; try { FileReader arqTexto = new FileReader(nomeArquivo); BufferedReader leitor = new BufferedReader(arqTexto); max = Integer.parseInt(leitor.readLine()); palavras = new String[max]; System.out.println("Total de palavras: " + max); int i = 0; while ((linha = leitor.readLine()) != null) { palavras[i] = linha; System.out.println("Palavra: " + palavras[i]); linhas++; i++; } int n = (int) (Math.random() * max); System.out.println("Palavra Sorteada: " + palavras[n]); } catch(IOException e){ System.out.println("Erro: Problema com o Arquivo "); } } }

101

Resultado do Programa: Total de palavras: 15 Palavra: abacaxi Palavra: abacate Palavra: banana Palavra: pitanga Palavra: goiaba Palavra: morango Palavra: carambola Palavra: kiwi Palavra: laranja Palavra: bergamota Palavra: tomate Palavra: uva Palavra: caqui Palavra: lima Palavra: jaca Palavra Sorteada: carambola

A seguir mostrado um outro programa que l um arquivo texto exibindo: a) Nmero de Linhas b) Nmero de Bytes
// --------------------------------------------------- Fonte: Bytes.java package bytes; import java.io.*; import java.util.Scanner; public class Bytes { public static void main(String[] args) { int linhas = 0; long bytes = 0; String buffer; Scanner input = new Scanner(System.in); String nomeArquivo; System.out.print("Nome do Arquivo: "); nomeArquivo = input.nextLine(); try { FileReader arqTexto = new FileReader(nomeArquivo); BufferedReader leitor = new BufferedReader(arqTexto); int i = 0; while ((buffer = leitor.readLine()) != null) { bytes = bytes + buffer.length(); linhas++; i++; } System.out.println(linhas + " Linha(s)"); System.out.println(bytes + " Byte(s)"); } catch(IOException e){ System.out.println("Erro: Problema com o Arquivo"); }

} }

Resultado do Programa: Nome do Arquivo: /Users/luzzardi/NetBeansProjects/Bytes/src/bytes/bytes.java 37 Linha(s) 987 Byte(s)

A seguir mostrado um outro programa que l um arquivo texto exibindo: a) Todas as linhas do arquivo texto com seu respectivo nmero

102

b) Nmero de Linhas c) Nmero de Bytes


// --------------------------------------------------- Fonte: Listar.java package listar; import java.io.*; import java.util.Scanner; public class Listar { public static void main(String[] args) { int linhas = 0; long bytes = 0; String buffer; Scanner input = new Scanner(System.in); String nomeArquivo; System.out.print("Nome do Arquivo: "); nomeArquivo = input.nextLine(); try { FileReader arqTexto = new FileReader(nomeArquivo); BufferedReader leitor = new BufferedReader(arqTexto); int i = 0; while ((buffer = leitor.readLine()) != null) { bytes = bytes + buffer.length(); linhas++; System.out.printf("%2d: %s\n", linhas, buffer); i++; } System.out.println(linhas + " Linha(s)"); System.out.println(bytes + " Byte(s)"); } catch(IOException e){ System.out.println("Erro: Problema com o Arquivo"); }

} }

Resultado do Programa: Nome do Arquivo: /Users/luzzardi/Frutas.txt 1: 15 2: abacaxi 3: abacate 4: banana 5: pitanga 6: goiaba 7: morango 8: carambola 9: kiwi 10: laranja 11: bergamota 12: tomate 13: uva 14: caqui 15: lima 16: jaca 16 Linha(s) 93 Byte(s)

A seguir mostrado um outro programa que l um arquivo texto e o nmero de uma linha e exibe: (a) A linha especificada
// ------------------------------------------------------------ Fonte: Linha.java package linha; import java.io.*; import java.util.Scanner; public class Linha {

103

public static void main(String[] args) { int linha = 0, numLinha; String s, buffer; Scanner input = new Scanner(System.in); String nomeArquivo; boolean listou = false; System.out.print("Nome do Arquivo: "); nomeArquivo = input.nextLine(); try { FileReader arqTexto = new FileReader(nomeArquivo); BufferedReader leitor = new BufferedReader(arqTexto); System.out.print("Nmero da Linha: "); s = input.nextLine(); numLinha = Integer.parseInt(s); int i = 0; while ((buffer = leitor.readLine()) != null) { linha++; if (linha == numLinha) { System.out.printf("%2d: %s\n", linha, buffer); listou = true; } i++; } } catch(IOException e){ System.out.println("Erro: Problema com o Arquivo"); } if (!listou) { System.out.println("ERRO: Linha no Encontrada"); } System.exit(0); } }

Resultado do Programa:
Nome do Arquivo: /Users/luzzardi/Frutas.txt Nmero da Linha: 5 5: pitanga

14.6 Lista de exerccios (arquivos) 14.6.1 Escreva um programa em Java que recebe via teclado o nome de um arquivo texto. O programa deve imprimir na tela o nmero de bytes (caracteres) e o nmero de linhas do arquivo ou ERRO: Arquivo no existe. Exemplo: Nome do arquivo texto: LISTA.JAVA <enter> (12345) Bytes (44) Linhas ou ERRO: Arquivo no existe 14.6.2 Escreva um programa em Java que recebe via teclado o nome de um arquivo texto. O programa deve permitir ao usurio consultar o arquivo atravs da entrada via teclado do nmero da linha. O programa deve imprimir a linha especificada ou ERRO: Linha no existe. Exemplo: Nome do arquivo texto: LISTA.JAVA <enter> Nmero de linha: 7 <enter> 7: int i, j, k; Nmero de linha: 70 <enter>

104

ERRO: Linha no existe Nmero de linha: 0 <enter> ou ERRO: Arquivo no existe 14.6.3 Escreva um programa em Java que recebe via teclado o nome de dois arquivos texto (origem e destino). O programa deve copiar o contedo do arquivo origem para o arquivo destino. Exemplo: Arquivo origem: LISTA.JAVA <enter> Arquivo destino: LISTA.tmp <enter> (20345) Bytes copiados 14.6.4 Escreva um programa em Java que recebe via teclado o nome do arquivo texto fonte e o nome do arquivo texto destino. O programa deve converter o arquivo para maisculo ou minsculo (conforme escolha do usurio) gerando o arquivo texto destino. Exemplo: Arquivo fonte: LISTA.JAVA <enter> Arquivo destino: LISTA.TMP <enter> [+] Maisculo ou [-] Minsculo: + <enter> (1234) Bytes convertidos 14.6.5 Escreva um programa em Java que recebe via teclado o nome de um arquivo texto e uma palavra. O programa deve imprimir todas as linhas que possuem esta palavra. Exemplo: Nome do arquivo texto: PALAVRA.JAVA <enter> Palavra: if <enter> 23: if (a == b) { 33: if (ch == '\n') { 37: if (compara(linha,palavra)) { 41: if (ch != '\n') { 59: if (linha[i] == palavra[0]) { 65: if (linha[k] != palavra[j]) { 69: if (achei) { 14.6.6 Escreva um programa em Java que recebe via teclado o nome de um arquivo texto. O programa deve permitir ao usurio consultar o arquivo atravs da entrada via teclado do nmero inicial e nmero final. O programa deve imprimir desde a linha inicial at a linha final ou ERRO: Linhas no existem. Exemplo: Nome do arquivo Nmero inicial: Nmero final: 9 7: int i, j, k; 8: char tecla; 9: long bytes = ou texto: LISTA.JAVA <enter> 7 <enter> <enter> 0;

105

Nmero inicial: 70 <enter> Nmero final: 90 <enter> ERRO: Linhas no existem 14.6.7 Escreva um programa em Java (grava.java) que recebe via teclado o nome de um arquivo binrio. O programa deve permitir ao usurio inserir nomes (mximo 30 caracteres) neste arquivo via teclado. O programa termina quando o usurio digitar <enter> na entrada do nome. Exemplo: Nome do arquivo binrio: NOMES.DAT <enter> Nome: Beatriz <enter> Nome: Eva <enter> Nome: Debora <enter> Nome: Carla <enter> Nome: Fatima <enter> Nome: Ana <enter> Nome: <enter> 14.6.8 Escreva um programa em Java (ler.java) que recebe via teclado o nome de um arquivo binrio. O programa deve ler e imprimir na tela todos os nomes armazenados no arquivo pelo programa "grava.java". Exemplo: Nome do arquivo binrio: NOMES.DAT <enter> Nome: Beatriz Nome: Eva Nome: Debora Nome: Carla Nome: Fatima Nome: Ana 14.6.9 Escreva um programa em Java (sort.java) que recebe via teclado o nome de um arquivo binrio. O programa deve ler, ordenar e gravar novamente os nomes no mesmo arquivo. Exemplo: Nome do arquivo binrio: NOMES.DAT <enter> Ok, arquivo ordenado Observao: Utilize o programa anterior (ler.java) para ver os nomes ordenados. 14.6.10 Escreva um programa em Java (salva.java) que recebe via teclado o nome de um arquivo binrio. O programa deve permitir ao usurio inserir nome (mximo 30 caracteres), idade e sexo ([M]asculino ou [F]eminino) neste arquivo via teclado. O programa termina quando o usurio digitar <enter> na entrada do nome. Exemplo: Nome do arquivo binrio: DADOS.DAT <enter> Nome: Paulo Roberto <enter> Idade: 41 <enter> Sexo [M/F]: m <enter> Nome: Renato Luis <enter> Idade: 38 <enter>

106

Sexo [M/F]: m <enter> Nome: Ana Maria <enter> Idade: 44 <enter> Sexo [M/F]: f <enter> Nome: <enter> 14.6.11 Escreva um programa em Java (list.java) que recebe via teclado o nome de um arquivo binrio. O programa deve ler e imprimir na tela todos os dados (nome, idade e sexo) armazenados no arquivo pelo programa "salva.java" (veja exemplo abaixo). Exemplo: Nome do arquivo binrio: DADOS.DAT <enter> Nome: Paulo Roberto Idade: 41 Sexo: MASCULINO Nome: Renato Luis Idade: 38 Sexo: MASCULINO Nome: Ana Maria Idade: 44 Sexo: FEMININO 14.6.12 Escreva um programa em Java (conta.java) que recebe via teclado o nome de um arquivo binrio. O programa deve verificar a quantidade de homens e a quantidade de mulheres no aquivo criado pelo programa "salva.java". Exemplo: Nome do arquivo binrio: DADOS.DAT <enter> (2) Homens (1) Mulheres

107

15. Conceitos diversos em Java


15.1 Operadores bit a bit
Se referem ao teste, ajuste ou troca de bits reais por um byte ou palavra (podem ser dos tipos char, int, byte, short ou long). Tabela 14: Operadores bit a bit
Operador & | ^ ~ >> << Ao And Or Or exclusivo (XOr) Complemento de um (Not) Deslocar para a direita (shift) Deslocar para a esquerda (shift)

Deslocamento (shift): varivel >> nmero de deslocamentos; Exemplo:


// ---------------------------------------------- Fonte: bit.java package bit; public class Bit { public static void main(String[] args) { int a = 128, b, c; // a = 128 binrio -> 10000000 b = a >> 1; // b = 64 binrio -> 0100000 c = b << 1; // c = 128 binrio -> 1000000 System.out.printf("a = %d\n",a); System.out.printf("b = %d\n",b); System.out.printf("c = %d\n",c); System.exit(0); } }

15.2 Formas abreviadas de Java


Java tem abreviaes especiais que simplificam a codificao de um certo tipo de comando de atribuio. Exemplo: x = x + 10; ... pode ser escrito como ... funcionar com x += 10; todos os operadores

Esta forma abreviada aritmticos de Java. Forma normal: Forma abreviada:

varivel = varivel operador constante; x = x + 7; varivel operador= constante; x += 7;

108

16. Listas Lineares: Pilha, Fila e Fila Circular


A seguir visto a implementao de uma Pilha, uma Fila e uma Fila Circular implementada em um vetor de inteiros. Pilha: Estrutura linear organizada de forma que a entrada e a sada dos dados feita na mesma extremidade. Forma de acesso: LIFO (Last Input First Output), ou seja, o ltimo elemento a entrar na pilha o primeiro a sair dela. Fila: Estrutura linear organizada em forma que a entrada dos dados feita por uma extremidade da lista linear e, a sada, feita na outra extremidade. Forma de acesso: FIFO (First Input First Output), ou seja, o primeiro elemento a entrar na fila o primeiro a sair da fila. E - Entrada de Dados S - Sada de Dados

Figura 4: Representao de uma fila e uma pilha Funcionamento desta pilha:


Entrada: 1, 2 e 3 Sada: 3, 2 e 1

Funcionamento desta fila:


Entrada: 1, 2 e 3 Sada: 1, 2 e 3

16.1 Implementao de um lista em vetor A seguir visto um programa em Java que simula uma lista linear armazenada em um vetor. Note que o nmero de elementos da lista armazenado no primeiro nodo do vetor, ou seja, v[0]. Programa exemplo (50): O programa permite inserir nmeros inteiros em uma Lista Linear implementada em um vetor. Quando o nmero digitado for igual zero (0), todos os nmeros da lista so listados.
// ----------------------------------------------- Fonte: Prog50.java package prog50; import javax.swing.*;

109

public class Prog51 { final static int SUCESSO = 0; final static int LISTA_CHEIA = 1; final static int LISTA_VAZIA = 2; public static void main(String[] args) { final int m = 7; int [] v = new int [m]; String s; int valor; char ch; int erro = 0; criaLista(v); do { s = JOptionPane.showInputDialog("Elemento: "); valor = Integer.parseInt(s); if (valor != 0) erro = incluiFim(m, v, valor); if (erro == LISTA_CHEIA) { JOptionPane.showMessageDialog(null, "Erro: Lista Cheia", "Ateno", JOptionPane.PLAIN_MESSAGE); exibeLista(v); return; } } while (valor != 0); exibeLista(v); } // -------------------------------------------------- criaLista static void criaLista(int [] v) { v[0] = 0; // armazena o nmero de elementos da lista } // -------------------------------------------------- incluiFim static int incluiFim(int m, int [] v, int valor) { String s; int n = v[0]; if (n < m-1) { v[0]++; v[v[0]] = valor; return(SUCESSO); } else return(LISTA_CHEIA); } // -------------------------------------------------- exibeLista static void exibeLista(int [] v) { String s = ""; int n = v[0]; if (n == 0) JOptionPane.showMessageDialog(null, "Erro: Lista Vazia", "Ateno", JOptionPane.PLAIN_MESSAGE); else { for (int i = 1; i <= n; i++) s = s + v[i] + " "; JOptionPane.showMessageDialog(null, "Lista: " + s, "Lista", JOptionPane.PLAIN_MESSAGE); } } }

Programa exemplo (51): O programa permite inserir ([I]ncio, [P]osio ou [F]im) nmeros inteiros em uma Lista Linear implementada em um

110

vetor. Quando o nmero digitado for igual zero (0), todos os nmeros da lista so exibidos na tela.
// --------------------------------------------------------- Fonte: Prog51.java package prog51; import javax.swing.*; public class Prog51 { final static int SUCESSO = 0; final static int LISTA_CHEIA = 1; final static int LISTA_VAZIA = 2; public static void main(String[] args) { final int m = 7; int [] v = new int [m]; String s; int valor, pos, n; char ch, op; int erro = 0; criaLista(v); do { s = JOptionPane.showInputDialog("Elemento: "); valor = Integer.parseInt(s); if (valor != 0) { s = JOptionPane.showInputDialog( "[I]inicio, [P]osio ou [F]im: "); op = s.charAt(0); switch (op) { case 'I': case 'i': erro = incluiInic(m, v, valor); break; case 'P': case 'p': n = tamanhoLista(v); do { s = JOptionPane.showInputDialog( "Posio [1.." + n + "]: "); pos = Integer.parseInt(s); } while (pos < 1 && pos > n); erro = incluiPos(m, v, valor, pos); break; case 'F': case 'f': erro = incluiFim(m, v, valor); break; } if (erro == LISTA_CHEIA) { JOptionPane.showMessageDialog(null, "Erro: Lista Cheia", "Ateno", JOptionPane.PLAIN_MESSAGE); exibeLista(v); return; } } } while (valor != 0); exibeLista(v); } // -------------------------------------------------- criaLista static void criaLista(int [] v) { v[0] = 0; // armazena o nmero de elementos } // -------------------------------------------------- incluiFim static int incluiFim(int m, int [] v, int valor) { String s; int n = v[0]; if (n < m - 1) {

111

} else }

v[0]++; v[v[0]] = valor; return(SUCESSO); return(LISTA_CHEIA);

// -------------------------------------------------- incluiInic static int incluiInic(int m, int [] v, int valor) { String s; int n = v[0]; if (n < m - 1) { v[0]++; for (int i = n + 1;i >= 2;i--) v[i] = v[i-1]; v[1] = valor; return(SUCESSO); } else return(LISTA_CHEIA);

// -------------------------------------------------- incluiPos static int incluiPos(int m, int [] v, int valor, int pos) { String s; int n = v[0]; if (n < m - 1) { v[0]++; if (pos == v[0] - 1) { v[v[0]] = v[n]; v[n] = valor; } else { for (int i = n + 1;i >= pos;i--) { v[i] = v[i-1]; System.out.println("Valor: " + v[i]); } v[pos] = valor; } return(SUCESSO); } else return(LISTA_CHEIA); } // -------------------------------------------------- tamanhoLista static int tamanhoLista(int [] v) { return(v[0]); } // -------------------------------------------------- exibeLista static void exibeLista(int [] v) { String s = ""; int n = v[0]; if (n == 0) JOptionPane.showMessageDialog(null, "Erro: Lista Vazia", "Ateno", JOptionPane.PLAIN_MESSAGE); else { for (int i = 1; i <= n; i++) s = s + v[i] + " "; JOptionPane.showMessageDialog(null, "Lista: " + s, "Lista", JOptionPane.PLAIN_MESSAGE); }

112

} }

16.2 Implementao de uma Pilha A seguir mostrado uma implementao de Pilha usando a classe Pilha. Programa exemplo (52): O programa permite inserir nmeros inteiros em uma Pilha usando uma classe Pilha implementada pelo programador. Quando o nmero digitado for igual zero (0), todos os nmeros da pilha so listados.
// -------------------------------------------------------- Fonte: Prog52.java package prog52; import java.util.Scanner; public class Prog52 { public static void main(String[] args) { Pilha pilha = new Pilha(5); Scanner entrada = new Scanner(System.in); String s; int nodo; do { System.out.print("Elemento: "); s = entrada.nextLine(); nodo = Integer.parseInt(s); if (nodo != 0) pilha.push(nodo); } while (nodo != 0); pilha.exibe(); } } // ---------------------------------------------------------- Fonte: Pilha.java package prog52; public class Pilha { private int topo; private int [] dados; // ----------------------------------------------- construtor public Pilha(int numElementos) { dados = new int[numElementos]; topo = -1; } // construtor

// ------------------------------------------------ push public void push(int i) { int n = dados.length; if (topo < n-1) { topo++; dados[topo] = i; } else System.out.println("Erro: Pilha Cheia");

// ------------------------------------------------ pop public int pop() { if (topo != 0) { int valor = dados[topo]; topo--; return(valor);

113

} else } return(0);

// ------------------------------------------------ exibe public void exibe() { System.out.print("Pilha: "); for (int i = 0;i <= topo;i++) { System.out.print(dados[i] + " "); } System.out.println(); } }

Resultado do Programa: Elemento: 50 Elemento: 40 Elemento: 30 Elemento: 20 Elemento: 10 Elemento: 5 Erro: Pilha Cheia Elemento: 0 Pilha: 10 20 30 40 50 16.3 Implementao de uma Fila A seguir visto uma implementao de uma Fila usando a classe Fila escrita pelo programador. Programa exemplo (53): O programa permite inserir nmeros inteiros em uma Fila usando uma classe Fila implementada pelo programador. Quando o nmero digitado for igual zero (0), todos os nmeros da fila so listados.
// ------------------------------------------------- Fonte: Prog53.java package prog53; import java.util.Scanner; public class Prog53 { public static void main(String[] args) { Fila fila = new Fila(5); Scanner entrada = new Scanner(System.in); String s, nodos = ""; int nodo; do { System.out.print("Elemento: "); s = entrada.nextLine(); nodo = Integer.parseInt(s); if (nodo != 0) fila.insereFila(nodo); } while (nodo != 0); nodo = fila.retiraFila(); if (nodo == 0) System.out.println("Fila: Vazia"); else { while (nodo != 0) { nodos = nodos + nodo + " "; nodo = fila.retiraFila(); } System.out.println("Fila: " + nodos); } } }

114

// --------------------------------------------------- Fonte: Pilha.java // Fila.java package prog53; public class Fila { private int inic, fim, n; private int [] dados; // ---------------------------------------- construtor public Fila(int numElementos) { inic = -1; fim = 0; n = 0; dados = new int[numElementos]; } // ------------------------------------------------ insereFila public void insereFila(int i) { int max = dados.length; if (n < max) { dados[fim] = i; fim++; n++; } else System.out.println("Erro: Fila Cheia"); } // ------------------------------------------------ retiraFila public int retiraFila() { if (n != 0) { inic++; n--; return(dados[inic]); } else return(0); } // construtor

Resultado do Programa:
Elemento: 10 Elemento: 20 Elemento: 30 Elemento: 40 Elemento: 50 Elemento: 60 Erro: Fila Cheia Elemento: 0 Fila: 10 20 30 40 50

16.4 Implementao de uma Fila Circular Um problema que ocorre em estruturas de dados do tipo Fila que aps algumas operaes de insero e remoo de elementos, pode existir nodos vagos que no podem ser reaproveitados, pois normalmente uma fila possui trs informaes que a controlam: primeiro, ltimo e nmero de elementos, no permitindo que os nodos excludos sejam ocupados novamente. Uma forma de resolver este problema, a utilizao de uma Fila Circular, onde todo nodo inserido ou removido tem sua posio calculada por uma equao, fazendo com que, desta forma, sempre todos os nodos sejam reocupados com uma informao.

115

Programa exemplo (54): O programa permite inserir nmeros inteiros em uma Fila Circular, ou seja, existe reaproveitamento da fila. Quando o nmero digitado for igual zero (0), todos os nmeros da fila so listados.
// ------------------------------------------------------------ Fonte: prog54.java package prog54; import java.util.Scanner; public class Prog54 { public static void main(String[] args) { FilaCircular fila = new FilaCircular(5); Scanner entrada = new Scanner(System.in); String s; int valor; char ch; do { System.out.printf("[I]ncluir, [E]xcluir ou [F]im? "); do { s = entrada.nextLine(); ch = s.charAt(0); } while (ch != 'I' && ch != 'i' && ch != 'E' && ch != 'e' && ch != 'F' && ch != 'f'); switch (ch) { case 'I': case 'i': System.out.printf("Valor: "); s = entrada.nextLine(); valor = Integer.parseInt(s); fila.insereFilaCircular(valor); break; case 'E': case 'e': valor = fila.excluiFilaCircular(); System.out.println("Elemento Retirado da Fila: " + valor); break; } } while (ch != 'F' && ch != 'f'); fila.exibeFilaCircular(); System.exit(0); } } // --------------------------------------------------- Fonte: FilaCircular.java package prog54; public class FilaCircular { private int primeiro, ultimo, tamanho; private int [] elem; public FilaCircular(int numElementos) { primeiro = 0; ultimo = -1; tamanho = 0; elem = new int[numElementos]; } // ------------------------------------ insereFilaCircular public void insereFilaCircular(int dado) { int n = elem.length; if (tamanho == n) { System.out.println("ERRO: Fila Cheia"); } else { tamanho++; ultimo = (ultimo + 1) % n; elem[ultimo] = dado; } }

116

// ----------------------------------- excluiFilaCircular public int excluiFilaCircular() { int n = elem.length; if (tamanho == 0) { System.out.println("ERRO: Fila Vazia"); return(-1); } else { tamanho--; int temp = primeiro; primeiro = (primeiro + 1) % n; return(elem[temp]); } } // -------------------------------- exibeFilaCircular public void exibeFilaCircular() { int n = elem.length; if (tamanho == 0) { System.out.println("Fila Circular: Fila Vazia"); } else { int temp = primeiro; System.out.print("Fila Circular: "); for (int i = 1;i <= tamanho;i++) { System.out.print(elem[temp] + " "); temp = (temp + 1) % n; } System.out.printf("\n"); } } }

Resultado do Programa:
[I]ncluir, [E]xcluir Valor: 10 [I]ncluir, [E]xcluir Valor: 20 [I]ncluir, [E]xcluir Valor: 30 [I]ncluir, [E]xcluir Valor: 40 ERRO: Fila Cheia [I]ncluir, [E]xcluir Elemento Retirado da [I]ncluir, [E]xcluir Elemento Retirado da [I]ncluir, [E]xcluir Valor: 50 [I]ncluir, [E]xcluir Valor: 60 [I]ncluir, [E]xcluir Valor: 70 ERRO: Fila Cheia [I]ncluir, [E]xcluir ou [F]im? i ou [F]im? i ou [F]im? i ou [F]im? i ou [F]im? e Fila: 10 ou [F]im? e Fila: 20 ou [F]im? i ou [F]im? i ou [F]im? i ou [F]im?

117

17. Tratamento de erros


Na execuo de um programa em Java, podem ocorrer erros no previstos que podem interromper a execuo normal do programa. Tais erros podem ser: Converso numrica invlida; Limite de um vetor (acessor a ndice invlido); Problemas com arquivos: abertura, criao ou caminho; Overflow; Erro de entrada e sada (input/output); Divizo por zero; Validao de dados. da

Em Java, o programa tem condies de assumir o controle execuo em caso que ocorra uma situao de erro no prevista.

Isso feito atravs do mecanismo de tratamento de excees que ao detectar uma situao de erro, a mquina virtual Java gera uma exceo. Se o programa que estiver sendo executado possuir um tratamento de excees, ele assume o controle da execuo. Mas se a exceo no tiver um tratamento associado, o programa interrompido e a mquina virtual Java gera uma mensagem de erro. Uma exceo um evento que indica uma interrompe a execuo normal de um programa. condio anormal que

O tratamento de erros no Java cria objetos da classe erro, o tratamento destes erros feita pela manipulao destes objetos. O tratamento de erros em Java basea-se em: try {} catch {} finally {}. A execuo de um bloco de cdigo, protegido por um tratamento de erros, feito colocando o bloco no try, e para cada erro que se deseja tratar, deve-se colocar uma clusula catch (tipo_de_erro varivel_erro) {} e/ou uma clusula finally (opcional) que executada aps a execuo do bloco try se no houver erro. Sintaxe: try { // cdigo fonte normal return; } catch (Exception error) { // cdigo que trata um tipo de erro ou mostra o erro } catch (Exception error) { // cdigo que trata outro tipo de erro ou exibe o erro } finally { // opcional // cdigo executado, mesmo tendo excesso }

118

17.1 Tratamento de excees Excees so instncias de classes geradas quando houver erro. Estas excees podem ser captadas e tratadas para que no ocorra erros em tempo de execuo. Os mtodos utilizados por classes de excees so: getMessage(): Retorna uma string com o erro. printStackTrace(): Imprime na tela um histrico do erro e as linhas aonde os erros ocorreram. toString(): Converte a exceo numa String. getCause(): Retorna a causa da exceo ou null se a causa for desconhecida ou no existir.

17.2 Tratamento de erros: Entrada de nmero inteiro via teclado O programa exemplo abaixo verifica e trata a exceo: formato invlido do nmero (NumberFormatException).
// ------------------------------------------------------- Fonte: inteiro.java package inteiro; import java.util.Scanner; public class Inteiro { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; int inteiro = -999; try { System.out.print("Inteiro: "); // cdigo protegido contra erro s = entrada.nextLine(); inteiro = Integer.parseInt(s); return; } catch (NumberFormatException error) { // error.printStackTrace(); // mostra as linhas do erro System.out.println("ERRO: " + error.getMessage()); // exibe o erro } finally { // OPCIONAL System.out.println("INTEIRO: " + inteiro); // executa depois do catch } System.exit(0); } }

Resultado do Programa (sem erro): [usurio digitou 120]


Inteiro: 120 INTEIRO: 120

Resultado do Programa (sem erro): [usurio digitou abc]


Inteiro: abc ERRO: For input string: "abc" INTEIRO: -999

17.3 Tratamento de erros: Diviso por zero O programa exemplo abaixo verifica e trata os seguintes erros: (a) diviso por zero; (b) usurio apenas digitou <enter> sem nenhum nmero e (c) digitou letras (NumberFormatException e ArithmeticException).

119

// ------------------------------------------------------ Fonte: Divisao.java package divisao; import java.util.Scanner; public class divisao { public static void main (String args[]) { Scanner entrada = new Scanner(System.in); String s; float x, y, div; try { System.out.print("Dividendo: "); s = entrada.nextLine(); x = Float.parseFloat(s); System.out.print("Divisor: "); s = entrada.nextLine(); y = Float.parseFloat(s); div = x / y; System.out.println ("Divisao: " + div); } catch (NumberFormatException error) { System.out.println("Status: " + error.getMessage()); } catch (ArithmeticException error) { } System.exit(0); } }

Resultado do Programa (sem erro): [usurio digitou 3 + 2] Dividendo: 3 Divisor: 2 Divisao: 1.5 Resultado do Programa (sem erro): [usurio digitou 3 + 0]
Dividendo: 3 Divisor: 0 Divisao: Infinity

Resultado do Programa (com erro): [usurio digitou abc]


Dividendo: abc Status: For input string: "abc"

17.4 Tratamento de exceo com Exception Em java pode-se usar o try ... catch da seguinte forma:
// --------------------------------------------------------- Fonte: Teste.java package teste; import java.util.Scanner; public class Main { public static void main(String[] args) { testException(); System.exit(0); } public static void testException() { Scanner entrada = new Scanner(System.in); String s; int x, y; float div; try { System.out.print("Dividendo: "); s = entrada.nextLine(); x = Integer.parseInt(s); System.out.print("Divisor: ");

120

} }

s = entrada.nextLine(); y = Integer.parseInt(s); div = (float) x / y; System.out.println("Divisao: " + div); } catch (Exception error) { error.printStackTrace(); System.out.println("Status: Divisao por zero"); }

Resultado do Programa (sem erro): [usurio digitou 3 + 2]


Dividendo: 3 Divisor: 2 Divisao: 1.5

Resultado do Programa (sem erro): [usurio digitou 3 + 0]


Dividendo: 3 Divisor: 0 Divisao: Infinity

17.5 Tratamento de exceo com MyException Em java pode-se criar uma exceo da seguinte forma:
// ----------------------------------------------------------- Fonte: MyException.java package myexception; class MyException extends Exception { public MyException(String msg) { super(msg); } } // --------------------------------------------------------- Fonte: Myexception.java package myexception; import java.util.Scanner; public class Main { public static void main(String[] args) throws Exception{ Scanner entrada = new Scanner(System.in); String s; int x, y; float div; System.out.print("Dividendo: "); s = entrada.nextLine(); x = Integer.parseInt(s); System.out.print("Divisor: "); s = entrada.nextLine(); y = Integer.parseInt(s); div = (float) x / y; if (y == 0) { throw new MyException("Erro: Divisao por zero"); } System.out.println("Divisao: " + div); System.exit(0); } }

17.6 Exceo em ArrayList O programa abaixo mostra duas excees: NumberFormatExcpetion e IllegalArgumentException usando-se um ArrayList.
// ------------------------------------------------------ Fonte: arraylist.java package arraylist;

121

import java.util.ArrayList; import javax.swing.JOptionPane; public class arraylist { public static void main(String[] args) { ArrayList lista; int quantidade; String s, nome; try { s = JOptionPane.showInputDialog("Quantidade: "); quantidade = Integer.parseInt(s); lista = new ArrayList(quantidade); for (int i = 0;i < quantidade;i++) { s = JOptionPane.showInputDialog("Nome: "); lista.add(s); nome = (String) lista.get(i); System.out.println("Nome: " + nome); } } catch (NumberFormatException error) { // para testar digite (abc) System.out.println("ERRO: Conversao Ilegal"); System.out.println(error.getMessage()); } catch (IllegalArgumentException error) { // para testar digite (-1) System.out.println("ERRO: ArrayList ilegal"); System.out.println(error.getMessage()); } System.exit(0); } }

Resultado do Programa (sem erro): [usurio digitou 2 + Paulo + Roberto]


Nome: Paulo Nome: Roberto

Resultado do Programa (com erro): [usurio digitou -1]


ERRO: ArrayList ilegal Illegal Capacity: -1

Resultado do Programa (com erro): [usurio digitou abc]


ERRO: Conversao Ilegal For input string: "abc"

17.7 Excees criadas pelo programador O programas a seguir, possui duas excees criadas programador: ListaCheiaExcepetion e IndiceInvalidoException.
// ------------------------------------------------------------ Fonte: Aluno.java package listaobjeto; public class Aluno { private int codigo; private String nome; // ------------------------------------- Construtor public Aluno(int cod, String s) { codigo = cod; nome = s; } // ------------------------------------- getNome public String getNome() { return(this.nome); } // ------------------------------------- getCodigo

pelo

122

public int getCodigo() { return(this.codigo); }

// -------------------------------------------------------- Fonte: ListObjet.java package listaobjeto; public class ListObjet { private Object [] v; private int n; // ------------------------------------- Construtor public ListObjet(int n) { v = new Object[n]; n = 0; } // ------------------------------------- getTamanho public int getTamanho() { return(n); } // ------------------------------------- incluiFim public void incluiFim(Object nodo) { if (n == v.length) { throw new ListaCheiaException(); } else { v[n] = nodo; n++; } } // ------------------------------------- consulta public Object consulta(int indice) { if (indice < 0 || indice >= n) { throw new IndiceInvalidoException("Indice: " + indice + "invalido"); } else { return(v[indice]); } } // ------------------------------------- ListaCheiaException public class ListaCheiaException extends RuntimeException { public ListaCheiaException () { super("Lista Cheia"); } public ListaCheiaException (String s) { super(s); } } // ------------------------------------- IndiceInvalidoException public class IndiceInvalidoException extends RuntimeException { public IndiceInvalidoException () { super("Indice Invalido"); } public IndiceInvalidoException (String s) { super(s); } } } // ------------------------------------------------------ Fonte: ListaObjeto.java package listaobjeto;

123

public class ListaObjeto { public static void main(String[] args) { ListObjet lista = new ListObjet(3); lista.incluiFim(new Aluno(10, "Ana")); lista.incluiFim(new Aluno(20, "Beatriz")); lista.incluiFim(new Aluno(30, "Carla")); // lista.incluiFim(new Aluno(40, "Debora")); // tente rodar com esta linha int tam = lista.getTamanho(); for (int i = 0;i < tam;i++) { // tenta rodar com (i <= tam) Aluno aluno = (Aluno) lista.consulta(i); System.out.println(aluno.getNome() + "(" + aluno.getCodigo() + ")"); } System.exit(0);

} }

Resultado do Programa (sem erro):


Ana(10) Beatriz(20) Carla(30)

Resultado do Programa (com erro):


lista.incluiFim(new Aluno(40, "Debora")); // rodou com esta linha Exception in thread "main" listaobjeto.ListObjet$ListaCheiaException: Lista Cheia at listaobjeto.ListObjet.incluiFim(ListObjet.java:26) at listaobjeto.ListaObjeto.main(ListaObjeto.java:13) Java Result: 1

Resultado do Programa (com erro):


for (int i = 0;i <= tam;i++) { // rodou com esta linha

Ana(10) Beatriz(20) Carla(30) Exception in thread "main" listaobjeto.ListObjet$IndiceInvalidoException: Indice: 3invalido at listaobjeto.ListObjet.consulta(ListObjet.java:38) at listaobjeto.ListaObjeto.main(ListaObjeto.java:16) Java Result: 1

124

18. Herana em Java


18.1 Herana simples A herana simples permite que uma classe incorpore os atributos e mtodos de outra classe, ou seja, permite a construo de hierarquias de classes. O primeiro passo envolve a definio de uma classe base (superclasse) que define as caractersticas comuns a todos os objetos derivados desta classe. As classes oriundas da classe base so chamadas classes derivadas ou extenso da classe (subclasse) Uma classe derivada herda todas as caractersticas da classe base e pode ter novas caractersticas adicionadas a ela. Uma classe derivada segue a seguinte diretriz em relao a classe base: classe_derivada um(a) classe_base Exemplo: um cardial um pssaro Especificadores de acesso: public (pblico) Quem tem acesso classe tem acesso tambm a qualquer membro pblico. raro ter atributos pblicos, mas comum ter mtodos pblicos. Qualquer mtodo tem acesso. // classe base: pssaro // classe derivada: cardial

private (privado) Um membro privado no acessvel fora da classe, somente pelos membros da classe. A inteno permitir que apenas quem escreve a classe possa usar esse membro.

protected (protegido) O membro protegido acessvel classe e a suas sub-classes (classes derivadas). A inteno dar acesso aos programadores que estendero sua classe.

18.2 Controle de acesso na definio de uma classe derivada Quando uma classe derivada definida, ou seja, na definio de herana simples, seus membros (atributos e mtodos) so declarados internamente e o acesso a estes pode ser pblico (public), privativo (private) ou protegido (protected). O acesso a membros protegidos igual ao acesso a membros privativos, exceto para o acesso das classes derivadas da classe. A forma geral de especificar herana simples :

125

Especificador_de_acess class nome_classe_derivada extends nomeclasse_base { // atributos // mtodos }

Quando uma classe herda as caractersticas de outra classe, todos os membros da classe base tornam-se membros da classe derivada. O tipo de acesso da classe base dentro da classe derivada determinado pelo especificador de acesso. Qualquer que seja o especificador de acesso, membros privativos da classe base continuam sendo propriedade privada da classe base, e no podem ser acessados por classes derivadas. Quando o especificador de acesso public, todos os membros pblicos da classe base tornam-se membros pblicos da classe derivada, e os membros protegidos da classe base tornam-se membros protegidos da classe derivada. Esta a diferena que existe entre membros privativos e membros protegidos. Quando o especificador de acesso private, todos os membros pblicos e protegidos da classe base tornam-se membros privativos da classe derivada, ou seja, a classe derivada no pode transferir seus privilgios de acesso a outras classes. Quando o especificador de acesso protected, todos os membros pblicos e protegidos da classe base tornam-se membros protegidos da classe derivada. Programa exemplo (55): O objetivo do programa a seguir demonstrar a utilizao de herana simples (atributos da classe base so privados).
// ------------------------------------------------------- Fonte: Heranca.java package heranca; public class Heranca { public static void main(String[] args) { Derivada objeto = new Derivada(3); int resp; objeto.Seta(1, 2); resp = objeto.Soma(); System.out.println("Somador (x + y + z): " + objeto.Somador(resp)); System.exit(0); } } // -------------------------------------------------------- Fonte: base.java package heranca; public class Base { private int x, y; // atributos privados

public void Seta(int a, int b) { x = a; y = b; System.out.println("x = " + x); System.out.println("y = " + y); } public int Soma() { System.out.println("Soma (x + y): " + (x + y)); return(x + y); }

126

} // ---------------------------------------------------------- Fonte: Derivada.java package heranca; public class Derivada extends Base { private int z; public Derivada(int x) { z = x; System.out.println("z = " + z); } public int Somador(int soma) { // no possvel acessar x e y pois so privados da classe base return(soma + z); } }

Resultado do Programa:
z = 3 x = 1 y = 2 Soma (x + y): 3 Somador (x + y + z): 6

Responda: Porque o atributo z mostrado primeiro? 18.3 Tipos de acessos (especificadores de acesso) public (pblico): Todos os atributos da classe base so pblicos na classe derivada. private (privado): Os atributos s podem ser acessados pelos mtodos que fazem parte da classe. protected (protegido): Os atributos podem ser acessados pelos mtodos de classes derivadas. O objetivo do programa demonstrar a simples (atributos da classe base so

Programa exemplo (56): utilizao de herana protegidos).

// ---------------------------------------------------------- Fonte: Heranca.java package heranca; public class Heranca { public static void main(String[] args) { Derivada objeto = new Derivada(3); int resp; objeto.Seta(1, 2); resp = objeto.Soma(); System.out.println("Somador (x + y + z): " + objeto.Somador(resp)); System.exit(0); } } // ----------------------------------------------------------- Fonte: base.java package heranca; public class Base { protected int x, y; // atributos protegidos

public void Seta(int a, int b) { x = a; y = b; System.out.println("x = " + x);

127

System.out.println("y = " + y); } public int Soma() { System.out.println("Soma (x + y): " + (x + y)); return(x + y); } } // ------------------------------------------------------------ Fonte: Derivada.java package heranca; public class Derivada extends Base { private int z; public Derivada(int x) { z = x; System.out.println("z = " + z); } public int Somador(int soma) { return(x + y + z); // possvel acessar x e y pois so protegidos na classe base }

Resultado do Programa:
z = 3 x = 1 y = 2 Soma (x + y): 3 Somador (x + y + z): 6

18.4 Lista de exerccios sobre Herana 18.4.1 Herana (primeiro) Dado os seguintes cdigos em Java:
// ------------------------------------------------------------------ TestaHeranca.java package testaheranca; public class TestaHeranca { public static void main(String[] args) { Cliente cliente = new Cliente("Paulo Roberto", "123.456-78", 1234.56); cliente.imprimePessoa(); cliente.imprimeCliente(); } }

// ----------------------------------------------------------------------- Pessoa.java package testaheranca; public class Pessoa { protected String nome; protected String cpf; Pessoa() { this.nome = "xxxx"; this.cpf = "xxx.xxx.xxx-xx"; } Pessoa(String nome, String cpf) { this.nome = nome; this.cpf = cpf; }

128

public void imprimePessoa() { System.out.println("Nome: " + nome); System.out.println("CPF: " + cpf); } } // ----------------------------------------------------------------------- Cliente.java package testaheranca; public class Cliente extends Pessoa { private double conta; Cliente(String nome, String cpf, double conta) { this.conta = conta; } public void imprimeCliente() { System.out.println("Conta: " + conta); } }

Resultado esperado do programa:


Nome: Paulo Roberto CPF: 123.456-78 Conta: 1234.56

Resultado real do programa:


Nome: xxxx CPF: xxx.xxx.xxx-xx Conta: 1234.56

Que modificaes devem ser feitas no cdigo fonte para que o resultado do programa seja o esperado? 18.4.2 Herana (segundo) Dado a classe base Pessoa e o programa principal TestaHomem, construa as classes derivadas Homem e Mulher que contenha os atributos e mtodos abaixo descritos:
// ------------------------------------------------------------------------ Pessoa.java package testahomem; public class Pessoa { protected double altura; protected char sexo; Pessoa() { this.altura = 0.0; this.sexo = 'g'; } Pessoa(double altura, char sexo) { this.altura = altura; this.sexo = sexo; } public void imprimePessoa() { System.out.println("Altura: " + altura); System.out.println("Sexo: " + sexo); } } Pessoa altura sexo

129

imprimePessoa Homem pesoIdeal calculaPesoIdealHomem imprimePesoIdealHomem Mulher pesoIdeal calculaPesoIdealMulher imprimePesoIdealMulher // -------------------------------------------------------------------- TestaHomem.java package testahomem; public class TestaHomem { public static void main(String[] args) { Homem homem = new Homem(1.64, 'm'); Mulher mulher = new Mulher(1.59, 'f'); homem.calculaPesoIdealHomem(); homem.imprimePessoa(); homem.imprimePesoIdealHomem(); mulher.calculaPesoIdealMulher(); mulher.imprimePessoa(); mulher.imprimePesoIdealMulher(); } }

Resultado do Programa:
Altura: 1.64 Sexo: m Peso Ideal (Homem): 61,23 Altura: 1.59 Sexo: f Peso Ideal (Homem): 54,04

18.4.3 Herana (terceiro) Dados os seguintes cdigos em Java:


// ------------------------------------------------------------------ TestaObjetos.java package testaobjetos; public class TestaObjetos { public static void main(String[] args) { Linha linha = new Linha(1, 2, 3, 4); Retangulo retangulo = new Retangulo(1, 2, 3, 4); System.out.println("Linha: "); linha.imprimeLinha(); System.out.println("Retngulo: "); retangulo.imprimeRetangulo();

} }

// ------------------------------------------------------------------------ Objeto.java package testaobjetos; public class Objeto { protected int x; protected int y; Objeto() { x = 0;

130

y = 0; } Objeto(int x, int y) { this.x = x; this.y = y; } public void imprimeObjeto() { System.out.println("x = " + x + " - y = " + y); } } // ------------------------------------------------------------------------- Linha.java package testaobjetos; public class Linha extends Objeto { private Objeto p1; private Objeto p2; Linha (int xi, int yi, int xf, int yf) { p1 = new Objeto(xi, yi); p2 = new Objeto(xf, yf); } public void imprimeLinha() { p1.imprimeObjeto(); p2.imprimeObjeto(); } }

Implemente a classe derivada Retangulo para que o programa funcione conforme o resultado do programa abaixo: Resultado do Programa:
Linha: x = 1 - y = x = 3 - y = Retngulo: x = 1 - y = x = 3 - y = x = 3 - y = x = 1 - y = 2 4 2 2 4 4

131

19. Coletor de Lixo (Garbage Collector)


O Java possui um coletor de lixo automtico, mas pode-se chamlo implicitamente atravs do mtodo: System.gc. Olhe no exemplo abaixo:
// ------------------------------------------------ Fonte: Heranca.java package heranca; public class Heranca { public static void main(String[] args) { Derivada objeto = new Derivada(3); int resp; objeto.Seta(1, 2); resp = objeto.Soma(); System.out.println("Somador (x + y + z): " + objeto.Somador(resp)); objeto = null; // marca para coletor de lixo System.gc(); // chamada do coletor de lixo System.exit(0); } } // ------------------------------------------------ Fonte: base.java package heranca; public class Base { protected int x, y; // atributos protegidos

public void Seta(int a, int b) { x = a; y = b; System.out.println("x = " + x); System.out.println("y = " + y); } public int Soma() { System.out.println("Soma (x + y): " + (x + y)); return(x + y); } } // --------------------------------------------------- Fonte: Derivada.java package heranca; public class Derivada extends Base { private int z; public Derivada(int x) { z = x; System.out.println("z = " + z); } public int Somador(int soma) { return(x + y + z); // possvel acessar x e y pois so privados a classe base } }

Resultado do Programa:
z = 3 x = 1 y = 2 Soma (x + y): 3 Somador (x + y + z): 6

132

20. Construtor e finalizador em Java


Em Java, uma classe alm de poder ter um construtor, pode ter um finalizador (mtodo: protected void finalize) que executado automaticamente no trmino do programa. Veja o exemplo a seguir:
// -------------------------------------------------------- Fonte: base.java package heranca; public class Base { protected int x, y; // atributos protegidos

public void Seta(int a, int b) { x = a; y = b; System.out.println("x = " + x); System.out.println("y = " + y); } public int Soma() { System.out.println("Soma (x + y): " + (x + y)); return(x + y); } } // ---------------------------------------------------- Fonte: Derivada.java package heranca; public class Derivada extends Base { private int z; public Derivada(int x) { z = x; System.out.println("z = " + z); } public int Somador(int soma) { return(x + y + z); // possvel acessar x e y pois so privados a classe base } protected void finalize() { System.out.println("Finalizador: Final do programa"); } } // --------------------------------------------------------- Fonte: Heranca.java package heranca; public class Heranca { public static void main(String[] args) { Derivada objeto = new Derivada(3); int resp; objeto.Seta(1, 2); resp = objeto.Soma(); System.out.println("Somador (x + y + z): " + objeto.Somador(resp)); objeto = null; // marca para coletor de lixo System.gc(); // chamada do coletor de lixo System.exit(0); } }

Resultado do Programa:
z = 3 x = 1 y = 2 Soma (x + y): 3 Somador (x + y + z): 6

Finalizador: Final do Programa

133

21. Applets em Java


Applets so pequenos programas (aplicativos) escritos em Java que podem ser executados pela Java Virtual Machine em navegadores. So programas Java que podem ser embutidos em documentos HTML (Hypertext markup Language). Quando o navegador carrega uma pgina Web que contm uma applet, o applet baixado para o navegador e ento executado. Exemplo de Applet (PaintApplet):
// ------------------------------------------------ Fonte: PaintApplet.java import java.awt.Graphics; import javax.swing.JApplet; public class PaintApplet extends JApplet { public void paint(Graphics g) { super.paint(g); g.drawString("Paint by Luzzardi", 25, 15); }

Insero da Applet no documento HTML:


<HTML> <APPLET code= "PaintApplet.class" width= "800" height="600" > </APPLET> </HTML>

Para compilar a Applet:


$ javac PaintApplet.java <enter> $ // gerado PaintApplet.class

Para testar a Applet:


$ appletviewer PaintApplet.html <enter> $

Exemplo de Applet (CalcApplet):


// ---------------------------------------------------- Fonte: CalcApplet.java import java.awt.Graphics; import javax.swing.JApplet; public class CalcApplet extends JApplet { Calculadora calc = new Calculadora(); double resp; // -------------------------------------------- init public void init() { calc.entradaDados(); resp = calc.operaCalculadora(); } // -------------------------------------------- paint public void paint(Graphics g) { int erro = calc.retornaErro(); super.paint(g); g.drawString("Calculadora 1.0 by Luzzardi", 300, 270); g.drawLine(0, 280, 1279, 280); if (erro == 0) {

134

g.drawString("Resposta: " + resp, 340, 300); } else { switch (erro) { case 1: g.drawString("Erro: Divisao por Zero", 340, 300); break; case 2: g.drawString("Erro: Raiz Complexa", 340, 300); break; case 3: g.drawString("Erro: Tangente Infinita", 340, 300); break; } } g.drawLine(0, 310, 1279, 310); } } // ------------------------------------------------- Fonte: Calculadora.java import java.awt.Graphics; import javax.swing.*; public class Calculadora { private double x, y, resp; private char op; private int erro; public Calculadora () { erro = 0; } // construtor

// -------------------------------- retornaErro public int retornaErro() { return(this.erro); } // -------------------------------- entradaDados public void entradaDados() { String s; s = JOptionPane.showInputDialog("Digite um Valor: "); x = Double.parseDouble(s); do { s = JOptionPane.showInputDialog("Operador [+ - * / Rr Pp Ss Cc Tt]: "); op = s.charAt(0); } while (!strChr("+-*/RrPpSsCcTt", op)); if (!strChr("RrSsCcTt", op)) { s = JOptionPane.showInputDialog("Digite outro Valor: "); y = Double.parseDouble(s); }

// ---------------------------- operaCalculadora public double operaCalculadora() { final double pi = 3.14158; double rads; switch (op) { case '+': case '-': case '*': case '/':

case 'R': case 'r':

resp = soma(x, y); break; resp = subtracao(x, y); break; resp = multiplicacao(x, y); break; if (y == 0) erro = 1; // diviso por zero else resp = divisao(x, y); break; if (x < 0) erro = 2; // raiz negativa else resp = raizQuadrada(x); // Raiz Quadrada

135

break; case 'P': case 'p': case 'S': case 's': case 'C': case 'c': case 'T': case 't': resp = power(x, y); break; resp = seno(x); break; resp = cosseno(x); break; // potncia // seno // cosseno

if (x == 90 || x == 180) { erro = 3; } else { resp = tangente(x); // tangente } break;

} return(this.resp);

// ---------------------------- strChr private boolean strChr(String s, char ch) { for (int i = 0; i < s.length(); i++) { if (s.charAt(i) == ch) { return(true); } } return(false); } // ---------------------------- soma private double soma(double x, double y) { return(x + y); } // ---------------------------- subtracao private double subtracao(double x, double y) { return(x - y); } // ---------------------------- multiplicacao private double multiplicacao(double x, double y) { return(x * y); } // ---------------------------- divisao private double divisao(double x, double y) { if (y == 0) { erro = 1; return(-1); } return(x / y); } // ---------------------------- raizQuadrada private double raizQuadrada(double x) { return(Math.sqrt(x)); } // ---------------------------- power private double power(double x, double y) { return(Math.pow(x, y)); } // ---------------------------- seno private double seno(double x) {

136

final double pi = 3.14158; double rads; rads = x * pi / 180.0; return(Math.sin(rads)); } // ---------------------------- cosseno private double cosseno(double x) { final double pi = 3.14158; double rads; rads = x * pi / 180.0; return(Math.cos(rads)); } // ---------------------------- tangente private double tangente(double x) { final double pi = 3.14158; double rads; rads = x * pi / 180.0; return(Math.tan(rads)); } }

Insero da Applet no documento HTML:


<HTML> <APPLET code= "CalcApplet.class" width= "1280" height="800" > </APPLET> </HTML>

Para compilar a Applet:


$ javac Calculadora.java <enter> $ javac CalcApplet.java <enter> $ // gerado Calculadora.class // gerado CalcApplet.class

Para testar a Applet:


$ appletviewer CalcApplet.html <enter> $

137

22. Threads em Java


Forma de um processo dividir-se em duas ou mais tarefas que podem ser executadas concorrentementes, ou seja, pode ser visto como um fluxo de controle seqencial isolado dentro do programa. Uma thread tem comeo, fim e uma seqncia de comandos. Uma thread em Java no um programa, pois no executa sozinha, ela executa dentro de um programa. Threads permitem que um programa simples possa executar vrias tarefas diferentes ao mesmo tempo, independentemente uma das outras. Programas multithreaded so programas que contm vrias threads, executando tarefas distintas simultaneamente. Uma thread possui um mtodo run. Ele responsvel por executar as tarefas s quais thread se destina. Pode-se implementar threads de duas formas: Cria-se uma subclasse da classe thread e define-se o mtodo run de forma mais adequada tarefa da thread; Cria-se uma instncia da thread que recebe como argumentos um objeto que implemente a interface Runnable. O objeto fornece o mtodo run para a thread. Threads so independentes pois possuem sua prpria: (a) pilha de execuo; (b) contador de programa (program counter) e (c) variveis locais. Porm, threads de um mesmo processo compartilham memria, descritores de arquivos (file handles) e outros atributos que so especficos daquele processo. Um processo pode conter mltiplas threads que parecem executar ao mesmo tempo e de forma assncrona em relao as outras threads. Todas as threads de um mesmo processo compartilham o mesmo espao de endereamento de memria, o que significa que elas tem acesso as mesmas variveis e objetos, e que eles podem alocar novos objetos de um mesmo heap. Ao mesmo tempo que isso torna possvel que threads compartilhem informaes entre si, necessrio que o desenvolvedor se assegure que uma thread no atrapalhe a execuo de outra.

138

23. Sockets em Java


Socket um mecanismo para comunicao de programas sentidos que funcionam em uma rede de computadores. em dois

O pacote java.net possui duas classes principais: Socket (cliente) e ServerSocket (servidor) quando uma conexo entre clienteservidor realizada. O cliente solicita que uma conexo seja estabelida com o servidor atravs de um Socket. Quando o servidor aceita o pedido de conexo, ele cria um novo socket por uma porta diferente. No cliente, outro socket criado e ento utilizado para a comunicao com este servidor. A seguir so vistos Client.java (liente). dois fontes: Server.java (Servidor) e

// --------------------------------------------------------- Fonte: Server.java import java.io.*; import java.net.*; class Server { public static void main(String argv[]) throws Exception { int n = 1; String in; // string recebida do cliente String out; // string enviada ao cliente // cria socket de comunicacao com os clientes na porta 6789 ServerSocket welcomeSocket = new ServerSocket(6789); // espera uma mensagem do cliente while (true) { System.out.print("Esperando comunicao: "); // espera conexao do cliente Socket connectionSocket = welcomeSocket.accept(); // cria ligao de entrada e sada com o cliente BufferedReader inFromClient = new BufferedReader( new InputStreamReader(connectionSocket.getInputStream())); DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); // leitura da string do cliente in = inFromClient.readLine(); // transforma a string em maisculas out = in.toUpperCase() + '\n'; // envia a linha maiscula ao cliente outToClient.writeBytes(out); // exibe o cdigo do cliente System.out.println(" Cliente [" + n + "]"); // exibe a mensagem recebida e respondida ao cliente System.out.println("Mensagem Recebida: " + in); System.out.print("Mensagem Respondida: " + out); // nmero do cliente n++; } } } // ------------------------------------------------------ Fonte: Client.java import java.io.*; import java.net.*; class Client { public static void main(String argv[]) throws Exception { String in; // string digitada String out; // string recebida // cria uma ligao com o teclado BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); // cria o socket de acesso ao server hostname ou localhost na porta 6789

139

} }

//Socket clientSocket = new Socket("200.132.45.130", 6789); Socket clientSocket = new Socket("localhost", 6789); // cria ligaes de entrada e saida com o servidor DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); BufferedReader inFromServer = new BufferedReader( new InputStreamReader(clientSocket.getInputStream())); while (true) { // leitura de uma linha do teclado e coloca na String in System.out.print("Mensagem para Enviar [ou fim]: "); in = inFromUser.readLine(); if (in.startsWith("fim") == true) { break; } // envia uma string para o servidor outToServer.writeBytes(in + '\n'); // leitura de uma string do servidor out = inFromServer.readLine(); // exibe a linha do servidor na tela System.out.println("Servidor respondeu: " + out); } // fecha o cliente System.out.println("Conexo Fechada"); clientSocket.close();

Execuo dos Programas:


Servidor: MacBook-Pro-de-Paulo-Luzzardi:Java luzzardi$ javac Server.java MacBook-Pro-de-Paulo-Luzzardi:Java luzzardi$ java Server Esperando comunicao: Cliente [1] Mensagem Recebida: Paulo Roberto Gomes Luzzardi Mensagem Respondida: PAULO ROBERTO GOMES LUZZARDI Esperando comunicao: Cliente [2] Mensagem Recebida: Paola de Freitas Luzzardi Mensagem Respondida: PAOLA DE FREITAS LUZZARDI Esperando comunicao: Cliente [3] Mensagem Recebida: Adriane Maria Mensagem Respondida: ADRIANE MARIA Esperando comunicao: Cliente: MacBook-Pro-de-Paulo-Luzzardi:Java luzzardi$ javac Client.java MacBook-Pro-de-Paulo-Luzzardi:Java luzzardi$ java Client Mensagem para Enviar [ou fim]: Paulo Roberto Gomes Luzzardi Servidor respondeu: PAULO ROBERTO GOMES LUZZARDI Mensagem para Enviar [ou fim]: fim Conexo Fechada MacBook-Pro-de-Paulo-Luzzardi:Java luzzardi$ java Client Mensagem para Enviar [ou fim]: Paola de Freitas Luzzardi Servidor respondeu: PAOLA DE FREITAS LUZZARDI Mensagem para Enviar [ou fim]: fim Conexo Fechada MacBook-Pro-de-Paulo-Luzzardi:Java luzzardi$ java Client Mensagem para Enviar [ou fim]: Adriane Maria Servidor respondeu: ADRIANE MARIA Mensagem para Enviar [ou fim]: fim Conexo Fechada MacBook-Pro-de-Paulo-Luzzardi:Java luzzardi$

140

24. Data e Hora em Java


Em Java possvel verificar a data e hora da mquina. Abaixo visto vrias formas de imprimir na tela a data e horrio.
// ------------------------------------------ Fonte: Data.java package data; import java.text.DateFormat; import java.util.Date; public class Data { public static void main(String[] args) { Date data = new Date(); System.out.println(data.toString()); System.out.println(DateFormat.getInstance().format(data)); System.out.println(DateFormat.getTimeInstance().format(data)); System.out.println(DateFormat.getDateTimeInstance().format(data)); System.out.println(DateFormat.getTimeInstance(DateFormat.SHORT).format(data)); System.out.println(DateFormat.getTimeInstance(DateFormat.MEDIUM).format(data)); System.out.println(DateFormat.getTimeInstance(DateFormat.LONG).format(data)); System.out.println(DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(data)); System.out.println(DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT).format(data)); System.out.println(DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG).format(data)); } }

Sada do Programa:
Mon Apr 26 01:43:16 BRT 2010 26/04/10 01:43 01:43:16 26/04/2010 01:43:16 01:43 01:43:16 1h43min16s BRT 26/04/10 01:43 26/04/2010 01:43 26 de Abril de 2010 1h43min16s BRT

141

25. Glossrio em Java


Objetos so entidades lgicas que contm atributos (dados armazenados em variveis) e mtodos (funes) que manipulam estes dados. Um objeto pode ser definido atravs de um tipo de dado chamado classe (class). f) Atributos: So as variveis definidas e declaradas para cada objeto. g) Mtodos: So as funes definidas pelo programador que serviro para manipular os atributos. h) Mensagens: So as chamadas dos mtodos. i) Classe: um tipo de dado definido por class. Uma classe no um objeto, sim uma descrio do objeto. j) Instncia: Os objetos so instncias de uma classe. Resumidamente, objetos so instncias de classes que respondem as mensagens atravs dos mtodos escritos pelo programador. Outros conceitos importantes em linguagens orientadas objetos so: Applet: So programas Java que podem ser embutidos em documentos HTML (Hypertext markup Language). Quando o navegador carrega uma pgina Web que contm uma applet, o applet baixado para o navegador e ento executado. Thread e multithreads: Forma de um processo dividir a si mesmo em duas ou mais tarefas que podem ser executadas simultaneamente. um fluxo de controle seqencial isolado dentro do programa. Uma thread tem comeo, fim e uma seqncia de comandos. Uma thread em Java no um programa, pois no executa sozinha, ela executa dentro de um programa. Threads permitem que um programa simples possa executar vrias tarefas diferentes ao mesmo tempo, independentemente umas das outras. Programas multithreaded so programas que contm vrias threads, executando tarefas distintas simultaneamente. Classe Base (superclasse): Define as caractersticas comuns a todos os objetos derivados desta classe, ou seja, define atributos e mtodos que sero passados as classes derivadas. classe derivada (subclasse): Classe oriunda de uma classe base. Herda todos os mtodos e atributos pblicos ou protegidos da classe base. Uma linguagem de programao orientada objetos precisa suportar quatro propriedades: abstrao, encapsulamento, herana e polimorfismo. Abstrao: Objetos devem representar dados do mundo real. Polimorfismo (grego: muitas formas): a capacidade de objetos diferentes reagirem segundo a sua funo a uma ordem padro. Significa que o nome de um objeto pode ser utilizado para vrios propsitos ligeiramente diferentes, ou seja, ... uma interface, vrios mtodos ... . A caracterstica de polimorfismo utilizada na sobrecarga de mtodos e sobrecarga de operadores. Sobrecarga de Operador: Permite sobrecarregar realizar vrios tipos de operaes; operadores para

142

Sobrecarga de Mtodo: Permite que um mtodo retorne diferentes tipos de informaes e aceita argumentos de vrios tipos, inclusive com nmero diferentes de parmetros;

Herana: o processo pelo qual uma classe de objetos pode adquirir as propriedades de outra classe de objetos, em outras palavras, um objeto herda as caractersticas de outro (herana simples) ou vrios objetos (herana mltipla Java no possui herana mltipla). Encapsulamento (encapsulao): Os objetos possuem internamente atributos e mtodos agrupados no mesmo local, onde os mtodos manipulam os atributos. UML (Unified Modeling Language) A linguagem UML especifica 9 tipos de diagramas para modelagem de sistemas orientados objetos. Cada diagrama UML permite modelar uma distinta caracterstica ou da estrutura ou do comportamento do sistema em especial. Os 4 primeiros, referem-se a estrutura e os outros 5 ao comportamento do sistema. Diagrama de Classes: Exibe o nome da classe, atributos e mtodos que manipulam os atributos. Diagrama de Objetos: Exibe o conjunto de objetos e seus relacionamentos em determinado ponto no tempo (comportamento esttico). Diagrama de Componentes: Exibe as dependncias entre componentes do sistema. So utilizados para: (a) modelar a organizao do cdigo fonte; (b) modelar a chamada de programas externos; (c) modelar o banco de dados; (d) modelar sistemas adaptativos e (e) Engenharia de produo e Engenharia reversa. Diagrama de Instalao: Exibe a configurao dos nodos de processamento em tempo de execuo e os componentes existentes. Diagrama de Atividades: So utilizados para detalhar classes, a implementao de operaes e casos de uso. Diagrama de Mapa de Estados: Exibe o ciclo de vida de um objeto em nveis de detalhe simples ou complexos. Mostra a seqncia de estados que um objeto ou a interao percorrida durante sua vida em resposta a estmulos recebidos e as prprias aes e respostas (comportamento dinmico). Diagrama de Colaboraes: Modela as interaes entre objetos. focado na seqncia cronolgica de uma situao que est sendo modelado, focalizando no relacionamento entre os objetos e na compreenso dos efeitos sobre um objeto durante uma situao. Diagrama de Sequncia: Modela a interao entre objetos em um sistema. Apresenta os objetos e as mensagens (mtodos) que so passadas entre estes objetos dentro do caso de uso. Diagrama de Casos de Uso: Exibe os usurios e a relao entre os usurios e os casos de uso.

Diagrama de Classe: Pilha e Fila

143

Figura 5: Exemplos de Diagrama de Classes

144

26. Curiosidades do Java


A seguir so vistas algumas curiosidades da linguagem Java: Percorrendo um Vetor:
// -------------------------------------------------------- Fonte: Vetor.java package vetor; public class Vetor { public static void main(String args[]) { final int max = 9; int [] vetor = new int[max]; for (int i = 0; i < max; i++) { vetor[i] = i + 1; } for (int i : vetor) { System.out.println(i); }

} }

ou
// --------------------------------------------- Fonte: Vetor.java package vetor; public class Vetor { public static void main(String args[]) { final int max = 9; int [] vetor = new int[max]; for (int i = 0; i < max; i++) { vetor[i] = i + 1; } exibeVetor(vetor); } // ---------------------------------------- exibeVetor static void exibeVetor(int [] vetor) { for (int i : vetor) { System.out.println(i = + i); } } }

Operadores Lgicos: Java possui os seguintes operadores lgicos para and e ou: (&&) (||) (&) (|). Os operadores (&&) e (||) so conhecidos como Short Circuit Operator (operadores de curto circuito), ou seja, so operadores mais rpidos que & e |, pois quando no houver mais necessidade de testar as outras condies, o controle do programa passa adiante.

145

27. Classe Object


Em Java, todas as classes, sem nenhuma exceo, herdam direta ou indiretamente todos os mtodos da classe Object, pois ela a superclasse de qualquer outra classe.
Pacote: java.lang.Object (no necessrio fazer a chamada implcita deste pacote) // --------------------------------------------------------- Fonte: Objeto.java package objeto; public class Objeto { public static void main(String[] args) throws Exception { Object objeto = new Object(); objeto = "Paulo Roberto"; System.out.println("Objeto: " + objeto); objeto = 48; System.out.println("Objeto: " + objeto); } } Sada do Programa: Objeto: Paulo Roberto Objeto: 48 // ------------------------------------------------------- Fonte: Objeto.java package objeto; import java.util.Stack; public class Objeto { public static void main(String[] args) throws Exception { Object objeto = new Object(); objeto = "Paulo Roberto"; System.out.println("Objeto String: " + objeto); objeto = 48; System.out.println("Objeto Inteiro: " + objeto); Stack pilha = new Stack(); pilha.push(123); objeto = pilha.pop(); System.out.println("Objeto Pilha: " + objeto); Integer x = objeto.hashCode(); System.out.println("Valor: " + x); } } Sada do Programa: Objeto Objeto Objeto Valor: String: Paulo Roberto Inteiro: 48 Pilha: 123 123

// ----------------------------------------------------- Fonte: Objeto.java package objeto; import java.util.Scanner; public class Objeto { public static void main(String[] args) throws Exception { Scanner entrada = new Scanner(System.in); String s; int n; System.out.print("Numero de Objetos: "); s = entrada.nextLine();

146

n = Integer.parseInt(s); Object [] objeto = new Object[n]; // vetor de objetos for (int i = 0;i < n;i++) { System.out.print("Nome: "); s = entrada.nextLine(); objeto[i] = s; } for (int i = n-1;i >= 0;i--) { System.out.println("String: " + objeto[i]); } } } Sada do Programa: Nmero de Objetos: 4 Nome: paulo Nome: roberto Nome: gomes Nome: luzzardi String: luzzardi String: gomes String: roberto String: paulo

A seguir so descritos os mtodos da classe Object. Sintaxe: protected Object clone(); Cria e retorna uma cpia deste objeto. Sintaxe: boolean equals(Object obj); Indica se um objeto igual a outro. Sintaxe: protected void finalize(); Chama o coletor de lixo do objeto quando a coletor de lixo determina que no h mais referncias ao objeto. Sintaxe: Class getClass(); Retorna a classe runtime do objeto. Sintaxe: int hashCode(); Retorna o valor do cdigo hash de um objeto. Sintaxe: void notify(); Aguarda uma thread que est esperando o monitor do objeto. Sintaxe: void notifyAll(); Aguarda todas as threads que esto esperando o monitor do objeto. Sintaxe: String toString(); Retorna uma String do objeto. Sintaxe: void wait(); Faz a corrente thread esperar at que outra thread invoque os mtodos notify() ou notifyAll() deste objeto. Sintaxe: void wait(long timeout); Faz a corrente thread esperar at que outra thread invoque os mtodos notify() ou notifyAll() deste objeto ou um perodo especificado de tempo tiver decorrido. Sintaxe: void wait(long timeout, int nanos); Faz a corrente thread esperar at que outra thread invoque os mtodos notify() ou notifyAll() deste objeto, ou outra thread interrompa a corrente thread, ou um perodo especificado de tempo tiver decorrido.

147

28. Classe ArrayDeque


Java possui classes pr-definidas para ArrayDeque, LinkedBlockingDeque e LinkedList. Construtores: ArrayDeque() Construi um deque em um array vazio com 16 elements. ArrayDeque(int numElements); Construi um deque em um array vazio com numElements elementos. A seguir so descritos os mtodos da classe ArrayDeque. Sintaxe: boolean add(E e); Insere um elemento especificado no fim do deque. Sintaxe: Sintaxe: Sintaxe: Sintaxe: Sintaxe: Sintaxe: void addFirst(E e); Insere um elemento especificado na frente do deque. void addLast(E e); Insere um elemento especificado no fim do deque. void clear(); Remove todos os elementos deste deque. ArrayDeque<E> clone(); Returna uma cpia deste deque. boolean contains(Object o); Returna true se este deque contm o elemento especificado. trabalhar com Deque:

Iterator<E> descendingIterator(); Returna um iterator sobre os elementos neste deque em ordem sequencial reversa. Sintaxe: E element(); Recupera, mas no remove, o cabea da fila representada por este deque. Sintaxe: Sintaxe: Sintaxe: Sintaxe: Sintaxe: Sintaxe: Sintaxe: E getFirst(); Recupera, mas no remove, o primeiro elemento deste deque. E getLast(); Recupera, ams no remove, o ltimo elemento deste deque. boolean isEmpty(); Returna true se este deque no contm elementos. Iterator <E> iterator(); Returna um iterator sobre os elementos deste deque. boolean offer(E e); Insere um elemento especificado no fim deste deque. boolean offerFirst(E e); Insere um elemento especificado na frente deste deque. boolean offerLast(E e); Insere um elemento especificado no fim deste deque.

148

Sintaxe:

E peek(); Recupera, mas no remove, o cabea da fila representada por este deque ou returna null se este deque est vazio. Sintaxe: E peekFirst(); Recupera, mas no remove, o primeiro elemento deste deque, ou retorna null se este deque est vazio. Sintaxe: E peekLast(); Recupera, mas no remove, o ltimo elemento deste deque ou returna null se este deque est vazio. Sintaxe: E poll(); Recupera e remove o cabea desta fila representada por este deque (em outras palavras, o primeiro elemento deste deque) ou returna null se este deque est vazio. Sintaxe: E pollFirst(); Recupera e remove o primeiro elemento deste deque ou returna null se este deque est vazio. Sintaxe: E pollLast(); Recupera e remove o ltimo elemento deste deque ou returna null se este deque est vazio. Sintaxe: Sintaxe: Sintaxe: deque. Sintaxe: deque. Sintaxe: Sintaxe: E removeFirst(); Recupera e remove o primeiro elemento deste deque. boolean remove(Object o); Remove um instncia simples de um elemento especfico deste E pop(); Retira um elemento na pilha representada por este deque. void push(E e); Insere um elemento na pilha representada por este deque. E remove(); Recupera e remove o cabea da fila representada por este

boolean removeFirstOccurrence(Object o); Remove a primeira ocorrncia do elemento especificado deste deque (quando percorre o deque da cabea ao ltimo). Sintaxe: Sintaxe: E removeLast(); Recupera e remove o ltimo elemento deste deque.

boolean removeLastOccurrence(Object o); Remove a ltima ocorrncia do elemento especificado neste deque (quando percorre o deque da cabea ao ltimo). Sintaxe: Sintaxe: int size(); Returna o nmero de elementos deste deque.

Object[] toArray(); Returna um array contendo todos os elementos deste deque em ordem crescente (do primeiro at o ltimo elemento).

149

Sintaxe: <T> T[] toArray(T[] a); Returna um array contendo todos os elementos deste deque em ordem crescente (do primeiro at o ltimo elemento); o tipo do array retornado aquela especificado pelo array. A seguir demonstrado a utilizao de um ArrayDeque.
Pacote: import java.util.ArrayDeque; // -------------------------------------------------- Fonte: Array_Deque.java package array_deque; import java.util.ArrayDeque; import java.util.Scanner; public class Array_Deque { public static void main(String[] args) { ArrayDeque deque = new ArrayDeque(); Scanner entrada = new Scanner(System.in); String s; char tecla = 'f', op = 'f'; int nodo, n = 0; Object temp; do { // 16 elementos

System.out.println("Deque: " + deque); System.out.print("[I]ncluir, [C]onsultar, [E]xcluir ou [F]inalizar: "); do { s = entrada.nextLine(); if (!s.equals("")) { tecla = s.charAt(0); } } while (!strChr("IiCcEeFf", tecla)); if (!strChr("Ff", tecla)) { System.out.print("[E]squerda ou [D]ireita: "); do { s = entrada.nextLine(); if (!s.equals("")) { op = s.charAt(0); } } while (!strChr("EeDd", op)); switch (tecla) { case 'I': case 'i': System.out.print("Nodo: "); s = entrada.nextLine(); nodo = Integer.parseInt(s); if (strChr("Ee", op)) { deque.addFirst(nodo); } else { deque.addLast(nodo); } n++; if (n > 16) { System.out.println("ERRO: Deque Cheio"); System.exit(1); } break; case 'C': case 'c': if (!deque.isEmpty()) { if (strChr("Ee", op)) { temp = deque.peekFirst(); } else { temp = deque.peekLast(); } nodo = temp.hashCode(); System.out.println("Consultado: " + nodo); } else { System.out.println("ERRO: Deque Vazio"); } break;

150

} } } while (!strChr("Ff", tecla)); }

case 'E': case 'e': if (!deque.isEmpty()) { if (strChr("Ee", op)) { temp = deque.pollFirst(); } else { temp = deque.pollLast(); } nodo = temp.hashCode(); System.out.println("Excluiu: " + nodo); n--; } else { System.out.println("ERRO: Deque Vazio"); } break;

// ----------------------------------------------- strChr static boolean strChr(String s, char tecla) { int n = s.length(); for (int i = 0;i < n;i++) { if (s.charAt(i) == tecla) { return(true); } } return(false); } }

29. Formatar um double, float ou int


Pode-se utilizar o pacote java.text, classe DecimalFormat para imprimir um double, float ou int de forma formatada. Veja o exemplo abaixo:
// ------------------------------------------------------- Format.java package format; import javax.swing.JOptionPane; import java.text.DecimalFormat; public class Format { public static void main(String[] args) { DecimalFormat decimalDouble = new DecimalFormat("0.00"); double d = 1.2345; DecimalFormat decimalInteiro = new DecimalFormat("000"); int i = 12; JOptionPane.showMessageDialog(null, "Decimal Double: " + decimalDouble.format(d)); JOptionPane.showMessageDialog(null, "Decimal Inteiro: " + decimalInteiro.format(i)); System.exit(0); } } Sada do Programa: Decimal Double: 1,23 Decimal Inteiro: 012

151

30. Leitura e gravao de objetos (registro) em Arquivos


Em Java possvel ler e gravar dados organizados em registros. Um registro um conjuntos de campos, onde campos so qualquer tipo em Java. public class Registro { Object nome; Object idade; Object sexo; } nome idade sexo

30.1 Gravao de objetos em um arquivo binrio de objetos


O programa abaixo permite gravar em um arquivo binrio de objetos as seguintes informaes: nome, idade e sexo. file.addFile("Paulo Roberto", 50, 'm'); file.addFile("Adriane Maria", 42, 'f'); file.addFile("Paola", 13, 'f'); // ----------------------------------------------- Registro.java package writefile; public class Registro { Object nome; Object idade; Object sexo; Registro(String nome, int idade, char sexo) { this.nome = nome; this.idade = idade; this.sexo = sexo; } } // -------------------------------------------------------- FileObjeto.java package writefile; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; public class FileObjeto { // ------------------------------ atributos String nomeFile; private ObjectOutputStream fileOut; FileObjeto(String nomeArquivo) { nomeFile = nomeArquivo; try { fileOut = new ObjectOutputStream(new FileOutputStream(nomeFile)); System.out.println("Ok, Arquivo criado: " + nomeFile); } catch (IOException ioException) { } } // ------------------------------- addFile public void addFile(String nome, int idade, char sexo) throws IOException, ClassNotFoundException { Registro registro = new Registro(nome, idade, sexo); fileOut.writeObject(registro.nome); fileOut.writeObject(registro.idade); fileOut.writeObject(registro.sexo); }
System.out.println("ERRO Fatal: Problema na criao do Arquivo: " + nomeFile);

152

// ------------------------------- closeFile public void closeFile() { try { if (fileOut != null) { fileOut.close(); System.out.println("Ok, Arquivo fechado: " + nomeFile); } } catch (IOException ioException) { System.out.println("ERRO Fatal: Impossvel fechar o arquivo: " + nomeFile); System.exit(1); } } } // ------------------------------------------------------- WriteFile.java package writefile; import java.io.IOException; import java.util.Scanner; public class WriteFile { public static void main(String[] args) throws IOException, ClassNotFoundException { Scanner input = new Scanner(System.in); System.out.print("Nome do Arquivo: "); String nomeArquivo = input.nextLine(); FileObjeto file = new FileObjeto(nomeArquivo); file.addFile("Paulo Roberto", 50, 'm'); file.addFile("Adriane Maria", 42, 'f'); file.addFile("Paola", 13, 'f'); file.closeFile(); } }

30.2 Leitura objetos em um arquivo binrio de objetos


O programa abaixo permite carregar (ler) de um arquivo binrio de objetos as seguintes informaes: nome, idade e sexo. // ------------------------------------- Registro.java package readfile; public class Registro { Object nome; Object idade; Object sexo; } // ------------------------------------------------------- FileObjeto.java package readfile; import import import import java.io.FileInputStream; java.io.IOException; java.io.ObjectInputStream; java.io.EOFException;

public class FileObjeto { // ------------------------------ atributos String nomeFile; private ObjectInputStream fileIn; // ------------------------------ construtor FileObjeto(String nomeArquivo) { nomeFile = nomeArquivo; try { fileIn = new ObjectInputStream(new FileInputStream(nomeFile)); System.out.println("Ok, Arquivo Aberto: " + nomeFile);

153

} catch (IOException ioException) {


System.out.println("ERRO Fatal: Problema na Abertura do Arquivo: " + nomeFile);

System.exit(1);

} } // ------------------------------- addFile public void getFile() throws IOException, ClassNotFoundException { Registro registro = new Registro(); System.out.println("Nome Idade Sexo"); try { while (true) { registro.nome = fileIn.readObject(); registro.idade = fileIn.readObject(); registro.sexo = fileIn.readObject(); System.out.printf("%-20s %2d %c\n", registro.nome, registro.idade, registro.sexo); } } catch (EOFException endOfFileException) { } } // ------------------------------- closeFile public void closeFile() { try { if (fileIn != null) { fileIn.close(); System.out.println("Ok, Arquivo fechado: " + nomeFile); } } catch (IOException ioException) { System.out.println("ERRO Fatal: Impossvel fechar o arquivo: " + nomeFile); System.exit(1); } } } // ------------------------------------------------------ ReadFile.java package readfile; import java.io.IOException; import java.util.Scanner; public class ReadFile { public static void main(String[] args) throws IOException, ClassNotFoundException { Scanner input = new Scanner(System.in); System.out.print("Nome do Arquivo: "); String nomeArquivo = input.nextLine(); FileObjeto file = new FileObjeto(nomeArquivo); file.getFile(); file.closeFile(); } }

154

You might also like