Você está na página 1de 113

A Linguagem de Programao JAVA

por Prof. Dr. Paulo Roberto Gomes Luzzardi

e-mail e msn luzzardi@atlas.ucpel.tche.br e-mail pluzzardi@gmail.com Home Page http://infovis.ucpel.tche.br/luzzardi

Verso 1.11 13-04-2010

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

Pelotas, Tera-feira, 13 de abril de 2010 (7:14:04pm)

Sumrio
1. Arquitetura de um programa em Java .....................................................................................5 1.1 Elementos bsicos de um programa em Java ......................................................... 5 1.2 Como compilar um programa em Java .......................................................................... 5 1.3 Como executar um programa em Java .......................................................................... 5 2. Estrutura de um programa em Java ..........................................................................................5 2.1 - Identificadores ................................................................................................................ 5 2.2 Comentrios do programador ...................................................................................... 6 2.3 - Regras gerais para escrever um programa em Java .................................... 6 2.4 - Palavras reservadas ....................................................................................................... 7 2.5 - Declarao de variveis ............................................................................................. 7 2.5.1 - Onde as variveis podem ser declaradas ................................................ 7 2.5.2 - Inicializao de variveis ............................................................................. 9 2.6 - Constantes ............................................................................................................................ 9 2.6.1 - Constantes hexadecimais e octais ............................................................... 9 2.6.2 - Constantes Strings .............................................................................................. 10 2.6.3 - Constantes especiais .......................................................................................... 10 2.7 - Comandos do pr-processador do Java .............................................................. 11 2.7.1 - O comando import ................................................................................................... 11 3. Tipos de dados ...................................................................................................................................11 3.1 - Tipos bsicos ................................................................................................................... 11 3.2 Escrevendo uma classe em Java ............................................................................. 11 3.3 Sobrecarga de mtodos em Java ............................................................................. 15 3.4 Classes (Interface ou Coleo) existentes em Java (Container) 16 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 .............................................................................................................................................31 5.1 - Operadores aritmticos .............................................................................................. 31 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 .......................................................................................................................... 34 6. Mtodos para funes matemticas padres .....................................................................35 6.1 Math.abs ............................................................................................................................... 35 6.2 Math.asin ............................................................................................................................. 35 6.3 Math.acos ............................................................................................................................. 35 6.4 Math.atan ............................................................................................................................. 35 6.5 Math.cos ............................................................................................................................... 35 6.6 Math.sin ............................................................................................................................... 35 6.7 Math.exp ............................................................................................................................... 36 6.8 Math.pow ............................................................................................................................... 36 6.9 Math.sqrt ............................................................................................................................. 36 6.10 Math.log ............................................................................................................................. 36 6.11 Double.parseDouble ..................................................................................................... 36 6.12 Integer.parseInt .......................................................................................................... 36 6.13 Long.parseLong .............................................................................................................. 36 6.14 - Math.log10 ........................................................................................................................ 36 6.15 Math.tan ............................................................................................................................. 36 6.16 Math.random ...................................................................................................................... 37 7. Comandos .................................................................................................................................................37 7.1 - Tipos de comandos .......................................................................................................... 37 7.1.1 - Sequncia .................................................................................................................... 37

7.1.2 - Seleo ......................................................................................................................... 37 7.1.3 - Repetio .................................................................................................................... 38 7.2 - Comando if .......................................................................................................................... 39 7.2.1 - if encadeados .......................................................................................................... 40 7.3 - O comando switch ............................................................................................................ 40 7.4 - Comando while ................................................................................................................... 43 7.5 - O comando for ................................................................................................................... 44 7.6 - O loop do { } while ..................................................................................................... 46 7.7 - Interrupo de loops .................................................................................................. 46 7.7.1 - O comando break ...................................................................................................... 46 7.7.2 - O comando continue .............................................................................................. 47 7.8 - O mtodo System.exit () ........................................................................................... 47 8. Sada formatada (System.out.printf) .................................................................................47 9. Lista de exerccios (comandos) .............................................................................................48 10. Vetores, Matrizes e Strings .................................................................................................53 10.1 - Vetores ............................................................................................................................... 53 10.2 Strings ............................................................................................................................... 53 10.3 - Matrizes (Multidimensional) ............................................................................... 54 10.4 - Vetor de Strings .......................................................................................................... 55 10.5 - Inicializao de matrizes e vetores ............................................................ 56 10.6 - Inicializao de um vetor de caracteres .................................................. 56 10.7 - Inicializao de matrizes multidimensionais ......................................... 56 10.8 - Inicializao de vetores e matrizes sem tamanho ............................... 56 10.9 - Classificao de dados ou ordenao (sort) ........................................... 58 10.10 - Lista de exerccios (vetores) ........................................................................ 59 11. Manipulao de Strings .............................................................................................................61 11.1 Mtodos para manipular Strings ........................................................................ 61 11.2 Lista de exerccios (Strings) .......................................................................... 64 12. Mtodos estticos definidos pelo programador .........................................................66 12.1 - Valores de retorno ..................................................................................................... 67 12.2 - Passagem de parmetros por valor ................................................................... 69 12.3 - Passagem de parmetros por referncia ....................................................... 70 12.4 Mtodos que devolvem valores no-inteiros .............................................. 70 13.5 - Argumentos do main (String [] args) ............................................................ 71 12.6 - Recursividade ................................................................................................................. 72 12.7 - Lista de exerccios (mtodos) .......................................................................... 73 13. Entrada e sada em disco (Arquivos) ..............................................................................76 13.1 Mtodos para manipular arquivos em Java .................................................. 76 13.2 Abertura de um arquivo texto ............................................................................. 79 13.3 Listar um diretrio .................................................................................................. 79 13.4 Manipulao de um arquivo de palavras ....................................................... 80 13.5 - Lista de exerccios (arquivos) ........................................................................ 82 14. Conceitos Diversos em Java ....................................................................................................86 14.1 - Operadores bit a bit ................................................................................................ 86 14.2 - Formas abreviadas de Java .................................................................................... 86 15. Listas lineares: Pilha, Fila e Fila Circular .........................................................87 15.1 - Implementao de um lista em vetor .............................................................. 87 15.2 - Implementao de uma Pilha .................................................................................. 91 15.3 - Implementao de uma Fila .................................................................................... 92 15.4 - Implementao de uma Fila Circular .............................................................. 93 16. Tratamento de erros .....................................................................................................................95 16.1 Tratamento de excees ........................................................................................... 96 16.2 Tratamento de erros: Entrada de nmero inteiro via teclado ..... 96 16.3 Tratamento de erros: Diviso por zero ....................................................... 97 16.4 Tratamento de exceo com Exception ............................................................ 98 16.5 Tratamento de exceo com MyException ....................................................... 98

16.6 Exceo em ArrayList ................................................................................................ 99 16.7 Excees criadas pelo programador ............................................................... 100 17. Herana em Java ............................................................................................................................102 17.1 Herana simples .......................................................................................................... 102 17.2 Controle de acesso na definio de uma classe derivada ............ 102 17.3 Tipos de acessos (especificadores de acesso) .................................... 104 18. Coletor de Lixo (Garbage Collector) ............................................................................105 19. Construtor e finalizador em Java ...................................................................................106 20. Applets em Java ............................................................................................................................107 21. Threads em Java ............................................................................................................................111 22. Glossrio em Java .......................................................................................................................112

1. Arquitetura de um programa em Java


1.1 Elementos bsicos de um programa em Java
// -------------------------------------------------------- Fonte: Teste.java package teste; public class Teste { // nome do pacote // nome da classe (Teste.class) // mtodo principal

public static void main(String[] args) { corpo_do_programa; } }

1.2 Como compilar um programa em Java $ javac Teste.java <enter> $ // gera um arquivo Teste.class

1.3 Como executar um programa em Java $ java Teste <enter> $

2. Estrutura de um programa em Java


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

Convenes: Sempre comear um identificador com uma letra e no "$" ou "_". Os caracteres $ e _ nunca devem ser usados. Use nomes completos em vez de abreviaes confusas. Palavras-chaves e palavras reservadas da linguagem no podem ser usadas como identificadores. Se o identificador tiver mais de um nome, o primeiro deve comear com letra minscula e os demais devem comear com letras maisculas (int numDoentes = 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 em mtodos: x = raizQuadrada(y); System.out.println(Valor: + inverso(n));

Observao: o mtodo inverso definido pelo programador (1/n). 2.2 Comentrios do programador Os comentrios do programador so linhas de cdigo que no so compiladas pelo compilador, ou seja, servem apenas como anotaes (documentao) para serem lembradas mais tarde (por exemplo, quando forem feitas manutenes no programa). Em Java os comentrios podem ser feitos de duas formas: /* Assim pode ser usado para comentrio de vrias linhas */ // Isto um comentrio de uma linha apenas Um comentrio, pode ainda, utilizar vrias linhas do programa. Veja o exemplo abaixo:
/* ---------------------------------------------------Mtodo: STRING Argumentos de entrada: x, y Argumentos de sada: c[], t[] Retorno: Sem Retorno ------------------------------------------------------- */

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

Programa exemplo dd/mm/aaaa].

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

} }

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

2.4 - Palavras reservadas 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 ou mtodos, ou seja, no servem como identificadores. 2.5 - Declarao de variveis Sintaxe: tipo_dado_base lista_de_variveis; tipo_dado_base: deve ser um tipo de dado vlido (boolean, char, int, byte, short, long, float, double ou void) lista_de_variveis: um ou mais identificadores separados por vrgula. Exemplo: int i, j ,k; float a, b; char ch; 2.5.1 - Onde as variveis podem ser declaradas Definidas fora de todas os mtodos, incluindo o mtodo main() so chamadas de variveis globais e podem ser acessadas em qualquer parte do programa. Estas variveis so alocadas estaticamente na memria RAM (Random Access Memory Memria de acesso randmico). Quando definidas dentro de um mtodo so chamadas de variveis locais e s podem ser acessadas dentro deste mtodo. Estas variveis so alocadas dinamicamente na memria RAM.

Na declarao de parmetros formais (argumentos) de um mtodo. Sendo estas locais e alocadas dinamicamente na memria RAM.

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

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


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

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

Executar por linha de comandos (via terminal): $ java Prog2 <enter> 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};

// executa o arquivo Prog2.class

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); } } }

2.6.2 - Constantes Strings Uma String um conjunto de caracteres delimitados por aspas duplas. Em Java existe uma classe especfica para trabalhar com Strings (classe String). Uma String finalizada pelo caracter especial \0 (chamado de null). Exemplo:
String s = "UCPel";

\0 igual a null
0 U 1 C 2 P 3 e 4 l 5 null

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


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

A palavra null quer dizer nulo. Vetor de Strings:


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

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

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

2.7 - Comandos do pr-processador do Java 2.7.1 - O comando import O comando import faz o compilador incluir um pacote de classes dentro do programa fonte. Cada pacote possui diversas classes. import java.util.Scanner; // pacote java.util e a classe Scanner import javax.swing.*; // pacote javax.swing e avisa que vai usar uma das classes import java.awt.Graphics2d; // pacote java.awt e a classe Graphics2d Na URL abaixo voc encontra as diversas api Java:
URL: http://java.sun.com/j2se/1.5.0/docs/api/

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 int byte short long float double Bits 8 32 32 8 32 32 64 8 Faixa de valores -128 127 -2147483648 21474483647 -3.4E-38 3.4E+38 -128 127 -2147483648 21474483647 -3.4E-38 3.4E+38 -1.7E-308 1.7E+308 -128 127 Bytes 1 4 4 1 4 4 8 1

3.2 Escrevendo uma classe em Java 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. Exemplo da definio de uma classe Data:
// ----------------------------------------------- Fonte: Data.java package data; public class Data { private int dia, mes, ano; // atributos da classe // construtor da classe

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

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

11

} }

Programa exemplo que utiliza a classe Data:


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

Exemplo da definio de uma classe Calculadora:


// -------------------------------------------------------- Fonte: Calculadora.java package calc; import javax.swing.*; public class Calculadora { // ............................................. lista de atributos da classe private double x, y, resp; private char op; private int erro; // ............................................. mtodos pblicos da classe public Calculadora () { erro = 0; } public void entradaDados() { String s; s = JOptionPane.showInputDialog("Digite um Valor: "); x = Double.parseDouble(s); do { s = JOptionPane.showInputDialog("Operador [+ - * / Rr Pp Ss Cc Tt]: "); op = s.charAt(0); } while (!strChr("+-*/RrPpSsCcTt", op)); if (!strChr("RrSsCcTt", op)) { s = JOptionPane.showInputDialog("Digite outro Valor: "); y = Double.parseDouble(s); } } // ---------------------------- operaCalculadora public void operaCalculadora() { final double pi = 3.14158; double rads; switch (op) { case '+': case '-': case '*': case '/': // construtor

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;

case 'R':

12

case 'r':

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':

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

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

13

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

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

Programa exemplo que utiliza a classe Calculadora:


// ---------------------------------------------- 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;

14

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); 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; 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);

15

} static void imprime(char ch) { System.out.println("Caracter: " + ch); } }

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

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

Implementaes Sets(Conjuntos): HashSet, LinkedHashSet, TreeSet, EnumSet

16

Lists (Listas): Vector, Stack, LinkedSet, ArrayList 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.

17

Sintaxe: void ensureCapacity(int minCapacity); 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.

18

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);

19

extenso = vetor.toString(); 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;

20

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

21

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

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(); Retrieves, but does not remove, the head of this queue. Sintaxe: boolean offer(E o); Inserts the specified element into this queue, if possible. Sintaxe: E peek(); Retrieves, but does not remove, the head of this queue, returning null if this queue is empty. Sintaxe: E poll(); Retrieves and removes the head of this queue, or null if this queue is empty. Sintaxe: E remove(); Retrieves and removes the head of this queue. 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

22

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

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.

23

Sintaxe: static int binarySearch(float[] a, float key); 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);

24

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

25

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);

26

Ordena o array especificado de double em ordem ascende numrica. 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);

27

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

ArrayList (lista de arrays)


A classe Vector. ArrayList possui os mesmos mtodos da classe

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

28

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

4. Mtodos de entrada e sada de dados


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

4.1 Entrada de dados via teclado


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

} }

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.

29

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

4.2 Sada de dados via tela


A seguir visto um exemplo de sada de dados na tela usando o mtodo System.out.print. Programa exemplo (11): Sada de dados via tela usando o mtodo System.out.print, System.out.println ou System.out.printf.
// -------------------------------------------- Fonte: Prog11.java package Prog11; import java.util.Scanner; public class Prog11 { public static void main(String[] args) { Scanner entrada = new Scanner (System.in); String s; int x;

30

System.out.print("Inteiro: "); s = entrada.nextLine(); x = Integer.parseInt(s); System.out.println("Valor: " + x); System.out.printf("Valor: %03d\n ", x); System.exit(0); } }

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

} }

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 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

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 3: Operadores aritmticos
Operador aritmtico + * Ao Subtrao Adio Multiplicao

o compilador a executar podem ser aritmticas,

31

/ % -- ++

Diviso Resto inteiro da diviso Decremento/incremento

Precedncia dos operadores aritmticos (Hierarquia nas Operaes) Tabela 4: 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. so

Tabela 5: Operadores relacionais


Operador > >= < <= == != Ao Maior que Maior ou igual a Menor que Menor ou igual Igual a Diferente de

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

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


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

Precedncia (Hierarquia dos operadores Tabela 7: 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:

32

true diferente de 0 (!= 0) false igual 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--; 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: 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 = x + 1; x = x - 1;

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


// ------------------------------------------ Fonte: Prog13.java package Prog13; import java.util.Scanner; public class Prog13 { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; int idade, ano_atual, ano_nasceu; // leitura do ano atual System.out.print("Ano ATUAL: "); s = entrada.nextLine(); ano_atual = Integer.parseInt(s);

33

System.out.print("Ano de NASCIMENTO: "); s = entrada.nextLine(); // leitura do ano de nascimento ano_nasceu = Integer.parseInt(s); // atribuio clculo da idade idade = ano_atual - ano_nasceu; System.out.println("Sua IDADE eh " + idade); System.exit(0); } }

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

34

Uma expresso em Java qualquer combinao vlida de operadores (aritmticos, relacionais, lgicos), constantes, variveis e mtodos. Exemplo: c = Math.sqrt (a) + b / 3.4;

6. Mtodos para funes matemticas padres


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

6.2 Math.asin O mtodo Math.asin retorna o valor do arco seno. A varivel x deve estar em radianos. Sintaxe: double Math.asin (double x); Faixa: -pi / 2 pi / 2 6.3 Math.acos O mtodo Math.acos retorna o valor do arco cosseno. A varivel x deve estar em radianos. Sintaxe: double Math.acos (double x); Faixa: 0 pi 6.4 Math.atan O mtodo Math.atan retorna o valor do arco tangente. A varivel x deve estar em radianos. Sintaxe: double Math.atan (double x); Faixa: -pi / 2 pi / 2 6.5 Math.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 6.6 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

35

6.7 Math.exp O mtodo Math.exp retorna o valor do expoente (ex). Sintaxe: double Math.exp (double x); 6.8 Math.pow O mtodo Math.pow (power) retorna o valor da potncia (xy). Sintaxe: double Math.pow (double x, double y); 6.9 Math.sqrt O mtodo quadrada. Math.sqrt (square root) retorna o valor da raiz

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

36

Sintaxe: double Math.tan (double x); 6.16 Math.random O mtodo Math.random retorna um nmero double aleatrio. Sintaxe: double Math.random (void); Faixa: 0.0 100.0
int i = 1 + (int)(Math.random() * 100); System.out.println(Nmero: + i);

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

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

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


// ------------------------------------------ Fonte: Prog15.java package Prog15; import java.util.Scanner; public class Prog15 { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; double x, raiz; System.out.print("Digite um valor: "); s = entrada.nextLine(); x = Double.parseDouble(s); if (x < 0) {

37

// esta instruo s executada se o valor de x for negativo x = Math.abs(x); } raiz = Math.sqrt(x); System.out.printf("Raiz Quadrada: %.2f\n", raiz); System.exit(0); } }

Operador Ternrio (?): Funcionamento: Se a condio for verdadeira, executa comando1 seno executa comando2. 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 {

38

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); } }

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;

39

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); } }

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; .

40

. . 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. 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);

41

} }

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.*; 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;

42

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': case 'T': termino(); break; default: System.out.println("ERRO: Opo Invlida"); } } static void inclusao() { System.out.println("Opo Escolhida: Incluso"); } static void alteracao() { System.out.println("Opo Escolhida: Alterao"); } static void termino() { System.out.println("Opo Escolhida: Trmino"); } }

7.4 - Comando while O comando while um comando de repetio que permite executar um comando (simples) ou vrios comandos (composto) diversas vezes. Isto feito atravs da avaliao de uma condio. Enquanto a condio for verdadeira os comandos so repetidos. Quando a condio se tornar falsa o comando while finalizado. O teste da condio feita no incio do comando, ou seja, antes que todos os comandos sejam executados. Observao: Note que os comandos podem no ser executados nenhuma vez, basta a condio comear como falsa. Sintaxe: while (condio) { comando; } ou 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

43

while (i <= 10) // condio i <= 10 { System.out.printf(i = %d\n, i); i = i + 1; // incremento }

Comando: Pode ser um comando vazio, simples ou composto que sero repetidos. Comando vazio: while (1); // comando while no repete nenhum comando for (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, os comandos while e for que teriam outros comandos no os tem, caracterizando comandos vazios. 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 (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 (x = 1; x <= 10; x++) { System.out.printf(x = %d\n, x); }

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


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

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

44

Exemplos: Com uma varivel de controle: for (int i = 0;i < 9;i++) { System.out.println(i); } Com duas varivel de controle: for (int i = 1, int j = 5;i != j;i++, j--) { System.out.println(i + - + j); } Inicializao: um comando de atribuio (ou vrios, separados por vrgula) que o compilador utiliza para inicializar a(s) varivel(is) de controle do lao. Condio: uma expresso qualquer, que testa a varivel de controle do lao contra algum valor para determinar quando o lao terminar. Incremento ou decremento: Define a maneira como a(s) varivel(is) de controle do lao sero alteradas aps a repetio do lao. O lao (for) repetido enquanto a condio verdadeira. A condio sempre testada no comeo do lao. Qualquer uma das 3 partes do comando for (inicializao; condio; incremento) podem ser qualquer expresso vlida em Java.

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


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

} }

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


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

i i i i

= = = =

1 2 3 4

j j j j

= = = =

9 8 7 6

O lao for equivalente ao seguinte comando: inicializao;

45

while (condio) { comando; incremento; } ou inicializao; do { comando; incremento; } while (condio);

// ou decremento

// ou decremento

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

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


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

} }

7.7 - Interrupo de loops 7.7.1 - O comando break Quando o programa encontra o comando break dentro de um lao, ele imediatamente encerra o lao, e o controle do programa segue para o prximo comando aps o lao. Programa exemplo (26): O programa imprime na tela a tecla digitada pelo usurio at que ele digite <F> ou <f>.

46

// ---------------------------------------------- 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' ou 'f' break; } System.out.printf("Tecla: %c - Codigo: %d\n", tecla, (int) tecla); } while (true); // lao eterno } }

7.7.2 - O comando continue O comando continue em vez de forar o encerramento, fora a prxima interao do lao e "pula", ou seja, no executa o cdigo que estiver depois do comando continue. Programa exemplo (27): O programa imprime na tela somente os nmeros pares de 0 at 100.
// ------------------------------------------ Fonte: Prog27.java package prog27; public class Prog27 { public static void main(String[] args) { int i; for (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);

8. Sada formatada (System.out.printf)

47

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

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

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

Especificadores de largura do campo a ser impresso (exemplos): Tabela 9: 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

9. Lista de exerccios (comandos)


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

48

Frmula:

h2 = a2 + b2

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

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

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

Conceito A B C D

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

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

49

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> Quarenta e cinco Nmero [0..99]: 0 <enter>

9.9 Escreva um programa em Java que recebe via teclado: quantidade de litros vendidos, tipo de combustvel ([A]lcool, [G]asolina ou [D]iesel) e o tipo de pagamento ([P]razo ou [V]ista). O programa deve calcular e imprimir na tela: total prazo, desconto e o total

50

vista. O programa termina quando o usurio digitar 'N' ou 'n' na pergunta "Continua [S/N]?".
Tela de execuo: Quantidade de litros? 50 <enter> Tipo de combustvel [A]lcool, [G]asolina ou [D]iesel ? G <enter> Tipo de pagamento [P]razo ou a [V]ista ? V <enter> Total prazo (R$) : 109.50 Desconto (R$): 5.48 Total vista (R$): 104.02 Continua [S/N]? N <enter> Valores: lcool - 1,23 Gasolina - 2,19 Diesel - 1,46 Desconto vista: 5%

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

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

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

Frmula:

F -

32

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

51

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

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

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

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

52

10. Vetores, Matrizes e Strings


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

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

53

// ----------------------------------------- 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) {

54

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};

55

Tabela 11: 0 0 U 1 U 2 U

Exemplo 1 C C F

de um 2 P S P

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

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

// 10 elementos

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

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

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

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

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

56

public static void main(String[] args) throws Exception{ final int MAX = 10; Scanner entrada = new Scanner(System.in); String s; String [] nome = new String[MAX]; int [] idade = new int [MAX]; int numElementos; char ch; System.out.print("Numero de Elementos: "); s = entrada.nextLine(); numElementos = Integer.parseInt(s); 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]); } } } }

57

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) { final int QUANT = 50; String [] nome = new String[QUANT]; int numElementos; Scanner entrada = new Scanner(System.in); String s; System.out.print("Numero de Elementos: "); s = entrada.nextLine(); numElementos = Integer.parseInt(s); 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: Prog31.java package prog32; import java.util.Scanner; public class Prog32 { public static void main(String[] args) { final int QUANT = 50; String [] nome = new String[QUANT]; int numElementos; Scanner entrada = new Scanner(System.in); String s; boolean sort; System.out.print("Numero de Elementos: ");

58

s = entrada.nextLine(); numElementos = Integer.parseInt(s); 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 ESC (cdigo 27). 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 <enter> I <enter> M <enter> A <enter> <esc>

10.10.2 Escreva um programa em Java que recebe via teclado: nmero de idades (mximo 50) 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>

59

Nmero: 30 <enter> Nmero: 20 <enter> 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 ESC. 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: <esc> 4 Aprovado(s) 1 Reprovado(s) 3 Infreqente (s)

10.10.5 Escreva um programa em Java que recebe via teclado n (mximo 50) nomes (mximo 80 letras). 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: <esc>

10.10.6 Escreva um programa em Java que recebe via teclado n (mximo 30) nomes (mximo 40 letras) e idades. A entrada dos dados termina quando o usurio digitar 'N' ou 'n' na pergunta "Continua [S/N]?". Logo aps a entrada de todos os dados o programa deve imprimir na tela todos os nomes e 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>

60

Idade: 14 <enter> Continua [S/N]? N <enter> Carla 14 Beatriz 13 Ana 12

11. Manipulao de Strings


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

11.1 Mtodos para manipular Strings


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

Sintaxe: char charAt(int index); Retorna o caracter do ndice especifiado. Modo de usar: ch = s.charAt(0); 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. Sintaxe: byte[] getBytes(); e

61

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); 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 caracter especificado. seqncia da 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);

62

Testa se duas regies das Strings so iguais. Sintaxe: String replace(char oldChar, char newChar); 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 [].

63

Sintaxe: static String valueOf(char[] data, int offset, int count); Retorna uma representao String do argumento char [[]. 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. 11.2 Lista de exerccios (Strings) 11.2.1 Escreva um programa em Java que recebe via teclado um nome (mximo 256 caracteres). 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 (mximo 40 caracteres) e uma letra. Logo aps a entrada do nome e da letra imprima o nmero de letras que existe no nome ou ERRO: No existe a letra (?) na palavra (?), conforme exemplo abaixo:
Exemplo: Palavra: Luzzardi <enter> Letra: z <enter> 2 letra(s) Continua [S]im ou [N]o? S <enter> Palavra: Luzzardi <enter> Letra: w <enter> ERRO: No existe a letra (w) na palavra (Luzzardi) Continua [S]im ou [N]o? N <enter> quando o usurio digitar N ou n na

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

11.2.3 Escreva um programa em Java que recebe via teclado uma palavra (mximo 20 letras) e uma posio. O programa deve imprimir na tela, a letra antecessora, a letra (da referida posio) e a letra sucessora, conforme exemplo abaixo:
Exemplo: Palavra: Universidade <enter> Posio: 7 <enter> 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 (mximo 80 letras). O programa deve imprimir, na tela, as palavras do nome em ordem inversa, uma por linha, conforme exemplo abaixo:

64

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 (mximo 60 caracteres). Logo aps a entrada do nome o programa deve imprimir (EM LETRA MAISCULA) o sobrenome da pessoa, conforme exemplos abaixo:
Exemplo: Nome: Paulo Roberto Gomes Luzzardi <enter> Sobrenome: LUZZARDI Sair [S/N]? N <enter> Nome: Renato Souza <enter> Sobrenome: SOUZA Sair [S/N]? s <enter>

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

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

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

11.2.7 Escreva um programa em Java que recebe via teclado o nome de um estado (mximo 80 caracteres). 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 (mximo 20 caracteres), 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> 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>

65

Observao: O programa termina quando o usurio digitar N ou n na pergunta: Continua [S/N]?.

12. Mtodos estticos definidos pelo programador


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

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)); } } static int random (int n) { int t; t = (int) (Math.random() * n); return(t); } }

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

// retorna um nmero aleatrio entre 0 e 9

programa

possui

um

mtodo

esttico

que

// ---------------------------------------------- Fonte: Prog33.java package prog33; import java.util.Scanner; public class Prog33 { public static void main(String[] args) { Scanner entrada = new Scanner(System.in);

66

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 static double potencia (double x, int y) { double valor; valor = Math.exp ( Math.log (x ) * y ); return(valor); } }

67

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); } } } }

c) Mtodos que procedimentos.

no

retornam

nenhum

valor,

ou

seja,

so

puramente

Programa exemplo (36): O programa possui um mtodo esttico que limpa toda a tela em modo texto atravs do mtodo chamado: imprimeNumero.
// -------------------------------------- Fonte: Prog36.java

68

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; for (l = li; l <= lf; l++) { for (c = ci; c <= cf; c++) { System.out.print("#"); } System.out.println(); } } }

69

Onde: ci li cf lf

-> -> -> ->

coluna inicial linha inicial coluna final linha final

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

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

Programa exemplo (39): O programa calcula e imprime na tela a diviso de dois valores usando um mtodo esttico chamado diviso.
// ------------------------------------------ Fonte: prog39.java package prog39; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner entrada = new Scanner(System.in);

70

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 ); } }

13.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] = Prog40 agv[1] = pelotas
// --------------------------------------- Fonte: Prog40.java package prog40; public class Prog40 { public static void main(String[] args) { int n, argc = args.length; if (argc != 2) { System.out.printf("Sintaxe: Prog40 <palavra>\n"); } else { System.out.print("Palavra: "); n = args[1].length(); for (int i = n-1; i >= 0; i--) { System.out.printf("%c", args[1].charAt(i)); } System.out.println(); } } }

Sistema sentido Sistema

71

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: argv[0] = Prog41 agv[1] = dbeacgf
// ------------------------------------- Fonte: Prog41.java package prog41; public class Prog41 { public static void main(String[] args) { int argc = args.length; int numCar; if (argc != 2) { System.out.printf("Sintaxe: Prog41 <palavra> \n"); } else { numCar = args[1].length(); char [] ch = new char[numCar]; for (int i = 0;i < numCar;i++) { ch[i] = args[1].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 { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; int n;

72

long fat; 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)); } do {

// recursividade

Programa exemplo recursivamente.

(43):

programa

calcula

soma

de

um

nmero

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

// recursividade

12.7 - Lista de exerccios (mtodos) 12.7.1 Escreva em Java o mtodo palavras. O mtodo recebe uma String (nome) e retorna o nmero de palavras do nome (veja exemplo abaixo):
// teste.java package teste;

73

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).
// teste.java package teste; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; int x, y, n; System.out.print("x: "); s = entrada.nextLine(); x = Integer.parseInt(s); System.out.print("y: "); s = entrada.nextLine(); y = Integer.parseInt(s); n = verificaQuadrante(x, y); System.out.printf("Quadrante: %d\n", n); } // ---------------------------- verificaQuadrante }

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

| 2 | 1 ________________________ | 3 | 4

12.7.3 Escreva o mtdod: final_da_placa. O mtodo recebe uma placa de automvel no formato: xxx9999 e retorna o ltimo dgito da placa.
// teste.java package teste; import java.util.Scanner; public class Teste {

74

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.
// 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:
// teste.java package teste; import java.util.Scanner; public class Teste { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; float a, b, h; System.out.print("Cateto Adjacente: ");

h2

= a2 + b2

75

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.
// 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

13. Entrada e sada em disco (Arquivos)


Em Java (Arquivo). para manipular arquivos pode-se usar a classe File

13.1 Mtodos para manipular arquivos em Java A seguir so arquivos em Java: descritos os principais mtodos para manipular

Sintaxe: boolean canRead();

76

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(); 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.

77

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); 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.

78

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. 13.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); } }

13.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();

79

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);

} }

13.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; 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);

80

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; 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 {

81

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"); } } } while (pos != 0); } else { System.out.println("ERRO: Arquivo no existe"); } System.exit(0); } }

13.5 - Lista de exerccios (arquivos) 13.5.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.

82

Exemplo: Nome do arquivo texto: LISTA.JAVA <enter> (12345) Bytes (44) Linhas ou ERRO: Arquivo no existe 13.5.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> ERRO: Linha no existe Nmero de linha: 0 <enter> ou ERRO: Arquivo no existe 13.5.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 13.5.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 13.5.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') {

83

37: 41: 59: 65: 69:

if if if if if

(compara(linha,palavra)) { (ch != '\n') { (linha[i] == palavra[0]) { (linha[k] != palavra[j]) { (achei) {

13.5.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 Nmero inicial: 70 <enter> Nmero final: 90 <enter> ERRO: Linhas no existem 13.4.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> 13.4.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 13.4.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. texto: LISTA.JAVA <enter> 7 <enter> <enter> 0;

84

Exemplo: Nome do arquivo binrio: NOMES.DAT <enter> Ok, arquivo ordenado Observao: Utilize o programa anterior (ler.java) para ver os nomes ordenados. 13.4.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> Sexo [M/F]: m <enter> Nome: Ana Maria <enter> Idade: 44 <enter> Sexo [M/F]: f <enter> Nome: <enter> 13.4.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 13.4.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

85

14. Conceitos Diversos em Java


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

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


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

14.2 - Formas abreviadas de Java


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

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

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

86

15. Listas lineares: Pilha, Fila e Fila Circular


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

Figura 19: Representao de uma fila e uma pilha Funcionamento desta pilha:
Entrada: 1, 2 e 3 Sada: 3, 2 e 1

Funcionamento desta fila:


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

15.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.*;

87

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

88

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) {

89

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

90

} }

15.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(); 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) pilha.push(nodo); } while (nodo != 0); nodo = pilha.pop(); while (nodo != 0) { nodos = nodos + nodo + " "; nodo = pilha.pop(); } System.out.println("Pilha: " + nodos); } }

// ---------------------------------------------------------- Fonte: Pilha.java package prog52; public class private private private Pilha { final static int MAX = 5; int topo; int [] dados = new int[MAX];

// ----------------------------------------------- construtor public Pilha() { topo = 0; } // construtor

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

91

} }

return(dados[topo]); } else return(0);

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 15.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(); Scanner entrada = new Scanner(System.in); String s, nodos = ""; int nodo; do { System.out.print("Elemento: "); s = entrada.nextLine(); nodo = Integer.parseInt(s); if (nodo != 0) fila.insereFila(nodo); } while (nodo != 0); nodo = fila.retiraFila(); if (nodo == 0) System.out.println("Fila: Vazia"); else { while (nodo != 0) { nodos = nodos + nodo + " "; nodo = fila.retiraFila(); } System.out.println("Fila: " + nodos); }

} }

// --------------------------------------------------- Fonte: Pilha.java package prog53; public class private private private Fila { final static int MAX = 5; int inic, fim, n; int [] dados = new int[MAX];

92

// ---------------------------------------- construtor public Fila() { inic = -1; fim = 0; n = 0; } // ------------------------------------------------ push public void insereFila(int i) { if (n < MAX) { dados[fim] = i; fim++; n++; } else System.out.println("Erro: Fila Cheia"); } 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

15.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. 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 {

93

public static void main(String[] args) { FilaCircular fila = new FilaCircular(); 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 final int MAX private int primeiro, private int [] elem = { = 3; ultimo, tamanho; new int[MAX + 1];

public FilaCircular() { primeiro = 0; ultimo = -1; tamanho = 0; } // ------------------------------------ insereFilaCircular public void insereFilaCircular(int dado) { if (tamanho == MAX) { System.out.println("ERRO: Fila Cheia"); } else { tamanho++; ultimo = (ultimo + 1) % MAX; elem[ultimo] = dado; } } // ----------------------------------- excluiFilaCircular public int excluiFilaCircular() { if (tamanho == 0) { System.out.println("ERRO: Fila Vazia"); return(-1); } else { tamanho--; int temp = primeiro; primeiro = (primeiro + 1) % MAX; return(elem[temp]); } } // -------------------------------- exibeFilaCircular

94

public void exibeFilaCircular() { 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) % MAX; } 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?

16. Tratamento de erros


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

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

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

95

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 } 16.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.

16.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);

96

String s; int inteiro = -999; 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); } } try {

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


Inteiro: 120 INTEIRO: 120

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


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

16.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).
// ------------------------------------------------------ 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

97

Divisao: Infinity

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


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

16.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: "); s = entrada.nextLine(); y = Integer.parseInt(s); div = (float) x / y; System.out.println("Divisao: " + div); } catch (Exception error) { error.printStackTrace(); System.out.println("Status: Divisao por zero"); } } }

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

16.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

98

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); } }

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

Resultado do Programa (sem erro): [usurio digitou 2 + Paulo + Roberto] Nome: Paulo Nome: Roberto Resultado do Programa (com erro): [usurio digitou -1]
ERRO: ArrayList ilegal

99

Illegal Capacity: -1

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


ERRO: Conversao Ilegal For input string: "abc"

16.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 public int getCodigo() { return(this.codigo); }

pelo

// -------------------------------------------------------- Fonte: ListObjet.java package listaobjeto; public class ListObjet { private Object [] v; private int n; // ------------------------------------- Construtor public ListObjet(int n) { v = new Object[n]; n = 0; } // ------------------------------------- getTamanho public int getTamanho() { return(n); } // ------------------------------------- incluiFim public void incluiFim(Object nodo) { if (n == v.length) { throw new ListaCheiaException(); } else { v[n] = nodo; n++; } } // ------------------------------------- consulta public Object consulta(int indice) {

100

if (indice < 0 || indice >= n) { throw new IndiceInvalidoException("Indice: " + indice + "invalido"); } else { return(v[indice]); } } // ------------------------------------- ListaCheiaException public class ListaCheiaException extends RuntimeException { public ListaCheiaException () { super("Lista Cheia"); } public ListaCheiaException (String s) { super(s); } } // ------------------------------------- IndiceInvalidoException public class IndiceInvalidoException extends RuntimeException { public IndiceInvalidoException () { super("Indice Invalido"); } public IndiceInvalidoException (String s) { super(s); } } } // ------------------------------------------------------ Fonte: ListaObjeto.java package listaobjeto; public class ListaObjeto { public static void main(String[] args) { ListObjet lista = new ListObjet(3); lista.incluiFim(new Aluno(10, "Ana")); lista.incluiFim(new Aluno(20, "Beatriz")); lista.incluiFim(new Aluno(30, "Carla")); // lista.incluiFim(new Aluno(40, "Debora")); // tente rodar com esta linha int tam = lista.getTamanho(); for (int i = 0;i < tam;i++) { // tenta rodar com (i <= tam) Aluno aluno = (Aluno) lista.consulta(i); System.out.println(aluno.getNome() + "(" + aluno.getCodigo() + ")"); } System.exit(0); } }

Resultado do Programa (sem erro):


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

Resultado do Programa (com erro):


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

Resultado do Programa (com erro):


for (int i = 0;i <= tam;i++) { Ana(10) Beatriz(20) Carla(30) // rodou com esta linha

101

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

17. Herana em Java


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

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

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

17.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

102

igual ao acesso a membros privativos, exceto para o acesso das classes derivadas da classe. A forma geral de especificar herana simples :

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

} }

// -------------------------------------------------------- Fonte: base.java package heranca; public class Base { private int x, y; // atributos privados

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

103

} 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) { // 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? 17.3 Tipos de acessos (especificadores de acesso) public (pblico): Todos os atributos da classe base so pblicos na classe derivada. private (privado): Os atributos s podem ser acessados pelos mtodos que fazem parte da classe. protected (protegido): Os atributos podem ser acessados pelos mtodos de classes derivadas. O objetivo do programa demonstrar a simples (atributos da classe base so

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

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

} }

// ----------------------------------------------------------- Fonte: base.java package heranca;

104

public class Base { protected int x, y;

// atributos protegidos

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

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

18. Coletor de Lixo (Garbage Collector)


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

// ------------------------------------------------ Fonte: base.java package heranca; public class Base {

105

protected int x, y;

// atributos protegidos

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

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

19. Construtor e finalizador em Java


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

public void Seta(int a, int b) { x = a; y = b; System.out.println("x = " + x); System.out.println("y = " + y); } public int Soma() { System.out.println("Soma (x + y): " + (x + y)); return(x + y); } } // ---------------------------------------------------- Fonte: Derivada.java package heranca; public class Derivada extends Base { private int z;

106

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 } 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); } }

base

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

20. Applets em Java


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

107

Insero da Applet no documento HTML:


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

Para compilar a Applet: $ javac PaintApplet.java <enter> $ Para testar a Applet: $ appletviewer PaintApplet.html <enter> $ Exemplo de Applet (CalcApplet):
// ---------------------------------------------------- Fonte: CalcApplet.java import java.awt.Graphics; import javax.swing.JApplet; public class CalcApplet extends JApplet { Calculadora calc = new Calculadora(); double resp; // -------------------------------------------- init public void init() { calc.entradaDados(); resp = calc.operaCalculadora(); } // -------------------------------------------- paint public void paint(Graphics g) { int erro = calc.retornaErro(); super.paint(g); g.drawString("Calculadora 1.0 by Luzzardi", 300, 270); g.drawLine(0, 280, 1279, 280); if (erro == 0) { 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 () { // construtor // gerado PaintApplet.class

108

erro = 0; } // -------------------------------- 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 break; resp = power(x, y); break; resp = seno(x); break; resp = cosseno(x); break; // potncia // seno // cosseno

case 'R': case 'r':

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

} return(this.resp); }

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

// ---------------------------- strChr private boolean strChr(String s, char ch) { for (int i = 0; i < s.length(); i++) {

109

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

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

110

Insero da Applet no documento HTML:


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

Para compilar a Applet: $ javac Calculadora.java <enter> $ javac CalcApplet.java <enter> $ Para testar a Applet: $ appletviewer CalcApplet.html <enter> $
// gerado Calculadora.class // gerado CalcApplet.class

21. Threads em Java


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

111

22. Glossrio em Java


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

112

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.

113