Java: A Linguagem de Programação por Prof. Dr. Paulo Roberto Gomes Luzzardi facebook: Paulo Roberto Gomes Luzzardi WhatsApp: 91648037 e-mail: [email protected] e [email protected] e-mail (Senac): [email protected] DropBox: https://www.dropbox.com/sh/kea9kr4j2qttnjg/4xXvw0pvxX?m Hostinger: http://pluzzardi.w.pw e http://pluzzardi.zz.mu (Home Page) OS X Server (Apple): http://pluzzardi.no-ip.info:8080 (Home Page) Versão 1.66 26-05-2017 Bibliografia recomendada: DEITEL, H. M. and DEITEL, P. J. Java: como programar, 8. ed.: São Paulo: Pearson, 2010 (ISBN 85-363-0123-6). Pelotas, sexta-feira, 26 de maio de 2017 (17:58 pm) 1 Sumário 1. Arquitetura de um programa em Java ..................................................................................... 5 1.1 Elementos básicos de um programa em Java ......................................................... 5 1.2 Elementos básicos de um método estático ........................................................... 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 Como executar um .jar em Java via Terminal .................................................... 5 1.6 Pasta contendo os projetos/arquivos em Java .................................................. 5 2. Estrutura de um programa em Java ......................................................................................... 6 2.1 Identificadores ..................................................................................................................... 6 2.2 Comentários do programador .......................................................................................... 6 2.3 Regras gerais para escrever um programa em Java ........................................ 7 2.4 Palavras reservadas do Java ........................................................................................ 8 2.5 Declaração de variáveis .................................................................................................. 8 2.5.1 Onde as variáveis podem ser declaradas ..................................................... 8 2.5.2 Inicialização de variáveis ................................................................................ 10 2.6 Constantes ............................................................................................................................... 10 2.6.1 Constantes hexadecimais e octais ................................................................. 10 2.6.2 Constantes Strings ................................................................................................... 11 2.6.3 Constantes especiais .............................................................................................. 12 2.7 Comandos do pré-processador do Java ................................................................... 12 2.7.1 O comando import ........................................................................................................ 12 3. Tipos de dados ................................................................................................................................... 13 3.1 Tipos básicos ........................................................................................................................ 13 3.2 Escrevendo uma classe em Java ................................................................................. 13 3.2.1 Conceitos básicos ......................................................................................................... 13 3.2.2 Referência this .............................................................................................................. 17 3.2.3 Lista de exercícios sobre Classes ................................................................... 17 3.3 Sobrecarga de métodos em Java ................................................................................. 30 4. Métodos de entrada e saída de dados ................................................................................ 31 4.1 Entrada de dados via teclado .................................................................................... 31 4.2 Saída de dados via tela ................................................................................................ 32 5. Operadores ............................................................................................................................................ 34 5.1 Operadores aritméticos .................................................................................................. 34 5.2 Operadores relacionais .................................................................................................. 34 5.3 Operadores lógicos ............................................................................................................ 34 5.4 Incremento e decremento ................................................................................................ 35 5.5 Operador de atribuição .................................................................................................. 35 5.6 Casts ........................................................................................................................................... 36 5.7 Expressões ............................................................................................................................... 37 6. Métodos para funções matemáticas padrões .................................................................... 38 6.1 Math.abs .................................................................................................................................... 38 6.2 Math.asin ................................................................................................................................. 38 6.3 Math.acos ................................................................................................................................. 38 6.4 Math.atan ................................................................................................................................. 38 6.5 Math.sin .................................................................................................................................... 38 6.6 Math.cos .................................................................................................................................... 38 6.7 Math.tan .................................................................................................................................... 39 6.8 Math.exp .................................................................................................................................... 39 6.9 Math.pow .................................................................................................................................... 39 6.10 Math.sqrt ............................................................................................................................... 39 6.11 Math.log ................................................................................................................................. 39 6.12 Double.parseDouble ......................................................................................................... 39 6.13 Integer.parseInt .............................................................................................................. 39 6.14 Long.parseLong ................................................................................................................... 39 2 6.15 Math.log10 ............................................................................................................................ 39 6.16 Math.random .......................................................................................................................... 40 6.17 Math.PI .................................................................................................................................... 40 6.18 Conversão de graus para radianos ........................................................................ 40 7. Comandos ................................................................................................................................................. 41 7.1 Tipos de comandos .............................................................................................................. 41 7.1.1 Sequência ........................................................................................................................ 41 7.1.2 Seleção ............................................................................................................................. 41 7.1.3 Repetição ........................................................................................................................ 42 7.2 Comando if ............................................................................................................................... 43 7.2.1 if encadeados ............................................................................................................... 44 7.3 O comando switch ................................................................................................................ 44 7.4 Comando while ........................................................................................................................ 47 7.5 O comando for ........................................................................................................................ 49 7.6 O loop do { } while ......................................................................................................... 50 7.7 Interrupção de loops ....................................................................................................... 51 7.7.1 O comando break .......................................................................................................... 51 7.7.2 O comando continue ................................................................................................... 52 7.8 O método System.exit () ................................................................................................ 53 8. Saída formatada (System.out.printf) ................................................................................ 53 9. Lista de exercícios (comandos) ............................................................................................ 55 10. Vetores, Matrizes e Strings ................................................................................................. 59 10.1 Vetores .................................................................................................................................... 59 10.2 Strings .................................................................................................................................... 60 10.3 Matrizes (Multidimensional) .................................................................................... 60 10.4 Vetor de Strings .............................................................................................................. 62 10.5 Inicialização de matrizes e vetores ................................................................ 62 10.6 Inicialização de um vetor de caracteres ....................................................... 62 10.7 Inicialização de matrizes multidimensionais ............................................. 62 10.8 Inicialização de vetores e matrizes sem tamanho .................................... 62 10.9 Classificação de dados ou ordenação (sort) ................................................ 64 10.10 Lista de exercícios (vetores) ............................................................................ 66 11. Manipulação de Strings ............................................................................................................. 69 11.1 Métodos para manipular Strings ............................................................................ 69 11.2 Lista de exercícios (Strings) ............................................................................... 73 12. Métodos estáticos definidos pelo programador ........................................................ 76 12.1 Valores de retorno ......................................................................................................... 78 12.2 Passagem de parâmetros por valor ........................................................................ 80 12.3 Passagem de parâmetros por referência ............................................................ 81 12.4 Métodos que devolvem valores não-inteiros .................................................. 81 12.5 Argumentos do main (String [] args) ................................................................ 82 12.6 Recursividade ..................................................................................................................... 84 12.7 Lista de Exercícios (métodos) ............................................................................... 85 13. Classes (Interface ou Coleção) existentes em Java (Container) ............... 89 14. Entrada e saída em disco (Arquivos) ............................................................................ 105 14.1 Métodos para manipular arquivos em Java ..................................................... 105 14.2 Abertura de um arquivo texto ............................................................................... 107 14.3 Listar um diretório ..................................................................................................... 108 14.4 Manipulação de um arquivo de palavras .......................................................... 109 14.5 Arquivo Texto ................................................................................................................... 112 14.6 Lista de exercícios (arquivos) .......................................................................... 117 14.7 Acesso randômico em arquivos texto ................................................................. 120 14.8 Arquivo binário de objetos em Java ................................................................. 121 15. Conceitos diversos em Java ................................................................................................. 123 15.1 Operadores bit a bit .................................................................................................. 123 15.2 Formas abreviadas de Java ...................................................................................... 124 3 16. Listas Lineares: Pilha, Fila e Fila Circular ...................................................... 125 16.1 Implementação de um lista em vetor ................................................................. 125 16.2 Implementação de uma Pilha .................................................................................... 128 16.3 Implementação de uma Fila ...................................................................................... 130 16.4 Implementação de uma Fila Circular ................................................................. 131 17. Tratamento de erros .................................................................................................................. 134 17.1 Tratamento de exceções .............................................................................................. 134 17.2 Tratamento de erros: Entrada de número inteiro via teclado ....... 135 17.3 Tratamento de erros: Divisão por zero .......................................................... 135 17.4 Tratamento de exceção com Exception .............................................................. 136 17.5 Tratamento de exceção com MyException .......................................................... 137 17.6 Exceção em ArrayList .................................................................................................. 137 17.7 Exceções criadas pelo programador ................................................................... 138 18. Herança em Java ............................................................................................................................ 141 18.1 Herança simples .............................................................................................................. 141 18.2 Controle de acesso na definição de uma classe derivada ................. 141 18.3 Tipos de acessos (especificadores de acesso) ......................................... 143 18.4 Lista de exercícios sobre Herança ................................................................... 145 18.4.1 Herança (primeiro) .................................................................................................. 145 18.4.2 Herança (segundo) ..................................................................................................... 146 18.4.3 Herança (terceiro) .................................................................................................. 147 19. Coletor de Lixo (Garbage Collector) ............................................................................ 150 20. Construtor e finalizador em Java ................................................................................... 151 21. Applets em Java ............................................................................................................................ 152 22. Threads em Java ............................................................................................................................ 156 23. Sockets em Java ............................................................................................................................ 157 24. Data e Hora em Java .................................................................................................................. 159 25. Glossário em Java ....................................................................................................................... 160 26. Curiosidades do Java ................................................................................................................ 163 27. Classe Object ................................................................................................................................. 164 28. Classe ArrayDeque ....................................................................................................................... 166 29. Formatar um double, float ou int ................................................................................... 170 30. Leitura e gravação de objetos (registro) em Arquivos ................................... 171 30.1 Gravação de objetos em um arquivo binário de objetos ...................... 171 30.2 Leitura objetos em um arquivo binário de objetos ............................... 174 31. Eliminar problemas de conversão na entrada de Dados ..................................... 176 32. Classe para Entrada de Inteiros e Reais em Java sem Erro na Digitação .................................................................................................................................................... 178 Legenda de Cores Vermelho <enter>: Entrada de dados do programa Azul: Saída do programa (Resultado do Programa) Verde: Texto em destaque Preto: Texto normal Preto: Método em destaque Itálico: Código em Java Negrito: Texto em destaque Sublinado: Observações 4 1. Arquitetura de um programa em Java 1.1 Elementos básicos de um programa em Java package nome_do_pacote; public class nome_da_classe { // depois de compilado é gerado: nome_da_classe.class public static void main(String[] args) { corpo_do_programa; System.exit(0); // método principal // finalizar o programa definitivamente } } Programa Fonte: nome_da_classe.java Classe Java Compilada: nome_da_classe.class (ByteCode) 1.2 Elementos básicos de um método estático public static tipo_de_retorno nome_do_método(tipo_do_agumento nome_do_argumento, ...) { corpo_do_método; 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> $ // a classe é executada 1.5 Como executar um .jar em Java via Terminal $ java –jar Teste.jar <enter> $ Observação: Para gerar um arquivo executável Java, ou seja, um “.jar” (pelo NetBeans) vá na opção “Executar” e selecione “Limpar e Construir Projeto, desta forma, é gerado o arquivo “.jar” na pasta “dist”do projeto, ou seja, dentro da pasta do NetBeans. 1.6 Pasta contendo os projetos/arquivos em Java /Users/pluzzardi/NetBeansProjects // MacOsX /Users/pLuzzardi/Documents/NetBeansProjects // Windows /home/pluzzardi/NetBeansProjects // Linux – Ubuntu 5 2. Estrutura de um programa em Java 2.1 Identificadores São os nomes criados pelo programador para fazer referência a variáveis, constantes, argumentos, atributos e métodos. Regras para a criação de identificadores: ü ü ü ü ü O primeiro caracter pode ser uma letra, ( $ ) ou sublinha ( _ ); Os caracteres seguintes devem ser letras, números ou sublinhas; Não há limite de caracteres; Não é permitido a utilização de caracteres em branco (caracter espaço); Podem ser letras maiúsculas e minúsculas. Convenções: • • • • • Sempre começar um identificador com uma letra e não "$" ou "_". Os caracteres “$” e “_” nunca devem ser usados. Use nomes completos em vez de abreviações confusas. Palavras-chaves e palavras reservadas da linguagem não podem ser usadas como identificadores. Se o identificador tiver mais de um nome, o primeiro deve começar com letra minúscula e os demais devem começar com letras maiúsculas (int numeroDentes = 0). Exemplos em variáveis: int numeroDentes = 32; double inflacao; char a, _a; // _a deve ser evitado 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; Exemplos em métodos: x = raizQuadrada(y); System.out.println(“Valor: ” + inverso(n)); Observação: o método “inverso” é definido pelo programador (1/n). 2.2 Comentários do programador Os comentários do programador são linhas de código que não são compiladas pelo compilador, ou seja, servem apenas como anotações (documentação) para serem lembradas mais tarde (por exemplo, quando forem feitas manutenções no programa). Em Java os comentários podem ser feitos de duas formas: /* Assim pode ser usado para comentário de várias linhas */ // Isto é um comentário de uma linha apenas 6 Um comentário, pode ainda, utilizar várias linhas do programa. Veja o exemplo abaixo: /* ---------------------------------------------------Método: STRING Argumentos de entrada: x, y Argumentos de saída: c[], t[] Retorno: Sem Retorno ------------------------------------------------------- */ 2.3 Regras gerais para escrever um programa em Java Um programa em Java é constituído de uma ou mais classes delimitadas por chaves { }, onde uma destas classes, obrigatoriamente possui um método chamada main(). As principais regras são: ü ü ü ü ü ü ü Letras maiúsculas e minúsculas são tratadas como caracteres diferentes; O formato do texto é livre; O método main(){} especifica onde o programa começa e termina de ser executado; Todos os comandos são terminados por ponto e vírgula; Todas as variáveis devem ser declaradas; { método começa a ser executado; } método termina de ser executado. Programa exemplo dd/mm/aaaa]. (1): Imprimir a data no seguinte // -------------------------------------------- Fonte: Prog1.java package prog1; public class Prog1 { public static void main(String[] args) { int dia, mes, ano; } dia = 2; mes = 6; ano = 2013; System.out.printf("Data: %02d/%02d/%04d\n", dia, mes, ano); } Resultado do Programa: Data: 02/06/2013 // formata os campos da data ou // -------------------------------------------- Fonte: Prog1.java package prog1; public class Prog1 { } public static void main(String[] args) { int dia = 2; int mes = 6; int ano = 2013; System.out.println("Data: " + dia + "/" + mes + "/" + ano); } 7 formato: [Data: Resultado do Programa: Data: 2/6/2013 // não formata a data 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 (não usadas) byte continue extends for int null return synchronized true case default false if interface package short this try Observação: As palavras reservadas não podem ser utilizadas pelo programador como nome de variáveis, constantes, argumentos, atributos ou métodos, ou seja, não servem como identificadores. 2.5 Declaração de variáveis Sintaxe: tipo_dado_base lista_de_variáveis; tipo_dado_base: deve ser um tipo de dado válido (boolean, char, int, byte, short, long, float, double ou void) lista_de_variáveis: um ou mais identificadores separados por vírgula. Exemplo: int i, j ,k; float a, b; char ch; 2.5.1 Onde as variáveis podem ser declaradas ü ü ü Definidas fora de todas os métodos, incluindo o método main() são chamadas de variáveis globais e podem ser acessadas em qualquer parte do programa. Estas variáveis são alocadas estaticamente na memória RAM (Random Access Memory – Memória de acesso randômico). Quando definidas dentro de um método são chamadas de variáveis locais e só podem ser acessadas dentro deste método. Estas variáveis são alocadas dinamicamente na memória RAM. Na declaração de parâmetros formais (argumentos) de um método. Sendo estas locais e alocadas dinamicamente na memória RAM. Observação: Memória ROM (Read Only Memory – Memória somente de leitura). Alocação de memória: (Reserva de espaço de memória (RAM) para alocar uma variável) ü ü Alocação estática de memória: Tipo de alocação de memória em que uma variável é alocada (tem um espaço reservado) na memória RAM durante toda a execução do programa. Este espaço de memória é desalocado somente quando o programa acaba. Alocação dinâmica de memória: Tipo de alocação de memória em que uma variável é alocada (tem um espaço reservado) na memória RAM temporariamente. Este espaço de memória é desalocado quando o 8 espaço não é mais necessário (coleta automática de lixo – garbage collector). Programa exemplo (2): O programa realiza uma operação de potência Xy. // -------------------------------------------- Fonte: Prog2.java package prog2; import java.util.Scanner; public class Prog2 { // importar classe Scanner // definição da classe Prog2 static double resultado; // variável global public static void main(String[] args) { // definição das variáveis locais Scanner entrada = new Scanner (System.in); String s; double base, expoente; // método que permite imprimir na tela em modo texto System.out.print("Base: "); // método que permite entrada de dados via teclado em terminal texto s = entrada.nextLine(); // método que converte String em double base = Double.parseDouble(s); System.out.print("Expoente: "); s = entrada.nextLine(); expoente = Double.parseDouble(s); // chamada do método POT resultado = POT(base, expoente); // método que imprime na tela com formatação do número System.out.printf("Resposta = %7.2f\n", resultado); } // ---------------------------------- método estático POT static double POT (double x, double y) { // corpo do método POT definido pelo programador // os argumentos x e y são variáveis locais // definição de uma variável local double resp; resp = Math.exp(Math.log(x) * y); return(resp); // retorno do método } } Resultado do Programa: Base: 3 <enter> Expoente: 4 <enter> Resposta = 81,00 Variáveis globais: resultado Variáveis locais: base, expoente, resp, x, y Compilar por linha de comandos (via terminal): $ javac Prog2.java <enter> $ // gera arquivo Prog2.class 9 Executar por linha de comandos (via terminal): $ java Prog2 <enter> // executa o arquivo Prog2.class 2.5.2 Inicialização de variáveis Em Java é possível fornecer valores iniciais a maioria das variáveis ao mesmo tempo em que elas são declaradas, colocando um sinal de igual e uma constante após o nome da variável. tipo_dado_base nome_da_variável = constante; Exemplos: char ch = 'a'; // tipo_dado_base nome_da_variável = constante_caracter String s = “Pelotas”; // tipo_dado_base nome_da_variável = constante_string int n = 0; // tipo_dado_base nome_da_variável = constante_inteira float y = 123.45f; // tipo_dado_base nome_da_variável = 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 não pode alterar. As constantes podem ser de qualquer tipo básico. Tipo Exemplos de constantes char int float String '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 programação Java permite especificar constantes inteiras em octal. Uma constante octal começa com um 0 (zero) antes dos demais números. Exemplos: int hexadecimal = 0xf; int octal = 011; // 15 em decimal // 9 em decimal Observações: ü ü Qualquer número octal é formado por oito números ( 0 .. 7 ). Qualquer número hexadecimal é formado por dezesseis números (0 ..9, A, B, C, D, E, F). // ------------------------------------------------------------- Fonte: Hexadecimal.java package hexadecimal; public class Hexadecimal { public static void main(String[] args) { for (int decimal = 0;decimal < 16; decimal++) { String hexaDecimal = Integer.toHexString(decimal); System.out.println("Decimal: " + decimal); 10 } System.out.println("Hexadecimal: " + hexaDecimal); // int hexaToDecimal = Integer.parseInt(hexaDecimal, 16); // System.out.println("Hexadecimal para Decimal: " + hexaToDecimal); } } Resultado do Programa: Decimal: 0 Hexadecimal: Decimal: 1 Hexadecimal: Decimal: 2 Hexadecimal: Decimal: 3 Hexadecimal: Decimal: 4 Hexadecimal: Decimal: 5 Hexadecimal: Decimal: 6 Hexadecimal: Decimal: 7 Hexadecimal: Decimal: 8 Hexadecimal: Decimal: 9 Hexadecimal: Decimal: 10 Hexadecimal: Decimal: 11 Hexadecimal: Decimal: 12 Hexadecimal: Decimal: 13 Hexadecimal: Decimal: 14 Hexadecimal: Decimal: 15 Hexadecimal: Decimal: 16 Hexadecimal: 0 1 2 3 4 5 6 7 8 9 a b c d e f 10 2.6.2 Constantes Strings Uma String é um conjunto de caracteres delimitados por aspas duplas que pode conter letras, números e caracteres especiais. Em Java existe uma classe específica para trabalhar com Strings (classe String). Exemplo: String s = "Senac"; 0 ‘S’ 1 ‘e’ 2 ‘n’ 3 ‘a’ 4 ‘c’ Figura 1: String Vetor de Strings: String [] s = {“Paulo”, “Roberto”, “Gomes”, “Luzzardi”}; Vetor de caracteres: char [] s = {'U', 'C', 'P', 'e', 'l'}; 11 2.6.3 Constantes especiais As constantes especiais são usadas para representar caracteres que não podem ser inseridos pelo teclado. São elas: Tabela 1: Constantes especiais Constante ‘\b’ ‘\f’ ‘\n’ ‘\r’ ‘\t’ ‘\”’ ‘\’’ ‘\\’ ‘\o’ ‘\x’ Significado Retrocesso Alimentação de formulário 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. Exemplo: import javax.swing.JOptionPane; Pacote: javax.swing Classe: JOptionPane Chamada de um dos Métodos da classe JOptionPane: JOptionPane.showMessageDialog(); Sintaxe: nomeClasse.nomeMétodo(lista_de_argumentos); 12 // chamada de métodos estáticos 3. Tipos de dados 3.1 Tipos básicos A tabela abaixo exibe os oito (8) tipos de dados básicos que podem ser utilizados pelo programador para definir suas variáveis. Na Tabela 2 são exibidos os tipos básicos, a quantidade de bits, a faixa de valores válida e o número de bytes que cada tipo de dados ocupa na memória RAM (memória principal) ou em disco (quando armazenados na memória secundária). 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.40239846e-46 à 3.40282347e+38 4.94065645841246544e-324 à 1.7976931348623157e+308 3.2 Escrevendo uma classe em Java 3.2.1 Conceitos básicos O paradigma orientado à objetos possui cinco componentes básicos: objetos (possui atributos e métodos), mensagens (chamada dos métodos), classes (tipo de dado), instâncias (criação de objetos de uma classe específica - new) e métodos (funções definidas pelo programador que manipulam os atributos). Objetos, mensagens, classes, instâncias e métodos Objetos são entidades lógicas que contém atributos (dados armazenados em variáveis) e métodos (funções) que manipulam estes dados. Um objeto pode ser definido através de um tipo de dado chamado classe (class). Resumo: a) Atributos: São as variáveis definidas e declaradas para cada objeto. b) Métodos: São as funções definidas pelo programador que servirão para manipular os atributos. c) Mensagens: São as chamadas dos métodos. d) Classe: É um tipo de dado definido por class. Uma classe não é um objeto, é sim uma descrição do objeto. e) Instância: Os objetos são instâncias de uma classe, ou seja, é criado um objeto pertencente a uma classe específica. O objeto pode responder chamadas dos métodos e armazenar informações nos atributos. Resumidamente, objetos são instâncias de classes que respondem as mensagens através dos métodos escritos pelo programador. ou Uma linguagem de programação orientada à objetos pode suportar implementar seis propriedades: abstração, encapsulamento, 13 polimorfismo, herança, associação (agregação e composição) e classes abstratas e concretas. 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); v.exibe(); // testar o limite do vetor de 5 elementos } } Resultado do Programa: Vetor: [10 20 30 40 50 ] Erro: Vetor excedeu Limite Vetor: [10 20 30 40 50 ] 14 Tente implementar os seguintes métodos para a classe Vetor: v.remove(); v.exibe(); 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("Não Existe elemento 20"); } v.removeElemento(elemento); v.exibe(); v.removePosicao(1); v.exibe(); Uma linguagem de programação orientada à objetos pode suportar e/ou implementar seis (6) propriedades: abstração, encapsulamento, polimorfismo, herança, associação (agregação e composição) e classes abstratas e concretas. Abstração Objetos devem representar dados do mundo real. Encapsulamento (“encapsulação”) Os objetos possuem internamente atributos e métodos agrupados no mesmo local, onde os métodos manipulam os atributos. Esta característica protege os dados (atributos) de alterações indevidas, somente os membros da classe podem acessar os atributos, desde que eles sejam privados (private) ou protegidos (protected) (caso das classes derivadas, que herdam o direito de acesso aos atributos). Polimorfismo (grego: “muitas formas”) É a capacidade de objetos diferentes reagirem segundo a sua função a uma ordem padrão. Significa que o nome de um objeto pode ser utilizado para vários propósitos ligeiramente diferentes, ou seja, “ ... uma interface, vários métodos ... ”. A característica de polimorfismo é utilizada principalmente na sobrecarga de métodos, sobrecarga de operadores e nas classes abstratas, onde os métodos são declarados mas não definidos. Como tipos de polimorfismo tem-se: (a) Universal (inclusão [como em Java, por exemplo, List lista = new LinkedList();] e paramétrico [templates como em C++]) e (b) ad-hoc (sobrecarga de métodos e operadores). Java não possui sobrecarga de operadores. • Sobrecarga de Operador: Permite sobrecarregar realizar diferentes tipos de operações; • Sobrecarga de Método: Permite que um método retorne diferentes tipos de informações e aceite argumentos de vários tipos, inclusive com quantidade diferentes de argumentos; • Classes abstratas e concretas: Permite representar entidades e conceitos abstratos, sendo sempre uma superclasse (ou classe Base) e não permite ser instanciada, a classe abstrata apenas define um modelo (template) para uma funcionalidade e fornece uma implementação incompleta que é herdada pelas classes 15 operadores para derivadas. Cada classe derivada implementa as funcionalidades da classe abstrata. Uma classe abstrata pode possuir métodos abstratos, mas os métodos são escritos nas classes derivadas concretas. Métodos abstratos definem apenas a forma do método não contendo nenhum tipo de código. Classes concretas implementam todos os métodos e podem ser instanciadas. Herança É o processo pelo qual uma classe de objetos pode adquirir as propriedades de outra classe de objetos, em outras palavras, um objeto herda as características de outro (herança simples) ou vários objetos (herança múltipla). A classe Base é chamada de superclasse, enquanto a classe derivada pode ser chamada de subclasse. Associação É um vínculo que permite que objetos de uma ou mais classes se relacionem entre si. Esta associação pode ser: unária (o vínculo é entre objetos da mesma classe), binária (vínculo ocorre entre dois objetos de classes diferentes) ou múltipla (vínculo ocorre entre mais de 2 objetos de classes diferentes). Cada associação pode possuir características de (a) cardinalidade ou multiplicidade (indica quantos objetos são possíveis em cada associação) e (b) navegação (existe a possibilidade dos objetos acessarem outros objetos da mesma associação). Uma associação pode ser de duas formas: agregação (Relacionamento com características onde existe um grau menos intenso de coesão entre os elementos, pode haver um certo grau de independência) ou composição (relacionamento com características onde existe um alto grau de coesão e total grau de dependência entre os elementos). Classes Abstratas e Concretas É criada para representar entidades e conceitos abstratos. Uma classe abstrata é sempre uma superclasse ou classe base que não possui instâncias. Ela define apenas o modelo (como um template em C++) para uma funcionalidade e fornece uma implementação incompleta chamada de parte genérica sendo compartilhada por um conjunto de classes derivadas ou subclasses. As classes derivadas completam as funcionalidades da classe abstrata anexando um comportamento específico. Classes abstratas possuem métodos abstratos. Esses métodos são implementados nas suas classes derivadas concretas com o objetivo de definir o comportamento específico. O método abstrato define apenas a assinatura do método não contendo nenhum código. Classes concretas implementam seus métodos e permitem instanciar objetos. Classes concretas não possuem métodos abstratos quando são classes derivadas de uma classe abstrata. Vantagens da Orientação a Objetos: (a) reutilização de código, (b) proteção aos dados; (c) organização ou estruturação dos dados em forma de classes e objetos; (d) sobrecarga de métodos e de operadores; (e) criação de pacotes de classes; (f) ter um conjunto de pacotes prédefinidos (api’s: java2d, java3d, swing, awt, etc) e (g) permitir ao desenvolvedor criar seus próprios pacotes. Em Java, o programador pode criar suas próprias classes. Uma classe possui duas partes distintas: atributos (variáveis) e métodos (funções ou procedimentos) que manipulam estes atributos. 16 3.2.2 Referência this Em java, quando um método de uma classe é chamado, é passado automaticamente um argumento que é uma referência para o objeto que gerou a chamada. Esta referência é chamada “this”, ou seja, a referência “this” referencia o objeto que chamou o método. Cada objeto tem acesso a uma referência a ele próprio, chamada this. Esta referência faz referências aos atributos e métodos de um objeto. Exemplo da utilização da referência 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 método 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); } Resultado do Programa: Data: 03/09/2011 3.2.3 Lista de exercícios sobre Classes 3.2.3.1 Dado o seguinte Circulo e seus métodos: programa principal, implemente // ------------------------------------------ TestaCirculo.java package testacirculo; public class TestaCirculo { public static void main(String[] args) { 17 a classe Circulo circ = new Circulo(); circ.setaRaio(3); circ.calculaArea(); double area = circ.getArea(); System.out.printf("Área: %.2f\n", area); } } 2 Observação: area = pi . raio onde pi é 3.1416 Círculo double area, raio setaRaio calculaArea getArea Diagrama de classe Resultado do Programa: Área: 28,27 3.2.3.2 Dado o seguinte programa principal, implemente a classe PesoIdeal e seus métodos: // --------------------------------------------- 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()); } } Resultado do Programa: Peso Ideal Homem: 63,41 Peso Ideal Mulher: 57,77 Cálculo 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 métodos: // --------------------------------------------------------------- ValidaCPF.java package validacpf; public class ValidaCPF { public static void main(String[] args) { String s = "123456789"; CPF cpf = new CPF(s); 18 int digitoVerificador = cpf.verificaCPF(); System.out.printf("Digito verificador: %02d\n", digitoVerificador); System.out.printf("CPF: %s-%02d\n", s , digitoVerificador); } } Resultado do Programa: Digito verificador: 09 CPF: 123456789-09 CPF String cpf int digito verificaCPF Diagrama de classe Como calcular os Dígitos do CPF: Entrada: CPF: 123456789 1) Primeiramente pega-se os dígitos da base do CPF e se faz a soma da multiplicação individual dos dígitos, 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 dígito é o resultado da subtração de 11 pelo resto da divisão da soma acima por 11. Se este valor for 10 ou 11, o dígito é 0 (zero), do contrário é o próprio valor. No exemplo em questão o dígito encontrado é calculado conforme vê-se a seguir: 11 - (210 % 11) = 10 3) O cálculo do segundo dígito é feito da mesma forma que o primeiro, porém com os 9 dígitos da base do CPF e o primeiro dígito 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 dígito é o resultado da subtração de 11 pelo resto da divisão da soma acima por 11. Se este valor for 10 ou 11, o dígito é 0 (zero), do contrário é o próprio valor. No exemplo em questão o dígito encontrado é calculado conforme vê-se a seguir: 11 - (255 % 11) = 9 Saída: CPF válido é 123.456.789-09 ou 123456789-09 3.2.3.4 Dado o seguinte programa principal, implemente a classe DiaSemana e seus métodos: // ------------------------------------------------------- TestaDiaSemana.java package testadiasemana; public class TestaDiaSemana { public static void main(String[] args) { DiaSemana dia = new DiaSemana(18, 12, 2007); dia.verificaDiaSemana(); dia.exibeDiaSemana(); } } 19 Resultado do Programa: Dia da Semana: Terça-Feira DiaSemana int dia, mes, ano String semama verificaDiaSemana exibeDiaSemana Diagrama de classe Como calcular o Dia da Semana: Deve-se calcular o Dia do Século: Para qualquer cálculo com datas é essencial que se disponha do Dia do Século para a(s) data(s) em questão. O Dia do século é o número de dias decorridos desde o inicio do século (1º de janeiro de 1901) até a data em questão. Se usa como referência 1901 porque a maioria das datas com as quais se trabalha ainda são do século passado. Lá por 2040 ou mais poderá se mudar para 2001. A fórmula (válida para datas entre 1901 e 2099) é a seguinte: Dia_do_Seculo = (ano - 1901) * 365 + (ano - 1901) DIV 4 + dia + (mês - 1) *31 - [(mês * 4 + 23) DIV 10] * [(mês + 12) DIV 15] + [(4 - ano MOD 4) DIV 4) * [(mês + 12) DIV 15] Entrada: Dia [1..31]: 18 Mês [1..12]: 12 Ano [1901..2099]: 2007 Dia_do_Seculo = 39.068 (para a data acima) Verificação do Dia da Semana: Para saber o Dia_da_Semana basta dividir por 7 e entrar com o resto na tabela abaixo: 0 1 Segunda Terça 2 3 Quarta Quinta 4 5 6 Sexta Sábado Domingo Resultado do Programa: 18/12/2007 é uma Terça-Feira Observação: DIV é divisão inteira de dois números e MOD é o resto inteiro da divisão de dois números 3.2.3.5 Dado o seguinte programa principal, implemente a classe Data e seus métodos: // ------------------------------------------------- TestData.java package testdata; public class TestData { public static void main(String[] args) { Data data = new Data(); } data.setaData(4, 9, 2011); data.extenso(); } Resultado do Programa: Data: 4 de setembro de 2011 20 Data int dia, mes, ano setaData extenso Diagrama de classe 3.2.3.6 Implemente os métodos “sortForcaBruta” classe Vetor vista no item 3.2. e “bubleSort” na v.sortForcaBruta(); v.exibe(); v.bubbleSort(); v.exibe(); 3.2.3.7 Dado o seguinte programa principal, implemente a classe Pessoa e seus métodos. // --------------------------------------------------- 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(); } } 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 int ano int idade char sexo setaDados calculaIdade exibePessoa Diagrama de classe 3.2.3.8 Dado o seguinte programa principal, implemente a classe Pessoa e seus métodos. // ----------------------------------------------------- TestaPessoa2.java package testapessoa2; public class TestaPessoa2 { public static void main(String[] args) { Pessoa [] pessoa = new Pessoa[3]; 21 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(); 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 int ano int idade char sexo setaDados calculaIdade exibePessoa Diagrama de classe 3.2.3.9 Dado o seguinte programa principal, implemente a classe Pessoa e seus métodos. // -------------------------------------------------- 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("Fátima", 15); pessoa.insereDados("Geni", 16); pessoa.insereDados("Carla", 12); pessoa.insereDados("Eva", 14); pessoa.insereDados("Ana", 10); pessoa.exibeDados(); pessoa.sort(); pessoa.exibeDados(); } } Resultado do Programa: Lista Nome: Nome: Nome: Nome: Nome: Nome: de Pessoas Beatriz Debora Fátima Geni Carla Eva Idade: Idade: Idade: Idade: Idade: Idade: 11 13 15 16 12 14 22 Nome: Lista Nome: Nome: Nome: Nome: Nome: Nome: Nome: Ana de Pessoas Ana Beatriz Carla Debora Eva Fátima Geni Idade: 10 Idade: Idade: Idade: Idade: Idade: Idade: Idade: 10 11 12 13 14 15 16 Pessoa String [] nome int [] idade int n insereDados exibeDados sort Diagrama de classe 3.2.3.10 Dado o seguinte programa principal, implemente a classe Agenda e seus métodos. // ------------------------------------------------------- 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("Fátima", "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: Usuário não Encontrado"); } fone = "99810123"; nome = agenda.consultaNome(fone); if (nome.compareTo("") != 0) { System.out.println("Nome: " + nome + " - Telefone: " + fone); } else { System.out.println("ERRO: Usuário não Encontrado"); } } } Resultado do Programa: ERRO: Excedeu limite do Vetor Nome: Eva - Telefone: 99815678 ERRO: Usuário não 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; 23 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(); 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("Não Existe elemento: " + elemento); } v.removeElemento(elemento); v.exibe(); v.removePosicao(1); v.exibe(); } } // -------------------------------------------------- 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 24 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; } } } 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); } } 25 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] Vetor: [10 40] Exemplo da definição de uma classe “Data”: // ----------------------------------------------- Fonte: Data.java package data; public class Data { private int dia, mes, ano; // atributos da classe public Data(int dd, int mm, int aa) { dia = dd; mes = mm; ano = aa; } // construtor da classe // ------------------------------- sobrecarga do método 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 definição 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; // ............................................. métodos públicos da classe public Calculadora () { erro = 0; } // construtor // ---------------------------- entradaDados 26 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 void operaCalculadora() { final double pi = 3.14158; double rads; switch (op) { case '+': case '-': case '*': case '/': case 'R': case 'r': case 'P': case 'p': case 'S': case 's': case 'C': case 'c': case 'T': case 't': } 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; // potencia // seno resp = cosseno(x); break; // cosseno 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); } 27 } // ................................................ métodos 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); } } 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 28 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”: // ---------------------------------------------- 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 função “strChr” oriunda da linguagem C usando o método “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)); } } Resultado do Programa: Nome: Paulo Roberto Gomes Luzzardi <enter> Paulo Roberto Gomes Luzzardi seu nome tem 28 caracteres Continua [S/N]? N <enter> Modificadores de Acesso: • public: Os atributos e métodos tornam-se públicos, ou seja, qualquer outro método pode chamar ou utilizar estes atributos e/ou métodos. • private: Somente os métodos da classe (membros) da classe podem chamar ou utilizar atributos ou métodos privados. 29 • protected: Utilizado em herança simples de classe (construção de subclasses), ou seja, uma subclasse herda todos os atributos e métodos da classe base (superclasse). Deixa acessível os atributos e/ou métodos para todas as outras classes (classe base) e subclasses (classe derivada). 3.3 Sobrecarga de métodos em Java Java permite que métodos estáticos sejam sobrecarregados, desta forma, o retorno, número de argumentos ou mesmo o tipo de dados dos argumentos possam ser diferentes. // ------------------------------------------ Fonte: SobreCarga.java package sobrecarga; 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); } Resultado do Programa: String: Senac-RS Double: 123.45 Float: 123.45 Inteiro: 123 Caracter: A 30 4. Métodos de entrada e saída de dados A seguir são mostrados alguns métodos que permitem fazer entrada de dados via teclado e saída 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); System.out.print("Inteiro: "); String s = input.nextLine(); int x = Integer.parseInt(s); System.out.println("Valor: " + x); // ou x = input.nextInt(); } } Resultado do Programa: Inteiro: 7 <enter> Valor: 7 A seguir é visto um exemplo de entrada de dados usando o pacote swing. Programa exemplo (9): Entrada de dados via teclado em caixa de diálogo gráfica sobreposta a interface usando a biblioteca “swing”. // --------------------------------------------- Fonte: Prog9.java package prog9; import javax.swing.*; // carrega toda a biblioteca swing public class Prog9 { public static void main(String[] args) { String s = JOptionPane.showInputDialog("String: "); int x = Integer.parseInt(s); JOptionPane.showMessageDialog(null, "Inteiro: " + x, "Resultado", JOptionPane.PLAIN_MESSAGE); // JOptionPane.showMessageDialog(null, "Inteiro: " + x); // funciona também, pois os dois últimos argumentos podem ser suprimidos } } 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“ . 31 // ----------------------------------------------- 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"); } } Resultado do Programa: Nome: Paulo Roberto <enter> Nome: Paulo Roberto tem 13 caracteres 4.2 Saída de dados via tela A seguir é visto um exemplo de saída de dados na tela usando o método “System.out.print”. Programa exemplo (11): Saída de dados via tela usando o método “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); } Resultado do Programa: Inteiro: 16 <enter> Valor: 16 Valor: 016 A seguir é visto um exemplo de saída de dados na tela usando o pacote swing. Programa exemplo (12): Saída de dados via tela em caixa de diálogo gráfica sobreposta a interface usando a biblioteca “swing”. // ------------------------------------------ Fonte: Prog12.java 32 package Prog12; import javax.swing.*; // carrega toda a biblioteca swing public class Prog12 { 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); } } Sintaxe: JOptionPane.showMessageDialog(null, “x = ” + x, “Título”, JOptionPane.PLAIN_MESSAGE); null significa que a mensagem será centralizada “x = “ + x significa que sairá na caixa de dialogo x = 5 (por exemplo) “Título” significa o título da caixa de diálogo JOptionPane.PLAIN_MESSAGE significa caixa sem ícone Tabela 3: Tipos de Ícones Tipo de Ícone Ícone de erro Ícone de informação “i” Ícone de advertência “!” Ícone de pergunta “?” Sem ícone Tipo de Mensagem JOptionPane.ERROR_MESSAGE JOptionPane.INFORMATION_MESSAGE JOptionPane.WARNING_MESSAGE JOptionPane.QUESTION_MESSAGE JOptionPane.PLAIN_MESSAGE 33 5. Operadores São símbolos especiais que obrigam determinadas operações. Estas operações comparativas ou lógicas. o compilador a executar podem ser aritméticas, 5.1 Operadores aritméticos São operadores que realizam uma operação matemática. Tabela 4: Operadores aritméticos Operador aritmético + * / % -- ++ Ação Subtração Adição Multiplicação Divisão Resto inteiro da divisão Decremento/incremento Precedência dos operadores aritméticos (Hierarquia nas Operações) Tabela 5: Precedência dos operadores aritméticos Hierarquia 1 2 3 4 5 6 Operação Parênteses Métodos ++ -- (menos unário) * / % + - Observação: Quando houver duas ou mais operações de mesma hierarquia, o compilador executa-as da esquerda para a direita. 5.2 Operadores relacionais São operadores que permitem comparar valores, ou seja, utilizados principalmemte em comandos que possuem condições. são Tabela 6: Operadores relacionais Operador > >= < <= == != Ação Maior que Maior ou igual a Menor que Menor ou igual Igual a Diferente de 5.3 Operadores lógicos São condição. Exemplo: operadores utilizados em comandos que if (condição1 && condição2 || condição3) Tabela 7: Operadores lógicos Operador lógica && ou & || ou | ! Ação AND (e) OR (ou) NOT (não) 34 tem mais de uma Observação: $$ e || são chamados Short Circuit Operator, ou seja, quando o resultado das condições não puder mais ser alterado, há um truncamento nas próximas condições. Precedência (Hierarquia dos operadores) Tabela 8: Precedência dos operadores relacionais e lógicos Hierarquia 1 2 3 4 5 Operação ! > >= < == != && || <= Observação: As expressões que utilizam operadores relacionais e lógicos retornam 0 (zero) para falso e !0 (não zero) para verdadeiro, ou seja: true é diferente de 0 (!= 0) e false é igual 0 (== 0) 5.4 Incremento e decremento São operadores aritméticos que permitem realizar operações de soma e subtração de forma simplificada. ü ü ++ adiciona (1) ao operando subtrai (1) ao operando As seguintes operações são equivalentes: x++; x = x + 1; x--; x = x - 1; Observação: Os operadores (++ ou --) podem ser colocados antes ou depois do operando. Quando precede seu operando, Java efetua a operação 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: Equivalência x = 10; y = ++x; // // y será 11 x será 11 x = 10; x = x + 1; y = x; x = 10; y = x++; // // y será 10 x será 11 x = 10; y = x; x = x + 1; 5.5 Operador de atribuição O operador de atribuição é o sinal de igual =. A sintaxe do operador de atribuição pode ser escrito em uma das seguintes formas: variável variável variável variável = = = = constante; variável; expressão; método(x); x x x x 35 = = = = 3; y; a + b; Math.sqrt(y); 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); // atribuição – cálculo da idade idade = ano_atual - ano_nasceu; System.out.println("Sua IDADE é " + idade); } } Resultado do Programa: Ano ATUAL: 2013 <enter> Ano de NASCIMENTO: 1962 <enter> Sua IDADE é 51 A linguagem de programação Java permite utilizar o operador de atribuição em expressões, junto com operadores matemáticos, lógicos, relacionais, chamada de métodos, e outros (como foi mencionado acima). if ((produto = x * y) < 0) Funcionamento: Primeiramente Java atribui o valor x * y a variável produto, para depois avaliar a expressão, ou seja, comparar se o produto é menor (<) que zero. 5.6 Casts É possível forçar que o resultado de uma expressão seja de um determinado tipo. Para tanto deve ser utilizado uma construção chamada de cast, ou seja, pode ser utilizado para "tipar" uma variável com um tipo diferente do resultado da expressão. variável = (tipo) expressão; Programa exemplo (14): O programa imprime na tela o resultado de uma divisão. // -------------------------------------------- Fonte: Prog14.java package Prog14; import java.util.Scanner; public class Prog14 { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); 36 String s; int x, y; float resp; System.out.print("x = "); s = entrada.nextLine(); x = Integer.parseInt(s); System.out.print("y = "); s = entrada.nextLine(); y = Integer.parseInt(s); // é necessário um cast (float) pois a divisão de dois resp = (float) x / y; // inteiros resulta em um inteiro System.out.printf("Divisao = %.2f\n", resp); } } Resultado do Programa: x = 3 <enter> y = 4 <enter> Divisao = 0,75 Observação: 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 atribuído a variável resp seja float. 5.7 Expressões Uma expressão em Java é qualquer combinação válida de operadores (aritméticos, relacionais, lógicos), constantes, variáveis e métodos. Exemplo: c = Math.sqrt (a) + b / 3.4; 37 6. Métodos para funções matemáticas padrões Java possui uma classe: Math que possui diversos métodos para resolver funções matemáticas. Algumas são descritas a seguir: 6.1 Math.abs O método 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 método Math.asin retorna o valor do arco seno. A variável x deve estar em radianos. Sintaxe: double Math.asin (double x); Faixa: -pi / 2 à pi / 2 6.3 Math.acos O método Math.acos retorna o valor do arco cosseno. A variável x deve estar em radianos. Sintaxe: double Math.acos (double x); Faixa: 0 à pi 6.4 Math.atan O método Math.atan retorna o valor do arco tangente. A variável x deve estar em radianos. Sintaxe: double Math.atan (double x); Faixa: -pi / 2 à pi / 2 6.5 Math.sin O método Math.sin retorna o valor do seno. A variável x deve estar em radianos. Sintaxe: double Math.sin (double x); Faixa: -1 à 1 6.6 Math.cos O método Math.cos retorna o valor do cosseno. A variável x deve estar em radianos. Sintaxe: double Math.cos (double x); Faixa: -1 à 1 38 6.7 Math.tan O método Math.tan retorna o valor da tangente. A variável x deve estar em radianos. Sintaxe: double Math.tan (double x); 6.8 Math.exp O método Math.exp retorna o valor do expoente (ex). Sintaxe: double Math.exp (double x); 6.9 Math.pow O método Math.pow (power) retorna o valor da potência (xy). Sintaxe: double Math.pow (double x, double y); 6.10 Math.sqrt O método quadrada. Math.sqrt (square root) retorna o valor da raiz Sintaxe: double Math.sqrt (double x); 6.11 Math.log O método Math.log retorna o valor do logaritmo natural. Sintaxe: double Math.log (double x); 6.12 Double.parseDouble O método Double.parseDouble converte string em ponto flutuante. Sintaxe: double Double.parseDouble (String s); 6.13 Integer.parseInt O método aInteger.parseInt converte uma string em inteiro. Sintaxe: int Integer.parseInt (String s); 6.14 Long.parseLong O método Long.parseLong converte uma string em inteiro longo. Sintaxe: long Long.parseLong (String s); 6.15 Math.log10 O método Math.log10 retorna o logarítmo na base 10. Sintaxe: double Math.log10 (double x); 39 6.16 Math.random O método Math.random retorna um número double aleatário. 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 número de 1 até n 6.17 Math.PI O método Math.PI retorna o valor do pi radianos. Sintaxe: double Math.PI (void); Valor: 3.141592653589793 6.18 Conversão de graus para radianos Figura 2: Conversão de graus para radianos Conversão de graus para radianos: rads = graus * Math.PI / 180.0; Conversão de radianos para graus: graus = rads * 180.0 / Math.PI; 40 7. Comandos 7.1 Tipos de comandos 7.1.1 Sequência São comandos, que no fluxo de controle do programa, são sempre executados passando a execução para a próxima instrução, ou seja, todos os comandos de seqüência são executados desde que eles não dependem de um comando de seleção. Exemplo: (todas as instruções abaixo são de seqüência) System.out.print("Digite uma letra: "); // imprime na tela s = entrada.nextLine(); // entrada de dados via teclado resp = valor * 1.25; // atribuição é um comando de seqüência 7.1.2 Seleção São comandos, que no fluxo de controle do programa, permitem a seleção entre duas ou mais instruções, ou seja, este tipo de comando faz com que alguns comandos não sejam executados. Exemplo: if (numero % 2 == 0) { // testa se o número é par ou ímpar System.out.println("Número: PAR"); } else { System.out.println("Número: ÍMPAR"); } ou Programa Exemplo (15): Programa extrai a raiz quadrada de um número. // ------------------------------------------ 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 instrução 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); } } Resultado do Programa: Digite um valor: 12 <enter> Raiz Quadrada: 3,46 41 Operador Ternário (?): Funcionamento: Se a condição for verdadeira, executa comando1 senão executa comando2. condição ? 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); } } Resultado do Programa: Digite Digite menor: maior: um Valor: 45 <enter> outro Valor: 34 <enter> 34 45 7.1.3 Repetição São comandos, que no fluxo de controle do programa, permitem a repetição de uma ou mais instruções. 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) { 42 final int n = 10; int i = 0; do { System.out.println("n = " + i); i++; } while (i < n); } } Resultado do Programa: n n n n n n n n n n = = = = = = = = = = 0 1 2 3 4 5 6 7 8 9 7.2 Comando if O comando if é um comando de seleção que permite selecionar um comando entre dois outros comandos (comandos simples) ou dois conjuntos de comandos (comandos compostos). Isto é feito através da avaliação de uma condição. O resultado desta avaliação (teste da condição) pode ser verdadeiro (true) ou falso (false). Dependendo deste resultado um dos comandos é executado e o outro não. Sintaxe: if (condição) { comando 1; } else { comando 2; if (condição) { comando; } ou } Observação: O else é opcional. Se a condição for avaliada como verdadeira (qualquer valor diferente de 0), o comando 1 será executado, caso contrário (condição 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 (condição) { comando 1; comando 2; } else { comando 3; comando 4; } if (condição) { comando 1; comando 2; comando 3; } // todos os comando são compostos Programa exemplo (17): O usuário digita um número e o programa diz se este é par ou ímpar. // ------------------------------------------- Fonte: Prog17.java 43 package prog17; import javax.swing.*; public class Prog17 { public static void main(String[] args) { String s; int numero; s = JOptionPane.showInputDialog("Digite um número: "); numero = Integer.parseInt(s); if ((numero % 2) == 0) { JOptionPane.showMessageDialog(null, "Número é PAR", "Números", JOptionPane.PLAIN_MESSAGE); } else { JOptionPane.showMessageDialog(null, "Número é IMPAR", "Números", JOptionPane.PLAIN_MESSAGE); } } } 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 usuário digita um número 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 número: "); num = Integer.parseInt(s); if (num == 0) { JOptionPane.showMessageDialog(null, "Número é Zero", "Verifica", JOptionPane.PLAIN_MESSAGE); } else { if (num > 0) { JOptionPane.showMessageDialog(null, "Número é Positivo", "Verifica", JOptionPane.PLAIN_MESSAGE); } else { JOptionPane.showMessageDialog(null, "Número é Negativo", "Verifica", JOptionPane.PLAIN_MESSAGE); } } } 7.3 O comando switch O comando switch é um comando de seleção que permite selecionar um comando entre vários outros comandos. Isto é feito através da comparação de uma variável a um conjunto de constantes. Cada um dos comandos está ligado a uma constante. 44 Sintaxe: switch (variável) { case constante_1 : seqüência de comandos; break; case constante_2 : seqüência de comandos; break; . . . default: seqüência de comandos; } O programa testa uma variável sucessivamente constantes inteiras ou caracteres (int, char ou encontrar uma coincidência, o programa executa o comandos que estejam associados àquela constante. executado se não houver nenhuma coincidência. contra uma lista de String). Depois de comando ou bloco de O comando default é O comando break é utilizado para obrigar a saída do comando switch. A opção default é opcional. Observação: A variável não pode ser real (float ou double). Programa exemplo (19): O programa recebe um dígito de 0 à 9 e imprime na tela, este dígito, por extenso. Neste exemplo a variável dígito é 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, "Três", "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; 45 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: Não é um Dígito", "Digito", JOptionPane.PLAIN_MESSAGE); } } } Programa exemplo (20): O programa recebe um dígito de 0 à 9 e imprime na tela, este dígito, por extenso. Neste exemplo a variável dígito é caracter, por causa disto as constantes estão entre apostrofes. // ----------------------------------------- Fonte: prog20.java package prog20; import javax.swing.*; 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, "Três", "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: Não é um Dígito", "Digito", JOptionPane.PLAIN_MESSAGE); } } } Programa exemplo (21): O programa constrói um menu com três métodos: inclusão, alteração e término. // ------------------------------------------ Fonte: prog21.java package prog21; import java.util.Scanner; 46 public class Prog21 { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; char opcao; System.out.println("[I]nclusão"); System.out.println("[A]lteração"); System.out.println("[T]érmino"); System.out.print("Qual a opção: "); s = entrada.nextLine(); opcao = s.charAt(0); switch (opcao) { case 'i': case 'I': inclusao(); break; case 'a': case 'A': alteracao(); break; case 't': case 'T': termino(); break; default: System.out.println("ERRO: Opção Inválida"); } } static void inclusao() { System.out.println("Opção Escolhida: Inclusão"); } static void alteracao() { System.out.println("Opção Escolhida: Alteração"); } static void termino() { System.out.println("Opção Escolhida: Término"); } } 7.4 Comando while O comando while é um comando de repetição que permite executar um comando (simples) ou vários comandos (composto) diversas vezes. Isto é feito através da avaliação de uma condição. Enquanto a condição for verdadeira os comandos são repetidos. Quando a condição se tornar falsa o comando while é finalizado. O teste da condição é feita no início do comando, ou seja, antes que todos os comandos sejam executados. Observação: Note que os comandos podem não ser executados nenhuma vez, basta a condição começar como falsa. Sintaxe: while (condição) { comando; } ou while (condição) { comando 1; comando 2; } Condição: Qualquer expressão válida em Java com resultado 0 (false) ou !0 (true). Na condição podem ser utilizados ainda variáveis, constantes, métodos, operadores (aritméticos, relacionais e lógicos). Funcionamento do comando: O loop (laço) é repetido enquanto a condição for verdadeira. Quando a condição se tornar falsa o controle do programa passa para a próxima instrução. O laço while verifica a 47 condição no início do laço, por causa disto, normalmente, a variável de controle do laço deve ser inicializado. Exemplo: int i = 0; // inicialização da variável de controle while (i <= 10) { // condição i <= 10 System.out.printf(“i = %d\n”, i); i = i + 1; // incremento } Comando: Pode ser um comando vazio, simples ou composto que serão repetidos. Comando vazio: while (1); // comando while não repete nenhum comando for (int i = 0; i <= 1000; i++); // comando for não repete nenhum comando Verifique: Note que no final dos dois comandos (while e for) existe apenas um ponto-e-vírgula, isto é o sinal de comando vazio, ou seja, os comandos while e for que teriam outros comandos não os tem, caracterizando comandos vazios. Problema freqüente de digitação: Muitas vezes o programador insere um ponto-e-vírgula no final de um comando for ou while por engano. Isto é um grave problema, pois este ponto-e-vírgula (inserido acidentalmente) faz com que os comandos que seriam repetidos, não são. Veja o exemplo abaixo: Exemplo: for (int x = 1; x <= 10; x++); // note o ponto-e-vírgula no final do comando for System.out.printf(“x = %d\n”, x); // é impresso x = 11 na tela, porque? Explicação: O comando System.out.printf não faz parte do comando if devido ao ponto-e-vírgula no comando for. O comando for termina quando a variável 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'; // inicialização da variável de controle while (letra != 'Z') { System.out.printf ("Letra: %c\n", letra); letra++; // incremento } } } Resultado do Programa: Letra: Letra: Letra: Letra: Letra: A B C D E 48 Letra: Letra: Letra: Letra: Letra: Letra: Letra: Letra: Letra: Letra: Letra: Letra: Letra: Letra: Letra: Letra: Letra: Letra: Letra: Letra: F G H I J K L M N O P Q R S T U V W X Y 7.5 O comando for O comando for é um comando de repetição que permite executar um comando (comando simples) ou vários comandos (comando composto) diversas vezes. Isto é feito através da avaliação de uma condição. Enquanto a condição for verdadeira os comandos são repetidos. Quando a condição se tornar falsa o comando for é finalizado. Sintaxe: for (inicialização; condição; incremento ou decremento) { comando; } Exemplos: Com uma variável de controle: for (int i = 0;i < 9;i++) { System.out.println(i); } Com duas variável de controle: for (int i = 1, int j = 5;i != j;i++, j--) { System.out.println(i + “-“ + j); } Inicialização: É um comando de atribuição (ou vários, separados por vírgula) que o compilador utiliza para inicializar a(s) variável(is) de controle do laço. Condição: É uma expressão qualquer, que testa a variável de controle do laço contra algum valor para determinar quando o laço terminará. Incremento ou decremento: Define a maneira como a(s) variável(is) de controle do laço serão alteradas após a repetição do laço. ü ü ü O laço (for) é repetido enquanto a condição é verdadeira. A condição é sempre testada no começo do laço. Qualquer uma das 3 partes do comando for (inicialização; condição; incremento) podem ser qualquer expressão válida em Java. Programa exemplo (23): O programa imprime de 1 até 10 na tela. // --------------------------------------------- Fonte: prog23.java package prog23; public class Prog23 { 49 public static void main(String[] args) { for (int i = 1; i <= 10; i++) { // inicialização: i = 1 System.out.printf("%d\n",i); // condição: i <= 10 } // incremento: i++ } } Programa exemplo (24): O programa imprime na tela: // --------------------------- Fonte: Prog24.java i i i i = = = = 1 2 3 4 – – j j j j = = = = 9 8 7 6 package prog24; public class Prog24 { 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); } } } Resultado do Programa: i i i i = = = = 1 2 3 4 - j j j j = = = = 9 8 7 6 O laço for é equivalente ao seguinte comando: inicialização; while (condição) { comando; incremento; } // ou decremento ou inicialização; do { comando; incremento; } while (condição); // ou decremento 7.6 O loop do { } while O comando do ... while é um comando de repetição que permite executar um comando (comando simples) ou vários comandos (comando composto) diversas vezes. Isto é feito através do teste de uma condição. Enquanto a condição for verdadeira os comandos são repetidos. Quando a condição se tornar falsa o comando do ... while é finalizado. O teste da condição é feita no final do comando, ou seja, depois que os comandos são executados (Note que os comandos são executados pelo menos uma vez). Sintaxe: do { comando; } while (condição); ü Repete o laço enquanto a condição for verdadeira. 50 ü Testa a condição no final, fazendo com que o laço seja executado pelo menos uma vez. Programa exemplo (25): Imprime na tela de 1 até 10. // ----------------------------------------------- Fonte: Prog25.java package prog25; public class Prog25 { public static void main(String[] args) { int i = 1; do { System.out.printf("i = %d\n",i); i++; } while (i <= 10); } } Resultado do Programa: i i i i i i i i i i = = = = = = = = = = 1 2 3 4 5 6 7 8 9 10 7.7 Interrupção de loops 7.7.1 O comando break Quando o programa encontra o comando break dentro de um laço, ele imediatamente encerra o laço, e o controle do programa segue para o próximo comando após o laço. Programa exemplo (26): O programa imprime na tela a tecla digitada pelo usuário 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 laço quando o usuário teclar 'F' ou 'f' break; } System.out.printf("Tecla: %c - Codigo: %d\n", tecla, (int) tecla); } while (true); // laço eterno } } Resultado do Programa: Tecla ou [F]im: a <enter> Tecla: a - Codigo: 97 51 Tecla ou [F]im: Tecla: <enter> - Codigo: 10 // enter que o usuário digitou Tecla ou [F]im: b <enter> Tecla: b - Codigo: 98 Tecla ou [F]im: Tecla: <enter> - Codigo: 10 Tecla ou [F]im: A <enter> Tecla: A - Codigo: 65 Tecla ou [F]im: Tecla: <enter> - Codigo: 10 Tecla ou [F]im: B <enter> Tecla: B - Codigo: 66 Tecla ou [F]im: Tecla: <enter> - Codigo: 10 Tecla ou [F]im: f <enter> 7.7.2 O comando continue O comando continue em vez de forçar o encerramento, força a próxima interação do laço e "pula", ou seja, não executa o código que estiver depois do comando continue. Programa exemplo (27): O programa imprime na tela somente os números pares de 0 até 100. // ------------------------------------------ Fonte: Prog27.java package prog27; public class Prog27 { public static void main(String[] args) { for (int i = 0; i < 30; i++) { if (i % 2 == 1) { // 0 é par, 1 é impar continue; } // imprime somente números pares System.out.printf("Par: %d\n", i); } } } Resultado do Programa: Par: Par: Par: Par: Par: Par: Par: Par: Par: Par: Par: Par: Par: Par: Par: 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 Nos laços while e do {} while um comando continue faz com que o controle do programa execute diretamente o teste da condição e depois continue o processo do laço. No caso do comando for, o programa primeiro executa o incremento (ou decremento) do laço e, depois, executa o teste da condição antes de finalmente fazer o laço continuar. 52 7.8 O método System.exit () O método System.exit aborta o programa em qualquer situação. Modo de usar: System.exit(0); ou System.exit(1); 8. Saída formatada (System.out.printf) Como na linguagem C, as saídas (impressões) na tela podem ser formatadas em Java. Sintaxe: System.out.printf ("string de controle", lista de variáveis); String de controle: Formada pelos caracteres que o método imprime na tela, e pelos comandos de formatação (%c, %s, %d, %f) que definem a maneira como as variáveis serão impressas e caracteres especiais (\n, \t, ...). Tabela 9: Comandos de formatação Código %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 precisão 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): ü ü ü (-) não 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 começa 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 53 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 54 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 9. Lista de exercícios (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 fórmula: Fórmula: 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 avaliações. Calcule a média utilizando a seguinte fórmula: n1 + n2 * 2 + n3 * 3 + n4 Média = --------------------------7 A seguir imprima na tela a média e o conceito do aluno baseado na seguinte tabela: Média 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 circunferência. O programa deve calcular e imprimir na tela o diâmetro e o raio da circunferência (veja exemplo abaixo). Exemplo: Comprimento da circunferência: 36 <enter> Diâmetro: 11.46 Raio: 5.73 Continua [S/N]? N <enter> comprimento da circunferência = 2 . PI . raio diâmetro = 2 . raio Observação: Programa termina se usuário 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 preço por quilo. O programa deve calcular e imprimir na tela o total a pagar, o valor pago ao ICMS (17%) e o lucro líquido do açougue. Exemplo (Tela): Peso: 3.5 <enter> Preço por Kg (R$): 4.90 <enter> Total a pagar: 17.15 ICMS (17%): 2.91 Lucro líquido do açougue (R$): 14.24 55 Sair [S/N]? n <enter> Peso: 1.5 <enter> Preço por Kg (R$): 9.00 <enter> Total a pagar: 13.5 ICMS (17%): 2.29 Lucro líquido do açougue (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] Eqüinos ou [3] Ovinos, preço unitário do animal e quantidade de animais comprados. O programa deve calcular e imprimir na tela: preço total pago e a comissão do escritório de remate (gado 5%, eqüinos - 7% e ovinos - 3%), conforme exemplo abaixo: Exemplo (Tela): Tipo de animal [1] Gado, [2] Eqüinos ou [3] Ovinos: 1 <enter> Preço unitário do animal (R$): 200 <enter> Quantidade de animais: 10 <enter> Preço total pago (R$): 2100.00 Comissão a pagar (R$): 100.00 Continua [S/N]? s <enter> Tipo de animal [1] Gado, [2] Eqüinos ou [3] Ovinos: 2 <enter> Preço unitário do animal (R$): 1000 <enter> Quantidade de animais: 1 <enter> Preço total pago (R$): 1070.00 Comissão 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]qüinos ou [O]vinos, preço unitário do animal e quantidade de animais comprado. O programa deve calcular e imprimir na tela: preço total pago e a comissão do escritório de remate (gado: 5%, eqüinos: 7% e ovinos: 3%), conforme exemplo abaixo: Exemplo (Tela): Tipo de animal [G]ado, [E]qüinos ou [O]vinos: g <enter> Preço unitário do animal (R$): 200 <enter> Quantidade de animais: 10 <enter> Preço total pago (R$): 2100.00 Comissão 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, mês, 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> Mês: 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 número inteiro de 0 à 99. O programa deve imprimir na tela este número por extenso (conforme exemplo abaixo). O programa termina quando o usuário digitar 0 (zero). Exemplo: Número [0..99]: 23 <enter> Vinte e três Número [0..99]: 45 <enter> 56 Quarenta e cinco Número [0..99]: 0 <enter> 9.9 Escreva um programa em Java que recebe via teclado: quantidade de litros vendidos, tipo de combustível ([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 usuário digitar 'N' ou 'n' na pergunta "Continua [S/N]?". Tela de execução: Valores: Quantidade de litros? 50 <enter> Tipo de combustível [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> Á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 média, o conceito do aluno (dado pela tabela abaixo) e a situação (aprovado, exame ou reprovado): Conceito A B C D Média 9,0 à 10,0 7,0 à 8,9 6,0 à 6,9 0,0 à 5,9 Nota1 + Nota2 Média = ----------------2 Situação Aprovado Aprovado Exame Reprovado Exemplo: Nota1: 7 <enter> Nota2: 8 <enter> Média: 7.5 Conceito: B Situação: Aprovado Sair [S/N]? s <enter> Observação: Programa termina se o usuário 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 conversão (converter para: [C]elsius ou [F]ahrenheit). Calcule e imprima na tela a temperatura correspondente a solicitação do usuário, conforme exemplos abaixo: Exemplo: Fórmula: Temperatura: 30 <enter> Tipo de conversão (converte para: [C]elsius ou [F]ahrenheit): F <enter> Temperatura em Fahrenheit: 86 Continua [S/N]? S <enter> Temperatura: 86 <enter> Tipo de conversão (converte para: [C]elsius ou [F]ahrenheit): C <enter> Temperatura em Celsius: 30 Continua [S/N]? n <enter> C 9 . --- = 5 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 fórmula: ângulos em graus = graus + 57 minutos ---------60 + segundos ---------3600 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> Observação: 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, diferença de peso e situação (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 Diferença de Peso: 30.0 Situação: 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% Observação: Programa termina se o usuário digitar ‘S’ ou ‘s’ na pergunta: Sair [S/N]? 58 10. Vetores, Matrizes e Strings Um vetor é uma coleção de variáveis de mesmo tipo (agregados homogêneos) que são referenciadas pelo mesmo nome, utilizando-se um índice para diferencia-los. Um vetor consiste em locações contíguas de memória, ou seja, os elementos encontram-se em sequência (contiguidade física). O menor endereço corresponde ao primeiro elemento, e o maior corresponde ao último elemento. Uma vantagem na utilização de um vetor é poder armazenar vários valores (elementos), na memória 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 dimensão - 1D) é um tipo especial de matriz que possui apenas um índice, ou seja, permite armazenar variáveis unidimensionais (permite representar uma tabela). tipo_dado [] nome_do_vetor = new tipo_dado [número_de_elementos]; Onde: tipo_dado: tipo de dado de cada elemento (char, byte, int, short, long, float, double). nome_do_vetor: nome da variável que irá representar o vetor número_de_elementos: número total de elementos do vetor primeiro elemento: 0 último elemento: número_de_elementos – 1 número de bytes ocupados na memória RAM: número_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[número_de_elementos – 1], ou seja, x[9] número de bytes: 10 x 4 = 40 bytes (um inteiro ocupa 4 bytes) 59 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 cópia String para um vetor de caracteres. todos os caracteres de uma // ----------------------------------------- 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(); } } Resultado do Programa: String: pelotas <enter> Vetor: satolep 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]; 60 } geraPalpites(n, sena); sort(n, sena); exibePalpites(n, sena); // --------------------------- 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) { 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); } } } 61 " + extenso, "Mega Sena", 10.4 Vetor de Strings Para criar um vetor de Strings deve-se declarar assim: String [] nome = new String[3]; nome[0] = “Senac”; nome[1] = “Furg”; nome[2] = “UFPel”; String [] s = {“Pelotas”, “Rio Grande“, “Bagé}”; Tabela 12: Exemplo de um vetor de strings 0 1 2 3 4 0 ‘S’ ‘e’ ‘n’ ‘a’ ‘c’ 1 ‘F’ ‘u’ ‘r’ ‘g’ 2 ‘U’ ‘F’ ‘P’ ‘e’ ‘l’ Cria um vetor com três 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 Inicialização de matrizes e vetores tipo_dado [][] nome_matriz = {lista_valores}; lista_valores: lista de constantes separadas compatíveis em tipo com o tipo base da matriz. Exemplo: int [] i = {0,1,2,3,4,5,6,7,8,9}; por vírgulas que são // 10 elementos Observação: Quando um vetor é declarado e inicializado (ao mesmo tempo) o número de elementos (neste caso 10) pode ser suprimido, ou seja, neste caso é opcional (veja exemplo anterior). 10.6 Inicialização 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 Inicialização 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 Inicialização de vetores e matrizes sem tamanho Na inicialização de uma matriz (ou vetor), se não for especificado seu tamanho, então o compilador Java cria uma matriz (ou vetor) grande o suficiente para conter todos os inicializadores presentes. 62 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 { 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("Número 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]); } } } Resultado do Programa: Número de Elementos: 3 <enter> Nome: Paulo Roberto <enter> Idade: 51 <enter> Nome: Renato Luis <enter> Idade: 49 <enter> Nome: Francisco Carlos <enter> Idade: 53 <enter> | Paulo Roberto | Renato Luis | Francisco Carlos | 51 | | 49 | | 53 | 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 Prog30 { 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 { 63 System.out.printf("Número de linhas (m): "); s = entrada.nextLine(); m = Integer.parseInt(s); } while (m < 1 || m > MAX); // m de 1 à 10 do { System.out.print("Número 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]); } } } } Resultado do Programa: Informe a ORDEM da MATRIZ: (mxn) Número de linhas (m): 2 <enter> Número de colunas (n): 2 <enter> A[1,1] = 1 <enter> B[1,1] = 2 <enter> A[1,2] = 3 <enter> B[1,2] = 4 <enter> A[2,1] = 5 <enter> B[2,1] = 6 <enter> A[2,2] = 7 <enter> B[2,2] = 8 <enter> C[1,1] C[1,2] C[2,1] C[2,2] = = = = 3 7 11 15 10.9 Classificação de dados ou ordenação (sort) Para exemplificar melhor as variáveis do tipo vetor, abaixo são mostrados dois tipos de ordenação, também chamado sort (classificação de dados): Programa exemplo (31): O programa classifica os nomes digitados pelo usuário. // -------------------------------------------- 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("Número de Elementos: "); s = entrada.nextLine(); numElementos = Integer.parseInt(s); 64 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]); } } Resultado do Programa: Número de Elementos: 5 <enter> Nome: Eva <enter> Nome: Beatriz <enter> Nome: Carla <enter> Nome: Ana <enter> Nome: Debora <enter> Nomes Nome: Nome: Nome: Nome: Nome: ORDENADOS Ana Beatriz Carla Debora Eva Observação: O método compareTo é descrito no próximo capítulo. Programa exemplo (32): O programa utiliza um método de sort chamado bubble sort (método 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]; 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; 65 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]); } } } Resultado do Programa: Número de Elementos: 5 <enter> Nome: Eva <enter> Nome: Beatriz <enter> Nome: Carla <enter> Nome: Ana <enter> Nome: Debora <enter> Nomes Nome: Nome: Nome: Nome: Nome: ORDENADOS Ana Beatriz Carla Debora Eva 10.10 Lista de exercícios (vetores) 10.10.1 Escreva um programa em Java que recebe via teclado um conjunto de letras (máximo 20). Armazene todas as letras em um vetor (letras) até que o usuário digite um F ou f. Logo após 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: número de idades e as respectivas idades. Armazene todas as idades em um vetor (idade). Logo após a entrada de todas as idades, o programa deve receber via teclado: idade para consulta. O programa deve imprimir na tela, o número de idades antes da idade de consulta e o número de idades depois da idade de consulta. Exemplo: Número 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 números inteiros (máximo 50). Armazene todos os números inteiros em um vetor até que o usuário digite 0 (zero). Logo após permita ao usuário consultar um número informando o seu valor. O programa deve imprimir na tela a posição do número no vetor ou ERRO: Número não encontrado (veja exemplos abaixo): 66 Exemplo: Número: 50 <enter> Número: 30 <enter> Número: 20 <enter> Número: 10 <enter> Número: 40 <enter> Número: 0 <enter> Valor: 20 <enter> Posição no vetor: 2 Valor: 40 <enter> Posição no vetor: 4 Valor: 60 <enter> ERRO: Número não encontrado Valor: 0 <enter> Observação: O programa termina quando o usuário digitar 0 (zero). 10.10.4 Escreva um programa em Java que recebe via teclado "n" conceitos (A, B, C, D e E) (máximo 25) até que o usuário digite F ou f. Armazene todos os conceitos em um vetor (conceito). Imprima na tela o número de alunos: aprovados (A, B e C), reprovados (D) e os infreqüentes (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 Infreqüente (s) 10.10.5 Escreva um programa em Java que recebe via teclado “n” (máximo 50) nomes. A entrada dos nomes termina quando o usuário digitar apenas <enter>. Logo após 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 começam com a letra especificada pelo usuário. O programa termina quanto o usuário 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 após 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> 67 (máximo usuário entrada nomes e Continua [S/N]? s <enter> Nome: Carla <enter> Idade: 14 <enter> Continua [S/N]? N <enter> Carla 14 Beatriz 13 Ana 12 68 11. Manipulação de Strings A linguagem Java possui uma classe especifica para manipular strings, ou seja, cadeia de caracteres. 11.1 Métodos para manipular Strings Considere que: String s = “Pelotas”; A seguir são descritos os manipular objetos do tipo String. principais métodos 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 maíusculas e minísculas. diferenças entre 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 sequência de caracteres do que a “StringBuffer” especificada. a mesma Sintaxe: static String copyValueOf(char[] data); Retorna uma String que representa a sequência de caracteres do vetor especificado. Sintaxe: static String copyValueOf(char[] data, int offset, int count); Retorna uma String que representa uma sequência 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 maiúsculas minúsculas. e Sintaxe: byte[] getBytes(); Codifica esta String em uma sequência de bytes usando o conjunto de caracteres, armazenando o resultaod em um novo vetor de bytes. Sintaxe: byte[] getBytes(String charsetName); 69 Codifica esta String em uma sequência 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); Cópia esta seqüência de caracteres em um vetor de caracteres destino. Sintaxe: int hashCode(); Retorna o código hash desta String. Sintaxe: int indexOf(int ch); Retorna o índice dentro desta seqüência da caracter especificado ou -1 se não encontrar. ocorrência do Sintaxe: int indexOf(int ch, int fromIndex); Retorna o índice dentro desta String da primeira ocorrência caracter especificado, iniciando a busca no índice espeficidado. do Sintaxe: int indexOf(String str); Retorna o índice dentro desta substring especificada. ocorrência da Sintaxe: int indexOf(String str, int fromIndex); Retorna o índice dentro desta String da primeira ocorrência substring especificada, iniciando a busca no índice espeficidado. da String da primeira primeira Sintaxe: String intern(); Retorna uma representação canônica da String objeto. Sintaxe: int lastIndexOf(int ch); Retorna o índice dentri desta String da última ocurrência do caracter especificado. Sintaxe: int lastIndexOf(int ch, int fromIndex); Retorna o índice dentro desta String da última ocurrência do caracter especificado, pesquisando para trás começando no índice especificado. Sintaxe: int lastIndexOf(String str); Retorna o índice dentro desta seqüência da ocorrência mais à direita da subseqüência especificada. Sintaxe: int lastIndexOf(String str, int fromIndex); Retorna o índice dentro desta String da última ocorrência da substring especificada, buscando para trás começando o índice especificado. Sintaxe: int length(); Retorna o comprimento desta String. Sintaxe: boolean matches(String regex); Diz se esta seqüência corresponde a expressão regular ou não. Sintaxe: boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len); Testa se duas regiões das Strings são iguais. Sintaxe: boolean regionMatches(int toffset, String other, int ooffset, int len); Testa se duas regiões das Strings são iguais. Sintaxe: String replace(char oldChar, char newChar); 70 Retorna uma nova String resultante da troca de todas as ocorrências do “oldChar” nesta String com “newChar. Sintaxe: String replaceAll(String regex, String replacement); Substitui cada subseqüência da seqüência de caracteres que corresponde a expressão regular com a substituição dadas. Sintaxe: String replaceFirst(String regex, String replacement); Substitui as primeiras substrings dessa String que corresponde expressão regular com a substituição dadas. à Sintaxe: String[] split(String regex); Divide essa String em pedaços em torno da expressão regular. Sintaxe: String[] split(String regex, int limit); Divide essa String em pedaços em torno da expressão regular. Sintaxe: boolean startsWith(String prefix); Testa se esta String começa com o prefixo especificada. Sintaxe: boolean startsWith(String prefix, int toffset); Testa se essa String começa com o prefixo especificad começando no índice especificado. Sintaxe: CharSequence subSequence(int beginIndex, int endIndex); Retorna uma nova String de caracteres que é uma subseqüência desta seqüência. 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 minúsculos. Sintaxe: String toString(); Este objeto (que já é uma String) é retornado. Sintaxe: String toUpperCase(); Converte todos os caracteres desta String para maiúsculos. Sintaxe: String trim(); Retorna uma cópia desta String. Sintaxe: static String valueOf(boolean b); Retorna uma representação String do argumento “boolean”. Sintaxe: static String valueOf(char c); Retorna uma representação String do argumento “char”. Sintaxe: static String valueOf(char[] data); Retorna uma representação String do argumento “char []”. Sintaxe: static String valueOf(char[] data, int offset, int count); Retorna uma representação String do argumento “char [[]”. 71 Sintaxe: static String valueOf(double d); Retorna uma representação String do argumento “double”. Sintaxe: static String valueOf(float f); Retorna uma representação String do argumento “float”. Sintaxe: static String valueOf(int i); Retorna uma representação String do argumento “int”. Sintaxe: static String valueOf(long l); Retorna uma representação String do argumento “long”. Sintaxe: static String valueOf(Object obj); Retorna uma representação 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()); } } 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(); // número 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 } 72 de caracteres da String s acesso a cada caracter de s verifica se op é “SsNn” ("S".equalsIgnoreCase(s)); } Resultado do Programa: Nome: pelotas <enter> Invertido: satolep Continua [S/N]? S <enter> Nome: satolep <enter> Invertido: pelotas Continua [S/N]? N c) Exemplo do uso de String.format: // -------------------------------------------- Fonte: StringFormat.java package stringformat; public class StringFormat { public static void main(String[] args) { float numero = 123.456789f; } String formato = String.format("%.3f", numero); //JOptionPane.showMessageDialog(null, "numero: " + formato); System.out.printf("Número: %.4f\n", numero); System.out.println("Número Formatado: " + formato); } Resultado do Programa: Número: 123,4568 Número Formatado: 123,457 11.2 Lista de exercícios (Strings) 11.2.1 Escreva um programa em Java que recebe via teclado um nome. Logo após a entrada do nome imprima: número de letras maiúsculas, número de letras minúsculas, número de vogais e o número de consoantes, conforme exemplo abaixo: Exemplo: Nome: Faculdade de Tecnologia Senac <enter> (3) maiúscula(s) (23) minúscula(s) (12) vogais(s) (14) consoante(s) 11.2.2 Escreva um programa em Java que recebe via teclado uma palavra e uma letra. Logo após a entrada do nome e da letra imprima o número de letras que existe no nome ou ERRO: Não 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: Não existe a letra (w) na palavra (Luzzardi) Continua [S]im ou [N]ão? N <enter> Observação: O programa deve ser encerrado pergunta: Continua [S]im ou [N]ão?. quando o usuário digitar “N” ou “n” na 11.2.3 Escreva um programa em Java que recebe via teclado uma palavra e uma posição. O programa deve imprimir na tela, a letra antecessora, a letra (da referida posição) e a letra sucessora, conforme exemplo abaixo: Exemplo: Palavra: Universidade <enter> 73 Posição: 7 <enter> Antecessora: s Letra: i Sucessora: d Observação: O programa deve imprimir na tela as seguintes mensagens de erro, se for o caso: Letra antecessora não existe, Letra sucessora não existe ou Posição inválida. 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 após a entrada do nome o programa deve imprimir (EM LETRA MAIÚSCULA) 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> Observação: O programa termina quando o usuário digitar ‘S’ ou ‘s’ na pergunta: Sair [S/N]? 11.2.6 Escreva um programa em Java que recebe via teclado um nome. Logo após 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> Observação: O programa termina quando o usuário 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 após a entrada do nome do estado imprima: a sigla do estado (2 letras maiúsculas), conforme exemplos abaixo: Exemplo: Estado: Rio Grande do Sul <enter> Sigla: RS Estado: são paulo <enter> Sigla: SP Estado: rio de janeiro <enter> Sigla: RJ Estado: <enter> Observação: O programa encerra quando o usuário digitar apenas <enter> na entrada do nome do estado. 11.2.8 Escreva um programa em Java que recebe via teclado uma palavra, início e fim. Logo após a entrada de todos os dados imprima a string resultante ou ERRO: Fim inválido ou Início inválido, conforme exemplos abaixo: Exemplo: Palavra: universidade <enter> Início: 7 <enter> 74 Fim: 11 <enter> String resultante: idade Continua [S/N]? s <enter> Palavra: eletricidade <enter> Início: 7 <enter> Fim: 15 <enter> ERRO: Fim Inválido Continua [S/N]? N <enter> Observação: O programa termina quando o usuário digitar ‘N’ ou ‘n’ na pergunta: Continua [S/N]?. 75 12. Métodos estáticos definidos pelo programador A linguagem de programação Java permite que o programador crie e utilize seus próprios métodos estáticos. Forma Geral: static tipo_do_retorno nome_do_método (tipo_dado_base parâmetros ou argumentos) { tipo_dado_base variáveis; corpo do método; return(x); } tipo_do_retorno: Especifica o tipo de dado que será retornado pelo método. O retorno do método é feito pelo comando return (valor). Parâmetros ou argumentos: É uma lista, separada por vírgulas, com os nomes das variáveis (e seus tipos) que receberão os argumentos quando o método for chamado ou executado. Método procedural: É um tipo especial de método que não possui retorno, ou seja, é simplesmente um procedimento. Um método deste tipo é void. Exemplo: Programa que gera 10 números aleatórios, usando um método estático 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); } Resultado do Programa: 0.5051108207316423 Valor: 5 0.32587482295637693 Valor: 3 0.5022622828080121 Valor: 5 0.12280582088438263 Valor: 1 0.6698515942322978 Valor: 6 0.23904184275698248 Valor: 2 0.8321167764574124 Valor: 8 0.7770564673470854 Valor: 7 76 0.1130461920867929 Valor: 1 0.29725902364100654 Valor: 2 Chamada do método: n = random(10); Programa exemplo (33): calcula o inverso 1/x. O // retorna um número aleatório entre 0 e 9 programa possui um método // ---------------------------------------------- Fonte: Prog33.java 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 método inverso System.out.printf("Inverso = %.2f\n", inv); } // ----------------------------- Método definido pelo programador static double inverso (double x) { double i; i = (double) 1 / x; return(i); } } Resultado do Programa: x = 4 <enter> Inverso = 0,25 77 estático que 12.1 Valores de retorno Todas os métodos, exceto aqueles que são declaradas como sendo do tipo void, devolvem um valor. O valor é devolvido (retornado) pelo método através do comando return. Normalmente são escritas três tipos de métodos: a) Métodos que efetuam operações com os parâmetros e retornam um valor com base nas operações. Programa exemplo (34): O programa calcula e imprime na tela o valor da potência xy através de um método estático 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 método potencia resp = potencia(base, expoente); System.out.printf("Potencia = %7.2f\n",resp); } // ----------------------------- Método definido pelo programador static double potencia (double x, int y) { double valor; valor = Math.exp ( Math.log (x ) * y ); return(valor); } } Resultado do Programa: Base: 3 <enter> Expoente: 4 <enter> Potencia = 81,00 b) Métodos que manipulam informações e retornam um simplesmente indica o sucesso ou o fracasso da manipulação. valor que Programa exemplo (35): O programa calcula e verifica o determinante de uma equação de segundo grau através de um método estático chamado: verificaDeterminante. // ------------------------------------------ Fonte: Prog35.java package prog35; import java.util.Scanner; public class Prog35 { 78 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"); } } } // ---------------------------- metodo 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); } } } Resultado do Programa: a = 1 <enter> b = 2 <enter> c = 3 <enter> Determinante NEGATIVO c) Métodos que procedimentos. não retornam nenhum valor, ou seja, são puramente Programa exemplo (36): O programa possui um método estático imprime um número (int ou float) através do método 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); 79 System.out.print("Digite outro Numero: "); s = entrada.nextLine(); y = Float.parseFloat(s); imprimeNumero(y); } // ----------------------------- 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); } } Resultado do Programa: Digite Número Digite Número um número: 3 <enter> digitado foi 3 outro número: 4 <enter> digitado foi 4.0 Observação: Note que o método imprimeNumero foi sobrecarregado, ou seja, ele funciona quando o argumento é int ou float. 12.2 Passagem de parâmetros por valor Forma de chamada de um método, onde o valor do argumento é apenas copiado para o parâmetro formal do método. Portanto, alterações feitas nos parâmetros não terão efeito nas variáveis utilizadas para chamá-la. Programa exemplo (37): O programa possui um método que desenha um retângulo na tela. // ------------------------------------------- Fonte: Prog37.java package prog37; public class Prog37 { public static void main(String[] args) { desenhaRetangulo(1, 1, 9, 9); } // ------------------------ desenhaRetangulo static void desenhaRetangulo(int ci, int li, int cf, int lf) { int c, l; System.out.print(" "); for (c = ci; c <= cf; c++) { System.out.print(c); } System.out.println(); for (l = li; l <= lf; l++) { System.out.print(l + ":"); for (c = ci; c <= cf; c++) { System.out.print("#"); } System.out.println(); } } } Onde: ci -> coluna inicial li -> linha inicial cf -> coluna final 80 lf -> linha final Atenção: Os argumentos do método recebem, respectivamente: ci=1, li=1, cf=20 e lf=10. Resultado do Programa: 123456789 1:######### 2:######### 3:######### 4:######### 5:######### 6:######### 7:######### 8:######### 9:######### 12.3 Passagem de parâmetros por referência A passagem de parâmetros ou argumentos por referência em Java acontece somente com qualquer tipo de dado do tipo vetor ou matriz, ou seja, não é possível fazer passagem de argumento por referência com variáveis do tipo: char, byte, int, short, long, float ou double. Programa exemplo (38): O programa tem um método que troca o valor de duas variáveis. // ------------------------------------------------- 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; } Resultado do Programa: Vetor: 3 - 4 - 5 Vetor: 4 - 5 – 3 12.4 Métodos que devolvem valores não-inteiros Todas os métodos que devolvem valores não-inteiros devem ter seu tipo de retorno declarado. tipo_do_retorno nome_do_metodo (tipo_dado_base parâmetros); 81 Programa exemplo (39): O programa calcula e imprime na tela a divisão de dois valores usando um método estático chamado divisão. // ------------------------------------------ Fonte: prog39.java package prog39; import java.util.Scanner; public class Prog39 { 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("Divisão = %7.2f\n",resposta); } // ----------------------------- método definido pelo programador static float divisao (int x, int y) { return( (float) x / y ); } } Resultado do Programa: Vetor: 3 - 4 - 5 Vetor: 4 - 5 - 3 12.5 Argumentos do main (String [] args) O método estático main possui um argumento args intrínsecos utilizados para receber parâmetros da linha de comando do Sistema Operacional. args – Vetor de Strings Programa exemplo (40): O programa recebe parâmetros do Operacional (uma palavra qualquer) e imprime a palavra em inverso. O programa deve ser executado via terminal do Operacional da seguinte forma: Execução 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) { 82 Sistema sentido Sistema 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)); } System.out.println(); } } } Resultado do Programa: MacBook-Air-de-Paulo:prog40 pluzzardi$ java Prog40 pelotas <enter> Palavra: satolep MacBook-Air-de-Paulo:prog40 pluzzardi$ Programa exemplo (41): O programa deve receber parâmetros pelo Sistema Operacional (conjunto de caracteres) e deve ordenar (coloca em ordem alfabética), imprimindo-os a seguir. Execução 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"); } } Resultado do Programa: 83 MacBook-Air-de-Paulo:prog41 pluzzardi$ java Prog41 dbeacgf <enter> abcdefg MacBook-Air-de-Paulo:prog41 pluzzardi$ 12.6 Recursividade Um método é recursivo se este fizer uma chamada a si própria. Programa exemplo (42): O programa calcula o fatorial de um número recursivamente. // ------------------------------------------ Fonte: Prog42.java package prog42; import java.util.Scanner; public class Prog42 { 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 } Resultado do Programa: n = 5 <enter> Fatorial: 120 n = 10 <enter> Fatorial: 3628800 n = 15 <enter> Fatorial: 1307674368000 n = 16 <enter> Fatorial: 20922789888000 n = 17 <enter> Fatorial: 355687428096000 n = 18 <enter> Fatorial: 6402373705728000 n = 19 <enter> Fatorial: 121645100408832000 n = 20 <enter> n = 0 <enter> Fatorial: 1 Programa exemplo recursivamente. (43): O programa calcula a soma // ------------------------------------------- Fonte: Prog43.java 84 de um número 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 { 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); // recursividade } } Resultado do Programa: n = 1 Soma: n = 2 Soma: n = 3 Soma: n = 4 Soma: n = 0 <enter> 1 <enter> 3 <enter> 6 <enter> 10 <enter> 12.7 Lista de Exercícios (métodos) 12.7.1 Escreva em Java o método númeroPalavras. O método recebe uma String (nome) e retorna o número 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); 85 } // ---------------------------- numeroPalavras } Exemplo: Nome: Paulo Roberto Gomes Luzzardi <enter> Seu nome tem 4 palavra(s) 12.7.2 Escreva em Java o método verificaQuadrante. O método recebe um valor para x e um valor para y e retorna o número 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 12.7.3 Escreva o método: final_da_placa. O método recebe uma placa de automóvel no formato: xxx9999 e retorna o último dígito 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 } 86 Exemplo: Qual a Placa de seu carro [xxx9999]: IDJ7345 <enter> Final da Placa é: 5 12.7.4 Escreva o método numVogais. O método 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 método calculaHipotenusa. O método recebe o cateto adjacente (b) e o cateto oposto (a) e retorna o valor da hipotenusa dado pela seguinte fórmula: Fórmula: h2 = a2 + b2 // ------------------------------------------------------------ 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 a, b, h; } System.out.print("Cateto Adjacente: "); s = entrada.nextLine(); a = Float.parseFloat(s); System.out.print("Cateto Oposto: "); s = entrada.nextLine(); b = Float.parseFloat(s); h = calculaHipotenusa(a, b); System.out.printf("Hipotenusa: %f\n", h); // ---------------------------- calculaHipotenusa } Exemplo: 87 Cateto Adjacente: 3 <enter> Cateto Oposto: 3 <enter> Hipotenusa: 4.242640 12.7.6 Escreva em Java o método calculaReajuste. O método recebe o valor do salário e o índice de reajuste e retorna o salário 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("Salário (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("Salário Atualizado (R$): %.2f\n", reajuste); } // ---------------------------- calculaReajuste } Exemplo: Salário (R$): 1000 <enter> Índice de Reajuste: 10 <enter> Salário Atualizado (R$): 1100 88 13. Classes (Interface ou Coleção) existentes em Java (Container) Java possui diversas classes pré-existentes chamadas container. Um container ou coleção é simplesmente um objeto que agrupa múltiplos elementos em uma única unidade. As coleções são utilizadas para armazenar, recuperar e manipular dados agregados. A seguir pode-se ver algumas classes, coleções ou implementações existentes em Java: Tabela 13: Lista de Container Container Descrição Array DList SList HashMap OrderedMap HashSet OrderedSet PriorityQueue Queue Stack Deque Array expansível 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 saídas) Collection FrameWork (Coleções) Pacote: import java.util.*; Uma coleção é um objeto que representa um grupo de objetos. Um “Collection Framework” é uma arquitetura para representar e manipular coleções independente dos detalhes de sua implementação. Uma coleção é composta de Interfaces e Implementações. Interfaces Figura 3: Arquitetura das Interfaces Implementações Sets(Conjuntos): HashSet, LinkedHashSet, TreeSet, EnumSet Lists (Listas): Vector, Stack, LinkedSet, ArrayList 89 Queue (Filas): PriorityQueue Maps: HashTable, HashMap, LinkedHashMap, WeakHashMap, IdentityHashMap, TreeMap A seguir são descritos alguns destes elementos: Vector (Vetor) import java.util.Vector; A classe Vector é utilizada em uma estrutura de dados armazenada em um vetor, ou seja, uma lista de elementos. A seguir são descritos os principais métodos da classe Vector. Sintaxe: void add(int index, Object element); Insere um elemento especificado na posição 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 coleção especificada no final do Vetor, na ordem que eles são retornados pelo iterador da coleção especificada. Sintaxe: boolean addAll(int index, Collection c); Insere todos os elementos na coleção especificada no Vetor na posição especificada. Sintaxe: void addElement(Object obj); Adiciona o componente especificado no tamanho em um. fim do Vetor, aumentando se 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 específico é um componente do Vetor. Sintaxe: boolean containsAll(Collection c); Retorna true se o Vetor contém todos os específica. elementos 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 enumeração dos componentes do Vetor. Sintaxe: void ensureCapacity(int minCapacity); 90 da coleção Aumenta a capacidade do Vetor, se necessário, estando certo que de poder armazenar o número 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 posição especificada do Vetor. Sintaxe: int hashCode(); Retorna o valor do código “hash” do Vetor. Sintaxe: int indexOf(Object elem); Procura a primeira ocorrência de um dado argumento, testando a igualdade pelo método “equals. “ Sintaxe: int indexOf(Object elem, int index); Procura pela primeira ocorrência de um dado argumento, começando a busca pelo “index”, e testando pela igualdade usando o métod “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 não tem componentes. Sintaxe: Object lastElement(); Retorna o último componente do Vetor. Sintaxe: int lastIndexOf(Object elem); Retorna o “index” da última ocorrência Vetor. do objeto especificado no Sintaxe: int lastIndexOf(Object elem, int index); Procura para trás por um objeto especificado, começando no “index” especificado e retorna um “index” para ele. Sintaxe: Object remove(int index); Remove o elemento da posição especificada no Vetor. Sintaxe: boolean remove(Object o); Remove a primeira ocorrência do elemento especificado no Vetor, se o Vetor não contém o elemento, ele não é alterado. Sintaxe: boolean removeAll(Collection c); Remove do Vetor todos os elementos que contém a coleção 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) ocorrência do argumento do Vetor. Sintaxe: void removeElementAt(int index); Deleta o componente com “index” especificado. 91 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); Mantém somente os elementos do Vetor especificada. que Sintaxe: Object set(int index, Object element); Troca o elemento da posição especificada do especificado. contém Vetor com a coleção o 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 número de componentes do Vetor. Sintaxe: List subList(int fromIndex, int toIndex); Retorna uma visão da porção 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 representação de cada Sintaxe: void trimToSize(); Ajusta a capacidade do Vetor para a atual dimensão 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(); 92 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); } } Resultado do Programa: 10 20 30 40 50 Vetor: [10, 20, 30, 40, 50] Programa Exemplo (3a): Exemplo de um vetor usando a classe “Vector”, inserindo em uma determinada posição. // --------------------------------------------- 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: Posição Inválida ", "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(); } } 93 Resultado do Programa: Nodo: 10 <enter> Posição: 0 <enter> Indice: 0 Vetor: 10 Nodo: 20 <enter> Posição: 1 <enter> Indice: 0 1 Vetor: 10 20 Nodo: 30 <enter> Posição: 2 <enter> Indice: 0 1 2 Vetor: 10 20 30 Nodo: 40 <enter> Posição: 6 <enter> ERRO: Posição Inválida Indice: 0 1 2 Vetor: 10 20 30 Nodo: 0 <enter> Indice: 0 1 2 Vetor: 10 20 30 Elemento: 10 Elemento: 20 Elemento: 30 Número de Elementos: 3 Vetor: 10 20 30 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.*; 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(); } 94 Resultado do Programa: ArrayList: [10, 20, 30, 40] Objetos: 10 20 30 40 Vector: [A, B, C, D] Objetos: A B C D Stack (Pilha) import java.util.Stack; A classe Stack é utilizada para armazenar elementos em uma Pilha. A seguir são descritos os principais métodos 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 posição baseado na posição de onde o objeto se encontra da pilha. Programa Exemplo (4): Exemplo de uma pilha usando a classe “Stack”. // --------------------------------------------- Fonte: Prog4.java package Prog4; 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); } } LinkedList (Lista Encadeada Simples) import java.util.LinkedList; 95 A lista LinkedList é utilizada para armazenar elementos em uma lista encadeada simples, ou seja, lista alocada dinamicamente, onde a lista cresce enquanto houver memória livre. A seguir são descritos os principais métodos de uma LinkedList. Sintaxe: void add (int index, Object element); Insere o elemento especificado na posição especificada da lista. Sintaxe: boolean add (Objetc o); Anexa o elemento especificado no fim da lista. Sintaxe: boolean addAll (Collection c); Anexa todos os elementos da coleção especificada no fim da lista, na ordem que eles são retornados do iterador da coleção especificado. Sintaxe: boolean addAll (int index, Collection c); Insere todos os elementos da coleção especificada dentro da lista, começando na posição especificada. Sintaxe: void addFirst (Object o); Insere um dado elemento no começo da lista. Sintaxe: void addLast (Object o); Anexa um dado elemento no fim da lista. Sintaxe: void clear (); Remove todos os elementos da lista. Sintaxe: Object clone (); Retorna uma cópia superficial do LinkedList. Sintaxe: boolean contains (Object o); Retorna verdadeiro (true) se a lista contém o elemento especificado. Sintaxe: Object get (int index); Retorna o elemento da posição especificada na lista. Sintaxe: Object getFirst (); Retorna o primeiro elemento da lista. Sintaxe: Object getLast (); Retorna o último elemento da lista. Sintaxe: int indexOf (Object o); Retorna o índice da lista da primeira ocorrência especificado, ou -1 se a Lista não contém este elemento. do elemento Sintaxe: int lastIndexOf (Object o); Retorna o índice da lista da última ocorrência especificado, ou -1 se a lista não contém este elemento. do elemento Sintaxe: ListIterator listIterator (int index); Retorna um iterador da lista dos elementos da lista (na sequência correta), começando na posição especificada na lista. Sintaxe: Object remove (int index); Remove o elemento da posição especificada na lista. 96 Sintaxe: boolean remove (Object o); Remove a primeira ocorrência do elemento especificado na lista. Sintaxe: Object removeFirst (); Remove e retorna o primeiro elemento da lista. Sintaxe: Objetc removeLast (); Removes e retorna o último elemento da lista. Sintaxe: Object set (int index, Object element); Troca o elemento da posição especificada na lista pelo o elemento especificado. Sintaxe: int size (); Retorna o número de elementos na lista. Sintaxe: Object [] toArray (); Retorna um “array” (vetor) contendo todos os elementos da lista na ordem correta. Sintaxe: Object [] toArray (Object [] a); Retorna um “array” (vetor) contendo todos os elementos da lista na ordem correta. Queue (Fila) import java.util.Queue; A interface Queue é utilizada para armazenar elementos em uma Fila. A seguir são descritos os principais métodos da interface queue. Sintaxe: E element(); Recupera, mas não remove, o primeiro da fila. Sintaxe: boolean offer(E o); Insere um elemento especificado dentro desta fila, se possível. Sintaxe: E peek(); Recupera, mas não 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 { 97 public static void main(String[] args) { Queue fila = new LinkedList(); // Fila com uma Lista Encadeada Simples String s, extenso = ""; int nodo; 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); } } Observação: No programa exemplo, a fila (queue) foi implementada como uma lista encadeada simples (LinkedList). Diferenças entre Classe e Interface Uma interface em Java é uma classe abstrata onde todos os métodos são abstratos (abstract) e públicos (public), e todos os atributos são estáticos (static) e constantes tipadas (final). Ela é semelhante a especificação de uma classe abstrata pura, com uma diferença: os métodos das classes abstratas podem ou não ser implementados nas classes que a estendem, já os métodos das interfaces tem que ser obrigatoriamente implementados nas classes que as implementam. Uma interface permite estabelecer uma padronização 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 estarão presentes na classe. A sintaxe da declaração de uma interface é parecida na definição de classes, porém seu corpo define apenas as assinaturas dos métodos e constantes contidos na interface. Arrays (array) import java.util.Arrays; A classe Arrays pode ser utilizada em variáveis do tipo vetor. Exemplo: final int MAX = 50; int [] vetor = new int[MAX]; A seguir são descritos os principais métodos da classe Array. Sintaxe: static int binarySearch(byte[] a, byte key); Procura em um vetor de “byte” especificado por um valor específico usando algoritmo binário de busca. Sintaxe: static int binarySearch(char[] a, char key); Procura em um vetor de “char” especificado por um valor específico usando algoritmo binário de busca. Sintaxe: static int binarySearch(double[] a, double key); 98 Procura em um vetor de “double” especificado por um valor específico usando algoritmo binário de busca. Sintaxe: static int binarySearch(float[] a, float key); Procura em um vetor de “float” especificado por um valor específico usando algoritmo binário de busca. Sintaxe: static int binarySearch(int[] a, int key); Procura em um vetor de “int” especificado por um valor específico usando algoritmo binário de busca. Sintaxe: static int binarySearch(long[] a, long key); Procura em um vetor de “long” especificado por um valor específico usando algoritmo binário de busca. Sintaxe: static int binarySearch(Object[] a, Object key); Procura em um vetor de “Object” especificado por um valor específico usando algoritmo binário de busca. Sintaxe: static int binarySearch(short[] a, short key); Procura em um vetor de “short” especificado por um valor específico usando algoritmo binário de busca. Sintaxe: static boolean deepEquals(Object[] a1, Object[] a2); Retorna “true” se os dois arrays especifiados são iguais. Sintaxe: static int deepHashCode(Object[] a); Retorna o código “hash” baseado na localização do array especificado. Sintaxe: static String deepToString(Object[] a); Retorna em forma de “string” a localização do array especificado. Sintaxe: static boolean equals(boolean[] a, boolean[] a2); Retorna “true” se os dois arrays especificados de “boolean” iguais. são Sintaxe: static boolean equals(byte[] a, byte[] a2); Retorna “true” se os dois arrays especificados de “byte” são iguais. Sintaxe: static boolean equals(char[] a, char[] a2); Retorna “true” se os dois arrays especificados de “char” são iguais. Sintaxe: static boolean equals(double[] a, double[] a2); Retorna “true” se os dois arrays especificados de “double” são iguais. Sintaxe: static boolean equals(float[] a, float[] a2); Retorna “true” se os dois arrays especificados de “float” são iguais. Sintaxe: static boolean equals(int[] a, int[] a2); Retorna “true” se os dois arrays especificados de “int []” são iguais. Sintaxe: static boolean equals(long[] a, long[] a2); Retorna “true” se os dois arrays especificados de iguais. “long []” são Sintaxe: static boolean equals(Object[] a, Object[] a2); Retorna “true” se os dois arrays especificados de “Object []” são iguais. Sintaxe: static boolean equals(short[] a, short[] a2); Retorna “true” se os dois arrays especificados de “short” são iguais. 99 Sintaxe: static void fill(boolean[] a, boolean val); Atribui um valor booleano especificado para cada elemento da matriz de booleanos. 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); 100 Atribui um valor “long []” especificado para cada elemento da matriz de ”longs”. 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 código “hash” com base no conteúdo da array especificada. Sintaxe: static int hashCode(byte[] a); Retorna o código “hash” com base no conteúdo da array especificada. Sintaxe: static int hashCode(char[] a); Retorna o código “hash” com base no conteúdo da array especificada. Sintaxe: static int hashCode(double[] a); Retorna o código “hash” com base no conteúdo da array especificada. Sintaxe: static int hashCode(float[] a); Retorna o código “hash” com base no conteúdo da array especificada. Sintaxe: static int hashCode(int[] a); Retorna o código “hash” com base no conteúdo da array especificada. Sintaxe: static int hashCode(long[] a); Retorna o código “hash” com base no conteúdo da array especificada. Sintaxe: static int hashCode(Object[] a); Retorna o código “hash” com base no conteúdo da array especificada. Sintaxe: static int hashCode(short[] a); Retorna o código “hash” com base no conteúdo da array especificada. Sintaxe: static void sort(byte[] a); Ordena o array especificado de “byte” em ordem ascendente numérica. Sintaxe: static void sort(byte[] a, int fromIndex, int toIndex); Ordena a faixa do array especificado de “byte” em ordem ascendente numérica. Sintaxe: static void sort(char[] a); Ordena o array especificado de “char” em ordem ascendente numérica. Sintaxe: static void sort(char[] a, int fromIndex, int toIndex); Ordena a faixa do array especificado de “char” em ordem ascendente numérica. 101 Sintaxe: static void sort(double[] a); Ordena o array especificado de “double” em ordem ascendente numérica. Sintaxe: static void sort(double[] a, int fromIndex, int toIndex); Ordena a faixa do array especificado de “double” em ordem ascendente numérica. Sintaxe: static void sort(float[] a); Ordena o array especificado de “float” em ordem ascendente numérica. Sintaxe: static void sort(float[] a, int fromIndex, int toIndex); Ordena a faixa do array especificado de “float” em ordem ascendente numérica. Sintaxe: static void sort(int[] a); Ordena o array especificado de “int” em ordem ascendente numérica. Sintaxe: static void sort(int[] a, int fromIndex, int toIndex); Ordena a faixa do array especificado de “int” em ordem ascendente numérica. Sintaxe: static void sort(long[] a); Ordena o array especificado de “long” em ordem ascendente numérica. Sintaxe: static void sort(long[] a, int fromIndex, int toIndex); Ordena a faixa do array especificado de “long” em ordem ascendente numérica. Sintaxe: static void sort(Object[] a); Ordena o array especificado de “Object” em ordem ascendente numérica, 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 ascendente numérica. Sintaxe: static void sort(short[] a); Ordena o array especificado de “short” em ordem ascendente numérica. Sintaxe: static void sort(short[] a, int fromIndex, int toIndex); Ordena a faixa do array especificado de “short” em ordem ascendente numérica. Sintaxe: static String toString(boolean[] a) Retorna uma “string” o conteúdo do array de “boolean” especificado. Sintaxe: static String toString(byte[] a); Retorna uma “string” o conteúdo do array de “byte” especificado. Sintaxe: static String toString(char[] a); Retorna uma “string” o conteúdo do array de “char” especificado. Sintaxe: static String toString(double[] a); Retorna uma “string” o conteúdo do array de “double” especificado. Sintaxe: static String toString(float[] a); Retorna uma “string” o conteúdo do array de “float” especificado. Sintaxe: static String toString(int[] a); Retorna uma “string” o conteúdo do array de “int []” especificado. 102 Sintaxe: static String toString(long[] a); Retorna uma “string” o conteúdo do array de “long []” especificado. Sintaxe: static String toString(Object[] a); Retorna uma “string” o conteúdo do array de “Object []” especificado. Sintaxe: static String toString(short[] a); Retorna uma “string” o conteúdo 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); // Arrays.sort(v, 0, n); // vetor, início (incluso), fim + 1 (não incluso) 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 ArrayList possui os mesmos métodos da classe Vector. Programa Exemplo (7): Programa mostra um exemplo de dois arrays que armazenam respectivamente: nomes e idades. // ------------------------------------------- Fonte: Prog7.java package Prog7; 103 import java.util.ArrayList; public class Prog7 { 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)); } } } Resultado do Programa: Nome: Nome: Nome: Nome: Nome: Paulo Roberto Renato Luis Francisco Carlos Ana Maria Julia Helena Idade: Idade: Idade: Idade: Idade: 48 46 50 53 52 104 14. Entrada e saída em disco (Arquivos) Em Java é possível manipular arquivos através da classe File (Arquivo). 14.1 Métodos para manipular arquivos em Java A seguir são arquivos em Java: descritos os principais métodos 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 não existe. Sintaxe: static File createTempFile(String prefix, String suffix); Cria um arquivo vazio no diretório de arquivos temporários, 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 diretório especificado, usando o prefixo e o sufixo dado pela String para gerar o seu nome. Sintaxe: boolean delete(); Deleta o arquivo ou diretório informado no “pathname”. Sintaxe: void deleteOnExit(); Solicita que o arquivo ou diretório indicado por este “pathname” ser excluído quando a máquina virtual termina. Sintaxe: boolean equals(Object obj); Testa se o “pathname” é igual ao objeto indicado. Sintaxe: boolean exists(); Testa se o arquivo ou diretório 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 canônica do “pathname”. Sintaxe: String getCanonicalPath(); 105 Retorna uma String canônica do “pathname”. Sintaxe: String getName(); Retorna o nome do arquivo ou diretório indicado pelo “pathname”. Sintaxe: String getParent(); Retorna uma String do caminho pai, esse caminho abstrato, ou nulo se este caminho não é nome de um diretório pai. Sintaxe: File getParentFile(); Retorna o caminho abstrato pai deste caminho, ou nulo se este caminho não é nome de um diretório pai. Sintaxe: String getPath(); Converte este “pathname” em uma String do “pathname”. Sintaxe: int hashCode(); Calcula o código “hash” para este “pathname”. Sintaxe: boolean isAbsolute(); Testa se este “pathname” é absoluto Sintaxe: boolean isDirectory(); Testa se o arquivo indicado diretório. 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 diretórios no diretório indicado por este caminho. Sintaxe: String[] list(FilenameFilter filter); Retorna um vetor de Strings com os nomes de arquivos e diretórios no diretório indicado por este caminho que satisfaçam o filtro especificado. Sintaxe: File[] listFiles(); Retorna um vetor de “pathnames” indicando os arquivos no diretório indicado por este caminho. Sintaxe: File[] listFiles(FileFilter filter); Retorna um vetor de “pathnames” indicando os arquivos e diretórios no diretório indicado por este caminho que satisfaçam o filtro especificado. Sintaxe: File[] listFiles(FilenameFilter filter); 106 Retorna um vetor de “pathnames” indicando os arquivos e diretórios no diretório indicado por este caminho que satisfaçam o filtro especificado. Sintaxe: static File[] listRoots(); Lista o sistema de arquivos disponíveis principais(root). Sintaxe: boolean mkdir(); Cria o diretório chamado por este caminho. Sintaxe: boolean mkdirs(); Cria o diretório chamado por este “pathname”, incluindo os diretórios pai necessários, mas inexistentes. Sintaxe: boolean renameTo(File dest); Renomeia o arquivo indicado pelo “pathname”. Sintaxe: boolean setLastModified(long time); Define o tempo da última modificação do arquivo ou diretório chamado por este caminho. Sintaxe: boolean setReadOnly(); Marca o arquivo ou diretório chamado por este caminho que só são permitidas operações de leitura. Sintaxe: String toString(); Retorna uma String “pathname” deste caminho. Sintaxe: URI toURI(); Constrói 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 serão vistos alguns programas exemplos mostrando a manipulação de arquivos em Java. Programa exemplo (44): O programa abre um arquivo texto e exibe o número 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/pluzzardi/luzzardi.txt"; File arqTexto = new File(nomeArquivo); if (arqTexto.exists()) { long bytes = arqTexto.length(); System.out.println("Arquivo: " + nomeArquivo); System.out.println("Bytes: " + bytes); } else { System.out.println("ERRO: Arquivo não existe"); } } } Resultado do Programa: 107 Arquivo: /Users/pluzzardi/luzzardi.txt <enter> Bytes: 131 14.3 Listar um diretório Programa exemplo (45): O programa exibe na tela (lista) os arquivos e diretórios 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//pluzzardi"); String [] arquivos = diretorio.list(); for (int i = 0;i < arquivos.length; i++) { File filho = new File(diretorio, arquivos[i]); System.out.println(filho.getAbsolutePath()); } } } Resultado do Programa: /Users/pluzzardi/.bash_history /Users/pluzzardi/.CFUserTextEncoding /Users/pluzzardi/.config /Users/pluzzardi/.cups /Users/pluzzardi/.dropbox /Users/pluzzardi/.DS_Store /Users/pluzzardi/.gbas /Users/pluzzardi/.local /Users/pluzzardi/.netbeans-derby /Users/pluzzardi/.ssh /Users/pluzzardi/.Trash /Users/pluzzardi/.viminfo /Users/pluzzardi/Desktop /Users/pluzzardi/Documents /Users/pluzzardi/Downloads /Users/pluzzardi/Dropbox /Users/pluzzardi/frutas.luz /Users/pluzzardi/Frutas.txt /Users/pluzzardi/Leitura.zip /Users/pluzzardi/Library /Users/pluzzardi/luzzardi.dat /Users/pluzzardi/Luzzardi.txt /Users/pluzzardi/Movies /Users/pluzzardi/Music /Users/pluzzardi/NetBeansProjects /Users/pluzzardi/nomes.sort /Users/pluzzardi/nomes.txt /Users/pluzzardi/palavras.dat /Users/pluzzardi/pessoa.dat /Users/pluzzardi/pessoas.dat /Users/pluzzardi/Pictures /Users/pluzzardi/Projects /Users/pluzzardi/Public Programa exemplo (46): O programa exibe na tela (lista) os arquivos e diretórios do “pathname” especificado pelo usuário. // -------------------------------------------- Fonte: Prog46.java package prog46; import java.io.File; import java.util.Scanner; 108 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()); } } } Resultado do Programa: Pathname: /Users/pluzzardi <enter> /Users/pluzzardi/.bash_history /Users/pluzzardi/.CFUserTextEncoding /Users/pluzzardi/.config /Users/pluzzardi/.cups /Users/pluzzardi/.dropbox /Users/pluzzardi/.DS_Store /Users/pluzzardi/.gbas /Users/pluzzardi/.local /Users/pluzzardi/.netbeans-derby /Users/pluzzardi/.ssh /Users/pluzzardi/.Trash /Users/pluzzardi/.viminfo /Users/pluzzardi/Desktop /Users/pluzzardi/Documents /Users/pluzzardi/Downloads /Users/pluzzardi/Dropbox /Users/pluzzardi/frutas.luz /Users/pluzzardi/Frutas.txt /Users/pluzzardi/Leitura.zip /Users/pluzzardi/Library /Users/pluzzardi/luzzardi.dat /Users/pluzzardi/Luzzardi.txt /Users/pluzzardi/Movies /Users/pluzzardi/Music /Users/pluzzardi/NetBeansProjects /Users/pluzzardi/nomes.sort /Users/pluzzardi/nomes.txt /Users/pluzzardi/palavras.dat /Users/pluzzardi/pessoa.dat /Users/pluzzardi/pessoas.dat /Users/pluzzardi/Pictures /Users/pluzzardi/Projects /Users/pluzzardi/Public 14.4 Manipulação de um arquivo de palavras A seguir são 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 gravação destas palavras. // --------------------------------------------- Fonte: Prog47.java package prog47; 109 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/pluzzardi"; File arquivo = new File(diretorio, "palavras.dat"); if (!arquivo.exists()) { FileWriter file = new FileWriter(arquivo); System.out.print("Número 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"); } } } Exemplo de gravação no arquivo “palavras.dat”: Número 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/pluzzardi"; File arquivo = new File(diretorio, "palavras.dat"); byte a; if (arquivo.exists()) { FileReader file = new FileReader(arquivo); int numPalavras = file.read(); 110 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 não existe"); } } } Resultado do Programa: Palavra: Palavra: Palavra: Palavra: Palavra: carambola beringela abacate ervilha damasco Programa exemplo (49): O programa permite consultar o arquivo de palavras (palavras.dat). Para tanto é solicitado, ao usuário, o número do registro para ser calculado a posição deste registro no arquivo. Logo após 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/pluzzardi"; 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("Posição [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) { 111 System.out.println("ERRO: Posição Inválida"); } } } } while (pos != 0); } else { System.out.println("ERRO: Arquivo não existe"); } } Resultado do Programa: Arquivo: /Users/pluzzardi/palavras.dat <enter> Total de Palavras: 5 Posição [1..5] ou [0] Sair: 1 <enter> Palavra: carambola <enter> Posição [1..5] ou [0] Sair: 2 <enter> Palavra: beringela <enter> Posição [1..5] ou [0] Sair: 3 <enter> Palavra: abacate <enter> Posição [1..5] ou [0] Sair: 4 <enter> Palavra: ervilha <enter> Posição [1..5] ou [0] Sair: 5 <enter> Palavra: damasco <enter> Posição [1..5] ou [0] Sair: 6 <enter> ERRO: Posição Inválida Posição [1..5] ou [0] Sair: 0 <enter> 14.5 Arquivo Texto A seguir contendo: é mostrado um programa que lê um 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/pluzzardi/Frutas.txt"; try { FileReader arqTexto = new FileReader(nomeArquivo); BufferedReader leitor = new BufferedReader(arqTexto); 112 arquivo texto 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 "); } } 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)número de linhas e (b) número 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"); } 113 } } Resultado do Programa: Nome do Arquivo: /Users/pluzzardi/NetBeansProjects/Bytes/src/bytes/bytes.java <enter> 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 número b) Número de Linhas c) Número 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/pluzzardi/Frutas.txt <enter> 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) 114 93 Byte(s) A seguir é mostrado um outro programa que lê um arquivo texto e o número de uma linha e exibe: (a) A linha especificada // ------------------------------------------------------------ Fonte: Linha.java package linha; import java.io.*; import java.util.Scanner; public class Linha { 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("Número 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 não Encontrada"); } } } Resultado do Programa: Nome do Arquivo: /Users/pluzzardi/Frutas.txt <enter> Número da Linha: 5 <enter> 5: pitanga O seguinte programa mostra como gravar três informações em um arquivo texto (Pessoa.dat): nome, idade e sexo de diversas pessoas. // -------------------------------------------------------- Fonte: WriteDados.java package writedados; import java.io.File; import java.io.FileWriter; import java.util.Scanner; public class WriteDados { public static void main(String[] args) throws Exception { Scanner entrada = new Scanner(System.in); String s; String diretorio = "/Users/pluzzardi/"; File arquivo = new File(diretorio, "Pessoa.dat"); if (!arquivo.exists()) { FileWriter file = new FileWriter(arquivo); do { 115 System.out.print("Nome: "); String nome = entrada.nextLine(); file.write(nome); file.write(":"); System.out.print("Idade: "); String idade = entrada.nextLine(); file.write(idade); file.write(":"); System.out.print("Sexo [M/F]: "); s = entrada.nextLine(); char sexo = s.charAt(0); file.write(sexo); file.write(":"); System.out.print("Continua [S/N]? "); do { s = entrada.nextLine(); } while ("SsNn".indexOf(s) == -1); } while ("S".equalsIgnoreCase(s)); file.close(); } else { System.out.println("ERRO: Arquivo já existe");} System.exit(0); } } Resultado do Programa: Nome: Paulo Roberto <enter> Idade: 51 <enter> Sexo [M/F]: m <enter> Continua [S/N]? s <enter> Nome: Renato Luis <enter> Idade: 49 <enter> Sexo [M/F]: m <enter> Continua [S/N]? s <enter> Nome: Francisco Carlos <enter> Idade: 53 <enter> Sexo [M/F]: m <enter> Continua [S/N]? n <enter> O seguinte programa mostra como recarregar as três informações gravadas em um arquivo texto acima (Pessoa.dat). // -------------------------------------------------------- Fonte: ReadDados.java package readdados; import import import import import import import java.io.File; java.io.FileReader; java.io.BufferedInputStream; java.io.BufferedReader; java.io.FileInputStream; java.io.InputStreamReader; java.util.Scanner; public class ReadDados { public static void main(String[] args) throws Exception { Scanner entrada = new Scanner(System.in); String diretorio = "/Users/pluzzardi/"; File arquivo = new File(diretorio, "Pessoa.dat"); FileInputStream in = new FileInputStream(arquivo); InputStreamReader conversor = new InputStreamReader(in); BufferedReader buffer = new BufferedReader(conversor); if (arquivo.exists()) { FileReader file = new FileReader(arquivo); String linha = buffer.readLine(); // lê todos os dados System.out.println("Linha: " + linha); String[] partes = linha.split(":"); int n = partes.length; System.out.println("Partes: " + n); for (int i = 0; i < n; i = i + 3) { System.out.println("Nome: " + partes[i]); System.out.println("Idade: " + Integer.parseInt(partes[i + 1])); System.out.println("Sexo: " + partes[i + 2]); 116 } file.close(); buffer.close(); } else { System.out.println("ERRO: Arquivo já existe"); } System.exit(0); } } Resultado do Programa: Linha: Paulo Roberto:51:m:Rento Luis:49:m:Francisco Carlos:53:m: Partes: 9 Nome: Paulo Roberto Idade: 51 Sexo: m Nome: Rento Luis Idade: 49 Sexo: m Nome: Francisco Carlos Idade: 53 Sexo: m 14.6 Lista de exercícios (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 número de bytes (caracteres) e o número de linhas do arquivo ou ERRO: Arquivo não existe. Exemplo: Nome do arquivo texto: LISTA.JAVA <enter> (12345) Bytes (44) Linhas ou ERRO: Arquivo não existe 14.6.2 Escreva um programa em Java que recebe via teclado o nome de um arquivo texto. O programa deve permitir ao usuário consultar o arquivo através da entrada via teclado do número da linha. O programa deve imprimir a linha especificada ou ERRO: Linha não existe (zero para abandonar). Exemplo: Nome do arquivo texto: LISTA.JAVA <enter> Número de linha: 7 <enter> 7: int i, j, k; Número de linha: 70 <enter> ERRO: Linha não existe Número de linha: 0 <enter> // saída do programa ERRO: Arquivo não 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 conteúdo do arquivo origem para o arquivo destino. Exemplo: Arquivo origem: LISTA.JAVA <enter> Arquivo destino: LISTA.tmp <enter> 117 (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 maiúsculo ou minúsculo (conforme escolha do usuário) gerando o arquivo texto destino. Exemplo: Arquivo fonte: LISTA.JAVA <enter> Arquivo destino: LISTA.TMP <enter> [+] Maiúsculo ou [-] Minúsculo: + <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 usuário consultar o arquivo através da entrada via teclado do número inicial e número final. O programa deve imprimir desde a linha inicial até a linha final ou ERRO: Linhas não existem. Exemplo: Nome do arquivo Número inicial: Número final: 9 7: int i, j, k; 8: char tecla; 9: long bytes = texto: LISTA.JAVA <enter> 7 <enter> <enter> 0; ou Número inicial: 70 <enter> Número final: 90 <enter> ERRO: Linhas não existem 14.6.7 Escreva um programa em Java (grava.java) que recebe via teclado o nome de um arquivo texto. O programa deve permitir ao usuário inserir nomes neste arquivo via teclado. O programa termina quando o usuário digitar <enter> na entrada do nome. Exemplo: Nome do arquivo texto: NOMES.TXT <enter> Nome: Beatriz <enter> Nome: Eva <enter> 118 Nome: Nome: Nome: Nome: Nome: Debora <enter> Carla <enter> Fatima <enter> Ana <enter> <enter> 14.6.8 Escreva um programa em Java (ler.java) que recebe via teclado o nome de um arquivo texto. O programa deve ler e imprimir na tela todos os nomes armazenados no arquivo pelo programa "grava.java". Exemplo: Nome do arquivo texto: NOMES.TXT <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 texto origem e um destino. O programa deve ler, ordenar e gravar novamente os nomes no arquivo destino. Exemplo: Nome do arquivo texto origem: NOMES.TXT <enter> Nome do arquivo texto destino: NOMES.SRT <enter> Ok, arquivo ordenado e copiado Observação: Utilize o programa anterior (ler.java) para ver os nomes ordenados. 14.6.10 Escreva um programa em Java que recebe via teclado o nome de um arquivo texto. O programa deve permitir ao usuário inserir nome, idade e sexo ([M]asculino ou [F]eminino) neste arquivo via teclado. O programa termina quando o usuário digitar <enter> na entrada do nome. Exemplo: Nome do arquivo texto: DADOS.TXT <enter> Nome: Paulo Roberto <enter> Idade: 41 <enter> Sexo [M/F]: m <enter> Nome: Renato Luis <enter> Idade: 38 <enter> 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 que recebe via teclado o nome de um arquivo texto. O programa deve ler e imprimir na tela todos os dados (nome, idade e sexo) armazenados no arquivo pelo programa "14.6.10" (veja exemplo abaixo). Exemplo: Nome do arquivo texto: DADOS.TXT <enter> Nome: Paulo Roberto 119 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 que recebe via teclado o nome de um arquivo texto. O programa deve verificar a quantidade de homens e a quantidade de mulheres no aquivo criado pelo programa "14.6.10". Exemplo: Nome do arquivo texto: DADOS.TXT <enter> (2) Homens (1) Mulheres 14.7 Acesso randômico em arquivos texto É possível acessar um arquivo texto de forma randômica (aleatória), ou seja, não puramente sequencial como é o padrão. Desta forma, pode-se acessar qualquer linha de um arquivo texto. Programa exemplo (14.6.2b): package prog14_6_2b; import java.io.RandomAccessFile; import java.io.IOException; import java.util.Scanner; public class Prog14_6_2b { public static void main(String[] args) { Scanner input = new Scanner(System.in); String linha; System.out.print("Nome do Arquivo Texto: "); String nomeArquivo = input.nextLine(); try { int nl; RandomAccessFile file = new RandomAccessFile(nomeArquivo, "r"); do { boolean encontrouLinha = false; System.out.print("Linha: "); String s = input.nextLine(); nl = Integer.parseInt(s); int linhas = 0; while ((linha = file.readLine()) != null) { linhas++; if (nl == linhas) { System.out.println(nl + ": " + linha); encontrouLinha = true; } } if (!encontrouLinha) { System.out.println("ERRO: Linha não existe"); } file.seek(0); // volta para a primeira linha } while (nl != 0); file.close(); } catch (IOException e) { System.out.println("Erro: Problema com o Arquivo"); } } 120 } Resultado do Programa: Nome do arquivo texto: LISTA.JAVA <enter> Número de linha: 7 <enter> 7: int i, j, k; Número de linha: 70 <enter> ERRO: Linha não existe Número de linha: 0 <enter> ERRO: Arquivo não existe 14.8 Arquivo binário de objetos em Java Em Java é possível gravar e carregar dados em arquivos binários que nada mais são que são filas de bytes. Abaixo são vistos dois programas: (a) BinaryWrite grava dados (nome idade e sexo) que são armazenados em um ArrayList e (b) programa BinaryRead recupera os dados (como uma lista de dados) gravados no arquivo binário gerado pelo programa BunaryWrite. // ---------------------------------------------- Fonte: BinaryWrite.java package binarywrite; import import import import import import java.io.File; java.io.ObjectOutputStream; java.io.FileOutputStream; java.io.IOException; java.util.ArrayList; java.util.Scanner; public class BinaryWrite { public static void main(String[] args) throws IOException { Scanner input = new Scanner(System.in); String s; ArrayList pessoa = new ArrayList(); System.out.print("Nome do Arquivo Binário: "); String nomeArquivo = input.nextLine(); try { File file = new File(nomeArquivo); ObjectOutputStream output = new FileOutputStream(file)); do { System.out.print("Nome: "); String nome = input.nextLine(); System.out.print("Idade: "); s = input.nextLine(); int idade = Integer.parseInt(s); System.out.print("Sexo [M/F]: "); s = input.nextLine(); char sexo = s.charAt(0); pessoa.add(nome); pessoa.add(idade); pessoa.add(sexo); do { System.out.print("Continua [S/N]? "); s = input.nextLine(); } while ("SsNn".indexOf(s) == -1); } while ("Nn".indexOf(s) == -1); output.writeObject(pessoa); // grava ArrayList output.close(); } catch (Exception e) { System.out.println(e.toString()); } } } Resultado do Programa: Nome do Arquivo Binário: /Users/pluzzardi/pessoa.dat <enter> 121 ObjectOutputStream(new Nome: Paulo <enter> Idade: 51 <enter> Sexo [M/F]: m <enter> Continua [S/N]? s <enter> Nome: Renato <enter> Idade: 49 <enter> Sexo [M/F]: M <enter> Continua [S/N]? s <enter> Nome: Francisco <enter> Idade: 53 <enter> Sexo [M/F]: m <enter> Continua [S/N]? s <enter> Nome: Ana <enter> Idade: 55 <enter> Sexo [M/F]: f <enter> Continua [S/N]? s <enter> Nome: Julia <enter> Idade: 54 <enter> Sexo [M/F]: F <enter> Continua [S/N]? N <enter> // ---------------------------------------------- Fonte: BinaryRead.java package binaryread; import import import import import java.io.File; java.io.FileInputStream; java.io.ObjectInputStream; java.util.ArrayList; java.util.Scanner; public class BinaryRead { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); System.out.print("Nome do Arquivo Binário: "); String nomeArquivo = entrada.nextLine(); try { File file = new File(nomeArquivo); ObjectInputStream input = new ObjectInputStream(new FileInputStream(file)); Object pessoa = input.readObject(); System.out.println(pessoa.toString()); } catch (Exception e) { System.out.println(e.toString()); } } } Resultado do Programa: Nome do Arquivo Binário: /Users/pluzzardi/pessoa.dat <enter> [Paulo, 51, m, Renato, 49, M, Francisco, 53, m, Ana, 55, f, Julia, 54, F] 122 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). 123 Tabela 14: Operadores bit a bit Operador & | ^ ~ >> << Ação And Or Or exclusivo (XOr) Complemento de um (Not) Deslocar para a direita (shift) Deslocar para a esquerda (shift) Deslocamento (shift): variável >> número de deslocamentos; Exemplo: // ---------------------------------------------- Fonte: bit.java package bit; public class Bit { public static void main(String[] args) { int a = 128, b, c; // a = 128 à binário -> 10000000 b = a >> 1; // b = 64 à binário -> 0100000 c = b << 1; // c = 128 àbinário -> 1000000 System.out.printf("a = %d\n",a); System.out.printf("b = %d\n",b); System.out.printf("c = %d\n",c); } } Resultado do Programa: a = 128 b = 64 c = 128 15.2 Formas abreviadas de Java Java tem abreviações especiais que simplificam a codificação de um certo tipo de comando de atribuição. Exemplo: x = x + 10; ... pode ser escrito como ... Esta forma abreviada aritméticos de Java. funcionará com x += 10; todos os Forma normal: variável = variável operador constante; x = x + 7; Forma abreviada: variável operador= constante; x += 7; 124 operadores 16. Listas Lineares: Pilha, Fila e Fila Circular A seguir é visto a implementação 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 saída 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 saída, é 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 - Saída de Dados Figura 4: Representação de uma fila e uma pilha Funcionamento desta pilha: Funcionamento desta fila: Entrada: 1, 2 e 3 Saída: 3, 2 e 1 Entrada: 1, 2 e 3 Saída: 1, 2 e 3 16.1 Implementação de um lista em vetor A seguir é visto um programa em Java que simula uma lista linear armazenada em um vetor. Note que o número de elementos da lista é armazenado no primeiro nodo do vetor, ou seja, v[0]. Programa exemplo (50): O programa permite inserir números inteiros em uma Lista Linear implementada em um vetor. Quando o número digitado for igual à zero (0), todos os números da lista são listados. // ----------------------------------------------- Fonte: Prog50.java package prog50; import javax.swing.*; 125 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]; int valor; int erro = 0; criaLista(v); do { String 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", "Atenção", JOptionPane.PLAIN_MESSAGE); exibeLista(v); return; } } while (valor != 0); exibeLista(v); } // -------------------------------------------------- criaLista static void criaLista(int [] v) { v[0] = 0; // armazena o número de elementos da lista } // -------------------------------------------------- incluiFim static int incluiFim(int m, int [] v, int valor) { 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", "Atenção", 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]nício, [P]osição ou [F]im) números inteiros em uma Lista Linear implementada em um vetor. Quando o número digitado for igual à zero (0), todos os números da lista são exibidos na tela. 126 // --------------------------------------------------------- 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]osição 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( "Posição [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", "Atenção", JOptionPane.PLAIN_MESSAGE); exibeLista(v); return; } } } while (valor != 0); exibeLista(v); } // -------------------------------------------------- criaLista static void criaLista(int [] v) { v[0] = 0; // armazena o número de elementos } // -------------------------------------------------- incluiFim static int incluiFim(int m, int [] v, int valor) { int n = v[0]; if (n < m - 1) { v[0]++; v[v[0]] = valor; return(SUCESSO); } else 127 return(LISTA_CHEIA); } // -------------------------------------------------- incluiInic static int incluiInic(int m, int [] v, int valor) { 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) { 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", "Atenção", JOptionPane.PLAIN_MESSAGE); else { for (int i = 1; i <= n; i++) s = s + v[i] + " "; JOptionPane.showMessageDialog(null, "Lista: " + s, "Lista", JOptionPane.PLAIN_MESSAGE); } } } 16.2 Implementação de uma Pilha 128 A seguir é mostrado uma implementação de Pilha usando a classe Pilha. Programa exemplo (52): O programa permite inserir números inteiros em uma Pilha usando uma classe Pilha implementada pelo programador. Quando o número digitado for igual à zero (0), todos os números da pilha são 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); } else return(0); } // ------------------------------------------------ exibe 129 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 <enter> Elemento: 40 <enter> Elemento: 30 <enter> Elemento: 20 <enter> Elemento: 10 <enter> Elemento: 5 <enter> Erro: Pilha Cheia Elemento: 0 <enter> Pilha: 10 20 30 40 50 16.3 Implementação de uma Fila A seguir é visto uma implementação de uma Fila usando a classe Fila escrita pelo programador. Programa exemplo (53): O programa permite inserir números inteiros em uma Fila usando uma classe Fila implementada pelo programador. Quando o número digitado for igual à zero (0), todos os números da fila são 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); } } // --------------------------------------------------- Fonte: Pilha.java // Fila.java package prog53; public class Fila { private int inic, fim, n; 130 private int [] dados; // ---------------------------------------- construtor public Fila(int numElementos) { inic = -1; fim = 0; n = 0; dados = new int[numElementos]; // construtor } // ------------------------------------------------ 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); } } Resultado do Programa: Elemento: 10 <enter> Elemento: 20 <enter> Elemento: 30 <enter> Elemento: 40 <enter> Elemento: 50 <enter> Elemento: 60 <enter> Erro: Fila Cheia Elemento: 0 <enter> Fila: 10 20 30 40 50 16.4 Implementação de uma Fila Circular Um problema que ocorre em estruturas de dados do tipo Fila é que após algumas operações de inserção e remoção de elementos, pode existir nodos vagos que não podem ser reaproveitados, pois normalmente uma fila possui três informações que a controlam: primeiro, último e número de elementos, não permitindo que os nodos excluídos sejam ocupados novamente. Uma forma de resolver este problema, é a utilização de uma Fila Circular, onde todo nodo inserido ou removido tem sua posição calculada por uma equação, fazendo com que, desta forma, sempre todos os nodos sejam reocupados com uma informação. Programa exemplo (54): O programa permite inserir números inteiros em uma Fila Circular, ou seja, existe reaproveitamento da fila. Quando o número digitado for igual à zero (0), todos os números da fila são listados. // ------------------------------------------------------------ Fonte: prog54.java package prog54; 131 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; } } // ----------------------------------- excluiFilaCircular public int excluiFilaCircular() { int n = elem.length; if (tamanho == 0) { System.out.println("ERRO: Fila Vazia"); return(-1); } else { 132 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 <enter> [I]ncluir, [E]xcluir Valor: 20 <enter> [I]ncluir, [E]xcluir Valor: 30 <enter> [I]ncluir, [E]xcluir Valor: 40 <enter> ERRO: Fila Cheia [I]ncluir, [E]xcluir Elemento Retirado da [I]ncluir, [E]xcluir Elemento Retirado da [I]ncluir, [E]xcluir Valor: 50 <enter> [I]ncluir, [E]xcluir Valor: 60 <enter> [I]ncluir, [E]xcluir Valor: 70 <enter> ERRO: Fila Cheia [I]ncluir, [E]xcluir ou [F]im? i <enter> ou [F]im? i <enter> ou [F]im? i <enter> ou [F]im? i <enter> ou [F]im? e <enter> Fila: 10 ou [F]im? e <enter> Fila: 20 ou [F]im? i <enter> ou [F]im? i <enter> ou [F]im? i <enter> ou [F]im? f <enter> 133 17. Tratamento de erros Na execução de um programa em Java, podem ocorrer erros não previstos que podem interromper a execução normal do programa. Tais erros podem ser: • • • • • • • Conversão numérica inválida; Limite de um vetor (acessor a índice inválido); Problemas com arquivos: abertura, criação ou caminho; Overflow; Erro de entrada e saída (input/output); Divisão por zero; Validação de dados. Em Java, o programa tem condições de assumir o controle execução em caso que ocorra uma situação de erro não prevista. da Isso é feito através do mecanismo de tratamento de exceções que ao detectar uma situação de erro, a máquina virtual Java gera uma exceção. Se o programa que estiver sendo executado possuir um tratamento de exceções, ele assume o controle da execução. Mas se a exceção não tiver um tratamento associado, o programa é interrompido e a máquina virtual Java gera uma mensagem de erro. Uma exceção é um evento que indica uma interrompe a execução normal de um programa. condição anormal que O tratamento de erros no Java cria objetos da classe erro, o tratamento destes erros é feita pela manipulação destes objetos. O tratamento de erros em Java basea-se em: try {} catch {} finally {}. A execução de um bloco de código, protegido por um tratamento de erros, é feito colocando o bloco no try, e para cada erro que se deseja tratar, deve-se colocar uma cláusula catch (tipo_de_erro variável_erro) {} e/ou uma cláusula finally (opcional) que é executada após a execução do bloco try se não houver erro. Sintaxe: try { // código fonte normal return; } catch (Exception error) { // código que trata um tipo de erro ou mostra o erro } catch (Exception error) { // código que trata outro tipo de erro ou exibe o erro } finally { // opcional // código executado, mesmo tendo excessão } 17.1 Tratamento de exceções 134 Exceções são instâncias de classes geradas quando houver erro. Estas exceções podem ser captadas e tratadas para que não ocorra erros em tempo de execução. Os métodos utilizados por classes de exceções são: • getMessage(): Retorna uma string com o erro. • printStackTrace(): Imprime na tela um histórico do erro e as linhas aonde os erros ocorreram. • toString(): Converte a exceção numa String. • getCause(): Retorna a causa da exceção ou “null” se a causa for desconhecida ou não existir. 17.2 Tratamento de erros: Entrada de número inteiro via teclado O programa exemplo abaixo verifica e trata a exceção: formato inválido do número (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: "); // código 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): [usuário digitou “120”] Inteiro: 120 INTEIRO: 120 Resultado do Programa (sem erro): [usuário digitou “abc”] Inteiro: abc ERRO: For input string: "abc" INTEIRO: -999 17.3 Tratamento de erros: Divisão por zero O programa exemplo abaixo verifica e trata os seguintes erros: (a) divisão por zero; (b) usuário apenas digitou <enter> sem nenhum número e (c) digitou letras (NumberFormatException e ArithmeticException). // ------------------------------------------------------ Fonte: Divisao.java 135 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 = -999; 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) { // não funcinou System.out.println ("Divisao: " + div); } System.exit(0); } } Resultado do Programa (sem erro): [usuário digitou “3” + “2”] Dividendo: 3 Divisor: 2 Divisao: 1.5 Resultado do Programa (sem erro): [usuário digitou “3” + “0”] Dividendo: 3 Divisor: 0 Divisao: Infinity Resultado do Programa (com erro): [usuário digitou “abc”] Dividendo: abc Status: For input string: "abc" 17.4 Tratamento de exceção 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: "); s = entrada.nextLine(); y = Integer.parseInt(s); div = (float) x / y; 136 System.out.println("Divisao: " + div); } catch (Exception error) { error.printStackTrace(); System.out.println("Status: Divisao por zero"); } } } Resultado do Programa (sem erro): [usuário digitou “3” + “2”] Dividendo: 3 Divisor: 2 Divisao: 1.5 Resultado do Programa (sem erro): [usuário digitou “3” + “0”] Dividendo: 3 Divisor: 0 Divisao: Infinity 17.5 Tratamento de exceção com MyException Em java pode-se criar uma exceção 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); // não funcionou } } 17.6 Exceção em ArrayList O programa abaixo mostra duas exceções: NumberFormatExcpetion e IllegalArgumentException usando-se um ArrayList. // ------------------------------------------------------ Fonte: arraylist.java package arraylist; import java.util.ArrayList; import javax.swing.JOptionPane; public class arraylist { 137 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()); } } } Resultado do Programa (sem erro): [usuário digitou “2” + “Paulo” + “Roberto”] Nome: Paulo Nome: Roberto Resultado do Programa (com erro): [usuário digitou “-1”] ERRO: ArrayList ilegal Illegal Capacity: -1 Resultado do Programa (com erro): [usuário digitou “abc”] ERRO: Conversao Ilegal For input string: "abc" 17.7 Exceções criadas pelo programador O programas a seguir, possui duas exceções 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 public int getCodigo() { return(this.codigo); } } 138 pelo // -------------------------------------------------------- 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; public class ListaObjeto { public static void main(String[] args) { ListObjet lista = new ListObjet(3); 139 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() + ")"); } } } 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 140 18. Herança em Java 18.1 Herança simples A herança simples permite que uma classe incorpore os atributos e métodos de outra classe, ou seja, permite a construção de hierarquias de classes. O primeiro passo envolve a definição de uma classe base (superclasse) que define as características comuns a todos os objetos derivados desta classe. As classes oriundas da classe base são chamadas classes derivadas ou extensão da classe (subclasse) Uma classe derivada herda todas as características da classe base e pode ter novas características adicionadas a ela. Uma classe derivada segue a seguinte diretriz em relação a classe base: classe_derivada é um(a) classe_base Exemplo: um cardial é um pássaro // classe base: pássaro // classe derivada: cardial Especificadores de acesso: ü public (público) ü ü ü ü private (privado) ü ü ü Quem tem acesso à classe tem acesso também a qualquer membro público. É raro ter atributos públicos, mas é comum ter métodos públicos. Qualquer método tem acesso. Um membro privado não é acessível fora da classe, somente pelos membros da classe. A intenção é permitir que apenas quem escreve a classe possa usar esse membro. protected (protegido) ü ü O membro protegido é acessível à classe e a suas sub-classes (classes derivadas). A intenção é dar acesso aos programadores que estenderão sua classe. 18.2 Controle de acesso na definição de uma classe derivada Quando uma classe derivada é definida, ou seja, na definição de herança simples, seus membros (atributos e métodos) são declarados internamente e o acesso a estes pode ser público (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 herança simples é: 141 Especificador_de_acess class nome_classe_derivada extends nomeclasse_base { // atributos // métodos } Quando uma classe herda as características 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 não podem ser acessados por classes derivadas. Quando o especificador de acesso é public, todos os membros públicos da classe base tornam-se membros públicos da classe derivada, e os membros protegidos da classe base tornam-se membros protegidos da classe derivada. Esta é a diferença que existe entre membros privativos e membros protegidos. Quando o especificador de acesso é private, todos os membros públicos e protegidos da classe base tornam-se membros privativos da classe derivada, ou seja, a classe derivada não pode transferir seus privilégios de acesso a outras classes. Quando o especificador de acesso é protected, todos os membros públicos e protegidos da classe base tornam-se membros protegidos da classe derivada. Programa exemplo (55): O objetivo do programa a seguir é demonstrar a utilização de herança simples (atributos da classe base são 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)); } // -------------------------------------------------------- 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); } } 142 // ---------------------------------------------------------- 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) { // não é possível acessar x e y pois são 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 (público): Todos os atributos da classe base são públicos na classe derivada. private (privado): Os atributos só podem ser acessados pelos métodos que fazem parte da classe. protected (protegido): Os atributos podem ser acessados pelos métodos de classes derivadas. Programa exemplo (56): utilização de herança protegidos). O objetivo do programa é demonstrar a simples (atributos da classe base são // ---------------------------------------------------------- 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)); } } // ----------------------------------------------------------- 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); } 143 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); // é possível acessar x e y pois são protegidos na classe base } } Resultado do Programa: z = 3 x = 1 y = 2 Soma (x + y): 3 Somador (x + y + z): 6 A seguir é visto a utilização do comando super. Super chamada ao construtor padrão da classe-pai. faz uma // ------------------------------------------------------------ Fonte: Derivada.java package heranca; public class Derivada extends Base { private int z; public Derivada(int x) { super(10, 20); // chamada formal ao construtor da classe pai //super(); z = x; System.out.println("z = " + z); } base public int Somador(int soma) { return(x + y + z); // é possível acessar x e y pois são privados a classe } protected void finalize() { System.out.println("Derivada: Final"); } } // ------------------------------------------------------------ Fonte: Base.java // // // // // // // // A palavra-chave super permite acesso ao construtor da superclasse (base) se for utilizada como nome de método, executa o construtor da superclasse Nota-se que se não houver, no construtor da subclasse, nenhuma chamada explicita ao construtor da superclasse, o construtor sem argumento é chamado por "default". Se for incluída uma chamada ao construtor da superclasse, ela deve ser o primeiro comando executado no construtor da subclasse. package heranca; public class Base { 144 protected int x, y; // atributos protegidos Base() { // construtor default this.x = 0; this.y = 0; System.out.println("x = " + this.x + " - y = " + this.y); } Base(int a, int b) { this.x = a; this.y = b; System.out.println("x = " + this.x + " - y = " + this.y); } public void Seta(int a, int b) { x = a; y = b; System.out.println("x = " + x); System.out.println("y = " + y); } protected int Soma() { System.out.println("Soma (x + y): " + (x + y)); return(x + y); } } // ------------------------------------------------------------ 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)); } } Resultado do Programa: x = 10 - y = 20 z = 3 x = 1 y = 2 Soma (x + y): 3 Somador (x + y + z): 6 18.4 Lista de exercícios sobre Herança 18.4.1 Herança (primeiro) Dado os seguintes códigos 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(); } } 145 // ----------------------------------------------------------------------- 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; } 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 modificações devem ser feitas no código fonte para que o resultado do programa seja o esperado? 18.4.2 Herança (segundo) Dado a classe base “Pessoa” e o programa principal “TestaHomem”, construa as classes derivadas “Homem” e “Mulher” que contenha os atributos e métodos abaixo descritos: // ------------------------------------------------------------------------ Pessoa.java package testahomem; public class Pessoa { protected double altura; protected char sexo; 146 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 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 Herança (terceiro) Dados os seguintes códigos 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); 147 System.out.println("Linha: "); linha.imprimeLinha(); System.out.println("Retângulo: "); retangulo.imprimeRetangulo(); } } // ------------------------------------------------------------------------ Objeto.java package testaobjetos; public class Objeto { protected int x; protected int y; Objeto() { x = 0; 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 = Retângulo: x = 1 - y = x = 3 - y = x = 3 - y = x = 1 - y = 2 4 2 2 4 4 148 149 19. Coletor de Lixo (Garbage Collector) O Java possui um coletor de lixo automático, mas pode-se chamálo implicitamente através do método: 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 = null; // marca para coletor de System.gc(); // chamada do coletor de System.out.println("Somador (x + y + z): " + objeto.Somador(resp)); lixo lixo " + objeto.Somador(resp)); } } // ------------------------------------------------ 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); // é possível acessar x e y pois são privados a classe base } } Resultado do Programa: Observação: O erro se deve ao objeto ter sido desalocado pelo coletor de lixo z = 3 x = 1 y = 2 Soma (x + y): 3 Somador (x + y + z): 6 Derivada: Final Exception in thread "main" java.lang.NullPointerException at testacoletorlixo.TestaColetorLixo.main(TestaColetorLixo.java:14) Java Result: 1 150 20. Construtor e finalizador em Java Em Java, uma classe além de poder ter um construtor, pode ter um finalizador (método: protected void finalize) que é executado automaticamente no término 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); // é possível acessar x e y pois são 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 } } Resultado do Programa: z = 3 x = 1 y = 2 Soma (x + y): 3 Somador (x + y + z): 6 Finalizador: Final do Programa 151 21. Applets em Java Applets são pequenos programas (aplicativos) escritos em Java que podem ser executados pela Java Virtual Machine em navegadores. São programas Java que podem ser embutidos em documentos HTML (Hypertext markup Language). Quando o navegador carrega uma página Web que contém uma applet, o applet é baixado para o navegador e então é 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); } Inserção 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); 152 g.drawLine(0, 280, 1279, 280); if (erro == 0) { 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; // divisão por zero else resp = divisao(x, y); break; if (x < 0) erro = 2; // raiz negativa 153 else case 'P': case 'p': case 'S': case 's': case 'C': case 'c': case 'T': case 't': resp = raizQuadrada(x); break; resp = power(x, y); break; resp = seno(x); break; // Raiz Quadrada // potência // seno resp = cosseno(x); break; // 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 154 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)); } } Inserção da Applet em um 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> $ 155 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 seqüencial isolado dentro do programa. Uma thread tem começo, fim e uma seqüência de comandos. Uma thread em Java não é um programa, pois não executa sozinha, ela executa dentro de um programa. Threads permitem que um programa simples possa executar várias tarefas diferentes ao mesmo tempo, independentemente uma das outras. Programas multithreaded são programas que contém várias threads, executando tarefas distintas simultaneamente. Uma thread possui um método run. Ele é responsável 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 método run de forma mais adequada à tarefa da thread; • Cria-se uma instância da thread que recebe como argumentos um objeto que implemente a interface Runnable. O objeto fornece o método run para a thread. Threads são independentes pois possuem sua própria: (a) pilha de execução; (b) contador de programa (program counter) e (c) variáveis locais. Porém, threads de um mesmo processo compartilham memória, descritores de arquivos (file handles) e outros atributos que são específicos daquele processo. Um processo pode conter múltiplas threads que parecem executar ao mesmo tempo e de forma assíncrona em relação as outras threads. Todas as threads de um mesmo processo compartilham o mesmo espaço de endereçamento de memória, o que significa que elas tem acesso as mesmas variáveis e objetos, e que eles podem alocar novos objetos de um mesmo heap. Ao mesmo tempo que isso torna possível que threads compartilhem informações entre si, é necessário que o desenvolvedor se assegure que uma thread não atrapalhe a execução de outra. 156 23. Sockets em Java Socket é um mecanismo para comunicação 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 conexão entre clienteservidor é realizada. O cliente solicita que uma conexão seja estabelida com o servidor através de um Socket. Quando o servidor aceita o pedido de conexão, ele cria um novo socket por uma porta diferente. No cliente, outro socket é criado e então é utilizado para a comunicação com este servidor. A seguir são vistos Client.java (liente). dois fontes: Server.java (Servidor) // --------------------------------------------------------- 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 comunicação: "); // espera conexao do cliente Socket connectionSocket = welcomeSocket.accept(); // cria ligação de entrada e saída 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 maiúsculas out = in.toUpperCase() + '\n'; // envia a linha maiúscula ao cliente outToClient.writeBytes(out); // exibe o código 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); // número 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 ligação com o teclado BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); // cria o socket de acesso ao server hostname ou localhost na porta 6789 157 e } //Socket clientSocket = new Socket("200.132.45.130", 6789); Socket clientSocket = new Socket("localhost", 6789); // cria ligações 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("Conexão Fechada"); clientSocket.close(); } Execução dos Programas: Servidor: MacBook-Pro-de-Paulo-Luzzardi:Java luzzardi$ javac Server.java MacBook-Pro-de-Paulo-Luzzardi:Java luzzardi$ java Server Esperando comunicação: Cliente [1] Mensagem Recebida: Paulo Roberto Gomes Luzzardi Mensagem Respondida: PAULO ROBERTO GOMES LUZZARDI Esperando comunicação: Cliente [2] Mensagem Recebida: Paola de Freitas Luzzardi Mensagem Respondida: PAOLA DE FREITAS LUZZARDI Esperando comunicação: Cliente [3] Mensagem Recebida: Adriane Maria Mensagem Respondida: ADRIANE MARIA Esperando comunicação: 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 Conexão 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 Conexão 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 Conexão Fechada MacBook-Pro-de-Paulo-Luzzardi:Java luzzardi$ 158 24. Data e Hora em Java Em Java é possível verificar a data e hora da máquina. Abaixo é visto várias formas de imprimir na tela a data e horário. // ------------------------------------------ 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)); } } Resultado 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 159 25. Glossário em Java Objetos são entidades lógicas que contém atributos (dados armazenados em variáveis) e métodos (funções) que manipulam estes dados. Um objeto pode ser definido através de um tipo de dado chamado classe (class). f) Atributos: São as variáveis definidas e declaradas para cada objeto. g) Métodos: São as funções definidas pelo programador que servirão para manipular os atributos. h) Mensagens: São as chamadas dos métodos. i) Classe: É um tipo de dado definido por class. Uma classe não é um objeto, é sim uma descrição do objeto. j) Instância: Os objetos são instâncias de uma classe. Resumidamente, objetos são instâncias de classes que respondem as mensagens através dos métodos escritos pelo programador. Outros conceitos importantes em linguagens orientadas à objetos são: Applet: São programas Java que podem ser embutidos em documentos HTML (Hypertext markup Language). Quando o navegador carrega uma página Web que contém uma applet, o applet é baixado para o navegador e então é 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 seqüencial isolado dentro do programa. Uma thread tem começo, fim e uma seqüência de comandos. Uma thread em Java não é um programa, pois não executa sozinha, ela executa dentro de um programa. Threads permitem que um programa simples possa executar várias tarefas diferentes ao mesmo tempo, independentemente umas das outras. Programas multithreaded são programas que contém várias threads, executando tarefas distintas simultaneamente. Classe Base (superclasse): Define as características comuns a todos os objetos derivados desta classe, ou seja, define atributos e métodos que serão passados as classes derivadas. classe derivada (subclasse): Classe oriunda de uma classe base. Herda todos os métodos e atributos públicos ou protegidos da classe base. Uma linguagem de programação orientada à objetos pode suportar até 6propriedades: abstração, encapsulamento, herança, polimorfismo, associação (agregação e composição) e classes abstratas e concretas. Abstração: Objetos devem representar dados do mundo real. Polimorfismo (grego: “muitas formas”): É a capacidade de objetos diferentes reagirem segundo a sua função a uma ordem padrão. Significa que o nome de um objeto pode ser utilizado para vários propósitos ligeiramente diferentes, ou seja, “ ... uma interface, vários métodos ... ”. A característica de polimorfismo é utilizada na sobrecarga de métodos, sobrecarga de operadores e em classes abstratas e concretas. • Sobrecarga de Operador: Permite sobrecarregar realizar vários tipos de operações; 160 operadores para • Sobrecarga de Método: Permite que um método retorne diferentes tipos de informações e aceita argumentos de vários tipos, inclusive com número diferentes de parâmetros; • Classes abstratas e concretas: Permite representar entidades e conceitos abstratos, sendo sempre uma superclasse (ou classe Base) e não permite ser instanciada, a classe abstrata apenas define um modelo (template) para uma funcionalidade e fornece uma implementação incompleta que é herdada pelas classes derivadas. Cada classe derivada implementa as funcionalidades da classe abstrata. Uma classe abstrata pode possuir métodos abstratos, mas os métodos são escritos nas classes derivadas concretas. Métodos abstratos definem apenas a forma do método não contendo nenhum tipo de código. Classes concretas implementam todos os métodos e podem ser instanciadas. Herança: É o processo pelo qual uma classe de objetos pode adquirir as propriedades de outra classe de objetos, em outras palavras, um objeto herda as características de outro (herança simples) ou vários objetos (herança múltipla – Java não possui herança múltipla). Encapsulamento (encapsulação): Os objetos possuem internamente atributos e métodos agrupados no mesmo local, onde os métodos 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 característica 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 métodos que manipulam os atributos. Diagrama de Objetos: Exibe o conjunto de objetos e seus relacionamentos em determinado ponto no tempo (comportamento estático). Diagrama de Componentes: Exibe as dependências entre componentes do sistema. São utilizados para: (a) modelar a organização do código fonte; (b) modelar a chamada de programas externos; (c) modelar o banco de dados; (d) modelar sistemas adaptativos e (e) Engenharia de produção e Engenharia reversa. Diagrama de Instalação: Exibe a configuração dos nodos de processamento em tempo de execução e os componentes existentes. Diagrama de Atividades: São utilizados para detalhar classes, a implementação de operações e casos de uso. Diagrama de Mapa de Estados: Exibe o ciclo de vida de um objeto em níveis de detalhe simples ou complexos. Mostra a seqüência de estados que um objeto ou a interação percorrida durante sua vida em resposta a estímulos recebidos e as próprias ações e respostas (comportamento dinâmico). Diagrama de Colaborações: Modela as interações entre objetos. É focado na seqüência cronológica de uma situação que está sendo modelado, focalizando no relacionamento entre os objetos e na compreensão dos efeitos sobre um objeto durante uma situação. Diagrama de Sequência: Modela a interação entre objetos em um sistema. Apresenta os objetos e as mensagens (métodos) que são passadas entre estes objetos dentro do caso de uso. Diagrama de Casos de Uso: Exibe os usuários e a relação entre os usuários e os casos de uso. 161 Diagrama de Classe: Pilha e Fila Figura 5: Exemplos de Diagrama de Classes 162 26. Curiosidades do Java A seguir são 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 Lógicos: Java possui os seguintes operadores lógicos para and e ou: (&&) (||) (&) (|). Os operadores (&&) e (||) são conhecidos como Short Circuit Operator (operadores de curto circuito), ou seja, são operadores mais rápidos que & e |, pois quando não houver mais necessidade de testar as outras condições, o controle do programa passa adiante. 163 27. Classe Object Em Java, todas as classes, sem nenhuma exceção, herdam direta ou indiretamente todos os métodos da classe Object, pois ela é a superclasse de qualquer outra classe. Pacote: java.lang.Object (não é necessário fazer a chamada implícita 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); } } Resultado 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); } } Resultado 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(); 164 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]); } } } Resultado do Programa: Número de Objetos: 4 Nome: paulo Nome: roberto Nome: gomes Nome: luzzardi String: luzzardi String: gomes String: roberto String: paulo A seguir são descritos os métodos da classe Object. Sintaxe: protected Object clone(); Cria e retorna uma cópia 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 não há mais referências ao objeto. Sintaxe: Class getClass(); Retorna a classe “runtime” do objeto. Sintaxe: int hashCode(); Retorna o valor do código “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 estão 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 métodos notify() ou notifyAll() deste objeto. Sintaxe: void wait(long timeout); Faz a corrente thread esperar até que outra thread invoque os métodos notify() ou notifyAll() deste objeto ou um período especificado de tempo tiver decorrido. Sintaxe: void wait(long timeout, int nanos); Faz a corrente thread esperar até que outra thread invoque os métodos notify() ou notifyAll() deste objeto, ou outra thread interrompa a corrente thread, ou um período especificado de tempo tiver decorrido. 165 28. Classe ArrayDeque Java possui classes pré-definidas para ArrayDeque, LinkedBlockingDeque e LinkedList. trabalhar com Deque: 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 são descritos os métodos da classe ArrayDeque. Sintaxe: boolean add(E e); Insere um elemento especificado no fim do deque. Sintaxe: void addFirst(E e); Insere um elemento especificado na frente do deque. Sintaxe: void addLast(E e); Insere um elemento especificado no fim do deque. Sintaxe: void clear(); Remove todos os elementos deste deque. Sintaxe: ArrayDeque<E> clone(); Returna uma cópia deste deque. Sintaxe: boolean contains(Object o); Returna true se este deque contém o elemento especificado. Sintaxe: Iterator<E> descendingIterator(); Returna um iterator sobre os elementos neste deque em ordem sequencial reversa. Sintaxe: E element(); Recupera, mas não remove, o cabeça da fila representada por este deque. Sintaxe: E getFirst(); Recupera, mas não remove, o primeiro elemento deste deque. Sintaxe: E getLast(); Recupera, ams não remove, o último elemento deste deque. Sintaxe: boolean isEmpty(); Returna true se este deque não contém elementos. Sintaxe: Iterator <E> iterator(); Returna um iterator sobre os elementos deste deque. Sintaxe: boolean offer(E e); Insere um elemento especificado no fim deste deque. Sintaxe: boolean offerFirst(E e); Insere um elemento especificado na frente deste deque. Sintaxe: boolean offerLast(E e); Insere um elemento especificado no fim deste deque. 166 Sintaxe: E peek(); Recupera, mas não remove, o cabeça da fila representada por este deque ou returna null se este deque está vazio. Sintaxe: E peekFirst(); Recupera, mas não remove, o primeiro elemento deste deque, ou retorna null se este deque está vazio. Sintaxe: E peekLast(); Recupera, mas não remove, o último elemento deste deque ou returna null se este deque está vazio. Sintaxe: E poll(); Recupera e remove o cabeça 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: E pop(); Retira um elemento na pilha representada por este deque. Sintaxe: void push(E e); Insere um elemento na pilha representada por este deque. Sintaxe: E remove(); Recupera e remove o cabeça da fila representada por este deque. Sintaxe: boolean remove(Object o); Remove um instância simples de um elemento específico deste deque. Sintaxe: E removeFirst(); Recupera e remove o primeiro elemento deste deque. Sintaxe: boolean removeFirstOccurrence(Object o); Remove a primeira ocorrência do elemento especificado deste deque (quando percorre o deque da cabeça ao último). Sintaxe: E removeLast(); Recupera e remove o último elemento deste deque. Sintaxe: boolean removeLastOccurrence(Object o); Remove a última ocorrência do elemento especificado neste deque (quando percorre o deque da cabeça ao último). Sintaxe: int size(); Returna o número de elementos deste deque. Sintaxe: Object[] toArray(); Returna um array contendo todos os elementos deste deque em ordem crescente (do primeiro até o último elemento). 167 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 utilização 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; 168 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; } } } while (!strChr("Ff", tecla)); } // ----------------------------------------------- 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); } } Resultado do Programa: Deque: [] [I]ncluir, [C]onsultar, [E]xcluir [E]squerda ou [D]ireita: e Nodo: 10 Deque: [10] [I]ncluir, [C]onsultar, [E]xcluir [E]squerda ou [D]ireita: d Nodo: 20 Deque: [10, 20] [I]ncluir, [C]onsultar, [E]xcluir [E]squerda ou [D]ireita: d Nodo: 30 Deque: [10, 20, 30] [I]ncluir, [C]onsultar, [E]xcluir ou [F]inalizar: i ou [F]inalizar: i ou [F]inalizar: i ou [F]inalizar: f 169 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); } } Resultado do Programa: Decimal Double: 1,23 Decimal Inteiro: 012 170 30. Leitura e gravação de objetos (registro) em Arquivos Em Java é possível ler e gravar dados organizados em registros. Um registro é um conjuntos de campos, onde campos são qualquer tipo em Java. public class Registro { Object nome; Object idade; Object sexo; } nome idade sexo 30.1 Gravação de objetos em um arquivo binário de objetos O programa abaixo permite gravar em um arquivo binário de objetos as seguintes informações: 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) { } System.out.println("ERRO Fatal: Problema na criação do Arquivo: " + nomeFile); } // ------------------------------- 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); } 171 // ------------------------------- 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: Impossível 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 Binário: "); 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(); } } Resultado do Programa: Nome do Arquivo Binário: /Users/pluzzardi/Objeto.dat Ok, Arquivo criado: /Users/pluzzardi/Objeto.dat Ok, Arquivo fechado: /Users/pluzzardi/Objeto.dat Observação: Por questões didáticas, simplificação, não foi testado se o arquivo binário existe, ou seja, se ele existir, será sobre-escrito. Solução 2: Nesta solução o usuário digita os nomes, idades e sexo das pessoas. // -------------------------------------------------------- Registro.java package writefile2; 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 writefile2; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; public class FileObjeto { // ------------------------------ atributos 172 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) { System.out.println("ERRO Fatal: Problema na criação do Arquivo: nomeFile); } } " // ------------------------------- addFile public void addFile(Registro registro) throws IOException, ClassNotFoundException { fileOut.writeObject(registro.nome); fileOut.writeObject(registro.idade); fileOut.writeObject(registro.sexo); } // ------------------------------- 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: Impossível fechar o arquivo: " + nomeFile); System.exit(1); } } } // -------------------------------------------------------- WriteFile2.java package writefile2; import java.io.IOException; import java.util.Scanner; public class WriteFile2 { public static void main(String[] args) throws IOException, ClassNotFoundException { Scanner input = new Scanner(System.in); char ch; System.out.print("Nome do Arquivo: "); String nomeArquivo = input.nextLine(); FileObjeto file = new FileObjeto(nomeArquivo); do { System.out.print("Nome: "); String nome = input.nextLine(); System.out.print("Idade: "); String s = input.nextLine(); int idade = Integer.parseInt(s); System.out.print("sexo [M]asculino ou [F]eminino: "); s = input.nextLine(); char sexo = s.charAt(0); Registro registro = new Registro(nome, idade, sexo); file.addFile(registro); System.out.print("Continua [S/N]? "); do { s = input.nextLine(); ch = s.charAt(0); } while (!strChr("SsNn", ch)); } while (strChr("Ss", ch)); file.closeFile(); } // ------------------------------- strChr static boolean strChr(String s, char ch) { 173 + int n = s.length(); } for (int i = 0;i < n;i++) { if (s.charAt(i) == ch) { return(true); } } return(false); } Resultado do Programa: Nome do Arquivo: /Users/pluzzardi/luz.dat Ok, Arquivo criado: /Users/pluzzardi/luz.dat Nome: Paulo Roberto Idade: 51 sexo [M]asculino ou [F]eminino: m Continua [S/N]? s Nome: Renato Luis Idade: 49 sexo [M]asculino ou [F]eminino: m Continua [S/N]? s Nome: Francisco Carlos Idade: 53 sexo [M]asculino ou [F]eminino: m Continua [S/N]? n Ok, Arquivo fechado: /Users/pluzzardi/luz.dat 30.2 Leitura objetos em um arquivo binário de objetos O programa abaixo permite carregar (ler) de um arquivo binário de objetos com as seguintes informações: 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); } catch (IOException ioException) { System.out.println("ERRO Fatal: Problema na Abertura do Arquivo: " + nomeFile); System.exit(1); } } // ------------------------------- getFile public void getFile() throws IOException, ClassNotFoundException { 174 } 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: Impossível 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 Binário: "); String nomeArquivo = input.nextLine(); FileObjeto file = new FileObjeto(nomeArquivo); file.getFile(); file.closeFile(); } } Resultado do Programa: Nome do Arquivo Binário: /Users/pluzzardi/Objeto.dat Ok, Arquivo Aberto: /Users/pluzzardi/Objeto.dat Nome Idade Sexo Paulo Roberto 50 m Adriane Maria 42 f Paola 13 f Ok, Arquivo fechado: /Users/pluzzardi/Objeto.dat ou Nome do Arquivo: /Users/pluzzardi/luz.dat Ok, Arquivo Aberto: /Users/pluzzardi/luz.dat Nome Idade Sexo Paulo Roberto 51 m Renato Luis 49 m Francisco Carlos 53 m Ok, Arquivo fechado: /Users/pluzzardi/luz.dat 175 31. Eliminar problemas de conversão na entrada de Dados Como em qualquer outra linguagem de programação, um grave problema que ocorre em Java na entrada de dados, via teclado, é quando o usuário digita letras (caracteres) numa entrada de números (inteiros ou reais), pois mesmo que os dados lidos e armazenados no buffer de entrada sejam armazenados em uma String, no momento da conversão para inteiro ou real, os métodos utilizados não permitem a conversão e retornam erro em tempo de execução. Já foi visto anteriormente, que este problema pode ser resolvido com tratamento de excessão, mas ainda pode-se resolver este problema com o método replaceALL, ou seja, eliminar, antes da conversão, todos os caracteres que não são números de 0 à 9 e o sinal de menos ‘-‘. Confira no programa abaixo esta forma de resolver o problema: // EliminaErroEntrada.java // Marcos André Gerard Alves & Augusto Roschildt da Silva package eliminaerroentrada; import javax.swing.JOptionPane; public class EliminaErroEntrada { public static void main(String[] args) { // entrada do usuário lida e armazenada em uma String String s = JOptionPane.showInputDialog("Digite um Número:"); // método replaceAll elimina todos os caracteres que não são números ou “-“ s = s.replaceAll("[^0-9\\-.]", ""); // eliminação de caracteres if (s.isEmpty()) { System.out.println("ERRO: Problema na Conversão para Inteiro"); } else { // conversão pode ser feita sem problemas, pois a String s não possui letras int numero = Integer.parseInt(s); JOptionPane.showMessageDialog(null, "Número: " + numero); } } } Observação: Note que o método replaceALL elimina todos os caracteres que não são números de dentro da String s, deixando de fora apenas o sinal menos ‘-‘ e o ponto ‘.’. Funcionamento: Todos os caracteres que não são números “[ˆ0-9\\-.]” são trocados por “”, ou seja, são eliminados da String, exceto o sinal de menos ‘-‘ e o ponto ‘.’. Outro problema que pode acontecer é que o usuário pode digitar o sinal de menos em qualquer parte, ou seja, depois dos números, isto pode ser eliminado com o seguinte código, usando uma variável boleana (sinal). // EliminaErroEntrada3.java package eliminaerroentrada3; import javax.swing.JOptionPane; public class EliminaErroEntrada3 { public static void main(String[] args) { boolean sinal = false; String s = JOptionPane.showInputDialog("Digite um Número:"); if (s.contains("-")) { // verifica se existe o sinal negativo sinal = true; } s = s.replaceAll("[^0-9]", ""); // eliminar letras, inclusive o sinal de menos if (s.isEmpty()) { System.out.println("ERRO: Problema na Conversão para Inteiro"); } else { int numero = Integer.parseInt(s); if (sinal) { numero = -numero; // converte o número para negativo } JOptionPane.showMessageDialog(null, "Número: " + numero); } } } O exemplo abaixo permite que o usuário digite ‘,’ (vírgula) no lugar do ponto, o método verificaVirgula procura e troca a vírgula por ‘.’ (ponto). 176 package entradavirgula; import javax.swing.JOptionPane; public class EntradaVirgula { public static void main(String[] args) { String s; do { s = JOptionPane.showInputDialog("Digite um Número:"); s = s.replaceAll("[^0-9\\-.,]", ""); // eliminar letras, menos “-.,” s = verificaVirgula(s); } while (s.isEmpty()); double numero = Double.parseDouble(s); JOptionPane.showMessageDialog(null, "Número: " + numero); } static String verificaVirgula(String s) { char []r = s.toCharArray(); // converte string para um vetor de caracteres int n = s.length(); for (int i = 0;i < n;i++) { if (r[i] == ',') { // procura por uma vírgula r[i] = '.'; // troca vírgula por ponto break; } } s = ""; for (int i = 0;i < n;i++) { // reconverte o vetor de caracteres para String s = s + r[i]; // concatena caracter em uma String } return(s); } } 177 32. Classe para Entrada de Inteiros e Reais em Java sem Erro na Digitação A seguir, são vistos dois programas em Java, cada um com as classes: “EntradaDadosScanner” e “EntradaDadosSwing”, respectivamente, e que permitem a entrada de dados via teclado de números inteiros (leInteiro) e reais (LeReal) sem erro de conversão (Integer.parseInt e Double.parseDouble) por descuido na digitação pelo usuário, ou seja, o usuário pode digitar qualquer coisa (em tese, por enquanto) que os métodos da classe eliminam os erros de digitação. Imagine a seguinte entrada de um inteiro e de um real em um programa Java com este tipo de digitação (em vermelho): Teste do Programa: Digite um Inteiro: -123 de oliveira 4,.56—78 <enter> Inteiro Digitado: 12345678 Digite um Real: -123,.,.45--,.56 <enter> Real Digitado: 123.4556 Analise a resposta em letras azuis. O programa eliminou todos os caracteres inválidos para um inteiro ou para um real, inclusive pontos (.) e vírgulas (,) repetidas e o sinal negativo (-) no local indevido. // ----------------------------------- Programa Principal: ProgEntradaDadosScanner.java package progentradadadosscanner; public class ProgEntradaDadosScanner { public static void main(String[] args) { EntradaDadosScanner entrada = new EntradaDadosScanner(); int inteiro = entrada.leInteiro("Digite um Inteiro: "); System.out.println("Inteiro Digitado: " + inteiro); Double real = entrada.leReal("Digite um Real: "); System.out.println("Real Digitado: " + real); } } // --------------------------------------------------- Classe: EntradaDadosScanner.java package progentradaDados; import java.util.Scanner; public class EntradaDadosScanner { // ------------------------------------------------------ métodos públicos da classe // -------------------------------------------------- leInteiro public int leInteiro(String mensagem) { Scanner input = new Scanner(System.in); String s; int limite, n; do { System.out.print(mensagem); s = input.nextLine(); s = s.replaceAll("[^0-9\\-]", ""); // eliminar letras e caracteres não numéricos n = s.length(); if (n == 1 && s.charAt(0) == '-') { s = ""; 178 } } else { if (n > 0) { s = retiraNegativosForaLugar(s); if (s.charAt(0) == '-') { limite = 11; } else { limite = 10; } if (n >= limite) { s = verificaLimites(s); } } } } while (s.isEmpty()); int inteiro = Integer.parseInt(s); // conversão segura sem erros return (inteiro); // -------------------------------------------------- leReal public double leReal(String mensagem) { Scanner input = new Scanner(System.in); String s; do { System.out.print(mensagem); s = input.nextLine(); s = s.replaceAll("[^0-9\\-.,]", ""); // eliminar letras s = verificaVirgulaPonto(s); s = retiraNegativosForaLugar(s); int n = s.length(); if (n == 1 && (s.charAt(0) == '-' || s.charAt(0) == '.')) { s = ""; } } while (s.isEmpty()); double real = Double.parseDouble(s); // conversão segura sem erros return (real); } // ----------------------------------------------------- métodos privados da classe // -------------------------------------------------- verificaVirgulaPonto private String verificaVirgulaPonto(String s) { int pontos = 0; char[] r = s.toCharArray(); int n = s.length(); for (int i = 0; i < n; i++) { if (r[i] == ',' || r[i] == '.') { r[i] = '.'; pontos++; } } if (pontos > 1) { r = retiraPontosRepetidos(r); } s = ""; for (int i = 0; i < r.length; i++) { s = s + r[i]; } return (s); } // -------------------------------------------------- retiraPontosRepetidos private static char[] retiraPontosRepetidos(char[] s) { int n = s.length; String r = ""; boolean copiou = false; int j = 0; for (int i = 0; i < n; i++) { if (s[i] != '.') { r = r + s[i]; j++; } else { if (!copiou) { r = r + '.'; copiou = true; } } } return (r.toCharArray()); 179 } // -------------------------------------------------- retiraNegativosForaLugar private static String retiraNegativosForaLugar(String s) { String r = ""; int n = s.length(); for (int i = 0; i < n; i++) { if (s.charAt(i) != '-' || i == 0) { r = r + s.charAt(i); } } return (r); } } // -------------------------------------------------- verificaLimites private static String verificaLimites(String s) { String limiteInferior = "-2147483648"; String limiteSuperior = "2147483647"; if (s.compareTo(limiteInferior) > 0 || s.compareTo(limiteSuperior) > 0) { System.out.println("ERRO: Excedeu o Limite dos Números Inteiros"); return (""); } return (s); } A seguir a outra versão utilizando o pacote swing. // --------------------------------- Programa Principal: ProgEntradaDadosSwing.java package progentradadadosswing; import javax.swing.JOptionPane; public class ProgEntradaDadosSwing { public static void main(String[] args) { EntradaDadosSwing entrada = new EntradaDadosSwing(); int inteiro = entrada.leInteiro("Digite um Inteiro: "); JOptionPane.showMessageDialog(null, "Inteiro Digitado: " + inteiro); Double real = entrada.leReal("Digite um Real: "); JOptionPane.showMessageDialog(null, "Real Digitado: " + real); } } // --------------------------------------------------- Classe: EntradaDadosSwing.java package progentradadadosswing; import javax.swing.JOptionPane; public class EntradaDadosSwing { // ----------------------------------------------------- métodos públicos da classe // -------------------------------------------------- leInteiro public int leInteiro(String mensagem) { String s; int n, limite; do { s = JOptionPane.showInputDialog(mensagem); s = s.replaceAll("[^0-9\\-]", ""); // eliminar letras e caracteres não numéricos n = s.length(); if (!(n == 1 && s.charAt(0) == '-')) { if (n > 0) { s = retiraNegativosForaLugar(s); if (s.charAt(0) == '-') { limite = 11; } else { limite = 10; } if (n >= limite) { s = verificaLimites(s); } 180 } } else { s = ""; } } while (s.isEmpty()); int inteiro = Integer.parseInt(s); return (inteiro); } // -------------------------------------------------- leReal public double leReal(String mensagem) { String s; do { s = JOptionPane.showInputDialog(mensagem); s = s.replaceAll("[^0-9\\-.,]", ""); // eliminar letras s = verificaVirgulaPonto(s); s = retiraNegativosForaLugar(s); int n = s.length(); if (n == 1 && (s.charAt(0) == '-' || s.charAt(0) == '.')) { s = ""; } } while (s.isEmpty()); double real = Double.parseDouble(s); return (real); } // ----------------------------------------------------- métodos privados da classe // -------------------------------------------------- verificaVirgulaPonto private String verificaVirgulaPonto(String s) { int pontos = 0; char[] r = s.toCharArray(); int n = s.length(); for (int i = 0; i < n; i++) { if (r[i] == ',' || r[i] == '.') { r[i] = '.'; pontos++; } } if (pontos > 1) { r = retiraPontosRepetidos(r); } s = ""; for (int i = 0; i < r.length; i++) { s = s + r[i]; } return (s); } // -------------------------------------------------- retiraPontosRepetidos private static char[] retiraPontosRepetidos(char[] s) { int n = s.length; String r = ""; boolean copiou = false; int j = 0; for (int i = 0; i < n; i++) { if (s[i] != '.') { r = r + s[i]; j++; } else { if (!copiou) { r = r + '.'; copiou = true; } } } return (r.toCharArray()); } // -------------------------------------------------- retiraNegativosForaLugar private static String retiraNegativosForaLugar(String s) { String r = ""; int n = s.length(); for (int i = 0; i < n; i++) { if (s.charAt(i) != '-' || i == 0) { r = r + s.charAt(i); } } 181 return (r); } // -------------------------------------------------- verificaLimites private static String verificaLimites(String s) { String limiteInferior = "-2147483648"; String limiteSuperior = "2147483647"; if (s.compareTo(limiteInferior) > 0 || s.compareTo(limiteSuperior) > 0) { JOptionPane.showMessageDialog(null, "ERRO: Excedeu o Limite dos Números Inteiros"); return (""); } return (s); } } 182