Professional Documents
Culture Documents
e-mail /msn/facebook/orkut luzzardi@atlas.ucpel.tche.br e-mail pluzzardi@gmail.com Home Page http://infovis.ucpel.tche.br/luzzardi http://graphs.ucpel.tche.br/luzzardi Grupo de TV Digital Interativa http://www.tvdi.inf.br/site/ Grupo de Computao Grfica http://infovis.ucpel.tche.br
Bibliografia DEITEL, H. M. and DEITEL, P. J. Java, como programar, 4 ed.: Porto Alegre: Bookman, 2003 (ISBN 85-363-0123-6).
Sumrio
1. Arquitetura de um programa em Java ..................................................................................... 5
1.1 Elementos bsicos de um programa em Java ......................................................... 5
1.2 Elementos bsicos de um mtodo esttico ........................................................... 5
1.3 Como compilar um programa em Java via Terminal ........................................... 5
1.4 Como executar um programa em Java via Terminal ........................................... 5
1.5 Pasta contendo os projetos/arquivos em Java .................................................. 5
2. Estrutura de um programa em Java .......................................................................................... 6
2.1 Identificadores ..................................................................................................................... 6
2.2 Comentrios do programador ........................................................................................... 6
2.3 Regras gerais para escrever um programa em Java ........................................ 7
2.4 Palavras reservadas do Java ........................................................................................ 8
2.5 Declarao de variveis .................................................................................................. 8
2.5.1 Onde as variveis podem ser declaradas ..................................................... 8
2.5.2 Inicializao de variveis ................................................................................ 10
2.6 Constantes ............................................................................................................................... 10
2.6.1 Constantes hexadecimais e octais ................................................................. 10
2.6.2 Constantes Strings ................................................................................................... 11
2.6.3 Constantes especiais .............................................................................................. 11
2.7 Comandos do pr-processador do Java ................................................................... 11
2.7.1 O comando import ........................................................................................................ 11
3. Tipos de dados ................................................................................................................................... 12
3.1 Tipos bsicos ........................................................................................................................ 12
3.2 Escrevendo uma classe em Java ................................................................................. 12
3.2.1 Conceitos bsicos ......................................................................................................... 12
3.2.2 Referncia this .............................................................................................................. 14
3.2.3 Lista de Exerccios sobre Classes ................................................................... 15
3.3 Sobrecarga de mtodos em Java ................................................................................. 27
4. Mtodos de entrada e sada de dados ................................................................................ 29
4.1 Entrada de dados via teclado .................................................................................... 29
4.2 Sada de dados via tela ................................................................................................ 30
5. Operadores ............................................................................................................................................ 32
5.1 Operadores aritmticos .................................................................................................. 32
5.2 Operadores relacionais .................................................................................................. 32
5.3 Operadores lgicos ............................................................................................................ 32
5.4 Incremento e decremento ................................................................................................ 33
5.5 Operador de atribuio .................................................................................................. 33
5.6 Casts ........................................................................................................................................... 34
5.7 Expresses ............................................................................................................................... 35
6. Mtodos para funes matemticas padres .................................................................... 36
6.1 Math.abs .................................................................................................................................... 36
6.2 Math.asin ................................................................................................................................. 36
6.3 Math.acos ................................................................................................................................. 36
6.4 Math.atan ................................................................................................................................. 36
6.5 Math.sin .................................................................................................................................... 36
6.6 Math.cos .................................................................................................................................... 36
6.7 Math.tan .................................................................................................................................... 37
6.8 Math.exp .................................................................................................................................... 37
6.9 Math.pow .................................................................................................................................... 37
6.10 Math.sqrt ............................................................................................................................... 37
6.11 Math.log ................................................................................................................................. 37
6.12 Double.parseDouble ......................................................................................................... 37
6.13 Integer.parseInt .............................................................................................................. 37
6.14 Long.parseLong ................................................................................................................... 37
6.15 Math.log10 ............................................................................................................................. 37
6.16 Math.random .......................................................................................................................... 38 6.17 Math.PI .................................................................................................................................... 38 6.18 Converso de graus para radianos ........................................................................ 38 7. Comandos ................................................................................................................................................. 39 7.1 Tipos de comandos .............................................................................................................. 39 7.1.1 Sequncia ......................................................................................................................... 39 7.1.2 Seleo ............................................................................................................................. 39 7.1.3 Repetio ......................................................................................................................... 40 7.2 Comando if ............................................................................................................................... 41 7.2.1 if encadeados ............................................................................................................... 42 7.3 O comando switch ................................................................................................................. 42 7.4 Comando while ........................................................................................................................ 45 7.5 O comando for ........................................................................................................................ 46 7.6 O loop do { } while ......................................................................................................... 48 7.7 Interrupo de loops ....................................................................................................... 48 7.7.1 O comando break .......................................................................................................... 48 7.7.2 O comando continue ................................................................................................... 49 7.8 O mtodo System.exit () ................................................................................................ 49 8. Sada formatada (System.out.printf) ................................................................................ 50 9. Lista de exerccios (comandos) ............................................................................................ 51 10. Vetores, Matrizes e Strings ................................................................................................. 55 10.1 Vetores .................................................................................................................................... 55 10.2 Strings .................................................................................................................................... 55 10.3 Matrizes (Multidimensional) .................................................................................... 56 10.4 Vetor de Strings .............................................................................................................. 57 10.5 Inicializao de matrizes e vetores ................................................................. 58 10.6 Inicializao de um vetor de caracteres ....................................................... 58 10.7 Inicializao de matrizes multidimensionais ............................................. 58 10.8 Inicializao de vetores e matrizes sem tamanho .................................... 58 10.9 Classificao de dados ou ordenao (sort) ................................................ 60 10.10 Lista de exerccios (vetores) ............................................................................. 61 11. Manipulao de Strings ............................................................................................................. 64 11.1 Mtodos para manipular Strings ............................................................................. 64 11.2 Lista de exerccios (Strings) ............................................................................... 68 12. Mtodos estticos definidos pelo programador ........................................................ 70 12.1 Valores de retorno ......................................................................................................... 71 12.2 Passagem de parmetros por valor ........................................................................ 73 12.3 Passagem de parmetros por referncia ............................................................ 74 12.4 Mtodos que devolvem valores no-inteiros .................................................. 74 12.5 Argumentos do main (String [] args) ................................................................. 75 12.6 Recursividade ..................................................................................................................... 76 12.7 Lista de Exerccios (mtodos) ............................................................................... 78 13. Classes (Interface ou Coleo) existentes em Java (Container) ................ 81 14. Entrada e sada em disco (Arquivos) .............................................................................. 95 14.1 Mtodos para manipular arquivos em Java ....................................................... 95 14.2 Abertura de um arquivo texto ................................................................................. 97 14.3 Listar um diretrio ....................................................................................................... 98 14.4 Manipulao de um arquivo de palavras ............................................................ 98 14.5 Arquivo Texto ................................................................................................................... 101 14.6 Lista de exerccios (arquivos) ........................................................................... 104 15. Conceitos diversos em Java .................................................................................................. 108 15.1 Operadores bit a bit ................................................................................................... 108 15.2 Formas abreviadas de Java ....................................................................................... 108 16. Listas Lineares: Pilha, Fila e Fila Circular ...................................................... 109 16.1 Implementao de um lista em vetor ................................................................. 109 16.2 Implementao de uma Pilha .................................................................................... 113
16.3 Implementao de uma Fila ....................................................................................... 114 16.4 Implementao de uma Fila Circular ................................................................. 115 17. Tratamento de erros .................................................................................................................. 118 17.1 Tratamento de excees .............................................................................................. 119 17.2 Tratamento de erros: Entrada de nmero inteiro via teclado ....... 119 17.3 Tratamento de erros: Diviso por zero .......................................................... 119 17.4 Tratamento de exceo com Exception ............................................................... 120 17.5 Tratamento de exceo com MyException .......................................................... 121 17.6 Exceo em ArrayList ................................................................................................... 121 17.7 Excees criadas pelo programador ................................................................... 122 18. Herana em Java ............................................................................................................................ 125 18.1 Herana simples ............................................................................................................... 125 18.2 Controle de acesso na definio de uma classe derivada ................. 125 18.3 Tipos de acessos (especificadores de acesso) ......................................... 127 18.4 Lista de exerccios sobre Herana ................................................................... 128 18.4.1 Herana (primeiro) ................................................................................................... 128 18.4.2 Herana (segundo) ..................................................................................................... 129 18.4.3 Herana (terceiro) ................................................................................................... 130 19. Coletor de Lixo (Garbage Collector) ............................................................................ 132 20. Construtor e finalizador em Java ................................................................................... 133 21. Applets em Java ............................................................................................................................ 134 22. Threads em Java ............................................................................................................................ 138 23. Sockets em Java ............................................................................................................................ 139 24. Data e Hora em Java .................................................................................................................. 141 25. Glossrio em Java ....................................................................................................................... 142 26. Curiosidades do Java ................................................................................................................ 145 27. Classe Object ................................................................................................................................. 146 28. Classe ArrayDeque ....................................................................................................................... 148 29. Formatar um double, float ou int ................................................................................... 151 30. Leitura e gravao de objetos (registro) em Arquivos ................................... 152 30.1 Gravao de objetos em um arquivo binrio de objetos ...................... 152 30.2 Leitura objetos em um arquivo binrio de objetos ............................... 153
Convenes: Sempre comear um identificador com uma letra e no "$" ou "_". Os caracteres $ e _ nunca devem ser usados. Use nomes completos em vez de abreviaes confusas. Palavras-chaves e palavras reservadas da linguagem no podem ser usadas como identificadores. Se o identificador tiver mais de um nome, o primeiro deve comear com letra minscula e os demais devem comear com letras maisculas (int numeroDentes = 0). int numeroDentes = 32; double inflacao; char a, _a; // _a deve ser evitado
Exemplos em variveis:
Exemplos em constantes: final char letra = A; final int tamanho = 10; final double d = 123.45; Exemplos de argumentos: public int Div(int x, int y) { public boolean strChr(String s, char ch) { Exemplos de atributos: private int numElementos; private int []vetor; private int topo; x = raizQuadrada(y); System.out.println(Valor: + inverso(n));
Exemplos em mtodos:
Observao: o mtodo inverso definido pelo programador (1/n). 2.2 Comentrios do programador Os comentrios do programador so linhas de cdigo que no so compiladas pelo compilador, ou seja, servem apenas como anotaes (documentao) para serem lembradas mais tarde (por exemplo, quando forem feitas manutenes no programa). Em Java os comentrios podem ser feitos de duas formas: /* Assim pode ser usado para comentrio de vrias linhas */ // Isto um comentrio de uma linha apenas
Um comentrio, pode ainda, utilizar vrias linhas do programa. Veja o exemplo abaixo:
/* ---------------------------------------------------Mtodo: STRING Argumentos de entrada: x, y Argumentos de sada: c[], t[] Retorno: Sem Retorno ------------------------------------------------------- */
2.3 Regras gerais para escrever um programa em Java Um programa em Java constitudo de uma ou mais classes delimitadas por chaves { }, onde uma destas classes, obrigatoriamente possui um mtodo chamada main(). As principais regras so: Letras maisculas e minsculas so tratadas como caracteres diferentes; O formato do texto livre; O mtodo main(){} especifica onde o programa comea e termina de ser executado; Todos os comandos so terminados por ponto e vrgula; Todas as variveis devem ser declaradas; { mtodo comea a ser executado; } mtodo termina de ser executado. (1): Imprimir a data no seguinte formato: [Data:
// -------------------------------------------- Fonte: Prog1.java package prog1; public class Prog1 { public static void main(String[] args) { int dia, mes, ano; dia = 12; mes = 6; ano = 2006; System.out.printf("Data: %02d/%02d/%04d\n", dia, mes, ano); System.exit(0); } }
ou
// -------------------------------------------- Fonte: Prog1.java package prog1; public class Prog1 { public static void main(String[] args) { int dia = 12; int mes = 6; int ano = 2006; System.out.println("Data: " + dia + "/" + mes + "/" + ano); System.exit(0); } }
2.4 Palavras reservadas do Java abstract catch do final implements long private static throw void const boolean break char class double else finaly float import instanceof native new protected public super switch throws transient volatile while goto (no usadas) byte continue extends for int null return synchronized true case default false if interface package short this try
Observao: As palavras reservadas no podem ser utilizadas pelo programador como nome de variveis, constantes, argumentos, atributos ou mtodos, ou seja, no servem como identificadores. 2.5 Declarao de variveis Sintaxe: tipo_dado_base lista_de_variveis; tipo_dado_base: deve ser um tipo de dado vlido (boolean, char, int, byte, short, long, float, double ou void) lista_de_variveis: um ou mais identificadores separados por vrgula. Exemplo: int i, j ,k; float a, b; char ch; 2.5.1 Onde as variveis podem ser declaradas Definidas fora de todas os mtodos, incluindo o mtodo main() so chamadas de variveis globais e podem ser acessadas em qualquer parte do programa. Estas variveis so alocadas estaticamente na memria RAM (Random Access Memory Memria de acesso randmico). Quando definidas dentro de um mtodo so chamadas de variveis locais e s podem ser acessadas dentro deste mtodo. Estas variveis so alocadas dinamicamente na memria RAM. Na declarao de parmetros formais (argumentos) de um mtodo. Sendo estas locais e alocadas dinamicamente na memria RAM.
Observao: Memria ROM (Read Only Memory Memria somente de leitura). Alocao de memria: (Reserva de espao de memria (RAM) para alocar uma varivel) Alocao esttica de memria: Tipo de alocao de memria em que uma varivel alocada (tem um espao reservado) na memria RAM durante toda a execuo do programa. Este espao de memria desalocado somente quando o programa acaba. Alocao dinmica de memria: Tipo de alocao de memria em que uma varivel alocada (tem um espao reservado) na memria RAM temporariamente. Este espao de memria desalocado quando o espao no mais necessrio (coleta automtica de lixo garbage collector).
Variveis globais: resultado Variveis locais: base, expoente, resp, x, y Compilar por linha de comandos (via terminal):
$ javac Prog2.java <enter> $ // gera arquivo Prog2.class
2.5.2 Inicializao de variveis Em Java possvel fornecer valores iniciais a maioria das variveis ao mesmo tempo em que elas so declaradas, colocando um sinal de igual e uma constante aps o nome da varivel. tipo_dado_base nome_da_varivel = constante; Exemplos:
char ch = 'a'; // tipo_dado_base nome_da_varivel = constante_caracter String s = Pelotas; // tipo_dado_base nome_da_varivel = constante_string int n = 0; // tipo_dado_base nome_da_varivel = constante_inteira float y = 123.45f; // tipo_dado_base nome_da_varivel = constante_real double z = 123.45; int [] v = {10, 20, 30}; // vetor unidimensional int [][] t = {{1, 2}, {3, 4}, {5, 6}}; // matriz bidimensional String [] cidade = {Pelotas, Rio Grande, Poa}; char [] caracter = {S, s, N, n};
2.6 Constantes Valores fixos que o programa no pode alterar. As constantes podem ser de qualquer tipo bsico. Tipo char int float String Exemplos de constantes 'a' 'n' 1 123 123.23 "Java" '9' 2100 -234 4.34e-3
(classe String)
2.6.1 Constantes hexadecimais e octais A linguagem de programao Java permite especificar constantes inteiras em octal. Uma constante octal comea com um 0 (zero) antes dos demais nmeros. Exemplos: int hexadecimal = 0xf; int octal = 011; Observaes: Qualquer nmero octal formado por oito nmeros ( 0 .. 7 ). Qualquer nmero hexadecimal formado por dezesseis nmeros (0 ..9, A, B, C, D, E, F).
// 15 em decimal // 9 em decimal
// ------------------------------------------------------------- Fonte: Hexadecimal.java package hexadecimal; public class Hexa { public static void main(String[] args) { for (int decimal = 0;decimal <= 16; decimal++) { String hexaDecimal = Integer.toHexString(decimal); System.out.println("Decimal: " + decimal); System.out.println("Hexadecimal: " + hexaDecimal); // int hexaToDecimal = Integer.parseInt(hexaDecimal, 16); // System.out.println("Hexadecimal para Decimal: " + hexaToDecimal); } } }
10
2.6.2 Constantes Strings Uma String um conjunto de caracteres delimitados por aspas duplas. Em Java existe uma classe especfica para trabalhar com Strings (classe String). Uma String finalizada pelo caracter especial \0 (chamado de null). Exemplo: String s = "UCPel"; \0 igual a null
0 U 1 C 2 P 3 e 4 l 5 null
Vetor de caracteres:
char [] s = {'U', 'C', 'P', 'e', 'l'}; char ch = \0;
2.6.3 Constantes especiais As constantes especiais so usadas para representar caracteres que no podem ser inseridos pelo teclado. So elas: Tabela 1: Constantes especiais
Constante \b \f \n \r \t \ \ \\ \o \x Significado Retrocesso Alimentao de formulrio Nova linha Retorno de carro <CR> Tab horizontal Aspas duplas Aspas simples Barra invertida Constante octal Constante hexadecimal
2.7 Comandos do pr-processador do Java 2.7.1 O comando import O comando import faz o compilador incluir um pacote de classes dentro do programa fonte. Cada pacote possui diversas classes.
import java.util.Scanner; // pacote java.util e a classe Scanner import javax.swing.*; // pacote javax.swing e avisa que vai usar uma das classes import java.awt.Graphics2d; // pacote java.awt e a classe Graphics2d
11
Exemplo: import javax.swing.JOptionPane; Pacote: javax.swing Classe: JOptionPane Chamada de um dos Mtodos da classe JOptionPane: JOptionPane.showMessageDialog(); Sintaxe: nomeClasse.nomeMtodo(lista_de_argumentos); // chamada de mtodos estticos
3. Tipos de dados
3.1 Tipos bsicos A tabela abaixo exibe os oito (8) tipos de dados bsicos que podem ser utilizados pelo programador para definir suas variveis. Na Tabela 2 so exibidos os tipos bsicos, a quantidade de bits, a faixa de valores vlida e o nmero de bytes que cada tipo de dados ocupa na memria RAM (memria principal) ou em disco (quando armazenados na memria secundria). Tabela 2: Tipos de dados
Tipo boolean char byte short int long float double Bytes 1 2 1 2 4 8 4 8 Bits 8 16 8 16 32 64 32 64 Faixa de valores true ou false 0 65.535 -128 127 -32.768 32.767 -2.147.483.648 2.147.483.647 -2E63 2E63-1 1.40239846e-46 3.40282347e+38 4.94065645841246544e-324 1.7976931348623157e+308
3.2 Escrevendo uma classe em Java 3.2.1 Conceitos bsicos O paradigma orientado objetos possui cinco componentes bsicos: objetos (possui atributos e mtodos), mensagens (chamada dos mtodos), classes (tipo de dado), instncias (criao de objetos new) e mtodos (funes definidas pelo programador que manipulam os atributos). Objetos, mensagens, classes, instncias e mtodos Objetos so entidades lgicas que contm atributos (dados armazenados em variveis) e mtodos (funes) que manipulam estes dados. Um objeto pode ser definido atravs de um tipo de dado chamado classe (class). Resumo: a) Atributos: So as variveis definidas e declaradas para cada objeto. b) Mtodos: So as funes definidas pelo programador que serviro para manipular os atributos. c) Mensagens: So as chamadas dos mtodos. d) Classe: um tipo de dado definido por class. Uma classe no um objeto, sim uma descrio do objeto. e) Instncia: Os objetos so instncias de uma classe. Resumidamente, objetos so instncias de classes que respondem as mensagens atravs dos mtodos escritos pelo programador.
12
13
System.out.println("Total de Elementos: " + v.length()); int pri = v.primeiro(); System.out.println("Primeiro: " + pri); int ult = v.ultimo(); System.out.println("ltimo: " + ult); boolean flag = v.existe(20); if (flag) { System.out.println("Existe elemento 20"); } else { System.out.println("No Existe elemento 20"); } v.removeElemento(elemento); v.exibe(); v.removePosicao(1); v.exibe();
Uma linguagem de programao orientada objetos precisa suportar quatro propriedades: abstrao, encapsulamento, herana e polimorfismo. Abstrao Objetos devem representar dados do mundo real. Encapsulamento (encapsulao) Os objetos possuem internamente atributos e mtodos agrupados no mesmo local, onde os mtodos manipulam os atributos. Polimorfismo (grego: muitas formas) a capacidade de objetos diferentes reagirem segundo a sua funo a uma ordem padro. Significa que o nome de um objeto pode ser utilizado para vrios propsitos ligeiramente diferentes, ou seja, ... uma interface, vrios mtodos ... . A caracterstica de polimorfismo utilizada na sobrecarga de mtodos e sobrecarga de operadores. Herana o processo pelo qual uma classe de objetos pode adquirir as propriedades de outra classe de objetos, em outras palavras, um objeto herda as caractersticas de outro (herana simples) ou vrios objetos (herana mltipla). Vantagens da Orientao a Objetos: (a) reutilizao de cdigo, (b) proteo aos dados; (c) organizao ou estruturao dos dados em forma de classes e objetos; (d) sobrecarga de mtodos e de operadores; (e) criao de pacotes de classes e (f) conjunto de diversos pacotes (apis: java2d, java3d, swing, awt, etc). Em Java, o programador pode criar suas prprias classes. Uma classe possui duas partes distintas: atributos (variveis) e mtodos (funes ou procedimentos) que manipulam estes atributos. 3.2.2 Referncia this Em java, quando um mtodo de uma classe chamado, passado automaticamente um argumento que uma referncia para o objeto que gerou a chamada. Esta referncia chamada this, ou seja, a referncia this referencia o objeto que chamou o mtodo. Cada objeto tem acesso a uma referncia a ele prprio, chamada this. Esta referncia faz referncias aos atributos e mtodos de um objeto.
14
3.2.3 Lista de Exerccios sobre Classes 3.2.3.1 Dado o seguinte Circulo e seus mtodos: programa principal, implemente a classe
// ------------------------------------------ TestaCirculo.java package testacirculo; public class TestaCirculo { public static void main(String[] args) { Circulo circ = new Circulo(); circ.setaRaio(3); circ.calculaArea(); double area = circ.getArea(); System.out.printf("rea: %.2f\n", area); System.exit(0); 2 Observao: area = pi . raio onde pi 3.1416
} }
15
3.2.3.2
// --------------------------------------------- Peso.java package peso; public class Peso { public static void main(String[] args) { PesoIdeal piHomem = new PesoIdeal('H', 1.67); PesoIdeal piMulher = new PesoIdeal('m', 1.65); piHomem.calculaPesoIdeal(); System.out.printf("Peso Ideal Homem: %.2f\n", piHomem.getPesoIdeal()); piMulher.calculaPesoIdeal(); System.out.printf("Peso Ideal Mulher: %.2f\n", piMulher.getPesoIdeal()); System.exit(0); } }
Resultado do Programa: Peso Ideal Homem: 63,41 Peso Ideal Mulher: 57,77
3.2.3.3
// --------------------------------------------------------------- ValidaCPF.java package validacpf; public class ValidaCPF { public static void main(String[] args) { String s = "123456789"; CPF cpf = new CPF(s); int digitoVerificador = cpf.verificaCPF(); System.out.printf("Digito verificador: %02d\n", digitoVerificador); System.out.printf("CPF: %s-%02d\n", s , digitoVerificador); System.exit(0); } } Resultado do Programa: Digito verificador: 09 CPF: 123456789-09
16
Como calcular os Dgitos do CPF: Entrada: CPF: 123456789 1) Primeiramente pega-se os dgitos da base do CPF e se faz a soma da multiplicao individual dos dgitos, iniciando por 10 e indo at 2 como exemplificado abaixo: 1 2 3 4 5 6 7 8 9 x x x x x x x x x 10 9 8 7 6 5 4 3 2 ---------10 + 18 + 24 + 28 + 30 + 30 + 28 + 24 + 18 = 210 2) O valor do primeiro dgito o resultado da subtrao de 11 pelo resto da diviso da soma acima por 11. Se este valor for 10 ou 11, o dgito 0 (zero), do contrrio o prprio valor. No exemplo em questo o dgito encontrado calculado conforme v-se a seguir: 11 - (210 % 11) = 10 3) O clculo do segundo dgito feito da mesma forma que o primeiro, porm com os 9 dgitos da base do CPF e o primeiro dgito verificador encontrado, iniciando por 11 e indo at 2. 1 x 11 -11 2 x 10 -+ 20 3 4 x x 9 8 --+ 27 + 32 5 6 7 8 9 0 x x x x x x 7 6 5 4 3 2 ------+ 35 + 36 + 35 + 32 + 27 + 0 = 255
4) O valor do segundo dgito o resultado da subtrao de 11 pelo resto da diviso da soma acima por 11. Se este valor for 10 ou 11, o dgito 0 (zero), do contrrio o prprio valor. No exemplo em questo o dgito encontrado calculado conforme v-se a seguir: 11 - (255 % 11) = 9 Sada: CPF vlido 123.456.789-09 ou 123456789-09
3.2.3.4
// ------------------------------------------------------- TestaDiaSemana.java package testadiasemana; public class TestaDiaSemana { public static void main(String[] args) { DiaSemana dia = new DiaSemana(18, 12, 2007); dia.verificaDiaSemana(); dia.exibeDiaSemana(); System.exit(0); } } Resultado do Programa: Dia da Semana: Tera-Feira DiaSemana int dia, mes, ano String semama verificaDiaSemana exibeDiaSemana Diagrama de classe
17
Como calcular o Dia da Semana: Deve-se calcular o Dia do Sculo: Para qualquer clculo com datas essencial que se disponha do Dia do Sculo para a(s) data(s) em questo. O Dia do sculo o nmero de dias decorridos desde o inicio do sculo (1 de janeiro de 1901) at a data em questo. Se usa como referncia 1901 porque a maioria das datas com as quais se trabalha ainda so do sculo passado. L por 2040 ou mais poder se mudar para 2001. A frmula (vlida para datas entre 1901 e 2099) a seguinte: Dia_do_Seculo = (ano - 1901) * 365 + (ano - 1901) DIV 4 + dia + (ms - 1) *31 - [(ms * 4 + 23) DIV 10] * [(ms + 12) DIV 15] + [(4 - ano MOD 4) DIV 4) * [(ms + 12) DIV 15] Entrada: Dia [1..31]: 18 Ms [1..12]: 12 Ano [1901..2099]: 2007
Dia_do_Seculo = 39.068 (para a data acima) Verificao do Dia da Semana: Para saber o Dia_da_Semana basta dividir por 7 e entrar com o resto na tabela abaixo: 0 1 2 3 4 5 6 Segunda Tera Quarta Quinta Sexta Sbado Domingo
Sada: 18/12/2007 uma Tera-Feira Observao: DIV diviso inteira de dois nmeros e MOD o resto inteiro da diviso de dois nmeros
3.2.3.5
// ------------------------------------------------- TestData.java package testdata; public class TestData { public static void main(String[] args) { Data data = new Data(); data.setaData(4, 9, 2011); data.extenso(); System.exit(0);
} }
Resultado do Programa: Data: 4 de setembro de 2011 Data int dia, mes, ano setaData extenso Diagrama de classe
3.2.3.6
bubleSort
na
18
v.exibe();
3.2.3.7
// --------------------------------------------------- TestaPessoa.java package testapessoa; public class TestaPessoa { public static Pessoa p1 Pessoa p2 Pessoa p3 void main(String[] args) { = new Pessoa(); = new Pessoa(); = new Pessoa();
p1.setaDados("Paulo Roberto", 1962, 'm'); p2.setaDados("Renato Luis", 1965, 'm'); p3.setaDados("Francisco Carlos", 1959, 'm'); p1.calculaIdade(); p2.calculaIdade(); p3.calculaIdade(); p1.exibePessoa(); p2.exibePessoa(); p3.exibePessoa(); System.exit(0); } } Resultado do Programa: Nome: Paulo Roberto Idade: 49 ano(s) Sexo: Masculino Nome: Renato Luis Idade: 46 ano(s) Sexo: Masculino Nome: Francisco Carlos Idade: 52 ano(s) Sexo: Masculino Pessoa String nome, ano char sexo setaDados calculaIdade exibePessoa Diagrama de classe
3.2.3.8
// ----------------------------------------------------- TestaPessoa2.java package testapessoa2; public class TestaPessoa2 { public static void main(String[] args) { Pessoa [] pessoa = new Pessoa[3]; pessoa[0] = new Pessoa(); pessoa[0].setaDados("Paulo Roberto", 1962, 'm'); pessoa[0].calculaIdade(); pessoa[0].exibePessoa(); pessoa[1] = new Pessoa(); pessoa[1].setaDados("Renato Luis", 1960, 'm'); pessoa[1].calculaIdade(); pessoa[1].exibePessoa(); pessoa[2] = new Pessoa(); pessoa[2].setaDados("Francisco Carlos", 1959, 'm'); pessoa[2].calculaIdade();
19
pessoa[2].exibePessoa(); } } Resultado do Programa: Nome: Paulo Roberto Idade: 49 ano(s) Sexo: Masculino Nome: Renato Luis Idade: 51 ano(s) Sexo: Masculino Nome: Francisco Carlos Idade: 52 ano(s) Sexo: Masculino Pessoa String nome, ano char sexo setaDados calculaIdade exibePessoa Diagrama de classe System.exit(0);
3.2.3.9
// -------------------------------------------------- Pessoas.java package pessoas; public class Pessoas { public static void main(String[] args) { Pessoa pessoa = new Pessoa(7); pessoa.insereDados("Beatriz", 11); pessoa.insereDados("Debora", 13); pessoa.insereDados("Ftima", 15); pessoa.insereDados("Geni", 16); pessoa.insereDados("Carla", 12); pessoa.insereDados("Eva", 14); pessoa.insereDados("Ana", 10); pessoa.exibeDados(); pessoa.sort(); pessoa.exibeDados(); System.exit(0); } } Resultado do Programa: Lista Nome: Nome: Nome: Nome: Nome: Nome: Nome: Lista Nome: Nome: Nome: Nome: Nome: Nome: Nome: de Pessoas Beatriz Debora Ftima Geni Carla Eva Ana de Pessoas Ana Beatriz Carla Debora Eva Ftima Geni Pessoa String [] nome int [] idade
Idade: Idade: Idade: Idade: Idade: Idade: Idade: Idade: Idade: Idade: Idade: Idade: Idade: Idade:
11 13 15 16 12 14 10 10 11 12 13 14 15 16
20
3.2.3.10
// ------------------------------------------------------- TestAgenda.java package testagenda; public class TestAgenda { public static void main(String[] args) { Agenda agenda = new Agenda(5); agenda.insereTelefone("Ana", "99811234"); agenda.insereTelefone("Beatriz", "99812345"); agenda.insereTelefone("Carla", "99813456"); agenda.insereTelefone("Debora", "99814567"); agenda.insereTelefone("Eva", "99815678"); agenda.insereTelefone("Ftima", "99816789"); String fone = "99815678"; String nome = agenda.consultaNome(fone); if (nome.compareTo("") != 0) { System.out.println("Nome: " + nome + " - Telefone: " + fone); } else { System.out.println("ERRO: Usurio no Encontrado"); } fone = "99810123"; nome = agenda.consultaNome(fone); if (nome.compareTo("") != 0) { System.out.println("Nome: " + nome + " - Telefone: " + fone); } else { System.out.println("ERRO: Usurio no Encontrado"); } System.exit(0);
} }
Resultado do Programa: ERRO: Excedeu limite do Vetor Nome: Eva - Telefone: 99815678 ERRO: Usurio no Encontrado Agenda String [] nome String [] fone int n int max insereTelefone consultaNome Diagrama de classe
21
} }
v.add(60); v.exibe(); v.remove(); System.out.println("Total de Elementos: " + v.length()); int pri = v.primeiro(); System.out.println("Primeiro: " + pri); int ult = v.ultimo(); System.out.println("ltimo: " + ult); int elemento = 20; boolean flag = v.existe(elemento); if (flag) { System.out.println("Existe elemento: " + elemento); } else { System.out.println("No Existe elemento: " + elemento); } v.removeElemento(elemento); v.exibe(); v.removePosicao(1); v.exibe(); System.exit(0);
// -------------------------------------------------- vetor.java package testvetor; public class Vetor { // ------------------ atributos private int[] v; private int n; private int max; // ------------------ construtor Vetor(int max) { this.max = max; v = new int[this.max]; n = 0; } // ------------------ add public void add(int valor) { if (n < max) { v[n] = valor; n++; } else { System.out.println("ERRO: Excedeu o Limite do Vetor"); } } // ------------------ remove public void remove() { if (n > 0) { n--; } else { System.out.println("ERRO: Vetor Vazio"); } } // ------------------ removeElemento public void removeElemento(int valor) { if (n > 0) { for (int i = 0; i < n; i++) { if (valor == v[i]) { for (int j = i; j < n - 1; j++) { v[j] = v[j + 1]; } n--; break; } }
22
// ------------------ removePosicao public void removePosicao(int posicao) { if (n > 0 && posicao > 0 && posicao < n) { for (int j = posicao; j < n - 1; j++) { v[j] = v[j + 1]; } n--; } else { System.out.println("ERRO: Vetor Vazio"); } } // ------------------ primeiro public int primeiro() { if (n > 0) { return (v[0]); } else { return (-1); } } // ------------------ ultimo public int ultimo() { if (n > 0) { return (v[n - 1]); } else { return (-1); } } // ----------------- exibe public void exibe() { System.out.print("Vetor: ["); for (int i = 0; i < n-1; i++) { System.out.print(v[i] + " "); } System.out.println(v[n-1] + "]"); } // ----------------- length public int length() { return (n); } // ----------------- existe public boolean existe(int valor) { for (int i = 0; i < n; i++) { if (v[i] == valor) { return (true); } } return (false); } } Resultado do Programa: Vetor: [10 20 30 40] Vetor: [10 20 30 40 50] ERRO: Excedeu o Limite do Vetor Vetor: [10 20 30 40 50] Total de Elementos: 4 Primeiro: 10 ltimo: 40 Existe elemento: 20 Vetor: [10 30 40]
23
public Data(int dd, int mm, int aa) { dia = dd; mes = mm; ano = aa; }
// ------------------------------- sobrecarga do mtodo toString public String toString() { return(dia + "/" + mes + "/" + ano); } }
// ---------------------------- entradaDados public void entradaDados() { String s; s = JOptionPane.showInputDialog("Digite um Valor: "); x = Double.parseDouble(s); do { s = JOptionPane.showInputDialog("Operador [+ - * / Rr Pp Ss Cc Tt]: "); op = s.charAt(0); } while (!strChr("+-*/RrPpSsCcTt", op)); if (!strChr("RrSsCcTt", op)) { s = JOptionPane.showInputDialog("Digite outro Valor: ");
24
y = Double.parseDouble(s); } } // ---------------------------- operaCalculadora public void operaCalculadora() { final double pi = 3.14158; double rads; switch (op) { case '+': case '-': case '*': case '/':
resp = soma(x, y); break; resp = subtracao(x, y); break; resp = multiplicacao(x, y); break; if (y == 0) erro = 1; // divisao por zero else resp = divisao(x, y); break; if (x < 0) erro = 2; // raiz negativa else resp = raizQuadrada(x); // Raiz Quadrada break; resp = power(x, y); break; resp = seno(x); break; resp = cosseno(x); break; // potencia // seno // cosseno
case 'P': case 'p': case 'S': case 's': case 'C': case 'c': case 'T': case 't':
} } // ---------------------------- exibeCalculadora public void exibeCalculadora() { switch (erro) { case 1: JOptionPane.showMessageDialog(null, "Erro: Divisao por Zero", "Calculadora", JOptionPane.PLAIN_MESSAGE); break; case 2: JOptionPane.showMessageDialog(null, "Erro: Raiz Complexa", "Calculadora", JOptionPane.PLAIN_MESSAGE); break; case 3: JOptionPane.showMessageDialog(null, "Erro: Tangente Infinita", "Calculadora", JOptionPane.PLAIN_MESSAGE); break; default: JOptionPane.showMessageDialog(null, "Resposta: " + resp, "Calculadora", JOptionPane.PLAIN_MESSAGE); } } // ................................................ mtodos privados da classe // ---------------------------- strChr private boolean strChr(String s, char ch) { for (int i = 0; i < s.length(); i++) { if (s.charAt(i) == ch) { return(true); }
25
} return(false); } // ---------------------------- soma private double soma(double x, double y) { return(x + y); } // ---------------------------- subtracao private double subtracao(double x, double y) { return(x - y); } // ---------------------------- multiplicacao private double multiplicacao(double x, double y) { return(x * y); } // ---------------------------- divisao private double divisao(double x, double y) { if (y == 0) { erro = 1; return(-1); } return(x / y); } // ---------------------------- raizQuadrada private double raizQuadrada(double x) { return(Math.sqrt(x)); } // ---------------------------- power private double power(double x, double y) { return(Math.pow(x, y)); } // ---------------------------- seno private double seno(double x) { final double pi = 3.14158; double rads; rads = x * pi / 180.0; return(Math.sin(rads)); } // ---------------------------- cosseno private double cosseno(double x) { final double pi = 3.14158; double rads; rads = x * pi / 180.0; return(Math.cos(rads));
// ---------------------------- tangente private double tangente(double x) { final double pi = 3.14158; double rads; rads = x * pi / 180.0; return(Math.tan(rads)); } }
26
// ---------------------------------------------- Fonte: Calc.java package calc; public class Calc { public static void main(String[] args) { Calculadora calc = new Calculadora(); calc.entradaDados(); calc.operaCalculadora(); calc.exibeCalculadora(); } }
Programa exemplo que mostra outra forma de usar a funo strChr oriunda da linguagem C usando o mtodo indexOf:
// --------------------------------------------------- Fonte: strchr.java package strchr; import java.util.Scanner; public class strChr { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String nome, s; do { System.out.print("Nome: "); nome = entrada.nextLine(); int n = nome.length(); System.out.println(nome + " seu nome tem " + n + " caracteres"); do { System.out.print("Continua [S/N]? " ); s = entrada.nextLine(); } while ("SsNn".indexOf(s) == -1); } while ("Nn".indexOf(s) == -1); // } while ("S".equalsIgnoreCase(s)); System.exit(0);
} }
Modificadores de Acesso: public: Os atributos e mtodos tornam-se pblicos, ou seja, qualquer outro mtodo pode chamar ou utilizar estes atributos e/ou mtodos. private: Somente os mtodos da classe (membros) da classe podem chamar ou utilizar atributos ou mtodos privados. protected: Utilizado em herana simples de classe (construo de subclasses), ou seja, uma subclasse herda todos os atributos e mtodos da classe base (superclasse). Deixa acessvel os atributos e/ou mtodos para todas as outras classes (classe base) e subclasses (classe derivada).
3.3 Sobrecarga de mtodos em Java Java permite que mtodos estticos sejam sobrecarregados, desta forma, o retorno, nmero de argumentos ou mesmo o tipo de dados dos argumentos possam ser diferentes.
// ------------------------------------------ Fonte: SobreCarga.java package sobrecarga;
27
public class SobreCarga { public static void main(String[] args) { imprime("Pelotas-RS"); imprime(123.45); imprime(123.45f); imprime(123); imprime('A'); } static void imprime(String s) { System.out.println("String: " + s); } static void imprime(double d) { System.out.println("Double: " + d); } static void imprime(float f) { System.out.println("Float: " + f); } static void imprime(int i) { System.out.println("Inteiro: " + i); } static void imprime(char ch) { System.out.println("Caracter: " + ch); } }
28
} }
A seguir visto um exemplo de entrada de dados usando o pacote swing. Programa exemplo (9): Entrada de dados via teclado em caixa de dilogo grfica sobreposta a interface usando a biblioteca swing.
// --------------------------------------------- Fonte: Prog9.java package Prog9; import javax.swing.*; public class Prog9 { public static void main(String[] args) { String s; s = JOptionPane.showInputDialog("String: "); int x = Integer.parseInt(s); JOptionPane.showMessageDialog(null, "Inteiro: " + x, "Resultado", JOptionPane.PLAIN_MESSAGE); // JOptionPane.showMessageDialog(null, "Inteiro: " + x); // funciona tambm, pois os dois ltimos argumentos podem ser suprimidos System.exit(0); } } // carrega toda a biblioteca swing
A seguir visto um exemplo de entrada de dados usando o pacote java.io (BufferReader e InputStreamReader). Programa exemplo (10): Entrada de dados via teclado em terminal textual usando as bibliotecas BufferedReader e InputStreamReader .
29
// ----------------------------------------------- Fonte: Prog10.java package Prog10; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Prog10 { public static void main(String[] args) throws IOException { BufferedReader userInput = new BufferedReader (new InputStreamReader(System.in)); System.out.print("Nome: "); String nome = userInput.readLine(); Integer n = nome.length(); System.out.println("Nome: " + nome + " tem " + nome.length() + " caracteres"); System.exit(0); } }
} }
A seguir visto um exemplo de sada de dados na tela usando o pacote swing. Programa exemplo (12): Sada de dados via tela em caixa de dilogo grfica sobreposta a interface usando a biblioteca swing.
// ------------------------------------------ Fonte: Prog12.java package Prog12; import javax.swing.*; public class Prog12 { public static void main(String[] args) { String s; s = JOptionPane.showInputDialog("String: "); // carrega toda a biblioteca swing
30
Sintaxe:
JOptionPane.showMessageDialog(null, x = + x, Ttulo, JOptionPane.PLAIN_MESSAGE);
null significa que a mensagem ser centralizada x = + x significa que sair na caixa de dialogo x = 5 (por exemplo) Ttulo significa o ttulo da caixa de dilogo JOptionPane.PLAIN_MESSAGE significa caixa sem cone Tabela 3: Tipos de cones
Tipo de cone cone de erro cone de informao i cone de advertncia ! cone de pergunta ? Sem cone Tipo de Mensagem JOptionPane.ERROR_MESSAGE JOptionPane.INFORMATION_MESSAGE JOptionPane.WARNING_MESSAGE JOptionPane.QUESTION_MESSAGE JOptionPane.PLAIN_MESSAGE
31
5. Operadores
So smbolos especiais que obrigam determinadas operaes. Estas operaes comparativas ou lgicas. 5.1 Operadores aritmticos So operadores que realizam uma operao matemtica. Tabela 4: Operadores aritmticos
Operador aritmtico + * / % -- ++ Ao Subtrao Adio Multiplicao Diviso Resto inteiro da diviso Decremento/incremento
Precedncia dos operadores aritmticos (Hierarquia nas Operaes) Tabela 5: Precedncia dos operadores aritmticos
Hierarquia 1 2 3 4 5 6 Operao Parnteses Mtodos ++ -- (menos unrio) * / % + -
Observao: Quando houver duas ou mais operaes de mesma hierarquia, o compilador executa-as da esquerda para a direita. 5.2 Operadores relacionais So operadores que permitem comparar valores, ou seja, utilizados principalmemte em comandos que possuem condies. Tabela 6: Operadores relacionais
Operador > >= < <= == != Ao Maior que Maior ou igual a Menor que Menor ou igual Igual a Diferente de
so
5.3 Operadores lgicos So condio. Exemplo: operadores utilizados em comandos que tem mais de uma
32
Observao: $$ e || so chamados Short Circuit Operator, ou seja, quando o resultado das condies no puder mais ser alterado, h um truncamento nas prximas condies. Precedncia (Hierarquia dos operadores) Tabela 8: Precedncia dos operadores relacionais e lgicos
Hierarquia 1 2 3 4 5 Operao ! > >= < == != && ||
<=
Observao: As expresses que utilizam operadores relacionais e lgicos retornam 0 (zero) para falso e !0 (no zero) para verdadeiro, ou seja: true diferente de 0 (!= 0) 5.4 Incremento e decremento So operadores aritmticos que permitem realizar operaes de soma e subtrao de forma simplificada. ++ adiciona (1) ao operando subtrai (1) ao operando As seguintes operaes so equivalentes: x++; x = x + 1; x--; x = x - 1; Observao: Os operadores (++ ou --) podem ser colocados antes ou depois do operando. Quando precede seu operando, Java efetua a operao de incremento ou decremento antes de utilizar o valor do operando. Quando o operador vier depois do operando, Java utiliza o valor do operando antes de increment-lo ou decrement-lo. Exemplo: Equivalncia x = 10; y = ++x; x = 10; y = x++; 5.5 Operador de atribuio O operador de atribuio o sinal de igual =. A sintaxe do operador de atribuio pode ser escrito em uma das seguintes formas: varivel varivel varivel varivel = = = = constante; varivel; expresso; mtodo(x); x x x x = = = = 3; y; a + b; Math.sqrt(y); // // // // y ser 11 x ser 11 y ser 10 x ser 11 x = 10; x = x + 1; y = x; x = 10; y = x; x = x + 1; e false igual 0 (== 0)
33
A linguagem de programao Java permite utilizar o operador de atribuio em expresses, junto com operadores matemticos, lgicos, relacionais, chamada de mtodos, e outros (como foi mencionado acima). if ((produto = x * y) < 0) Funcionamento: Primeiramente Java atribui o valor x * y a varivel produto, para depois avaliar a expresso, ou seja, comparar se o produto menor (<) que zero. 5.6 Casts possvel forar que o resultado de uma expresso seja de um determinado tipo. Para tanto deve ser utilizado uma construo chamada de cast, ou seja, pode ser utilizado para "tipar" uma varivel com um tipo diferente do resultado da expresso. varivel = (tipo) expresso; Programa exemplo (14): O programa imprime na tela o resultado de uma diviso.
// -------------------------------------------- Fonte: Prog14.java package Prog14; import java.util.Scanner; public class Prog14 { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; int x, y; float resp; System.out.print("x = ");
34
s = entrada.nextLine(); x = Integer.parseInt(s); System.out.print("y = "); s = entrada.nextLine(); y = Integer.parseInt(s); // necessrio um cast (float) pois a diviso de dois resp = (float) x / y; // inteiros resulta em um inteiro System.out.printf("Divisao = %.2f\n", resp); System.exit(0); } }
Observao: Em Java, o tipo resultante de um inteiro dividido por outro inteiro um inteiro, logo, deve-se utilizar um cast (float) para que o tipo resultante atribudo a varivel resp seja float. 5.7 Expresses Uma expresso em Java qualquer combinao vlida de operadores (aritmticos, relacionais, lgicos), constantes, variveis e mtodos. Exemplo: c = Math.sqrt (a) + b / 3.4;
35
6.2 Math.asin O mtodo Math.asin retorna o valor do arco seno. A varivel x deve estar em radianos. Sintaxe: double Math.asin (double x); Faixa: -pi / 2 pi / 2 6.3 Math.acos O mtodo Math.acos retorna o valor do arco cosseno. A varivel x deve estar em radianos. Sintaxe: double Math.acos (double x); Faixa: 0 pi 6.4 Math.atan O mtodo Math.atan retorna o valor do arco tangente. A varivel x deve estar em radianos. Sintaxe: double Math.atan (double x); Faixa: -pi / 2 pi / 2 6.5 Math.sin O mtodo Math.sin retorna o valor do seno. A varivel x deve estar em radianos. Sintaxe: double Math.sin (double x); Faixa: -1 1 6.6 Math.cos O mtodo Math.cos retorna o valor do cosseno. A varivel x deve estar em radianos. Sintaxe: double Math.cos (double x); Faixa: -1 1
36
6.7 Math.tan O mtodo Math.tan retorna o valor da tangente. A varivel x deve estar em radianos. Sintaxe: double Math.tan (double x); 6.8 Math.exp O mtodo Math.exp retorna o valor do expoente (ex). Sintaxe: double Math.exp (double x); 6.9 Math.pow O mtodo Math.pow (power) retorna o valor da potncia (xy). Sintaxe: double Math.pow (double x, double y); 6.10 Math.sqrt O mtodo quadrada. Math.sqrt (square root) retorna o valor da raiz
Sintaxe: double Math.sqrt (double x); 6.11 Math.log O mtodo Math.log retorna o valor do logaritmo natural. Sintaxe: double Math.log (double x); 6.12 Double.parseDouble O mtodo Double.parseDouble converte string em ponto flutuante. Sintaxe: double Double.parseDouble (String s); 6.13 Integer.parseInt O mtodo aInteger.parseInt converte uma string em inteiro. Sintaxe: int Integer.parseInt (String s); 6.14 Long.parseLong O mtodo Long.parseLong converte uma string em inteiro longo. Sintaxe: long int Long.parseLong (String s); 6.15 Math.log10 O mtodo Math.log10 retorna o logartmo na base 10. Sintaxe: double Math.log10 (double x);
37
6.16 Math.random O mtodo Math.random retorna um nmero double aleatrio. Sintaxe: double Math.random (void); Faixa: 0.0 100.0
public static int geraNumeroAleatorio(int n) { int num = 1 + (int)(Math.random() * n); return(num); } // gera um nmero de 1 at n
6.17 Math.PI O mtodo Math.PI retorna o valor do pi radianos. Sintaxe: double Math.PI (void); Valor: 3.141592653589793 6.18 Converso de graus para radianos
Figura 2: Converso de graus para radianos Converso de graus para radianos: rads = graus * Math.PI / 180.0; Converso de radianos para graus: graus = rads * 180.0 / Math.PI;
38
7. Comandos
7.1 Tipos de comandos 7.1.1 Sequncia So comandos, que no fluxo de controle do programa, so sempre executados passando a execuo para a prxima instruo, ou seja, todos os comandos de seqncia so executados desde que eles no dependem de um comando de seleo. Exemplo: (todas as instrues abaixo so de seqncia)
System.out.print("Digite uma letra: "); // imprime na tela s = entrada.nextLine(); // entrada de dados via teclado resp = valor * 1.25; // atribuio um comando de seqncia
7.1.2 Seleo So comandos, que no fluxo de controle do programa, permitem a seleo entre duas ou mais instrues, ou seja, este tipo de comando faz com que alguns comandos no sejam executados. Exemplo:
if (numero % 2 == 0) { // testa se o nmero par ou mpar System.out.println("Nmero: PAR"); } else { System.out.println("Nmero: MPAR"); }
Operador Ternrio (?): Funcionamento: Se a condio for verdadeira, executa comando1 seno executa comando2.
39
condio ? comando1 : comando2; | ^ ^ | | | +--------+ | | | +-------------------+ Exemplo (1): int menor = x <= y ? x : y; // se x <= y ... menor = x; // se x > y ... menor = y; Exemplo (2): int menor; x <= y ? menor = x : menor = y; // se x <= y ... menor = x; // se x > y ... menor = y;
// --------------------------------------------------------------- Fonte: Ternario.java package ternario; import java.util.Scanner; public class Ternario { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; System.out.print("Digite um valor: "); s = entrada.nextLine(); int x = Integer.parseInt(s); System.out.print("Digite outro valor: "); s = entrada.nextLine(); int y = Integer.parseInt(s); int menor = x < y ? x : y; System.out.println("menor: " + menor); int maior = x > y ? x : y; System.out.println("maior: " + maior); System.exit(0); } }
7.1.3 Repetio So comandos, que no fluxo de controle do programa, permitem a repetio de uma ou mais instrues. Programa Exemplo (16): O programa exibe na tela de 0 at 9.
// ----------------------------------------------- Fonte: Prog16.java package prog16; public class Prog16 { public static void main(String[] args) { final int n = 10; int i = 0; do { System.out.println("n = " + i); i++; } while (i < n); System.exit(0); } }
40
7.2 Comando if O comando if um comando de seleo que permite selecionar um comando entre dois outros comandos (comandos simples) ou dois conjuntos de comandos (comandos compostos). Isto feito atravs da avaliao de uma condio. O resultado desta avaliao (teste da condio) pode ser verdadeiro (true) ou falso (false). Dependendo deste resultado um dos comandos executado e o outro no. Sintaxe: if (condio) { comando 1; } else { comando 2;
}
ou
if (condio) { comando; }
Observao: O else opcional. Se a condio for avaliada como verdadeira (qualquer valor diferente de 0), o comando 1 ser executado, caso contrrio (condio falsa, valor igual a zero) o comando 2 ser executado. Comando 1, comando 2 ou comando podem ser simples ou compostos (quando h mais de um comando ligado a outro, deve-se utilizar chaves ({ }). Veja exemplos abaixo if (condio) { comando 1; comando 2; } else { comando 3; comando 4; } if (condio) { comando 1; comando 2; comando 3; }
// todos os comando so compostos
Programa exemplo (17): O usurio digita um nmero e o programa diz se este par ou mpar.
// ------------------------------------------- Fonte: Prog17.java package prog17; import javax.swing.*; public class Prog17 { public static void main(String[] args) { String s; int numero; s = JOptionPane.showInputDialog("Digite um nmero: "); numero = Integer.parseInt(s); if ((numero % 2) == 0) { JOptionPane.showMessageDialog(null, "Nmero PAR", "Nmeros", JOptionPane.PLAIN_MESSAGE); } else { JOptionPane.showMessageDialog(null, "Nmero IMPAR", "Nmeros", JOptionPane.PLAIN_MESSAGE); } System.exit(0); } }
41
7.2.1 if encadeados Um if aninhado (ou encadeado) um comando if dentro de outro comando if ou if ... else. Programa exemplo (18): O usurio digita um nmero e o programa diz se este zero, positivo ou negativo.
// -------------------------------------------- Fonte: Prog18.java package prog18; import javax.swing.*; public class Prog18 { public static void main(String[] args) { String s; int num; s = JOptionPane.showInputDialog("Digite um nmero: "); num = Integer.parseInt(s); if (num == 0) { JOptionPane.showMessageDialog(null, "Nmero Zero", "Verifica", JOptionPane.PLAIN_MESSAGE); } else { if (num > 0) { JOptionPane.showMessageDialog(null, "Nmero Positivo", "Verifica", JOptionPane.PLAIN_MESSAGE); } else { JOptionPane.showMessageDialog(null, "Nmero Negativo", "Verifica", JOptionPane.PLAIN_MESSAGE); } } System.exit(0); } }
7.3 O comando switch O comando switch um comando de seleo que permite selecionar um comando entre vrios outros comandos. Isto feito atravs da comparao de uma varivel a um conjunto de constantes. Cada um dos comandos est ligado a uma constante. Sintaxe: switch (varivel) { case constante_1 : seqncia de comandos; break; case constante_2 : seqncia de comandos; break; . . . default: seqncia de comandos; } O programa testa uma varivel sucessivamente contra uma lista de constantes inteiras ou caracteres (int ou char). Depois de encontrar uma coincidncia, o programa executa o comando ou bloco de comandos que estejam associados quela constante. O comando default executado se no houver nenhuma coincidncia.
42
O comando break utilizado para obrigar a sada do comando switch. A opo default opcional. Observao: A varivel no pode ser uma String e nem real (float ou double). Programa exemplo (19): O programa recebe um dgito de 0 9 e imprime na tela, este dgito, por extenso. Neste exemplo a varivel dgito inteira.
// ---------------------------------------------- Fonte: Prog19.java package prog19; import javax.swing.*; public class Prog19 { public static void main(String[] args) { String s; int digito; s = JOptionPane.showInputDialog("Digito: "); digito = Integer.parseInt(s); switch (digito) { case 0: JOptionPane.showMessageDialog(null, "Zero", "Digito", JOptionPane.PLAIN_MESSAGE); break; case 1: JOptionPane.showMessageDialog(null, "Um", "Digito", JOptionPane.PLAIN_MESSAGE); break; case 2: JOptionPane.showMessageDialog(null, "Dois", "Digito", JOptionPane.PLAIN_MESSAGE); break; case 3: JOptionPane.showMessageDialog(null, "Trs", "Digito", JOptionPane.PLAIN_MESSAGE); break; case 4: JOptionPane.showMessageDialog(null, "Quatro", "Digito", JOptionPane.PLAIN_MESSAGE); break; case 5: JOptionPane.showMessageDialog(null, "Cinco", "Digito", JOptionPane.PLAIN_MESSAGE); break; case 6: JOptionPane.showMessageDialog(null, "Seis", "Digito", JOptionPane.PLAIN_MESSAGE); break; case 7: JOptionPane.showMessageDialog(null, "Sete", "Digito", JOptionPane.PLAIN_MESSAGE); break; case 8: JOptionPane.showMessageDialog(null, "Oito", "Digito", JOptionPane.PLAIN_MESSAGE); break; case 9: JOptionPane.showMessageDialog(null, "Nove", "Digito", JOptionPane.PLAIN_MESSAGE); break; default: JOptionPane.showMessageDialog(null, "ERRO: No um Dgito", "Digito", JOptionPane.PLAIN_MESSAGE); } System.exit(0); } }
Programa exemplo (20): O programa recebe um dgito de 0 9 e imprime na tela, este dgito, por extenso. Neste exemplo a varivel dgito caracter, por causa disto as constantes esto entre apostrofes.
// ----------------------------------------- Fonte: prog20.java package prog20; import javax.swing.*;
43
public class Prog20 { public static void main(String[] args) { String s; char digito; s = JOptionPane.showInputDialog("Digito: "); digito = s.charAt(0); switch (digito) { case '0': JOptionPane.showMessageDialog(null, "Zero", "Digito", JOptionPane.PLAIN_MESSAGE); break; case '1': JOptionPane.showMessageDialog(null, "Um", "Digito", JOptionPane.PLAIN_MESSAGE); break; case '2': JOptionPane.showMessageDialog(null, "Dois", "Digito", JOptionPane.PLAIN_MESSAGE); break; case '3': JOptionPane.showMessageDialog(null, "Trs", "Digito", JOptionPane.PLAIN_MESSAGE); break; case '4': JOptionPane.showMessageDialog(null, "Quatro", "Digito", JOptionPane.PLAIN_MESSAGE); break; case '5': JOptionPane.showMessageDialog(null, "Cinco", "Digito", JOptionPane.PLAIN_MESSAGE); break; case '6': JOptionPane.showMessageDialog(null, "Seis", "Digito", JOptionPane.PLAIN_MESSAGE); break; case '7': JOptionPane.showMessageDialog(null, "Sete", "Digito", JOptionPane.PLAIN_MESSAGE); break; case '8': JOptionPane.showMessageDialog(null, "Oito", "Digito", JOptionPane.PLAIN_MESSAGE); break; case '9': JOptionPane.showMessageDialog(null, "Nove", "Digito", JOptionPane.PLAIN_MESSAGE); break; default: JOptionPane.showMessageDialog(null, "ERRO: No um Dgito", "Digito", JOptionPane.PLAIN_MESSAGE); } System.exit(0); } }
Programa exemplo (21): O programa constri um menu com trs mtodos: incluso, alterao e trmino.
// ------------------------------------------ Fonte: prog21.java package prog21; import java.util.Scanner; public class Prog21 { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; char opcao; System.out.println("[I]ncluso"); System.out.println("[A]lterao"); System.out.println("[T]rmino"); System.out.print("Qual a opo: "); s = entrada.nextLine(); opcao = s.charAt(0); switch (opcao) { case 'i': case 'I': inclusao(); break; case 'a': case 'A': alteracao(); break; case 't':
44
} }
static void inclusao() { System.out.println("Opo Escolhida: Incluso"); } static void alteracao() { System.out.println("Opo Escolhida: Alterao"); } static void termino() { System.out.println("Opo Escolhida: Trmino"); } }
7.4 Comando while O comando while um comando de repetio que permite executar um comando (simples) ou vrios comandos (composto) diversas vezes. Isto feito atravs da avaliao de uma condio. Enquanto a condio for verdadeira os comandos so repetidos. Quando a condio se tornar falsa o comando while finalizado. O teste da condio feita no incio do comando, ou seja, antes que todos os comandos sejam executados. Observao: Note que os comandos podem no ser executados nenhuma vez, basta a condio comear como falsa. Sintaxe: while (condio) { comando; } while (condio) { comando 1; comando 2; } Condio: Qualquer expresso vlida em Java com resultado 0 (false) ou !0 (true). Na condio podem ser utilizados ainda variveis, constantes, mtodos, operadores (aritmticos, relacionais e lgicos). Funcionamento do comando: O loop (lao) repetido enquanto a condio for verdadeira. Quando a condio se tornar falsa o controle do programa passa para a prxima instruo. O lao while verifica a condio no incio do lao, por causa disto, normalmente, a varivel de controle do lao deve ser inicializado. Exemplo:
int i = 0; // inicializao da varivel de controle while (i <= 10) { // condio i <= 10 System.out.printf(i = %d\n, i); i = i + 1; // incremento }
ou
Comando: Pode ser um comando vazio, simples ou composto que sero repetidos. Comando vazio: while (1); // comando while no repete nenhum comando for (int i = 0; i <= 1000; i++); // comando for no repete nenhum comando Verifique: Note que no final dos dois comandos (while e for) existe apenas um ponto-e-vrgula, isto o sinal de comando vazio, ou seja,
45
teriam
outros
comandos
no
os
tem,
Problema freqente de digitao: Muitas vezes o programador insere um ponto-e-vrgula no final de um comando for ou while por engano. Isto um grave problema, pois este ponto-e-vrgula (inserido acidentalmente) faz com que os comandos que seriam repetidos, no so. Veja o exemplo abaixo: Exemplo:
for (int x = 1; x <= 10; x++); // note o ponto-e-vrgula no final do comando for System.out.printf(x = %d\n, x); // impresso x = 11 na tela, porque?
Explicao: O comando System.out.printf no faz parte do comando if devido ao ponto-e-vrgula no comando for. O comando for termina quando a varivel de controle x chega ao valor 11. Comando correto: for (int x = 1; x <= 10; x++) { System.out.printf(x = %d\n, x); }
7.5 O comando for O comando for um comando de repetio que permite executar um comando (comando simples) ou vrios comandos (comando composto) diversas vezes. Isto feito atravs da avaliao de uma condio. Enquanto a condio for verdadeira os comandos so repetidos. Quando a condio se tornar falsa o comando for finalizado. Sintaxe: for (inicializao; condio; incremento ou decremento) { comando; }
46
Inicializao: um comando de atribuio (ou vrios, separados por vrgula) que o compilador utiliza para inicializar a(s) varivel(is) de controle do lao. Condio: uma expresso qualquer, que testa a varivel de controle do lao contra algum valor para determinar quando o lao terminar. Incremento ou decremento: Define a maneira como a(s) varivel(is) de controle do lao sero alteradas aps a repetio do lao. O lao (for) repetido enquanto a condio verdadeira. A condio sempre testada no comeo do lao. Qualquer uma das 3 partes do comando for (inicializao; condio; incremento) podem ser qualquer expresso vlida em Java.
i i i i
= = = =
1 2 3 4
j j j j
= = = =
9 8 7 6
O lao for equivalente ao seguinte comando: inicializao; while (condio) { comando; incremento; } ou inicializao; do { comando; incremento; } while (condio);
// ou decremento
// ou decremento
47
7.6 O loop do { } while O comando do ... while um comando de repetio que permite executar um comando (comando simples) ou vrios comandos (comando composto) diversas vezes. Isto feito atravs do teste de uma condio. Enquanto a condio for verdadeira os comandos so repetidos. Quando a condio se tornar falsa o comando do ... while finalizado. O teste da condio feita no final do comando, ou seja, depois que os comandos so executados (Note que os comandos so executados pelo menos uma vez). Sintaxe: do { comando; } while (condio); Repete o lao enquanto a condio for verdadeira. Testa a condio no final, fazendo com que o lao seja executado pelo menos uma vez.
7.7 Interrupo de loops 7.7.1 O comando break Quando o programa encontra o comando break dentro de um lao, ele imediatamente encerra o lao, e o controle do programa segue para o prximo comando aps o lao. Programa exemplo (26): O programa imprime na tela a tecla digitada pelo usurio at que ele digite <F> ou <f>.
// ---------------------------------------------- Fonte: Prog26.java package prog26; public class Prog26 { public static void main(String[] args) throws Exception { char tecla; do { System.out.print("Tecla ou [F]im: tecla = (char) System.in.read(); if (tecla == 'F' || tecla == 'f') // encerra o lao quando o usurio teclar 'F' break; } System.out.printf("Tecla: %c "); { ou 'f' Codigo: %d\n",
48
} while (true); } }
7.7.2 O comando continue O comando continue em vez de forar o encerramento, fora a prxima interao do lao e "pula", ou seja, no executa o cdigo que estiver depois do comando continue. Programa exemplo (27): O programa imprime na tela somente os nmeros pares de 0 at 100.
// ------------------------------------------ Fonte: Prog27.java package prog27; public class Prog27 { public static void main(String[] args) { for (int i = 0; i < 100; i++) { if (i % 2 == 1) { // 0 par, 1 impar continue; } // imprime somente nmeros pares System.out.printf("Par: %d\n", i); } } }
Nos laos while e do {} while um comando continue faz com que o controle do programa execute diretamente o teste da condio e depois continue o processo do lao. No caso do comando for, o programa primeiro executa o incremento (ou decremento) do lao e, depois, executa o teste da condio antes de finalmente fazer o lao continuar. 7.8 O mtodo System.exit () O mtodo System.exit aborta o programa em qualquer situao. Modo de usar: System.exit(0); ou System.exit(1);
49
Flags (Bandeiras):
(-) no com (+) (#) Alinha o resultado esquerda. Preenche o restante do campo com brancos. Se colocado, alinha o resultado direita e preenche o restante esquerda zeros ou brancos. O resultado sempre comea com o sinal + ou Especifica que o argumento ser impresso usando uma das formas alternativas
Formas alternativas:
0 x ou X colocado zeros (0) antes do argumento colocado 0x (ou 0X) antes do argumento
Especificadores de largura do campo a ser impresso (exemplos): Tabela 10: Especificadores de largura do campo
Prefixo %-+#0 %-+# %-+0 %-+ %-#0 %-# %-0 %%+#0 %+# %+0 %+ %#0 %# %0 % 6d +00555 +555 +00555 +555 000555 555 000555 555 +00555 +555 +00555 +555 000555 555 000555 555 6o 01053 01053 01053 1053 001053 01053 01053 1053 01053 01053 01053 1053 001053 01053 001053 1053 8x 0x0022b 0x22b 000022b 22b 0x00022b 0x22b 0000022b 22b 0x0022b 0x22b 000022b 22b 0x00022b 0x22b 0000022b 22b 10.2e +5.50e+000 +5.50e+000 +5.50e+000 +5.50e+000 05.50e+000 5.50e+000 05.50e+000 5.50e+000 +5.50e+000 +5.50e+000 +5.50e+000 +5.50e+000 05.50e+000 5.50e+000 05.50e+000 5.50e+000 10.2f +000005.50 +5.50 +000005.50 +5.50 0000005.50 5.50 0000005.50 5.50 +000005.50 +5.50 +000005.50 +5.50 0000005.50 5.50 0000005.50 5.50
50
Exemplo (Tela): Cateto adjacente (b): 3 <enter> Cateto oposto (a): 4 <enter> Hipotenusa: 5
9.2 Escreva um programa em Java que l 4 notas via teclado: n1, n2, n3 e n4 obtidas por um aluno em 4 avaliaes. Calcule a mdia utilizando a seguinte frmula:
n1 + n2 * 2 + n3 * 3 + n4 Mdia = --------------------------7 A seguir imprima na tela a mdia e o conceito do aluno baseado na seguinte tabela:
Mdia 9,0 ou acima de 9,0 entre 7,5 (inclusive) e 9,0 entre 6,0 (inclusive) e 7,5 abaixo de 6,0
Conceito A B C D
9.3 Escreva um programa em Java que recebe via teclado: comprimento da circunferncia. O programa deve calcular e imprimir na tela o dimetro e o raio da circunferncia (veja exemplo abaixo).
Exemplo: Comprimento da circunferncia: 36 <enter> Dimetro: 11.46 Raio: 5.73 Continua [S/N]? N <enter> comprimento da circunferncia = 2 . PI . raio dimetro = 2 . raio Observao: Programa termina se usurio digitar N ou n na pergunta: Continua [S/N]?
9.4 Desenvolva um programa em Java que recebe via teclado: peso da carne que ser vendida (em quilos) e preo por quilo. O programa deve calcular e imprimir na tela o total a pagar, o valor pago ao ICMS (17%) e o lucro lquido do aougue.
Exemplo (Tela): Peso: 3.5 <enter> Preo por Kg (R$): 4.90 <enter> Total a pagar: 17.15 ICMS (17%): 2.91 Lucro lquido do aougue (R$): 14.24
51
Sair [S/N]? n <enter> Peso: 1.5 <enter> Preo por Kg (R$): 9.00 <enter> Total a pagar: 13.5 ICMS (17%): 2.29 Lucro lquido do aougue (R$): 11.21 Sair [S/N]? S <enter>
9.5 Escreva um programa em Java que recebe via teclado: tipo de animal [1] Gado, [2] Eqinos ou [3] Ovinos, preo unitrio do animal e quantidade de animais comprados. O programa deve calcular e imprimir na tela: preo total pago e a comisso do escritrio de remate (gado 5%, eqinos - 7% e ovinos - 3%), conforme exemplo abaixo:
Exemplo (Tela): Tipo de animal [1] Gado, [2] Eqinos ou [3] Ovinos: 1 <enter> Preo unitrio do animal (R$): 200 <enter> Quantidade de animais: 10 <enter> Preo total pago (R$): 2100.00 Comisso a pagar (R$): 100.00 Continua [S/N]? s <enter> Tipo de animal [1] Gado, [2] Eqinos ou [3] Ovinos: 2 <enter> Preo unitrio do animal (R$): 1000 <enter> Quantidade de animais: 1 <enter> Preo total pago (R$): 1070.00 Comisso a pagar (R$): 70.00 Continua [S/N]? N <enter>
9.6 Reescreva o programa anterior recebendo via teclado uma letra para o tipo de animal [G]ado, [E]qinos ou [O]vinos, preo unitrio do animal e quantidade de animais comprado. O programa deve calcular e imprimir na tela: preo total pago e a comisso do escritrio de remate (gado: 5%, eqinos: 7% e ovinos: 3%), conforme exemplo abaixo:
Exemplo (Tela): Tipo de animal [G]ado, [E]qinos ou [O]vinos: g <enter> Preo unitrio do animal (R$): 200 <enter> Quantidade de animais: 10 <enter> Preo total pago (R$): 2100.00 Comisso a pagar (R$): 100.00 Continua [S/N]? s <enter>
9.7 Escreva um programa em Java que recebe via teclado: a data de hoje da seguinte forma: dia, ms, ano e a sua idade, da seguinte forma: anos, meses e dias vividos. O programa deve calcular e imprimir a data de nascimento no seguinte formato: dd/mm/aaaa.
Exemplo (Tela): Qual a data de hoje: Dia: 16 <enter> Ms: 6 <enter> Ano: 2003 <enter> Qual a sua idade: Anos: 41 <enter> Meses: 4 <enter> Dias: 6 <enter> Data de Nascimento: 10/02/1962 Continuar [S/N]? s <enter>
9.8 Escreva um programa em Java que recebe via teclado um nmero inteiro de 0 99. O programa deve imprimir na tela este nmero por extenso (conforme exemplo abaixo). O programa termina quando o usurio digitar 0 (zero).
Exemplo: Nmero [0..99]: 23 <enter> Vinte e trs Nmero [0..99]: 45 <enter>
52
9.9 Escreva um programa em Java que recebe via teclado: quantidade de litros vendidos, tipo de combustvel ([A]lcool, [G]asolina ou [D]iesel) e o tipo de pagamento ([P]razo ou [V]ista). O programa deve calcular e imprimir na tela: total prazo, desconto e o total vista. O programa termina quando o usurio digitar 'N' ou 'n' na pergunta "Continua [S/N]?".
Tela de execuo: Quantidade de litros? 50 <enter> Tipo de combustvel [A]lcool, [G]asolina ou [D]iesel ? G <enter> Tipo de pagamento [P]razo ou a [V]ista ? V <enter> Total prazo (R$) : 109.50 Desconto (R$): 5.48 Total vista (R$): 104.02 Continua [S/N]? N <enter> Valores: lcool - 1,23 Gasolina - 2,19 Diesel - 1,46 Desconto vista: 5%
9.10 Escreva um programa em Java que recebe via teclado duas notas: nota1 e nota2. O programa deve imprimir na tela a mdia, o conceito do aluno (dado pela tabela abaixo) e a situao (aprovado, exame ou reprovado):
Conceito A B C D Nota1 + Nota2 Mdia = ----------------2 Mdia 9,0 10,0 7,0 8,9 6,0 6,9 0,0 5,9 Exemplo: Nota1: 7 <enter> Nota2: 8 <enter> Mdia: 7.5 Conceito: B Situao: Aprovado Sair [S/N]? s <enter> Situao Aprovado Aprovado Exame Reprovado
9.11 Escreva um programa em Java que recebe via teclado uma temperatura e o tipo de converso (converter para: [C]elsius ou [F]ahrenheit). Calcule e imprima na tela a temperatura correspondente a solicitao do usurio, conforme exemplos abaixo:
Exemplo: Temperatura: 30 <enter> Tipo de converso (converte para: [C]elsius ou [F]ahrenheit): F <enter> Temperatura em Fahrenheit: 86 Continua [S/N]? S <enter> Temperatura: 86 <enter> Tipo de converso (converte para: [C]elsius ou [F]ahrenheit): C <enter> Temperatura em Celsius: 30 Continua [S/N]? n <enter> C 9 . --- = 5
Frmula:
F -
32
9.12 Escreva um programa em Java que recebe via teclado: graus (0 360), minutos (0 59) e segundos (0 59). O programa deve calcular e imprimir na tela o ngulo em graus, dado pela seguinte frmula:
ngulos em graus = graus + minutos ---------60 + segundos ---------3600
53
Exemplo: Graus: 45 <enter> Minutos: 45 <enter> Segundos: 45 <enter> ngulo em Graus: 45.76 Continua [S]im ou [N]o? S <enter> Graus: 45 <enter> Minutos: 10 <enter> Segundos: 15 <enter> ngulo em Graus: 45.17 Continua [S]im ou [N]o? N <enter> Observao: Imprimir mensagens de erro se os valores de entrada estiverem fora da faixa: ERRO: Graus fora da faixa, ERRO: Minutos fora da faixa ou ERRO: Segundos fora da faixa.
9.13 Escreva um programa em Java que recebe via teclado: sexo ([M]asculino ou [F]eminino), altura e peso da pessoa. O programa deve calcular e imprimir na tela: peso ideal, diferena de peso e situao (MAGRO, IDEAL ou GORDO) (conforme exemplo abaixo):
Exemplo: Sexo [M]asculino ou [F]eminino: M <enter> Altura: 1.65 <enter> Peso: 92 <enter> Peso Ideal: 62.0 Diferena de Peso: 30.0 Situao: GORDO Sair [S/N]? s <enter>
MAGRO IDEAL GORDO -------------------|-------------------|---------------------5% pi 5% Observao: Programa termina se o usurio digitar S ou s na pergunta: Sair [S/N]?
54
primeiro elemento: x[0] ltimo elemento: x[nmero_de_elementos 1], ou seja, x[9] nmero de bytes: 10 x 4 = 40 bytes (um inteiro ocupa 4 bytes) 10.2 Strings Um objeto do tipo String (cadeia de caracteres) pode ser copiado para um vetor de caracteres. Veja o exemplo a seguir: ASCII: Americam Standard Code for Information Interchange. url: http://www.asciitable.com Programa Exemplo (28): Programa cpia String para um vetor de caracteres. todos os caracteres de uma
55
// ----------------------------------------- Fonte: Prog28.java package prog28; import java.util.Scanner; public class Prog28 { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; System.out.print("String: "); s = entrada.nextLine(); int n = s.length(); char [] vetorCaracter = new char[n]; for (int i = 0;i < s.length();i++) { vetorCaracter[i] = s.charAt(i); } System.out.print("Vetor: "); for (int i = n - 1;i >= 0;i--) { System.out.print(vetorCaracter[i]); } System.out.println(); } }
10.3 Matrizes (Multidimensional) tipo_dado [][] nome_matriz = new tipo_dado [tamanho][tamanho]; Exemplo: float [][] y = new float [5][5];
// matriz 2D
Para acessar o elemento 3, 4 da matriz y, deve-se escrever y[3][4]. Note que o primeiro elemento y[0][0] e o ltimo elemento y[4][4]. O total de elementos 25. Programa Exemplo (28a): O programa possui uma matriz bidimensional para gerar e exibir na tela n palpites para a Mega Sena.
// ------------------------------------------- Fonte: Prog28a.java package prog28a; import javax.swing.*; public class Prog28a { public static void main(String[] args) { int n = entradaDados(); int [][] sena = new int [n][6]; geraPalpites(n, sena); sort(n, sena); exibePalpites(n, sena); System.exit(0); } // --------------------------- entradaDados static int entradaDados() { String s; s = JOptionPane.showInputDialog("Numero de Palpites: "); int n = Integer.parseInt(s); return(n); } // --------------------------- geraPalpites static void geraPalpites(int n, int [][] sena) {
56
int num; boolean repetido; for (int i = 0;i < n;i++) { for (int j = 0;j < 6;j++) { do { num = (int) (1 + (Math.random() * 60)); System.out.println(num); repetido = testaRepetido(num, sena[i]); if (!repetido) { sena[i][j] = num; } } while (repetido); } } } // --------------------------- testaRepetido static boolean testaRepetido(int num, int [] sena) { for (int i = 0;i < 6;i++) { if (num == sena[i]) { return(true); } } return(false); } // --------------------------- sort static void sort(int n, int [][] sena) { for (int k = 0;k < n;k++) { for (int i = 0;i < 5;i++) { for (int j = i+1;j < 6;j++) { if (sena[k][i] > sena[k][j]) { int temp = sena[k][i]; sena[k][i] = sena[k][j]; sena[k][j] = temp; } } } } } // --------------------------- exibePalpites static void exibePalpites(int n, int [][] sena) { for (int i = 0;i < n;i++) { String extenso = ""; for (int j = 0;j < 6;j++) { extenso = extenso + sena[i][j] + " "; } JOptionPane.showMessageDialog(null, "Palpite: JOptionPane.PLAIN_MESSAGE); } } }
"
extenso,
"Mega
Sena",
10.4 Vetor de Strings Para criar um vetor de Strings, deve-se utilizar um vetor de Strings. Exemplo: String [] nome = new String[3]; nome[0] = UCPel; nome[1] = UCS; nome[2] = UFPel; String [] s = {Pelotas, Rio Grande, Bag};
57
Tabela 12: 0 0 U 1 U 2 U
Exemplo 1 C C F
de um 2 P S P
Cria um vetor com trs Strings. Para acessar uma String em particular deve-se especificar o ndice entre colchetes, ou seja, nome[0], nome[1] ou nome[2]. 10.5 Inicializao de matrizes e vetores tipo_dado [][] nome_matriz = {lista_valores}; lista_valores: lista de constantes separadas compatveis em tipo com o tipo base da matriz. Exemplo: int [] i = {0,1,2,3,4,5,6,7,8,9}; por vrgulas que so
// 10 elementos
Observao: Quando um vetor declarado e inicializado (ao mesmo tempo) o nmero de elementos (neste caso 10) pode ser suprimido, ou seja, neste caso opcional (veja exemplo anterior). 10.6 Inicializao de um vetor de caracteres char [] nome_vetor Exemplo: = {lista_de_caracteres};
10.7 Inicializao de matrizes multidimensionais int [][] y = { {1,1}, {2,4}, {3,9}, {4,16} }; y[0][0] y[0][1] y[1][0] y[1][1] = = = = 1 1 2 4 y[2][0] y[2][1] y[3][0] y[3][1] = = = = 3 9 4 16
10.8 Inicializao de vetores e matrizes sem tamanho Na inicializao de uma matriz (ou vetor), se no for especificado seu tamanho, ento o compilador Java cria uma matriz (ou vetor) grande o suficiente para conter todos os inicializadores presentes. Exemplo: char [] s = {p,a,u,l,o};
// s ocupa 5 bytes
Programa exemplo (29): O programa permite armazenar n nomes e idades em dois vetores.
// ---------------------------------------------- Fonte: prog29.java package prog29; import java.util.Scanner; public class Prog29 {
58
public static void main(String[] args) throws Exception{ Scanner entrada = new Scanner(System.in); String s; String [] nome; int [] idade; int numElementos; char ch; System.out.print("Numero de Elementos: "); s = entrada.nextLine(); numElementos = Integer.parseInt(s); nome = new String[numElementos]; idade = new int[numElementos]; for (int i = 0;i < numElementos;i++) { System.out.print("Nome: "); nome[i] = entrada.nextLine(); System.out.print("Idade: "); s = entrada.nextLine(); idade[i] = Integer.parseInt(s); } for (int i = 0; i < numElementos; i++) { System.out.printf("| %-41s | %d | \n", nome[i], idade[i]); } } }
Programa exemplo (30): O programa realiza a soma de duas matrizes (A e B) bidimensionais, gerando uma matriz resultante C.
// ---------------------------------------------- Fonte: Prog30.java package prog30; import java.util.Scanner; public class Main { public static void main(String[] args) { final int MAX = 10; Scanner entrada = new Scanner(System.in); String s; int [][] a = new int [MAX][MAX]; int [][] b = new int [MAX][MAX]; int [][] c = new int [MAX][MAX]; int col, lin, j, m, n; System.out.print("Informe a ORDEM da MATRIZ: (mxn)\n"); do { System.out.printf("Nmero de linhas (m): "); s = entrada.nextLine(); m = Integer.parseInt(s); } while (m < 1 || m > MAX); // m de 1 10 do { System.out.print("Nmero de colunas (n): "); s = entrada.nextLine(); n = Integer.parseInt(s); } while (n < 1 || n > MAX); // n de 1 10 for (lin = 1;lin <= m;lin++) { for (col = 1;col <= n;col++) { System.out.printf("A[%d,%d] = ",lin,col); s = entrada.nextLine(); a[lin][col] = Integer.parseInt(s); System.out.printf("B[%d,%d] = ",lin,col); s = entrada.nextLine(); b[lin][col] = Integer.parseInt(s); } } System.out.println(); for (lin = 1;lin <= m;lin++) { for (col = 1;col <= n;col++) { c[lin][col] = a[lin][col] + b[lin][col]; System.out.printf("C[%d,%d] = %d\n",lin,col,c[lin][col]); } } } }
59
10.9 Classificao de dados ou ordenao (sort) Para exemplificar melhor as variveis do tipo vetor, abaixo so mostrados dois tipos de ordenao, tambm chamado sort (classificao de dados): Programa exemplo (31): O programa classifica os nomes digitados pelo usurio.
// -------------------------------------------- Fonte: Prog31.java package prog31; import java.util.Scanner; public class Prog31 { public static void main(String[] args) { String [] nome; int numElementos; Scanner entrada = new Scanner(System.in); String s; System.out.print("Numero de Elementos: "); s = entrada.nextLine(); numElementos = Integer.parseInt(s); nome = new String[numElementos]; for (int i = 0;i < numElementos;i++) { System.out.print("Nome: "); nome[i] = entrada.nextLine(); } for (int i = 0; i < numElementos - 1; i++) { for (int j = i+1; j < numElementos; j++) { if (nome[i].compareTo(nome[j]) > 0) { String temp = nome[i]; nome[i] = nome[j]; nome[j] = temp; } } } System.out.printf("\nNomes ORDENADOS\n"); for (int i = 0; i < numElementos; i++) { System.out.printf("Nome: %s\n", nome[i]); } } }
Observao: O mtodo compareTo descrito no prximo captulo. Programa exemplo (32): O programa utiliza um mtodo de sort chamado bubble sort (mtodo da bolha) para classificar nomes.
// ------------------------------------------- Fonte: Prog32.java package prog32; import java.util.Scanner; public class Prog32 { public static void main(String[] args) { String [] nome; int numElementos; Scanner entrada = new Scanner(System.in); String s; boolean sort; System.out.print("Numero de Elementos: "); s = entrada.nextLine(); numElementos = Integer.parseInt(s); nome = new String[numElementos];
60
for (int i = 0;i < numElementos;i++) { System.out.print("Nome: "); nome[i] = entrada.nextLine(); } int k = numElementos - 1; do { sort = false; for (int i = 0; i < k; i++) { if (nome[i].compareTo(nome[i+1]) > 0) { String temp = nome[i]; nome[i] = nome[i+1]; nome[i+1] = temp; sort = true; } } k--; } while (sort); System.out.printf("\nNomes ORDENADOS\n"); for (int i = 0; i < numElementos; i++) { System.out.printf("Nome: %s\n", nome[i]); } } }
10.10 Lista de exerccios (vetores) 10.10.1 Escreva um programa em Java que recebe via teclado um conjunto de letras (mximo 20). Armazene todas as letras em um vetor (letras) at que o usurio digite um F ou f. Logo aps copie todas as letras (em ordem inversa) para outro vetor (inverso). Ao final imprima os dois vetores.
Exemplo: Letra: Letra: Letra: Letra: Letra: LIMA AMIL L I M A f <enter> <enter> <enter> <enter> <enter>
10.10.2 Escreva um programa em Java que recebe via teclado: nmero de idades e as respectivas idades. Armazene todas as idades em um vetor (idade). Logo aps a entrada de todas as idades, o programa deve receber via teclado: idade para consulta. O programa deve imprimir na tela, o nmero de idades antes da idade de consulta e o nmero de idades depois da idade de consulta.
Exemplo: Nmero de idades: 6 <enter> Idade: 30 <enter> Idade: 60 <enter> Idade: 10 <enter> Idade: 50 <enter> Idade: 20 <enter> Idade: 40 <enter> Idade para consulta: 50 <enter> Antes: 3 Depois: 2 Continua [S/N]? n <enter>
10.10.3 Escreva um programa em Java que recebe via teclado um conjunto de nmeros inteiros (mximo 50). Armazene todos os nmeros inteiros em um vetor at que o usurio digite 0 (zero). Logo aps permita ao usurio consultar um nmero informando o seu valor. O programa deve imprimir na tela a posio do nmero no vetor ou ERRO: Nmero no encontrado (veja exemplos abaixo):
Exemplo: Nmero: 50 <enter> Nmero: 30 <enter> Nmero: 20 <enter>
61
Nmero: 10 <enter> Nmero: 40 <enter> Nmero: 0 <enter> Valor: 20 <enter> Posio no vetor: 2 Valor: 40 <enter> Posio no vetor: 4 Valor: 60 <enter> ERRO: Nmero no encontrado Valor: 0 <enter> Observao: O programa termina quando o usurio digitar 0 (zero).
10.10.4 Escreva um programa em Java que recebe via teclado "n" conceitos (A, B, C, D e E) (mximo 25) at que o usurio digite F ou f. Armazene todos os conceitos em um vetor (conceito). Imprima na tela o nmero de alunos: aprovados (A, B e C), reprovados (D) e os infreqentes (E).
Exemplo: Conceito: B <enter> Conceito: A <enter> Conceito: E <enter> Conceito: B <enter> Conceito: D <enter> Conceito: C <enter> Conceito: A <enter> Conceito: E <enter> Conceito: f <enter> 5 Aprovado(s) 1 Reprovado(s) 2 Infreqente (s)
10.10.5 Escreva um programa em Java que recebe via teclado n (mximo 50) nomes. A entrada dos nomes termina quando o usurio digitar apenas <enter>. Logo aps a entrada de todos os nomes o programa deve permitir a entrada via teclado de uma letra. O programa deve imprimir na tela todos os nomes que comeam com a letra especificada pelo usurio. O programa termina quanto o usurio digitar (nada) na entrada da letra (conforme exemplos abaixo):
Exemplo: Nome: Paulo <enter> Nome: Roberto <enter> Nome: Renato <enter> Nome: Pedro <enter> Nome: Fabio <enter> Nome: <enter> Letra: R <enter> Nome: Roberto Nome: Renato Letra: P <enter> Nome: Paulo Nome: Pedro Letra: T <enter> Letra: <enter>
10.10.6 Escreva um programa em Java que recebe via teclado n 30) nomes e idades. A entrada dos dados termina quando o digitar 'N' ou 'n' na pergunta "Continua [S/N]?". Logo aps a de todos os dados o programa deve imprimir na tela todos os idades desde o mais velho at o mais novo.
Exemplo: Nome: Ana <enter> Idade: 12 <enter> Continua [S/N]? s <enter> Nome: Beatriz <enter> Idade: 13 <enter> Continua [S/N]? s <enter> Nome: Carla <enter> Idade: 14 <enter> Continua [S/N]? N <enter>
62
14 13 12
63
Sintaxe: char charAt(int index); Retorna o caracter do ndice especifiado. Modo de usar: String s = Pelotas; ch = s.charAt(0); // ch = P; Onde: char ch; Sintaxe: int compareTo(Object o); Compara a String com um Objeto. Sintaxe: int compareTo(String anotherString); Compara duas Strings lexicograficamente. Sintaxe: int compareToIgnoreCase(String str); Compara duas Strings lexicograficamente, ignorando mausculas e minsculas. Sintaxe: String concat(String str); Concatena a String especificada no fim desta String. Sintaxe: boolean contentEquals(StringBuffer sb); Retorna true se e somente se esta String representa sequncia de caracteres do que a StringBuffer especificada. a mesma diferenas entre
Sintaxe: static String copyValueOf(char[] data); Retorna uma String que representa a sequncia de caracteres do vetor especificado. Sintaxe: static String copyValueOf(char[] data, int offset, int count); Retorna uma String que representa uma sequncia de caracteres do vetor especificado. Sintaxe: boolean endsWith(String suffix); Testa se esta String termina com o sufixo especificado. Sintaxe: boolean equals(Object anObject); Compara esta String com o objeto especificado. Sintaxe: boolean equalsIgnoreCase(String anotherString); Compara esta String com outra String, ignorando maisculas minsculas. e
Sintaxe: byte[] getBytes(); Codifica esta String em uma sequncia de bytes usando o conjunto de caracteres, armazenando o resultaod em um novo vetor de bytes. Sintaxe: byte[] getBytes(String charsetName);
64
Codifica esta String em uma sequncia de bytes usando o conjunto de caracteres do nome, armazenando o resultado dentro do novo vetor. Sintaxe: void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin); Cpia esta seqncia de caracteres em um vetor de caracteres destino. Sintaxe: int hashCode(); Retorna o cdigo hash desta String. Sintaxe: int indexOf(int ch); Retorna o ndice dentro desta seqncia da caracter especificado ou -1 se no encontrar. primeira ocorrncia do
Sintaxe: int indexOf(int ch, int fromIndex); Retorna o ndice dentro desta String da primeira ocorrncia caracter especificado, iniciando a busca no ndice espeficidado. Sintaxe: int indexOf(String str); Retorna o ndice dentro desta substring especificada. String da primeira ocorrncia
do
da
Sintaxe: int indexOf(String str, int fromIndex); Retorna o ndice dentro desta String da primeira ocorrncia substring especificada, iniciando a busca no ndice espeficidado. Sintaxe: String intern(); Retorna uma representao cannica da String objeto.
da
Sintaxe: int lastIndexOf(int ch); Retorna o ndice dentri desta String da ltima ocurrncia do caracter especificado. Sintaxe: int lastIndexOf(int ch, int fromIndex); Retorna o ndice dentro desta String da ltima ocurrncia do caracter especificado, pesquisando para trs comeando no ndice especificado. Sintaxe: int lastIndexOf(String str); Retorna o ndice dentro desta seqncia da ocorrncia mais direita da subseqncia especificada. Sintaxe: int lastIndexOf(String str, int fromIndex); Retorna o ndice dentro desta String da ltima ocorrncia da substring especificada, buscando para trs comeando o ndice especificado. Sintaxe: int length(); Retorna o comprimento desta String. Sintaxe: boolean matches(String regex); Diz se esta seqncia corresponde a expresso regular ou no. Sintaxe: boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len); Testa se duas regies das Strings so iguais. Sintaxe: boolean regionMatches(int toffset, String other, int ooffset, int len); Testa se duas regies das Strings so iguais. Sintaxe: String replace(char oldChar, char newChar);
65
Retorna uma nova String resultante da troca de todas as ocorrncias do oldChar nesta String com newChar. Sintaxe: String replaceAll(String regex, String replacement); Substitui cada subseqncia da seqncia de caracteres que corresponde a expresso regular com a substituio dadas. Sintaxe: String replaceFirst(String regex, String replacement); Substitui as primeiras substrings dessa String que corresponde expresso regular com a substituio dadas. Sintaxe: String[] split(String regex); Divide essa String em pedaos em torno da expresso regular. Sintaxe: String[] split(String regex, int limit); Divide essa String em pedaos em torno da expresso regular. Sintaxe: boolean startsWith(String prefix); Testa se esta String comea com o prefixo especificada. Sintaxe: boolean startsWith(String prefix, int toffset); Testa se essa String comea com o prefixo especificad comeando no ndice especificado. Sintaxe: CharSequence subSequence(int beginIndex, int endIndex); Retorna uma nova String de caracteres que uma subseqncia desta seqncia. Sintaxe: String substring(int beginIndex); Retorna uma nova String que uma substring desta String. Sintaxe: String substring(int beginIndex, int endIndex); Retorna uma nova String que uma substring desta string. Sintaxe: char[] toCharArray(); Converte esta String em um novo vetor de caracteres. Sintaxe: String toLowerCase(); Converte todos os caracteres desta String para minsculos. Sintaxe: String toString(); Este objeto (que j uma String) retornado. Sintaxe: String toUpperCase(); Converte todos os caracteres desta String para maisculos. Sintaxe: String trim(); Retorna uma cpia desta String. Sintaxe: static String valueOf(boolean b); Retorna uma representao String do argumento boolean. Sintaxe: static String valueOf(char c); Retorna uma representao String do argumento char. Sintaxe: static String valueOf(char[] data); Retorna uma representao String do argumento char []. Sintaxe: static String valueOf(char[] data, int offset, int count); Retorna uma representao String do argumento char [[].
66
Sintaxe: static String valueOf(double d); Retorna uma representao String do argumento double. Sintaxe: static String valueOf(float f); Retorna uma representao String do argumento float. Sintaxe: static String valueOf(int i); Retorna uma representao String do argumento int. Sintaxe: static String valueOf(long l); Retorna uma representao String do argumento long. Sintaxe: static String valueOf(Object obj); Retorna uma representao String do argumento Object. Exemplos: a) Exemplo do uso de toUpperCase e toLowerCase:
// ----------------------------------------------------- Fonte: ToUpperCase.java package touppercase; public class ToUpperCase { public static void main(String[] args) { String s = "Paulo Roberto Gomes Luzzardi"; System.out.println("Nome: " + s); System.out.println("Nome: " + s.toUpperCase()); System.out.println("Nome: " + s.toLowerCase()); System.exit(0); } } Resultado do Programa: Nome: Paulo Roberto Gomes Luzzardi Nome: PAULO ROBERTO GOMES LUZZARDI Nome: paulo roberto gomes luzzardi
67
System.exit(0); } } Resultado do Programa: Nome: pelotas Invertido: satolep Continua [S/N]? s Nome: satolep Invertido: pelotas Continua [S/N]? N
} }
11.2 Lista de exerccios (Strings) 11.2.1 Escreva um programa em Java que recebe via teclado um nome. Logo aps a entrada do nome imprima: nmero de letras maisculas, nmero de letras minsculas, nmero de vogais e o nmero de consoantes, conforme exemplo abaixo:
Exemplo: Nome: Universidade Catlica de Pelotas <enter> (3) Letras maisculas (26) Letras minsculas (14) Vogais (15) Consoantes
11.2.2 Escreva um programa em Java que recebe via teclado uma palavra e uma letra. Logo aps a entrada do nome e da letra imprima o nmero de letras que existe no nome ou ERRO: No existe a letra (?) na palavra (?), conforme exemplo abaixo:
Exemplo: Palavra: Luzzardi <enter> Letra: z <enter> 2 letra(s) Continua [S]im ou [N]o? S <enter> Palavra: Luzzardi <enter> Letra: w <enter> ERRO: No existe a letra (w) na palavra (Luzzardi) Continua [S]im ou [N]o? N <enter> quando o usurio digitar N ou n na
11.2.3 Escreva um programa em Java que recebe via teclado uma palavra (mximo 20 letras) e uma posio. O programa deve imprimir na tela, a letra antecessora, a letra (da referida posio) e a letra sucessora, conforme exemplo abaixo:
Exemplo: Palavra: Universidade <enter> Posio: 7 <enter>
68
Antecessora: s Letra: i Sucessora: d Observao: O programa deve imprimir na tela as seguintes mensagens de erro, se for o caso: Letra antecessora no existe, Letra sucessora no existe ou Posio invlida.
11.2.4 Escreva um programa em Java que recebe via teclado um nome. O programa deve imprimir, na tela, as palavras do nome em ordem inversa, uma por linha, conforme exemplo abaixo:
Exemplo: Nome: Paulo Roberto Gomes Luzzardi <enter> Luzzardi Gomes Roberto Paulo
11.2.5 Escreva um programa em Java que recebe via teclado um nome. Logo aps a entrada do nome o programa deve imprimir (EM LETRA MAISCULA) o sobrenome da pessoa, conforme exemplos abaixo:
Exemplo: Nome: Paulo Roberto Gomes Luzzardi <enter> Sobrenome: LUZZARDI Sair [S/N]? N <enter> Nome: Renato Souza <enter> Sobrenome: SOUZA Sair [S/N]? s <enter>
11.2.6 Escreva um programa em Java que recebe via teclado um nome. Logo aps a entrada do nome o programa deve imprimir na tela: sobrenome, primeiro nome e demais nomes abreviados, conforme exemplos abaixo:
Exemplo: Nome: Paulo Roberto Gomes Luzzardi <enter> Autor: Luzzardi, Paulo R. G. Sair [S/N]? N <enter> Nome: Renato Lima Souza <enter> Autor: Souza, Renato L. Sair [S/N]? s <enter>
11.2.7 Escreva um programa em Java que recebe via teclado o nome de um estado. Logo aps a entrada do nome do estado imprima: a sigla do estado (2 letras maisculas), conforme exemplos abaixo:
Exemplo: Estado: Rio Grande do Sul <enter> Sigla: RS Estado: so paulo <enter> Sigla: SP Estado: rio de janeiro <enter> Sigla: RJ Estado: <enter>
Observao: O programa encerra quando o usurio digitar apenas <enter> na entrada do nome do estado.
11.2.8 Escreva um programa em Java que recebe via teclado uma palavra, incio e fim. Logo aps a entrada de todos os dados imprima a string resultante ou ERRO: Fim invlido ou Incio invlido, conforme exemplos abaixo:
Exemplo: Palavra: universidade <enter> Incio: 7 <enter> Fim: 11 <enter>
69
String resultante: idade Continua [S/N]? s <enter> Palavra: eletricidade <enter> Incio: 7 <enter> Fim: 15 <enter> ERRO: Fim Invlido Continua [S/N]? N <enter> Observao: O programa termina quando o usurio digitar N ou n na pergunta: Continua [S/N]?.
tipo_do_retorno: Especifica o tipo de dado que ser retornado pelo mtodo. O retorno do mtodo feito pelo comando return (valor). Parmetros ou argumentos: uma lista, separada por vrgulas, com os nomes das variveis (e seus tipos) que recebero os argumentos quando o mtodo for chamado ou executado. Mtodo procedural: um tipo especial de mtodo que no possui retorno, ou seja, simplesmente um procedimento. Um mtodo deste tipo void. Exemplo: Programa que gera 10 nmeros aleatrios, usando um mtodo esttico escrito pelo programador.
// ----------------------------------------------- Fonte: rand.java package rand; public class Rand { public static void main(String[] args) { for (int i = 1;i <= 10;i++) { System.out.println("Valor: " + random(10)); } } // ----------------------------------------------- random static int random (int n) { int t; t = (int) (Math.random() * n); return(t); } }
programa
possui
um
mtodo
esttico
que
70
package prog33; import java.util.Scanner; public class Prog33 { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; double inv, x; System.out.print("x: "); s = entrada.nextLine(); x = Double.parseDouble(s); inv = inverso (x); // chamada do mtodo inverso System.out.printf("Inverso = %.2f\n", inv); System.exit(0); } // ----------------------------- Mtodo definido pelo programador static double inverso (double x) { double i; i = (double) 1 / x; return(i); } }
12.1 Valores de retorno Todas os mtodos, exceto aqueles que so declaradas como sendo do tipo void, devolvem um valor. O valor devolvido (retornado) pelo mtodo atravs do comando return. Normalmente so escritas trs tipos de mtodos: a) Mtodos que efetuam operaes com os parmetros e retornam um valor com base nas operaes. Programa exemplo (34): O programa calcula e imprime na tela o valor da potncia xy atravs de um mtodo esttico chamado: potencia.
// --------------------------------------------- Fonte: Prog34.java package prog34; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; double base,resp; int expoente; System.out.print("Base: "); s = entrada.nextLine(); base = Double.parseDouble(s); System.out.print("Expoente: "); s = entrada.nextLine(); expoente = Integer.parseInt(s); // chamada do mtodo potencia resp = potencia(base, expoente); System.out.printf("Potencia = %7.2f\n",resp); System.exit(0); } // ----------------------------- Mtodo definido pelo programador
71
static double potencia (double x, int y) { double valor; valor = Math.exp ( Math.log (x ) * y ); return(valor); } }
b) Mtodos que manipulam informaes e retornam um simplesmente indica o sucesso ou o fracasso da manipulao.
valor
que
Programa exemplo (35): O programa calcula e verifica o determinante de uma equao de segundo grau atravs de um mtodo esttico chamado: verificaDeterminante.
// ------------------------------------------ Fonte: Prog35.java package prog35; import java.util.Scanner; public class Prog35 { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; float a, b, c; int retorno; System.out.print("a = "); s = entrada.nextLine(); a = Float.parseFloat(s); System.out.print("b = "); s = entrada.nextLine(); b = Float.parseFloat(s); System.out.print("c = "); s = entrada.nextLine(); c = Float.parseFloat(s); retorno = verificaDeterminante(a,b,c); if (retorno == 0) { System.out.println("Determinante ZERO"); } else { if (retorno > 0) { System.out.println("Determinante POSITIVO"); } else { System.out.println("Determinante NEGATIVO"); } } System.exit(0); } // ------------------------ mtodo definido pelo programador static int verificaDeterminante (float a, float b, float c) { float det; det = b * b - 4 * a * c; if (det == 0) { return(0); } else { if (det > 0) { return(1); } else { return(-1); } } } }
72
no
retornam
nenhum
valor,
ou
seja,
so
puramente
Programa exemplo (36): O programa possui um mtodo esttico que limpa toda a tela em modo texto atravs do mtodo chamado: imprimeNumero.
// -------------------------------------- Fonte: Prog36.java package prog36; import java.util.Scanner; public class Prog36 { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; int x; float y; System.out.print("Digite um Numero: "); s = entrada.nextLine(); x = Integer.parseInt(s); imprimeNumero(x); System.out.print("Digite outro Numero: "); s = entrada.nextLine(); y = Float.parseFloat(s); imprimeNumero(y); System.exit(0); } // ----------------------------- ImprimeNumero static void imprimeNumero(int n) { System.out.println("Numero digitado foi " + n); } // ----------------------------- ImprimeNumero static void imprimeNumero(float n) { System.out.println("Numero digitado foi " + n); } }
Observao: Note que o mtodo imprimeNumero foi sobrecarregado, ou seja, ele funciona quando o argumento int ou float. 12.2 Passagem de parmetros por valor Forma de chamada de um mtodo, onde o valor do argumento apenas copiado para o parmetro formal do mtodo. Portanto, alteraes feitas nos parmetros no tero efeito nas variveis utilizadas para cham-la. Programa exemplo (37): O programa possui um mtodo que desenha um retngulo na tela.
// ------------------------------------------- Fonte: Prog37.java package prog37; public class Main { public static void main(String[] args) { desenhaRetangulo(1, 1, 20, 10); } // ------------------------ desenhaRetangulo static void desenhaRetangulo (int ci, int li, int cf, int lf) { int c, l;
73
for (l = li; l <= lf; l++) { for (c = ci; c <= cf; c++) { System.out.print("#"); } System.out.println(); } } }
Onde: ci li cf lf
Ateno: Os argumentos do mtodo recebem, respectivamente: ci=1, li=1, cf=20 e lf=10. 12.3 Passagem de parmetros por referncia A passagem de parmetros ou argumentos por referncia em Java acontece somente com qualquer tipo de dado do tipo vetor, matriz ou objetos, ou seja, no possvel fazer passagem de argumento por referncia com variveis do tipo: char, byte, int, short, long, flaot ou double. Programa exemplo (38): O programa tem um mtodo que troca o valor de duas variveis.
// ------------------------------------------------- Fonte: Prog38.java package prog38; public class Prog38 { public static void main(String[] args) { int [] x = {3, 4}; // foi impresso na tela Vetor: 3 | 4 System.out.printf("Vetor: %d - %d\n", x[0], x[1]); troca(x); // foi impresso na tela Vetor: 4 | 3 System.out.printf("Vetor: %d - %d\n", x[0], x[1]); } // ------------------------------------- troca static void troca (int [] x) { int temp = x[0]; x[0] = x[1]; x[1] = temp; } }
12.4 Mtodos que devolvem valores no-inteiros Todas os mtodos que devolvem valores no-inteiros devem ter seu tipo de retorno declarado.
tipo_do_retorno nome_do_metodo (tipo_dado_base parmetros);
Programa exemplo (39): O programa calcula e imprime na tela a diviso de dois valores usando um mtodo esttico chamado diviso.
// ------------------------------------------ Fonte: prog39.java
74
package prog39; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; int x, y; float resposta; System.out.printf("x = "); s = entrada.nextLine(); x = Integer.parseInt(s); System.out.printf("y = "); s = entrada.nextLine(); y = Integer.parseInt(s); resposta = divisao( x, y); System.out.printf("Diviso = %7.2f\n",resposta); } // ----------------------------- mtodo definido pelo programador static float divisao (int x, int y) { return( (float) x / y ); } }
12.5 Argumentos do main (String [] args) O mtodo esttico main possui um argumento args intrnsecos utilizados para receber parmetros da linha de comando do Sistema Operacional. args Vetor de Strings Programa exemplo (40): O programa recebe parmetros do Operacional (uma palavra qualquer) e imprime a palavra em inverso. O programa deve ser executado via terminal do Operacional da seguinte forma: Execuo pela linha de comandos (terminal): $ java Prog40 pelotas <enter> Resultado na tela: satolep Programa recebe: argv[0] = pelotas
// --------------------------------------- Fonte: Prog40.java package prog40; public class Prog40 { public static void main(String[] args) { int n, argc = args.length; if (argc != 1) { System.out.printf("Sintaxe: Prog40 <palavra>\n"); } else { System.out.print("Palavra: "); n = args[0].length(); for (int i = n-1; i >= 0; i--) { System.out.printf("%c", args[0].charAt(i));
75
} }
} System.out.println(); }
Programa exemplo (41): O programa deve receber parmetros pelo Sistema Operacional (conjunto de caracteres) e deve ordenar (coloca em ordem alfabtica), imprimindo-os a seguir. Execuo pela linha de comandos: $ java Prog41 dbeacgf <enter> Resultado na tela: abcdefg Programa recebe: agv[0] = dbeacgf
// ------------------------------------- Fonte: Prog41.java package prog41; public class Prog41 { public static void main(String[] args) { int argc = args.length; int numCar; if (argc != 1) { System.out.printf("Sintaxe: Prog41 <palavra> \n"); } else { numCar = args[0].length(); char [] ch = new char[numCar]; for (int i = 0;i < numCar;i++) { ch[i] = args[0].charAt(i); } for (int i = 0; i < numCar-1; i++) { for (int j = i+1; j < numCar; j++) { if (ch[i] > ch[j]) { char temp = ch[i]; ch[i] = ch[j]; ch[j] = temp; } } } for (int i =0;i < numCar;i++) { System.out.printf("%c", ch[i]); } System.out.printf("\n");
} } }
12.6 Recursividade Um mtodo recursivo, se esta, fizer uma chamada a si prpria. Programa exemplo (42): O programa calcula o fatorial de um nmero recursivamente.
// ------------------------------------------ Fonte: Prog42.java package prog42; import java.util.Scanner; public class Prog42 {
76
public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; int n; long fat; do { do {
System.out.printf("n = "); s = entrada.nextLine(); n = Integer.parseInt(s); } while (n < 0 || n > 19); fat = fatorial(n); System.out.printf("Fatorial: %d\n", fat); } while (n != 0);
// ----------------------------------------- fatorial static long fatorial(int num) { if (num == 0) { return 1; } return(num * fatorial(num - 1)); } }
// recursividade
(43):
programa
calcula
soma
de
um
nmero
// ------------------------------------------- Fonte: Prog43.java package prog43; import java.util.Scanner; public class Prog43 { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; int n; long sum; do { System.out.printf("n = "); s = entrada.nextLine(); n = Integer.parseInt(s); } while (n < 0 || n > 19); if (n > 0) { sum = soma(n); System.out.printf("Soma: %d\n", sum); } } while (n != 0); } // ----------------------- soma static long soma(int n) { long s; if (n == 1) { return(1); } s = n + soma(n-1); return(s); } } do {
// recursividade
77
12.7 Lista de Exerccios (mtodos) 12.7.1 Escreva em Java o mtodo nmeroPalavras. O mtodo recebe uma String (nome) e retorna o nmero de palavras do nome (veja exemplo abaixo):
// ------------------------------------------------------ Fonte: teste.java package teste; import java.util.Scanner; public class Teste { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String nome; int n; System.out.print("Nome: "); nome = entrada.nextLine(); n = numeroPalavras(nome); System.out.printf("Seu nome tem %d palavra(s)\n", n);
// ---------------------------- numeroPalavras }
Exemplo: Nome: Paulo Roberto Gomes Luzzardi <enter> Seu nome tem 4 palavra(s) 12.7.2 Escreva em Java o mtodo verificaQuadrante. O mtodo recebe um valor para x e um valor para y e retorna o nmero do quadrante (1, 2, 3 ou 4).
// --------------------------------------------------------- Fonte: teste.java package teste; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; int x, y, n; System.out.print("x: "); s = entrada.nextLine(); x = Integer.parseInt(s); System.out.print("y: "); s = entrada.nextLine(); y = Integer.parseInt(s); n = verificaQuadrante(x, y); System.out.printf("Quadrante: %d\n", n); } } // ---------------------------- verificaQuadrante
| 2 | 1 ________________________ | 3 | 4
78
12.7.3 Escreva o mtodo: final_da_placa. O mtodo recebe uma placa de automvel no formato: xxx9999 e retorna o ltimo dgito da placa.
// ------------------------------------------------------------ Fonte: teste.java package teste; import java.util.Scanner; public class Teste { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String placa; char fim; System.out.print("Qual a placa de seu carro [xxx9999]: "); placa = entrada.nextLine(); fim = finalPlaca(placa); System.out.printf("Final da Placa : %c\n", fim);
// ---------------------------- finalPlaca }
Exemplo: Qual a Placa de seu carro [xxx9999]: IDJ7345 <enter> Final da Placa : 5 12.7.4 Escreva o mtodo numVogais. O mtodo recebe uma String (nome) e retorna a quantidade de vogais da String.
// ------------------------------------------------------------ Fonte: teste.java package teste; import java.util.Scanner; public class Teste { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String nome; int vogais; System.out.print("Nome: "); nome = entrada.nextLine(); vogais = numVogais(nome); System.out.printf("Vogais: %d\n", vogais); } // -------------------------- numVogais }
Exemplo: Nome: Paulo <enter> Vogais: 3 12.7.5 Escreva o mtodo calculaHipotenusa. O mtodo recebe o cateto adjacente (b) e o cateto oposto (a) e retorna o valor da hipotenusa dado pela seguinte frmula: Frmula: h2 = a2 + b2
79
import java.util.Scanner; public class Teste { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; float a, b, h; System.out.print("Cateto Adjacente: "); s = entrada.nextLine(); a = Float.parseFloat(s); System.out.print("Cateto Adjacente: "); s = entrada.nextLine(); b = Float.parseFloat(s); h = calculaHipotenusa(a, b); System.out.printf("Hipotenusa: %f\n", h); } // ---------------------------- calculaHipotenusa }
Exemplo: Cateto Adjacente: 3 <enter> Cateto Oposto: 3 <enter> Hipotenusa: 3 12.7.6 Escreva em Java o mtodo calculaReajuste. O mtodo recebe o valor do salrio e o ndice de reajuste e retorna o salrio atualizado.
// ------------------------------------------------------------ Fonte: teste.java package teste; import java.util.Scanner; public class Teste { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; float salario, indice, reajuste; System.out.print("Salrio (R$): "); s = entrada.nextLine(); salario = Float.parseFloat(s); System.out.print("ndice de Reajuste: "); s = entrada.nextLine(); indice = Float.parseFloat(s); reajuste = calculaReajuste(salario, indice); System.out.printf("Salrio Atualizado (R$): %.2f\n", reajuste); } // ---------------------------- calculaReajuste }
Exemplo: Salrio (R$): 1000 <enter> ndice de Reajuste: 10 <enter> Salrio Atualizado (R$): 1100
80
Collection FrameWork (Colees) Pacote: import java.util.*; Uma coleo um objeto que representa um grupo de objetos. Um Collection Framework uma arquitetura para representar e manipular colees independente dos detalhes de sua implementao. Uma coleo composta de Interfaces e Implementaes. Interfaces
Figura 3: Arquitetura das Interfaces Implementaes Sets(Conjuntos): HashSet, LinkedHashSet, TreeSet, EnumSet Lists (Listas): Vector, Stack, LinkedSet, ArrayList
81
Queue (Filas): PriorityQueue Maps: HashTable, HashMap, LinkedHashMap, WeakHashMap, IdentityHashMap, TreeMap A seguir so descritos alguns destes elementos:
Vector (Vetor)
import java.util.Vector; A classe Vector utilizada em uma estrutura armazenada em um vetor, ou seja, uma lista de elementos. de dados
A seguir so descritos os principais mtodos da classe Vector. Sintaxe: void add(int index, Object element); Insere um elemento especificado na posio especificada no Vetor. Sintaxe: boolean add(Object o); Anexa o elemento especificado no fim do Vetor. Sintaxe: boolean addAll(Collection c); Anexa todos os elementos da coleo especificada no final do Vetor, na ordem que eles so retornados pelo iterador da coleo especificada. Sintaxe: boolean addAll(int index, Collection c); Insere todos os elementos na coleo especificada no Vetor na posio especificada. Sintaxe: void addElement(Object obj); Adiciona o componente especificado no tamanho em um. Sintaxe: int capacity(); Retorna a corrente capacidade do Vetor. Sintaxe: void clear(); Remove todos os elementos do Vetor. Sintaxe: Object clone(); Retorna um clone do Vetor. Sintaxe: boolean contains(Object elem); Testa se um objeto especfico um componente do Vetor. Sintaxe: boolean containsAll(Collection c); Retorna true se o Vetor contm todos os especfica. elementos da coleo fim do Vetor, aumentando se
Sintaxe: void copyInto(Object[] anArray); Copia os componentes do Vetor para o Array especificado. Sintaxe: Object elementAt(int index); Retorna o componente especificado pelo index. Sintaxe: Enumeration elements(); Retorna uma enumerao dos componentes do Vetor. Sintaxe: void ensureCapacity(int minCapacity);
82
Aumenta a capacidade do Vetor, se necessrio, estando certo que de poder armazenar o nmero de componentes especificados pelo argumento mincapacity. Sintaxe: boolean equals(Object o); Compara o objeto especificado com o Vetor pela igualdade. Sintaxe: Object firstElement(); Retorna o primeiro componente (o item de index 0) do Vetor. Sintaxe: Object get(int index); Retorna o elemento da posio especificada do Vetor. Sintaxe: int hashCode(); Retorna o valor do cdigo hash do Vetor. Sintaxe: int indexOf(Object elem); Procura a primeira ocorrncia de um dado argumento, testando a igualdade pelo mtodo equals. Sintaxe: int indexOf(Object elem, int index); Procura pela primeira ocorrncia de um dado argumento, comeando a busca pelo index, e testando pela igualdade usando o mtod equals. Sintaxe: void insertElementAt(Object obj, int index); Insere o objeto especificado como um componente no Vetor no index especificado. Sintaxe: boolean isEmpty(); Testa se o Vetor no tem componentes. Sintaxe: Object lastElement(); Retorna o ltimo componente do Vetor. Sintaxe: int lastIndexOf(Object elem); Retorna o index da ltima ocorrncia Vetor. do objeto especificado no
Sintaxe: int lastIndexOf(Object elem, int index); Procura para trs por um objeto especificado, comeando no index especificado e retorna um index para ele. Sintaxe: Object remove(int index); Remove o elemento da posio especificada no Vetor. Sintaxe: boolean remove(Object o); Remove a primeira ocorrncia do elemento especificado no Vetor, se o Vetor no contm o elemento, ele no alterado. Sintaxe: boolean removeAll(Collection c); Remove do Vetor todos os elementos que contm a coleo especificada. Sintaxe: void removeAllElements(); Remove todos os componentes do Vetor e seta o tamanho em zero. Sintaxe: boolean removeElement(Object obj); Remove a primeira (menor indexado) ocorrncia do argumento do Vetor. Sintaxe: void removeElementAt(int index); Deleta o componente com index especificado.
83
Sintaxe:protected void removeRange(int fromIndex, int toIndex); Remove da lista todos os elementos escolhidos entre o fromIndex (inclusive) e toIndex (exclusive). Sintaxe: boolean retainAll(Collection c); Mantm somente os elementos do Vetor especificada. que contm a coleo
Sintaxe: Object set(int index, Object element); Troca o elemento da posio especificada do especificado.
Vetor
com
elemento
Sintaxe: void setElementAt(Object obj, int index); Seta o componente com index especificado do Vetor para o objeto especificado. Sintaxe: void setSize(int newSize); Seta o tamanho do Vetor. Sintaxe: int size(); Retorna o nmero de componentes do Vetor. Sintaxe: List subList(int fromIndex, int toIndex); Retorna uma viso da poro da Lista entre fromIndex (inclusive) e toIndex (exclusive). Sintaxe: Object[] toArray(); Retorna um array contendo todos correta. os elementos no Vetor na ordem
Sintaxe: Object[] toArray(Object[] a); Retorna um array contendo todos os elementos no Vetor ordem correta; o tipo runtime do array especificado retornado. Sintaxe: String toString(); Retorna uma string do Vetor, elemento. contendo uma representao de cada
Sintaxe: void trimToSize(); Ajusta a capacidade do Vetor para a atual dimenso do Vetor. Programa Exemplo (3): Exemplo de um vetor usando a classe Vector.
// ------------------------------------------- Fonte: Prog3.java package Prog3; import java.util.Vector; import javax.swing.JOptionPane; public class Prog3 { public static void main(String[] args) { Vector vetor = new Vector(); String s, extenso = ""; int u = -1, nodo; do { u++; s = JOptionPane.showInputDialog("Nodo: "); nodo = Integer.parseInt(s); if (nodo != 0) { vetor.add(nodo); // vetor.add(u, nodo); } } while (nodo != 0); extenso = vetor.toString();
84
int n = vetor.size(); /* ------------------------------------------------- outra forma for (int i = 0; i < n;i++) extenso = extenso + vetor.get(i) + " "; ---------------------------------------------------------------*/ JOptionPane.showMessageDialog(null, "Elementos: " + n + "\nVetor: " + extenso, "Vector", JOptionPane.PLAIN_MESSAGE); } }
Programa Exemplo (3a): Exemplo de um vetor usando a classe Vector, inserindo em uma determinada posio.
// --------------------------------------------- Fonte: Prog3a.java package prog3a; import java.util.Vector; import javax.swing.*; public class Prog3a { public static void main(String[] args) { Vector vetor = new Vector(); String s, extenso = ""; int nodo, pos; do { s = JOptionPane.showInputDialog("Nodo: "); nodo = Integer.parseInt(s); if (nodo != 0) { s = JOptionPane.showInputDialog("Posicao: "); pos = Integer.parseInt(s); if (pos >= 0 && pos <= vetor.size()) { vetor.add(pos, nodo); } else { JOptionPane.showMessageDialog(null, "ERRO: Posio Invlida ", "Vector", JOptionPane.PLAIN_MESSAGE); } } exibeVector(vetor); } while (nodo != 0); int n = vetor.size(); for (int i = 0; i < n;i++) extenso = extenso + vetor.get(i) + " "; JOptionPane.showMessageDialog(null, "Elementos: " + n + "\nVetor: " + extenso, "Vector", JOptionPane.PLAIN_MESSAGE); } static void exibeVector(Vector vetor) { System.out.printf("Indice: "); for (int i = 0;i < vetor.size();i++) { System.out.printf("%2d ", i); } System.out.println(); System.out.print(" Vetor: "); for (int i = 0;i < vetor.size();i++) { System.out.printf("%2d ", vetor.get(i)); } System.out.println(); }
Programa Exemplo (3b): Exemplo de um vetor usando a classe Vector e a classe ArrayList, inserindo inteiros e caractere (uso do toArray).
// -------------------------------------------- Fonte: toArray.java package toarray; import java.util.*;
85
public class toArray { public static void main(String[] args) { ArrayList lista = new ArrayList(); lista.add(10); lista.add(30); lista.add(40); lista.add(1, 20); System.out.println("ArrayList: " + lista); Object [] objeto = lista.toArray(); System.out.print("Objetos: "); for(int i = 0;i < lista.size();i++) { System.out.print(objeto[i] + " "); } System.out.println(); Vector vetor = new Vector(); vetor.add('A'); vetor.add('C'); vetor.add('D'); vetor.add(1, 'B'); System.out.println("Vector: " + vetor); Object [] objet = vetor.toArray(); System.out.print("Objetos: "); for(int i = 0;i < vetor.size();i++) { System.out.print(objet[i] + " "); } System.out.println(); System.exit(0); } }
Stack (Pilha)
import java.util.Stack; A classe Stack utilizada para armazenar elementos em uma Pilha. A seguir so descritos os principais mtodos da classe Stack. Sintaxe: boolean empty(); Testa se a pilha est vazia. Sintaxe: Object peek(); Verifica o objeto que est no topo da pilha sem remov-lo da pilha. Sintaxe: Object pop(); Remove o objeto do topo da pilha e returna o valor do objeto. Sintaxe: Object push(Object item); Insere um item no topo da pilha. Sintaxe: int search(Object o); Retorna a posio baseado na posio de onde o objeto se encontra da pilha. Programa Exemplo (4): Exemplo de uma pilha usando a classe Stack.
// --------------------------------------------- Fonte: Prog4.java package Prog4;
86
import java.util.Stack; import javax.swing.*; public class Prog4 { public static void main(String[] args) { Stack pilha = new Stack(); String s, extenso = ""; int nodo; do { s = JOptionPane.showInputDialog("Nodo: "); nodo = Integer.parseInt(s); if (nodo != 0) { pilha.push(nodo); } } while (nodo != 0); do { extenso = extenso + pilha.pop() + " "; } while (!pilha.empty()); JOptionPane.showMessageDialog(null, "Pilha: " + extenso, "Stack", JOptionPane.PLAIN_MESSAGE); } }
Queue (Fila)
import java.util.Queue; A interface Queue utilizada para armazenar elementos em uma Fila. A seguir so descritos os principais mtodos da interface queue. Sintaxe: E element(); Recupera, mas no remove, o primeiro da fila. Sintaxe: boolean offer(E o); Insere um elemento especificado dentro desta fila, se possvel. Sintaxe: E peek(); Recupera, mas no remove, o primeiro desta fila, retornando null se esta fila est vazia. Sintaxe: E poll(); Recupera e remove o primeiro desta fila, ou null se esta fila est vazia. Sintaxe: E remove(); Recupera e remove o primeiro desta fila. Programa Exemplo (5): Exemplo de uma fila usando a classe Queue + LinkedList.
// -------------------------------------- Fonte: Prog5.java package Prog5; import java.util.LinkedList; import java.util.Queue; import javax.swing.*; public class Prog5 { public static void main(String[] args) { Queue fila = new LinkedList(); // Fila com uma Lista Encadeada Simples String s, extenso = ""; int nodo;
87
do { s = JOptionPane.showInputDialog("Nodo: "); nodo = Integer.parseInt(s); if (nodo != 0) { fila.offer(nodo); } } while (nodo != 0); do { extenso = extenso + fila.poll() + " "; } while (!fila.isEmpty()); JOptionPane.showMessageDialog(null, "Fila: " + extenso, "Queue", JOptionPane.PLAIN_MESSAGE); } }
Observao: No programa exemplo, a fila (queue) foi implementada como uma lista encadeada simples (LinkedList). Diferenas entre Classe e Interface Uma interface em Java uma classe abstrata onde todos os mtodos so abstratos (abstract) e pblicos (public), e todos os atributos so estticos (static) e constantes tipadas (final). Ela semelhante a especificao de uma classe abstrata pura, com uma diferena: os mtodos das classes abstratas podem ou no ser implementados nas classes que a estendem, j os mtodos das interfaces tem que ser obrigatoriamente implementados nas classes que as implementam. Uma interface permite estabelecer uma padronizao que deve ser obedecida pela classe que a implementa. Quando uma classe implementa uma interface, ela deve garantir que todas as funcionalidades especificadas pela interface estaro presentes na classe. A sintaxe da declarao de uma interface parecida na definio de classes, porm seu corpo define apenas as assinaturas dos mtodos e constantes contidos na interface.
Arrays (array)
import java.util.Arrays; A classe Arrays pode ser utilizada em variveis do tipo vetor. Exemplo: final int MAX = 50; int [] vetor = new int[MAX];
A seguir so descritos os principais mtodos da classe Array. Sintaxe: static int binarySearch(byte[] a, byte key); Procura em um vetor de byte especificado por um valor especfico usando algoritmo binrio de busca. Sintaxe: static int binarySearch(char[] a, char key); Procura em um vetor de char especificado por um valor especfico usando algoritmo binrio de busca. Sintaxe: static int binarySearch(double[] a, double key); Procura em um vetor de double especificado por um valor especfico usando algoritmo binrio de busca. Sintaxe: static int binarySearch(float[] a, float key);
88
Procura em um vetor de float especificado por um valor especfico usando algoritmo binrio de busca. Sintaxe: static int binarySearch(int[] a, int key); Procura em um vetor de int especificado por um valor especfico usando algoritmo binrio de busca. Sintaxe: static int binarySearch(long[] a, long key); Procura em um vetor de long especificado por um valor especfico usando algoritmo binrio de busca. Sintaxe: static int binarySearch(Object[] a, Object key); Procura em um vetor de Object especificado por um valor especfico usando algoritmo binrio de busca. Sintaxe: static int binarySearch(short[] a, short key); Procura em um vetor de short especificado por um valor especfico usando algoritmo binrio de busca. Sintaxe: static boolean deepEquals(Object[] a1, Object[] a2); Retorna true se os dois arrays especifiados so iguais. Sintaxe: static int deepHashCode(Object[] a); Retorna o cdigo hash baseado na localizao do array especificado. Sintaxe: static String deepToString(Object[] a); Retorna em forma de string a localizao do array especificado. Sintaxe: static boolean equals(boolean[] a, boolean[] a2); Retorna true se os dois arrays especificados de boolean iguais. so
Sintaxe: static boolean equals(byte[] a, byte[] a2); Retorna true se os dois arrays especificados de byte so iguais. Sintaxe: static boolean equals(char[] a, char[] a2); Retorna true se os dois arrays especificados de char so iguais. Sintaxe: static boolean equals(double[] a, double[] a2); Retorna true se os dois arrays especificados de double so iguais. Sintaxe: static boolean equals(float[] a, float[] a2); Retorna true se os dois arrays especificados de float so iguais. Sintaxe: static boolean equals(int[] a, int[] a2); Retorna true se os dois arrays especificados de int [] so iguais. Sintaxe: static boolean equals(long[] a, long[] a2); Retorna true se os dois arrays especificados de iguais. long [] so
Sintaxe: static boolean equals(Object[] a, Object[] a2); Retorna true se os dois arrays especificados de Object [] so iguais. Sintaxe: static boolean equals(short[] a, short[] a2); Retorna true se os dois arrays especificados de short so iguais. Sintaxe: static void fill(boolean[] a, boolean val); Atribui um valor booleano especificado para cada elemento da matriz de booleanos.
89
Sintaxe: static void fill(boolean[] a, int fromIndex, int toIndex, boolean val); Atribui um valor booleano especificado para cada elemento da faixa da matriz de booleanos. Sintaxe: static void fill(byte[] a, byte val); Atribui um valor byte especificado para cada elemento da matriz de bytes. Sintaxe: static void fill(byte[] a, int fromIndex, int toIndex, byte val); Atribui um valor byte especificado para cada elemento da faixa da matriz de bytes. Sintaxe: static void fill(char[] a, char val); Atribui um valor char especificado para cada elemento da matriz de caracteres. Sintaxe: static void fill(char[] a, int fromIndex, int toIndex, char val); Atribui um valor char especificado para cada elemento da faixa da matriz de caracteres. Sintaxe: static void fill(double[] a, double val); Atribui um valor double especificado para cada elemento da matriz de doubles. Sintaxe: static void fill(double[] a, int fromIndex, int toIndex, double val); Atribui um valor double especificado para cada elemento da faixa da matriz de doubles. Sintaxe: static void fill(float[] a, float val); Atribui um valor float especificado para cada elemento da matriz de floats. Sintaxe: static void fill(float[] a, int fromIndex, int toIndex, float val); Atribui um valor float especificado para cada elemento da faixa da matriz de floats. Sintaxe: static void fill(int[] a, int val); Atribui um valor int especificado para cada elemento da matriz de ints. Sintaxe: static void fill(int[] a, int fromIndex, int toIndex, int val); Atribui um valor int [] especificado para cada elemento da faixa da matriz de inteiros. Sintaxe: static void fill(long[] a, int fromIndex, int toIndex, long val); Atribui um valor long [] especificado para cada elemento da faixa da matriz de inteiros longos. Sintaxe: static void fill(long[] a, long val); Atribui um valor long [] especificado para cada elemento da matriz de longs.
90
Sintaxe: static void fill(Object[] a, int fromIndex, int toIndex, Object val); Atribui um valor Object [] especificado para cada elemento da faixa da matriz de objetos. Sintaxe: static void fill(Object[] a, Object val); Atribui um valor Object especificado para cada elemento da matriz de Objects. Sintaxe: static void fill(short[] a, int fromIndex, int toIndex, short val); Atribui um valor short [] especificado para cada elemento da faixa da matriz de inteiros curtos. Sintaxe: static void fill(short[] a, short val); Atribui um valor short [] especificado para cada elemento da matriz de inteiros curtos. Sintaxe: static int hashCode(boolean[] a); Retorna o cdigo hash com base no contedo da array especificada. Sintaxe: static int hashCode(byte[] a); Retorna o cdigo hash com base no contedo da array especificada. Sintaxe: static int hashCode(char[] a); Retorna o cdigo hash com base no contedo da array especificada. Sintaxe: static int hashCode(double[] a); Retorna o cdigo hash com base no contedo da array especificada. Sintaxe: static int hashCode(float[] a); Retorna o cdigo hash com base no contedo da array especificada. Sintaxe: static int hashCode(int[] a); Retorna o cdigo hash com base no contedo da array especificada. Sintaxe: static int hashCode(long[] a); Retorna o cdigo hash com base no contedo da array especificada. Sintaxe: static int hashCode(Object[] a); Retorna o cdigo hash com base no contedo da array especificada. Sintaxe: static int hashCode(short[] a); Retorna o cdigo hash com base no contedo da array especificada. Sintaxe: static void sort(byte[] a); Ordena o array especificado de byte em ordem ascende numrica. Sintaxe: static void sort(byte[] a, int fromIndex, int toIndex); Ordena a faixa do array especificado de byte em ordem ascende numrica. Sintaxe: static void sort(char[] a); Ordena o array especificado de char em ordem ascende numrica. Sintaxe: static void sort(char[] a, int fromIndex, int toIndex); Ordena a faixa do array especificado de char em ordem ascende numrica. Sintaxe: static void sort(double[] a); Ordena o array especificado de double em ordem ascende numrica.
91
Sintaxe: static void sort(double[] a, int fromIndex, int toIndex); Ordena a faixa do array especificado de double em ordem ascende numrica. Sintaxe: static void sort(float[] a); Ordena o array especificado de float em ordem ascende numrica. Sintaxe: static void sort(float[] a, int fromIndex, int toIndex); Ordena a faixa do array especificado de float em ordem ascende numrica. Sintaxe: static void sort(int[] a); Ordena o array especificado de int em ordem ascende numrica. Sintaxe: static void sort(int[] a, int fromIndex, int toIndex); Ordena a faixa do array especificado de int em ordem ascende numrica. Sintaxe: static void sort(long[] a); Ordena o array especificado de long em ordem ascende numrica. Sintaxe: static void sort(long[] a, int fromIndex, int toIndex); Ordena a faixa do array especificado de long em ordem ascende numrica. Sintaxe: static void sort(Object[] a); Ordena o array especificado de Object em ordem ascende numrica, de acordo com a ordem natutal dos elementos. Sintaxe: static void sort(Object[] a, int fromIndex, int toIndex); Ordena a faixa do array especificado de Object em ordem ascende numrica. Sintaxe: static void sort(short[] a); Ordena o array especificado de short em ordem ascende numrica. Sintaxe: static void sort(short[] a, int fromIndex, int toIndex); Ordena a faixa do array especificado de short em ordem ascende numrica. Sintaxe: static String toString(boolean[] a) Retorna uma string o contedo do array de boolean especificado. Sintaxe: static String toString(byte[] a); Retorna uma string o contedo do array de byte especificado. Sintaxe: static String toString(char[] a); Retorna uma string o contedo do array de char especificado. Sintaxe: static String toString(double[] a); Retorna uma string o contedo do array de double especificado. Sintaxe: static String toString(float[] a); Retorna uma string o contedo do array de float especificado. Sintaxe: static String toString(int[] a); Retorna uma string o contedo do array de int [] especificado. Sintaxe: static String toString(long[] a); Retorna uma string o contedo do array de long [] especificado.
92
Sintaxe: static String toString(Object[] a); Retorna uma string o contedo do array de Object [] especificado. Sintaxe: static String toString(short[] a); Retorna uma string o contedo do array de short [] especificado. Programa Exemplo (6): Exemplo de programa que usa a classe Arrays para ordenar (sort) um vetor.
// --------------------------------------------- Fonte: Prog6.java package Prog6; import java.util.Arrays; import javax.swing.JOptionPane; public class Prog6 { public static void main(String[] args) { final int MAX = 5; int [] vetor = new int[MAX]; int u = -1, n = 0, x; String s; do { u++; // ultimo elemento n++; // numero de elementos s = JOptionPane.showInputDialog("Valor: "); x = Integer.parseInt(s); if (x != 0) { vetor[u] = x; } else { u--; } } while (x != 0 && n < MAX); Arrays.sort(vetor); String extenso = Arrays.toString(vetor); /* for (int i = 0;i < vetor.length;i++) { if (vetor[i] != 0) { extenso += vetor[i] + " "; } } JOptionPane.showMessageDialog(null, "Array: " + extenso, "Array", JOptionPane.PLAIN_MESSAGE); } }
*/
Programa Exemplo (7): Programa mostra um exemplo de dois arrays que armazenam respectivamente: nomes e idades.
// ------------------------------------------- Fonte: Prog7.java package Prog7; import java.util.ArrayList; public class Prog7 {
93
public static void main(String[] args) { ArrayList <String> nome = new ArrayList <String> (); nome.add("Paulo Roberto"); nome.add("Renato Luis"); nome.add("Francisco Carlos"); nome.add("Ana Maria"); nome.add("Julia Helena"); ArrayList idade = new ArrayList (); idade.add(48); idade.add(46); idade.add(50); idade.add(53); idade.add(52); int n = nome.size(); for (int i = 0;i < n;i++) { System.out.printf("Nome: %-20s Idade: %d\n", nome.get(i), idade.get(i)); System.exit(0); } } }
94
Sintaxe: boolean canRead(); Testa se o aplicativo pode ler o arquivo indicado pelo pathname (caminho) indicado. Sintaxe: boolean canWrite(); Testa se o aplicativo pode modificar para o arquivo indicado pelo pathname (caminho) indicado. Sintaxe: int compareTo(File pathname); Compara dois pathnames lexicograficamente. Sintaxe: int compareTo(Object o); Compara o pathname com outro objeto. Sintaxe: boolean createNewFile(); Cria um novo arquivo vazio com o nome do pathname, se e somente se um arquivo com este nome ainda no existe. Sintaxe: static File createTempFile(String prefix, String suffix); Cria um arquivo vazio no diretrio de arquivos temporrios, usando o prefixo e o sufixo dado para gerar o seu nome. Sintaxe: static File createTempFile(String prefix, String suffix, File directory); Cria um novo arquivo vazio no diretrio especificado, usando o prefixo e o sufixo dado pela String para gerar o seu nome. Sintaxe: boolean delete(); Deleta o arquivo ou diretrio informado no pathname. Sintaxe: void deleteOnExit(); Solicita que o arquivo ou diretrio indicado por este pathname ser excludo quando a mquina virtual termina. Sintaxe: boolean equals(Object obj); Testa se o pathname igual ao objeto indicado. Sintaxe: boolean exists(); Testa se o arquivo ou diretrio indicado para este pathname existe. Sintaxe: File getAbsoluteFile(); Retorna a forma absoluta do pathname. Sintaxe: String getAbsolutePath(); Retorna uma String absoluta do pathname. Sintaxe: File getCanonicalFile(); Retorna a forma cannica do pathname. Sintaxe: String getCanonicalPath(); 95
Retorna uma String cannica do pathname. Sintaxe: String getName(); Retorna o nome do arquivo ou diretrio indicado pelo pathname. Sintaxe: String getParent(); Retorna uma String do caminho pai, esse caminho abstrato, ou nulo se este caminho no nome de um diretrio pai. Sintaxe: File getParentFile(); Retorna o caminho abstrato pai deste caminho, ou nulo se este caminho no nome de um diretrio pai. Sintaxe: String getPath(); Converte este pathname em uma String do pathname. Sintaxe: int hashCode(); Calcula o cdigo hash para este pathname. Sintaxe: boolean isAbsolute(); Testa se este pathname absoluto Sintaxe: boolean isDirectory(); Testa se o arquivo indicado diretrio. por este caminho (pathname) um
Sintaxe: boolean isFile(); Testa se o arquivo indicado por este caminho (pathname) um arquivo (file). Sintaxe: boolean isHidden(); Testa se o arquivo indicado por este caminho (pathname) um arquivo escondido. Sintaxe: long lastModified(); Retorna o tempo em que o arquivo modificado pela ltima vez. indicado por este caminho foi
Sintaxe: long length(); Retorna o comprimento do arquivo indicado pelo pathname. Sintaxe: String[] list(); Retorna um vetor de Strings com os nomes dos arquivos e diretrios no diretrio indicado por este caminho. Sintaxe: String[] list(FilenameFilter filter); Retorna um vetor de Strings com os nomes de arquivos e diretrios no diretrio indicado por este caminho que satisfaam o filtro especificado. Sintaxe: File[] listFiles(); Retorna um vetor de pathnames indicando os arquivos no diretrio indicado por este caminho. Sintaxe: File[] listFiles(FileFilter filter); Retorna um vetor de pathnames indicando os arquivos e diretrios no diretrio indicado por este caminho que satisfaam o filtro especificado. Sintaxe: File[] listFiles(FilenameFilter filter);
96
Retorna um vetor de pathnames indicando os arquivos e diretrios no diretrio indicado por este caminho que satisfaam o filtro especificado. Sintaxe: static File[] listRoots(); Lista o sistema de arquivos disponveis principais(root). Sintaxe: boolean mkdir(); Cria o diretrio chamado por este caminho. Sintaxe: boolean mkdirs(); Cria o diretrio chamado por este pathname, incluindo os diretrios pai necessrios, mas inexistentes. Sintaxe: boolean renameTo(File dest); Renomeia o arquivo indicado pelo pathname. Sintaxe: boolean setLastModified(long time); Define o tempo da ltima modificao do arquivo ou diretrio chamado por este caminho. Sintaxe: boolean setReadOnly(); Marca o arquivo ou diretrio chamado por este caminho que s so permitidas operaes de leitura. Sintaxe: String toString(); Retorna uma String pathname deste caminho. Sintaxe: URI toURI(); Constri um arquivo: URI que representa esse caminho. Sintaxe: URL toURL(); Converte este caminho em um arquivo: URL. 14.2 Abertura de um arquivo texto A seguir sero vistos alguns programas exemplos mostrando a manipulao de arquivos em Java. Programa exemplo (44): O programa abre um arquivo texto e exibe o nmero de bytes do referido arquivo.
// ----------------------------------------- Fonte: prog44.java package prog44; import java.io.File; public class Prog44 { public static void main(String[] args) { String nomeArquivo = "/Users/luzzardi/teste.txt"; File arqTexto = new File(nomeArquivo); long bytes; if (arqTexto.exists()) { bytes = arqTexto.length(); System.out.println("Arquivo: " + nomeArquivo); System.out.println("Bytes: " + bytes); } System.exit(0); } }
97
14.3 Listar um diretrio Programa exemplo (45): O programa exibe na tela (lista) os arquivos e diretrios do pathname especificado.
// ------------------------------------------- Fonte: Prog45.java package prog45; import java.io.File; public class Prog45 { public static void main(String[] args) { File diretorio = new File("//Users//luzzardi"); String [] arquivos = diretorio.list(); for (int i = 0;i < arquivos.length; i++) { File filho = new File(diretorio, arquivos[i]); System.out.println(filho.getAbsolutePath()); } System.exit(0); } }
Programa exemplo (46): O programa exibe na tela (lista) os arquivos e diretrios do pathname especificado pelo usurio.
// -------------------------------------------- Fonte: Prog46.java package prog46; import java.io.File; import java.util.Scanner; public class Prog46 { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); System.out.print("Pathname: "); String nomeDiretorio = entrada.nextLine(); File diretorio = new File(nomeDiretorio); String [] arquivos = diretorio.list(); for (int i =0;i<arquivos.length; i++) { File filho = new File(diretorio, arquivos[i]); System.out.println(filho.getAbsolutePath()); } System.exit(0);
} }
14.4 Manipulao de um arquivo de palavras A seguir so mostrados alguns programas exemplos que manipulam um arquivo contendo palavras. Veja o formato no exemplo abaixo: 5 <enter> carambola beringela abacate ervilha damasco Programa exemplo (47): O programa permite criar um arquivo de palavras (palavras.dat) permitindo a gravao destas palavras.
// --------------------------------------------- Fonte: Prog47.java package prog47;
98
import java.io.File; import java.io.FileWriter; import java.util.Scanner; public class Prog47 { public static void main(String[] args) throws Exception { Scanner entrada = new Scanner(System.in); String diretorio = "/Users/luzzardi"; File arquivo = new File(diretorio, "palavras.dat"); if (!arquivo.exists()) { FileWriter file = new FileWriter(arquivo); System.out.print("Nmero de Palavras: "); String s = entrada.nextLine(); int numPalavras = Integer.parseInt(s); file.write((byte)numPalavras); file.write('\n'); for (int i = 1;i <= numPalavras;i++) { System.out.print("Palavra: "); byte a = (byte) System.in.read(); while(a != '\n') { file.write(a); a = (byte) System.in.read(); } file.write('\n'); } file.close(); } else { System.out.println("ERRO: Arquivo j existe"); } System.exit(0); } }
Exemplo de gravao no arquivo palavras.dat: Numero de palavras: 5 <enter> Palavra: carambola <enter> Palavra: beringela <enter> Palavra: abacate <enter> Palavra: ervilha <enter> Palavra: damasco <enter> Arquivo gerado: 5 carambola beringela abacate ervilha damasco Programa exemplo (48): O programa permite abrir o arquivo de palavras (palavras.dat) e exibe-os na tela.
// ------------------------------------------ Fonte: Prog48.java package prog48; import java.io.File; import java.io.FileReader; public class Prog48 { public static void main(String[] args) throws Exception { String diretorio = "/Users/luzzardi"; File arquivo = new File(diretorio, "palavras.dat"); byte a;
99
} }
if (arquivo.exists()) { FileReader file = new FileReader(arquivo); int numPalavras = file.read(); file.read(); for (int i = 1;i <= numPalavras;i++) { System.out.print("Palavra: "); a = (byte) file.read(); while(a != '\n') { System.out.printf("%c", a); a = (byte) file.read(); } System.out.println(); } file.close(); } else { System.out.println("ERRO: Arquivo no existe"); } System.exit(0);
Programa exemplo (49): O programa permite consultar o arquivo de palavras (palavras.dat). Para tanto solicitado, ao usurio, o nmero do registro para ser calculado a posio deste registro no arquivo. Logo aps o registro exibido na tela.
// ----------------------------------------- Fonte: Prog49.java package prog49; import java.io.*; import java.util.*; public class Prog49 { public static void main(String[] args) throws Exception { Scanner entrada = new Scanner(System.in); String s; String diretorio = "/Users/luzzardi"; File arquivo = new File(diretorio, "palavras.dat"); FileInputStream in = new FileInputStream(arquivo); InputStreamReader conversor = new InputStreamReader(in); BufferedReader buffer = new BufferedReader(conversor); FileReader file = new FileReader(arquivo); if (arquivo.exists()) { System.out.println("Arquivo: " + arquivo); int numPalavras = file.read(); // descarta a primeira linha String temp = buffer.readLine(); System.out.println("Total de Palavras: " + numPalavras); String [] linha = new String[numPalavras + 1]; for (int i = 0;i < numPalavras;i++) { linha[i] = buffer.readLine(); } buffer.close(); in.close(); file.close(); int pos; do { System.out.print("Posio [1.." + numPalavras + "] ou [0] Sair: "); s = entrada.nextLine(); pos = Integer.parseInt(s); if (pos >= 1 && pos <= numPalavras) { System.out.println("Palavra: " + linha[pos - 1]); } else { if (pos != 0) { System.out.println("ERRO: Posio Invlida"); } }
100
14.5 Arquivo Texto A seguir contendo: mostrado um programa que l um arquivo texto
101
Resultado do Programa: Total de palavras: 15 Palavra: abacaxi Palavra: abacate Palavra: banana Palavra: pitanga Palavra: goiaba Palavra: morango Palavra: carambola Palavra: kiwi Palavra: laranja Palavra: bergamota Palavra: tomate Palavra: uva Palavra: caqui Palavra: lima Palavra: jaca Palavra Sorteada: carambola
A seguir mostrado um outro programa que l um arquivo texto exibindo: a) Nmero de Linhas b) Nmero de Bytes
// --------------------------------------------------- Fonte: Bytes.java package bytes; import java.io.*; import java.util.Scanner; public class Bytes { public static void main(String[] args) { int linhas = 0; long bytes = 0; String buffer; Scanner input = new Scanner(System.in); String nomeArquivo; System.out.print("Nome do Arquivo: "); nomeArquivo = input.nextLine(); try { FileReader arqTexto = new FileReader(nomeArquivo); BufferedReader leitor = new BufferedReader(arqTexto); int i = 0; while ((buffer = leitor.readLine()) != null) { bytes = bytes + buffer.length(); linhas++; i++; } System.out.println(linhas + " Linha(s)"); System.out.println(bytes + " Byte(s)"); } catch(IOException e){ System.out.println("Erro: Problema com o Arquivo"); }
} }
A seguir mostrado um outro programa que l um arquivo texto exibindo: a) Todas as linhas do arquivo texto com seu respectivo nmero
102
} }
Resultado do Programa: Nome do Arquivo: /Users/luzzardi/Frutas.txt 1: 15 2: abacaxi 3: abacate 4: banana 5: pitanga 6: goiaba 7: morango 8: carambola 9: kiwi 10: laranja 11: bergamota 12: tomate 13: uva 14: caqui 15: lima 16: jaca 16 Linha(s) 93 Byte(s)
A seguir mostrado um outro programa que l um arquivo texto e o nmero de uma linha e exibe: (a) A linha especificada
// ------------------------------------------------------------ Fonte: Linha.java package linha; import java.io.*; import java.util.Scanner; public class Linha {
103
public static void main(String[] args) { int linha = 0, numLinha; String s, buffer; Scanner input = new Scanner(System.in); String nomeArquivo; boolean listou = false; System.out.print("Nome do Arquivo: "); nomeArquivo = input.nextLine(); try { FileReader arqTexto = new FileReader(nomeArquivo); BufferedReader leitor = new BufferedReader(arqTexto); System.out.print("Nmero da Linha: "); s = input.nextLine(); numLinha = Integer.parseInt(s); int i = 0; while ((buffer = leitor.readLine()) != null) { linha++; if (linha == numLinha) { System.out.printf("%2d: %s\n", linha, buffer); listou = true; } i++; } } catch(IOException e){ System.out.println("Erro: Problema com o Arquivo"); } if (!listou) { System.out.println("ERRO: Linha no Encontrada"); } System.exit(0); } }
Resultado do Programa:
Nome do Arquivo: /Users/luzzardi/Frutas.txt Nmero da Linha: 5 5: pitanga
14.6 Lista de exerccios (arquivos) 14.6.1 Escreva um programa em Java que recebe via teclado o nome de um arquivo texto. O programa deve imprimir na tela o nmero de bytes (caracteres) e o nmero de linhas do arquivo ou ERRO: Arquivo no existe. Exemplo: Nome do arquivo texto: LISTA.JAVA <enter> (12345) Bytes (44) Linhas ou ERRO: Arquivo no existe 14.6.2 Escreva um programa em Java que recebe via teclado o nome de um arquivo texto. O programa deve permitir ao usurio consultar o arquivo atravs da entrada via teclado do nmero da linha. O programa deve imprimir a linha especificada ou ERRO: Linha no existe. Exemplo: Nome do arquivo texto: LISTA.JAVA <enter> Nmero de linha: 7 <enter> 7: int i, j, k; Nmero de linha: 70 <enter>
104
ERRO: Linha no existe Nmero de linha: 0 <enter> ou ERRO: Arquivo no existe 14.6.3 Escreva um programa em Java que recebe via teclado o nome de dois arquivos texto (origem e destino). O programa deve copiar o contedo do arquivo origem para o arquivo destino. Exemplo: Arquivo origem: LISTA.JAVA <enter> Arquivo destino: LISTA.tmp <enter> (20345) Bytes copiados 14.6.4 Escreva um programa em Java que recebe via teclado o nome do arquivo texto fonte e o nome do arquivo texto destino. O programa deve converter o arquivo para maisculo ou minsculo (conforme escolha do usurio) gerando o arquivo texto destino. Exemplo: Arquivo fonte: LISTA.JAVA <enter> Arquivo destino: LISTA.TMP <enter> [+] Maisculo ou [-] Minsculo: + <enter> (1234) Bytes convertidos 14.6.5 Escreva um programa em Java que recebe via teclado o nome de um arquivo texto e uma palavra. O programa deve imprimir todas as linhas que possuem esta palavra. Exemplo: Nome do arquivo texto: PALAVRA.JAVA <enter> Palavra: if <enter> 23: if (a == b) { 33: if (ch == '\n') { 37: if (compara(linha,palavra)) { 41: if (ch != '\n') { 59: if (linha[i] == palavra[0]) { 65: if (linha[k] != palavra[j]) { 69: if (achei) { 14.6.6 Escreva um programa em Java que recebe via teclado o nome de um arquivo texto. O programa deve permitir ao usurio consultar o arquivo atravs da entrada via teclado do nmero inicial e nmero final. O programa deve imprimir desde a linha inicial at a linha final ou ERRO: Linhas no existem. Exemplo: Nome do arquivo Nmero inicial: Nmero final: 9 7: int i, j, k; 8: char tecla; 9: long bytes = ou texto: LISTA.JAVA <enter> 7 <enter> <enter> 0;
105
Nmero inicial: 70 <enter> Nmero final: 90 <enter> ERRO: Linhas no existem 14.6.7 Escreva um programa em Java (grava.java) que recebe via teclado o nome de um arquivo binrio. O programa deve permitir ao usurio inserir nomes (mximo 30 caracteres) neste arquivo via teclado. O programa termina quando o usurio digitar <enter> na entrada do nome. Exemplo: Nome do arquivo binrio: NOMES.DAT <enter> Nome: Beatriz <enter> Nome: Eva <enter> Nome: Debora <enter> Nome: Carla <enter> Nome: Fatima <enter> Nome: Ana <enter> Nome: <enter> 14.6.8 Escreva um programa em Java (ler.java) que recebe via teclado o nome de um arquivo binrio. O programa deve ler e imprimir na tela todos os nomes armazenados no arquivo pelo programa "grava.java". Exemplo: Nome do arquivo binrio: NOMES.DAT <enter> Nome: Beatriz Nome: Eva Nome: Debora Nome: Carla Nome: Fatima Nome: Ana 14.6.9 Escreva um programa em Java (sort.java) que recebe via teclado o nome de um arquivo binrio. O programa deve ler, ordenar e gravar novamente os nomes no mesmo arquivo. Exemplo: Nome do arquivo binrio: NOMES.DAT <enter> Ok, arquivo ordenado Observao: Utilize o programa anterior (ler.java) para ver os nomes ordenados. 14.6.10 Escreva um programa em Java (salva.java) que recebe via teclado o nome de um arquivo binrio. O programa deve permitir ao usurio inserir nome (mximo 30 caracteres), idade e sexo ([M]asculino ou [F]eminino) neste arquivo via teclado. O programa termina quando o usurio digitar <enter> na entrada do nome. Exemplo: Nome do arquivo binrio: DADOS.DAT <enter> Nome: Paulo Roberto <enter> Idade: 41 <enter> Sexo [M/F]: m <enter> Nome: Renato Luis <enter> Idade: 38 <enter>
106
Sexo [M/F]: m <enter> Nome: Ana Maria <enter> Idade: 44 <enter> Sexo [M/F]: f <enter> Nome: <enter> 14.6.11 Escreva um programa em Java (list.java) que recebe via teclado o nome de um arquivo binrio. O programa deve ler e imprimir na tela todos os dados (nome, idade e sexo) armazenados no arquivo pelo programa "salva.java" (veja exemplo abaixo). Exemplo: Nome do arquivo binrio: DADOS.DAT <enter> Nome: Paulo Roberto Idade: 41 Sexo: MASCULINO Nome: Renato Luis Idade: 38 Sexo: MASCULINO Nome: Ana Maria Idade: 44 Sexo: FEMININO 14.6.12 Escreva um programa em Java (conta.java) que recebe via teclado o nome de um arquivo binrio. O programa deve verificar a quantidade de homens e a quantidade de mulheres no aquivo criado pelo programa "salva.java". Exemplo: Nome do arquivo binrio: DADOS.DAT <enter> (2) Homens (1) Mulheres
107
108
16.1 Implementao de um lista em vetor A seguir visto um programa em Java que simula uma lista linear armazenada em um vetor. Note que o nmero de elementos da lista armazenado no primeiro nodo do vetor, ou seja, v[0]. Programa exemplo (50): O programa permite inserir nmeros inteiros em uma Lista Linear implementada em um vetor. Quando o nmero digitado for igual zero (0), todos os nmeros da lista so listados.
// ----------------------------------------------- Fonte: Prog50.java package prog50; import javax.swing.*;
109
public class Prog51 { final static int SUCESSO = 0; final static int LISTA_CHEIA = 1; final static int LISTA_VAZIA = 2; public static void main(String[] args) { final int m = 7; int [] v = new int [m]; String s; int valor; char ch; int erro = 0; criaLista(v); do { s = JOptionPane.showInputDialog("Elemento: "); valor = Integer.parseInt(s); if (valor != 0) erro = incluiFim(m, v, valor); if (erro == LISTA_CHEIA) { JOptionPane.showMessageDialog(null, "Erro: Lista Cheia", "Ateno", JOptionPane.PLAIN_MESSAGE); exibeLista(v); return; } } while (valor != 0); exibeLista(v); } // -------------------------------------------------- criaLista static void criaLista(int [] v) { v[0] = 0; // armazena o nmero de elementos da lista } // -------------------------------------------------- incluiFim static int incluiFim(int m, int [] v, int valor) { String s; int n = v[0]; if (n < m-1) { v[0]++; v[v[0]] = valor; return(SUCESSO); } else return(LISTA_CHEIA); } // -------------------------------------------------- exibeLista static void exibeLista(int [] v) { String s = ""; int n = v[0]; if (n == 0) JOptionPane.showMessageDialog(null, "Erro: Lista Vazia", "Ateno", JOptionPane.PLAIN_MESSAGE); else { for (int i = 1; i <= n; i++) s = s + v[i] + " "; JOptionPane.showMessageDialog(null, "Lista: " + s, "Lista", JOptionPane.PLAIN_MESSAGE); } } }
Programa exemplo (51): O programa permite inserir ([I]ncio, [P]osio ou [F]im) nmeros inteiros em uma Lista Linear implementada em um
110
vetor. Quando o nmero digitado for igual zero (0), todos os nmeros da lista so exibidos na tela.
// --------------------------------------------------------- Fonte: Prog51.java package prog51; import javax.swing.*; public class Prog51 { final static int SUCESSO = 0; final static int LISTA_CHEIA = 1; final static int LISTA_VAZIA = 2; public static void main(String[] args) { final int m = 7; int [] v = new int [m]; String s; int valor, pos, n; char ch, op; int erro = 0; criaLista(v); do { s = JOptionPane.showInputDialog("Elemento: "); valor = Integer.parseInt(s); if (valor != 0) { s = JOptionPane.showInputDialog( "[I]inicio, [P]osio ou [F]im: "); op = s.charAt(0); switch (op) { case 'I': case 'i': erro = incluiInic(m, v, valor); break; case 'P': case 'p': n = tamanhoLista(v); do { s = JOptionPane.showInputDialog( "Posio [1.." + n + "]: "); pos = Integer.parseInt(s); } while (pos < 1 && pos > n); erro = incluiPos(m, v, valor, pos); break; case 'F': case 'f': erro = incluiFim(m, v, valor); break; } if (erro == LISTA_CHEIA) { JOptionPane.showMessageDialog(null, "Erro: Lista Cheia", "Ateno", JOptionPane.PLAIN_MESSAGE); exibeLista(v); return; } } } while (valor != 0); exibeLista(v); } // -------------------------------------------------- criaLista static void criaLista(int [] v) { v[0] = 0; // armazena o nmero de elementos } // -------------------------------------------------- incluiFim static int incluiFim(int m, int [] v, int valor) { String s; int n = v[0]; if (n < m - 1) {
111
} else }
// -------------------------------------------------- incluiInic static int incluiInic(int m, int [] v, int valor) { String s; int n = v[0]; if (n < m - 1) { v[0]++; for (int i = n + 1;i >= 2;i--) v[i] = v[i-1]; v[1] = valor; return(SUCESSO); } else return(LISTA_CHEIA);
// -------------------------------------------------- incluiPos static int incluiPos(int m, int [] v, int valor, int pos) { String s; int n = v[0]; if (n < m - 1) { v[0]++; if (pos == v[0] - 1) { v[v[0]] = v[n]; v[n] = valor; } else { for (int i = n + 1;i >= pos;i--) { v[i] = v[i-1]; System.out.println("Valor: " + v[i]); } v[pos] = valor; } return(SUCESSO); } else return(LISTA_CHEIA); } // -------------------------------------------------- tamanhoLista static int tamanhoLista(int [] v) { return(v[0]); } // -------------------------------------------------- exibeLista static void exibeLista(int [] v) { String s = ""; int n = v[0]; if (n == 0) JOptionPane.showMessageDialog(null, "Erro: Lista Vazia", "Ateno", JOptionPane.PLAIN_MESSAGE); else { for (int i = 1; i <= n; i++) s = s + v[i] + " "; JOptionPane.showMessageDialog(null, "Lista: " + s, "Lista", JOptionPane.PLAIN_MESSAGE); }
112
} }
16.2 Implementao de uma Pilha A seguir mostrado uma implementao de Pilha usando a classe Pilha. Programa exemplo (52): O programa permite inserir nmeros inteiros em uma Pilha usando uma classe Pilha implementada pelo programador. Quando o nmero digitado for igual zero (0), todos os nmeros da pilha so listados.
// -------------------------------------------------------- Fonte: Prog52.java package prog52; import java.util.Scanner; public class Prog52 { public static void main(String[] args) { Pilha pilha = new Pilha(5); Scanner entrada = new Scanner(System.in); String s; int nodo; do { System.out.print("Elemento: "); s = entrada.nextLine(); nodo = Integer.parseInt(s); if (nodo != 0) pilha.push(nodo); } while (nodo != 0); pilha.exibe(); } } // ---------------------------------------------------------- Fonte: Pilha.java package prog52; public class Pilha { private int topo; private int [] dados; // ----------------------------------------------- construtor public Pilha(int numElementos) { dados = new int[numElementos]; topo = -1; } // construtor
// ------------------------------------------------ push public void push(int i) { int n = dados.length; if (topo < n-1) { topo++; dados[topo] = i; } else System.out.println("Erro: Pilha Cheia");
// ------------------------------------------------ pop public int pop() { if (topo != 0) { int valor = dados[topo]; topo--; return(valor);
113
} else } return(0);
// ------------------------------------------------ exibe public void exibe() { System.out.print("Pilha: "); for (int i = 0;i <= topo;i++) { System.out.print(dados[i] + " "); } System.out.println(); } }
Resultado do Programa: Elemento: 50 Elemento: 40 Elemento: 30 Elemento: 20 Elemento: 10 Elemento: 5 Erro: Pilha Cheia Elemento: 0 Pilha: 10 20 30 40 50 16.3 Implementao de uma Fila A seguir visto uma implementao de uma Fila usando a classe Fila escrita pelo programador. Programa exemplo (53): O programa permite inserir nmeros inteiros em uma Fila usando uma classe Fila implementada pelo programador. Quando o nmero digitado for igual zero (0), todos os nmeros da fila so listados.
// ------------------------------------------------- Fonte: Prog53.java package prog53; import java.util.Scanner; public class Prog53 { public static void main(String[] args) { Fila fila = new Fila(5); Scanner entrada = new Scanner(System.in); String s, nodos = ""; int nodo; do { System.out.print("Elemento: "); s = entrada.nextLine(); nodo = Integer.parseInt(s); if (nodo != 0) fila.insereFila(nodo); } while (nodo != 0); nodo = fila.retiraFila(); if (nodo == 0) System.out.println("Fila: Vazia"); else { while (nodo != 0) { nodos = nodos + nodo + " "; nodo = fila.retiraFila(); } System.out.println("Fila: " + nodos); } } }
114
// --------------------------------------------------- Fonte: Pilha.java // Fila.java package prog53; public class Fila { private int inic, fim, n; private int [] dados; // ---------------------------------------- construtor public Fila(int numElementos) { inic = -1; fim = 0; n = 0; dados = new int[numElementos]; } // ------------------------------------------------ insereFila public void insereFila(int i) { int max = dados.length; if (n < max) { dados[fim] = i; fim++; n++; } else System.out.println("Erro: Fila Cheia"); } // ------------------------------------------------ retiraFila public int retiraFila() { if (n != 0) { inic++; n--; return(dados[inic]); } else return(0); } // construtor
Resultado do Programa:
Elemento: 10 Elemento: 20 Elemento: 30 Elemento: 40 Elemento: 50 Elemento: 60 Erro: Fila Cheia Elemento: 0 Fila: 10 20 30 40 50
16.4 Implementao de uma Fila Circular Um problema que ocorre em estruturas de dados do tipo Fila que aps algumas operaes de insero e remoo de elementos, pode existir nodos vagos que no podem ser reaproveitados, pois normalmente uma fila possui trs informaes que a controlam: primeiro, ltimo e nmero de elementos, no permitindo que os nodos excludos sejam ocupados novamente. Uma forma de resolver este problema, a utilizao de uma Fila Circular, onde todo nodo inserido ou removido tem sua posio calculada por uma equao, fazendo com que, desta forma, sempre todos os nodos sejam reocupados com uma informao.
115
Programa exemplo (54): O programa permite inserir nmeros inteiros em uma Fila Circular, ou seja, existe reaproveitamento da fila. Quando o nmero digitado for igual zero (0), todos os nmeros da fila so listados.
// ------------------------------------------------------------ Fonte: prog54.java package prog54; import java.util.Scanner; public class Prog54 { public static void main(String[] args) { FilaCircular fila = new FilaCircular(5); Scanner entrada = new Scanner(System.in); String s; int valor; char ch; do { System.out.printf("[I]ncluir, [E]xcluir ou [F]im? "); do { s = entrada.nextLine(); ch = s.charAt(0); } while (ch != 'I' && ch != 'i' && ch != 'E' && ch != 'e' && ch != 'F' && ch != 'f'); switch (ch) { case 'I': case 'i': System.out.printf("Valor: "); s = entrada.nextLine(); valor = Integer.parseInt(s); fila.insereFilaCircular(valor); break; case 'E': case 'e': valor = fila.excluiFilaCircular(); System.out.println("Elemento Retirado da Fila: " + valor); break; } } while (ch != 'F' && ch != 'f'); fila.exibeFilaCircular(); System.exit(0); } } // --------------------------------------------------- Fonte: FilaCircular.java package prog54; public class FilaCircular { private int primeiro, ultimo, tamanho; private int [] elem; public FilaCircular(int numElementos) { primeiro = 0; ultimo = -1; tamanho = 0; elem = new int[numElementos]; } // ------------------------------------ insereFilaCircular public void insereFilaCircular(int dado) { int n = elem.length; if (tamanho == n) { System.out.println("ERRO: Fila Cheia"); } else { tamanho++; ultimo = (ultimo + 1) % n; elem[ultimo] = dado; } }
116
// ----------------------------------- excluiFilaCircular public int excluiFilaCircular() { int n = elem.length; if (tamanho == 0) { System.out.println("ERRO: Fila Vazia"); return(-1); } else { tamanho--; int temp = primeiro; primeiro = (primeiro + 1) % n; return(elem[temp]); } } // -------------------------------- exibeFilaCircular public void exibeFilaCircular() { int n = elem.length; if (tamanho == 0) { System.out.println("Fila Circular: Fila Vazia"); } else { int temp = primeiro; System.out.print("Fila Circular: "); for (int i = 1;i <= tamanho;i++) { System.out.print(elem[temp] + " "); temp = (temp + 1) % n; } System.out.printf("\n"); } } }
Resultado do Programa:
[I]ncluir, [E]xcluir Valor: 10 [I]ncluir, [E]xcluir Valor: 20 [I]ncluir, [E]xcluir Valor: 30 [I]ncluir, [E]xcluir Valor: 40 ERRO: Fila Cheia [I]ncluir, [E]xcluir Elemento Retirado da [I]ncluir, [E]xcluir Elemento Retirado da [I]ncluir, [E]xcluir Valor: 50 [I]ncluir, [E]xcluir Valor: 60 [I]ncluir, [E]xcluir Valor: 70 ERRO: Fila Cheia [I]ncluir, [E]xcluir ou [F]im? i ou [F]im? i ou [F]im? i ou [F]im? i ou [F]im? e Fila: 10 ou [F]im? e Fila: 20 ou [F]im? i ou [F]im? i ou [F]im? i ou [F]im?
117
Em Java, o programa tem condies de assumir o controle execuo em caso que ocorra uma situao de erro no prevista.
Isso feito atravs do mecanismo de tratamento de excees que ao detectar uma situao de erro, a mquina virtual Java gera uma exceo. Se o programa que estiver sendo executado possuir um tratamento de excees, ele assume o controle da execuo. Mas se a exceo no tiver um tratamento associado, o programa interrompido e a mquina virtual Java gera uma mensagem de erro. Uma exceo um evento que indica uma interrompe a execuo normal de um programa. condio anormal que
O tratamento de erros no Java cria objetos da classe erro, o tratamento destes erros feita pela manipulao destes objetos. O tratamento de erros em Java basea-se em: try {} catch {} finally {}. A execuo de um bloco de cdigo, protegido por um tratamento de erros, feito colocando o bloco no try, e para cada erro que se deseja tratar, deve-se colocar uma clusula catch (tipo_de_erro varivel_erro) {} e/ou uma clusula finally (opcional) que executada aps a execuo do bloco try se no houver erro. Sintaxe: try { // cdigo fonte normal return; } catch (Exception error) { // cdigo que trata um tipo de erro ou mostra o erro } catch (Exception error) { // cdigo que trata outro tipo de erro ou exibe o erro } finally { // opcional // cdigo executado, mesmo tendo excesso }
118
17.1 Tratamento de excees Excees so instncias de classes geradas quando houver erro. Estas excees podem ser captadas e tratadas para que no ocorra erros em tempo de execuo. Os mtodos utilizados por classes de excees so: getMessage(): Retorna uma string com o erro. printStackTrace(): Imprime na tela um histrico do erro e as linhas aonde os erros ocorreram. toString(): Converte a exceo numa String. getCause(): Retorna a causa da exceo ou null se a causa for desconhecida ou no existir.
17.2 Tratamento de erros: Entrada de nmero inteiro via teclado O programa exemplo abaixo verifica e trata a exceo: formato invlido do nmero (NumberFormatException).
// ------------------------------------------------------- Fonte: inteiro.java package inteiro; import java.util.Scanner; public class Inteiro { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; int inteiro = -999; try { System.out.print("Inteiro: "); // cdigo protegido contra erro s = entrada.nextLine(); inteiro = Integer.parseInt(s); return; } catch (NumberFormatException error) { // error.printStackTrace(); // mostra as linhas do erro System.out.println("ERRO: " + error.getMessage()); // exibe o erro } finally { // OPCIONAL System.out.println("INTEIRO: " + inteiro); // executa depois do catch } System.exit(0); } }
17.3 Tratamento de erros: Diviso por zero O programa exemplo abaixo verifica e trata os seguintes erros: (a) diviso por zero; (b) usurio apenas digitou <enter> sem nenhum nmero e (c) digitou letras (NumberFormatException e ArithmeticException).
119
// ------------------------------------------------------ Fonte: Divisao.java package divisao; import java.util.Scanner; public class divisao { public static void main (String args[]) { Scanner entrada = new Scanner(System.in); String s; float x, y, div; try { System.out.print("Dividendo: "); s = entrada.nextLine(); x = Float.parseFloat(s); System.out.print("Divisor: "); s = entrada.nextLine(); y = Float.parseFloat(s); div = x / y; System.out.println ("Divisao: " + div); } catch (NumberFormatException error) { System.out.println("Status: " + error.getMessage()); } catch (ArithmeticException error) { } System.exit(0); } }
Resultado do Programa (sem erro): [usurio digitou 3 + 2] Dividendo: 3 Divisor: 2 Divisao: 1.5 Resultado do Programa (sem erro): [usurio digitou 3 + 0]
Dividendo: 3 Divisor: 0 Divisao: Infinity
17.4 Tratamento de exceo com Exception Em java pode-se usar o try ... catch da seguinte forma:
// --------------------------------------------------------- Fonte: Teste.java package teste; import java.util.Scanner; public class Main { public static void main(String[] args) { testException(); System.exit(0); } public static void testException() { Scanner entrada = new Scanner(System.in); String s; int x, y; float div; try { System.out.print("Dividendo: "); s = entrada.nextLine(); x = Integer.parseInt(s); System.out.print("Divisor: ");
120
} }
s = entrada.nextLine(); y = Integer.parseInt(s); div = (float) x / y; System.out.println("Divisao: " + div); } catch (Exception error) { error.printStackTrace(); System.out.println("Status: Divisao por zero"); }
17.5 Tratamento de exceo com MyException Em java pode-se criar uma exceo da seguinte forma:
// ----------------------------------------------------------- Fonte: MyException.java package myexception; class MyException extends Exception { public MyException(String msg) { super(msg); } } // --------------------------------------------------------- Fonte: Myexception.java package myexception; import java.util.Scanner; public class Main { public static void main(String[] args) throws Exception{ Scanner entrada = new Scanner(System.in); String s; int x, y; float div; System.out.print("Dividendo: "); s = entrada.nextLine(); x = Integer.parseInt(s); System.out.print("Divisor: "); s = entrada.nextLine(); y = Integer.parseInt(s); div = (float) x / y; if (y == 0) { throw new MyException("Erro: Divisao por zero"); } System.out.println("Divisao: " + div); System.exit(0); } }
17.6 Exceo em ArrayList O programa abaixo mostra duas excees: NumberFormatExcpetion e IllegalArgumentException usando-se um ArrayList.
// ------------------------------------------------------ Fonte: arraylist.java package arraylist;
121
import java.util.ArrayList; import javax.swing.JOptionPane; public class arraylist { public static void main(String[] args) { ArrayList lista; int quantidade; String s, nome; try { s = JOptionPane.showInputDialog("Quantidade: "); quantidade = Integer.parseInt(s); lista = new ArrayList(quantidade); for (int i = 0;i < quantidade;i++) { s = JOptionPane.showInputDialog("Nome: "); lista.add(s); nome = (String) lista.get(i); System.out.println("Nome: " + nome); } } catch (NumberFormatException error) { // para testar digite (abc) System.out.println("ERRO: Conversao Ilegal"); System.out.println(error.getMessage()); } catch (IllegalArgumentException error) { // para testar digite (-1) System.out.println("ERRO: ArrayList ilegal"); System.out.println(error.getMessage()); } System.exit(0); } }
17.7 Excees criadas pelo programador O programas a seguir, possui duas excees criadas programador: ListaCheiaExcepetion e IndiceInvalidoException.
// ------------------------------------------------------------ Fonte: Aluno.java package listaobjeto; public class Aluno { private int codigo; private String nome; // ------------------------------------- Construtor public Aluno(int cod, String s) { codigo = cod; nome = s; } // ------------------------------------- getNome public String getNome() { return(this.nome); } // ------------------------------------- getCodigo
pelo
122
// -------------------------------------------------------- Fonte: ListObjet.java package listaobjeto; public class ListObjet { private Object [] v; private int n; // ------------------------------------- Construtor public ListObjet(int n) { v = new Object[n]; n = 0; } // ------------------------------------- getTamanho public int getTamanho() { return(n); } // ------------------------------------- incluiFim public void incluiFim(Object nodo) { if (n == v.length) { throw new ListaCheiaException(); } else { v[n] = nodo; n++; } } // ------------------------------------- consulta public Object consulta(int indice) { if (indice < 0 || indice >= n) { throw new IndiceInvalidoException("Indice: " + indice + "invalido"); } else { return(v[indice]); } } // ------------------------------------- ListaCheiaException public class ListaCheiaException extends RuntimeException { public ListaCheiaException () { super("Lista Cheia"); } public ListaCheiaException (String s) { super(s); } } // ------------------------------------- IndiceInvalidoException public class IndiceInvalidoException extends RuntimeException { public IndiceInvalidoException () { super("Indice Invalido"); } public IndiceInvalidoException (String s) { super(s); } } } // ------------------------------------------------------ Fonte: ListaObjeto.java package listaobjeto;
123
public class ListaObjeto { public static void main(String[] args) { ListObjet lista = new ListObjet(3); lista.incluiFim(new Aluno(10, "Ana")); lista.incluiFim(new Aluno(20, "Beatriz")); lista.incluiFim(new Aluno(30, "Carla")); // lista.incluiFim(new Aluno(40, "Debora")); // tente rodar com esta linha int tam = lista.getTamanho(); for (int i = 0;i < tam;i++) { // tenta rodar com (i <= tam) Aluno aluno = (Aluno) lista.consulta(i); System.out.println(aluno.getNome() + "(" + aluno.getCodigo() + ")"); } System.exit(0);
} }
Ana(10) Beatriz(20) Carla(30) Exception in thread "main" listaobjeto.ListObjet$IndiceInvalidoException: Indice: 3invalido at listaobjeto.ListObjet.consulta(ListObjet.java:38) at listaobjeto.ListaObjeto.main(ListaObjeto.java:16) Java Result: 1
124
private (privado) Um membro privado no acessvel fora da classe, somente pelos membros da classe. A inteno permitir que apenas quem escreve a classe possa usar esse membro.
protected (protegido) O membro protegido acessvel classe e a suas sub-classes (classes derivadas). A inteno dar acesso aos programadores que estendero sua classe.
18.2 Controle de acesso na definio de uma classe derivada Quando uma classe derivada definida, ou seja, na definio de herana simples, seus membros (atributos e mtodos) so declarados internamente e o acesso a estes pode ser pblico (public), privativo (private) ou protegido (protected). O acesso a membros protegidos igual ao acesso a membros privativos, exceto para o acesso das classes derivadas da classe. A forma geral de especificar herana simples :
125
Quando uma classe herda as caractersticas de outra classe, todos os membros da classe base tornam-se membros da classe derivada. O tipo de acesso da classe base dentro da classe derivada determinado pelo especificador de acesso. Qualquer que seja o especificador de acesso, membros privativos da classe base continuam sendo propriedade privada da classe base, e no podem ser acessados por classes derivadas. Quando o especificador de acesso public, todos os membros pblicos da classe base tornam-se membros pblicos da classe derivada, e os membros protegidos da classe base tornam-se membros protegidos da classe derivada. Esta a diferena que existe entre membros privativos e membros protegidos. Quando o especificador de acesso private, todos os membros pblicos e protegidos da classe base tornam-se membros privativos da classe derivada, ou seja, a classe derivada no pode transferir seus privilgios de acesso a outras classes. Quando o especificador de acesso protected, todos os membros pblicos e protegidos da classe base tornam-se membros protegidos da classe derivada. Programa exemplo (55): O objetivo do programa a seguir demonstrar a utilizao de herana simples (atributos da classe base so privados).
// ------------------------------------------------------- Fonte: Heranca.java package heranca; public class Heranca { public static void main(String[] args) { Derivada objeto = new Derivada(3); int resp; objeto.Seta(1, 2); resp = objeto.Soma(); System.out.println("Somador (x + y + z): " + objeto.Somador(resp)); System.exit(0); } } // -------------------------------------------------------- Fonte: base.java package heranca; public class Base { private int x, y; // atributos privados
public void Seta(int a, int b) { x = a; y = b; System.out.println("x = " + x); System.out.println("y = " + y); } public int Soma() { System.out.println("Soma (x + y): " + (x + y)); return(x + y); }
126
} // ---------------------------------------------------------- Fonte: Derivada.java package heranca; public class Derivada extends Base { private int z; public Derivada(int x) { z = x; System.out.println("z = " + z); } public int Somador(int soma) { // no possvel acessar x e y pois so privados da classe base return(soma + z); } }
Resultado do Programa:
z = 3 x = 1 y = 2 Soma (x + y): 3 Somador (x + y + z): 6
Responda: Porque o atributo z mostrado primeiro? 18.3 Tipos de acessos (especificadores de acesso) public (pblico): Todos os atributos da classe base so pblicos na classe derivada. private (privado): Os atributos s podem ser acessados pelos mtodos que fazem parte da classe. protected (protegido): Os atributos podem ser acessados pelos mtodos de classes derivadas. O objetivo do programa demonstrar a simples (atributos da classe base so
// ---------------------------------------------------------- Fonte: Heranca.java package heranca; public class Heranca { public static void main(String[] args) { Derivada objeto = new Derivada(3); int resp; objeto.Seta(1, 2); resp = objeto.Soma(); System.out.println("Somador (x + y + z): " + objeto.Somador(resp)); System.exit(0); } } // ----------------------------------------------------------- Fonte: base.java package heranca; public class Base { protected int x, y; // atributos protegidos
127
System.out.println("y = " + y); } public int Soma() { System.out.println("Soma (x + y): " + (x + y)); return(x + y); } } // ------------------------------------------------------------ Fonte: Derivada.java package heranca; public class Derivada extends Base { private int z; public Derivada(int x) { z = x; System.out.println("z = " + z); } public int Somador(int soma) { return(x + y + z); // possvel acessar x e y pois so protegidos na classe base }
Resultado do Programa:
z = 3 x = 1 y = 2 Soma (x + y): 3 Somador (x + y + z): 6
18.4 Lista de exerccios sobre Herana 18.4.1 Herana (primeiro) Dado os seguintes cdigos em Java:
// ------------------------------------------------------------------ TestaHeranca.java package testaheranca; public class TestaHeranca { public static void main(String[] args) { Cliente cliente = new Cliente("Paulo Roberto", "123.456-78", 1234.56); cliente.imprimePessoa(); cliente.imprimeCliente(); } }
// ----------------------------------------------------------------------- Pessoa.java package testaheranca; public class Pessoa { protected String nome; protected String cpf; Pessoa() { this.nome = "xxxx"; this.cpf = "xxx.xxx.xxx-xx"; } Pessoa(String nome, String cpf) { this.nome = nome; this.cpf = cpf; }
128
public void imprimePessoa() { System.out.println("Nome: " + nome); System.out.println("CPF: " + cpf); } } // ----------------------------------------------------------------------- Cliente.java package testaheranca; public class Cliente extends Pessoa { private double conta; Cliente(String nome, String cpf, double conta) { this.conta = conta; } public void imprimeCliente() { System.out.println("Conta: " + conta); } }
Que modificaes devem ser feitas no cdigo fonte para que o resultado do programa seja o esperado? 18.4.2 Herana (segundo) Dado a classe base Pessoa e o programa principal TestaHomem, construa as classes derivadas Homem e Mulher que contenha os atributos e mtodos abaixo descritos:
// ------------------------------------------------------------------------ Pessoa.java package testahomem; public class Pessoa { protected double altura; protected char sexo; Pessoa() { this.altura = 0.0; this.sexo = 'g'; } Pessoa(double altura, char sexo) { this.altura = altura; this.sexo = sexo; } public void imprimePessoa() { System.out.println("Altura: " + altura); System.out.println("Sexo: " + sexo); } } Pessoa altura sexo
129
imprimePessoa Homem pesoIdeal calculaPesoIdealHomem imprimePesoIdealHomem Mulher pesoIdeal calculaPesoIdealMulher imprimePesoIdealMulher // -------------------------------------------------------------------- TestaHomem.java package testahomem; public class TestaHomem { public static void main(String[] args) { Homem homem = new Homem(1.64, 'm'); Mulher mulher = new Mulher(1.59, 'f'); homem.calculaPesoIdealHomem(); homem.imprimePessoa(); homem.imprimePesoIdealHomem(); mulher.calculaPesoIdealMulher(); mulher.imprimePessoa(); mulher.imprimePesoIdealMulher(); } }
Resultado do Programa:
Altura: 1.64 Sexo: m Peso Ideal (Homem): 61,23 Altura: 1.59 Sexo: f Peso Ideal (Homem): 54,04
} }
// ------------------------------------------------------------------------ Objeto.java package testaobjetos; public class Objeto { protected int x; protected int y; Objeto() { x = 0;
130
y = 0; } Objeto(int x, int y) { this.x = x; this.y = y; } public void imprimeObjeto() { System.out.println("x = " + x + " - y = " + y); } } // ------------------------------------------------------------------------- Linha.java package testaobjetos; public class Linha extends Objeto { private Objeto p1; private Objeto p2; Linha (int xi, int yi, int xf, int yf) { p1 = new Objeto(xi, yi); p2 = new Objeto(xf, yf); } public void imprimeLinha() { p1.imprimeObjeto(); p2.imprimeObjeto(); } }
Implemente a classe derivada Retangulo para que o programa funcione conforme o resultado do programa abaixo: Resultado do Programa:
Linha: x = 1 - y = x = 3 - y = Retngulo: x = 1 - y = x = 3 - y = x = 3 - y = x = 1 - y = 2 4 2 2 4 4
131
public void Seta(int a, int b) { x = a; y = b; System.out.println("x = " + x); System.out.println("y = " + y); } public int Soma() { System.out.println("Soma (x + y): " + (x + y)); return(x + y); } } // --------------------------------------------------- Fonte: Derivada.java package heranca; public class Derivada extends Base { private int z; public Derivada(int x) { z = x; System.out.println("z = " + z); } public int Somador(int soma) { return(x + y + z); // possvel acessar x e y pois so privados a classe base } }
Resultado do Programa:
z = 3 x = 1 y = 2 Soma (x + y): 3 Somador (x + y + z): 6
132
public void Seta(int a, int b) { x = a; y = b; System.out.println("x = " + x); System.out.println("y = " + y); } public int Soma() { System.out.println("Soma (x + y): " + (x + y)); return(x + y); } } // ---------------------------------------------------- Fonte: Derivada.java package heranca; public class Derivada extends Base { private int z; public Derivada(int x) { z = x; System.out.println("z = " + z); } public int Somador(int soma) { return(x + y + z); // possvel acessar x e y pois so privados a classe base } protected void finalize() { System.out.println("Finalizador: Final do programa"); } } // --------------------------------------------------------- Fonte: Heranca.java package heranca; public class Heranca { public static void main(String[] args) { Derivada objeto = new Derivada(3); int resp; objeto.Seta(1, 2); resp = objeto.Soma(); System.out.println("Somador (x + y + z): " + objeto.Somador(resp)); objeto = null; // marca para coletor de lixo System.gc(); // chamada do coletor de lixo System.exit(0); } }
Resultado do Programa:
z = 3 x = 1 y = 2 Soma (x + y): 3 Somador (x + y + z): 6
133
134
g.drawString("Resposta: " + resp, 340, 300); } else { switch (erro) { case 1: g.drawString("Erro: Divisao por Zero", 340, 300); break; case 2: g.drawString("Erro: Raiz Complexa", 340, 300); break; case 3: g.drawString("Erro: Tangente Infinita", 340, 300); break; } } g.drawLine(0, 310, 1279, 310); } } // ------------------------------------------------- Fonte: Calculadora.java import java.awt.Graphics; import javax.swing.*; public class Calculadora { private double x, y, resp; private char op; private int erro; public Calculadora () { erro = 0; } // construtor
// -------------------------------- retornaErro public int retornaErro() { return(this.erro); } // -------------------------------- entradaDados public void entradaDados() { String s; s = JOptionPane.showInputDialog("Digite um Valor: "); x = Double.parseDouble(s); do { s = JOptionPane.showInputDialog("Operador [+ - * / Rr Pp Ss Cc Tt]: "); op = s.charAt(0); } while (!strChr("+-*/RrPpSsCcTt", op)); if (!strChr("RrSsCcTt", op)) { s = JOptionPane.showInputDialog("Digite outro Valor: "); y = Double.parseDouble(s); }
// ---------------------------- operaCalculadora public double operaCalculadora() { final double pi = 3.14158; double rads; switch (op) { case '+': case '-': case '*': case '/':
resp = soma(x, y); break; resp = subtracao(x, y); break; resp = multiplicacao(x, y); break; if (y == 0) erro = 1; // diviso por zero else resp = divisao(x, y); break; if (x < 0) erro = 2; // raiz negativa else resp = raizQuadrada(x); // Raiz Quadrada
135
break; case 'P': case 'p': case 'S': case 's': case 'C': case 'c': case 'T': case 't': resp = power(x, y); break; resp = seno(x); break; resp = cosseno(x); break; // potncia // seno // cosseno
} return(this.resp);
// ---------------------------- strChr private boolean strChr(String s, char ch) { for (int i = 0; i < s.length(); i++) { if (s.charAt(i) == ch) { return(true); } } return(false); } // ---------------------------- soma private double soma(double x, double y) { return(x + y); } // ---------------------------- subtracao private double subtracao(double x, double y) { return(x - y); } // ---------------------------- multiplicacao private double multiplicacao(double x, double y) { return(x * y); } // ---------------------------- divisao private double divisao(double x, double y) { if (y == 0) { erro = 1; return(-1); } return(x / y); } // ---------------------------- raizQuadrada private double raizQuadrada(double x) { return(Math.sqrt(x)); } // ---------------------------- power private double power(double x, double y) { return(Math.pow(x, y)); } // ---------------------------- seno private double seno(double x) {
136
final double pi = 3.14158; double rads; rads = x * pi / 180.0; return(Math.sin(rads)); } // ---------------------------- cosseno private double cosseno(double x) { final double pi = 3.14158; double rads; rads = x * pi / 180.0; return(Math.cos(rads)); } // ---------------------------- tangente private double tangente(double x) { final double pi = 3.14158; double rads; rads = x * pi / 180.0; return(Math.tan(rads)); } }
137
138
O pacote java.net possui duas classes principais: Socket (cliente) e ServerSocket (servidor) quando uma conexo entre clienteservidor realizada. O cliente solicita que uma conexo seja estabelida com o servidor atravs de um Socket. Quando o servidor aceita o pedido de conexo, ele cria um novo socket por uma porta diferente. No cliente, outro socket criado e ento utilizado para a comunicao com este servidor. A seguir so vistos Client.java (liente). dois fontes: Server.java (Servidor) e
// --------------------------------------------------------- Fonte: Server.java import java.io.*; import java.net.*; class Server { public static void main(String argv[]) throws Exception { int n = 1; String in; // string recebida do cliente String out; // string enviada ao cliente // cria socket de comunicacao com os clientes na porta 6789 ServerSocket welcomeSocket = new ServerSocket(6789); // espera uma mensagem do cliente while (true) { System.out.print("Esperando comunicao: "); // espera conexao do cliente Socket connectionSocket = welcomeSocket.accept(); // cria ligao de entrada e sada com o cliente BufferedReader inFromClient = new BufferedReader( new InputStreamReader(connectionSocket.getInputStream())); DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); // leitura da string do cliente in = inFromClient.readLine(); // transforma a string em maisculas out = in.toUpperCase() + '\n'; // envia a linha maiscula ao cliente outToClient.writeBytes(out); // exibe o cdigo do cliente System.out.println(" Cliente [" + n + "]"); // exibe a mensagem recebida e respondida ao cliente System.out.println("Mensagem Recebida: " + in); System.out.print("Mensagem Respondida: " + out); // nmero do cliente n++; } } } // ------------------------------------------------------ Fonte: Client.java import java.io.*; import java.net.*; class Client { public static void main(String argv[]) throws Exception { String in; // string digitada String out; // string recebida // cria uma ligao com o teclado BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); // cria o socket de acesso ao server hostname ou localhost na porta 6789
139
} }
//Socket clientSocket = new Socket("200.132.45.130", 6789); Socket clientSocket = new Socket("localhost", 6789); // cria ligaes de entrada e saida com o servidor DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); BufferedReader inFromServer = new BufferedReader( new InputStreamReader(clientSocket.getInputStream())); while (true) { // leitura de uma linha do teclado e coloca na String in System.out.print("Mensagem para Enviar [ou fim]: "); in = inFromUser.readLine(); if (in.startsWith("fim") == true) { break; } // envia uma string para o servidor outToServer.writeBytes(in + '\n'); // leitura de uma string do servidor out = inFromServer.readLine(); // exibe a linha do servidor na tela System.out.println("Servidor respondeu: " + out); } // fecha o cliente System.out.println("Conexo Fechada"); clientSocket.close();
140
Sada do Programa:
Mon Apr 26 01:43:16 BRT 2010 26/04/10 01:43 01:43:16 26/04/2010 01:43:16 01:43 01:43:16 1h43min16s BRT 26/04/10 01:43 26/04/2010 01:43 26 de Abril de 2010 1h43min16s BRT
141
142
Sobrecarga de Mtodo: Permite que um mtodo retorne diferentes tipos de informaes e aceita argumentos de vrios tipos, inclusive com nmero diferentes de parmetros;
Herana: o processo pelo qual uma classe de objetos pode adquirir as propriedades de outra classe de objetos, em outras palavras, um objeto herda as caractersticas de outro (herana simples) ou vrios objetos (herana mltipla Java no possui herana mltipla). Encapsulamento (encapsulao): Os objetos possuem internamente atributos e mtodos agrupados no mesmo local, onde os mtodos manipulam os atributos. UML (Unified Modeling Language) A linguagem UML especifica 9 tipos de diagramas para modelagem de sistemas orientados objetos. Cada diagrama UML permite modelar uma distinta caracterstica ou da estrutura ou do comportamento do sistema em especial. Os 4 primeiros, referem-se a estrutura e os outros 5 ao comportamento do sistema. Diagrama de Classes: Exibe o nome da classe, atributos e mtodos que manipulam os atributos. Diagrama de Objetos: Exibe o conjunto de objetos e seus relacionamentos em determinado ponto no tempo (comportamento esttico). Diagrama de Componentes: Exibe as dependncias entre componentes do sistema. So utilizados para: (a) modelar a organizao do cdigo fonte; (b) modelar a chamada de programas externos; (c) modelar o banco de dados; (d) modelar sistemas adaptativos e (e) Engenharia de produo e Engenharia reversa. Diagrama de Instalao: Exibe a configurao dos nodos de processamento em tempo de execuo e os componentes existentes. Diagrama de Atividades: So utilizados para detalhar classes, a implementao de operaes e casos de uso. Diagrama de Mapa de Estados: Exibe o ciclo de vida de um objeto em nveis de detalhe simples ou complexos. Mostra a seqncia de estados que um objeto ou a interao percorrida durante sua vida em resposta a estmulos recebidos e as prprias aes e respostas (comportamento dinmico). Diagrama de Colaboraes: Modela as interaes entre objetos. focado na seqncia cronolgica de uma situao que est sendo modelado, focalizando no relacionamento entre os objetos e na compreenso dos efeitos sobre um objeto durante uma situao. Diagrama de Sequncia: Modela a interao entre objetos em um sistema. Apresenta os objetos e as mensagens (mtodos) que so passadas entre estes objetos dentro do caso de uso. Diagrama de Casos de Uso: Exibe os usurios e a relao entre os usurios e os casos de uso.
143
144
} }
ou
// --------------------------------------------- Fonte: Vetor.java package vetor; public class Vetor { public static void main(String args[]) { final int max = 9; int [] vetor = new int[max]; for (int i = 0; i < max; i++) { vetor[i] = i + 1; } exibeVetor(vetor); } // ---------------------------------------- exibeVetor static void exibeVetor(int [] vetor) { for (int i : vetor) { System.out.println(i = + i); } } }
Operadores Lgicos: Java possui os seguintes operadores lgicos para and e ou: (&&) (||) (&) (|). Os operadores (&&) e (||) so conhecidos como Short Circuit Operator (operadores de curto circuito), ou seja, so operadores mais rpidos que & e |, pois quando no houver mais necessidade de testar as outras condies, o controle do programa passa adiante.
145
// ----------------------------------------------------- Fonte: Objeto.java package objeto; import java.util.Scanner; public class Objeto { public static void main(String[] args) throws Exception { Scanner entrada = new Scanner(System.in); String s; int n; System.out.print("Numero de Objetos: "); s = entrada.nextLine();
146
n = Integer.parseInt(s); Object [] objeto = new Object[n]; // vetor de objetos for (int i = 0;i < n;i++) { System.out.print("Nome: "); s = entrada.nextLine(); objeto[i] = s; } for (int i = n-1;i >= 0;i--) { System.out.println("String: " + objeto[i]); } } } Sada do Programa: Nmero de Objetos: 4 Nome: paulo Nome: roberto Nome: gomes Nome: luzzardi String: luzzardi String: gomes String: roberto String: paulo
A seguir so descritos os mtodos da classe Object. Sintaxe: protected Object clone(); Cria e retorna uma cpia deste objeto. Sintaxe: boolean equals(Object obj); Indica se um objeto igual a outro. Sintaxe: protected void finalize(); Chama o coletor de lixo do objeto quando a coletor de lixo determina que no h mais referncias ao objeto. Sintaxe: Class getClass(); Retorna a classe runtime do objeto. Sintaxe: int hashCode(); Retorna o valor do cdigo hash de um objeto. Sintaxe: void notify(); Aguarda uma thread que est esperando o monitor do objeto. Sintaxe: void notifyAll(); Aguarda todas as threads que esto esperando o monitor do objeto. Sintaxe: String toString(); Retorna uma String do objeto. Sintaxe: void wait(); Faz a corrente thread esperar at que outra thread invoque os mtodos notify() ou notifyAll() deste objeto. Sintaxe: void wait(long timeout); Faz a corrente thread esperar at que outra thread invoque os mtodos notify() ou notifyAll() deste objeto ou um perodo especificado de tempo tiver decorrido. Sintaxe: void wait(long timeout, int nanos); Faz a corrente thread esperar at que outra thread invoque os mtodos notify() ou notifyAll() deste objeto, ou outra thread interrompa a corrente thread, ou um perodo especificado de tempo tiver decorrido.
147
Iterator<E> descendingIterator(); Returna um iterator sobre os elementos neste deque em ordem sequencial reversa. Sintaxe: E element(); Recupera, mas no remove, o cabea da fila representada por este deque. Sintaxe: Sintaxe: Sintaxe: Sintaxe: Sintaxe: Sintaxe: Sintaxe: E getFirst(); Recupera, mas no remove, o primeiro elemento deste deque. E getLast(); Recupera, ams no remove, o ltimo elemento deste deque. boolean isEmpty(); Returna true se este deque no contm elementos. Iterator <E> iterator(); Returna um iterator sobre os elementos deste deque. boolean offer(E e); Insere um elemento especificado no fim deste deque. boolean offerFirst(E e); Insere um elemento especificado na frente deste deque. boolean offerLast(E e); Insere um elemento especificado no fim deste deque.
148
Sintaxe:
E peek(); Recupera, mas no remove, o cabea da fila representada por este deque ou returna null se este deque est vazio. Sintaxe: E peekFirst(); Recupera, mas no remove, o primeiro elemento deste deque, ou retorna null se este deque est vazio. Sintaxe: E peekLast(); Recupera, mas no remove, o ltimo elemento deste deque ou returna null se este deque est vazio. Sintaxe: E poll(); Recupera e remove o cabea desta fila representada por este deque (em outras palavras, o primeiro elemento deste deque) ou returna null se este deque est vazio. Sintaxe: E pollFirst(); Recupera e remove o primeiro elemento deste deque ou returna null se este deque est vazio. Sintaxe: E pollLast(); Recupera e remove o ltimo elemento deste deque ou returna null se este deque est vazio. Sintaxe: Sintaxe: Sintaxe: deque. Sintaxe: deque. Sintaxe: Sintaxe: E removeFirst(); Recupera e remove o primeiro elemento deste deque. boolean remove(Object o); Remove um instncia simples de um elemento especfico deste E pop(); Retira um elemento na pilha representada por este deque. void push(E e); Insere um elemento na pilha representada por este deque. E remove(); Recupera e remove o cabea da fila representada por este
boolean removeFirstOccurrence(Object o); Remove a primeira ocorrncia do elemento especificado deste deque (quando percorre o deque da cabea ao ltimo). Sintaxe: Sintaxe: E removeLast(); Recupera e remove o ltimo elemento deste deque.
boolean removeLastOccurrence(Object o); Remove a ltima ocorrncia do elemento especificado neste deque (quando percorre o deque da cabea ao ltimo). Sintaxe: Sintaxe: int size(); Returna o nmero de elementos deste deque.
Object[] toArray(); Returna um array contendo todos os elementos deste deque em ordem crescente (do primeiro at o ltimo elemento).
149
Sintaxe: <T> T[] toArray(T[] a); Returna um array contendo todos os elementos deste deque em ordem crescente (do primeiro at o ltimo elemento); o tipo do array retornado aquela especificado pelo array. A seguir demonstrado a utilizao de um ArrayDeque.
Pacote: import java.util.ArrayDeque; // -------------------------------------------------- Fonte: Array_Deque.java package array_deque; import java.util.ArrayDeque; import java.util.Scanner; public class Array_Deque { public static void main(String[] args) { ArrayDeque deque = new ArrayDeque(); Scanner entrada = new Scanner(System.in); String s; char tecla = 'f', op = 'f'; int nodo, n = 0; Object temp; do { // 16 elementos
System.out.println("Deque: " + deque); System.out.print("[I]ncluir, [C]onsultar, [E]xcluir ou [F]inalizar: "); do { s = entrada.nextLine(); if (!s.equals("")) { tecla = s.charAt(0); } } while (!strChr("IiCcEeFf", tecla)); if (!strChr("Ff", tecla)) { System.out.print("[E]squerda ou [D]ireita: "); do { s = entrada.nextLine(); if (!s.equals("")) { op = s.charAt(0); } } while (!strChr("EeDd", op)); switch (tecla) { case 'I': case 'i': System.out.print("Nodo: "); s = entrada.nextLine(); nodo = Integer.parseInt(s); if (strChr("Ee", op)) { deque.addFirst(nodo); } else { deque.addLast(nodo); } n++; if (n > 16) { System.out.println("ERRO: Deque Cheio"); System.exit(1); } break; case 'C': case 'c': if (!deque.isEmpty()) { if (strChr("Ee", op)) { temp = deque.peekFirst(); } else { temp = deque.peekLast(); } nodo = temp.hashCode(); System.out.println("Consultado: " + nodo); } else { System.out.println("ERRO: Deque Vazio"); } break;
150
case 'E': case 'e': if (!deque.isEmpty()) { if (strChr("Ee", op)) { temp = deque.pollFirst(); } else { temp = deque.pollLast(); } nodo = temp.hashCode(); System.out.println("Excluiu: " + nodo); n--; } else { System.out.println("ERRO: Deque Vazio"); } break;
// ----------------------------------------------- strChr static boolean strChr(String s, char tecla) { int n = s.length(); for (int i = 0;i < n;i++) { if (s.charAt(i) == tecla) { return(true); } } return(false); } }
151
152
// ------------------------------- closeFile public void closeFile() { try { if (fileOut != null) { fileOut.close(); System.out.println("Ok, Arquivo fechado: " + nomeFile); } } catch (IOException ioException) { System.out.println("ERRO Fatal: Impossvel fechar o arquivo: " + nomeFile); System.exit(1); } } } // ------------------------------------------------------- WriteFile.java package writefile; import java.io.IOException; import java.util.Scanner; public class WriteFile { public static void main(String[] args) throws IOException, ClassNotFoundException { Scanner input = new Scanner(System.in); System.out.print("Nome do Arquivo: "); String nomeArquivo = input.nextLine(); FileObjeto file = new FileObjeto(nomeArquivo); file.addFile("Paulo Roberto", 50, 'm'); file.addFile("Adriane Maria", 42, 'f'); file.addFile("Paola", 13, 'f'); file.closeFile(); } }
public class FileObjeto { // ------------------------------ atributos String nomeFile; private ObjectInputStream fileIn; // ------------------------------ construtor FileObjeto(String nomeArquivo) { nomeFile = nomeArquivo; try { fileIn = new ObjectInputStream(new FileInputStream(nomeFile)); System.out.println("Ok, Arquivo Aberto: " + nomeFile);
153
System.exit(1);
} } // ------------------------------- addFile public void getFile() throws IOException, ClassNotFoundException { Registro registro = new Registro(); System.out.println("Nome Idade Sexo"); try { while (true) { registro.nome = fileIn.readObject(); registro.idade = fileIn.readObject(); registro.sexo = fileIn.readObject(); System.out.printf("%-20s %2d %c\n", registro.nome, registro.idade, registro.sexo); } } catch (EOFException endOfFileException) { } } // ------------------------------- closeFile public void closeFile() { try { if (fileIn != null) { fileIn.close(); System.out.println("Ok, Arquivo fechado: " + nomeFile); } } catch (IOException ioException) { System.out.println("ERRO Fatal: Impossvel fechar o arquivo: " + nomeFile); System.exit(1); } } } // ------------------------------------------------------ ReadFile.java package readfile; import java.io.IOException; import java.util.Scanner; public class ReadFile { public static void main(String[] args) throws IOException, ClassNotFoundException { Scanner input = new Scanner(System.in); System.out.print("Nome do Arquivo: "); String nomeArquivo = input.nextLine(); FileObjeto file = new FileObjeto(nomeArquivo); file.getFile(); file.closeFile(); } }
154