Você está na página 1de 266

Sumrio

NOES DE LGICA.............................................................................................................. 3
O QUE LOG!CA? ..................................................................................................................... 3
OBJET!vOS DA LOG!CA ............................................................................................................... 3
O QUE LOG!CA DE PROGRANAO? .............................................................................................. 3
O QUE UN ALGOR!TNO? ........................................................................................................... +
!NPORTANC!A DA CONSTRUO DE ALGOR!TNOS ................................................................................ +
REPRESENTAO DE ALGOR!TNOS.................................................................................................. +
EXERCC!OS DE F!XAO............................................................................................................. 7
CONCEITOS BSICOS SOBRE ALGORITMOS......................................................................... S
T!POS PR!N!T!vOS .................................................................................................................... 8
vAR!AvEL............................................................................................................................... 8
CONSTANTES .......................................................................................................................... 9
!DENT!F!CAO DAS vAR!AvE!S PARA A L!NGUAGEN JAvA .................................................................... 10
CONENTAR!OS....................................................................................................................... 11
OPERADORES ........................................................................................................................ 12
Operador de atribuiao .................................................................................................... 12
Operadores aritmticos.................................................................................................... 12
Operadores relacionais .................................................................................................... 13
Operadores lgicos.......................................................................................................... 1+
TABELA-vERDADE ................................................................................................................... 1+
PRECEDNC!A DOS OPERADORES ................................................................................................. 15
REGRAS PARA CR!AO DE BONS ALGOR!TNOS................................................................................. 16
NTODO PARA DESENvOLv!NENTO DE ALGOR!TNOS .......................................................................... 17
EXERCC!OS DE F!XAO........................................................................................................... 18
ESTRUTURAS DE CONTROLE............................................................................................... 20
ESTRUTURA SEQUENC!AL .......................................................................................................... 20
Passagem de parametros em Java .................................................................................... 20
Conversao de Tipos e Casting........................................................................................... 21
Conversoes Automaticas .................................................................................................. 21
Cast de Tipos !ncompativeis............................................................................................. 21
Uso do teclado para a entrada de dados ............................................................................ 23
Algoritmos Resolvidos...................................................................................................... 25
EXERCC!OS DE F!XAO - ESTRUTURA SEQUENC!AL ......................................................................... 27
ESTRUTURAS DE SELEO ......................................................................................................... 29
Seleao Simples .............................................................................................................. 29
Seleao Composta........................................................................................................... 30
Seleao Encadeada ......................................................................................................... 32
Seleao encadeada Heterognea ...................................................................................... 32
Seleao encadeada Homognea........................................................................................ 33
Seleao de multipla escolha.............................................................................................. 35
Algoritmos Resolvidos...................................................................................................... 37
EXERCC!OS DE F!XAO - ESTRUTURA DE SELEO.......................................................................... +0
ESTRUTURAS DE REPET!O....................................................................................................... +5
Repetiao com teste no inicio ........................................................................................... +5
Repetiao com teste no final ............................................................................................ +8
Repetiao com variavel de controle ................................................................................... +9
Comparaao entre estruturas de repetiao......................................................................... 50
Outros exemplos complementares .................................................................................... 55
EXERCC!OS GERA!S - ESTRUTURAS DE CONTROLE ...................................................................... 68
FUNES MATEMTICAS E DE STRING EM JAVA ............................................................... 75

FUNOES NATENAT!CAS ........................................................................................................... 75
FUNOES DE STR!NG ............................................................................................................... 77
EXERCC!OS DE F!XAO - FUNOES NATENAT!CAS E DE STR!NGS ......................................................... 79
VETORES E MATRIZES......................................................................................................... S0
vAR!AvE!S CONPOSTAS HONOGNEAS........................................................................................... 80
vAR!AvE!S CONPOSTAS UN!D!NENS!ONA!S (vETORES) ....................................................................... 80
Declaraao ..................................................................................................................... 80
Nanipulaao ................................................................................................................... 80
vAR!AvE!S CONPOSTAS NULT!D!NENS!ONA!S (NATR!ZES) ................................................................... 97
Declaraao ..................................................................................................................... 97
Nanipulaao ................................................................................................................... 97
EXERCC!OS DE F!XAO - vETORES E NATR!ZES.............................................................................107
MODULARIZAO ............................................................................................................. 10S
DECONPOS!O....................................................................................................................108
PROCED!NENTOS...................................................................................................................108
Chamada de procedimentos ............................................................................................109
FUNOES ............................................................................................................................111
ESCOPO DE vAR!AvE!S ............................................................................................................112
PARANETROS .......................................................................................................................113
Parametros formais ........................................................................................................113
Parametros reais............................................................................................................113
PASSAGEN DE PARANETROS......................................................................................................11+
Passagem de parametros por valor ..................................................................................11+
Passagem de parametros por referncia ...........................................................................11+
EXERCC!OS DE F!XAO - NODULAR!ZAO..................................................................................121
ARQUIVOS......................................................................................................................... 124
!NTRODUO .......................................................................................................................12+
DEF!N!O DE ARQU!vOS.........................................................................................................12+
NAN!PULAO......................................................................................................................125
T!POS DE ARQU!vOS...............................................................................................................126
FORNAS DE ACESSO ...............................................................................................................126
ARQU!vO SEQUENC!AL - OPERAO DE !NCLUSO..........................................................127
ARQU!vO SEQUENC!AL - OPERAO DE CONSULTA .........................................................130
ARQU!vO SEQUENC!AL - OPERAO DE ALTERAO........................................................132
ARQU!vO SEQUENC!AL - OPERAO DE EXCLUSO..........................................................135
REPRESENTAO DA NAN!PULAO DE ARQU!vOS DE ACESSO ALEATOR!O ..............................................137
ARQU!vO DE ACESSO ALEATOR!O - OPERAO DE !NCLUSO..........................................137
ARQU!vO DE ACESSO ALEATOR!O - OPERAO DE CONSULTA .........................................139
ARQU!vO DE ACESSO ALEATOR!O - OPERAO DE ALTERAO........................................1+1
ARQU!vO DE ACESSO ALEATOR!O - OPERAO DE EXCLUSO..........................................1++
EXENPLOS D!vERSOS - UT!L!ZANDO AS CLASSES AWT, SW!NG E EvENT .................................................1+6
EXERCC!OS DE F!XAO - ARQU!vOS ..........................................................................................152
PROGRAMAO ORIENTADA A OBJETOS ......................................................................... 156
CONCE!TOS PREL!N!NARES.......................................................................................................156
!NTRODUO .......................................................................................................................156
O PROCESSO DE ABSTRAO.....................................................................................................156
OPERAOES DE ABSTRAO ......................................................................................................156
Classificaaof!nstanciaao...............................................................................................156
GeneralizaaofEspecializaao...........................................................................................157
AgregaaofDecomposiao ...............................................................................................158
Associaao ....................................................................................................................161
EXERCC!OS DE F!XAO - CONCE!TOS BAS!COS DE OO....................................................................161
O MODELO DE OBJETOS.................................................................................................... 162

CONCE!TOS FUNDANENTA!S......................................................................................................162
CLASSES E OBJETOS...............................................................................................................162
ATR!BUTO...........................................................................................................................162
NTODO.............................................................................................................................162
TERNOS ENPREGADOS NA POO .................................................................................................163
JAVA E O MODELO DE OBJETOS........................................................................................ 165
PROGRANAO ESTRUTURADA...................................................................................................166
O NODELO DE OBJETOS..........................................................................................................170
Objetos, mtodos e variaveis...........................................................................................170
Agregaao.....................................................................................................................170
Nensagens....................................................................................................................171
Classes e instancias........................................................................................................172
Herana........................................................................................................................172
Sobrecarga de Operadores e Polimorfismo........................................................................173
INTRODUO S CLASSES................................................................................................ 175
DEF!N!O DE UNA CLASSE EN JAvA ...........................................................................................175
Criando a Classe Caixa....................................................................................................175
A saida do programa sera ...............................................................................................176
O volume e +1+0.0.........................................................................................................176
!NTRODUO AOS NTODOS .....................................................................................................176
!ncluindo um Ntodo na Classe Caixa...............................................................................177
Retornando um valor .....................................................................................................178
!ncluindo um Ntodo com Parametros a Classe Caixa ........................................................178
CONSTRUTORES ....................................................................................................................179
GARBAGE COLLECT!ON............................................................................................................180
O NTODO F!NAL!ZE()............................................................................................................180
MAIS DETALHES SOBRE CLASSES E MTODOS................................................................. 1S1
SOBRECARGA DE NTODOS ......................................................................................................181
SOBRECARGA DE CONSTRUTORES ...............................................................................................182
A PALAvRA-CHAvE STAT!C .......................................................................................................183
A PALAvRA-CHAvE F!NAL .........................................................................................................183
HERANA........................................................................................................................... 1S3
FUNDANENTOS DE HERANA.....................................................................................................183
EXENPLO DE HERANA............................................................................................................18+
SOBREPOS!O DE NTODOS....................................................................................................185
Aplicando a Sobreposiao de Ntodos ..............................................................................185
CLASSES ABSTRATAS ..............................................................................................................186
PACOTES E INTERFACES................................................................................................... 1S7
PACOTES ............................................................................................................................187
Criando um Pacote.........................................................................................................187
A variavel de Ambiente CLASSPATH.................................................................................188
CONTROLE DE ACESSO............................................................................................................188
!NPORTANDO UN PACOTE ........................................................................................................189
!NTERFACES.........................................................................................................................189
TRATAMENTO DE EXCEO............................................................................................... 190
FUNDANENTOS DO TRATANENTO DE EXCEO................................................................................190
T!POS DE EXCEO................................................................................................................191
TRY-CATCH..........................................................................................................................191
THROW ..............................................................................................................................191
THROWS .............................................................................................................................192
F!NALLY..............................................................................................................................193
EXCEOES PADROES EN JAvA....................................................................................................19+

CR!ANDO UNA EXCEO ..........................................................................................................19+
ENTRADAJSADA .............................................................................................................. 195
STREANS ............................................................................................................................195
Streams de Bytes e de Caracteres....................................................................................195
Streams Predefinidas......................................................................................................196
LENDO DADOS DO TECLADO .....................................................................................................196
Leitura de Caracteres do Teclado.....................................................................................197
Leitura de Strings do Teclado ..........................................................................................198
ESCREvENDO NO TERN!NAL......................................................................................................198
LE!TURA E ESCR!TA DE ARQU!vOS ..............................................................................................198
APPLETS............................................................................................................................ 201
!NTRODUO AOS APPLETS.......................................................................................................201
ESQUELETO BAS!CO DE UN APPLET .............................................................................................202
!niciaao e Finalizaao de um Applet ................................................................................203
CORES DO APPLET .................................................................................................................203
DESENHANDO FORNAS GEONTR!CAS..........................................................................................20+
ANEXO A:........................................................................................................................... 205
CONCE!TOS SOBRE A L!NGUAGEN JAvA.........................................................................................205
Um Breve histrico.........................................................................................................205
Principios basicos de um ambiente Java classico................................................................205
Por Dentro da Plataforma Java ........................................................................................207
Compilador e Ambiente de Execuao Java.........................................................................208
ANEXO B............................................................................................................................ 209
RESUNO DOS CONCE!TOS ABORDADOS SOBRE A L!NGUAGEN JAvA. .......................................................209
RECURSOS ..........................................................................................................................209
COLETA DE L!XO ...................................................................................................................209
ANB!ENTE JAvA DE CONP!LAO................................................................................................209
DURANTE O PROCESSO DE CONP!LAO.......................................................................................210
ARQU!vOS DO JDK ................................................................................................................210
ALGUNAS DEF!N!OES ............................................................................................................210
CONP!LADOR JAvAC ...............................................................................................................211
PARA !NTERPRETAR O PROGRANA...............................................................................................212
PALAvRAS RESERvADAS...........................................................................................................212
vAR!AvE!S...........................................................................................................................212
NOD!F!CADORES DE vAR!AvE!S .................................................................................................213
CONENTAR!OS......................................................................................................................213
NOD!F!CADORES DE CLASSES ....................................................................................................213
NOD!F!CADORES DE NTODOS E vAR!AvE!S_NENBRO.......................................................................213
EXCEOES...........................................................................................................................213
DESCR!O DE ALGUNAS CLASSES...............................................................................................215
CLASSES NA!S UT!L!ZADAS .......................................................................................................215
1. String....................................................................................................................215
2. Classe que representa datas - java.util.date..............................................................216
3. Classes de Entrada e Saida......................................................................................217
+. File.......................................................................................................................218
ANEXO C............................................................................................................................ 220

3
Noes de Lgica

O que lgica?

palavra lgica originria do grego logos, que significa linguagem racional. De acordo com o
dicionrio Michaelis, lgica a anlise das formas e leis do pensamento, mas no se preocupa
com a produo do pensamento, quer dizer, no se preocupa com o contedo do pensamento,
mas sim com a forma deste, isto , com a maneira pela qual um pensamento ou uma idia so
organizados e apresentados, possibilitando que cheguemos a uma concluso por meio do
encadeamento dos argumentos.
Os argumentos podem ser dedutivos ou indutivos. Os argumentos indutivos so aqueles com
que, a partir dos dados, se chega a uma resposta por meio de analogia, ou seja, pela comparao
com algo conhecido, porm esse tipo de raciocnio no oferece certeza de que a resposta ser de
fato verdadeira. necessrio conhecer os fatos ou as situaes para que se possa fazer a
comparao.
J os argumentos dedutivos so aqueles cuja concluso obtida como conseqncia das
premissas, isto , por meio da anlise das situaes ou fatos, pode-se obter a resposta. Trabalha-se
com a forma das sentenas, sem que haja necessidade do conhecimento prvio das situaes ou
fatos.

Exemplos:
a)
todo mamfero um animal.
todo cavalo um mamfero.
portanto, todo cavalo um animal.

b)
Kaiton um pas do planeta Stix.
Todos os Xipins so de Kaiton.
Logo, todos os Xipins so Stixianos.

c)
Gerson cientista.
Todo cientista estudioso.
Logo, Gerson estudioso.

A lgica a arte do bem pensar, que a cincia das formas do pensamento. Visto que a
forma mais complexa do pensamento o raciocnio, a lgica estuda a a correo do raciocnio.
Podemos ainda dizer que a lgica tem em vista a ordem da razo.

Objetivos da lgica

Estudo das tcnicas de formalizao, deduo e anlise que permitam verificar a
validade de argumentos.
A lgica tambm objetiva a criao de uma representao mais formal, que se
contrape linguagem natural, que suscetvel a argumentaes informais.

O que lgica de programao?

Significa o uso correto das leis do pensamento, da ordem da razo e de processos de
raciocnio e simbolizao formais na programao de computadores, objetivando racionalidade e o
desenvolvimento de tcnicas que cooperem para a produo de solues logicamente vlidas e
coerentes, que resolvam com qualidade os problemas que se deseja programar.
O raciocnio algo abstrato, intangvel. Os seres humanos tm a capacidade de expressa-lo
atravs da palavra falada ou escrita, que por sua vez se baseia em um determinado idioma, que
segue uma srie de padres (gramtica). Um mesmo raciocnio pode ser expresso em qualquer um
dos inmeros idiomas existentes, mas continuar representando o mesmo raciocnio, usando apenas
outra conveno.
A
4
Algo similar ocorre com a lgica de programao, que pode ser concebida pela mente
treinada e pode ser representada em qualquer uma das inmeras linguagens de programao
existentes. Estas, por sua vez, so muito atreladas a uma grande diversidade de detalhes
computacionais, que pouco tm a ver com o raciocnio original. Para escapar dessa Torre de Babel
e, ao mesmo tempo, representar mais fielmente o raciocnio da lgica de programao, utilizamos os
algoritmos.

O que um algoritmo?

Um algoritmo pode ser definido como uma seqncia de passos que visam atingir um
objetivo bem definido.
Quando elaboramos um algoritmo devemos especificar aes claras e precisas, que a partir
de um estado inicial, aps um perodo de tempo finito, produzem um estado final previsvel e bem
definido. Isto significa que o algoritmo fixa um padro de comportamento a ser seguido, uma norma
de execuo a ser trilhada, com vistas a alcanar, como resultado final, a soluo de um problema,
garantindo que sempre que executado, sob as mesmas condies, produza o mesmo resultado.

importncia da construo de algoritmos

Representar mais fielmente o raciocnio envolvido na lgica de programao e, dessa
forma, permite-nos abstrair de uma srie de detalhes computacionais, que podem ser
acrescentados mais tarde. Assim podemos focalizar nossa ateno naquilo que
importante: a lgica da construo de algoritmos.
Uma vez concebida uma soluo algortmica para um problema, esta pode ser
traduzida para qualquer linguagem de programao e ser agregada das
funcionalidades disponveis nos diversos ambientes; costumamos denominar esse
processo de codificao.


Representao de algoritmos

Um algoritmo uma linha de raciocnio, que pode ser descrito de diversas maneiras, como
por exemplo: pseudicdigo, descrio narrativa, fluxograma ou diagrama de Chapin.

Exemplo: Algoritmo para trocar lmpadas (considerando 10 lmpadas)

Descrio narrativa

Ir at o interruptor;
Enquanto a quantidade de soquetes testados for menor que dez, faa
Acionar interruptor;
Se a lmpada no acender, ento
Pegar uma escada;
Posicionar a escada embaixo da lmpada;
Buscar uma lmpada nova;
Acionar o interruptor;
Subir na escada;
Retirar a lmpada queimada;
Colocar uma lmpada nova;
Enquanto a lmpada no acender, faa
Retirar a lmpada queimada;
Colocar uma lmpada nova;
Ir at o interruptor do prximo soquete;


5
Diagrama Chapin ou N-S




















Pseudocdigo ou portugol


Inicio
Declarao de variveis;
Enquanto (soquetes testados) < 10 faa
Acionar o interruptor;
Se (lmpada no acendeu) ento
Pegar uma escada;
Colocar a escada embaixo do soquete;
Buscar lmpada nova;
Acionar interruptor;
Subir na escada;
Retirar a lmpada queimada;
Colocar lmpada nova;
Enquanto (lmpada no acender) faa
Retirar lmpada queimada;
Colocar lmpada nova;
Fim enquanto;
Ir para o prximo soquete;
Fim se;
Fim enquanto;
Fim;




Ir para o primeiro soquete
Soquetes testados < 10
Acionar o interruptor
Lmpada no
acendeu?
Pegar uma escada
Colocar a escada embaixo do
soquete
Buscar uma lmpada nova
Acionar o interruptor
Subir na escada
Retirar a lmpada queimada
Colocar a lmpada nova

Lmpada no acendeu?
Retirar lmpada queimada
colocar lmpada nova
Ir para o prximo soquete
F V
6
Fluxograma ou Diagrama em blocos
























































incio
Soquetes testados
< 10
Ir para o primeiro soquete
Acionar o interruptor
Lmpada no
acendeu?
Pegar uma escada
Colocar a escada embaixo do
soquete
Buscar a lmpada nova
Acionar interruptor
Subir na escada
Retirar a lmpada queimada
colocar lmpada nova
Lmpada no
acendeu?
Retirar a lmpada queimada
Colocar lmpada nova
Ir para prximo soquete
fim
7
Exerccios de Fixao

1. Descreva com suas palavras o que voc entende por:
ao;
processo;
estado;
evento;
padro de comportamento.

2. Escreva um algoritmo para descrever como voc faz para ir da sua casa at a Faculdade.
3. O que voc entende por aspecto esttico e aspecto dinmico de um algoritmo? Qual o conceito
que relaciona estes dois aspectos?
4. Quais so as trs estruturas bsica de controle com as quais podemos desenvolver qualquer
algoritmo?
5. O que um programa?
6. O que um bom programa?
7. Com relao as aspecto de documentao, qual a vantagem de se utilizar uma pseudolinguagem
para desenvolvimento de programas?


8
Conceitos bsicos sobre algoritmos

s dados so na verdade, os valores que sero utilizados para a resoluo de um problema.
Esses valores podem ser fornecidos pelo usurio do programa, podem ser originados a partir
de processamentos (clculos) ou, ento, a partir de arquivos, bancos de dados ou outros
programas.

Tipos primitivos

Para entender os tipos primitivos, voltemos nossa ateno para um conceito muito
importante: informao.
Informao a matria-prima que faz com que seja necessria a existncia dos
computadores, pois eles so capazes de manipular e armazenar um grande volume de dados com
alta performance, liberando o Homem para outras tarefas nas quais seu conhecimento
indispensvel.
Os dados so armazenados temporariamente em variveis para que sejam processados de
acordo com as especificaes do algoritmo. Para que haja integridade no resultado obtido, os dados
devem ser classificados de acordo com o tipo do valor a ser armazenado na varivel, isto , para
evitar problemas que podem ser ocasionados devido ao fornecimento de valores inadequados
operao que ser realizada.
Aproximando-nos da maneira pela qual o computador manipula as informaes, vamos dividi-
las em quatro tipos primitivos, que sero os tipos bsicos que usaremos na construo de algoritmos.
Como os dados manipulados pelos computadores durante a execuo dos programas so
armazenados na memria, esses tipos seguem caractersticas de formato e espao disponvel nessa
memria.
Definir o tipo de dados mais adequado para ser armazenado em uma varivel uma questo
de grande importncia para garantir a resoluo do problema. Ao desenvolver um algoritmo,
necessrio que se tenha conhecimento prvio do tipo de informao (dado) que ser utilizado para
resolver o problema proposto. A partir da, escolhe-se o tipo adequado para a varivel que
representar esse valor. Na confeco de algoritmos, utilizamos os tipos de dados primitivos (literal,
inteiro, real e lgico), uma vez que os algoritmos apenas representam a resoluo dos problemas. J
na confeco de programas, existem desdobramentos para esses tipos de dados a fim de adequ-los
melhor ao propsito de cada linguagem e resoluo prtica dos problemas.

Varivel

Um dado classificado como varivel quando tem a possibilidade de ser alterado em algum
instante no decorrer do tempo, ou seja, durante a execuo do algoritmo em que utilizado, o valor
do dado sofre alterao ou o dado dependente da execuo em um certo momento ou
circunstncia.
Quando um algoritmo transcrito para uma determinada linguagem de programao, as
variveis tambm tero a funo de armazenar dados temporariamente, mas na memria RAM do
computador. Esses dados sero utilizados durante o processamento para a resoluo do problema
em questo.
Prmtvos Esecjcos ara a lnyuayem de Proyramao Java
TIpos de dados 0efInIo TIpos de
dados
CapacIdade de armazenamento na memrIa
do computador, de acordo com a IInguagem
Java.
LIteral - tambm conhecIdo
como texto ou caractere.
Poder receber letras, numeros
e simbolos.
D8S: os numeros armazenados
em uma varIvel cujo tIpo de
dado lIteral no podero ser
utIlIzados para clculos.
char 16 bIts - armazena unIcodes.
byte 8 bIts - de (128) at (127)
short 16 bIts - de (J2.768) at (J2.767)
O
9
Prmtvos Esecjcos ara a lnyuayem de Proyramao Java
nt

J2 bIts - de (2.147.48J.648) at
(2.147.48J.647)

long 64 bIts - de (9.22J.J72.0J6.854.775.808) at
(9.22J.J72.0J6.854.775.807)
float J2 bIts - de (J,4EJ8) at (J,4E+J8) Feal - tambm conhecIdo
como ponto flutuante.
Poder receber numeros reaIs,
Isto , com casas decImaIs,
posItIvos ou negatIvos. double 64 bIts - de (1,7EJ08) at (+1,7E+J08)
LogIco - tambm conhecIdo
como booleano.
Poder receber verdadeIro (1)
ou falso(0).
boolean 8 bIts - em java podese armazenar true ou
]clse.

Inteiros
Java define quatro tipos inteiros: byte, short, int e long. Todos os tipos inteiros so
sinalizados, ou seja, podem assumir valores positivos e negativos. Java no suporta tipos no
sinalizados (inteiros somente positivos).
O tamanho de um tipo inteiro no deve ser visto como a quantidade de memria para
armazenar o dado e sim o comportamento apresentado pelo dado. O ambiente de execuo Java
pode utilizar qualquer tamanho de memria para armazenar o dado desde que o comportamento
correto seja mantido. A variao dos valores que cada tipo de dado inteiro pode assumir mostrada
na tabela acima.
Tipos de Dados de Ponto Flutuante
Os nmeros de ponto flutuante, tambm conhecidos como nmeros reais, so utilizados em
operaes que necessitam de preciso fracionria, tais como raiz quadrada, seno e cosseno. Java
define dois tipos de dados de ponto flutuante: float e double, que representam nmeros de preciso
simples e dupla, respectivamente. A variao dos valores dos tipos de dados de ponto flutuante
podem assumir mostrado na tabela acima.

Caracteres
Em Java o tipo de dados utilizado para armazenar um caractere o char. O tipo char em
Java diferente do char no C/C++. Em C/C++, char um inteiro de 8 bits. Java utiliza o Unicode
para representar seus caracteres. O Unicode define um conjunto de caracteres internacional que
representa todos os caracteres encontrados em todos os idiomas humanos. uma unio de doze
conjuntos de caracteres, como Latim, Grego e rabe. Para isso os caracteres unicode necessitam de
16 bits para serem representados. Assim, em Java, os caracteres tem o tamanho de 16 bits variando
de O a 65.536, no existindo valores para este tipo de dado.
Booleanos
Para valores lgicos, Java possui o tipo boolean. Uma varivel booleana pode assumir valor
true (verdadeiro) ou false (falso). Este tipo de dado retornado por todos os operadores relacionais,
como a < b. Alm disso, boolean o tipo de dado requerido por condicionais que controlam
estruturas de controle como if e for.

Constantes

Entendemos que um dado constante quando no sofre nenhuma variao no decorrer do tempo, ou
seja, seu valor constante desde o incio at o fim da execuo do algoritmo ou da execuo do
programa, assim como constante para execues diferentes no tempo.
Em Java, uma constante uma varivel declarada com o modificar final. Por exemplo:

final float pi = 3.1415f;

10
NOTA: modificadores sao utilizados para modificar a atribuiao de classes, variaveis ou mtodos.


Identificao das variveis para a linguagem Java

Toda varivel deve ser identificada, isto , deve receber um nome ou identificador. O nome de
uma varivel deve ser nico e deve estar de acordo com algumas regras.
Em Java, os nomes para as variveis so case-sensitive, isto , nomes com letras maisculas
so diferenciados de nomes com letras minsculas. Por exemplo: soma_total diferente de
Soma_Total e tambm de Soma_total.
Nomes devem comear com uma letra, um caractere 'sublinha' ou 'underline' (_) ou o
smbolo cifro ($). Os caracteres subseqentes podem tambm ser algarismos.
No utilizar caracteres especiais, como acentos, smbolos (? / : # etc), , entre outros,
exceto os acima citados.
As letras podem ser maisculas ou minsculas.
No podem ser utilizadas palavras reservadas, como final, float, for, int etc.

A linguagem Java exige que todas as variveis tenham um tipo de dado definido antes de serem
utilizadas no programa, ou seja, elas devem ser obrigatoriamente declaradas, independentemente do
ponto do programa, tanto faz, seja no incio, no meio ou no final, desde que seja antes de sua
utilizao no programa. Essa caracterstica difere da maioria das linguagens de programao.
Quando as variveis so declaradas, a linguagem Java atribui a elas valores-padro, a menos que
especificado de maneira contrria pelo programador. Atribui-se a todas as variveis dos tipos: char,
byte, short, int long, long e double o valor 0 (zero) por default. J as variveis do tipo boolean, por
default, atribui-se false. Entretanto, dependendo do ponto do programa em que a varivel utilizada,
torna-se obrigatrio sua inicializao com algum valor, mesmo com a linguagem possuindo esses
valores padro.

A forma bsica de uma declarao a seguinte:
tipo identificador [= valor], identificador [= valor],...

O tipo um dos tipos elementares de Java, ou o nome de uma classe ou de um a interface. O
identificador o nome da varivel. Uma varivel pode ser iniciada especificando-se um sinal de
igualdade e um valor. Para se declarar mais de uma varivel do mesmo tipo basta utilizar uma vrgula
como separador. A seguir so mostrados alguns exemplos de declaraes de variveis:

int a, b, c; // declarao de trs inteiros a, b,c
int d=1,e,f,g=2; // declarao de mais quatro inteiros
// iniciando d e g
byte x = 22; //inicia x com 22
double PI = 3.1416; // declara uma aproximao de PI
char y = 'Y'; // a varivel x iniciada com 'Y'

Iniciao Dinmica

Embora os exemplos anteriores tenham exibido apenas variveis sendo iniciadas com
valores constantes, Java permite que as variveis sejam iniciadas dinamicamente, utilizando
expresses vlidas no momento da declarao. Por exemplo, a seguir mostrado um trecho de
cdigo onde calculado o comprimento da hipotenusa de um tringulo retngulo com os valores dos
dois catetos:

// demonstrao de iniciao dinmica
class DinIni {
public static void main(String args[]) {
double cateto_oposto = 3.0, cateto_adjacente = 5.0;
// hipotenusa iniciado dinamicamente
double hipotenusa = Math.sqrt(cateto_oposto*cateto_oposto +
cateto_adjacente*cateto_adjacente);
System.out.println("A hipotenusa " + hipotenusa);
}
11
}
As variveis cateto_oposto e cateto_adjacente so iniciadas por constantes. Entretanto, a
varivel hipotenusa iniciada dinamicamente utilizando o Teorema de Pitgoras. O programa utiliza
tambm o mtodo embutido, sqrt(), que um membro da classe Math, para calcular a raiz quadrada.
Escopo e Tempo de Vida de uma Varivel
Como dito anteriormente, Java permite que as variveis sejam declaradas em qualquer bloco.
Um bloco define um escopo. Assim, sempre que um novo bloco iniciado, um novo escopo criado.
Um escopo define que objetos so visvel para outras partes do cdigo do programa. O escopo define
tambm o tempo de vida de uma varivel.
Em linguagens procedurais existem dois tipos de escopo: global e local. Contudo, devido ao
seu modelo orientado a objeto, estes tipos de escopo no se aplicam Java. Em Java existem dois
tipos principais de escopo, um definido por uma classe e o outro definido por um mtodo. A seguir
mostrado um exemplo em Java mostrando estes conceitos:

// Demonstra o escopo de blocos
class Escopo{
public static void main(String args[]) {
int x; // acessvel por todo o cdigo dentro do mtodo m
x = 10;
if (x == 10) { // incio de um novo escopo
int y - 20; // acessvel apenas neste bloco

// x e y so acessveis neste trecho
x - y * 3;
}
// y no acessvel fora do bloco "if"
// x ainda acessvel neste trecho
System.out.println("x " + x);
}
}

Um aspecto importante a ser lembrado que as variveis so criadas apenas quando o seu
escopo iniciado e so destrudas to logo seu escopo chega ao fim. Isto significa, que uma varivel
no guardar seu valor uma vez que tenha sado do seu escopo. Assim, o tempo de vida de uma
varivel dura enquanto seu escopo estiver ativo.

Comentrios

Os comentrios so linhas adicionadas ao programa que servem para facilitar seu
entendimento por parte do programador, ou ainda por uma outra pessoa que consulte o programa.
Essas linhas no afetam o programa em si, pois no so consideradas parte do cdigo. O Java aceita
trs tipos de comentrios: de uma linha, de mltiplas linhas e de documentao.
Para inserir comentrios de linha nica utilizam-se // (duas barras) em qualquer local do
programa e tudo o que estiver escrito depois deste sinal e na mesma linha ser considerado um
comentrio.
Para inserir comentrios que envolvam vrias linhas, utiliza-se /* (barra asterisco) para
demarcar o incio e */ (asterisco barra) para o final, ou seja, tudo o que estiver entre dois sinais ser
considerado comentrio.
O terceiro tipo semelhante ao comentrio de mltiplas linhas, entretanto tem o propsito de
possibilitar a documentao do programa por meio de um utilitrio (javadoc) fornecido pela Sun junto
com o SDK. Esse tipo de comentrio inicia-se com /** e encerrado com */.

Exemplo:
/**Exemplo1:
Essa classe demonstra a utilizao de variveis em uma
classe em Java. So declaradas as variveis do tipo int e double.
O exemplo tambm demonstra como imprimir o contedo das
variveis na tela.
*/
public class Exemplo1{
12
public static void main (String args[]){
//declarao de variveis do tipo inteiro
int x = 10, y = 20;
double dolar = 2.92;
/* As linhas seguintes enviam o contedo das variveis
para a tela */
System.out.println(x);
System.out.println(y);
System.out.println(dolar);
}
}

/**Exemplo2:
imprimindo mltiplas linhas de texto com uma nica instruo
*/
public class Exemplo2{
public static void main (String args[]){
//o mtodo main inicia a execuo deo aplicativo java
System.out.println(Bem\nvindos\nao\nJava);
}
}

Seqnca de escae 0escro
\n Nova lInha. PosIcIona o cursor de tela no InicIo da proxIma lInha.
\t Tabulao horIzontal. |ove o cursor de tela para a proxIma parada de
tabulao.
\r Fetorno de carro. PosIcIona o cursor de tela no InicIo da lInha atual; no
avana para a proxIma lInha. Qualquer saida de caracteres depoIs do
retorno de carro sobrescreve a saida anterIor de caracteres na lInha
atual.
\\ 8arra InvertIda. UtIlIzada para ImprImIr um caractere barra InvertIda.
\" Aspas duplas. UtIlIzada para ImprImIr um caractere aspas duplas.
Algumas seqncias comuns de escape.


Operadores

Os operadores so utilizados para representar expresses de clculo, comparao, condio
e atribuio. Temos os seguintes tipos de operadores: de atribuio, aritmticos, relacionais e lgicos.

Operador de atribuio

So utilizados para expressar o armazenamento de um valor em uma varivel. Esse valor
pode ser pr-definido (variante ou no) ou pode ser o resultado de um processamento.

Ex:
nome = fulano de tal;
resultado = a + 5;
valor = 3;

Nota: para algoritmos podemos utilizar <-- para indicar atribuiao.



Operadores aritmticos

So utilizados para realizao dos diversos clculos matemticos. So eles:

13
0erador Reresentao utlzando-se a
notao alyortmca
Reresentao utlzando-se a
notao ara a lnyuayem Java
Exemlos em Java
ncremento UtIlIzase uma expresso.
Por exemplo: a + 1
++ AdIcIona 1 ao valor de a.
Exemplo: a++ (retorna o valor
de a e depoIs adIcIona 1 a esse
valor); ++a (adIcIona 1 ao valor
de a antes de retornlo).
0ecremento UtIlIzase uma expresso.
Por exemplo: a 1
SubtraI 1 do valor de a.
Exemplo: a (retorna o valor
de a e depoIs subtraI 1 desse
valor); a (subtraI 1 do valor
de a antes de retornar).
|ultIplIcao * * a * b (multIplIca a por b)
0IvIso / / a/b (dIvIde o valor de a por b)

0erador Reresentao utlzando-se a
notao alyortmca
Reresentao utlzando-se a
notao ara a lnyuayem Java
Exemlos em Java
ExponencIao ou **.
Por Exemplo: 2
J
2J.
UtIlIza mtodo.
|odulo mod.
Por exemplo: a mod b.
a b (retorna o resto da
dIvIso InteIra de a por b. Por
exemplo, se o valor de a fosse
9 e o valor de b fosse 2,
teriamos 9 2; o resultado da
dIvIso serIa 4 e o resto(mod)
serIa 1).
AdIo + + a + b (o valor de a somado ao
valor de b).
Subtrao a b (do valor de a subtraido
o valor de b).

Operadores relacionais

So utilizados para estabelecer uma relao de comparao entre valores ou expresses. O
resultado dessa comparao sempre um valor lgico (booleano) verdadeiro ou falso.


0erador Reresentao utlzando-se a
notao alyortmca
Reresentao utlzando-se a
notao ara a lnyuayem Java
Exemlos em Java
|aIor a b (se o valor de a for maIor
do que o valor de b, retornar
verdadeIro. Seno, retornar
falso).
|aIor ou Igual = = a = b (se o valor de a for
maIor ou Igual ao valor de b,
retornar verdadeIro. Seno,
retornar falso).
|enor a b (se o valor de a for menor
do que o valor de b, retornar
verdadeIro. Seno, retornar
falso).
|enor ou Igual = = a = b (se o valor de a for
menor ou Igual ao valor de b,
retornar verdadeIro. Seno,
retornar falso).
14
0erador Reresentao utlzando-se a
notao alyortmca
Reresentao utlzando-se a
notao ara a lnyuayem Java
Exemlos em Java
gual a '= '== a == b (se o valor de a for Igual
ao valor de b, retornar
verdadeIro. Seno, retornar
falso.
0Iferente de != a != b (se o valor de a for
dIferente do valor de b,
retornar verdadeIro. Seno,
retornar falso.



Operadores lgicos

So utilizados para concatenar ou associar expresses que estabeleam uma relao de
comparao entre valores. O resultado dessas expresses sempre um valor lgico (booleano)
verdadeiro ou falso.

0erador Reresentao utlzando-se a
notao alyortmca
Reresentao utlzando-se a
notao ara a lnyuayem Java
Exemlos em Java
E .e. EE A = 5 EE b != 9 (caso o valor
de a seja Igual a 5 e o valor de
b seja dIferente de 9, ento
retornar verdadeIro. Caso
contrrIo, retornar falso).
Du .ou. A = 5 b != 9 (caso o valor de
a seja Igual a 5 e o valor de b
seja dIferente de 9, ento
retornar verdadeIro. Se ambas
as comparaes retornarem
falso, o resultado ser falso).
no .no. ! !a 5 (se o valor de a for
maIor do que 5, retornar
falso. Caso contrrIo, retornar
verdadeIro).

Tabela-verdade

A tabela verdade expressa o conjunto de possibilidades existentes para a combinao de
variveis ou expresses e operadores lgicos. Veja o exemplo abaixo:

Dperador
(.e.) || (.ou.) ! (.no.)
Expresso
aIgorItmIca
A = 5 > A = 5 .e. > A = 5 .ou. > .no. A = 5
Expresso em
Java
A == 5 != A == 5 b != A == 5 || != !A == 5
.7. .7. .7. .7. .F.
.7. .F. .F. .7. .F.
.F. .7. .F. .7. .7.
PesuItados
possveIs
.F. .F. .F. .F. .7.





15
Precedncia dos operadores

As linguagens de programao normalmente estabelecem uma ordem de avaliao
considerando a precedncia dos operadores quando mais de um operador usado em uma
expresso. Veja abaixo a precedncia dos operadores:
Os operadores so mostrados em ordem crescente de precedncia, de cima para baixo:



Dperador TIpo AssocIatIvIdade
( ) Parnteses 0a esquerda para a dIreIta
[ ] SubscrIto de array
. Seleo de membro
++ PosIncremento unrIo 0a dIreIta para a esquerda
Posdecremento unrIo
++ PrIncremento unrIo 0a dIreIta para a esquerda
Prdecremento unrIo
+ |aIs unrIo
|enos unrIo
! Negao logIca unrIa
- Complemento unrIo sobre bIts
( tIpo ) Coero unrIa
* |ultIplIcao 0a esquerda para a dIreIta
/ 0IvIso
|odulo
+ AdIo 0a esquerda para a dIreIta
Subtrao


Dperador TIpo AssocIatIvIdade
0eslocamento de bIts para a esquerda 0a esquerda para a dIreIta
0eslocamento de bIts para a dIreIta com
extenso de sInal

0eslocamento de bIts para a dIreIta com
extenso de zeros

FelacIonal menor que 0a esquerda para a dIreIta
= FelacIonal menor ou Igual a
FelacIonal maIor que
= FelacIonal maIor ou Igual a
nstanceof Comparao de tIpo
== FelacIonal Igual a 0a esquerda para a dIreIta
!= FelacIonal no Igual a
E E sobre bIts 0a esquerda para a dIreIta
DU exclusIvo sobre bIts
DU exclusIvo logIco booleano
0a esquerda para a dIreIta
DU InclusIvo sobre bIts
DU InclusIvo logIco booleano
0a esquerda para a dIreIta
EE E logIco 0a esquerda para a dIreIta
DU logIco 0a esquerda para a dIreIta
:: TernrIo condIcIonal 0a dIreIta para a esquerda
= AtrIbuIo 0a dIreIta para a esquerda
+= AtrIbuIo de adIo
= AtrIbuIo de subtrao
*= AtrIbuIo de multIplIcao
/= AtrIbuIo de dIvIso
= AtrIbuIo de modulo
E= AtrIbuIo E sobre bIts
= AtrIbuIo DU exclusIva sobre bIts
= AtrIbuIo DU InclusIva sobre bIts
= AtrIbuIo de deslocamento para a esquerda
= AtrIbuIo de deslocamento de bIts para a
dIreIta com extenso de sInal

16
= AtrIbuIo de deslocamento de bIts para a
dIreIta com extenso de zeros.


De maneira geral, temos:

Parnteses mais internos
Operadores aritmticos
Operadores relacionais
Operadores lgicos


class Exemplo3{
public static void main (String args[]){
//declarao e inicializao de variveis
int x = 10, y = 3;
// vrias operaes com as variveis
System.out.println(x = + x);
System.out.println(y = + y);
System.out.println(-x = +(-x));
System.out.println(x/y = +(x/y));
System.out.println(Resto de x por y = +(x%y));
System.out.println(Inteiro de x por y = +(int)(x/y));
System.out.println(x + 1 = +(++x));
}
}


Regras para criao de bons algoritmos

Use comentrios com freqncia. Isto torna o algoritmo mais legvel e facilita o entendimento
da lgica empregada. Seus algoritmos devero ser lidos e entendidos por outras pessoas (e
por voc mesmo) de tal forma que possam ser corrigidos e receber manuteno.

Obs: No se esquea de atualizar os comentrios, em caso de manuteno. Pior do que um
programa sem comentrios, um programa com comentrios errados.

Use comentrios, tambm, no cabealho do algoritmo, incluindo, principalmente:
o descrio do que faz o algoritmo
o autor
o data de criao
Escolha nomes de variveis significativos, todavia evite nomes muito longos.
Ex: Prefira SalBruto ou SalarioBruto ao invs de SB ou VAR1
Prefira TotAlunosAprovDireta ao invs de TotalAlunosAprovacaoDireta
Destaque as palavras-chave das estruturas de controle e comandos com sublinhado.
Ex: se media >= 7 ento
...
seno
...
fim-se
Utilize espaos e linhas em branco para melhorar a legibilidade.
Coloque apenas um comando por linha. Vrios comandos em uma linha causa ilegibilidade e
dificulta a depurao.
Utilize parnteses para aumentar a legibilidade e prevenir-se de erros.
Use identao nos comandos de acordo com o nvel que estejam, ou seja, alinhe comandos
de mesmo nvel e desloque comandos de nvel inferior.






17

Ex.:
incio
comando 1;
se condicao1 ento
comando2;
comando3;
seno
comando4;
comando5;
fim-se
comando6;
fim

Mtodo para desenvolvimento de algoritmos

1. Faa uma leitura de todo o problema at o final, a fim de formar a primeira impresso. A
seguir, releia o problema e faa anotaes sobre os pontos principais.
2. Verifique se o problema foi bem entendido. Questione, se preciso, ao autor da especificao
sobre suas dvidas. Releia o problema quantas vezes for preciso para tentar entend-lo.
3. Extraia do problema todas as suas sadas.
4. Extraia do problema todas as suas entradas.
5. Identifique qual o processamento principal.
6. Verifique se ser necessrio algum valor intermedirio que auxilie a transformao das
entradas em sadas. Esta etapa pode parecer obscura no incio, mas com certeza no desenrolar do
algoritmo, estes valores aparecero naturalmente.
7. Teste cada passo do algoritmo, com todos os seus caminhos para verificar se o
processamento est gerando os resultados esperados.
8. Crie valores de teste para submeter ao algoritmo.
9. Reveja o algoritmo, checando as boas normas de criao.




18
Exerccios de fixao

1. Dadas as expresses a seguir, identificar o resultado verdadeiro ou falso que cada uma delas
retornaria, em funo dos valores dados. Supondo A = 2 e B = 7.
a) A = 3 .e. B = 7
b) A < 3 .ou. B <> 7
c) A <= 2 .e. B = 7
d) .no. A = 2 .e. B = 7
e) A < 5 .e. B > 2 .ou. B <> 7

2. Verifique se as variveis abaixo possuem nomes corretos e justifique as alternativas falsas:
a) n#1 b) tempo c) n_1 d) $din e) n 1
f) K2K g) n1 h) U F i) 2nome j) dep
k) nome2 l) val#r

3. Sabe-se que o uso incorreto da precedncia de operadores ocasiona erros. Pensando nisso,
avalie as expresses a seguir e:

a) classifique a ordem em que as operaes devem ser executadas;
b) determine o resultado das operaes.

Considere os seguintes valores para as variveis:
A <-- 8; B <-- 5; C <-- -4; D <-- 2

a) Delta <-- B
2
4 * A * C
b) J <-- Hoje <> HOJE
c) Media <--(A + B + C+ D)/4
d) Media <-- A + B + C + D/4
e) Resultado <-- A mod D/5
f) Resultado <-- (A mod D)/5
g) X <-- (A + B) 10 * C
h) X <-- A + B 10 * C
i) Y <-- A > 8 .e. B + C > D
j) Y <-- A > 3 * 2 .OU. B + C <> D

4. Considere a seguinte atribuio de valores para as variveis:

A <-- 3, B <--4 e C <-- 8

a) A > 3 .e. C = 8
b) A <> 2 .ou. B <= 5
c) A = 3 .ou. B >= 2 .e. C = 8
d) A = 3 .e. .no. B >= 4 .e. C = 8
e) A <> 8 .ou. B = 4 .e. C > 2
f) B > A .e. C <> A
g) A > B .ou. B < 5
h) A <> B .e. B = C
i) C > 2 .ou. A < B
j) A > B .ou. B > A .e. C <> B

5. Complete a tabela-verdade a seguir:

0erador
.e. .ou. .no.
Expresso A = 4 8 5 A = 4 .e. 8 5 A = 4 .ou. 8 5 .no. A = 4
Fesultados
possiveIs

19
0erador



6. Construa a tabela-verdade para as expresses:

a) A >= 3 .ou. B = 5
b) A <> 9 .e. B <= 6
c) .no. A = 2 .OU. B >= 1
d) A > 3 .e. B <> 5 .ou. C < 8

7. Dada a declarao de variveis:
A,B,C :inteiro;
x,y,z : real;
Nome, Rua :literal;
L1 : lgico;

e atribuindo-se a essas variveis os valores:

A <-- 1 X <-- 2.5 Nome <-- Pedro
B <-- 2 Y <-- 10.0 Rua <-- Girassol
C <-- 3 Z <-- -1.0 L1 <-- .v.

Determine o resultado das expresses a seguir:
a) Nome = Rua
b) X > Y .e. C <= B
c) (C 3 * A) < (X + 2 * Z)
d) ((Y/2) = X) .ou. ((B * 2) >= (A + C))
e) .no. L1
f) .no. C = B .e. X + Y <= 20 .OU. L1 <> .v.



20
Estruturas de controle

a criao de algoritmos utilizamos os conceitos de blocos lgicos, entrada e sada de dados,
variveis, constantes, atribuies, expresses lgicas, relacionais e aritmticas, bem com
comandos que traduzam esses conceitos de forma a representar o conjunto de aes.
Para que esse conjunto de aes se torne vivel, deve existir uma perfeita relao lgica
intrnseca ao modo pelo qual essas aes so executadas, ao modo pelo qual regido o fluxo de
execuo do algoritmo.
Atravs das estruturas bsicas de controle do fluxo de execuo sequenciao, seleo,
repetio e da combinao delas, poderemos criar algoritmos para solucionar nossos problemas.
Quando fazemos um programa, devemos saber constru-lo para prever qualquer inteno que
o usurio tenha ao utilizar esse programa.
importante ressaltar a seqncia de fatos que fundamentam a lgica computacional: a
entrada de dados que sero processados para obter a sada. Os dados que entram em
processamento sofrem transformaes resultantes do processo e uma sada produzida,
representando a soluo de um problema.






Estrutura Seqencial

A estrutura seqencial de um algoritmo corresponde ao fato de que o conjunto de aes
primitivas ser executado em uma seqncia linear de cima para baixo e da esquerda para a direita,
isto , na mesma ordem em que foram escritas. Convencionaremos que as aes sero seguidas por
um ponto-e-vrgula (;), que objetiva separar uma ao da outra e auxiliar a organizao seqencial
das aes, pois aps encontrar um (;) deveremos executar o prximo comando da seqncia.
Mostramos abaixo o modelo geral de um algoritmo:

Incio ff identificaao do inicio do bloco correspondente ao algoritmo

ff declaraao das variaveis

ff corpo do algoritmo
aao 1;
aao 2;
aao 3;
.
.

aao n;
fim. ff fim do algoritmo


Passagem de parmetros em Java

Uma aplicao Java pode receber valores a partir da linha de comando, isto , no momento
em que ele executado. Quando um parmetro recebido por um programa, ele pode ser
manipulado internamente e usado em um procedimento qualquer. O exemplo a seguir, demonstra a
utilizao da passagem de parmetros a um programa. Este exemplo apresenta na tela as palavras
que o usurio digitar no momento da execuo do programa por meio da linha de comando.

Exemplo 4:
N
PROCESSAMENTO ENTRADA SADA
21

class Exemplo4{
public static void main (String args[]){
System.out.println(args[0]); //imprima o 1 argumento na tela;
System.out.println(args[1]); //imprima o 2 argumento na tela;

}
}

Ao executar o exemplo4, o usurio deve colocar o comando no seguinte formato:

java Exemplo4 argumento1 argumento2

Exemplo:
java Exemplo4 Aprendendo Java

Os argumentos passados na linha de comando sempre se referem a variveis do tipo String
devido sintaxe utilizada no mtodo principal (main), ou seja, args um vetor de String. Por esse
motivo, mesmo que sejam passados nmeros como parmetros, eles sero considerados como
caracteres.


Converso de Tipos e Casting

Como vimos anteriormente, todos os dados recebidos como argumentos em uma aplicao
referem-se a valores do tipo String. Essa caracterstica gera um inconveniente no caso de ser
necessria a utilizao de valores de outro tipo. Em diversos tipos de programas em Java, necessita-
se realizar a converso entre os diversos tipos primitivos existentes.
Em programao comum atribuir a uma varivel de um tipo um valor de outro tipo. Sempre
que os dois tipos forem compatveis, a converso ser feita automaticamente em Java. Por exemplo,
sempre possvel atribuir a uma varivel long um valor do tipo int. Contudo nem todos os tipos so
compatveis e, portanto, nem todas as converses so feitas automaticamente. Por exemplo, no
existe nenhuma conveno definida de double para byte. Felizmente, possvel converter tipos que
a princpio so incompatveis. Para tanto, basta fazer uso do cast, que executa uma converso de
tipos de forma explcita.
Converses Automticas
Quanto um tipo de dados atribudo a uma varivel de outro tipo, uma converso automtica
de tipos feita desde que estas duas condies sejam satisfeitas:
Os dois tipos so compatveis.
O tipo de destino maior do que o tipo de origem.
Por exemplo, um long (64 bits) sempre poder receber um int (32 bits), um short (16 bits) ou
um byte (8 bits). Isto porque so todos compatveis (tipos inteiros) e o long do que todos os outros.


Cast de Tipos Incompatveis

Embora a converso automtica de tipos seja de grande ajuda, ela no atende todas as
necessidades. Por exemplo, uma converso de int para byte no automtica pois, embora sejam
tipos compatveis, o byte menor do que o int. Nestes casos, pode-se utilizar o cast para fazer a
converso de forma explcita da seguinte forma:
(tipo desejado) valor
A seguir mostrado um exemplo de casting e de converso automtica de tipos:

class Conversao{
public static void main(String args[]) {
byte b = 2;
int i;
22
double d - 2.987;

//converso automtica de byte para int
i = b;
System.out.println("Converso de int para byte.");
System.out.println("i = " + i + " e b " + b);
// converso forada de double para int
i = (int) d;
System.out.println("Converso de double para int.");
System.out.println("d = " + d + " e i = " + i);
}
}

Este programa sera a seguinte sada:
Converso de int para byte. i = 2 e b = 2
Converso de double para int. d = 2.987 e i = 2


A linguagem Java possui uma srie de classe que realizam essa tarefa de converso. Segue
abaixo tabela mostrando essa tarefa:

Suondo a varvel x Converter em A varvel y recebe o valor convetjo
Int x = 10 float float y = (float) x
Int x = 10 double double y = (double) x
float x = 10.5 Int Int y = (Int) x
StrIng x = "10" Int Int y = nteger.parsent(x)
StrIng x = "20.54" double float y = Float.parseFloat(x)
StrIng x = "20.54" double double y = 0ouble.parse0ouble(x)
StrIng x = "java" 7etor de bytes byte b[] = x.get8ytes()
Int x = 10 StrIng StrIng y = StrIng.valueDf(x)
float x = 10.J5 StrIng StrIng y = StrIng.valueDf(x)
double x = 254.J5 StrIng StrIng y = StrIng.valueDf(x)
byte x[] ( x um vetor de bytes) StrIng StrIng y = new StrIng(x)

O exemplo 5 demonstra a criao de uma classe que recebe trs valores da linha de
comando (nota1, nota2 e trabalho) e calcula a mdia entre as notas, utilizando para isso o conversor
de tipo String para double. Para que este exemplo seja executado com sucesso, existe a necessidade
de o usurio entrar com trs dados numricos na linha de comando, conforme mostrado abaixo:

Exemplo 5:

class Exemplo5{
public static void main (String args[]){
double nota1, nota2, trabalho, media;
nota1 = Double.parseDouble(args[0]);
nota2 = Double.parseDouble(args[1]);
trabalho = Double.parseDouble(args[2]);
media = (nota1+ nota2 + trabalho)/3;
System.out.println(Media = + media);

}
}





23
Uso do teclado para a entrada de dados

Apesar de uma aplicao provavelmente no necessitar receber dados pelo prompt durante a
execuo do programa, pois existem meios mais eficientes de fazer isso, interessante verificar
como possvel entrar com dados via teclado. O exemplo 5 ilustra a resoluo do problema
apresentado no exemplo 4 utilizando entrada via teclado:

Exemplo 6:

import java.io.*;
class Exemplo6{
public static void main(String args[]){
String s = " ";
float nota1 =0, nota2 =0, trabalho=0, media=0;
DataInputStream dado;
try{
System.out.println("Entre com a nota 1");
dado = new DataInputStream(System.in);
s = dado.readLine();
nota1 = Float.parseFloat(s);

System.out.println("Entre com a nota 2");
dado = new DataInputStream(System.in);
s = dado.readLine();
nota2 = Float.parseFloat(s);

System.out.println("Entre com a nota do trabalho");
dado = new DataInputStream(System.in);
s = dado.readLine();
trabalho = Float.parseFloat(s);

media = (nota1+ nota2+ trabalho)/3;
System.out.println("Media = "+ media);
}
catch(IOException e)
{
System.out.println("Houve erro na entrada de dados");
}
catch(NumberFormatException e)
{
System.out.println("Houve erro na conversao, digite apenas
caracteres numericos");
}
}
}

Uma breve explicao do exemplo:
A linha 1 contm uma diretiva de compilao, isto , contm um apontamento para uma classe
externa que ser usada durante o processo de compilao. A instruo import indica que um
determinado pacote de classes deve ser carregado no momento da compilao. Isso necessrio
quando uma classe precisa utilizar recursos j definidos em outras classes. Neste exemplo est
sendo chamado o pacote java.io que contm uma srie de classes especializadas em entrada e
sada de dados. No exemplo est sendo usada a classe DataInputStream que pertence ao pacote
java.io. Entenda o pacote como um grupo de classes de mesmo tipo armazenadas em uma pasta
qualquer. O asterisco presente em import java.io.* indica que devem ser carregadas todas as
classes presentes no pacote java.io. Uma alternativa realizar a declarao da seguinte forma:
import java.io.DatInputStream, indicando que ser utilizada apenas a classe DataInputStream.
A linha 8 declara um objeto chamado dado a partir da classe DataInputStream. DataInputStream
uma classe que possibilita a entrada de dados via teclado.
A linha 9 contm o bloco try (tente). Um bloco constitui-se num trecho de cdigo delimitado por
abre e fecha chaves. O bloco try sempre atua em conjunto com um ou vrios blocos catch. O
interpretador Java tentar executar o bloco try e se algum erro ocorrer, a execuo do programa
ser desviada para um dos blocos catch, dependendo do erro gerado na aplicao. Neste
exemplo poder ocorrer um erro de entrada de dados pelo teclado (IOException) e um erro na
converso de String em float (NumberFormatException).
24
Na linha 12 o objeto dado recebe o que foi digitado pelo usurio por meio de new
DataInputStream(System.in). Esta linha pode gerar algum tipo de erro, uma vez que manipula
troca de dados entre um perifrico (teclado) e a memria. Caso ocorra algum erro, a execuo do
programa ser desviado para a linha 29 que trata de erros de entrada e sada de dados.
Na linha 13, a varivel s recebe o contedo do objeto dado (o que foi digitado pelo usurio).
Na linha 14, o contedo da varivel s convertido em uma varivel numrica do tipo float por
meio de Float.parseFloat. Neste momento pode ocorrer um erro de converso, caso o usurio
tenha digitado um contedo diferente de nmero. Caso ocorra algum erro, a execuo do
programa ser desvida para a linha 33 que trata de erros de converso de tipos.

Exemplo 7:
Neste exemplo o programa pergunta qual o nome do usurio e o escreve novamente na tela.

import java.io.*;
class Exemplo7{
public static void main(String args[]){
BufferedReader entrada;
entrada = new BufferedReader (new InputStreamReader System.in));
String nome;
try{
System.out.println("Qual o seu nome?");
nome = entrada.readLine();
System.out.println(nome);
}
catch(Exception e)
{
System.out.println("Houve erro durante a leitura");
}
}
}

Uma breve explicao do exemplo:
A clusula import indica a utilizao do pavote de entrada e sada de dados (java.io.*) da
linguagem Java nesse programa. Embora isso seja desnecessrio para a sada de dados, a
linguagem requer um tratamento de entrada de dados para sua leitura correta.
class Exemplo6 indica o nome do programa e, novamente, public static void main (String args[])
indica o bloco de instrues que sero executados quando o programa for requisitado pelo
usurio.
Nas linhas 4 e 5 esto a declarao e a criao da varivel entrada que ser utilizada para a
leitura do teclado. Isso necessrio para garantir que a leitura seja armazenada na memira com
o formato de uma seqncia de caracteres (String) para que seu valor possa ser manipulado
senmpre da mesma forma. A vantagem dessa sintace que o programador pode utilizar apenas
uma varipavel de entrada e depois convert-la para os valores desejados quantas vezes forem
necessrias.
A varivel nome est sendo declarada para receber e armazenar na memria o valor escrito pelo
usurio. Como se deseja a entrada de um texto, ela declarada como do tipo String.
As linhas 11, 12 e 13 definem um bloco de tratamento de erros caracterstico da linguagem Java.
Sempre que houver entrada de dados na linguagem Java, um tratamento de erros similar ser
necessrio.
A varivel nome recebe, por meio do mtodo readLine(), o valor que o usurio escreveu. A
varivel entrada um objeto que permite a utilizao desse mtodo para leitura. Essa maneira de
chamar mtodos tpica da orientao a objetos.
Aps a leitura da varivel, ela mostrada na tela como sada de dados.

OBSERVAO:

A linguagem Java possui um pacote de classes padro que carregada toda vez que uma
classe compilada. Trata-se do pacote java.lang. Caso esse pacote defaut no fosse carregado
automaticamente, mesmo para enviar qualquer informao na tela por meio de System.out.println,
seria necessrio declarar explicitamente a diretiva. No caso da classe System, seria necessria a
seguinte declarao: import java.lang.System.
25
A utilizao do * no gera overhead (sobrecarga) no programa e normalmente utilizado para
reduzir o tamanho do cdigo. A utilizao do * pode gerar uma certa confuso, uma vez que ele deve
ser usado apenas para identificar um grupo de classes e no um grupo de pacotes. Por exemplo,
suponha que um programa utiliza os pacotes java.util.* (o asterisco indica todas as classes do pacote
util) e java.net.* (o asterisco indica todas as classes do pacote net). No possvel utilizar java.*
achando que os dois pacotes (util e net) sero incorporados ao programa.

Exemplos:

a) Construa um algoritmo que calcule a mdia aritmtica entre quatro notas semestrais
quaisquer fornecidas por um aluno (usurio).
b) Construa um algoritmo que calcule a quantidade de latas de tinta necessrias e o custo para
pintar tanques cilndricos de combustvel, em que so fornecidos a altura e o raio desse
cilindro.
Sabendo que:
A lata de tinta custa R$ 50,00;
Cada lata contm 5 litros;
Cada litro de tinta pinta 3 metros quadrados.

c) Construa um algoritmo para calcular as razes de uma equao do 2 grau (ax
2
+ bx + c),
sendo que os valores de a, b e c so fornecidos pelo usurio (considere que a equao
possui duas razes reais).
d) Construa um algoritmo que, tendo como dados de entrada dois pontos quaisquer do plano
P(x
1
,y
1
) e Q(x
2
,y
2
), imprima a distncia entre eles.
e) Faa um algoritmo para calcular o volume de uma esfera de raio R, em que R um dado
fornecido pelo usurio.
f) Faa um algoritmo que receba duas variveis numricas, calcule e imprima:
soma dos dois nmeros;
subtrao do primeiro pelo segundo;
subtrao do segundo pelo primeiro;
multiplicao dos dois nmeros;
diviso do primeiro pelo segundo;
diviso do segundo pelo primeiro;
quociente inteiro da diviso do primeiro pelo segundo;
quociente inteiro da diviso do segundo pelo primeiro;
resto da diviso do primeiro pelo segundo;
resto da diviso do segundo pelo primeiro.

Algoritmos Resolvidos



Solues em Java:

a)

class CalcMedia {
public static void main(String args[]){
double n1,n2,n3,n4,media;
n1 = Double.parseDouble(args[0]);
n2 = Double.parseDouble(args[1]);
n3 = Double.parseDouble(args[2]);
n4 = Double.parseDouble(args[3]);
media = (n1+n2+n3+n4)/4;
System.out.println("A media anual e: "+media);
}
}

b)
class tintas{
26
public static void main(String args[]){
double custo,Area,h,r,qtde_latas,total_litros;
h = Double.parseDouble(args[0]);
r = Double.parseDouble(args[1]);
Area = 3.14*Math.pow(r,2)+2*3.14*r*h;
total_litros = Area/3;
qtde_latas = total_litros/5;
custo = qtde_latas*50;
System.out.println("A quantidade de latas necessarias e:
"+(int)(qtde_latas));
System.out.println("O custo total da pintura e: "+(int)(custo));
}
}

c)
class Equacao {
public static void main(String args[]){
double a,b,c,x1,x2,delta;
a = Double.parseDouble(args[0]);
b = Double.parseDouble(args[1]);
c = Double.parseDouble(args[2]);
delta = Math.pow(b,2) - 4*a*c;
x1= (-b + Math.sqrt(delta))/2*a;
x2= (-b - Math.sqrt(delta))/2*a;
System.out.println("As raizes sao: x1 = "+x1 +" e x2 = " + x2);
}
}

d)
class DistPontos {
public static void main(String args[]){
double x1,x2,y1,y2,distancia;
x1 = Double.parseDouble(args[0]);
y1 = Double.parseDouble(args[1]);
x2 = Double.parseDouble(args[2]);
y2 = Double.parseDouble(args[3]);
distancia = Math.sqrt(Math.pow((x2-x1),2)+ Math.pow((y2-y1),2));
System.out.println("A distancia entre os pontos e: "+distancia);
}
}



e)
class RaioEsfera {
public static void main(String args[]){
double r,volume;
r = Double.parseDouble(args[0]);
volume = (4/3)*3.14*Math.pow(r,3);
System.out.println("O volume da esfera de raio "+r+" e: "+volume);
}
}

f)
class Operacoes{
public static void main(String args[]){
double x,y;
x = Double.parseDouble(args[0]);
y = Double.parseDouble(args[1]);
System.out.println("A soma do primeiro com o segundo e r = "+ (x+y));
System.out.println("A subtracao do primeiro pelo segundo e r = "+ (x-
y));
System.out.println("A subtracao do segundo pelo primeiro e r = " +(y-
x));
System.out.println("A multiplicacao do primeiro pelo segundo e r = "
+x*y);
27
System.out.println("A quociente do primeiro pelo segundo e r = "
+(int)(x/y));
System.out.println("A quociente do segundo pelo primeiro e r = "
+(int)(y/x));
System.out.println("O resto da divisao do primeiro pelo segundo e r =
" +(x%y));
System.out.println("O resto da divisao do segundo pelo primeiro e r =
" +(y%x));
}
}


Exerccios de Fixao - Estrutura seqencial

1) Faa um algoritmo que receba dois nmeros inteiros e imprima a soma desses dois nmeros.
2) Faa um algoritmo que receba dois nmeros reais, calcule e imprima a subtrao do primeiro
nmero pelo segundo.
3) Faa um algoritmo que receba dois nmeros inteiros, calcule e imprima a diviso do primeiro
nmero pelo segundo.
4) Faa um algoritmo que receba trs notas de um aluno, calcule e imprima a mdia aritmtica entre
essas notas.
5) Faa um algoritmo que receba duas notas de um aluno e seus respectivos pesos, calcule e
imprima a mdia ponderada dessas notas.
6) Faa um algoritmo que receba um valor de um depsito e o valor da taxa de juros. Calcule e
imprima o valor do rendimento e o valor total depois do rendimento.
7) Faa um algoritmo que receba um nmero inteiro, calcule e imprima a tabuada de multiplicao
desse nmero.
8) Faa um algoritmo que receba um nmero real, calcule e imprima:
a parte inteira do nmero;
a parte fracionria do nmero;
arredondamento do nmero.
9) Faa um algoritmo que receba a medida de um ngulo em graus, calcule e imprima o seno e o
cosseno desse ngulo.
10) Faa um algoritmo que receba dois nmeros, calcule e imprima um elevado ao outro.
11) Faa um programa que receba um nmero inteiro, calcule e imprima:
a raiz quadrada desse nmero;
esse nmero elevado ao quadrado.
12) Faa um algoritmo que receba o valor do salrio de um funcionrio e o valor do salrio
mnimo. Calcule e imprima quantos salrios mnimos ganha esse funcionrio.
13) Faa um algoritmo que calcule e imprima a rea das seguintes figuras geomtricas:
tringulo;
quadrado;
crculo;
trapzio;
retngulo;
losango.

14) Calcular e exibir a rea de um quadrado a partir do valor de sua diagonal que ser digitado.
15) Faa um algoritmo que receba o salrio de um funcionrio, calcue e imprima o valor do
imposto de renda a ser pago, sabendo que o imposto equivale a 5% do salrio.
16) Faa um algoritmo que receba o salrio de um funcionrio, calcule e imprima o novo salrio
sabendo-se que este sofreu um aumento de 25%.
17) sabe-se que o kilowatt de energia custa um quinto do salrio mnimo. Faa um algoritmo que
receba o valor do salrio mnimo e a quantidade de quilowatts gasta por uma residncia. Calcule e
imprima:
o valor, em reais, de cada kilowatt;
o valor, em reais, a ser pago por essa residncia;
o novo valor a ser pago por essa residncia, a partir de um desconto de 15%.
18) Faa um algoritmo que receba o peso de uma pessoa, um valor inteiro, calcule e imprima:
o peso dessa pessoa em gramas;
se essa pessoa engordar 5%, qual ser seu novo peso em gramas.

28
19) Faa um algoritmo que receba o ano de nascimento de uma pessoa e o ano atual. Calcule e
imprima:
a idade dessa pessoa;
essa idade convertida em semanas.

20) Crie um programa que receba trs nomes quaisquer por meio da linha de execuo do
programa, e os imprima na tela da seguinte maneira: o primeiro e o ltimo nomes sero impressos
na primeira linha um aps o outro, o outro nome (o segundo) ser impresso na segunda linha.
21) Faa um programa que receba a quantidade e o valor de trs produtos, no seguinte formato:
quantidade1 valor1 quantidade2 valor2 quantidade3 valor3. O programa deve calcular esses
valores seguindo a frmula total = quantidade1* valor1 + quantidade2 * valor2 + quantidade3 *
valor3. O valor total deve ser apresentado no final da execuo do programa.
22) Crie um programa que receba a largura e o comprimento de um lote de terra e mostre a rea
total existente.
23) Crie um programa que receba valores quaisquer e mostre a mdia entre eles, o somatrio
entre eles e o resto da diviso do somatrio por cada um dos valores.
24) Uma determinada pessoa que trabalha com construo de piscinas precisa de um programa
que calcule o valor das construes solicitadas pelos clientes, sabendo-se que os clientes sempre
fornecem o comprimento, a largura e a profundidade da piscina a ser construda. Leve em
considerao que o valor da construo cobrado por m
3
de gua que a piscina conter e o preo
de R$ 45.00 por m
3
.
25) Entrar via teclado com o valor de cinco produtos. Aps as entradas, digitar um valor referente
ao pagamento da somatria destes valores. Calcular e exibir o troco que dever ser devolvido.
26) Escreva um algoritmo para trocar os valores de trs variveis A, B e C de modo que A fique
com o valor de B, B fique com o valor de C e C fique com o valor de A.




























29
Estruturas de seleo

Uma estrutura de seleo permite a escolha de um grupo de aes (bloco) a ser executado
quando determinadas condies, representadas por expresses lgicas ou relacionais, so ou no
satisfeitas.

Palavras-chave em Java
abstract boolean break byte case
catch char class cotinue default
do double else extends false
final finaly float for if
implements import instanceof int interface
long native new null package
private protected public return short
static super switch
syncronized this
throw throws transient true try
void volatile while
Palavras-chave que so reservadas mas no so utilizadas por Java
const goto
Palavras-chave em Java

Seleo Simples

Quando precisamos testar uma condio antes de executar uma ao, usamos uma seleo
simples, que segue o seguinte modelo:
se <condio> ento
C; // comando nico (ao primitiva)
fimse;
onde:
<condio> uma expresso lgica que, quando inspecionada, pode gerar um resultado
falso ou verdadeiro.

Quando existir apenas uma ao aps a clusula, ento basta escrev-la; j quando
precisamos colocar diversas aes necessrio usar um bloco, delimitado por inicio e fim, conforme
o seguinte modelo:

se <condio> ento
inicio // inicio do bloco verdade
C1;
C2; // seqncia de comandos
.
.
Cn;
fim; //fim do bloco verdade
fimse;

Se <condio> for verdadeira, ento, o bloco verdade (seqncia de comandos C1 . . . Cn)
ser executado; caso contrrio (<condio> for falsa), nada executado, encerrando-se a seleo
(fimse). A existncia do bloco (demarcado por inicio e fim) necessria devido existncia de um
conjunto de aes primitivas sob a mesma clusula ento.
Em Java esta estrutura possui as seguintes sintaxes:

a) if (<condio>)
C; // comando nico (ao primitiva)
b) if (<condio>) { // inicio do bloco verdade
C1;
30
C2; // seqncia de comandos
.
.
Cn;
} //fim do bloco verdade

Observe que a condio deve sempre aparecer entre parnteses, item obrigatrio na
linguagem Java.

Exemplo: Construa um algoritmo que calcule a mdia aritmtica entre quatro notas semestrais
quaisquer fornecidas por um aluno (usurio). O programa deve informar, caso o aluno obtenha nota
maior ou igual a seis, o programa dever emitir a mensagem Aluno aprovado.

a) algoritmo em pseudocdigo
inicio
//declarao de variveis
n1,n2,n3,n4,ma:real;
leia(n1,n2,n3,n4); //entrada de dados
ma := (n1+n2+n3+n4)/4; //processamento
escreva(ma); //sada de dados
se (ma >= 6) ento
escreva(aluno aprovado);
fimse;
fim.

b) programa em Java

class CalcMedia {
public static void main(String args[]){
double n1,n2,n3,n4,ma;
n1 = Double.parseDouble(args[0]);
n2 = Double.parseDouble(args[1]);
n3 = Double.parseDouble(args[2]);
n4 = Double.parseDouble(args[3]);
ma = (n1+n2+n3+n4)/4;
System.out.println("A media anual e: "+media);
if (ma >= 6)
System.out.println("Aluno aprovado");
}
}


Seleo Composta

Quando tivermos situaes em que duas alternativas dependem de uma mesma condio,
uma das condies ser verdadeira e outra condio ser falsa, usamos a estrutura de seleo
composta. Supondo que um conjunto de aes dependa da avaliao verdadeiro e uma nica ao
primitiva dependa da avaliao falso, usaremos uma estrutura de seleo semelhante ao seguinte
modelo:

se <condio> ento
inicio // inicio do bloco verdade
C1;
C2; // seqncia de comandos
.
.
Cn;
fim; //fim do bloco verdade
seno
C; //ao primitiva
fimse;

31
Observamos que a existncia do bloco verdade continua, sendo que este ser executado
caso <condio> (expresso lgica) seja verdadeiro; porm, a seleo agora composta, pois, caso
o resultado seja falso, teremos a execuo do comando C (ao primitiva) que segue a clusula
seno.

Em Java esta estrutura possui a seguinte sintaxe:

if (<condio>) { // inicio do bloco verdade
C1;
C2; // seqncia de comandos
.
.
Cn;
} //fim do bloco verdade
else
C;

Assim como a maioria das instrues Java, o conjunto if else deve ser utilizado em
minsculas e caso haja apenas uma instruo a ser executada, tanto no if como no else, o uso das
chaves se faz desnecessrio. Lembre-se de que as chaves so utilizadas quando se necessita que
um bloco de instrues seja executado.

Exemplo: Construa um algoritmo que calcule a mdia aritmtica entre quatro notas semestrais
quaisquer fornecidas por um aluno (usurio). O programa deve informar, caso o aluno obtenha nota
maior ou igual a seis, o programa dever emitir a mensagem Aluno aprovado, caso contrrio, Aluno
reprovado.

a) algoritmo em pseudocdigo
inicio
//declarao de variveis
n1,n2,n3,n4,ma:real;
leia(n1,n2,n3,n4); //entrada de dados
ma := (n1+n2+n3+n4)/4; //processamento
escreva(ma); //sada de dados
se (ma >= 6) ento
escreva(aluno aprovado);
senao
escreva(aluno reprovado);
fimse;
fim.

b) programa em Java

class CalcMedia {
public static void main(String args[]){
double n1,n2,n3,n4,ma;
n1 = Double.parseDouble(args[0]);
n2 = Double.parseDouble(args[1]);
n3 = Double.parseDouble(args[2]);
n4 = Double.parseDouble(args[3]);
ma = (n1+n2+n3+n4)/4;
System.out.println("A media anual e: "+media);
if (ma >= 6)
System.out.println("Aluno aprovado!, Parabns!");
else
System.out.println("Aluno reprovado!, Estude mais! ");
}
}





32
Seleo Encadeada

Quando, devido necessidade de processamento, agruparmos vrias selees, formaremos
uma seleo encadeada. Normalmente, tal formao ocorre quando uma determinada ao ou bloco
deve ser executado se um grande conjunto de possibilidades ou combinaes de situaes for
satisfeita.

Seleo encadeada Heterognea

Podemos construir uma estrutura de seleo de diversas formas, sendo que, ao
encadearmos vrias selees, as diferentes possibilidades de construo tendem a um nmero
elevado.
Quando no conseguimos identificar um padro lgico de construo em uma estrutura de
seleo encadeada, dizemos que esta uma estrutura de seleo encadeada heterognea.

se <condio1> ento
se <condio2> ento
inicio // bloco verdade1
C1;
C2; // seqncia de comandos
.
.
Cn;
fim; //bloco verdade1
fimse;
seno
se <condio3> ento
inicio // bloco verdade2
C1;
C2; // seqncia de comandos
.
.
Cn;
fim; //bloco verdade2
seno
se <condio4> ento
se <condio5> ento
CV; // comando verdade
fimse;
seno
CF; //comando verdade
fimse;
fimse;
fimse;

Podemos resumir todas as variaes possveis da seleo encadeada do modelo anterior em
uma tabela de deciso, conforme a tabela abaixo:

Condo 1 Condo 2 Condo 3 Condo 4 Condo 5 Ao executada
V V - - - Ioco verdade1
F - V - - Ioco verdade2
F - F V V Comando verdadeIro
F - F F - Comando faIso

Exemplo: Dados trs valores A, B e C, verificar se eles podem ser os comprimentos dos lados de
um tringulo e, se forem, verificar se compem um tringulo equiltero, issceles ou escaleno.
Informar se no compuserem nenhum tringulo.

a) algoritmo em pseudocdigo
33
inicio
a,b,c:inteiro;
leia(a,b,c);
se ((a < b + c) e (b < a + c) e (c < a + b)) ento
se (a = b) e (b = c) ento
escreva(Tringulo equiltero);
seno
se ((a = b) ou (a = c) ou (b = c)) ento
escreva(Tringulo issceles);
seno
escreva(Tringulo escaleno);
fimse;

seno
escreva(Estes valores no formam um tringulo);
fimse;
fim.

b) programa em Java

class triangulo{
public static void main(String args[]){
int a,b,c;
a = Integer.parseInt(args[0]);
b = Integer.parseInt(args[1]);
c = Integer.parseInt(args[2]);
if ((a < b + c)&&(b < a + c) && (c < a + b)){
if ((a == b) && (b == c))
System.out.println("Triangulo equilatero");
else
if ((a == b) || (a == c) || (b == c))
System.out.println("Triangulo isosceles");
}
else
System.out.println("Os lados nao formam um triangulo");
}
}

Seleo encadeada Homognea

Chamamos de seleo encadeada homognea a construo de diversas estruturas de
seleo encadeada que seguem um determinado padro lgico.

Se Ento se
Vamos supor que, em um dado algoritmo, um comando genrico W deva ser executado
apenas quando forem satisfeitas as condies <condio1>, <condio2>. <condio3> e
<condio4>. Teramos:

se <condio1> ento
se <condio2> ento
se <condio3> ento
se <condio4> ento
W;
fimse;
fimse;
fimse;
fimse;

Esta construo segue um padro. Aps cada ento existe outro se, e no existem senes;
temos uma estrutura homognea. Outro fato importante que o comando W s ser executado
quando todas as condies forem ao mesmo tempo verdadeiras; portanto, seria equivalente a
escrever, simplificadamente:

34
se <condio1> e <condio2> e <condio3> e <condio4> ento
W;
fimse;

A tabela abaixo expressa nitidamente a necessidade de todas as condies serem
verdadeiras, simultaneamente:

Condo1 Condo2 Condo3 Condo4 Ao executada
V V V V W

Se seno se

Vamos supor que em determinado algoritmo uma varivel X possa assumir apenas quatro
valores, sendo eles V1, V2, V3, V4, e que exista um comando diferente que ser executado para
cada valor armazenado em X.
Teremos, por exemplo, a seguinte situao:

se (X = V1) ento
C1;
fimse;
se (X = V2) ento
C2;
fimse;
se (X = V3) ento
C3;
fimse;
se (X = V4) ento
C4;
fimse;

A tabela de deciso para o exemplo :

X = V1 X = V2 X = V3 X = V4 Ao
V F F F C1
F V F F C2
F F V F C3
F F F V C4

Somente um e apenas um, comando pode ser executado, isto , trata-se de uma situao
excludente (se X igual a V3, no igual a V1, nem a V2, nem a V4).
No se trata de uma estrutura encadeada, pois as selees no esto interligadas. Por isso
todas as condies (X = Vn) sero avaliadas e ocorrero testes desnecessrios. Para melhorar a
performance dessa estrutura, podemos transform-la em um conjunto de selees encadeadas,
conforme o seguinte modelo:

se (X = V1) ento
C1;
seno se (X = V2) ento
C2;
seno se (X = V3) ento
C3;
seno se (X = V4) ento
C4;
fimse;
fimse;
fimse;
fimse;

Essa nova estrutura de seleo gera a tabela de deciso mostrada abaixo:
35

X = V1 X = V2 X = V3 X = V4 Ao
V - - - C1
F V - - C2
F F V - C3
F F F V C4

Nessa estrutura, o nmero mdio de testes a serem executados foi reduzido. Se o contedo
de X for igual a V2, sero executados apenas dois testes (X = V1) e (X = V2) e um comando (C2),
enquanto na estrutura anterior seriam inspecionados quatro condies, embora um nico comando
(C2) tenha sido executado.
Essa construo segue um padro, aps cada seno existe outro comando se e depois do
ento existe uma ao qualquer (que no seja outra seleo), compondo uma estrutura tpica que
denominaremos se-seno-se.
Por constituir um encadeamento homogneo, pode ser simplificado, e para tal utilizaremos
uma nova estrutura, a seleo de mltipla escolha.


Seleo de mltipla escolha

Quando um conjunto de valores discretos precisa ser testado e aes diferentes so
associadas a esses valores, estamos diante de uma seleo encadeada homognea do tipo se-
seno-se. Como esta situao bastante freqente na construo de algoritmos que dependem de
alternativas, utilizaremos uma estrutura especfica para estes casos, a seleo de mltipla escolha.
O modelo que expressa as possibilidades do exemplo anterior o seguinte:

escolha x
caso V1: C1;
caso V2: C2;
caso V3: C3;
caso V4: C4;
.
.
.
caso Vn:Cn
fimescolha;

Caso o contedo da varivel X seja igual ao valor de Vn, ento, o comando Cn ser
executado; caso contrrio, sero inspecionados os outros casos at ser encontrada uma igualdade ou
terminarem os casos.
Para executarmos um comando que possui mais de um valor em que se verifica sua
necessidade, agrupamos todos esses valores em um nico caso. E, para executarmos um comando
que se verifica com todos os outros valores, exceto os discriminados caso a caso, inclumos outra
situao: caso contrrio.
O exemplo genrico a seguir mostra uma estrutura de seleo encadeada homognea se-
seno-se:

se (X = V1) ento
C1;
seno se (X = V2) ento
C2;
seno se (X = V3) ento
C2;
seno se (X = V4) ento
C3;
seno se (X = V5) ento
C4;
seno
C5;
fimse;
36
fimse;
fimse;
fimse;
fimse;

que ao ser reescrita utilizando a estrutura de mltipla escolha fica da seguinte maneira:
escolha x
caso V1: C1;
caso V2,V3: C2;
caso V4: C3;
caso V5: C4;
caso contrrio:C5;
fimescolha;



Exemplos:

1. Construa um algoritmo que, tendo como dados de entrada o preo de um produto e seu cdigo de
origem, mostre o preo junto de sua procedncia. Caso o cdigo no seja nenhum dos
especificados, o produto deve ser encarado como importado. Siga a tabela de cdigo a seguir:
Cdyo de oryem Procednca
1 sul
2 norte
J leste
4 oeste
5 ou 6 nordeste
7,8 ou 9 sudeste
10 Centrooeste
25 nordeste

2. Crie um programa que receba pelo teclado (use DataInputStream) o valor de um produto e um
cdigo de aumento, segundo a tabela seguinte:
Cdyo X aumento
1 15
J 20
4 J5
8 40
Utilizando a estrutura switch-case, mostre na tela o novo valor do produto depois de
acrescida a porcentagem correspondente. Realize tambm o
controle dos possveis erros que podem ocorrer durante a execuo do
programa.

3) Faa um aplicativo que receba trs nmeros inteiros na linha de comando e mostre o maior dentre
eles.
4) Crie um programa para clculo do salrio lquido em que trs valores devem ser informados pelo
usurio na linha de comando: a quantidade de horas trabalhadas, o salrio hora e o nmero de
dependentes. O programa deve mostrar na tela as informaes contidas no lado esquerdo da
tabela seguinte. Os clculos correspondentes aparecem no lado direito.
lnjormao Clculo
SalrIo bruto Horas trabalhadas * salrIo hora + (50*n dependentes)
37
lnjormao Clculo
0esconto NSS se salrIo bruto = 1000
NSS = salrIo bruto*8.5/100
se salrIo bruto 1000
NSS = salrIo bruto *9/100
0esconto F se salrIo bruto = 500
F = 0
se salrIo bruto 500 e = 1000
F = salrIo bruto *5/100
se salrIo bruto 1000
F = salrIo bruto *7/100
SalrIo LiquIdo SalrIo bruto - NSS F

5) A empresa XKW Ltda. Concedeu um bnus de 20 por cento do valor do salrio a todos os
funcionrios com tempo de trabalho na empresa igual ou superior a cinco anos e dez por cento
aos demais. Calcular e exibir o valor do bnus.


Algoritmos Resolvidos
1)
inicio
//declarao de variveis
preco:real;
origem:inteiro;
leia(preco,origem);
escolha origem
caso 1: escreva(preco, - produto do Sul);
caso 2: escreva(preco, - produto do Norte);
caso 3: escreva(preco, - produto do Leste);
caso 4: escreva(preco, - produto do Oeste);
caso 7.8,9: escreva(preco, - produto do Sudestel);
caso 10: escreva(preco, - produto do Centro-Oeste);
caso 5,6,25: escreva(preco, - produto do Nordeste);
caso contrario: escreva(preco, - produto importado);
fimescolha;
fim.

4)

inicio
//declarao de variveis
salario, bonus :real;
tempo:inteiro;
leia(salario, tempo);
se(tempo >=5) ento
bonus = salario*0.20;
seno
bonus = salario*0.10;
fimse;
escreva(O valor do bonus e: , bonus);
fim.

Solues em Java:

1)
import java.io.*;
class ExSelecao4{
public static void main(String args[]){
BufferedReader entrada;
entrada = new BufferedReader (new InputStreamReader (System.in));
38
double preco;
int origem;
try{
System.out.println("Entre com o preo do produto:");
preco = Double.parseDouble(entrada.readLine());

System.out.println("Entre com o codigo de origem:");
origem = Integer.parseInt(entrada.readLine());

switch(origem){
case 1:System.out.println("R$ " +preco + " - produto do
Sul");break;
case 2:System.out.println("R$ " +preco + " - produto do
Norte");break;
case 3:System.out.println("R$ " +preco + " - produto do
Leste");break;
case 4:System.out.println("R$ " +preco + " - produto do
Oeste");break;
case 7:
case 8:
case 9:System.out.println("R$ " +preco + " - produto do
Sudeste");break;
case 10:System.out.println("R$ " +preco + " - produto do Centro-
Oeste");break;
case 5:
case 6:
case 25:System.out.println("R$ " +preco + " - produto do
Nordeste");break;
default: System.out.println("R$ " +preco +"Produto importado");
}
}
catch(Exception e)
{
System.out.println("Houve erro durante a leitura");
}
}
}



2)
import java.io.*;
class ExSelecao1{
public static void main(String args[]){
String s = " ";
float valor = 0;
int codigo;
DataInputStream dado;
try{
System.out.println("Entre com o valor do produto:");
dado = new DataInputStream(System.in);
s = dado.readLine();
valor = Float.parseFloat(s);

System.out.println("Entre com o codigo do aumento:");
dado = new DataInputStream(System.in);
s = dado.readLine();
codigo = Integer.parseInt(s);

switch(codigo){
case 1:System.out.println("O valor com o aumento e:
"+(valor+(valor*0.15)));break;
case 3:System.out.println("O valor com o aumento e:
"+(valor+(valor*0.20)));break;
case 4:System.out.println("O valor com o aumento e:
"+(valor+(valor*0.35)));break;
39
case 8:System.out.println("O valor com o aumento e:
"+(valor+(valor*0.40)));break;
default: System.out.println("Codigo invalido");
}
}
catch(IOException e)
{
System.out.println("Houve erro na entrada de dados");
}
catch(NumberFormatException e)
{
System.out.println("Houve erro na conversao, digite apenas
caracteres numericos");
}
}
}

3)
class ExSelecao2{
public static void main(String args[]){
int a,b,c,aux;
a = Integer.parseInt(args[0]);
b = Integer.parseInt(args[1]);
c = Integer.parseInt(args[2]);
if(a>b){
aux = a;
a = b;
b = aux;
}
if(a>c){
aux = a;
a = c;
c = aux;
}
if(b>c){
aux = b;
b = c;
c = aux;
}
System.out.println(" "+a+ " " +b+ " "+c);
}
}

3)

import java.io.*;
class ExSelecao3{
public static void main(String args[]){
BufferedReader entrada;
entrada = new BufferedReader (new InputStreamReader (System.in));
double HT, SH, ND,Sal_Bruto, INSS=0, IR=0, Sal_Liquido;
try{
System.out.println("Entre com a quantidade de horas trabalhadas:");
HT = Double.parseDouble(entrada.readLine());

System.out.println("Entre com o valor da hora trabalhada:");
SH = Double.parseDouble(entrada.readLine());

System.out.println("Entre com o numero de dependentes:");
ND = Double.parseDouble(entrada.readLine());

//calculo do salario bruto

Sal_Bruto = HT * SH + (50*ND);

//calculo do INSS
if(Sal_Bruto <=1000)
40
INSS = Sal_Bruto*8.5/100;
if(Sal_Bruto >1000)
INSS = Sal_Bruto*9/100;

//calculo do Imposto de Renda
if(Sal_Bruto <=500)
IR = 0;
if((Sal_Bruto >500)&&(Sal_Bruto <=1000))
IR = Sal_Bruto*5/100;
if(Sal_Bruto >1000)
IR = Sal_Bruto*7/100;

//Calculo do salario liquido
Sal_Liquido = Sal_Bruto - INSS - IR;

//Impresso do resultado
System.out.println("O salario bruto e de: " +Sal_Bruto);
System.out.println("O Desconto de INSS foi de: " +INSS);
System.out.println("O Desconto de IR foi de: " +IR);
System.out.println("O salario Liquido e de: " +Sal_Liquido);


}
catch(Exception e)
{
System.out.println("Houve erro durante a leitura");
}
}
}

+)

import java.io.*;
class ExSelecao4{
public static void main(String args[]){
BufferedReader entrada;
entrada = new BufferedReader(new InputStreamReader(System.in));
float salario,bonus;
int tempo;

try{
System.out.println("Entre com o salario:");
salario = Float.parseFloat(entrada.readLine());
System.out.println("Quanto tempo esta na empresa?");
tempo = Integer.parseInt(entrada.readLine());
if(tempo >=5)
bonus = salario*0.20f;
else
bonus = salario*0.10f;
System.out.println("O valor do bonus e: "+ bonus);
}catch(IOException e){
System.out.println("Ocorreu erro durante a leitura");
}
}

}

Exerccios de fixao - Estrutura de seleo

1) Faa um programa que receba quatro notas de um aluno, calcule e imprima a mdia aritmtica
das notas e a mensagem de aprovado para mdia superior ou igual a 7.0 ou a mensagem de
reprovado para mdia inferior a 7.0.
2) Uma empresa decide dar um aumento de 30% aos funcionrios cujo salrio inferiora 500 reais.
Escreva um programa que receba o salrio de um funcionrio e imprima o valor do salrio
reajustado ou uma mensagem caso o funcionrio no tenha direito ao aumento.
41
3) Faa um programa que verifique a validade de uma senha fornecida pelo usurio. A senha um
conjunto de caracteres que so: 'ASDFG'. O programa deve imprimir mensagem de permisso ou
negao de acesso.
4) Faa um programa que receba a idade de uma pessoa e imprima mensagem de maioridade ou
no.
5) Faa um programa que calcule e imprima o salrio reajustado de um funcionrio de acordo com a
seguinte regra:
salrios at 300, reajuste de 50%;
salrios maiores que 300, reajuste de 30%.
6) Faa um programa que receba a altura e o sexo de uma pessoa, calcule e imprima o seu peso
ideal, utilizando as seguintes frmulas:
para homens: (72.7 * H) - 58;
para mulheres: (62.1 * H) 44.7.
7) Faa um programa que receba a idade de um nadador e imprima a sua categoria seguindo as
regras:

categoria idade
infantil A 5 7 anos
infantil B 8 10 anos
juvenil A 11 13 anos
juvenil B 14 17 anos
snior maiores de 18 anos

8) No curso de Desenvolvimento de Software, a nota final do estudante calculada a partir de 3
notas atribudas respectivamente a um trabalho de laboratrio, a uma avaliao semestral e a um
exame final. As notas variam de 0 a 10 e a nota final mdia ponderada das 3 notas
mencionadas. A tabela a seguir fornece os pesos das notas:
Laboratrio - peso 2
Av. Semestral - peso 3
Exame final - peso 5
Faa um programa que receba as 3 notas do estudante, calcule e imprima a
mdia final e o conceito desse estudante.
O conceito segue a tabela abaixo:
mdia final conceito
8.0 |__| 10.0 A
7.0 |__ 8.0 B
6.0 |__ 7.0 C
5.0 |__ 6.0 D
< 5.0 E

9) Faa um programa que receba o preo de um produto e o seu cdigo de orgem e imprima a sua
procedncia. A procedncia obedece a seguinte tabela:
Cdigo Procedncia
1 Sul
2 Norte
3 Leste
4 Oeste
5 ou 6 Nordeste
7.8 ou 9 Sudeste
10 at 20 Centro-Oeste
21 at 30 Nordeste

10) Faa um programa que receba um nmero, verifique se este nmero par ou mpar e
imprima a mensagem.
11) Faa um programa que receba dois nmeros e imprima o menor dos dois.
12) Faa um programa que receba trs notas de um aluno, calcule e imprima a mdia aritmtica
entre essas trs notas e uma mensagem que segue a tabela abaixo:
Mdia Mensagem
0.0 |__ 5.0 reprovado
5.0 |__ 7.0 exame
7.0 |__| 10.0 aprovado

42
13) Faa um programa que receba a idade de uma pessoa e classifique-a seguindo o critrio a
seguir:
dade Classjcao
0 a 2 anos FecmnascIdo
J a 11 anos crIana
12 a 19 anos adolescente
20 a 55 anos adulto
AcIma de 55 anos Idoso

14) Faa um programa que receba o cdigo correspondente ao cargo de um funcionrio e
imprima seu cargo e o percentual de aumento ao qual este funcionrio tem direito seguindo a
tabela:
Cdyo Caryo Percentual
1 EscrIturrIo 50,00
2 SecretrIo J5,00
J CaIxa 20,00
4 Cerente 10,00
5 0Iretor No tem aumento

15) Faa um programa que mostre um menu com as seguintes opes:
soma
raiz quadrada
finalizar
O programa deve receber a opo desejada, receber os dados necessrios para a
operao de cada opo, realizar a operao e imprimir o resultado. Na opo
finalizar nada deve acontecer.

16) Uma companhia de seguros tem trs categorias de seguros baseadas na idade e na
ocupao do segurado. Somente pessoas com pelo menos 18 anos e no mais de 70 anos podem
adquirir aplices de seguros. Quanto s classes de ocupaes foram definidos trs grupos de
risco. A tabela a seguir fornece as categorias em funo da caixa de idade e do grupo de risco:

Cruo de rsco
dade
aIxo hdIo AIto
18 a 24 7 8 9
25 a 40 4 5 6
41 a 70 1 2 J

Faa um programa que receba a idade e o grupo de risco (b, m ou a) e
determine e imprima o cdigo do seguro.

17) Faa um programa que receba a medida de um ngulo em graus, um nmero inteiro.
Determine e imprima o quadrante em que se localiza este ngulo. Considere os quadrantes
abaixo:
ngulo Quadrante
0 |__ 90 1 quadrante
90 |__ 180 2 quadrante
180 |__ 270 3 quadrante
270 |__ 360 4 quadrante
0 __ -90 1 quadrante
43
ngulo Quadrante
-90 |__ -180 2 quadrante
-180 |__ -270 3 quadrante
-270 |__| -360 4 quadrante
Para ngulos maiores que 360 graus, reduza ao intervalo de 0 a 360.

18) Uma empresa decidiu dar uma gratificao de Natal aos seus funcionrios, baseada no
nmero de horas extras e no nmero de horas que o funcionrio faltou ao trabalho. O valor do
prmio obtido pela consulta na tabela a seguir, em que:
H = (nmero de horas extras) (2/3*(nmero de horas-falta))

H (mnutos) Prmo ($)
240 500
1800 __ 2400 400
1200 __ 1800 J00
600 __ 1200 200
= 600 100
Faa um programa que receba o nmero de horas extras e o nmero de
horas- falta em minutos de um funcionrio. Imprima o nmero de horas
extras em horas, o nmero de horas, o nmero de horas-falta em horas e o
valor do prmio.
19) Faa um programa que receba o valor do salrio mnimo, o nmero de horas trabalhadas, o
nmero de dependentes do funcionrio e a quantidade de horas extras trabalhadas. Calcule e
imprima o salrio a receber do funcionrio seguindo as regras abaixo:
o valor da hora trabalhada igual a 1/5 do salrio mnimo;
o salrio do ms igual ao nmero de horas trabalhadas vezes o valor da hora
trabalhada;
para cada dependente acrscimo de 32 reais;
para cada hora extra trabalhada o clculo do valor da hora trabalhada acrescida de 50%;
o salrio bruto igual ao salrio do ms mais os valores dos dependentes mais os
valores das horas extras;
o clculo do valor do imposto de renda retido na fonte segue a tabela abaixo:
lRRF Salro bruto
Isento nferIor a 200
10,00 de 200 at 500
20,00 superIor a 500

o salrio lquido igual ao salrio bruto menos IRRF;
a gratificao segue a prxima tabela:
Salrio lquido Gratificao
At 350 100 reais
Superior a 350 50 reais

o salrio a receber do funcionrio igual ao salrio lquido mais a gratificao.
20) Faa um programa para resolver equaes do 2 grau.
21) Faa um programa que receba uma frase, conte e imprima o nmero de vogais desta frase.
22) Faa um programa que receba uma frase, conte e imprima o nmero de palavras desta frase.
23) Faa um programa que receba uma frase, conte e imprima a quantidade de vezes em que
aparece a palavra aula.
24) Escreva um programa que leia trs valores inteiros e mostre-os em ordem crescente.
25) Escreva um programa que calcule o que deve ser pago por um produto, considerando o preo
normal de etiqueta e a escolha da condio de pagamento. Utilize os cdigos da tabela a seguir
para ler qual a condio de pagamento escolhida e efetuar o clculo adequado:
Cdyo Condo de ayamento
44
Cdyo Condo de ayamento
1 A vIsta em dInheIro ou cheque, recebe 10 de desconto.
2 A vIsta no carto de crdIto, recebe 5 de desconto.
J Em 2 vezes, preo normal de etIqueta sem juros.
4 Em J vezes, preo normal de etIqueta maIs juros de 10.

26) Escreva um programa que leia o valor de dois nmeros inteiros e a operao aritmtica
desejada: calcule, ento, a reposta adequada. Utilize os smbolos da tabela a seguir para ler qual
a operao aritmtica escolhida:
Smbolo 0erao artmtca
+ adIo
subtrao
* multIplIcao
/ dIvIso

27) Construa um programa que seja capaz de concluir qual dentre os seguintes animais foi
escolhido, atravs de perguntas e respostas. Animais possveis: leo, cavalo, homem, macaco,
morcego, baleia, avestruz, pinguim, pato, guia, tartaruga, crocodilo e cobra.
Exemplo:
mamfero? Sim
quadrpede? Sim
carnvoro? No
herbvoro? Sim
ento o animal escolhido foi o cavalo
utilize as seguintes classificaes:
Carnvoro Leo
Quadrpede
Herbvoro Cavalo

Mamferos Onvoro Homem
Bpede
Frutferos Macaco

Voadores Morcego
Aquticos Baleia

Tropical Avestruz
No-voadoras
Polar Pinguim
Aves
Nadadoras Pato
De rapina guia

Com casco Tartaruga
Rpteis Carnvoro Crocodilo
Sem patas cobra


45
28. O que ser impresso depois de executado o seguinte algoritmo:
a) num = 20
b) num = -3
c) num = 0

leia(num)
se num > 0 ento
quale = 'NUMERO POSITIVO'
seno
se num < 0 ento
quale = 'NUMERO NEGATIVO'
seno
quale = 'zero';
fim se;
fim se;
escreva(quale);


29. Verificar se dados trs valores inteiros quaisquer os mesmo formam um tringulo. Se formar
informar o tipo, caso contrrio, informar que os lados no formam um tringulo.
30. Efetuar a leitura de quatro nmero e apresentar os nmeros que so divisveis por 2 e 3.



Estruturas de repetio

Imaginemos a situao problema de construir um algoritmo para calcular a mdia aritmtica
de 50 alunos de uma turma. Como visto anteriormente, podemos solucionar este problema
escrevendo o algoritmo da seo anterior uma vez para cada aluno. Ou seja, no caso dos 50 alunos,
teramos de escrev-lo 50 vezes. Trata-se de uma soluo simples, porm invivel.
Outro modo de resolver essa questo seria utilizar a mesma seqencia de comandos
novamente, ou seja, teramos de realizar um retrocesso ao incio dos comandos para cada aluno,
fazendo, portanto, com que fluxo de execuo repetisse certo trecho do algoritmo, o que nesta
aplicao corresponderia a repetir o mesmo trecho 50 vezes, sem, no entanto, ter de escrev-lo 50
vezes.
A esses trechos de algoritmos que so repetidos damos o nome de laos de repetio. O
nmero de repeties pode ser indeterminado, porm, necessariamente finito.
Para construir um lao finito, podemos proceder de dois modos:

calcular mdia enquanto a quantidade de mdias calculadas for menor ou igual a 50;
calcular a mdia at que o nmero de mdias calculadas atinja 50.


Repetio com teste no incio

Consiste em uma estrutura de controle de fluxo que permite repetir diversas vezes um mesmo
trecho de algoritmo, porm, sempre verificando antes de cada execuo se permitido executar o
mesmo trecho.
Para realizar a repetio com teste no incio, utilizamos a estrutura enquanto, que permite
que um bloco ou uma ao primitiva seja repetida enquanto uma determinada <condio> for
verdadeira. O modelo genrico deste tipo de repetio o seguinte:

a) em pseudocdigo
enquanto <condio> faa
C1;
C2;
.
.
.
Cn;
fimenquanto;

46
b) em Java

while(<condicao>){
}

Quando o resultado de <condio> for falso, o comando de repetio abandonado. Se j da
primeira vez o resultado falso, os comandos no so executados nenhuma vez, o que representa a
caracterstica principal desse modelo de repetio.
Para exemplificar, voltemos ao problema da mdia da turma de 50 alunos. Em primeiro lugar
devemos pensar na condio. No caso desse problema a condio seria que ele calcularia enquanto
as quantidades de mdias fossem inferiores ou iguais a 50. Para isso precisamos contar as vezes em
que foi realizado o clculo. Porm a estrutura enquanto no possui este recurso; portanto, devemos
estabelecer um modo de contagem, o que pode ser feito atravs de um contador representado por
uma varivel com um dado valor inicial, o qual incrementado a cada repetio.

inicio
//declarao de variveis
n1,n2,n3,n4,ma:real;
con:inteiro;

con = 0; //inicializacao do contador
enquanto (con < 50) faa //teste da condio de parada
leia(n1,n2,n3,n4); //entrada de dados
ma = (n1+n2+n3+n4)/4; //calculo da media
escreva(Media anual = , MA);
se (MA >= 6) entao
escreva(Aluno aprovado! - parabns);
seno
escreva(Aluno reprovado! - estude mais);
fimse;
con = con + 1; //incrementar o contador em 1
fimenquanto;
fim.

Devemos observar que contador CON foi inicializado com o valor 0 antes do lao, e que cada
iterao era incrementado em um.
Em uma variao do algoritmo acima, poderamos calcular a mdia geral da turma, que seria
a mdia aritmtica das 50 mdias anuais, utilizando uma expresso aritmtica, como mostrado
abaixo:

(M1+M2+M3+M5+ . . . + M49 + M50)/50

o que se torna invivel. Podemos utilizar nessa situao as vantagens da estrutura de repetio.
Fazendo um lao que cada execuo acumule em uma varivel, conhecida conceitualmente como
acumulador, o somatrio das mdias anuais de cada aluno. Aps o trmino da repetio, teramos a
soma de todas as mdias de acumulao, restando apenas divid-la pela quantidade de mdias
somadas (50).
Uma soluo para o algoritmo que deve ler a nota de 50 alunos e calcular a mdia aritmtica
da turma seria:

inicio
//declarao de variveis
ma,acm,mat:real;
con:inteiro;

con = 0; //inicializacao do contador
acm = 0;// inicializando o acumulador
enquanto (con < 50) faa //teste da condio de parada
leia(MA); //entrada de dados
acm = acm + ma; //soma em ACM dos valores lidos em MA
con = con + 1; //contagem do n de mdias fornecidas
fimenquanto;
47
MAT = ACM/50; //calculo da media anual da turma
escreva(Media anual da turma =, MAT);
fim.


O algoritmo acima utiliza um pr-conhecimento da quantidade de alunos da turma da qual se
desejava a mdia geral. Se no soubssemos quantos eram os alunos, o que faramos para controlar
o lao de repetio? Teramos de encontrar outro critrio de parada, o que pode ser feito utilizando
um valor predefinido como finalizador de uma seqencia de valores.
Para aplicar tal conceito ao algoritmo da mdia geral da turma, usaremos como finalizador o
valor -1, que quando encontrado encerra o lao sem ter seu valor computado ao acumulador.

inicio
//declarao de variveis
ma, acm, mat:real;
con:inteiro;

con = 0; //inicializacao do contador
acm = 0;// inicializando o acumulador
leia(MA);
enquanto (MA <> -1) faa //teste da condio de parada
acm = acm + ma; //soma em ACM dos valores lidos em MA
leia(MA);
con = con + 1; //contagem do n de mdias fornecidas
fimenquanto;
MAT = ACM/CON; //calculo da media anual da turma
escreva(Media anual da turma =, MAT);
fim.

Devemos observar que o contador CON inicia em 0 e que a leitura da primeira mdia anual
MA acontece antes do lao de repetio. Aps a leitura da segunda mdia, o contador incrementa em
um, estando, portanto, sempre defasado em uma unidade do nmero total de leituras, o que garante
q no influncia da leitura do finalizador -1 no clculo da mdia da turma.

Exemplo:
Construa um algoritmo que calcule a mdia aritmtica de um conjunto de nmeros pares que forem
fornecidos pelo usurio. O valor de finalizao ser a entrada do nmero 0.

a) pseudocdigo

inicio
//declarao de variveis
n,con, acm:inteiro;
mnp : real;

con = 0; //inicializacao do contador
acm = 0;// inicializando o acumulador
leia(n); //l o primeiro nmero
enquanto (n <> 0) faa //teste da condio de parada
se ((n mod 2) == 0) ento
acm = acm + n; //acumula em ACM a soma dos n pares
con = con + 1; //contagem dos n pares
fimse;
leia(n);
fimenquanto;
se (cont >0) ento //houve ns pares, pelo menos um
mnp = acm/con; //calcula a mdia dos ns pares
escreva(Media : , mnp);
seno //nenhum par
escreva(Nenhum par foi fornecido!);
fimse;
fim.
48

Repetio com teste no final

Para realizar a repetio com teste no final, utilizamos a estrutura repita, que permite que um
bloco ou ao primitiva seja repetido at que uma determinada condio seja verdadeira. O modelo
genrico deste tipo de repetio o seguinte:

repita
C1;
C2;
.
.
.
Cn;
at <condio>;

Pela sintaxe da estrutura, que o bloco (C1...Cn) executado pelo menos uma vez,
independente da validade da condio. Isto ocorre porque a inspeo da condio feita aps a
execuo do bloco, o que representa a caracterstica principal desse modelo de repetio.

Exemplos:
1) Reescreva o algoritmo das mdias usando acumulador, que l a mdia anual de 50 alunos e
calcula a mdia geral da turma, e utilizando a estrutura de repetio com teste no final, teramos:

a) pseudocdigo

inicio
//declarao de variveis
ma,acm,mat:real;
con:inteiro;

con = 0; //inicializacao do contador
acm = 0;// inicializando o acumulador
repita
leia(MA); //entrada de dados
acm = acm + ma; //soma em ACM dos valores lidos em MA
con = con + 1; //contagem do n de mdias fornecidas
at (con >= 50); //teste da condio de parada
MAT = ACM/50; //calculo da media anual da turma
escreva(Media anual da turma =, MAT);
fim.

b) programa em Java



2) Construa um algoritmo que permita fazer um levantamento do estoque de vinho de uma adega,
tendo como dados de entrada tipos de vinho, sendo: T para tinto, B para branco e R para ros.
Especifique a porcentagem de cada tipo sobre o total geral de vinhos; a quantidade de vinhos
desconhecida, utilize como finalizador F de fim.

a) pseudocdigo

inicio
//declarao de variveis
tv: inteiro;
pt,pb,pr:real;
conv, ct,cb,cr:inteiro;
//inicializao dos vrios contadores
conv = 0;
ct = 0;
49
cb = 0;
cr = 0;
repita
leia(tv); //entrada de dados
escolha tv
caso '1': ct = ct + 1;
caso '2': cb = cb + 1;
caso '3': cr = cr + 1;
fimescolha;
conv = conv + 1;
at (tv = '4'); //teste da condio de parada
conv = conv 1;
se (conv > 0) ento
pt = (ct*100)/conv;
pb = (cb*100)/conv;
pr = (cr*100)/conv;
escreva(Percentual de tintos =, pt);
escreva(Percentual de brancos =, pb);
escreva(Percentual de roses =, pr);
seno
escreva(nenhum tipo de vinho foi fornecido);
fimse;
fim.

b) Programa em Java



Observaes:
alm do contador geral de vinhos (CONV), foi necessrio utilizar um contador para cada
tipo de vinho, CT, CB e CR;
uma aplicao tpica da seleo de mltipla escolha, em que cada tipo de vinho
corresponde a um caso;
aps o lao de repetio, o contador geral de vinhos foi dcrementado em um, para
descontar o finalizador F.


Repetio com varivel de controle

Nas estruturas de repetio vistas at agora, ocorrem casos em que se torna difcil
determinar o nmero de vezes em que o bloco ser executado. Sabemos que ele ser executado
enquanto uma condio for satisfeita enquanto - , ou at que uma condio seja satisfeita repita.
A estrutura para repete a execuo do bloco um nmero definido de vezes pois ela possui limites.
O modelo genrico para a estrutura de repetio para o seguinte:

para v:= vi at vf faa
C1;
C2;
.
.
.
Cn;
fimpara;

Em que:
v a varivel de controle;
vi o valor inicial da varivel v;
vf o valor final da varivel v, ou seja, o valor at o qual ela vai chegar;

Exemplos:

50
1) voltemos ao clculo da mdia aritmtica de uma turma fixa de a 50 alunos, resolvendo o problema
com a repetio para, teramos:

a) pseudocdigo

inicio
//declarao de variveis
ma,acm,mat:real;
con:inteiro;

acm = 0;// inicializando o acumulador
para con = 1 ate 50 faca
leia(MA); //entrada de dados
acm = acm + ma; //soma em ACM dos valores lidos em MA
fimpara;
MAT = ACM/50; //calculo da media anual da turma
escreva(Media anual da turma =, MAT);
fim.

b) programa em Java

2) Elabore um algoritmo que efetue a soma de todos os nmeros mpares que so mltiplos de 3 e
que se encontram no conjunto de nmeros de 1 at 500.

a) pseudocdigo

inicio
//declarao de variveis
i, si:inteiro;

si = 0;
para i = 1 ate 500 faca
se ( i mod 2 = 1) ento
se (i mod 3 = 0) ento
si = si + i;
fimse;
fimse;
fimpara;
escreva(Soma =, si);
fim.

b) programa em Java

Comparao entre estruturas de repetio

Podemos estabelecer duas observaes que relacionam a estrutura de repetio:
toda estrutura enquanto pode ser convertida para repita e vice-versa;
toda estrutura para pode ser convertida em enquanto, mas nem toda estrutura enquanto
pode ser convertida em para.

Exemplos:

1) Crie um algoritmo para que este imprima a tabuada de qualquer nmero.
OBS:o flag para as estruturas enquanto e repita -1.

a) pseudocdigo

- enquanto

inicio
//declarao de variveis
n,cont:inteiro;
51

leia(n);
enquanto (n <> -1) faa
cont = 1;// inicializando o acumulador
enquanto (cont <= 10) faa
escreva(cont, X , n, = , cont * n);
cont = cont + 1;
fimenquanto;
leia(n);
fimenquanto;
fim.

- repita

inicio
//declarao de variveis
n,cont:inteiro;

leia(n);
repita
cont = 1;// inicializando o acumulador
repita
escreva(cont, X , n, = , cont * n);
cont = cont + 1;
ate (cont > 10);
leia(n);
ate (n = -1);
fim.

- para

inicio
//declarao de variveis
n,cont:inteiro;

leia(n);
para cont = 1 ate 10 faca
escreva(cont, X , n, = , cont * n);
fimpara;
fim.

2) Veja os exemplo abaixo:

a)
class ExRepeticao10{
public static void main(String args[]){
Thread t; //cria um objeto t para o controle do tempo
t = new Thread();
t.start();
int A,B;
for(A=0;A <=10;A++){
System.out.println(A + " ");
}
System.out.println();
for(A=50;A >=0;A=A-5){
System.out.println(A + " ");
}
System.out.println();
for(A=10;A >=-10;A=A-2){
System.out.println(A + " ");
for(B=0;B<50000000;B++);
}
System.out.println();
int H,M,S; //simula um relogio digital
52
System.out.println("Para encerrar pressione CTRL+C");
for(H=0;H <24;H++)//controla as horas
for(M=0;M <60;M++)//controla os minutos
for(S=0;S <60;S++) { //controla os segundos
//exibe as horas na tela
System.out.println(H + " h: "+M+" m: "+S + " s ");
try{
t.sleep(1000);
if(S==5) System.exit(0);
}catch(InterruptedException e){
}
}
}
}

b)

class ExRepeticao11{
public static void main(String args[]){
Thread tempo;
tempo = new Thread();
tempo.start();
int A;
try{
A = Integer.parseInt(args[0]);
while(A >0){ //inicio da estrutura while
System.out.println(" "+A);
tempo.sleep(1000); //pausa de um segundo
A--;
}//fim da estrutura while

System.out.println("Fim da 1 contagem");
System.out.println(); //pula uma linha
tempo.sleep(1000);

do {//inicio da estrutura do-while
System.out.println(" "+A);
tempo.sleep(1000);
A++;
}while(A >0); //fim da estrutura do-while
System.out.println("Fim da 2 contagem");

}catch(ArrayIndexOutOfBoundsException E){ //no foi digitado
argumento
System.out.println("Digite um argumento!");

}
catch(InterruptedException E){ //interrupo do timer
System.out.println("Algo interrompeu a contagem!");

}
catch(NumberFormatException E){ //se o argumento for invalido
System.out.println("Nao foi fornecido um numero inteiro
valido!");
}
}
}


Exerccios de Fixao - Estrutura de repetio

1. Exibir a soma dos nmeros positivos no intervalo de um a cem.
2. Exibir o produto dos nmeros inteiros positivos no intervalo de um a cem.
3. Elaborar um programa que apresente no final o somatrio dos valores pares existentes entre 1 e
500.
53
4. Entrar com dois valores via teclado, onde o segundo dever ser maior que o primeiro. Caso
contrrio solicitar novamente apenas o segundo valor.
5. Fazer um programa que leia 20 idades de pessoas. Calcule e escreva a idade mdia deste grupo.
6. Fazer um programa que leia um conjunto de idades de pessoas. O final do conjunto de valores
conhecido atravs do valor -1. Calcule e escreva a idade mdia deste conjunto.
7. Fazer um programa que leia um conjunto de alturas de pessoas. O final do conjunto de valores
conhecido atravs do valor zero. Escreva a menor altura deste conjunto.
8. Fazer um programa que leia um conjunto de dados contendo o sexo e a altura de 50 pessoas.
Escreva a altura mdia das mulheres.
9. Fazer um programa que leia a nota final de 50 alunos e escreva o total de aprovados.
considerado aprovado o aluno com nota final maior ou igual a 6.
10. Fazer um programa que leia a nota final de 50 alunos e escreva:
a) o total de reprovados;
b) a nota mdia da turma;
c) a menor e maior nota da turma;
considerado aprovado o aluno com nota final maior ou igual a 6.
11. Dados trs valores a,b e c, calcular e imprimir a mdia harmnica destes valores:
mdia harmnica = 1
(1/a) + (1/b) + 1/c)

12. Elaborar um programa para ler trs valores distintos e exibir o maior deles.
13. Construir um programa que some todos os nmeros fornecidos pelo usurio at que o nmero lido
seja iguala a zero e mostre a soma.
14. Escreva um programa que escreva todos o nmeros mpares entre 100 e 200.
15. Fazer um programa que leia um conjunto de valores. Cada valor dever ser armazenado na
varivel X. Para cada valor lido calcule e escreva o valor de Y pela frmula: Y = 2.5*cos|X/2|. O
ltimo valor do conjunto de valores, cujo contedo no ser processado, dever conter um valor
negativo.
16. Escrever um programa que leia 50 valores, encontre o maior e o menor e mostre o resultado.
17. Construir um programa que leia uma quantidade desconhecida de valores, e conte quantos deles
esto no intervalo [10,20] e quantos esto fora do intervalo, escrevendo estas informaes.
18. Construir um programa que leia uma quantidade desconhecida de valores e conte quantos deles
esto nos seguintes intervalos: [0,25], [26,50], [51,75] e [76,100]. A entrada de dados deve
terminar quando for lido um nmero negativo. Mostrar o resultado final.
19. Escrever um programa que leia a matrcula do aluno e suas trs notas; calcule a mdia ponderada
do aluno, considerando que o peso para a maior nota seja 4 e para as duas restantes, 3; mostre a
matrcula do aluno, suas trs notas, a mdia calculada e uma mensagem aprovado se a mdia
for maior ou igual a 5 e Reprovado se a mdia dor menor que 5; e repita a operao at que a
matrcula lida seja zero.
20. Escreva um programa que leia um nmero no determinado de valores diferentes de zero e
calcule a mdia aritmtica dos valores lidos, a quantidade de valores positivos, a quantidade de
valores negativos e o percentual dos valores negativos e positivos. O final ser o valor lido igual a
zero. Mostrar os resultados.
21. Deseja-se fazer um levantamento a respeito da ausncia de alunos primeira prova de
programao de computadores. fornecido um conjunto de valores com as letras P ou A, para
caso o aluno estar presente ou ausente. Fazer um programa que calcule a porcentagem de
ausncia. O final do conjunto de valores conhecido atravs do valor FIM.
22. Construa um programa que, dado um conjunto de valores inteiros e positivos, determine qual o
menor e o maior valor do conjunto. O final do conjunto de valores conhecido atravs do valor -1,
que no deve ser considerado.
23. A converso de graus Farenheit para centgrados obtida pela frmula C = (5/9)*(F 32). Escreva
um programa que calcule e escreva uma tabela de graus centgrados em funo de graus
Farenheit que variam de 50 a 150 de 1 em 1.
24. Uma rainha requisitou os servios de um monge e disse-lhes que pagaria qualquer preo. O
monge, necessitando de alimentos, perguntou rainha se o pagamento poderia ser feito com
gros de trigo dispostos em um tabuleiro de xadrez, de tal forma que o primeiro quadro contivesse
apenas um gro e os quadros subsequentes, o dobro do quadro anterior. A rainha considerou o
pagamento barato e pediu que o servio fosse executado, sem se dar conta de que seria
impossvel efetuar o pagamento. Faa um programa para calcula o nmero de gros que o monge
esperava receber.
25. Em uma eleio presidencial, existem quatro candidatos. Os votos so informados atrav sde
cdigo. Os dados utilizados para a escrutinagem obedecem a seguinte codificao:
54
1,2,3,4 = voto para os respectivos candidatos;
5 = voto nulo;
6 = voto em branco.

Elabore um programa que calcule e escreva:
a) total de votos para cada candidato;
b) total de votos nulos;
c) total de votos em branco;
d) percentual dos votos em branco e nulos sobre o total.
Como finalizador do conjunto de votos, tem-se o valor 0.

26. Escreva um programa que imprima todas as possibilidades de que no lanamento de dois dados
tenhamos o valor 7 como resultado da soma dos valores de cada dado.
27. Escreva um programa que imprima todos os nmeros primos existentes entre N1 e N2, em que N1
e N2 so nmeros naturais fornecidos pelo usurio.
28. Construa um programa que leia um conjunto de dados contendo altura e sexo (M para masculino
e F para feminino) de 50 pessoas e, depois, calcule e escreva:
a maior e a menor altura do grupo;
a mdia de alturas das mulheres;
o nmero de homens e a diferena percentual entre estes e as mulheres.

29. Uma agncia de publicidade quer prestar servios somente para as maiores companhias em
nmero de funcionrios em cada uma das classificaes: grande, mdia, pequena e
microempresa. Para tal, consegue um conjunto de dados com o cdigo, o nmero de funcionrios
e o porte da empresa. Construa um algoritmo que liste o cdigo da empresa com maiores recursos
humanos dentro de sua categoria. Utilize como finalizador o cdigo da empresa igual a 0.
30. Calcule o imposto de renda de um grupo de 10 contribuintes, considerando que os dados de cada
contribuinte, nmero do CPF, nmero de dependentes e renda mensal so valores fornecidos pelo
usurio. Para cada contribuinte ser feito um desconto de 5% do salrio mnimo por dependente.
Os valores da alquota para clculo do imposto so:

Renda lquda Alquota
At 2 salrIos minImos sento
2 a J salrIos minImos 5,00
J a 5 salrIos minImos 10,00
5 a 7 salrIos minImos 15,00
AcIma de 7 salrIos minImos 20,00
Observe que deve ser fornecido o valor atual do salrio mnimo para que o programa
calcule os valores corretamente.

31. Anacleto tem 1,50 metros e cresce 2 centmetros por ano, enquanto Felisberto tem 1,10 metros e
cresce 3 centmetros por ano. Construa um algoritmo que calcule e imprima quantos anos sero
necessrios para que Felisberto seja maior que Anacleto.
32. Um cinema possui capacidade para 100 lugares e est sempre com ocupao total. Certo dia,
cada espectador respondeu a um questionrio, no qual constava:
sua idade;
sua opinio com relao ao filme, segundo as seguintes notas:

Nota Synjcado
A DT|D
8 8D|
C FECULAF
0 FU|
E PSS|D
Elabore um programa que, lendo estes dados, calcule e imprima:
a quantidade de respostas timo;
a diferena percentual entre respostas bom e regular;
55
a mdia de idade das pessoas que responderam ruim;
a perdentagem de respostas pssimo e a maior idade que utilizou esta opo;
a diferena de idade entre a maior idadeque respondeu timo e a maior idade que
respondeu ruim.

33. Em um prdio h trs elevadores denominados A, B e C. para otimizar o sistema de controle dos
elevadores, foi realizado um levantamento no qual cada usurio respondia:
o elevador que utilizava com mais freqncia;
o perodo que utilizava o elevador, entre:
M = matutino;
V = vespertino;
N = noturno;
Construa um algoritmo que calcule e imprima:
qual o elevador mais frequentado e em perodo se concentra o maior fluxo;
qual o perodo mais usado de todos e a que elevador pertence;
qual a diferena percentual entre o mais usado dos horrios e o menos usado;
qual a percentagem sobre o total de servios prestados do elevador de mdia utilizao.

34. Uma loja utiliza os seguintes cdigos para as transaes de cada dia:
v para compras vista
p para compras a prazo
dada uma lista de transaes contendo o valor de cada compra e o respectivo
cdigo de transao. Faa um programa que calcule e imprima:
valor total das compras vista ;
valor total das compras a prazo;
valor total das compras efetuadas;
valor a receber pelas compras a prazo, isto , primeira parcela, sabendo que estas sero
pagas em trs vezes.
Sabe-se que so efetuadas 25 transaes por dia.

35. Em um campeonato de futebol, cada time tem uma lista oficial de 23 jogadores. Cada time prepara
uma lista contendo o peso e a idade de cada um dos seus jogadores. Os 40 times que participam
do torneio enviam essas listas para o CPD da confederao. Faa um programa que apresente as
seguintes informaes:
o peso mdio e a idade mdia de cada um dos times;
o peso mdio e a idade de todos os participantes.


Outros exemplos complementares

Ex1) fazer um programa que leia trs valores inteiros, determine e imprima o menor deles:
a) Algoritmo resolvido

inicio
//declaracao de variveis
a,b,c,menor:inteiro;
escreva("Entre com o valor de A: ");leia(a);
escreva("Entre com o valor de B: ");leia(b);
escreva("Entre com o valor de C: ");leia(c);
se( (a < c) e (a < c))entao
menor = a;
senao
se (b < c) entao
menor = b;
senao
menor = c;
escreva("O menor valor e: "+menor);
fim.

b) Programa em Java

import java.io.*;
56
class ExemplosGerais1{
public static void main(String args[]){
int a,b,c,menor;
BufferedReader entrada;
entrada = new BufferedReader(new InputStreamReader(System.in));

try{
System.out.println("Entre com o valor de A: ");
a = Integer.parseInt(entrada.readLine());
System.out.println("Entre com o valor de B: ");
b = Integer.parseInt(entrada.readLine());
System.out.println("Entre com o valor de C: ");
c = Integer.parseInt(entrada.readLine());
if( (a < c) && (a < c))
menor = a;
else{
if (b < c)
menor = b;
else
menor = c;
}
System.out.println("O menor valor e: "+menor);
}catch(Exception e){
System.out.println("Ocorreu um erro durante a leitura");
}
}
}


Ex2) Dados trs valores distintos, fazer um programa que, aps a leitura destes dados, coloque-os
em ordem crescente.

a) algoritmo em pseudocodigo


inicio
//declaracao de variaveis
a,b,c,aux:intueiro;

escreva('Entre com o valor de A: ');leia(a);
escreva('Entre com o valor de B: ');leia(b);
escreva('Entre com o valor de C: ');leia(c);
se ((a > b) ou (a > c)) entao
se (b < c) entao
aux = a;
a= b;
b= aux;
senao
aux = a;
a= c;
c= aux;
se (b > c) entao
aux = b;
b= c;
c= aux;
escreva(a,' ',b,' ',c);

fim.

b) programa em Java

import java.io.*;
class ExemplosGerais2A{
public static void main(String args[]){
int a,b,c,aux;
57
BufferedReader entrada;
entrada = new BufferedReader(new InputStreamReader(System.in));

try{
System.out.println("Entre com o valor de A: ");
a = Integer.parseInt(entrada.readLine());
System.out.println("Entre com o valor de B: ");
b = Integer.parseInt(entrada.readLine());
System.out.println("Entre com o valor de C: ");
c = Integer.parseInt(entrada.readLine());
if ((a > b) || (a > c)){
if (b < c){
aux = a;
a= b;
b= aux;
}
else{
aux = a;
a= c;
c= aux;
}
if (b > c){
aux = b;
b= c;
c= aux;
}
}
System.out.println("Os valores ordenados sao: "+a+" "+b+" "+c);

}catch(Exception e){
System.out.println("Ocorreu um erro durante a leitura");
}
}
}


Ex3) Fazer um programa para determinar a soma dos nmeros pares desde 100 at 200 inclusive.

a) algoritmos em psudocodigo

Soluo 1: (enquanto)

inicio
soma, par:inteiros;
soma = 0;
par = 100;
enquanto (par <= 200) faca
soma = soma + par;
par = par + 2;
fimenquanto;
escreva('A soma dos pares entre 100 e 200 (inclusive) e: ',soma);
fim.


Soluo 2: (para)

inicio
soma, n:inteiro;
soma = 0;
para n= 50 ate 100 faca
soma := soma + 2*n;
escreva('A soma dos pares entre 100 e 200 (inclusive) e: ',soma);
fim.

Soluo 3: (Repita)
58

inicio
soma, par:inteiro;
soma = 0;
par = 100;
repita
soma := soma + par;
par := par + 2;
ate (par > 200);
escreva('A soma dos pares entre 100 e 200 (inclusive) e: ',soma);
fim.

b) programa em Java (usando for)

class ExemplosGerais3{
public static void main(String args[]){
int soma=0, n;

for(n=50;n<=100;n++)
soma = soma + 2*n;
System.out.println("A soma dos pares entre 100 e 200 (inclusive) e: "+soma);

}
}

Ex4) Fazer um programa que calcule o fatorial de um nmero inteiro.

a) algoritmo em pseudocodigo

Soluo:

inicio
fat, i, n: inteiro;
fat = 1;
escreva(Entre com o valor de n: );leia(n);
para i = 1 ate n faca
fat = fat * i;
escreva(O fatorial de ,n, e ,fat);
fim

b) Programa em Java

import java.io.*;
class ExFatorial{
public static void main(String args[]){
int fat,i,n;

BufferedReader entrada;
entrada = new BufferedReader(new InputStreamReader(System.in));
fat=1;
try{
System.out.println("Entre com o valor de n: ");
n = Integer.parseInt(entrada.readLine());

for(i=1;i<=n;i++){
fat *= i;
}
System.out.println("O fatorial de "+n+ " e: " +fat);

}catch(Exception e){
System.out.println("Ocorreu algum erro na entrada!!!");
}
}
}

59
Ex5) Uma pessoa aplicou seu capital a juros e deseja saber, trimestralmente, a posio de seu
investimento C (capital) inicial. Chamando de I a taxa de juros do trimestre, escrever uma tabela que
d para cada trimestre o rendimento auferido e o saldo acumulado durante um perodo de X anos,
supondo-se que nenhuma retirada tenha sido feita.
OBS:
ci) os valores de C, I e X esto disponveis em uma unidade de entrada;
cii) a frmula para capitalizao composta dada por:
M
n
= C(1 + I)
n
Onde:
M
n
- montante aps terem decorridos n trimestres;
C capital inicial investido;
I taxa de juros;
n nmero de perodos decorridos (trimestres)

a) algoritmo em pseudocdigo
Soluo:

inicio
c, montante, taxa, rendimento: real;
n, trimestre, x: inteiro;
escreva('Entre com o capital: ');leia(c);
escreva('Entre com a taxa: ');leia(taxa);
escreva('Entre com o periodo: ');leia(x);
Montante = c;
taxa = taxa / 100;
n = 4 * x;
para trimestre = 1 ate n faca
rendimento= taxa*montante;
montante = montante * (1 + taxa);
fimpara;
escreva('O rendimento e: ',rendimento);
escreva('O montante e: ',montante);
fim.

b) Programa em Java

import java.io.*;
class ExemplosGerais5{
public static void main(String args[]){
double c, montante, taxa, rendimento=0;
int n, trimestre, x;
String s = " ";
DataInputStream dado;

try{
System.out.println("Entre com o capital: ");
dado = new DataInputStream(System.in);
s = dado.readLine();
c = Double.parseDouble(s);

System.out.println("Entre com a taxa: ");
dado = new DataInputStream(System.in);
s = dado.readLine();
taxa = Double.parseDouble(s);

System.out.println("Entre com o periodo: ");
dado = new DataInputStream(System.in);
s = dado.readLine();
x = Integer.parseInt(s);

montante = c;
taxa = taxa / 100;
n = 4 * x;
for (trimestre = 1;trimestre <= n;n++){
rendimento= taxa*montante;
60
montante = montante * (1 + taxa);
}
System.out.println("O rendimento e: "+rendimento);
System.out.println("O montante e: "+montante);
}catch(Exception e){
System.out.println("Ocorreu algum erro na entrada!");
}
}
}


Ex6) Num frigorfico existem 90 bois. Cada boi traz preso em seu pescoo um carto contendo seu
nmero de identificao e seu peso. Fazer um programa que escreva o nmero e o peso do boi mais
gordo e do boi mais magro.

a) algoritmo em pseudocodigo

Soluo:

inicio
bois, gordo, magro,num:inteiro;
peso, MaiorPeso, MenorPeso: real;
maiorpeso = 0;
menorpeso = 100000;
para bois = 1 ate 90 faca
escreva('Entre com o numero do boi: ');leia(num);
escreva('Entre com o peso do boi: ');leia(peso);
se (peso > maiorpeso) entao
maiorpeso = peso;
gordo = num;
fimse;
se (peso < menorpeso) entao
menorpeso := peso;
magro := num;
fimse;
escreva('O boi mais gordo e o ',gordo,' e o seu peso e ',maiorpeso);
escreva('O boi mais magro e o ',magro,' e o seu peso e ',menorpeso);
fim.

b) Programa em Java

import java.io.*;
class ExemplosGerais6{
public static void main(String args[]){
int bois, gordo=0, magro=0,num;
double peso, maiorpeso=0, menorpeso=100000;
BufferedReader entrada;
entrada = new BufferedReader(new InputStreamReader(System.in));

try{
for (bois = 1;bois<=90;bois++){
System.out.println("Entre com o numero do boi: ");
num=Integer.parseInt(entrada.readLine());

System.out.println("Entre com o peso do boi: ");
peso = Double.parseDouble(entrada.readLine());

if(peso > maiorpeso){
maiorpeso = peso;
gordo = num;
}
if (peso < menorpeso){
menorpeso = peso;
magro = num;
}
61
}

System.out.println("O boi mais gordo e o "+gordo+" e o seu peso e
"+maiorpeso);
System.out.println("O boi mais magro e o "+magro+" e o seu peso e
"+menorpeso);

}catch(Exception e){
System.out.println("Houve algum erro na entrada");
}

}
}

Ex7) Uma pesquisa sobre algumas caractersticas fsicas da populao de determinada regio
coletou os seguintes dados, referentes a cada habitante, para serem analisados:
i. sexo (masculino, feminino);
ii. cor dos olhos (azuis, verdes, castanhos, pretos);
iii. cor dos cabelos (louros, castanhos, pretos);
iv. idade em anos;

Para cada habitante, foi digitada uma linha com esses dados e a ltima linha, que no corresponde a
ningum, conter o valor de igualdade igual a 1. fazer um programa que determine e escreva:
a) a maior idade dos habitantes;
b) a porcentagem de indivduos do sexo feminino cuja idade est entre 18 e 35 anos, inclusive, e que
tenham olhos verdes e cabelos louros.

a) algoritmo em pseudocdigo

Soluo:

inicio
idade, totalpessoas, maioridade, pessoas: inteiro;
porcentagem: real;
cabelos, olhos, sexo: caracter;
maioridade = 0;
TotalPessoas = 0;
pessoas = 0;
escreva('Entre com o sexo do indivduo: ');leia(sexo);
escreva('Entre com a cor dos olhos do indivduo: ');leia(olhos);
escreva('Entre com a cor dos cabelos do indivduo: ');leia(cabelos);
escreva('Entre com a idade do indivduo: ');leia(idade);
enquanto (idade <> -1) faca
se (idade > maioridade) ento
maioridade := idade;
fimse;
totalpessoas := totalpessoas + 1;
se (idade >= 18) e (idade <= 35) e (olhos = 'v') e (cabelos = 'L') e (sexo = 'F') entao
pessoas := pessoas + 1;
fimse;
escreva('Entre com o sexo do indivduo: ');leia(sexo);
escreva('Entre com a cor dos olhos do indivduo: ');leia(olhos);
escreva('Entre com a cor dos cabelos do indivduo: ');leia(cabelos);
escreva('Entre com a idade do indivduo: ');leia(idade);
fimenquanto;
porcentagem := (pessoas * 100/totalpessoas);
escreva('A maior idade e: ',maioridade);
escreva('A percentual de individuos selecionados: ',porcentagem);
fim.

b) Programa em Java

import java.io.*;
62
class ExPesquisa{
public static void main(String args[]){
int idade, totalpessoas=0,maioridade=0,pessoas=0;
float porcentagem;
int cabelos,olhos,sexo;

BufferedReader entrada;
entrada = new BufferedReader(new InputStreamReader(System.in));

try{
System.out.println("Entre com o sexo: (1 = masculino;2 =
feminino)");
sexo = Integer.parseInt(entrada.readLine());

System.out.println("Entre com a cor dos olhos: (1 = azul;2 =
verde;3 = castanho;4= preto)");
olhos = Integer.parseInt(entrada.readLine());

System.out.println("Entre com a cor dos cabelos: (1 = louro;2 =
castanho; 3 = preto)");
cabelos = Integer.parseInt(entrada.readLine());

System.out.println("Entre com a idade: ");
idade = Integer.parseInt(entrada.readLine());

while(idade != -1){
if(idade > maioridade)
maioridade = idade;
totalpessoas++;
if((idade>=18)&& (idade <=35)&&(olhos ==2)&&(cabelos ==
1)&&(sexo ==2)){
pessoas++;
}
System.out.println("Entre com o sexo: (1 = masculino;2 =
feminino)");
sexo = Integer.parseInt(entrada.readLine());

System.out.println("Entre com a cor dos olhos: (1 =
azul;2 = verde;3 = castanho;4= preto)");
olhos = Integer.parseInt(entrada.readLine());

System.out.println("Entre com a cor dos cabelos: (1 =
louro;2 = castanho; 3 = preto)");
cabelos = Integer.parseInt(entrada.readLine());

System.out.println("Entre com a idade: ");
idade = Integer.parseInt(entrada.readLine());
}
porcentagem=(pessoas*100)/totalpessoas;
System.out.println("A maior idade e: "+maioridade);
System.out.println("O percentual de selecionados e:
"+porcentagem);
}catch(Exception e){
System.out.println("Houve algum erro na entrada!");
}

}
}


Ex8) Para determinar o nmero de lmpadas necessrias para cada cmodo de uma residncia,
existem normas que do o mnimo de potncia de iluminao exigida por metro quadrado (m),
conforme a utilizao deste cmodo.
Seja o seguinte quadro tomado como exemplo:

UTILIZAD CLASSE PDTNCIAlm
Quarto 1 15
63
Sala de T7 1 15
Sala 2 18
CozInha 2 18
7aranda 2 18
EscrItorIo J 20
banheIro J 20


Supondo que s sero utilizadas lmpadas de 60W, fazer um programa que:
a) leia um nmero indeterminado de linhas contendo cada uma:
a) cmodo de uma residncia
b) classe de iluminao deste cmodo
c) as duas dimenses do cmodo

b) calcule e escreva:
b.1) para cada cmodo:
a) o cmodo.
b) a rea do cmodo
c) a potncia de iluminao
d) nmero de lmpadas necessrias
b.2) para toda a residncia:
a) total de lmpadas
b) total de potncia

Observaes:
1.Se o nmero calculado de lmpadas for fracionrio, considerar o menor inteiro que contenha esse
nmero. Ex.:8,3 -> 9; 8,7 -> 9.
2. A ltima linha, que no entrar nos clculos, conter no lugar do cmodo a palavra vazio.

Soluo:

a) algoritmo em pseudocdigo

inicio
classe, lampadas, TotalLampadas:inteiro;
aux, comprimento, largura, area, potencia, TotalPotencia: real;
comodo: caracter;
TotalLampadas = 0;
TotalPotencia = 0;
escreva('Entre com o tipo do comodo: ');
escreva('Entre com q para quarto');
escreva('Entre com s para sala');
escreva('Entre com t para sala de TV');
escreva('Entre com c para cozinha');
escreva('Entre com v para varanda');
escreva('Entre com e para escritorio');
escreva('Entre com b para banheiro');
leia(comodo);
escreva('Entre com a classe do comodo: ');
escreva('quarto e sala de TV = classe 1');
escreva('sala, cozinha e varanda = classe 2');
escreva('escritorio e banheiro = classe 3');
leia(classe);
escreva('Entre com o comprimento do comodo: ');leia(comprimento);
escreva('Entre com a largura do comodo: ');leia(largura);
enquanto (comodo != '*') faca
area := comprimento * largura;
se (classe = 1) entao
potencia = area * 15;
senao
se (classe = 2) entao
64
potencia = area * 18
senao
potencia = area * 20;
fimse;
fimse;
lampadas = trunc(potencia/60);
aux := potencia/60 - lampadas;
se (aux > 0) entao
lampadas := lampadas + 1;
fimse;
TotalLampadas := TotalLampadas + lampadas;
TotalPotencia := TotalPotencia + Potencia;
escreva('O comodo e: ', comodo);
escreva('A area do comodo e: ', area:2:2);
escreva('A potencia utilizada e: ', potencia:2:2);
escreva('A quanrtidade de lampadas e: ', lampadas);
escreva('Entre com o tipo do comodo: ');leia(comodo);
escreva('Entre com a classe do comodo: ');leia(classe);
escreva('Entre com o comprimento do comodo: ');leia(comprimento);
escreva('Entre com a largura do comodo: ');leia(largura);
fimenquanto;
escreva('O total de lampadas para os comodos e: ', totalLampadas);
escreva('O total de potencia para os comodos e: ', totalPotencia:2:2);
fim.

b) programa em Java

import java.io.*;
class ExIluminacao{
public static void main(String args[]){
int classe,lampadas, TotalLampadas=0,comodo;
double aux, comprimento, largura, area, potencia, totalPotencia=0;

BufferedReader entrada;
entrada = new BufferedReader(new InputStreamReader(System.in));

try{
System.out.println("Entre com o tipo do comodo:");
System.out.println();
System.out.println("Entre com 1 para quarto");
System.out.println("Entre com 2 para sala");
System.out.println("Entre com 3 para sala de TV");
System.out.println("Entre com 4 para cozinha");
System.out.println("Entre com 5 para varanda");
System.out.println("Entre com 6 para escritorio");
System.out.println("Entre com 7 para banheiro");
comodo = Integer.parseInt(entrada.readLine());
System.out.println();
System.out.println("Entre com a classe do comodo: ");
System.out.println("quarto e sala de TV = classe 1");
System.out.println("sala, cozinha e varanda = classe 2");
System.out.println("escritorio e banheiro = classe 3");
classe = Integer.parseInt(entrada.readLine());
System.out.println("Entre com o comprimento do comodo: ");
comprimento = Double.parseDouble(entrada.readLine());
System.out.println("Entre com a largura do comodo: ");
largura = Double.parseDouble(entrada.readLine());
while (comodo != -1){
area = comprimento * largura;
if (classe == 1)
potencia = area * 15;
else
if (classe == 2)
potencia = area * 18;
else
potencia = area * 20;
65
lampadas = (int)(Math.ceil(potencia/60));
aux = potencia/60 - lampadas;
if (aux > 0)
lampadas ++;
TotalLampadas = TotalLampadas + lampadas;
totalPotencia = totalPotencia + potencia;
System.out.println();
System.out.println("O comodo e: "+ comodo);
System.out.println("A area do comodo e: "+ area);
System.out.println("A potencia utilizada e: "+
potencia);
System.out.println("A quanrtidade de lampadas e: "+
lampadas);
System.out.println();
System.out.println("Entre com o tipo do comodo: ");
comodo = Integer.parseInt(entrada.readLine());
System.out.println("Entre com a classe do comodo: ");
classe = Integer.parseInt(entrada.readLine());
System.out.println("Entre com o comprimento do comodo:
");
comprimento = Double.parseDouble(entrada.readLine());
System.out.println("Entre com a largura do comodo: ");
largura = Double.parseDouble(entrada.readLine());;
}
System.out.println("O total de lampadas para os comodos e: "+
TotalLampadas);
System.out.println("O total de potencia para os comodos e: "+
totalPotencia);
}catch(Exception e){
System.out.println("Houve algum erro na entrada!");
}

}
}


Ex9) Fazer um programa que:
1) Leia e escreva o nmero e a altura das moas inscritas em um concurso de beleza. Para cada
moa existe uma linha em uma unidade de entrada contendo seu nmero e sua altura. A ltima linha,
que no corresponde a nenhuma moa, conter o zero no lugar do nmero.

2) Calcule e escreva as duas maiores alturas e quantas moas as possuem.


a) algoritmo em pseudocdigo

Soluo:

inicio
altura, maior1, maior2:real;
cont1,cont2, num:inteiro;
cont1 = 0;
cont2 = 0;
maior1 =-1;
maior2 = -1;
escreva('Entre com o numero de inscricao: ');leia(num);
escreva('Entre coma altura da candidata: ');leia(altura);
enquanto (num > 0) faca
escreva('o numero de inscricao e','',num,'','e a altura e ',altura);
se (altura > maior1) entao
maior2 = maior1;
cont2 = cont1;
maior1 = altura;
cont1 = 1;
senao
66
se (altura = maior1) entao
cont1 = cont1 + 1
senao
se (altura > maior2) entao
maior2 = altura;
cont2 = 1;
senao
se (altura > maior2) entao
maior2 = altura;
cont2 = 1;
senao
se (altura == maior2) entao
cont2 := cont2 + 1;
fimse;
fimse;
fimse;
fimse;
fimse;
escreva('Entre com o numero de inscricao: ');leia(num);
escreva('Entre coma altura da candidata: ');leia(altura);
fimenquanto;
escreva(maior1, cont1, maior2, cont2);
fim.

b) programa em Java



Ex10) Escrever um programa para fazer uma tabela de senA, com A variando de 0 a 16, radiano de
dcimo em dcimo de radiano, usando a srie:
SenA = A- A
3
+ A
5
- ...
3! 5!
Com erro inferior a 0,0001. Imprimir tambm o nmero de termos usados.
Em sries alternadas, o valor absoluto do erro cometido com a interrupo da srie inferior
ao valor absoluto do primeiro termo abandonado.
Observe-se que a estrutura para-ate-faca no permite varivel de controle, valores inicial e
final reais. Para se contornar esta restrio, usou-se a varivel inteira I, variando de 0 a 16. e obteve-
se A, dividindo-se cada I por 10.

Soluo:

a) algoritmo em pseudocdigo

inicio
n,i : inteiro;
a, senA, t: real;
escreva('A senA N');
para i = 0 ate 16 faca
a= i/10;
senA = 0;
t = a;
n = 0;
enquanto (abs(t) >= 0.0001) faca
senA := senA + t;
n := n + 1;
t := -t * a * a/(2 * n * (2 * n + 1))
fimenquanto;
escreva(a:3:1,senA:11:7,n:3);
fimpara;
fim.

67
Ex11) Para cada aluno da disciplina Programao de Computadores deste semestre, ser digitada
uma linha com os seguintes dados:
1. A identificao da turma (A,B, ...,R, nesta ordem)
2. Nmero de matrcula
3. Nota final
Aps o ltimo aluno de cada turma, vir uma linha com dados, que no correspondem a nenhum
aluno, contendo zero no lugar do nmero de matrcula. Deseja-se, atravs de um computador, ler
estes dados e imprimir, para cada turma, a sua identificao,o nmero de alunos aprovados ( nota
final> 60), a mdia das notas e a melhor nota. Aps todas as turmas serem processadas, deseja-se
imprimir tambm o total de alunos aprovados, a mdia geral e a melhor nota na disciplina,neste
semestre.

Soluo:

a) algoritmo em pseudocdigo

inicio
NDisc, AprovDisc, n, aprov, aluno: inteiro;
MediaDisc, SomaDisc, MelhorDisc, media, soma, melhor, nota: real;
turma: caracter;
SomaDisc := 0;
NDisc := 0;
AprovDisc := 0;
MelhorDisc := 0;
escreva('Para sair entre com R');
repeat
n= 0;
aprov = 0;
melhor = -1;
soma= 0;
escreva('Entre com o nome da turma: ');leia(turma);
escreva('Entre com a matricula do aluno: ');leia(aluno);
escreva('Entre com a nota do aluno: ');leia(nota);
enquanto (aluno != 0) faca
n := n + 1;
soma = soma + nota;
se (nota > 60) entao
aprov = aprov + 1;
fimse;
se (nota > melhor) entao
melhor := nota;
escreva('Entre com o nome da turma: ');leia(turma);
escreva('Entre com a matricula do aluno: ');leia(aluno);
escreva('Entre com a nota do aluno: ');leia(nota);
fimenquanto;
media = soma/n;
escreva(aprov:3,media:6:2,melhor:6:2);
SomaDisc =SomaDisc + soma;
AprovDisc = AprovDisc + Aprov;
NDisc = NDisc + n;
se (melhor > melhorDisc) entao
melhorDisc := melhor;
fimse;
ate (turma = 'R');
MediaDisc := SomaDisc/NDisc;
escreva(AprovDisc:3, MediaDisc:6:2, MelhorDisc:6:2);
fim.




68
EXERCCIOS GERAIS - Estruturas de controle

1) Fazer um programa que:
- Leia um nmero indeterminado de linhas contendo cada uma a idade de um indivduo. A
ltima linha, que no entrar nos clculos, contm o valor da idade igual a zero;
- Calcule e escreva a idade mdia deste grupo de indivduos.

2) Tem-se um conjunto d3e dados contendo a altura e o sexo (masculino e feminino) de 50 pessoas.
Fazer um programa que calcule e escreva:
- a maior e a menor altura do grupo;
- a mdia de altura das mulheres;
- o nmero de homens;

3) A converso de graus Fahrenheit para centgrados obtida por C = 5 ( F- 32 ).
9
Fazer um programa que calcule e escreva uma tabela de centgrados em funo de graus Fahrenheit,
que variam de 50 a 150 de 1 em 1.

4) Um comerciante deseja fazer o levantamento do lucro das mercadorias que ele comercializa. Para
isto, mandou digitar uma linha para cada mercadoria com o nome, preo de compra e preo de venda
das mesmas. Fazer um programa que:
Compra e preo de venda das mesmas. Fazer um programa que:
- Determine e escreva quantas mercadorias proporcionam:
- Lucro < 100%
- 10% < lucro < 20%
- Lucro > 20%
- Determine e escreva o valor total de compra e de venda de todas as mercadorias, assim
como o lucro total.
Observao: o aluno deve adota um flag.

5) Supondo que a populao de um pas A seja da ordem de 90.000.000 de habitantes comum taxa
anual de crescimento de 3% e que a populao de um pas B seja, aproximadamente , de
200.000.000 de habitantes com uma taxa anual de crescimento de 1,5%, fazer um programa que
calcule e escreva o nmero de anos necessrios para que a populao do pas A ultrapasse ou
iguale a populao do pas B, mantidas essas taxas de crescimento.

6) Um determinado material radioativo perde metade de sua massa a cada 50 segundos. Dada a
massa inicial, em gramas, fazer um programa que determine o tempo necessrio para que essa
massa se torne menor do que 0,5 grama. Escreva a massa inicial, a massa final e o tempo calculado
em horas, minutos e segundos.

7) Deseja-se fazer um levantamento a respeito da ausncia de alunos primeira prova de
Programao de Computadores para cada uma das 14 turmas existentes. Para cada turma,
fornecido um conjunto de valores, sendo que os dois primeiros valores do conjunto correspondem
identificao da turma (A, ou B, ou C,...) e ao nmero de alunos matriculados, e os demais valores
deste conjunto contm o nmero de matrcula do aluno e a letra A ou P para o caso de o aluno estar
ausente ou presente, respectivamente. Fazer um programa que:
- Para cada turma, calcule a porcentagem de ausncia e escreva a identificao da turma e a
porcentagem calculada;
- Determine e escreva quantas turmas tiveram porcentagem de ausncia superior a 5%.

8) Uma certa firma fez uma pesquisa de mercado para saber se as pessoas gostaram ou no de um
novo produto lanado o mercado. Para isso, forneceu o sexo do entrevistado e sua resposta (sim ou
no). Sabendo-se que foram entrevistadas 2.000 pessoas, fazer um programa que calcule e escreva:

- O nmero de pessoas que responderam sim;
- o nmero de pessoas que responderam no;
- a porcentagem de pessoas do sexo feminino que responderam sim;
- a porcentagem de pessoas do sexo masculino que responderam no;

9) Foi feita uma pesquisa para determinar o ndice de mortalidade infantil em um certo perodo. Fazer
um programa que:
69
a) leia inicialmente o nmero de crianas nascidas no perodo;
b) leia, em seguida, um nmero indeterminado de linhas, contendo, cada uma, o sexo de uma
criana morta ( masculino, feminino ) e o nmero de meses de vida da criana. A ltima linha,
que no entrar nos clculos, contm no lugar do sexo a palavra vazio;
c) Determine e imprima:
i. a porcentagem de crianas mortas no perodo;
ii. a porcentagem de crianas do sexo masculino mortas no perodo;
iii. a porcentagem de crianas que viveram 24 meses ou menos no perodo.

10) Foi feira uma pesquisa de audincia de canal de TV em vrias casas de uma certa cidade, num
determinado dia. Para cada casa visitada, fornecido o nmero do canal (4, 5, 7, 12) e o nmero de
pessoas que o estavam assistindo naquela casa. Se a televiso estivesse desligada, nada era
anotado, ou seja esta casa no entrava na pesquisa. Se a televiso estivesse desligada, nada era
anotado, ou seja esta casa no entrava na pesquisa. Fazer um programa que :
a) Leia um nmero indeterminado de dados, sendo que o FLAG corresponde ao nmero do
canal igual a zero;
b) Calcule a porcentagem de audincia para cada emissora;
c) Escreva o nmero do canal e a sua respectiva porcentagem.

11) Uma universidade deseja fazer um levantamento a respeito de seu concurso vestibular. Para
cada curso, fornecido o seguinte conjunto de valores:
a) o cdigo do curso;
b) nmero de vagas;
c) nmero de candidatos do sexo masculino;
d) nmero de candidatos do sexo feminino;
O ltimo conjunto, para indicar fim de dados, contm o cdigo do curso igual a zero. Fazer um
programa que:
i. calcule e escreva para cada curso, o nmero de candidatos por vaga e a porcentagem de
candidatos do sexo feminino ( escreva tambm o cdigo correspondente do curso);
ii. determine o maior nmero de candidatos por vaga e escreva esse nmero juntamente com o
cdigo do curso correspondente (supor que no haja empate);
iii. calcule e escreva o total de candidatos.

12) O sistema de avaliao de uma determinada disciplina obedece aos seguintes critrios:
a) Durante o semestre so dadas trs notas;
b) A nota final obtida pela mdia aritmtica das notas dadas durante o curso;
c) considerado aprovado o aluno que obtiver a nota final superior ou igual a 60 e que tiver
comparecido a um mnimo de 40 aulas.
Fazer um programa que:
a) Leia um conjunto de dados contendo o nmero de matrcula, as trs notas e a freqncia (nmero
de aulas freqentadas) de 100 alunos.
b) Calcule:
i. a nota final de cada aluno;
ii. a maior e a menor nota da turma;
iii. a nota mdia da turma;
iv. o total de alunos reprovados;
v. a porcentagem de alunos reprovados por infreqncia.

c) Escreva:
a) para cada aluno, o nmero de matrcula, a freqncia, a nota final e o cdigo (aprovado ou
reprovado);
b) o que foi calculado no item b (2,3,4, e 5).

13) Deseja-se fazer uma pesquisa a respeito do consumo mensal de energia eltrica em uma
determinada cidade. Para isso, aps fornecidos os seguintes dados:
a) preo do kWh consumido;
b) o nmero do consumidor;
c) quantidade de kWh consumidos durante o ms;
d) cdigo do tipo de consumidor (residencial, comercial, industrial);
O nmero do consumidor igual a zero deve ser usado como flag. Fazer um programa que:
a) leia os dados descritos acima;
b) calcule:
70
c) para cada consumidor, o total a pagar;
d) o maior consumo verificado;
e) o menor consumo verificado;
f) o total do consumo para cada um dos trs tipos de consumidores;
g) a mdia geral de consumo;
h) escreva:
1) para cada consumidor, o seu nmero e o total a pagar;
2) o que foi calculado nos itens b, c, d, e acima especificados.

14) Tem-se uma estrada ligando vrias cidades. Cada cidade tem seu marco quilomtrico. Fazer um
programa que:

a) leia vrios pares de dados, contendo cada par os valores dos marcos quilomtricos, em ordem
crescente, de duas cidades. O ltimo par contm estes dois valores iguais;
b) calcule os tempos decorridos para percorrer a distncia entre estas duas cidades, com as
seguintes velocidades: 20, 30, 40, 50, 60, 70 e 80 km/hora, sabendo-se que:

t = e , onde t = tempo; e = espao; v = velocidade;
v
c) escreva os marcos quilomtricos, a velocidade e o tempo decorrido entre as duas cidades,
apenas quando este tempo for superior a 2 horas.

15) Os bancos atualizam diariamente as contas de seus clientes. Essa atualizao envolve a anlise
dos depsitos e retiradas de cada conta. Numa conta de saldo mnimo, uma taxa de servio
deduzida se a conta cai abaixo de uma certa quantia especificada.
Suponha que uma conta particular comece o dia com um saldo de R$ 60,00. O saldo mnimo exigido
R$30,00 e se o saldo de fim de dia for menor do que isso, uma taxa debitada da conta. A fim de
que esta atualizao fosse feita utilizando computador, fornecido, para cada conta, o seguinte
conjunto de dados:
a) a primeira linha contm o nmero da conta, o valor do saldo atual e do saldo mnimo dirio,
quantidade de transaes e taxa de servio;
b) as linhas seguintes contm o valor e o cdigo da transao (depsito ou retirada).
Escrever um programa que:
a) calcule o saldo (crdito/dbito) da conta a o fim do dia (se o resultado for negativo, isto significa
insuficincia de fundos na conta);
b) escreva para cada conta, o seu nmero e o saldo calculado. Se no houver fundos, imprima o
nmero da conta e a mensagem NO H FUNDOS.
c) Utilize como flag o n da conta igual a zero.

16) Uma empresa decidiu fazer um levantamento em relao aos candidatos que se apresentarem
para preenchimento de vagas no seu quadro de funcionrios, utilizando processamento eletrnico.
Supondo que voc seja o programador encarregado desse levantamento, fazer um programa que:
a) leia um conjunto de dados para cada candidato contendo:
b) nmero de inscrio do candidato,
c) idade,
d) sexo (masculino, feminino);
e) experincia no servio (sim ou no);
O ltimo conjunto contm o nmero de inscrio do candidato igual a zero.
Calcule:
a) o nmero de candidatos do sexo feminino,
b) o nmero de candidatos do sexo masculino,
c) idade mdia dos homens que j tm experincia no servio,
d) porcentagem dos homens com mais de 45 anos entre o total de homens,
e) nmero de mulheres que tm idade inferior a 35 anos e com experincia no servio,
f) a menor idade entre mulheres que j tm experincia no servio;
Escreva:
o nmero de inscrio das mulheres pertencentes ao grupo descrito no item e,
o que foi calculado em cada item acima especificado.


17) Uma companhia de teatro planeja dar uma srie de espetculos. A direo calcula que, a
R$15,00 o ingresso, sero vendidos 120 ingressos, e as despesas montaro R$600,00. A uma
71
diminuio de R$3,00 no preo dos ingressos espera-se que haja um aumento de 26 ingressos
vendidos.
Fazer um programa que escreva uma tabela de valores do lucro esperado em funo do preo do
ingresso, fazendo-se variar este preo de R$15,00 a R$3,00 de R$3,00 em R$3,00. Escreva, ainda, o
lucro mximo esperado, o preo e o nmero de ingressos correspondentes.

18) A comisso organizadora de um rallye automobilstico decidiu apurar os resultados da competio
atravs de um processamento eletrnico.
Um dos programas necessrios para a classificao das equipes concorrentes o que emite uma
listagem geral do desempenho das equipes, atribuindo pontos segundo determinadas normas.
O programa dever:

a) Ler:
a. 1) uma linha contendo os tempos-padro (em minutos decimais) para as trs fases de competio;
a .2) um conjunto de linhas contendo cada uma o nmero de inscrio da equipe e os tempos (em
minutos decimais) que as mesmas despenderam ao cumprir as trs diferentes etapas. A ltima linha
(flag), que no entrar nos clculos, contm o nmero 9999 como nmero de inscrio.

b) Calcular:
b.1) os pontos de cada equipe em cada uma das etapas, seguindo o seguinte critrio: Seja
o valor absoluto da diferena entre o tempo-padro (lido na primeira linha) e o tempo despendido pela
equipe numa etapa:
DELTA < 3 minutos - atribuir 100 pontos etapa
3 < DELTA < 5 minutos atribuir 80 pontos etapa
DELTA > 5 minutos atribuir 80 DELTA 5 pontos etapa;
5
b.2) o total de pontos de cada equipe nas trs etapas;
b.3) a equipe vencedora.

c) Escrever:
c.1) para cada equipe, o nmero de inscrio, os pontos obtidos em cada etapa e o total de pontos
obtidos.

19) Numa certa loja de eletrodomsticos, o comercirio encarregado da seo de televisores recebe,
mensalmente, um salrio mnimo mais comisso. Essa comisso calculada em relao ao tipo e ao
nmero de televisores vendidos por ms, obedecendo ao quadro abaixo:

TIPD N 0E TELEVISDPES VEN0I0DS CDhISSDES
A cores
|aIor ou Igual a 10
|enor ou Igual a 10
14 do preo por televIsor vendIdo
1J do preo por televIsor vendIdo
Preto e branco
|aIor ou Igual a 20
|enor do que 20
1J do preo por televIsor vendIdo
12 do preo por televIsor vendIdo

Sabe-se ainda, que ele tem um desconto de 8% sobre seu salrio bruto para o INSS.Se o seu salrio
total (mnimo + comisses INSS), for maior que o limite de iseno do imposto de renda, ele ainda
ter um desconto de 15% sobre o que ultrapassar o limite de iseno retido na fonte. Sabendo-se que
existem 20 empregados nesta seo, leia os valores do salrio mnimo, do limite de iseno de IRRF,
os preos dos televisores em cores e preto e branco e, para cada comercirio, o nmero de sua
inscrio, o nmero de televisores a cores e o nmero de televisores preto e branco vendidos; calcule
e escreva o nmero de inscrio de cada empregado, seu salrio bruto e seu salrio lquido.

20) O dia da semana para uma data qualquer pode ser calculado pela seguinte frmula:
Dia da Semana = RESTO (( TRUNCA(2,6 X M 0,1 ) + D + A + QUOCIENTE (A,4) + QUOCIENTE
(S,4) 2 X S),7)
Onde:
M representa o nmero do ms. Janeiro e fevereiro so os meses 11 e 12 do ano precedente,
maro o ms 1 e dezembro o ms 10:
D representa o dia do ms;
A - representa o nmero formado pelos dois ltimos algarismos do ano;
S representa o nmero formado pelos dois primeiros algarismos do ano.
Os dias da semana so numerados de zero a seis; domingo corresponde a 0, segunda a 1, e assim
por diante.
72
Fazer um programa que:
a) leia um conjunto de 50 datas (doa, ms, ano);
b) - determine o dia da semana correspondente data lida, segundo o mtodo especificado;
c) escreva, para cada data lida, o dia, ms, ano e o dia da semana calculado.

21) Numa fbrica trabalham homens e mulheres divididos em trs classes:
A os que fazem at 30 peas por ms;
B os que fazem de 31 a 35 peas por ms;
C os que fazem mais de 35 peas por ms.
A classe A recebe salrio mnimo. A classe B recebe salrio mnimo e mais 3% do salrio mnimo por
pea, acima das 30 iniciais. A classe C recebe salrio mnimo e mais 5% do salrio mnimo por pea
acima das 30 iniciais.
Fazer um programa que:
a) leia vrias linhas, contendo cada uma:
o nmero do operrio,
o nmero de peas fabricadas por ms,
o sexo do operrio;
b) calcule e escreva:
a) o salrio de cada operrio,
b) o total da folha mensal de pagamento da
fbrica,
c) o nmero total de peas fabricadas por
ms,
d) a mdia de peas fabricadas pelos homens
de cada classe,
e) a mdia de peas fabricadas pelas
mulheres em cada classe,
f) o nmero do operrio ou operria de maior
salrio (no existe empate).
Observao: A ltima linha, que servir de flag, ter o nmero do operrio igual a zero.

22) Uma determinada fbrica de rdios possui duas linhas de montagem distintas: standart e luxo. A
linha de montagem standart comporta um mximo de 24 operrios; cada rdio standart d um lucro X
e gasta um homem-dia para sua confeco. A linha de montagem comporta no mximo 32 operrios;
cada rdio luxo d um lucro Y e gasta 2 homens-dia para sua confeco. A fbrica possui 40
operrios. O mercado capaz de absorver toda a produo e o fabricante deseja saber qual
esquema de produo a adotar de modo a maximizar seu lucro dirio.
Fazer um programa que leia os valores de X e Y e escreva, para esse esquema de lucro
mximo, o nmero de operrios na linha standart e na linha luxo, o nmero de rdios standart e luxo
produzidos e o lucro.

23) Fazer um programa para calcular o nmero de dias decorridos entre duas datas (considerar
tambm a ocorrncia de anos bissextos), sabendo-se que:
cada par de datas lido numa linha, a ltima linha contm o nmero do dia negativo;
a primeira data na linha sempre a mais antiga
o ano est digitado com quatro dgitos;
um ano ser bissexto se for divisvel por 400, ou se for divisvel por 4 e no o for por 100.

PROBLEMAS ENVOLVENDO CLCULO DE SOMATRIOS
24) Fazer um programa que calcule e escreva o valor de S:

S= 1 + 3 + 5 + 7 +...+ 99
1 2 3 4 50

25) Fazer um programa que calcule e escreva a seguinte soma:

2
1
+ 2
2
+ 2
3
+...+ 2
50

50 49 48 1

26) Fazer um programa para calcular e escrever a seguinte soma:

S= 37 X 38 + 36 X 37 + 35 X 36 +...+ 1 X 2
73
1 2 3 37

27) Fazer um programa que calcule e escreva o valor de S onde:

S= 1 - 2 + 3 - 4 + 5 - 6 ...- 10
1 4 9 16 25 36 100

28) Fazer um programa que calcule e escreva a soma dos 50 primeiros termos da seguinte srie:

1.000 - 997 + 994 - 991 +...
1 2 3 4

29) Fazer um programa que calcule e escreva a soma dos 30 primeiros termos da srie:

480 - 475 + 470 - 465 +...
10 11 12 13

30) escrever um programa para gerar e escrever uma tabela com os valores do seno de um ngulo A
radianos, utilizando a srie de Mac-Laurin Truncada, apresentada a seguir:

sen A = A A
3
+ A
5
A
7

6 120 5.040

Condies: os valores dos ngulos A devem variar de 0.0 a 6.3, inclusive, de 0.1 em 0.1.

31) Fazer um programa para calcular e escrever o valor do nmero , com preciso de 0,0001,
usando a srie:

= 4 4 + 4 4 + 4 4 +...
3 5 7 9 11

Para obter a preciso desejada, adicionar apenas os termos cujo valor absoluto seja maior ou igual
0,0001.

32) O valor aproximado de pode ser calculado usando-se a srie

S= 1 - 1 + 1 - 1 + 1 ...
1
3
3
3
5
3
7
3
9
3
Sendo =
3
S X 32
Fazer um programa para calcular e escrever o valor de com 51 termos.

33) Fazer um programa que:
a) leia o valor de X de uma unidade de entrada;
b) calcule e escreva o valor do seguinte somatrio:

S= X
25
- X
24
+ X
23
- X
22
+...+ X
1 2 3 4 25

34) Fazer um programa que calcule e escreva a soma de S no seguinte somatrio:

S= 1 - 2 + 4 - 8 +...+ 16.384
225 196 169 144 1

35) Fazer um programa que calcule e escreva a soma dos 20 primeiros termos da srie:

100 + 99 + 98 + 97 +...
0! 1! 2! 3!

36) Elaborar um programa que:
1. calcule e escreva o valor da srie abaixo com preciso menor que um dcimo de milionsimo
(0,0000001);
2. indique quantos termos foram usados.
74

S= 63 + 61 + 59 + 57 +...
1! 2! 3!

37) Fazer um programa que calcule e escreva a soma dos 50 primeiros termos da srie:

1! 2! + 3! 4! + 5! -...
1 3 7 15 31

38) Fazer um programa que calcule o valor de e
x
atravs da srie:

e
x
= x
0
+ x
1
+ x
2
+ x
3
+...

1! 2! 3!
De modo que o mesmo difira do valor calculado atravs da funo Exp de, no mximo, 0,0001.
O valor de x deve ser lido de uma unidade de entrada. O programa dever escrever o valor de x, o
valor calculado atravs da srie, o valor dado pela funo Exp e o nmero de termos utilizados da
srie.

39) Fazer um programa para determinar e escrever o valor do seguinte somatrio:

S = X - X
2
+ X
4
- X
6
+...

3! 5! 7!


40) Fazer um programa que:
calcule o valor do co-seno de x atravs de 20 termos da srie seguinte:

co-seno(x) = 1 - x
2
+ x
4
x
6
+ x
8
-...

2! 4! 6! 8!
calcule a diferena entre o valor calculado no item a e o valor fornecido pela funo
Cs(X);
imprima o que foi calculado nos itens a e b.

Observao: o valor de x fornecido como entrada.


75
Funes matemticas e de String em Java

Funes matemticas

s funes matemticas permitem efetuar diversos tipos de clculos matemticos. Para realizar
esses clculos, so utilizados os mtodos da classe Math que devem apresentar a seguinte
sintaxe:

Math.<nome da funo ou mtodo>(<argumentos ou lista de argumentos);

No necessrio importar a classe Math em um programa para poder utilizar seus recursos,
pois ela j faz parte do pacote java.lang, importado automaticamente pelo compilador de Java.

A classe Math define duas constantes matemticas, Math.PI o valor de pi ( =
3.14159265358979323846) e Math.E que se refere ao valor da base para logaritmos naturais
(2.7182818284590452354).
A seguir so apresentadas as principais funes (ou mtodos) da classe Math:

juno 0escro Sntaxe
cel() A funo cel(), ou mtodo, como chamado em
Java, utIlIzada para arredondar um numero do tIpo
double para o seu proxImo InteIro.
|ath.ceIl(valor do tIpo double);
jloor() A funo ]loor() utIlIzada para arredondar um
determInado numero, porm esse numero
arredondado para o seu InteIro anterIor.
|ath.floor(valor do tIpo double);
max() A funo mcx() utIlIzada para verIfIcar o maIor
valor entre soIs numeros, que podem ser do tIpo
double, ]loct, nt ou lony.
|ath.max(valor1,valor2);
mn() A funo mn() fornece o resultado contrrIo da
funo mcx(), sendo ento utIlIzada para obter o
valor minImo entre doIs numeros.
|ath.mIn(valor1,valor2);
sqrt() Quando h necessIdade de calcular a raIz quadrada
de um determInado numero, utIlIzase a funo
sqrt(), sendo que o numero do qual de deseja extraIr
a raIz quadrada deve ser do tIpo double e o
resultado obtIdo tambm ser um numero do tIpo
double.
|ath.sqrt(valor do tIpo double);
ow() AssIm, como possivel extraIr a raIz quadrada de
um numero, tambm possivel fazer a operao
Inversa, ou seja, elevar um determInado numero ao
quadrado ou a qualquer outro valor de potncIa.
|ath.pow(base,expoente);
random() A funo random() utIlIzada para gerar valores de
forma aleatorIa. Toda vez que uma funo random()
chamada, ser sorteada um valor do tIpo double
entre 0.0 e 1.0 (o valor 1 nunca ser sorteado). Nem
sempre esta faIxa de valores sufIcIente para uma
aplIcao real. Por exemplo, para sImular o sorteIo
de numeros entre 0 e 99 para um jogo de loterIa
qualquer, tornase necessrIo o sorteIo de numeros
InteIros aleatorIos no Intervalo de 0 a 99. Para que
esses numeros possam ser sorteados, necessrIa a
utIlIzao do operador de multIplIcao em conjunto
com a funo rcndom(). Com Isso tornase possivel
defInIr o Intervalo em que o numero ser sorteado.
D conversor nt tambm pode ser usado para truncar
a parte do ponto flutuante para que um numero
InteIro seja gerado.
(Int) (|ath.random()*100);

Exemplos:
A
76

a) funes matemticas

class ExemplosFuncMat{
public static void main(String args[]){
double a = 5.2, b = 5.6, c= -5.8, C= -5.9,D = -4.5;
double x = 900, y = 30.25;
double base = 5.5, expoente = 2;
int A = 10, B = 15;

//funo ceil()
System.out.println("FUNCAO ceil()");
System.out.println("Arredondando 5.2 = " + Math.ceil(a));
System.out.println("Arredondando 5.6 = " + Math.ceil(b));
System.out.println("Arredondando -5.8 = " + Math.ceil(c));
System.out.println();
//funo floor()
System.out.println("FUNCAO floor()");
System.out.println("Arredondando 5.2 = " + Math.floor(a));
System.out.println("Arredondando 5.6 = " + Math.floor(b));
System.out.println("Arredondando -5.8 = " + Math.floor(c));
System.out.println();
//funo max()
System.out.println("FUNCAO max()");
System.out.println("O maior entre 10 e 15 e = " + Math.max(A,B));
System.out.println("O maior entre -5.9 e -4.5 e = " + Math.max(C,D));
System.out.println("O maior entre 10 e -5.9 e = " + Math.max(A,C));
System.out.println();
//funo min()
System.out.println("FUNCAO min()");
System.out.println("O menor entre 10 e 15 e = " + Math.min(A,B));
System.out.println("O menor entre -5.9 e -4.5 e = " + Math.min(C,D));
System.out.println("O menor entre 10 e -5.9 e = " + Math.min(A,C));
System.out.println();
//funo sqrt()
System.out.println("FUNCAO sqrt()");
System.out.println("A raiz quadrada de 900 e = " + Math.sqrt(x));
System.out.println("A raiz quadrada de 30.25 e = " + Math.sqrt(y));
System.out.println();
//funo pow()
System.out.println("FUNCAO pow()");
System.out.println("5.5 elevado a 2 e = " + Math.pow(base,expoente));
System.out.println("25 elevado a 0.5 e = " + Math.pow(25,.5));

System.out.println("5678 elevado a 0 e = " + Math.pow(5678,0));

}
}

b) Funo random()

class ExemploRandom{
public static void main(String args[]){
for(int qtd = 1; qtd <= 5;qtd++){
for(int x = 1;x<=6;x++){
int num = (int) (Math.random()*99);
System.out.print(num+" ");
}
System.out.println();
}
}
}



77
Funes de String

Uma String corresponde unio de um conjunto de caracteres. Em Java, as strings so
instncias da classe string. Essas strings podem ser manipuladas de vrias formas. Por exemplo
possvel verificar seu comprimento, retirar um pedao dela, acessa ou mudar caracteres individuais.
As strings constituem-se uma cadeia de caracteres entre aspas.
Exemplo: S = Linguagem Java.

Da mesma forma que as funes matemticas, existem diversas funes (ou mtodos se
preferir) para manipulao de strings. Estas funes acompanham a seguinte sintaxe:

<nome da string>.<funo>(<argumento/s>);

juno 0escro Sntaxe
lenyth() A funo lenythl() utIlIzada para retornar o
tamanho de uma determInada strny, IncluIndo os
espaos em branco presentes nela. Esta funo
retorna sempre um valor do tIpo nt.
strInglength();
charAt() A funo chcrAt() utIlIzada para retornar um
caractere de uma determInada strny de acordo
com um indIce especIfIcado entre parnteses.
Esse indIce referese posIo do caractere na
strny, sendo 0 o indIce do prImeIro caractere, 1
o do segundo e assIm por dIante.
strIng.charAt(indIce);
toUerCase() Transforma todas as letras de uma strny em
maIusculas.
strIng.toUpperCase()
toLowerCase() Transforma todas as letras de uma strny em
mInusculas.
strIng.toLowerCase()
substrny() A funo substrny() utIlIzada para retornar
uma copIa de caracteres de uma strny a partIr
de doIs indIces InteIros especIfIcados,
funcIonando basIcamente da mesma forma que a
funo charAt dentro de um loopny.
strIng.substrIng(indIce
InIcIal,[indIce fInal]);
trm() A funo trm() tem por objetIvo remover todos
os espaos em branco que aparecem no InicIo e
no fInal de uma determInada strny. Dbserve que
sero removIdos apenas os espaos do InicIo e do
fIm da strny; no sero removIdos os espaos
entre as palavras.
strIng.trIm();
relace() A funo replcce() utIlIzada para substItuIo
de caracteres IndIvIduaIs em uma determInada
strny. Para seu funcIonamento necessrIo
Informar o caractere que deseja substItuIr e por
qual caractere ele ser substItuido. Caso no haja
na strny nenhuma ocorrncIa do caractere a ser
substItuido, a strny orIgInal retornada.
strIng.replace(caracter a ser
substItuIdo.substItuIo)


Exemplos:

a) funes de String

class ExemplosFunString{
public static void main(String args[]){
String A = "Aprendendo Java";
String a = "ARROZ", b = "batata";
String frase = " Cristo: o rei dos reis ";
String x = "banana nanica";
int tamanho = A.length();
System.out.println("Exempo da funcao length()");
78
System.out.println("String: " + A);
System.out.println("O tamanho da string e: "+ tamanho);
System.out.println();
System.out.println("Exemplo da funcao charAt()");
System.out.println("Caracter = "+A.charAt(5));
for(int i = 11;i<=14;i++)
System.out.println(A.charAt(i));
System.out.println();
System.out.println("Exemplo das funcoes toUpperCase() e
toLowerCaser()");
System.out.println("ARROZ em minuscula = "+a.toLowerCase());
System.out.println("batata em maiuscula = "+b.toUpperCase());
System.out.println("SaLaDa em minuscula = "+"SaLaDa".toLowerCase());
System.out.println();
System.out.println("Exemplo da funcao substring()");
System.out.println(A);
System.out.println("do 3 caractere ate o fim = "+A.substring(2));
System.out.println("do 1 caractere ate o 10 = "+A.substring(0,10));
System.out.println("do 12 caractere ate o 15 = "+A.substring(11,15));
System.out.println();
System.out.println("Exemplo das funcao trim()");
System.out.println("Com espacos: "+ "*" + frase + "*");
System.out.println("Sem espacos: "+ "*" + frase.trim() + "*");
System.out.println();
System.out.println("Exemplo das funcao replace()");
System.out.println("String: " + x);
System.out.println();
System.out.println("Trocar caracter 'a' por 'u': " +
x.replace('a','u'));
System.out.println("Trocar caracter 'n' por 'N': " +
x.replace('n','N'));
System.out.println("Trocar caracter espaco por '_': " + x.replace('
','_'));

}
}

b) Criao de Banners

class ExemploBanners{
public static void main(String args[]){
String palavra = ""; //a variavel palavra sera usaa no banner
if (args.length==1){
System.out.println("Mostra a palavra letra a letra");
System.out.println("Para encerrar pressione CTRL+C");
palavra = args[0]; //a variavel palavra recebe a palavra
digitada
while(true) { //looping infinito
for(int i =0;i<palavra.length();i++){ //varre os
caracteres da palavra
System.out.println(palavra.charAt(i));
for(int x=0;x<50000000;x++); //temporizador1

}
System.out.println();
for(int y=0;y<100000000;y++); //temporizador2

}
}
else
System.out.println("Entre com uma palavra qualquer");
}
}



79
Exerccios de fixao - funes matemticas e de Strings

1. Crie um programa que simule a jogada de um dado (de seis lados) dez vezes e mostre o resultado
na tela.
2. Um ciclista criou um aparelho que marca quantas voltas a roda de sua bicicleta d em um
determinado percurso. Com o uso desse aparelho possvel descobrir qual a distncia percorrida
em um percurso, desde que o raio do pneu da bicicleta seja conhecido. Faa um programa que
calcule a distncia percorrida, em que deve ser fornecida a quantidade de voltas que a roda da
bicicleta deu e o dimetro dessa roda em metros. Para saber o comprimento da roda a partir do
dimetro fornecido, use a frmula: c = pi*d/2 (em que c = comprimento, pi = 3.1416 e d = dimetro
da circunferncia). Sabendo o comprimento da roda, basta multiplic-lo pelo nmero de voltas
para descobrir a distncia do percurso. Arredonde o resultado para seu prximo inteiro.
3. Crie um programa que clacule quantos metros cbicos de gua suporta uma determinada cx
d'gua em forma de cubo (todos os aldos so iguais). O usurio deve informar o valor do lado, e o
volume de gua ser calculado pela frmula: volume = lado
3
. Arredonde o resultado para seu
inteiro anterior.
4. Crie um aplicativo que receba uma frase qualquer e mostre-a de forma invertida.
Exemplo:
frase digitada: Java Ensino Didatico
resultado esperado:
ocitadiD onisnE avaJ

5. Crie um aplicativo que mostre o efeito apresentado no exemplo abaixo para uma determinada
palavra.
Exemplo:
palavra digitada: Java
efeito:
J
Ja
Jav
Java
Jav
Ja
J

80
Vetores e matrizes

Variveis compostas homogneas

ssim como na teoria dos conjuntos, uma varivel pode ser interpretada como um elemento e
uma estrutura de dados, como um conjunto. Quando determinada estrutura de dados
composta por varveis com o mesmo tipo primitivo, temos um conjunto homogneo de dados.

Variveis compostas unidimensionais {vetores)

Declarao

<identificador>: vetor [li..lf] de tipo;
Em que:
Li representa o limite inicial do vetor;
Lf representa o limite final do vetor;
Identificador o nome dado ao vetor
tipo representa qualquer tipo bsico ou tipo anteriormente definido.

Exemplo:
Um vetor de 10 posies de reais poderia ter a seguinte definio e declarao:

v: vetor[0..9] de real;


ndice 0 1 2 3 4 5 6 7 8 9
Elemento 1 2 3 4 5 6 7 8 9 10
Varivel v[0] v[1] v[2] v[3] v[4] v[5] v[6] v[7] v[8] v[9]
Valor 58 4 -5.7 2 3.2 6 9 7 0 -1

Manipulao

O nome do vetor denominado por meio do identificador que foi utilizado na definio de
variveis, e a posio por meio da constante, da expresso aritmtica ou da varivel que estiver
dentro dos colchetes, tambm denominada ndice.
Para manipularmos um determinado valor (elemento) em um vetor, precisamos fornecer o
nome do vetor (identificador) e o ndice do elemento desejado. Esse ndice determina a posio em
que o elemento est inserido na estrutura. Cada posio contm exatamente um valor que pode ser
manipulado individualmente.
Aps isolar um nico elemento de um vetor, poderemos manipul-lo atravs de qualquer
operao de entrada, sada ou atribuio.

Exemplo:
V[5] = 6;
leia(v[5]);
escreva(v[5]);





As estruturas de dados so estritamente relacionadas com os algoritmos. Ento, para uma
melhor percepo desses conceitos, utilizaremos a situao de construir um algoritmo que calcule a
mdia aritmtica geral de uma classe com dez alunos e imprimir a quantidade de notas acima da
mdia calculada.

Exemplo
a) algoritmo em pseudocdigo

inicio
A,B,C,D,E,F,G,H,I,J,NotaAcima:inteiro;
A
58 4 -5.7 2 3.2 6 9 7 0 -1
0 1 2 3 4 5 6 7 8 9

81
media:real;
leia(A,B,C,D,E,F,G,H,I,J);
media = (A+B+C+D+E+F+G+H+I+J)/10;
se(A >media) entao
NotaAcima = NotaAcima+1;
fimse;
se(B >media) entao
NotaAcima = NotaAcima+1;
fimse;
se(C >media) entao
NotaAcima = NotaAcima+1;
fimse;
se(D >media) entao
NotaAcima = NotaAcima+1;
fimse;
se(E >media) entao
NotaAcima = NotaAcima+1;
fimse;
se(F >media) entao
NotaAcima = NotaAcima+1;
fimse;
se(G >media) entao
NotaAcima = NotaAcima+1;
fimse;
se(H >media) entao
NotaAcima = NotaAcima+1;
fimse;
se(I >media) entao
NotaAcima = NotaAcima+1;
fimse;
se(J >media) entao
NotaAcima = NotaAcima+1;
fimse;
escreva(NotaAcima);
fim.

b) programa em Java

import java.io.*;
class NotaAcimaM{
public static void main(String args[]){
int a,b,c,d,e,f,g,h,i,j,NotaAcima=0;
float media;
BufferedReader entrada;
entrada = new BufferedReader(new InputStreamReader(System.in));

try{
System.out.println("Entre com a media do 1 aluno: ");
a = Integer.parseInt(entrada.readLine());
System.out.println("Entre com a media do 2 aluno: ");
b = Integer.parseInt(entrada.readLine());
System.out.println("Entre com a media do 3 aluno: ");
c = Integer.parseInt(entrada.readLine());
System.out.println("Entre com a media do 4 aluno: ");
d = Integer.parseInt(entrada.readLine());
System.out.println("Entre com a media do 5 aluno: ");
e = Integer.parseInt(entrada.readLine());
System.out.println("Entre com a media do 6 aluno: ");
f = Integer.parseInt(entrada.readLine());
System.out.println("Entre com a media do 7 aluno: ");
g = Integer.parseInt(entrada.readLine());
System.out.println("Entre com a media do 8 aluno: ");
h = Integer.parseInt(entrada.readLine());
System.out.println("Entre com a media do 9 aluno: ");
i = Integer.parseInt(entrada.readLine());
82
System.out.println("Entre com a media do 10 aluno: ");
j = Integer.parseInt(entrada.readLine());
media = (a+b+c+d+e+f+g+h+i+j)/10;
if(a > media)
NotaAcima +=1;
if(b > media)
NotaAcima +=1;
if(c > media)
NotaAcima +=1;
if(d > media)
NotaAcima +=1;
if(e > media)
NotaAcima +=1;
if(f > media)
NotaAcima +=1;
if(g > media)
NotaAcima +=1;
if(h > media)
NotaAcima +=1;
if(i > media)
NotaAcima +=1;
if(j > media)
NotaAcima +=1;
System.out.println("A quantidade de alunos com nota acima da
media e: "+NotaAcima);

}catch(Exception E){
System.out.println("Houve erro na entrada de dados");
}
}
}


O algoritmo mostrado acima torna-se impraticvel para uma grande quantidade de notas.
Seria muito mais coerente se usssemos uma nica varivel que comportasse muitos dados, isto ,
um vetor armazenando cada nota em uma posio diferente do mesmo. Vejamos como ficaria o
exemplo utilizando vetor:


Exemplo:

a) algoritmo em pseudocdigo

inicio
//declarao do vetor vclasse e das variaveis
vclasse= vetor[1..10] de reais;
soma,media:real;
NotaAcima,x:inteiro;

//inicializao de variveis
soma =0;
NotaAcima = 0;

//leitura do vetor vclasse
para x=1 ate 10 faca
leia(vclasse[x]);
fimpara;

//lao para acumular em soma os valores de vclasse
para x=1 ate 10 faca
soma = soma +vclasse[x];
fimpara;
media = soma/10;

//lao para veificar os valores de vclasse que esto acima da media
83
para x=1 ate 10 faca
se (vclasse[x] > media) entao
NotaAcima = NotaAcima+1;
fimse;
fimpara;

//numero de valores acima da media
escreva(NotaAcima);
fim.

b) programa em Java

import java.io.*;
class NotaAcimaM_Vet{
public static void main(String args[]){
float classe[] = new float[10]; //declaracao do array de 10 posicoes
de inteiros
int i,NotaAcima=0;
float soma=0, media;
BufferedReader entrada;
entrada = new BufferedReader(new InputStreamReader(System.in));

try{
//entrada de dados
System.out.println("Entre com as notas dos alunos:");
for(i=0;i<=9;i++)
classe[i] = Float.parseFloat(entrada.readLine());
//soma dos valores
for(i=0;i<=9;i++)
soma +=classe[i];
//calculo da media
media = soma/10;
for(i=0;i<=9;i++){
if (classe[i] > media)
NotaAcima +=1;
}
System.out.println("A quantidade de alunos com nota acima da
media e: "+NotaAcima);
}catch(Exception e){
System.out.println("Houve erro na entrada de dados!");
}

}
}

Exemplos:

1) Elabore um algoritmo que leia, some e imprima o resultado da soma, entre dois vetores inteiros de
50 posies.

Soluo:

a) algoritmo em pseudocdigo

inicio
v1,v2,v3:vetor[1..50] de inteiros;
i:inteiro;
para i=1 ate 50 faca
leia(v1[i],v2[i]);
fimpara;

para i=1 ate 50 faca
v3 = v1[i] + v2[i];
escreva(v3[i]);
fimpara;
84
fim.


b) programa em Java

import java.io.*;
class SomaVet{
public static void main(String args[]){
BufferedReader entrada;
entrada = new BufferedReader(new InputStreamReader(System.in));
int v1[] = new int[50];
int v2[] = new int[50];
int v3[] = new int[50];
int i;
try{
//leitura do vetor v1
System.out.println("Entre com os valores para o vetor A:");
for(i=0;i<=49;i++){
v1[i] = Integer.parseInt(entrada.readLine());

}
//leitura do vetor v2
System.out.println("Entre com os valores para o vetor B:");
for(i=0;i<=49;i++){
v2[i] = Integer.parseInt(entrada.readLine());
}
//calculo da soma de v1 com v2
System.out.println("Vetor resultante da soma de v1 com v2:");
for(i=0;i<=49;i++){
v3[i] = v1[i]+v2[i];
System.out.println(" "+v3[i]);
}
}catch(Exception e){
System.out.println("Houve erro na entrada de dados!!!");
}
}
}

2) Construa um algoritmo que preenha um vetor de 100 elementos inteiros, colocando 1 na posio
correspondente a um nmero par e 0 a um nmero mpar.

Soluo:

a) algoritmo em pseudocdigo

inicio
a:vetor[1..100] de inteiros;
i:inteiro;
para i=1 ate 100 faca
se (i mod 2 == 0) ento
a[i] = 1;
senao
a[i] = 0;
fimse;
fimpara;

para i=1 ate 100 faca
escreva(a[i]);
fimpara;
fim.

b) programa em Java

class PreencheVet{
public static void main(String args[]){
85
int a[] = new int[10];
int i;
for(i =0;i<=9;i++){
if((i % 2) == 0)
a[i] = 1;
else
a[i] = 0;
}
for(i =0;i<=9;i++)
System.out.print(" "+a[i]);
System.out.println();
}
}

3) Desenvolva um algoritmo que efetue a leitura de cinco elementos para um vetor A. No final,
apresentar a soma de todos os elementos que sejam mpares.

Soluo:

a) algoritmo em pseudocdigo

inicio
soma,i:inteiro;
a:vetor[1..5] de inteiros;

soma=0;
para i=1 ate 5 faca
leia(a[i]);
fimpara;
para i=1 ate 5 faca
se ((a[i] mod 2) != 0) entao
soma = soma + a[i];
fimse;
fimpara;
escreva('A soma e: ', soma);
fim.

b) programa em Java

import java.io.*;
class SomaImpar{
public static void main(String args[]){
BufferedReader entrada;
entrada = new BufferedReader(new InputStreamReader(System.in));
int soma=0,i;
int a[] = new int[5];
try{
System.out.println("Entre com os valores do vetor A:");
for(i=0;i<=4;i++)
a[i] = Integer.parseInt(entrada.readLine());
for(i=0;i<=4;i++){
if((a[i] % 2) != 0)
soma += a[i];
}
System.out.println("A soma dos elementos impares e: "+soma);
}catch(Exception e){
System.out.println("Houve algum erro na entrada");
}
}
}


4) Faa um algoritmo para calcular a mdia das temperaturas verificadas durante a semana a partir
das mdias dirias j obtidas.

86
Soluo:

a) algoritmo em pseudocdigo

inicio
temp:vetor[1..7] de reais;
soma,media:real;
i:inteiro;
temp[1] = 19.0;
temp[2] = 23.0;
temp[3] = 21.0;
temp[4] = 25.0;
temp[5] = 22.0;
temp[6] = 20.0;
temp[7] = 24.0;
soma = 0;
para i=1 ate 7 faca
soma = soma + temp[i];
fimpara;
media = soma/7;
escreva('A media de temperaturas da semana e:', media);
fim.


b) programa em Java

class MediaTemp{
public static void main(String args[]){
float soma=0,media;
int i;
float temp[] = new float[7];
temp[0] = 19;
temp[1] = 23;
temp[2] = 21;
temp[3] = 25;
temp[4] = 22;
temp[5] = 20;
temp[6] = 24;
for(i=0;i<=6;i++)
soma += temp[i];
media = soma/7;
System.out.println("A media das temperaturas e: "+media);
}
}

5) Faa um algoritmo para efetuar a ordenao dos elementos considerados no exemplo anterior,
exibindo o maior e o menor deles.

Soluo

a) algoritmo em pseudocdigo

inicio
temp:vetor[1..7] de reais;
i,j:inteiro;
temp[1] = 19.0;
temp[2] = 23.0;
temp[3] = 21.0;
temp[4] = 25.0;
temp[5] = 22.0;
temp[6] = 20.0;
temp[7] = 24.0;
para i=1 ate 6 faca
87
para j = i+1 ate 7 faca
se(temp[j] < temp[i]) entao
min = j;
x = temp[min];
temp[min] = temp[i];
temp[i] = x;
fimse;
fimpara;
fimpara;
escreva('O menor valor e:', temp[1]);
escreva('O maior valor e:', temp[7]);
fim.



b) programa em Java

class OrdenaVet{
public static void main(String args[]){
final int diasemana = 7;
int i,j,min;
float aux;
float temp[] = new float[diasemana];
temp[0] = 19;
temp[1] = 23;
temp[2] = 21;
temp[3] = 25;
temp[4] = 22;
temp[5] = 20;
temp[6] = 24;
for(i=0;i< diasemana -1;i++){
min = i;
for(j=i+1;i<diasemana;i++){
if(temp[j] < temp[min]){
min = j;
aux = temp[min];
temp[min] = temp[i];
temp[i] = aux;
}
}
}
System.out.println();
System.out.println("A temperatura minima da semana e: "+temp[0]);
System.out.println("A temperatura maxima da semana e: "+temp[6]);
}
}

6) Fazer um programa que leia uma varivel de 100 elementos numricos e verificar se existem
elementos iguais a 30. Se existirem, escrever as posies em que esto armazenadas.

Soluo:

a) algoritmo em pseudocdigo

inicio
numero:vetor[1..100] de inteiros;
i:inteiro;
para i= 1 ate 100 faca
leia(numeros[i]);
fimpara;
para i=1 ate 100 faca
se(numeros[i] == 30) entao
escreva(i);
fimse;
fimpara;
88
fim.

b) programa em Java

import java.io.*;
class Pesquisa{
public static void main(String args[]){
int numeros[] = new int[100];
int i;
BufferedReader entrada;
entrada = new BufferedReader(new InputStreamReader(System.in));

try{
System.out.println("Entre com os valores: ");
for(i=0;i<=99;i++)
numeros[i] = Integer.parseInt(entrada.readLine());
for(i=0;i<=99;i++){
if(numeros[i] == 30)
System.out.println("A posicao do elemento no vetor
e:"+(i+1));
}
}catch(Exception e){
System.out.println("Houve algum erro na entrada de dados");
}
}
}

7) A coordenao de Tecnologia em Desenvolvimento de Software do ICESAM deseja saber se
existem alunos cursando, simultaneamente, as disciplinas Lgica de Programao e
Organizao de Computadores. Existem disponveis em uma unidade de entrada os nmeros de
matrcula dos alunos de Lgica de Programao(no mximo 150) e de Organizao de
Computadores(no mximo 220 alunos). Cada conjunto dos nmeros de matrcula dos alunos de
uma disciplina tem a matrcula fictcia 9999 no final. Fazer um programa que imprima o nmero de
matrcula dos alunos que esto cursando estas disciplinas simultaneamente.

LP
... 9999
1 2 J 4 5 6 7 150

OC
... 9999
1 2 J 4 5 6 7 220

Soluo:

a) algoritmo em pseudocdigo

inicio
LP:vetor[1..151] de inteiros;
OC:vetor[1..221] de inteiros;
i,j:inteiro;

//leitura da matricula dos alunos que estao cursando LP
i=1;
leia(LP[i]);
enquanto (LP[i] != 9999) faca
i = i + 1;
leia(LP[i]);
fimenquanto;

//leitura da matricula dos alunos que estao cursando OC
89
i=1;
leia(OC[i]);
enquanto (OC[i] != 9999) faca
i = i + 1;
leia(OC[i]);
fimenquanto;

//verificacao da matricula simultanea em LP e OC
i=1;
enquanto (LP[i] != 9999) faca
j = i;
enquanto ((OC[j] != 9999) e (LP[i] != OC[j])) faca
j = j + 1;
fimenquanto;
se (LP[i] = OC[j]) entao
escreva(LP[i]);
fimse;
i = i + 1;
fimenquanto;
fim.

b) programa em Java

import java.io.*;
class VerifMatric{
public static void main(String args[]){
int LP[] = new int[151];
int OC[] = new int[221];
int i,j;
BufferedReader entrada;
entrada = new BufferedReader(new InputStreamReader(System.in));

try{
//leitura da matricula dos alunos que estao cursando LP
System.out.println("Entre com os numeros de matricula em LP:");
i=1;
LP[i] = Integer.parseInt(entrada.readLine());
while(LP[i] != 9999){
i++;
LP[i] = Integer.parseInt(entrada.readLine());
}

//leitura da matricula dos alunos que estao cursando OC
System.out.println("Entre com os numeros de matricula em OC:");
i=1;
OC[i] = Integer.parseInt(entrada.readLine());
while(OC[i] != 9999){
i++;
OC[i] = Integer.parseInt(entrada.readLine());
}

//verificacao da matricula simultanea em LP e OC
System.out.println("Alunos matriculados em LP e OC
simultaneamente:");
i=1;
while(LP[i] != 9999){
j = 1;
while((OC[j] != 9999) && (LP[i] != OC[j]))
j++;
if(LP[i] == OC[j])
System.out.println(LP[i]);
i++;
}
}catch(Exception e){
System.out.println("Houve erro na entrada de dados!!");
}
90

}
}

8) Escrever um programa que faa reserva de passagens areas de uma companhia. Alm da leitura
do nmero dos vos e quantidade de lugares disponveis, ler vrios pedidos de reserva,
constitudos do nmero da carteira de identidade do cliente e do nmero do vo desejado. Para
cada cliente, verificar se h disponibilidade no vo desejado. Em caso afirmativo, imprimir o
nmero da identidade do cliente, e o nmero do vo, atualizando o nmero de lugares disponveis.
Caso contrrio, avisar ao cliente da inexistncia de lugares. Indicando o fim dos pedidos de
reserva, existe um passageiro cujo nmero da carteira de identidade 9999. Considerar fixo e
igual a 37 o nmero de vos da companhia.
Estruturas de dados necessrias:

1
727 15

2
442 16 Cliente NVoo
3
331 0

.
. .

.
. .

.
. .

35
447
1
90

36
221 16

37
291 15

Soluo:

a) algoritmo em pseudocdigo

inicio
Voos,LDisp:vetor[1..37] de inteiros;
cliente, Nvoo, apont, i:inteiro;

para i = 1 ate 37 faca
leia(Voos[i],LDisp[i]);
fimpara;
leia(cliente,Nvoo);

//verificao da existencia do voo
enquanto(cliente != 9999) faca
i = 1;
enquanto ((i<=37) e (Nvoo != Voos[i])) faca
i = i+1;
fimenquanto;
se (Nvoo ==Voos[i]) entao
apont =i;
senao
escreva('Cliente: ', cliente, 'Voo ',Nvoo, ' inexistente');
apont = 0;
fimse;
se (apont != 0) entao
se (LDisp[apont] > 0) entao
escreva('Cliente: ',cliente, ' numero do voo: ',Nvoo);
Ldisp[apont] = Ldisp[apont] 1;
else
91
escreva('Cliente: ',cliente, ' numero do voo: ',Nvoo, ' lotado');
fimse;
fimse;
leia(cliente,Nvoo);
fimenquanto;
fim.

b) programa em Java

import java.io.*;
class ReservaVoo{
public static void main(String args[]){
BufferedReader entrada;
entrada = new BufferedReader(new InputStreamReader(System.in));
int Voos[] = new int[37] ,LDisp[] = new int[37];
int cliente,NVoo, apont, i;
try{
for(i=0;i<=36;i++){
System.out.println("Entre com o voo e a quantidade de
lugares disponiveis neste voo:");
Voos[i] = Integer.parseInt(entrada.readLine());
LDisp[i] = Integer.parseInt(entrada.readLine());
}
cliente = Integer.parseInt(entrada.readLine());
NVoo = Integer.parseInt(entrada.readLine());

//verificao da existencia do voo
while((i <= 37)&&(NVoo != Voos[i])){
i=1;
if(NVoo == Voos[i]){
apont = i;
}else{
System.out.println("O cliente: "+cliente+ " voo
"+NVoo+" inexistente");
apont = 0;
}
//verificao da existencia de lugar
if (apont != 0){
System.out.println("O cliente: "+cliente+ " numero
do voo "+NVoo);
LDisp[apont] --;
}else
System.out.println("O cliente: "+cliente+ " numero
do voo "+NVoo+ " lotado");
System.out.println("Entre com o voo e a quantidade de
lugares disponiveis neste voo:");
cliente = Integer.parseInt(entrada.readLine());
NVoo = Integer.parseInt(entrada.readLine());

}
}catch(Exception e){
System.out.println("Houve algum erro na entrada de dados");
}
}
}

9) Escrever um programa para corrigir provas de mltipla escolha. Cada prova tem 10 questes,
cada questo valendo um ponto. O primeiro conjunto de dados a ser lido ser o gabarito para a
correo da prova. Os outros dados so os nmeros dos alunos e suas respectivas respostas e o
ltimo nmero, do aluno fictcio, ser 9999.
O programa dever calcular e imprimir:
a) para cada aluno, o seu nmero e sua nota.
b) A porcentagem de aprovao, sabendo-se que a nota mnima de aprovao 6.
c) A nota que teve maior freqncia absoluta, ou seja, a nota que aparece maior nmero de vezes
(supondo a inexistncia de empates).

92
Estrutura de dados principal:

Gabarito nmero nota


Respostas Aprovados Total


Freqncias Maior Porcentagem



Soluo:

a) algoritmo em pseudocdigo

inicio
gabarito,resposta:vetor[1..10] de caracter;
frequencia:vetor[0..10] de inteiros;
i, aprovados,maior, nota,notamaio,numero,total:inteiro;
porcent:real;

//atribuio dos valores iniciais necessrios
total = 0;
para i=0 ate 10 faca
frequencia[i] = 0;
fimpara;
escreva('Entre com o gabarito da prova');
para i=1 ate 10 faca
leia(gabarito[i]);
fimpara;
leia(numero);
enquanto(numero != 9999) faca
para i=1 ate 10 faca
leia(resposta[i]);
fimpara;
//correcao da prova
nota = 0;
para i=1 ate 10 faca
se (gabarito[i] == resposta[i]) entao
nota = nota + 1;
fimse;
fimpara;
escreva('Numero ', numero, ' - nota: ', nota);
total = total +1;
//determinao da frequencia das notas
frequencia[nota] = frequencia[nota] + 1;
leia(numero);
fimenquanto;

//determinao da porcentagem de aprovaao
aprovados = 0;
para i= 6 ate 10 faca
aprovados = aprovados + frequencia[i];
fimpara;
porcent = aprovados/total*100;
//deteminacao da nota de maior frequencia
maior =0;
para i= 0 ate 10 faca
se (frequencia[i] > maior) entao
maior = frequencia[i];
93
notamaior = i;
fimse;
fimpara;
escreva(' ',' porcentagem de alunos aprovados: ',porcent);
escreva(' ',' Nota de maior frequencia: ',notamaior);
fim.


b) programa em Java

import java.io.*;
class CorrecaoProva{
public static void main(String args[]){
String gabarito[] = new String[10], respostas[]= new String[10];
int frequencia[] = new int[11];
int i,aprovados=0, maior=0, nota=0, notamaior=0,numero, total=0;
double porcent;
BufferedReader entrada;
entrada = new BufferedReader(new InputStreamReader(System.in));

try{
for(i=0; i<=10;i++)
frequencia[i] = 0;
System.out.println("Entre com o gabarito da prova:");
for(i=0;i<=9;i++)
gabarito[i] = entrada.readLine();
System.out.println("Entre com o numero do aluno:");
numero = Integer.parseInt(entrada.readLine());
while (numero != 9999){
for(i=0;i<=9;i++)
respostas[i] = entrada.readLine();
//correcao da prova
for (i=0;i<=9;i++)
if(gabarito[i] == respostas[i])
nota ++;
System.out.println("Numero "+numero+ " - Nota: "+nota );
total++;
//determinao da frequencia das notas
frequencia[nota] ++;
System.out.println("Entre com o numero do aluno:");
numero = Integer.parseInt(entrada.readLine());
}
for (i=7;i<=9;i++)
aprovados += frequencia[i];
porcent = aprovados/total*100;
//Determinacao da nota de maior frequencia
for(i=0;i<=10;i++)
if (frequencia[i] > maior){
maior = frequencia[i];
notamaior = i;
}
System.out.println(" "+"Porcentagem de alunos aprovados:
"+porcent);
System.out.println(" "+"Nota de maior frequencia: "+notamaior);
}catch(Exception e){
System.out.println("Houve algum erro na entrada!!");
}
}
}


10) Esto disponveis num
equipamento de entrada de dados informaes sobre o estoque de mercadorias de uma loja. So
dados os cdigos das mercadorias e as respectivas quantidades existentes. A seguir, esto os
pedidos dos clientes. Escrever um programa para a atualizao do estoque, tal que:
94
a) seja lido e listado o
estoque inicial (mximo de 100 mercadorias).
b) Sejam lidos
os pedidos dos clientes, constitudos, cada um, do nmero do cliente, cdigo da
mercadoria e quantidade desejada;
c) Seja
verificado, para cada pedido, se ele pode ser integralmente atendido. Em caso negativo,
imprimir o nmero do cliente e a mensagem Estoque insuficiente.
d) Seja
atualizado o estoque aps cada operao;
e) Seja listado
o estoque final.

Observao: considerar que, separando os dados do estoque inicial dos de pedidos, existe
um dado cdigo de mercadoria 9999 e. encerrando os pedidos, h um cliente fictcio, cujo
nmero 9999.

Soluo:

a) algoritmo em pseudocdigo

inicio
Estoque,codigo:vetor[1..101] de inteiros;
cliente,i,mercadoria,n,quantidade:inteiro;
i = 1;
//leitura e escrita do estoque incial
leia(codigo[i],Estoque[i]);
enquanto (codigo[i] != 9999) faca
escreva(codigo[i],estoque[i]);
i = i+1;
leia(codigo[i],Estoque[i]);
fimenquanto;
n = i 1;
leia(cliente,mercadoria,quantidade);
enquanto (cliente != 9999) faca
//verificacao da existencia da mercadoria
i = 1;
enquanto ((i!= n) e (mercadoria != codigo[i]) faca
i = i+1;
fimenquanto;
se (mercadoria = codigo[i]) entao
se (Estoque[i] >= quantidade) entao
Estoque[i] = Estoque[i] quantidade;
senao
escreva('cliente: ',cliente, ' - mercadoria: ',mercadoria, ' - no temos a
mercadoria em estoque suficiente');
fimse;
senao
escreva('cliente: ',cliente, ' - mercadoria: ',mercadoria, ' - no existe a
mercadoria pedida');
fimse;
leia(cliente,mercadoria,quantidade);
fimenquanto;
//escrita do estoque final
enquanto(codigo[i] != 9999) faca
escreva(codigo[i], Estoque[i]);
i = i+1;
fimenquanto;
fim.


b) programa em Java
95

import java.io.*;
class Controle_Estoque{
public static void main(String args[]){
int Estoque[] = new int[101], codigo[] = new int[101];
int i, cliente, n, mercadoria, quantidade;
BufferedReader entrada;
entrada = new BufferedReader(new InputStreamReader(System.in));
try{
i=1;
//leitura e escrita do estoque inicial
System.out.println("Entre com o codigo e a quantidade em
estoque:");
codigo[i] = Integer.parseInt(entrada.readLine());
Estoque[i] = Integer.parseInt(entrada.readLine());
while (codigo[i] != 9999){
System.out.println("Codigo\tEstoque");
System.out.println(codigo[i]+"\t"+Estoque[i]);
i++;
System.out.println("Entre com o codigo e a quantidade em
estoque:");
codigo[i] = Integer.parseInt(entrada.readLine());
Estoque[i] = Integer.parseInt(entrada.readLine());
}
n=i-1;
System.out.println("Entre com o codigo do cliente, o codigo da
mercadoria e a quantidade:");
cliente = Integer.parseInt(entrada.readLine());
mercadoria = Integer.parseInt(entrada.readLine());
quantidade = Integer.parseInt(entrada.readLine());
while (cliente != 9999){
//verificacao da existencia da mercadoria
i = 1;
while((i != n)&&(mercadoria != codigo[i]))
i++;
if (mercadoria == codigo[i]){
if (Estoque[i] >= quantidade)
Estoque[i] -= quantidade;
else
System.out.println("'Cliente: "+cliente + "
- mercadoria: "+mercadoria+ " - nao temos a mercadoria em estoque suficiente");
}else{
System.out.println("'Cliente: "+cliente + " -
mercadoria: "+mercadoria+ " - nao temos a mercadoria pedida");
}
System.out.println("Entre com o codigo do cliente, o
codigo da mercadoria e a quantidade:");
cliente = Integer.parseInt(entrada.readLine());
mercadoria = Integer.parseInt(entrada.readLine());
quantidade = Integer.parseInt(entrada.readLine());

}
//escrita do estoque final
i = 1;
while(codigo[i] != 9999){
System.out.println("Codigo\tEstoque");
System.out.println(codigo[i]+"\t"+Estoque[i]);
i++;
}
}catch(Exception e){
System.out.println("Houve algum erro na entrada");
}
}
}


11) Este exemplo demonstra a utilizao de um array para armazenar um conjunto de
argumentos do tipo inteiro, passado pelo usurio na linha de execuo.
96

Soluo:
class Exemplo11Vetor{
public static void main(String args[]){
int i, total=0;
int N[] = new int[10]; //declara um array N de 10 elementos do tipo
int
if(args.length > 0){
try{
for(i=0;i<args.length;i++){
//armazena cada um dos elementos no array
N[i] = Integer.parseInt(args[i]);
total = total + N[i]; //acumula o somatorio
dos elementos
}
System.out.println("Os numeros digitados na ordem inversa
foram:");
for(i = args.length-1;i>=0;i--)
System.out.println(N[i] + " ");
System.out.println();
System.out.println("O somatorio dos numeros, "+ total);
System.out.println("A media entre eles , "+
(total/args.length));
}catch(NumberFormatException e){
System.out.println("Os argumentos devem ser numerso do
tipo inteiro");
}
}
else
System.out.println("Digite pelo menos um numero!");
}
}


12) Este exemplo demonstra a criao e inicializao simultanea de um array

Soluo:

class Exemplo12Vetor{
public static void main(String args[]){
String nomes = "";
char CaracterArray[] = {'a','b','c','d','e','f','g'}; //array de
caracteres
System.out.println("Mostrando o array: "+
String.valueOf(CaracterArray));
System.out.println("Quant. de elementos: "+ CaracterArray.length);
System.out.println("1 e 3 caracteres " +
String.valueOf(CaracterArray,0,3));
System.out.println();
//criando um array de Strings
String StringArray[] = {"Aprendendo","a","Linguagem","Java"};
for(int i=0;i <StringArray.length;i++) //armazena os nomes do array
nomes = nomes + StringArray[i] + " ";
System.out.println("Mostrando o array: "+nomes);
System.out.println("Quant. de elementos do array:
"+StringArray.length);
System.out.println("Mostrando o 1 elemento do array:
"+StringArray[0]);
System.out.println("Monstrando o ultimo elemento do array:
"+StringArray[StringArray.length -1]);
}
}





97
Variveis compostas multidimensionais {matrizes)

As variveis composta multidimensionais, como o prprio nome diz, permitem a criao de
vetores com mais de um ndice. A essas estruturas indexadas damos o nome de matrizes. Em
particular, daremos nfase as de duas dimenses.

Declarao

<identificador>: matriz [li1..lf1,li2..lf2] de tipo;
Em que:
Li1 representa o limite inicial da primeira dimenso da matriz;
Lf1 representa o limite final da primeira dimenso da matriz;
Li2 representa o limite inicial da segunda dimenso da matriz;
Lf2 representa o limite final da segunda dimenso da matriz;
Identificador o nome dado a matriz.
tipo representa qualquer tipo bsico ou tipo anteriormente definido.

Exemplo:
Um vetor de 10 posies de reais poderia ter a seguinte definio e declarao:

msala: matriz[0..3,0..3] de real;

Manipulao

Para acessar um elemento em uma estrutura composta multidimensional matriz
precisamos da linha e da coluna onde est armazenado o elemento.

0 1 2 J
0
1
2
J



Para utilizar o vetor, ns o inserimos em um nico lao de repetio, fazendo com que haja
variao em seu ndice. Como em uma estrutura multidimensional possumos mais de um ndice, faz-
se necessria a utilizao de mais laos de repetio, em mesmo nmero do que o nmero de
dimenses da matriz.

Para percorre uma matriz podemos utilizar duas tcnicas que podero ser utilizadas de
acordo com a necessidade da soluo, so elas:
1) fixar a linha e variar a coluna
2) fixar a coluna e varia a linha


Exemplos:

1) Construa um algoritmo que efetue a leitura, a soma e a impresso do resultado entre duas
matrizes inteiras que comportem 25 elementos.

Soluo:

a) algoritmo em pseudocdigo

inicio
ma = matriz[1..5,1..5] de inteiros;
mb = matriz[1..5,1..5] de inteiros;
mr = matriz[1..5,1..5] de inteiros;
i,j:inteiro;
i = 1;
ndices de coluna
ndices de linhas
msala[1,2]
98
enquanto (i <= 5) faca
j = 1;
enquanto (j <= 5) faca
leia(ma[i,j],mb[i,j]);
mr[i,j] = ma[i,j] = mb[i,j];
j = j + 1;
fimenquanto;
i = i+1;
fimenquanto;
j = 1;
enquanto (j <= 5) faca
i = 1;
enquanto (i <= 5) faca
escreva(mr[i,j]);
i = i + 1;
fimenquanto;
j = j+1;
fimenquanto;
fim.

b) programa em Java

import java.io.*;
class ExemploMat1{
public static void main(String args[]){
int ma[][] = new int [5][5];
int mb[][] = new int [5][5];
int mr[][] = new int [5][5];
int i,j;
BufferedReader entrada;
entrada = new BufferedReader(new InputStreamReader(System.in));
try{
//preenchimento da matriz A
System.out.println("Entre com os valores para a matriz A:");
i=0;
while (i < 5){
j=0;
while (j <5){
ma[i][j] = Integer.parseInt(entrada.readLine());

j++;
}
i++;
}
//preenchimento da matriz B
System.out.println("Entre com os valores para a matriz B:");
i=0;
while (i < 5){
j=0;
while (j <5){
mb[i][j] = Integer.parseInt(entrada.readLine());

j++;
}
i++;
}
//matriz resultante da soma de ma com mb
System.out.println("Matriz soma mr:");
j=0;
while (j < 5){
i=0;
while (i <5){
mr[i][j] = ma[i][j] + mb [i][j];
System.out.print(" "+mr[i][j]);
i++;
}
99
System.out.println();
j
++;
}
}catch(Exception e){
System.out.println("Ocorreu algum erro na entrada de dados");
}

}
}


2) Elabore um algoritmo que leia duas matrizes A e B di tipo (3x3) e calcule em uma matriz R sua
multiplicao, ou seja R = A * B.

Soluo:

a) algoritmo em pseudocdigo

inicio
ma,mb,mr:matriz[1..3,1..3] de inteiros;
i,j,k:inteiro;

//entrada de dados matriz A
para i = 1 ate 3 faca
para j = 1 ate 3 faca
leia(ma[i,j]);
fimpara;
fimpara;

//entrada de dados matriz B
para i = 1 ate 3 faca
para j = 1 ate 3 faca
leia(mb[i,j]);
fimpara;
fimpara;

//multiplicao de A por B
para i = 1 ate 3 faca
para j = 1 ate 3 faca
mr[i,j] = 0;
para k = 1 ate 3 faca
mr[i,j] = mr[i,j] + ma[i,k] * mb[k,j];
fimpara;
fimpara;
fimpara;

//sada de dados matriz R
para i = 1 ate 3 faca
para j = 1 ate 3 faca
escreva(mr[i,j]);
fimpara;
fimpara;
fim.

b) programa em Java

import java.io.*;
class ExemploMat2{
public static void main(String args[]){
int ma[][] = new int [3][3];
int mb[][] = new int [3][3];
int mr[][] = new int [3][3];
int i,j,k;
100
BufferedReader entrada;
entrada = new BufferedReader(new InputStreamReader (System.in));

try{
//entrada de dados - matriz A
System.out.println("MATRIZ A:");
for(i =0;i<3;i++){
for(j=0;j<3;j++){
System.out.println("Entre com o valor A["+i+",
"+j+"]");
ma[i][j] = Integer.parseInt(entrada.readLine());
}
}
//entrada de dados - matriz B
System.out.println("MATRIZ B:");
for(i =0;i<3;i++){
for(j=0;j<3;j++){
System.out.println("Entre com o valor B["+i+",
"+j+"]");
mb[i][j] = Integer.parseInt(entrada.readLine());
}
}
//Multiplicacao de A por B
System.out.println("A matriz produto R e: ");
for(i =0;i<3;i++){
for(j=0;j<3;j++){
mr[i][j] = 0;
for(k=0;k<3;k++){
mr[i][j] += ma[i][k] * mb[k][j];

}
System.out.print(" "+mr[i][j]);
}
System.out.println();
}
}catch(Exception e){
System.out.println("Ocorreu algum erro na entrada de dados");
}
}
}


3) Dada uma matriz de 6 linhas e 2 colunas de inteiros, calcular e exibir a mdia geomtrica dos
valores de cada uma das linhas. A mdia geomtrica calculada pela seguinte expresso: sqrt(x1 *
x2), representa a raiz quadrada do resultado da multiplicao dos elementos da coluna 1 (x1) pelos
elementos da coluna 2 (x2).

Soluo:

a) algoritmo em pseudocdigo

inicio
g:matriz[1..6,1..2] de inteiros;
i,j:inteiro;
prod:real;

para i = 1 ate 6 faca
prod = 1;
para j = 1 ate 2 faca
leia(g[i,j]);
prod = prod * g[i,j];
fimpara;
escreva(linha , i, = , sqrt(prod));
fimpara;
fim.

101

b) programa em Java

import java.io.*;
class ExemploMat3{
public static void main(String args[]){
int g[][] = new int [6][2];
int i,j;
double prod;
BufferedReader entrada;
entrada = new BufferedReader(new InputStreamReader(System.in));
try{

for (i=0;i<6;i++){
prod = 1;
for(j=0;j<2;j++){
System.out.println("Entre com os valores de
G["+i+", "+j+"]");
g[i][j] = Integer.parseInt(entrada.readLine());

prod *= g[i][j];
}
System.out.println("Linha - " + 1 + ":
"+Math.sqrt(prod));
}

}catch(Exception e){
System.out.println("Ocorreu algum erro na entrada de dados");
}

}
}


4) Mdia dos alunos de uma disciplina. Considere uma matriz de 30 linhas e 3 colunas. Cada linha
est associada a um aluno de uma determinada disciplina, e as colunas esto associadas s notas
das trs provas referentes quele estudante. O procedimento abaixo descreve a mdia de cada
estudante e a mdia da turma em cada prova.

Soluo:

a) algoritmo em pseudocdigo

inicio
const
nProvas = 3;
nAlunos = 30;
NotaProva : matriz{1..nAlunos,1..nProvas] de reais;
MedAlunos:vetor[1..nAlunos] de reais;
MedProvas: vetor[1..nProvas] de reais;
I,j:inteiro;
Soma : real;
Para i = 1 ate nAlunos faca
Soma = 0;
Para j = 1 ate nProvas faca
Soma = soma + NotaProva[i,j];
MedAlunos[i] = soma/nProvas;
fimpara;
fimpara;

Para j = 1 ate nProvas faca
Soma = 0;
Para i = 1 ate nProvas faca
Soma = soma + NotaProva[i,j];
MedProvas[j] = soma/nAlunos;
102
fimpara;
fimpara;

para i = 1 ate nAlunos faca
escreva(MedAlunos[i]);
fimpara;
para i = 1 ate nProvas faca
escreva(MedProvas[i]);
fimpara;

fim.

b) programa em Java

import java.io.*;
class ExemploMat4{
public static void main(String args[]){
final int nprovas = 3;
final int nalunos = 30;
float NotaProva[][] = new float [nalunos][nprovas];
float MedAlunos[] = new float [nalunos];
float MedProvas[] = new float [nprovas];
float soma;
BufferedReader entrada;
entrada = new BufferedReader(new InputStreamReader(System.in));

try{
for (int i = 0; i< nalunos;i++){
soma = 0;
for (int j =0;j <nprovas;j++){
System.out.println("Entre com a nota do
aluno["+i+"],nota ["+j+"]");
NotaProva[i][j] =
Float.parseFloat(entrada.readLine());
soma += NotaProva[i][j];
MedAlunos[i] = soma/nprovas;
}
}
for (int j = 0; j< nprovas;j++){
soma = 0;
for (int i =0;i <nalunos;i++){
soma += NotaProva[i][j];
MedProvas[j] = soma/nalunos;
}
}
for (int i = 0; i< nalunos;i++){
System.out.println("A media do aluno ["+i+"] =
"+MedAlunos[i]);
}
for (int i =0;i <nprovas;i++){
System.out.println("Media da prova ["+i+"] =
"+MedProvas[i]);
}

}catch(Exception e){
System.out.println("Ocorreu algum erro na entrada de dados!!!");
}
}
}



5) Escrever um programa que leia uma matriz 4x4, multiplique os elementos da diagonal principal por
uma constante k, tambm lida, e escreva a matriz resultante.

Soluo:
103
a) algoritmo em pseudocdigo

inicio
A:matriz[1..4,1..4] de inteiros;
I,j,k:inteiro;

//leitura da matriz A e da constante k
para i =1 ate 4 faca
para j = 1 ate 4 faca
leia(A[i,j]);
fimpara;
fimpara;
leia(k);
//calculo do produto de K pela diagonal principal de A
para i = 1 ate 4 faca
a[i,i] = a[i,i] * k;
fimpara;
//sada de dados
para i =1 ate 4 faca
para j = 1 ate 4 faca
escreva(A[i,j]);
fimpara;
fimpara;
fim.

b) programa em Java

import java.io.*;
class ExemploMat5{
public static void main(String args[]){
int A[][] = new int[4][4];
int i,j,k;
BufferedReader entrada;
entrada = new BufferedReader(new InputStreamReader(System.in));

try{
System.out.println("Entre com os valores da matriz A:");
for(i =0;i<4;i++){
for(j =0;j<4;j++){
System.out.println("Entre com o elemento
A["+i+","+j+"]");
A[i][j] = Integer.parseInt(entrada.readLine());
}
}
System.out.println("Entre com o valor de k:");
k = Integer.parseInt(entrada.readLine());
for(i=0;i<4;i++)
A[i][i] = A[i][i] * k;
System.out.println("A nova matriz A e: ");
for(i =0;i<4;i++){
for(j =0;j<4;j++){
System.out.print(" "+A[i][j]);

}
System.out.println();
}
}catch(Exception e){
System.out.println("Ocorreu algum erro na saida!!");
}
}
}

6) Dada uma tabela de 4x5 elementos, calcular a soma de cada linha e a soma de todos os
elementos.

Soluo:

a) algoritmo em pseudocdigo
104

inicio
Mat:matriz[1..4,1..5] de inteiros;
I,j,total,somalinha:inteiro;

Total = 0;
//leitura da matriz Ma
para i =1 ate 4 faca
para j = 1 ate 5 faca
leia(Ma[i,j]);
fimpara;
fimpara;
//soma dos elementos da linha
para i =1 ate 4 faca
somalinha = 0;
para j = 1 ate 5 faca
somalinha = somalinha +Mat[i,j];
fimpara;
escreva(LINHA , i, : ,somalinha);
total = total + somalinha;
fimpara;
//sada de dados
escreva(Total: , total);
fim.

b) programa em Java

import java.io.*;
class ExemploMat6{
public static void main(String args[]){
int Mat[][] = new int[4][5];
int i,j,total=0,somalinha;
BufferedReader entrada;
entrada = new BufferedReader(new InputStreamReader(System.in));

try{
System.out.println("Entre com os valores da matriz Mat:");
for(i =0;i<4;i++){
for(j =0;j<5;j++){
System.out.println("Entre com o elemento
Mat["+i+","+j+"]");
Mat[i][j] = Integer.parseInt(entrada.readLine());
}
}
for(i =0;i<4;i++){
somalinha = 0;
for(j =0;j<5;j++){
somalinha += Mat[i][j];

}
System.out.println("Linha "+i+": "+somalinha);
total +=somalinha;
}
System.out.println("O total da somatoria das linha e: "+total);
}catch(Exception e){
System.out.println("Ocorreu algum erro na saida!!");
}
}
}






105
7) Uma certa fbrica produziu dois tipos de motores M1 e M2 nos meses de janeiro a Dezembro, e o
nmero de motores foi registrado na tabela a seguir:

M1 M2
Jan 30 20
Fev 5 10
Mar 7 15
.
.
.
.
.
.
.
.
.
Dez 18 25


O setor de controle de vendas tem uma tabela do custo e do lucro (em mil reais) obtidos com cada
motor:
Custo Lucro
M1 10 3
M2 15 2

Fazer um algoritmo que, a partir da produo mensal de motores M1 e M2 e seus respectivos custos
e lucros, calcule o custo e o lucro em cada um dos meses e o custo e o lucros anuais.
Soluo:

a) algoritmo em pseudocdigo

inicio
Producao,CLM:matriz[1..12,1..2] de inteiros; //produo mensal e custo e lucro
mensal
Valores: matriz[1..2,1..2] de inteiros; //custo e lucro de cada motor
CL: vetor[1..2] de inteiros; //custo e lucro anuais dos motores
I,j,k:inteiro;

//leitura da matriz producao
para i =1 ate 12 faca
para j = 1 ate 2 faca
leia(Producao[i,j]);
fimpara;
fimpara;

//insero do custo e do lucro de cada motor
para i =1 ate 2 faca
para j = 1 ate 2 faca
leia(Valores[i,j]);
fimpara;
fimpara;

//Calculo do custo e do lucro mensais
para i =1 ate 12 faca
para j = 1 ate 2 faca
CLM[i,j] = 0;
para k = 1 ate 2 faca
CLM[i,,j] = CLM[i,j] + Producao[i,k] * Valores[k,j];
fimpara;
fimpara;
fimpara;

//calculo do custo e do lucro anuais
para i =1 ate 2 faca
CL[j] = 0;
para j = 1 ate 12 faca
CLA[j] = CL[j] = CLM [i,j];
fimpara;
106
fimpara;
//sada de dados
para i =1 ate 12 faca
para j = 1 ate 2 faca
escreva(CLM[i,j]);
fimpara;
fimpara;
escreva(Custo anual: , CLA[1], Lucro anual: , CLA[2]);
fim.

b) programa em Java

import java.io.*;
class ExemploMat7{
public static void main(String args[]){
int Producao[][] = new int[12][2];
int CLM[][] = new int[12][2];
int Valores[][] = new int[2][2];
int CLA[] = new int[2];
int i,j,k;
BufferedReader entrada;
entrada = new BufferedReader(new InputStreamReader(System.in));

try{
System.out.println("Entre com os valores da matriz Producao:");
for(i =0;i<12;i++){
for(j =0;j<2;j++){
System.out.println("Entre com o elemento
Producao["+i+","+j+"]");
Producao[i][j] =
Integer.parseInt(entrada.readLine());
}
}
System.out.println("Entre com o custo e lucro de cada motor:");
for(i =0;i<2;i++){
for(j =0;j<2;j++){
Valores[i][j] =
Integer.parseInt(entrada.readLine());
}
}
for(i =0;i<12;i++){
for(j =0;j<2;j++){
CLM[i][j] = 0;
for(k=0;k<2;k++){
CLM[i][j] += Producao[i][k] * Valores[k][j];
}
}
}
for(j =0;j<2;j++){
CLA[j] = 0;
for(i =0;i<12;i++){
CLA[j] += CLM[i][j];
}
}
System.out.println("Custo e lucro mensais:");
for(i =0;i<12;i++){
for(j =0;j<2;j++){
System.out.print(" "+CLM[i][j]);
}
System.out.println();
}
System.out.println("Custo anual: "+CLA[0]+"\nLucroAnul:
"+CLA[1]);
}catch(Exception e){
System.out.println("Ocorreu algum erro na saida!!");
}
}
107
}

Exerccios de Fixao - vetores e matrizes

1) Crie um aplicativo que leia 10 valores inteiros quaisquer e imprima na tela os que so maiores
que a mdia dos valores coletados.
2) Crie um aplicativo que colete uma indefinida quantidade de nmeros pela linha de execuo e
no final mostre o menor o maior nmero fornecido.
3) Faa um programa que colete 10 nomes de pessoas e os armazene em array. No final
verifique se uma determinada pessoa foi cadastrada no array, informando o usurio.
4) Uma escola precisa de um programa que controle a mdia das notas dos alunos de cada
classe e a mdia das notas de todos os alunos da escola. Sabendo que essa escola possui
trs classes com 5 alunos em cada classe, gerando um total de 15 notas, crie um programa
que receba as notas de cada aluno de cada classe w no final apresente a mdia de cada
classes e a mdia a escola em geral.
5) Faa um programa que utilize um mtodo para organizar uma quantidade qualquer de
nmeros inteiros fornecidos pelo usurio na linha de execuo do programa, sendo que
esses nmeros devero ser organizados da seguinte forma: primeiro os nmeros pares em
ordem crescente e depois os nmeros mpares em ordem decrescente.











































108
Modularizao

Um problema complexo pode ser simplificado quando dividido em vrios subproblemas. Para
acompanhar essa abordagem, sero apresentados conceitos e tcnicas que permitem a diviso de
um algoritmo em mdulos ou subalgoritmos.

Decomposio

A decomposio de um problema fator determinante para a reduo da complexidade.
Lembremos que complexidade sinnimo de variedade, ou seja, a quantidade de situaes
diferentes que um problema pode apresentar. Assim, quando decompomos um problema em
subproblemas, estamos invariavelmente dividindo tambm a complexidade e, por conseqncia,
simplificando a resoluo. Outra grande vantagem da decomposio que permite focalizar a
ateno em um problema pequeno de cada vez, o que ao final produzir uma melhor compreenso
do todo.
conveniente que adotemos, ento, um critrio para orientar o processo de decomposio:
Dividir o problema em suas partes principais;
Analisar a diviso obtida para garantir coerncia;
Se alguma parte ainda permanecer complexa, decomp-la tambm;
Analisar o resultado para garantir entendimento e coerncia.

Esse processo de decomposio contnuo tambm conhecido como Refinamentos
Sucessivos, porque se parte de um problema complexo e abrangente, que sucessivamente dividido
at resultar em problemas mais simples e especficos.

Procedimentos

Um procedimento tambm conhecido como sub-rotina, um conjunto de instrues que
realiza determinada tarefa. Um algoritmo de procedimento criado da mesma que outro algoritmo
qualquer: deve ser identificado, possui variveis, operaes e at funes.

Pseudocdigo:
procedimento nome_procedimento (lista de parmetros)
//declarao das variveis locais ao procedimento
//instrues do procedimento
fimprocedimento;

Java:
<modificadores> <tipo_retorno> <nome_mtodo> (<argumentos>){
<tipo_retorno> <nome_varivel> = <valor_inicial>;
<instrues>;
return <nome_varivel_retorno>;
}

Onde:
d) <nome_mtodo>: um identificador vlido da linguagem. Obedece s mesmas
regras que os identificadores de classe, objeto e varivel.
e) <argumentos>: indica a lista de argumentos que sero passados como parmetros
para os mtodo. A sintaxe dos argumentos a de declarao de
variveis: tipo identificador, e os vrios parmetros so separados por
vrgulas.
f) <tipo_retorno>: indica o tipo do valor retornado pelos mtodos. Esse tipo pode ser um
tipo primitivo, uma classe ou void, no caso de no retornar valor
(equivalente a um procedimento).
g) return: palavra reservada que indica o valor que ser devolvido para o programa,
sendo associada com a varivel que armazena esse valor. No caso de
um mtodo com tipo de retorno void, nada devolvido, portanto no h
retorno e desnecessrio utilizar return.
h) <modificadores>: so elementos que caracterizam o mtodo quanto visibilidade
(escopo) e qualidade. Os mtodos, como classes e as variveis, podem
possuir mais de um modificador, no importando sua ordem.
109

Os modificadores mais utilizados so:
public: pode ser invocado livremente. Indica um mtodo que visvel para qualquer
um que enxergue a classe.
protected: pode ser utilizado apenas no mesmo pacote e em subclasses.
private: pode ser invocado apenas na classe.
final: no pode ser sobrescrito. Equivale declarao de constante.
static: no necessita de objeto. Pode ser invocado a partir do nome da classe. Por
exemplo: Integer.parseInt(<String>).

Alm desses, existem outros modificadores, como por exemplo: abstract, native, transient,
volatile e synchronized.
Se no h modificador, o mtodo pode ser chamado apenas no mesmo pacote.

Chamada de procedimentos

A chamada de um procedimento o momento em que o procedimento acionado e seu
cdigo executado, isto , a tarefa associada a ele realizada pelo algoritmo principal.

Algoritmo principal
//declarao de variveis utilizadas no algoritmo principal
//Declarao do procedimento
Procedimento nome_do_procedimento()
ffdeclaracao das variaveis locais ao procedimento
inicio_do_procedimento
instruoes do procedimento
fim_do_procedimento
Inicio do algoritmo principal
instrues do algoritmo principal
fim do algoritmo principal

Exemplos:

Elaborar um algoritmo que realize a operao aritmtica escolhida pelo usurio, a saber: adio,
subtrao, multiplicao ou diviso, entre dois valores fornecidos por ele. Dever ser criado um
menu de opes para o usurio.













Soluo:

a) algoritmo em pseudocdigo

inicio
opcao:inteiro;

Procedimento ModAdicao();
v1,v2,res:real;
inicio
leia(v1,v2);
res = v1 + v2;
escreva (res);
Mdulo
principal
(menu)
Mdulo
principal
(menu)
Mdulo
principal
(menu)
Mdulo
principal
(menu)
Mdulo
principal
(menu)
110
fim.

Procedimento ModSubtr();
v1,v2,res:real;
inicio
leia(v1,v2);
res = v1 - v2;
escreva (res);
fim.

Procedimento ModMultip();
v1,v2,res:real;
inicio
leia(v1,v2);
res = v1 * v2;
escreva (res);
fim.

Procedimento ModAdicao();
v1,v2,res:real;
inicio
leia(v1,v2);
res = v1 / v2;
escreva (res);
fim.

//inicio do algoritmo principal
leia(opcao);
escolha (opcao)
caso 1: ModAdicao();
caso 2: ModSubtr();
caso 3: ModMultip();
caso 4: ModDiv();
casocontrario: escreva('sair do programa');
fimescolha;
fim.


b) programa em Java

import java.io.*;
class Menu{
public static void main(String args[]){
BufferedReader entrada;
entrada = new BufferedReader(new InputStreamReader(System.in));
try{
System.out.println("1 : Adicao");
System.out.println("2 : Subtracao");
System.out.println("3 : Multiplicacao");
System.out.println("4 : Divisao");
System.out.println("Qual a opcao desejada?");
int opcao = Integer.parseInt(entrada.readLine());
switch (opcao){
case 1 : modAdicao(); break;
case 2 : modSubtr(); break;
case 3 : modMultip(); break;
case 4 : modDiv(); break;
default : System.out.println("Fim do programa");
}
}catch(Exception e){
System.out.println("Ocorreu algum erro na entrada de dados");
}
}
//modulo de adicao
111
static void modAdicao(){
BufferedReader entraSoma;
entraSoma = new BufferedReader(new InputStreamReader(System.in));
try{
System.out.println("Qual e o primeiro numero?");
float num1 = Float.parseFloat(entraSoma.readLine());
System.out.println("Qual e o segundo numero?");
float num2 = Float.parseFloat(entraSoma.readLine());
float resultado = num1 + num2;
System.out.println("Soma = "+resultado);
}catch(Exception e){
System.out.println("Ocorreu algum erro na entrada de dados");
}
}
//modulo de subtracao
static void modSubtr(){
BufferedReader entraSub;
entraSub = new BufferedReader(new InputStreamReader(System.in));
try{
System.out.println("Qual e o primeiro numero?");
float num1 = Float.parseFloat(entraSub.readLine());
System.out.println("Qual e o segundo numero?");
float num2 = Float.parseFloat(entraSub.readLine());
float resultado = num1 - num2;
System.out.println("Soma = "+resultado);
}catch(Exception e){
System.out.println("Ocorreu algum erro na entrada de dados");
}
}
//modulo de Multiplicacao
static void modMultip(){
BufferedReader entraMult;
entraMult = new BufferedReader(new InputStreamReader(System.in));
try{
System.out.println("Qual e o primeiro numero?");
float num1 = Float.parseFloat(entraMult.readLine());
System.out.println("Qual e o segundo numero?");
float num2 = Float.parseFloat(entraMult.readLine());
float resultado = num1 * num2;
System.out.println("Soma = "+resultado);
}catch(Exception e){
System.out.println("Ocorreu algum erro na entrada de dados");
}
}
//modulo de Divisao
static void modDiv(){
BufferedReader entraDiv;
entraDiv = new BufferedReader(new InputStreamReader(System.in));
try{
System.out.println("Qual e o primeiro numero?");
float num1 = Float.parseFloat(entraDiv.readLine());
System.out.println("Qual e o segundo numero?");
float num2 = Float.parseFloat(entraDiv.readLine());
float resultado = num1 / num2;
System.out.println("Soma = "+resultado);
}catch(Exception e){
System.out.println("Ocorreu algum erro na entrada de dados");
}
}
}

Funes

As funes so criadas e chamadas da mesma maneira que os procedimentos. A diferena
entre eles que as funes podem ser utilizadas em expresses, como se fossem variveis, pois as
funes retornam valores que so associados ao seu nome e para esses valores se faz necessria a
declarao do tipo de dado a ser retornado.
112

funo nome_da_funo (lista de parmetros):tipo_de_dado da funo
ffdeclaraao dos objetos pertencentes a esta funao (objetos locais)
inicio
instrues da funo
fim;


Exemplos:

1) Ler um numero fornecido pelo usurio e calcular o fatorial.

Soluo:

a) algoritmo em pseudocdigo

funo fatorial(n:inteiro):inteiro;
i,fat:inteiro;
inicio
leia(n);
se (n == 0) ento
fatorial = 1;
seno
para i = 1 ate n-1 faca
fat = fat * i;
fimpara;
fatorial = fat;
fimse;
retornar(fatorial);
fim.


b) programa em Java

import java.io.*;
class ExmploFunc1{
public static void main(String args[]){
BufferedReader entrada;
entrada = new BufferedReader(new InputStreamReader(System.in));

try{
System.out.println("Qual o numero? ");
int num = Integer.parseInt(entrada.readLine());
int fat = fatorial(num);
System.out.println("fatorial = "+fat);
}catch(Exception e){
System.out.println("Ocorreu erro na entrada");
}
}
static int fatorial(int numero){
int fat = 1;
for(int i= 1;i<=numero;i++){
fat *=i;
}
return fat;
}
}

Escopo de variveis

A utilizao de variveis locais pode ocasionar redundncia na declarao de variveis que
se fazem necessrias em vrios mdulos. Para resolver este problema, existe a possibilidade de
serem declaradas variveis globais.
113
As variveis globais so declaradas no algoritmo principal e podem ser utilizadas por todos os
algoritmos hierarquicamente inferiores. J as variveis locais podem ser utilizadas pelo algoritmo em
que foram declaradas e nos algoritmos hierarquicamente inferiores.

Parmetros

Parmetros so variveis ou valores que podem ser transferidos do algoritmo principal para
um mdulo que est sendo chamado. Eles funcionam como comunicadores entre mdulos. Existem
dois tipos de parmetros: os formais e os reais.

Parmetros formais

So declarados nos mdulos como as variveis. O algoritmo que chama a funo ou o
procedimento informa os calores que substituiro esses parmetros.

Exemplo:

a) algoritmo em pseudocdigo

procedimento multiplica*a,b:real)
res:real;
inicio
res = a * b;
escreva(res);
fim;


b) programa em Java

static float multiplicar (float a, float b){
float res;
res = a * b;
return res;
}

Parmetros reais

Os parmetros reais so os valores que substituem os parmetros formais. O algoritmo que
chama a funo ou o procedimento informa esses valores ou variveis.

Exemplo:

a) algoritmo em pseudocdigo

inicio
procedimento multiplica*a,b:real)
res:real;
inicio
res = a * b;
escreva(res);
fim;

num1,num2:real;
leia(num1,num2);
multiplicar(num1,num2);
fim.


b) programa em Java

import Java.io.*;
class Multiplicar{
114
public static void main(String args[]){
BufferedReader entrada;
entrada = new BufferedReader(new InputStreamReader(System.in));
try{
System.out.println(Qual e o numero 1?);
int num1 = Integer.parseInt(entrada.readLine());
System.out.println(Qual e o numero 2?);
int num2 = Integer.parseInt(entrada.readLine());
multiplicar(num1,num2);
} catch(Exception e){
System.out.println(Ocorreu erro na entrada);
}
}

static float multiplicar (float a, float b){
float res;
res = a * b;
return res;
}
}

Passagem de parmetros

A passagem de parmetros ocorre por meio da correspondncia argumento/parmetro, em
que os argumentos so valores constantes ou variveis informadas no mdulo chamador, ou principal
isto , passagem de parmetros a substituio dos parmetros formais pelos parmetros reais.
Os argumentos devem ser fornecidos na mesma ordem dos parmetros.
Os parmetros podem ser passados por valor ou por referncia.

Passagem de parmetros por valor

Na passagem de parmetros por valor, o valor do parmetro real copiado para parmetro
formal do mdulo, preservando, assim, o valor original do parmetro.
Nota: Na linguagem Java, os objetos (String, Data, etc) e os arrays so sempre passados por
referncia. O Java passa o valor da varivel quando o mtodo chamado e quaisquer alteraes
feitas na varivel tornam-se permanentes

Passagem de parmetros por referncia

Na passagem de parmetros por referncia, toda alterao feita nos parmetros formais,
reflete-se nos parmetros reais: assim, o parmetro de entrada e sada.

Exemplos - mtodos

EX1) O exemplo abaixo mostra a chamada de um mtodo (imprime) que imprime na tela uma frase
qualquer.

class ExemploMetodo1{
public static void main(String args[]){
imprime();
}
public static void imprime(){ //declaracao do metodo imprime
System.out.println(Aprendendo a Linguagem Java);
}
}

EX2) Utiliza-se de um mtodo para imprimir o contedo de uma varivel qualquer, funcionando da
mesma forma como System.out.println().

class ExemploMetodo2{
public static void main(String args[]){
String frase1 = "Sou muito feliz";
String frase2 = "feliz porque sei";
String frase3 = "que DEUS me ama!";
115
limpaTela(); //invoca o metodo para limpar a tela
tela(frase1); //invoca o metodo para imprimir na tela
tela(""); //invoca o mtodo e imprime uma linha em branco
tela(frase2);
tela("");
tela(frase3);
}
public static void tela(String S){ //declaracao do metodo tela
System.out.println(S);
}
public static void limpaTela(){ //declaracao do metodo limpaTela
for (int i=1;i<=25;i++)
System.out.println();
}
}

EX3) O exemplo abaixo apresenta outra classe com dois mtodos que no retornam valores (alm do
main) em que os mtodos so executados em cascata, uma vez que o mtodo main chamar tela
que, por sua vez, chamar tempo.

class ExemploMetodo3{
public static void main(String args[]){
String frase1 = "Sou muito feliz";
String frase2 = "feliz porque sei";
String frase3 = "que DEUS me ama!";
tela(frase1); //invoca o metodo para imprimir na tela
tela(frase2);
tela(frase3);
}
public static void tela(String S){ //declaracao do metodo tela
System.out.println(S);
tempo(1);
}
public static void tempo(int segundos){ //declaracao do metodo tempo
try{
Thread t;
t = new Thread();
t.start();
t.sleep(segundos*1000);
}catch(InterruptedException e){ }
}
}

EX4) O exemplo abaixo demonstra a utilizao de um mtodo que recebe duas variveis tipo String
(args[0] e args[1]) e retorna a soma entre elas na forma de nmero tipo inteiro.

class ExemploMetodo4{
public static void main(String args[]){
if (args.length==2)
System.out.println("Resultado = "+ soma(args[0],args[1]));
else
System.out.println("Entre com dois valores inteiros!");
}

public static int soma(String num1, String num2){
int x=0,y=0;
try{
x = Integer.parseInt(num1);
y = Integer.parseInt(num2);
}catch(NumberFormatException e){
System.out.println("Digite apenas caracteres numericos!");
System.exit(0); //caso houver erro encerra o programa
}
return(x+y); //retorna a soma dos argumentos passados
}
}
116

EX5) O exemplo abaixo mostra a recursividade gerada para imprimir o fatorial dos nmeros inteiros
de 0 a 10.

class ExemploMetodo5{
public static void main(String args[]){
for(long i=0;i<=10;i++)
System.out.println(i + "! = "+ fatorial(i));
}
public static long fatorial(long num){
if(num <=1)
return 1;
else
return num*fatorial(num-1); //metodo recursivo de fatorial
}
}


EX6) O exemplo abaixo demonstra um mtodo de mesmo nome sendo declarado trs vezes, isto ,
utilizando o recurso de sobrecarga.

class ExemploMetodo6{
public static void main(String args[]){
System.out.println("Area de um quadrado ... "+area(3));
System.out.println("Area de um retangulo ... "+area(3,2));
System.out.println("Area de um cubo ... "+area(3,2,5));
}
public static double area(int x){
return x*x;
}
public static double area(int x,int y){
return x*y;
}
public static double area(int x,int y,int z){
return x*y*z;
}
}


EX7) O exemplo abaixo mostra o uso de mtodos de outras classes j desenvolvidas en exemplos
anteriores para simular um relgio.

class ExemploMetodo7{
public static void main(String args[]){
int H,M,S;
ExemploMetodo2.limpaTela();
for(H=0;H<24;H++)
for(M=0;M<60;M++)
for(S=0;S<60;S++){
System.out.println("Para encerrar pressione CTRL+C
"+H+" h:"+M+" m: "+S+"s");
ExemploMetodo3.tempo(1);
ExemploMetodo2.limpaTela();
}
}
}

EX8) Este exemplo traz uma classe chamada Diversos, em que existem vrios mtodos especficos
entrada de dados via teclado e clculos numricos. Esses mtodos podem ser chamados por
outras classes quantas vezes for necessrio. Com o recurso de reaproveitamento de cdigo so
criados os packages (pacotes) em Java que agrupam classes de mesma natureza.

a) Classe Diversos:

117
import java.io.*;
class Diversos{
static BufferedReader entrada = new BufferedReader(new
InputStreamReader(System.in));

public static float leNumeroFloat(float minimo, float maximo){
float n =0;
try{
while(true){ //loop infinito
n = Float.parseFloat(entrada.readLine());
if(n < minimo || n > maximo)
System.out.println("Entrada fora da faixa
permitida!");
else
break; //encerra o loop infinito
}
}catch(IOException e){
System.out.println("Erro na leitura do teclado!");
}
catch(NumberFormatException e){
System.out.println("Digite apenas numeros!");
n = -1; //erro de tipo
}
return (n);
}
public static int leNumeroInt(int minimo, int maximo){
int n =0;
try{
while(true){ //loop infinito
n = Integer.parseInt(entrada.readLine());
if(n < minimo || n > maximo)
System.out.println("Entrada fora da faixa
permitida!");
else
break; //encerra o loop infinito
}
}catch(IOException e){
System.out.println("Erro na leitura do teclado!");
}
catch(NumberFormatException e){
System.out.println("Digite apenas numeros!");
n = -1; //erro de tipo
}
return (n);
}
public static String leString(){
String nome ="";
try{
nome = entrada.readLine();
}catch(IOException e){
System.out.println("Erro nos dados!");
}
return (nome);
}
public static float soma(float num1, float num2){
return (num1+num2);
}
public static float sub(float num1, float num2){
return (num1-num2);
}
public static float divisao(float num1, float num2){
return (num1/num2);
}
public static float mult(float num1, float num2){
return (num1*num2);
}
public static int media(int num1, int num2, int num3){
return ((num1+num2+num3)/3);
118
}
public static int quadrado(int num1){
return (num1*num1);
}
}

b) classe UsaDiversos

class UsaDiversos{
public static void main(String args[]){
System.out.println("Entre com uma nota de prova");
float n = -1;
while(n ==-1) //le enquanto o usuario nao digitar um numero
n = Diversos.leNumeroFloat(0,10);
System.out.println("Nota digitada = "+n);
System.out.println("Entre com uma idade");
int i = -1;
while(i ==-1) //le enquanto o usuario nao digitar um numero
i = Diversos.leNumeroInt(0,150);
System.out.println("Idade digitada = "+i);
System.out.println("Entre com um nome");
System.out.println(Diversos.leString());
System.out.println("A media de 1,3,5 = "+ Diversos.media(1,3,5));

}
}


Ex9) Dados trs valores distintos, coloc-los em ordem crescente.

Soluo:

a) algoritmo em pseudocdigo

inicio
procedimento troca(a,b:real);
aux:real;
inicio
aux = a;
a = b;
b = aux;
fim;
l,m,n:real;
leia(l,m,n);
se (l > m) ou (l > n) entao
se (m < n) entao
troca(l,m);
senao
troca(l,n);
fimse;
fimse;
se (m > n) entao
troca(m,n);
fimse;
escreva(l,m,n);
fim.


b) programa em Java

import java.io.*;
class ExemploFunc9{
public static void main(String args[]){
BufferedReader entrada;
119
entrada = new BufferedReader(new InputStreamReader(System.in));
try{
System.out.println("Entre com os valores de L, M e N:");
System.out.print("L = ");
float L = Float.parseFloat(entrada.readLine());
System.out.print("M = ");
float M = Float.parseFloat(entrada.readLine());
System.out.print("N = ");
float N = Float.parseFloat(entrada.readLine());
if((L > M)||(L > N)){
if(M < N)
troca(L,M);
else
troca(L,N);
}
if(M > N){
troca(M,N);
}
System.out.println("Os valores ordenados sao: " +L+", "+M+",
"+N);
}catch(Exception e){
System.out.println("Ocorreu algum erro na entrada de dados");
}
}
public static void troca(float a, float b){
float aux;
aux = a;
a = b;
b = aux;
}
}

Ex10) Escrever um programa que leia as medidas das arestas a, b e c de um paraleleppedo, calcule
e escreva o valor de sua diagonal.



L = A
2
+ B
2

c D
D = L
2
+ c






Ex11) Escrever uma funo lgica que receba:
9) Uma varivel composta unidimensional M;
10) O nmero N de elementos de M;
11) Um valor X;
E devolva o valor true, se X for igual a algum dos elementos de M ou false, em caso de contrrio.
Escrever um programa que leia um conjunto de 20 nmeros inteiros, seguido de outro conjunto de 10
nmeros inteiros e determine quais destes 10 nmeros so iguais a um dos 20 primeiros.

Ex12) escrever uma funo que calcule a distancia entre dois pontos de um plano, sendo fornecidas
as coordenadas X1, Y1, X2, Y2, e X3, Y3 e determine a rea do tringulo formado por estes pontos.
Imprimir, ara cada registro, as coordenadas lidas e a rea determinada.

EX13) Fazer um programa que:
- leia vrios pares de nmeros inteiros positivos, M e P. O ltimo para ter o valor zero para M e P;
- calcule e imprima o nmero de arranjos e combinaes de M elementos P a P, dados pelas
frmulas:

A
p
m
= M!___ C
p
m
= M!___
(M P) P! (M P)!

120
Se M < P, por definio

A
p
m
= 0 e C
p
m
= 0

Ex14) Fazer uma funo que transforme horas, minutos e segundos em segundos.
Ex: 2h40min 10s 9610s.
Fazer um procedimento que transforme segundos em horas, minutos e segundos.
Ex. 11030 s 3h 3min 50s.

Fazer um programa que:
- leia um conjunto de linhas contendo, cada uma, o nmero de um empregado, a hora do incio
(horas, minutos e segundos) e a hora do trmino (horas, minutos e segundos) de uma determinada
tarefa. A ltima linha (flag) conter o nmero do empregado negativo;
- calcule, para cada empregado, a durao da tarefa que ele executou, num mesmo dia,
utilizando os dois mdulos anteriormente definidos;
- imprima, para cada empregado, o seu nmero e a durao de sua tarefa em horas, minutos e
segundos.

Ex15) Fazer um programa que calcule o mximo divisor comum entre dois nmeros inteiros
(mtodo das divises sucessivas ou jogo da velha).
Fazer um programa que:
- leia 50 linhas contendo, cada uma, um par de nmeros inteiros;
- imprima, utilizando o procedimento anterior, os nmeros primos entre si.

Dois nmeros so primos entre si quando s admitem como divisor comum a unidade.

Ex16) Fazer um procedimento que, dado um nmero inteiro N, retorne a soma dos divisores deste
nmero, exceto ele prprio.
Fazer um programa que, utilizando o procedimento anterior, determine e escreva todos os pares de
nmeros amigos em um intervalo [A,B]. Os valores de A e B (A<B), inteiros maiores que zero,
devero ser lidos.
Dois nmeros M e N so amigos se a soma dos divisores de M, excluindo M, igual a N e a soma
dos divisores de N, excluindo N, igual a M.
Antes de se elaborar um programa para este problema, algumas observaes se fazem necessrias:
a) se um nmero inteiro X possui um divisor Y menor que sua raiz quadrada, o quociente da diviso
de X por Y ser maior que a raiz quadrada de X, e ser tambm, um divisor de X.
Exemplo:
X = 64 X/Y = 16>V64 e tambm, divisor de 64.
Y = 4
b) se um nmero inteiro X possui um divisor Y igual a sua raiz quadrada, o quociente da diviso de X
por Y ser o prprio divisor Y. Exemplo:
X = 64 X/Y = 8,que igual a V64
Y = 8

Ex17) Escrever um programa que emita um relatrio e fornea dados estatsticos a respeito de uma
turma (no mximo, 50 alunos) do !. perodo do Ciclo Bsico do Instituto de Cincias Exatas da
UFMG.
O programa deve:

ler a freqncia mnima exigida como requisito parcial para a aprovao do aluno em
Geometria Analtica, Programao de Computadores e Clculo I, nesta ordem;
ler o nmero de matrcula de cada aluno e sua nota final em cada disciplina ( na
mesma ordem citada na alnea a ), alm de sua freqncia (ou seja, a quantas aulas assistiu)
por disciplina;
conter um procedimento que verifique se um aluno tem direito de fazer exame
especial numa disciplina (isto , se o aluno freqente e obteve, no mnimo, 40 pontos);
conter um procedimento para calcular e percentagem dos alunos que j foram
aprovados (sem exame especial) em uma disciplina, cuja nota mnima de aprovao 60;
conter um procedimento que classifique os elementos de um conjunto de informaes
de duas grandezas diferentes em ordem crescente de uma delas;
determinar (utilizando o procedimento da alnea c)quais alunos podem fazer exame
especial em cada disciplina;
121
escrever, para cada disciplina, o nmero de matrcula dos alunos que tm condies
legais de fazer o exame especial, em ordem crescente, com suas notas respectivas,
utilizando o procedimento definido na alnea e;
calcular e escrever, para cada disciplina, a percentagem de alunos j aprovados,
utilizando o procedimento da alnea d e a percentagem dos que tm direito ao exame
especial.


Exerccios de Fixao - Modularizao

OBS: todos os algoritmo devem ser resolvidos utilizando os conceitos de modularizao

Crie um aplicativo que receba o raio de uma esfera (do tipo double) e chame o mtodo
volumeEsfera para calcular e exibir o volume da esfera na tela. Para clculo do volume deve ser
usada a frmula: volume = (4.0/3.0)*pi*raio
2
.
Crie um aplicativo que receba uma temperatura qualquer em Farenheit e apresente seu
correspondente em Celsius por meio de um mtodo. Para o clculo utilize a seguinte frmula:
Celsius = 5.0/9.0*(f-32)
Crie um aplicativo que faa a contagem regressiva de um nmero inteiro informado pelo
usurio. O usurio deve informar tambm o espao de tempo entre cada contagem (em
segundos). Controle o tempo com um mtodo tempo() contido em outra classe. Crie uma nova
classe para esse mtodo do tempo() ou aproveite do exemplo 3.
Crie um mtodo chamado aleatrio que sorteie uma determinada quantidade de
nmeros de acordo com um argumento. O usurio deve informar a quantidade de nmeros a ser
gerada e a faixa de nmeros vlidos para o sorteio, por exemplo: se o usurio informar os
argumentos 4 e 100 (aleatrio(4,100)), devem ser gerados quatro nmeros aleatrios entre 1 e
100.
Escreva um algoritmo para:
preencher uma matriz A de ordem 3;
ordenar os elementos da matriz A;
gerar uma matriz somente com os nmeros pares da matriz A;
gerar uma matriz somente com os nmeros mltiplos de 5;
criar um menu para acessar os itens anteriores

g) Construa um algoritmo que, a partir de um vetor de 100 inteiros, possiblite:

3. a digitao dos valores no vetor;
4. imprimir o valor do somatrio de seus itens;
5. imprimir a mdia dos valores fornecidos;
6. substituir por zero todos os valores negativos;
7. substituir por zero todos os valores repetidos (maiores que zero);
8. Criar um menu para acessar os itens anteriores.

h) Construa um algoritmo que verifique se um dado nmero divisvel por outro. Ambos devem
ser fornecidos pelo usurio.
i) Faa um algoritmo que possibilite o arredondamento de um nmero real para um nmero
inteiro seguindo os padres cientficos.
j) Elabore um algoritmo que escreva por extenso um nmero inteiro com at dez dgitos
fornecido pelo usurio.
k) Construa um algoritmo que verifique, sem utilizar a funo mod, se um nmero divisvel por
outro.
l) Escreva um algoritmo que calcule o mdc de dois nmeros fornecidos pelo usurio.
m) Necessita-se calcular alguns dados correspondentes aos animais de uma fazenda. Os
animais pertencem a espcies diferentes, a saber:bovinos, ovinos e caprinos. Construa um
algoritmo para calcular a mdia de peso de cada espcie para os animais de sexo feminino e do
sexo masculino, a partir de dados fornecidos pelo usurio.
n) Dada uma data abreviada, escreva-a por extenso.
o) Faa a leitura de mil nmeros pelo processo de sorteio automtico. Os nmeros devem estar
entre 0 e 100. Verifique:
1. qual foi o nmero sorteado mais vezes;
2. qual foi o nmero sorteado menos vezes;
122
3. qual foi o maior nmero;
4. qual foi o menor nmero;
p) Escreva um algoritmo que calcule a somatria dos n primeiros nmeros de um conjunto. O
valor de n dever ser fornecido pelo usurio.
q) Escreva um algoritmo que calcule o nmero de horas de determinado perodo estabelecido
por duas datas.
r) Construa um algoritmo que identifique se um nmero ou no primo.
s) Construa um algoritmo que calcule a somatria de todos os nmeros primos contidos em um
conjunto de n elementos. O valor de n dever ser fornecido pelo usurio.
t) Construa um algoritmo que calcule o somatrio dos n primeiros termos da srie de
Fibonnacci.
u) A avaliao de aproveitamento de uma certa disciplina feita atravs de quatro provas
mensais no valor de 20 pontos e uma prova final no valor de 40 pontos. A nota final obtida
somando-se as trs melhores notas, dentre as provas mensais, com a nota da prova final.
O conceito final dado atendendo-se ao seguinte critrio:

De 90 a 100 conceito A
De 80 a 89 - conceito B
De 70 a 79 - conceito C
De 60 a 69 - conceito D
De 40 a 59 - conceito E
De 0 a 39 - conceito F

Fazer um procedimento que, recebendo como parmetro 4 (quatro) nmeros inteiros, devolva ao
mdulo que o chamou a soma dos 3 (trs) maiores nmeros dentre os 4 (quatro) nmeros recebidos.
Fazer um programa que:
9) leia um conjunto de 80 linhas contendo, cada uma, o nmero do aluno
as quatro notas mensais e a nota da prova final;
10) calcule, para cada aluno, sua nota final, utilizando o procedimento anterior;
11) verifique o conceito obtido;
12) escreva, para cada aluno, o seu nmero a sua nota final e o seu conceito.

Fazer um programa para avaliar as apostas da LOTO. O programa dever ler, inicialmente, as
cinco dezenas sorteadas e, a seguir, ler vrias linhas, uma para cada aposta, contendo:
nmero da aposta;
quantidade de dezenas apostadas (no mximo, 10 );
as dezenas apostadas.
A ltima linha, que no entrar nos clculos, conter o nmero da aposta igual a zero.
O programa dever escrever o nmero de todas as apostas que tiverem trs, quatro ou cinco
dezenas sorteadas e ao final, a quanti8dade de apostadores que fizeram o terno (trs dezenas
sorteadas), a quadra (quatro dezenas sorteadas) e a quina (cinco dezenas sorteadas). Neste
programa dever ser utilizado um procedimento que faa a avaliao do nmero de pontos de cada
aposta.

Construir uma funo que receba como parmetro de entrada um nmero inteiro positivo e
devolva um dgito verificador.
Escrever um programa capaz de :
ler um conjunto indeterminado de linhas, contendo, cada uma, o
nome de uma pessoa e seu nmero de CPF (n de inscrio no Cadastro de Pessoas
Fsicas)
imprimir, para cada pessoa, os seus dados de entrada mais a
mensagem VLIDO, ou INVLIDO, conforme a situao do nmero de CPF;
utiliza e funo acima para calcular os dgitos verificadores.
OBS: Um n de CPF validado atravs de seus dois ltimos dgitos (dgitos verificadores,
denominados controle). Por exemplo, o CPF de nmero 23086025620 validado pelos dgitos
verificadores 20. o esquema de verificao o seguinte:

230860256
funo
dgito verificador igual a 2

2308602562
funo
dgito verificador igual a 0


123

Fazer um procedimento que, dados N nmeros, determine o nmero que apareceu mais vezes.
Supor que os valores possveis de cada nmero esto entre 1 e 6, inclusive, e que sempre haver
um nico nmero vencedor.
Sabendo-se que um jogo de dados ocorre 40 vezes por dia e que a cada dia digitada uma linha
contendo os 40 nmeros que saram, fazer um programa que:
leia os dados contidos em 30 linhas, correspondentes a um ms de
jogo;
escreva este nmero e a mensagem Resultado Dirio.;
verifique tambm qual o nmero ganhador do ms;
escreva este nmero e a mensagem Resultado mensal do jogo.

Fazer um procedimento, cujo cabealho dado por QuantosDias (Dia,Ms,Ano, N) onde:
Dia, Ms e Ano so parmetros de entrada;
N um parmetro de sada que conter o nmero de dias do ano
at a data fornecida.
Para calcular quantos dias tem no ano at uma data fornecida preciso verificar o nmero de dias de
cada ms. O ms de fevereiro pode ter 28 ou 29 dias, dependendo do ano ser bissexto ou no. Todo
ano bissexto divisvel por 4.
Fazer um programa que:
leia um conjunto de linhas contendo, cada uma, duas datas. A
ltima linha, que ser utilizada como flag, conter os valores 0,0,0,0,0,0;
verifique se as datas esto corretas (1< Ms < 12, dia de acordo
com o ms e se ambas esto dentro do mesmo ano). Se algumas das datas no
estiver correta, escrevaData incorreta e os valores de Dia, Ms e Ano das duas
datas;
verifique, se as datas estiverem corretas, qual a diferena, em dias,
entre estas duas datas;
escreva as datas lidas e a diferena entre elas.

2. Escrever um programa que leia um conjunto de 1.000 linhas contendo, cada uma, uma palavra em
ingls e a sua traduo em portugus. Em seguida, leia um nmero indeterminado de linhas
contendo, cada uma:
a letra I (indicando ingls) e uma palavra qualquer das 1.000 em
ingls; ou
a letra P (indicando portugus) e uma palavra qualquer das 1.000
em portugus.
Para cada uma destas linhas, escrever a palavra lida e a sua traduo. A ltima linha, indicando o fim
de dados, ter a primeira letra diferente de I e P.
A traduo da palavra lida deve ser feita atravs de um procedimento que recebe as listas de
palavras em ingls e portugus, a letra I ou P e a palavra que se deseja traduzir, devolvendo a
traduo da mesma.




















124

Arquivos

Introduo

At ento utilizamos variveis simples para armazenar as informaes necessrias
resoluo de determinado problema. Estes problemas tinham uma limitao: quantidade de
informaes que poderia ser armazenada para resolve-los. Os algoritmos eram limitados conforme a
capacidade finita das estruturas de dados utilizadas (registros e/ou vetores).
Estudaremos, a partir daqui, arquivos. Muito comum em nosso cotidiano, o arquivo tem como
finalidade o armazenamento de grandes quantidades de informao, por um grande perodo de
tempo, como, por exemplo, os arquivos mantidos por uma companhia telefnica a cerca de seus
assinantes, ou as informaes armazenadas na Receita Federal sobre os contribuintes.
Um arquivo um conjunto de registros (ou seja, uma estrutura de dados) no qual cada
registro no ocupa uma posio fixa dentro da estrutura, no possuindo, portanto, tamanho
preestabelecido. Os registros, como sabemos, so formados por unidades de informao
denominados campos.

Definio de arquivos

Um arquivo um local reservado para se guardar informaes escritas. Um bom exemplo so
os arquivos de ao utilizados para armazenar fichas contendo dados de clientes, produtos e
pacientes, entre outros.
O arquivo de computador uma maneira de armazenar informaes em meios magnticos,
como por exemplo discos rgidos, discos flexveis e CD-ROM, entre outros. Esses dados podem ser
utilizados diversas vezes pelos programas associados ao arquivo.

Ex1: biblioteca

Ficha catalogrfica

Cdigo do livro:
Ttulo:
Autor:
Assunto:
Editora: Ano:




Conjunto de Fichas catalogrficas




Cdigo do livro:
Ttulo:
Autor:
Assunto:
Editora: Ano:



125






Item da ficha
(campo)
Arquivo de ao
(arquivo)
Ficha
(registro)



Manipulao

Generalizando, podemos admitir que todo arquivo possui maneiras semelhantes de ser
manipulado, independentemente de como foi concebido. Exemplificando, diante de um arquivo de
livros de uma biblioteca, voc poderia ter apenas dois tipos de atitudes diferentes:
5. No caso de ser um leitor, voc procura a informao sobre a localizao de certo livro
atravs das fichas que registram o acervo.
6. Como funcionrio (da biblioteca), voc intenciona manipular (inserir, modificar,
remover) alguma informao a respeito de algum livro.

Conclumos que podemos consultar e/ou manipular alguma informao no arquivo. Podemos,
ento, sugerir os seguintes algoritmos bsicos:


Consultar arquivo Acrescentar dados

1. Abrir gaveta do arquivo 1. Abrir gaveta do arquivo

2. Achar a ficha procurada 2. Achar posio da insero

3. Copiar informaes da ficha 3. Guardar ficha nova

4. Fechar gaveta do arquivo 4. Fechar gaveta do arquivo


Modificar dados Eliminar dados

1. Abrir gaveta do arquivo 1. Abrir gaveta do arquivo

2. Achar a ficha procurada 2. Achar a ficha procurada

3. Alterar os dados da ficha 3. Retirar a ficha do arquivo

4. Fechar gaveta do arquivo 4. Fechar gaveta do arquivo



Podemos observar que os algoritmos apresentados so muito semelhantes, que tanto o leitor
(que consulta o arquivo) quanto o funcionrio (que manipula as informaes) atuam de forma muito
parecida. Mesmo as diferentes operaes que o funcionrio pode desempenhar (inserir. Eliminar ou
modificar dados) tambm so muito similares. Percebemos tambm que os passos 1 e 4 so sempre
idnticos em todos os casos, enquanto o passo 2 est sempre relacionado a uma pesquisa.
Entretanto, o passo 3 o que parece diferenciar realmente cada uma delas. Muito embora ainda seja
possvel perceber algo de comum entre as atividades do passo 3 todas esto relacionadas ao fluxo
de informaes -, em alguns casos o fluxo da pessoa para o arquivo e em outros do arquivo para
a pessoa, ou seja, a diferena est apenas no sentido em que os dados trafegam.

126
Independentemente do tipo de um arquivo, ele tem a capacidade de executar algumas
operaes em comum, tais como: abertura, leitura e fechamento,

Tipos de arquivos

Arquivo texto

As informaes de um arquivo texto so organizadas em registros. Os registros por sua vez,
so organizados em campos e nos campos que so inseridas as informaes.

campos
Nome Endereo CEP Telefone
Z Man Rua dos bosque, 10 69025-952 251-8547
Maria Xiquinha Rua da Gruta, 247 69025-852 542-8756
R
e
g
i
s
t
r
o
s
Jurubeba Silva Av. Leste-Oeste, 1002 69054-584 236-8547

12) Na interface, so representados os nomes dos campos, que devem ser legveis para o
usurio, isto , o usurio deve ler e entender o que dever ser digitado nos espaos reservados
para as informaes.
13) Na interface tambm deve existir um espao para que o usurio faa a entrada dos dados,
isto , o local no qual sero digitadas ou selecionadas as informaes.
14) No programa, deve existir uma varivel para cada informao que ser digitada na interface.
15) No arquivo, deve existir um campo para cada varivel cuja informao deve ser armazenada.

No arquivo, cada linha representa um registro. Um registro um conjunto de campos, isto ,
um conjunto de informaes sobre um determinado assunto. Cada campo recebe dados que so
armazenados no arquivo por meio da associao da varivel da interface com o campo do arquivo.


Formas de acesso

Os arquivos criados em meios magnticos podem ser acessados para leitura e/ou escrita na
forma seqencial, direta ou indexada, como definidos a seguir:

Acesso seqencial. Ocorre quando o processo de gravao e leitura feito de
forma contnua, um a aps o outro. Desta forma, para gravar um novo registro,
necessrio percorrer todo o arquivo a partir do primeiro registro, registro a registro, at
localizar a primeira posio vazia aps o ltimo registro. O processo de leitura tambm
ocorre de forma seqencial. Se o registro a ser lido for o ltimo, primeiro necessrio ler
todos os registros que o antecedem.
Acesso direto. Conhecido tambm como randmico, ocorre por meio de uma
campo chave previamente definido. Desta forma, passa-se a possuir um vnculo entre um
dos campos do registro e sua posio de armazenamento, por meio da chave. Assim
sendo, o acesso a um registro tanto para leitura quanto para escrita pode ser feito de
modo instantneo. Isto implica o fato de que os registros de um arquivo direto possuem
um lugar (chave) previamente reservado para serem armazenados.
Acesso indexado. Ocorre quando se acessa de forma direta um arquivo seqencial,
por meio de um arquivo ndice que possui a chave de busca para esse arquivo. Para
trabalhar com esta tcnica, basta criar um arquivo direto que ser o ndice de consulta do
arquivo seqencial, passando este a ser o arquivo indexado. Existem dois arquivos: o
arquivo ndice (arquivo direto) e o arquivo indexado (arquivo seqencial). Os acessos
sero feitos como em um livro. Primeiro consulta-se o arquivo ndice, o qual possui a
chave de pesquisa, no caso seria o nmero da pgina, depois basta posicionar de forma
direta na pgina (no caso de um livro) identificada no ndice, ou seja, no registro do
arquivo indexado.



127
Exemplos acesso seqencial:

ARQUIVO SEQUENCIAL OPERAO DE INCLUSO

Construa um agenda que armazene nomes, endereos e telefones.

Soluo:

a) algoritmo em pseudocdigo

inicio
tipo
reg_agenda = registro
nome:caracter;
endereco: caracter;
telefone:caracter;
fimregistro;
arq_agenda: arquivo sequencial de reg_agenda;

auxiliar:reg_agenda;
agenda:arq_agenda;
abrir(agenda);
repita
avancar(agenda);
ate EOF (agenda);
leia (auxiliar.nome, auxiliar.endereco, auxiliar.telefone);
armazenar(agenda,auxiliar);
fechar(agenda);
fim.


Nos algoritmos, deve-se, primeiramente, declarar uma estrutura do tipo registro com todos os
campos cujas informaes pretende-se armazenar.
tipo
reg_agenda = registro
nome:caracter;
endereco: caracter;
telefone:caracter;
fimregistro;
arq_agenda: arquivo sequencial de reg_agenda;


necessrio tambm declarar um identificador do tipo arquivo, mencionando o tipo de
arquivo que ser utilizado. Esse identificador associado ao arquivo que ser formado pelos registros
de reg_agenda.
As variveis Auxiliar e Agenda so variveis de registro e de arquivo, respectivamente.
Para que seja possvel a manipulao do arquivo, esse deve ser aberto:
Abrir(nome da varivel de arquivo)

Ser disponibilizado o primeiro registro armazenado. Para acessar os prximos registros,
utiliza-se a instruo:
Avancar(nome da varivel de arquivo)

No caso de se desejar que o arquivo seja posicionado no ltimo registro, utiliza-se uma
estrutura de repetio que provoque o avano pelos registros at o final do arquivo:
repita
avancar(agenda);
ate EOF (agenda);

Nota: Por se tratar de um arquivo seqencial, para se chegar ao ltimo registro, percorre-se o arquivo
todo, passando por todos os registros armazenados, como, por exemplo, em uma fita cassete.

128
Para processar a incluso de um registro, necessrio que seus campos sejam preenchidos
na mesma ordem e com os mesmos campos do arquivo. Por isso, a varivel de registro declarada
com o tipo da estrutura declarada para o registro do arquivo. No caso do Exemplo acima:

3. Declarao da estrutura de dados do tipo registro:
tipo
reg_agenda = registro
nome:caracter;
endereco: caracter;
telefone:caracter;
fimregistro;
arq_agenda: arquivo sequencial de reg_agenda;


4. Declarao da varivel do tipo registro, que ter o mesmo formato da estrutura de dados
criada para o registro, isto , Auxiliar.Nome,Auxiliar.End, Auxiliar.Tel:

auxiliar:reg_agenda;

5. Preenchimento dos campos:

leia (auxiliar.nome, auxiliar.endereco, auxiliar.telefone);

Depois de representar o preenchimento dos campos, ser necessrio representar o
armazenamento do contedo no arquivo. Para isso utiliza-se a instruo:
armazenar(nome da varivel de arquivo, nome da varivel de registro);
armazenar(agenda,auxiliar);

A varivel de arquivo Agenda receber o contedo da varivel de registro Auxiliar.

Por ltimo, o arquivo deve ser fechado:

Fechar(nome da varivel de arquivo);

b) programa em Java

class regAgenda{
private String nome;
private String endereco;
private String telefone;

public regAgenda(String nom, String ender, String telef){
nome = nom;
endereco = ender;
telefone = telef;
}
public String mostraNome(){
return nome;
}
public String mostraEndereco(){
return endereco;
}
public String mostraTelefone(){
return telefone;
}
}

Para representar uma estrutura do tipo registro em Java, utilizou-se uma classe regAgenda
que possui como atributos: nome, end e tel, conforme trecho de cdigo acima. Essa forma de
representao necessria, uma vez que o Java trabalha com objetos, conforme citado no captulo
4. Assim, cada entrada em regAgenda corresponde a um novo registro e refere-se a um novo objeto
da classe regAgenda, que possui caractersticas prprias, ou seja, um nome, um endereo e um
telefone que o distinguem dos demais objetos existentes.
129
A declarao da classe correspondente ao registro feita nas linhas de 1 a 4. Nas linhas de 6
a 9 definido o mtodo construtor, responsvel pela instanciao de novos objetos da classe ou,
para o nosso caso, de novas entradas de registros em regAgenda.
Para exibir os atributos de cada novo objeto instanciado, criaram-se os mtodos
mostraNome(), mostaEndereco() e mostraTelefone(), que retornam os respectivos dados.
O algoritmo codificado em Java relativo ao exemplo acima e que utiliza a classe regAgenda
para definio das entradas de novos registros na agenda apresentado a seguir.

Cuidado! Java uma linguagem case-sensitive. As referncias s variveis e mtodos devem ser
feitas exatamente da forma que estes foram declarados, considerando as letras maisculas e
minsculas.

import java.io.*;
class usaAgenda{
public static void main(String args[]){
try{
BufferedReader entrada;
entrada = new BufferedReader(new InputStreamReader(System.in));

BufferedWriter saida;
saida= new BufferedWriter(new FileWriter("agenda.txt",true));

System.out.println("Entre com o nome:");
String nome = entrada.readLine();
System.out.println("Entre com o endereco:");
String endereco = entrada.readLine();
System.out.println("Entre com o telefone:");
String telefone = entrada.readLine();

regAgenda regAg1 = new regAgenda(nome,endereco,telefone);
saida.write(regAg1.mostraNome() + "\t");
saida.write(regAg1.mostraEndereco() + "\t");
saida.write(regAg1.mostraTelefone() + "\n");
saida.flush();
saida.close();
}catch(Exception e){
System.out.println("Erro de gravacao!");
}
}
}

Para ler a entrada dos dados via teclado, declarou-se uma varivel entrada, que continer
que recebe os caracteres de entrada digitados via teclado (linhas 5 e 6). Seguindo a mesma filosofia
da entrada de dados, utilizam-se classes (e objetos) de apoio definidos na linguagem Java para
trabalhar o acesso e gravao de arquivos.
Nas linhas 7 e 8 est a declarao da varivel (objeto) que ser o continer do arquivo. Essa
declarao muito semelhante declarao das variveis que recebero a entrada de dados, mas,
em vez de se utilizar um objeto do tipo InputStreamReader, que define uma entrada de caracteres,
utiliza-se um objeto do tipo FileWriter (linha 8), que define uma sada para o arquivo Agenda.txt. Um
detalhe particular deve ser observado nessa declarao: na linha 8 , quando se define o nome do
arquivo destinado ao armazenamento dos dados, no trecho FileWrite ( Agenda.txt, true),tem-se, na
verdade, uma chamada de um mtodo com passagem dos parmetros Agenda.txt e true. O primeiro
o nome do arquivo, conforme j foi dito, e o segundo significa que o arquivo ser acessado com a
condio append = true, ou seja, os dados gravados sero sempre inseridos ao final do arquivo. Vale
ressaltar ainda que, caso o arquivo no exista, ele ser criado automaticamente.
O processo de entrada dos dados executado a partir das instrues das linhas 9 a 14,
segundo as quais os caracteres lidos a partir do teclado sero transferidos para as respectivas
variveis de armazenamento: Nome, Endereo e Telefone.
Na linha 15, ocorre a chamada do mtodo construtor da classe. RegAgenda, com a
respectiva passagem dos parmetros Nome, Endereo e Telefone, instanciando-se um novo objeto
regAg1 da classe regAgenda. No trecho de cdigo anterior (classe regAgenda), pode- se verificar a
declarao do mtodo nas linhas 6 a 9.
A sada de dados feita por meio do cdigo nas linhas 16 a 18, com a chamada dos mtodos
que retornam os atributos do novo objeto criado. Por exemplo, em:
130

sada.write(regAg1.mostraNOme() + \t);

temos a chamada do mtodo que retorna o atributo nome do objeto regAg1 e a transferncia do
resultado para a sada. O atributo \t associado ao nome indica que, aps a dado, ser gravado
tambm um espao de tabulao como separador.
Ao final da transferncia do ltimo dado, tambm passado o caractere de controle \n (nova
linha), utilizado como separador, indicando o final do registro. O motivo da utilizao desses
separadores ser visto nos exemplos posteriores.
Nas linhas 19 e 20, so chamados os mtodos saida.flush () e saida.close(), que fazem a
transferncia definitiva dos dados da memria para o arquivo e o fechamento do arquivo,
respectivamente.

Nota: Pode-se perguntar por que os dados obtidos da entrada via teclado no so transferidos
diretamente para o arquivo,uma vez que eles estariam disponveis sem a necessidade de instanciar
um objeto da classe regAgenda. O motivo a necessidade de satisfazer os princpios da orientao a
objetos, segundo os quais cada novo dado ou registro um objeto e assim deve ser tratado. Como
ser visto posteriormente, a manipulao dos atributos dos objetos deve seguir esses princpios,
garantindo-se que alteraes nesses atributos somente podero ser feitas mediante a chamada de
mtodos, que permitiro ou no as alteraes. Os atributos de um objeto definem sua estrutura, e as
operaes, seu comportamento. Os mtodos implementam essas operaes que permitem
alteraes nos objetos e na sua estrutura, preservando sua integridade (princpio do
encapsulamento).

ARQUIVO SEQUENCIAL OPERAO DE CONSULTA

A operao de consulta pode ser realizada de duas maneiras:

6. saltando manualmente de um registro para o outro: nesse caso, o usurio visualizar todos os
registros at que se chegue ao registro desejado;
7. saltando automaticamente para o registro desejado: nesse caso, utiliza-se uma varivel que
recebe a informao a ser encontrada no arquivo e, por meio de uma estrutura de repetio,
provocado o avano pelos registros at que seja encontrado o registro desejado.

Nota: Quando se trabalha com arquivos seqenciais, em ambos os casos todos os registros so
percorridos at que chegue ao registro desejado.

No exemplo a seguir, ser utilizado o recurso de consulta automtica. Para isso, ser
declarada a varivel Buscar, que receber o nome a ser consultado.

1) Busca seqencial em arquivo

Soluo:

a) algoritmo em pseudocdigo

inicio
tipo
reg_agenda = registro
nome:caracter;
endereco: caracter;
telefone:caracter;
fimregistro;
arq_agenda: arquivo sequencial de reg_agenda;

auxiliar:reg_agenda;
agenda:arq_agenda;
buscar:caracter;
abrir(agenda);
leia(buscar);
repita
avancar(agenda);
131
ate (auxiliar.nome = buscar) ou (EOF (agenda));
se (auxiliar.nome = buscar) entao
escreva(auxiliar.endereco, auxiliar.telefone);
senao
escreva(Nao cadastrado);
fimse;
fechar(agenda);
fim.

Nesse exemplo, foi utilizada a varivel Buscar, que recebeu o nome a ser consultado. A
estrutura de repetio Repita provoca o avano pelos registros do arquivo at que se encontre o
nome desejado ou o final do arquivo. Se tivermos sucesso na consulta, isto , se o nome desejado for
encontrado, ento o programa exibir o endereo e o telefone.

b) programa em Java

import java.io.*;
class usaAgenda2{
public static void main(String args[]){
try{
BufferedReader entrada;
entrada = new BufferedReader(new InputStreamReader(System.in));

BufferedReader arqentrada;
arqentrada = new BufferedReader(new FileReader("agenda.txt"))

System.out.println("Entre com o nome:");
String nome = entrada.readLine();
StringBuffer memoria = new StringBuffer();
String linha;
while((linha = arqentrada.readLine()) != null){
memoria.append(linha + "\n");
}
int inicio = -1;
inicio = memoria.indexOf(nome);
if (inicio != -1){
int fim = memoria.indexOf("\n",inicio);
char[] destino = new char[fim - inicio];
memoria.getChars(inicio, fim, destino, 0);
linha = "";
for(int i = 0; i < fim - inicio;i++){
linha += destino[i];
}
System.out.println(linha);
}else{
System.out.println("Item nao encontrado!!");

}
entrada.close();
}catch(FileNotFoundException erro){
System.out.println("Arquivo nao encontrado!");
}catch(Exception erro){
System.out.println("Erro de leitura!");
}
}
}

Na implementao desse exemplo, cria-se uma estrutura chamada memoria, que uma
varivel de memria do tipo StringBuffer. Em Java, esse tipo de varivel semelhante ao tipo String,
mas permite uma estrutura de trabalho mais avanado como, por exemplo, append, adiciona um novo
contedo ao contedo j existente, sem perda de dados.
A linha 13 define a condicional de uma estrutura de armazenamento de dados que repetir
enquanto houver dados a serem lidos, isto , ler todos os dados at o fim do arquivo. Essa
condicional equivalente determinao de EOF (end of file).
A busca feita na varivel memoria, com o mtodo IndexOf, que recebe Nome como
parmetros, dado obtido pela entrada de dados via teclado na linha 10. Esse mtodo retorna a
132
posio onde se inicia o caractere pesquisado. As posies so numeradas a partir de 0, significando
que o teste de condio na linha 18 verifica se o valor atribudo inicialmente varivel inicio foi
alterado. Em caso afirmativo, ou seja, se inicio diferente de -1, executam-se os comandos internos
do lao.
Para que seja possvel obter a seqencia de caracteres correspondentes ao registro
completo, necessrio determinar o seu final. Isso feito por meio do comando na linha 19, que
busca o caractere \n (nova linha) imediatamente aps o primeiro caractere encontrado. importante
observar que o mtodo indexOf chamado novamente, porm, dessa vez, so passados dois
parmetros: \n e inicio, para que a nova busca ocorra a partir da posio em que foi encontrado o
primeiro caracteres do item pesquisado.
Na linha 21, utiliza-se o mtodo getChars para se obter os caracteres correspondentes ao
registro, passando-se os parmetros inicio e fim como delimitadores. A string obtida armazenada na
prpria varivel linha, que ser utilizada para exibio dos dados (linha 26).
Foram feitos dois tratamentos de erro nas linhas 31 e 33, para determinar problemas quando
o arquivo no for encontrado ou quando ocorrerem outros erros genricos, respectivamente.


ARQUIVO SEQUENCIAL OPERAO DE ALTERAO

13) Alterao em arquivo seqencial

Soluo:

a) algoritmo em pseudocdigo

inicio
tipo
reg_agenda = registro
nome:caracter;
endereco: caracter;
telefone:caracter;
fimregistro;
arq_agenda: arquivo sequencial de reg_agenda;

auxiliar:reg_agenda;
agenda:arq_agenda;
buscar:caracter;
novo_endereco: caracter;
novo_telefone: caracter;
abrir(agenda);
leia(buscar);
copiar(agenda,auxiliar);
enquanto (auxiliar.nome <> buscar) e (nao EOF (agenda)) faca
avancar(agenda);
copiar(agenda);
fimenquanto;
se (auxiliar.nome = buscar) entao
inicio
escreva(auxiliar.endereco, auxiliar.telefone);
escreva(Novo endereco: );
leia(novo_endereco);
auxiliar.endereco = novo_endereco;
escreva(Novo telefone: );
leia(novo_telefone);
auxiliar.telefone = novo_telefone;
armazenar(agenda,auxiliar);
fim;
senao
escreva(Nao cadastrado);
fimse;
fechar(agenda);
fim.
133

No algoritmo acima feita uma consulta similar do Algoritmo de consulta. Se o registro for
encontrado, recomendado que seja exibido antes da alterao. Para a alterao, devem-se declarar
as variveis que recebero os novos valores, preencher os novos valores e depois atribuir esses
valores s variveis de registro:

escreva(Novo endereco: );
leia(novo_endereco);
auxiliar.endereco = novo_endereco;

b) programa em Java

class regAgenda{
private String nome;
private String endereco;
private String telefone;

public regAgenda(String nom, String ender, String telef){
nome = nom;
endereco = ender;
telefone = telef;
}
public String mostraNome(){
return nome;
}
public String mostraEndereco(){
return endereco;
}
public String mostraTelefone(){
return telefone;
}
public void alteraEndereco(String novoEndereco){
endereco = novoEndereco;
}
public void alteraTelefone(String novoTelefone){
telefone = novoTelefone;
}
}

A classe regAgenda sofreu alteraes para suportar as novas necessidades do algoritmo.
Foram includos os mtodos alteraEnd e alteraTel (linha 20 a 25) para que os objetos permitam
alteraes no endereo e no nmero do telefone. Assim, para que seja possvel a alterao desses
atributos, necessrio invocar (ou chamar) esses mtodos, como ser feito no trecho de cdigo a
seguir.

import java.io.*;
class usaAgenda3{
static StringBuffer memoria = new StringBuffer();
public static void main(String args[]){
try{
BufferedReader entrada;
entrada = new BufferedReader(new InputStreamReader(System.in));

BufferedReader arqentrada;
arqentrada = new BufferedReader(new FileReader("agenda.txt"));

System.out.println("Entre com o nome:");
String nome = entrada.readLine();
String endereco = "";
String telefone = "";
String linha;
while((linha = arqentrada.readLine()) != null){
memoria.append(linha + "\n");
}
int inicio = -1;
inicio = memoria.indexOf(nome);
if (inicio != -1){
134
int ultimo = memoria.indexOf("\t",inicio);
nome = ler(inicio,ultimo);
int primeiro = ultimo +1;
ultimo = memoria.indexOf("\t",primeiro);
endereco = ler(primeiro,ultimo);
primeiro = ultimo +1;
int fim = memoria.indexOf("\n",primeiro);
telefone = ler(primeiro, fim);
regAgenda regAg1 = new regAgenda (nome,endereco,
telefone);
System.out.println("Endereco: "+regAg1.mostraEndereco()+
"Telefone: " +regAg1.mostraTelefone());
System.out.println("Entre com o novo endereco:");
endereco = entrada.readLine();
regAg1.alteraEndereco(endereco);
System.out.println("Entre com o novo telefone:");
telefone = entrada.readLine();
regAg1.alteraTelefone(telefone);
memoria.replace(inicio, fim, regAg1.mostraNome()+
"\t"+regAg1.mostraEndereco() + "\t" +regAg1.mostraTelefone());
gravar();
arqentrada.close();
}else{
System.out.println("Item nao encontrado!!");

}
arqentrada.close();
}catch(FileNotFoundException erro){
System.out.println("Arquivo nao encontrado!");
}catch(Exception erro){
System.out.println("Erro de leitura!");
}
}
public static String ler(int primeiro, int ultimo){
String dados = "";
char[] destino = new char[ultimo - primeiro];
memoria.getChars (primeiro, ultimo, destino, 0);
for (int i =0; i < destino.length;i++){
dados += destino[i];
}
return dados;
}

public static void gravar(){
try{
BufferedWriter saida;
saida= new BufferedWriter(new FileWriter("agenda.txt"));
saida.write(memoria.toString());
saida.flush();
saida.close();
}catch(Exception e){
System.out.println("Erro de gravacao!");
}

}
}

Ateno: Observe que para a execuo do programa de Exemplo acima, o arquivo Agenda.txt dever
conter pelo menos um registro de entrada. Portanto, necessrio executar o programa do Exemplo 1
para a incluso dos registros desejados.

Os mesmos recursos de entrada de dados e busca em arquivo do Exemplo de consulta foram
utilizados. Porm, para obtermos os dados dos diversos campos separadamente, buscamos \ t
(tabulao) aps a busca para localizar a primeira posio do nome e assim obter os caracteres
correspondentes somente ao nome. Por exemplo, suponha que fosse includo o seguinte registro:

Gilberto da Silva Rua A n 203 apto 102 25834911
135

Para obtermos somente o campo nome (Gilberto da Silva),efetuamos a busca passando para
o mtodo indexOf os parmetros \t e inicio, que correspondem respectivamente tabulao e
posio em que foi encontrado o primeiro caractere do nome (varivel inicio). Para obtermos os
caracteres referentes ao campo nome, utilizamos o mtodo ler, fornecendo como parmetros as
posies de inicio e ultimo, correspondentes ao primeiro e ao ltimo caracteres do nome.
Observe tambm que foram includas as variveis primeiro e ultimo em relao ao Exemplo
9.2. Essas variveis cumprem o papel de obter as posies de inicio e fim de cada campo, visto que
precisamos preservar o valor das variveis inicio e fim, conforme explicaremos a seguir.
As variveis inicio e fim se prestam a guardar as posies de incio e fim do registro e foram
utilizadas para invocar o mtodo replace na linha 38, que faz a atualizao do continer dos dados
que esto na memria. Para tanto, necessrio identificar corretamente as posies e os dados que
sero substitudos. Note que os parmetros passados para os mtodos so: inicio, fim e uma string
composta pela concatenao regAg1.mostraNome () + \t + regAg1.mostraEnd () + \t +
regAg1.mostraTel (). Usando o exemplo citado acima e supondo que o endereo de Gilberto da Silva
fosse alterado para Rua Alfazema n 203 apto 102, a string resultante que seria passada para
atualizao seria.

Gilberto da Silva Rua Alfazema n 203 apto 102 25834911

O mtodo ler, implementado a partir da linha 52, tem a finalidade de obter e retornar uma
string de caracteres (varivel dados), corresponde s posies fornecidas (primeiro e ultimo), de
forma similar utilizada no exemplo anterior.
Tambm foi implementado um mtodo chamado gravar, cujo cdigo encontra-se a partir da
linha 61. Esse mtodo usa os mesmos princpios apresentados no primeiro Exemplo. Note que ele
no recebe nem retorna nenhum valor, executando a transferncia dos dados do continer memoria
para o arquivo.

ARQUIVO SEQUENCIAL OPERAO DE EXCLUSO

1) Excluso em arquivo seqencial

Soluo:

a) algoritmo em pseudocdigo

inicio
tipo
reg_agenda = registro
nome:caracter;
endereco: caracter;
telefone:caracter;
fimregistro;
arq_agenda: arquivo sequencial de reg_agenda;

auxiliar:reg_agenda;
agenda:arq_agenda;
buscar:caracter;
resposta: caracter;
abrir(agenda);
leia(buscar);
copiar(agenda,auxiliar);
repita
copiar(agenda);
avancar(agenda);
ate ((auxiliar.nome = buscar) ou (EOF(agenda)));
se (auxiliar.nome = buscar) entao
inicio
escreva(auxiliar.endereco, auxiliar.telefone);
escreva(Deseja excluir? (Digite S ou N) );
leia(resposta);
auxiliar.endereco = novo_endereco;
136
se (resposta = S) entao
deletar(agenda);
fimse;
fim;
senao
escreva(Nao cadastrado);
fimse;
fechar(agenda);
fim.

Para facilitar o processo de excluso, recomendado que seja feita uma busca automtica,
conforme visto anteriormente no Algoritmo de consulta. A excluso ser feita com a instruo Deletar
(nome da varivel de arquivo).

b) programa em Java

import java.io.*;
class usaAgenda4{
static StringBuffer memoria = new StringBuffer();
public static void main(String args[]){
try{
BufferedReader entrada;
entrada = new BufferedReader(new InputStreamReader(System.in));

BufferedReader arqentrada;
arqentrada = new BufferedReader(new FileReader("agenda.txt"));

System.out.println("Entre com o nome:");
String nome = entrada.readLine();
String linha;
while((linha = arqentrada.readLine()) != null){
memoria.append(linha + "\n");
}
int inicio = -1;
inicio = memoria.indexOf(nome);
if (inicio != -1){
int fim = memoria.indexOf("\t",inicio);
linha = ler(inicio,fim);
System.out.println("Deseja excluir? Digite S ou N");
System.out.println(linha);
String resp = entrada.readLine();
if (resp.equalsIgnoreCase ("S")){
memoria.delete(inicio,fim+1);
System.out.println("Registro excludo");
}
gravar();
}else{
System.out.println("Item nao encontrado!!");

}
arqentrada.close();
}catch(FileNotFoundException erro){
System.out.println("Arquivo nao encontrado!");
}catch(Exception erro){
System.out.println("Erro de leitura!");
}
}
public static String ler(int primeiro, int ultimo){
String dados = "";
char[] destino = new char[ultimo - primeiro];
memoria.getChars (primeiro, ultimo, destino, 0);
for (int i =0; i < destino.length;i++){
dados += destino[i];
}
return dados;
}

137
public static void gravar(){
try{
BufferedWriter saida;
saida= new BufferedWriter(new FileWriter("agenda.txt"));
saida.write(memoria.toString());
saida.flush();
saida.close();
}catch(Exception e){
System.out.println("Erro de gravacao!");
}

}
}

Poucas modificaes foram necessrias em relao ao cdigo do Exemplo 9.3 para
implementar a excluso de registro. Utilizou-se para tanto uma String resp que recebe a entrada feita
pelo teclado (linha 23), o que permite a interao com o usurio, pedindo-se uma confirmao da
excluso. Observe a particularidade da expresso de avalia a resposta. Usa-se equalsIgnoreCase,
um mtodo da classe String, para verificara condio de igualdade desconsiderando maisculas e
minsculas. Atitude bastante salutar, pois o usurio pode no perceber a condio do teclado no
momento (Caps Lock ativado ou no) e no obter sucesso no processo. Qualquer outra tecla digitada
nesse momento invalida a excluso. A excluso ocorre no trecho de cdigo na linha 25 (excluso dos
caracteres entre as posies inicio e fim +1) somente no continer memria. A atualizao do arquivo
ocorre somente quando chamado o mtodo gravar. Note ainda que foi utilizado fim + 1, pois a
posio fim correspondente ao final do registro no considera o caractere \n.


Representao da Manipulao de Arquivos de Acesso Aleatrio

As informaes de um arquivo de acesso aleatrio ou randmico tm sua ordem de insero
definida por um campo denominado chave. O campo chave de um registro no pode ter o seu
contedo repetido; ele deve ser nico no arquivo para que possibilite a identificao do registro. Por
meio do campo chave, o registro pode ser localizado diretamente, sem que haja necessidade de se
percorrerem todos os registros anteriores. O campo chave deve ser declarado juntamente com as
demais variveis que iro compor o registro.

Nota: Os arquivos de acesso aleatrio ou randmico so tambm chamados de arquivos de acesso
direto.

Um arquivo de acesso aleatrio ou randmico pode ser comparado a um CD-ROM com
msicas pelo qual se pode ouvir a primeira msica, depois saltar para a dcima, sem que haja
necessidade de percorrer todas as msicas intermedirias.
Para que seja possvel a manipulao de arquivos se acesso aleatrio ou randmico, ser
necessrio:

Declarar o registro e o arquivo.
Declarar as variveis de arquivos.
Abrir o arquivo.
Fechar o arquivo.

Esses passos so utilizados para qualquer operao de manipulao de arquivos e j foram
explicados anteriormente no Algoritmo 1 da seo de arquivos seqenciais Operao de incluso.
No exemplo a seguir, ser feita a construo de um cadastro de clientes que armazene
cdigo do cliente, nome, telefone e e-mail.

Exemplos arquivo de acesso direto

ARQUIVO DE ACESSO ALEATRIO OPERAO DE INCLUSO

1) Operao de incluso arquivo de acesso direto.

Soluo:

138
a) algoritmo em pseudocdigo

inicio
tipo
reg_cliente = registro
cod_cli:inteiro;
nome: caracter;
telefone:caracter;
email:caracter;
fimregistro;
arq_cliente: arquivo direto de reg_cliente;

auxiliar:reg_cliente;
cliente:arq_cliente;
abrir(cliente);
leia(auxiliar.cod_cli, auxiliar.nome, auxiliar.telefone, auxiliar.email);
posicionar(cliente, auxiliar);
armazenar(cliente, auxiliar);
fechar(cliente);
fim.

A instruo Posicionar (nome da varivel de arquivo, nome da varivel de registro) utilizada
para posicionar o novo registro corretamente. Essa posio determinada pelo campo chave. No
algoritmo acima, o campo chave o Cod_Cli. necessrio que seja indicado tambm o
armazenamento do registro para que este seja definitivamente inserido no arquivo por meio da
instruo Armazenar (nome da varivel de arquivo, nome da varivel de registro).


b) programa em Java

import java.io.*;
class usaCliente{
static StringBuffer memoria = new StringBuffer();
public static void main(String args[]){
try{
BufferedReader entrada;
entrada = new BufferedReader(new InputStreamReader(System.in));

BufferedReader arqentrada;
arqentrada = new BufferedReader(new FileReader("cliente.txt"));
String linha="";

while((linha = arqentrada.readLine()) != null){
memoria.append(linha + "\n");
}
int cod_cli = 1;
if (memoria.length() != 0){
int inicio = memoria.lastIndexOf("#");
int fim = memoria.indexOf("\t",inicio);
cod_cli = Integer.parseInt(ler(inicio + 1,fim));
cod_cli +=1;
}
System.out.println("Codigo do cliente: "+ cod_cli);
System.out.println("Entre com o nome:");
String nome = entrada.readLine();
System.out.println("Entre com o telefone:");
String telefone = entrada.readLine();
System.out.println("Entre com o e_mail:");
String email = entrada.readLine();

regCliente regCli1 = new regCliente(cod_cli,
nome,telefone,email);
linha = "#" + regCli1.mostraCod() + "\t"
+ regCli1.mostraNome() + "\t"
+ regCli1.mostraTelefone() + "\t"
139
+ regCli1.mostraEmail() + "\n";
gravar(linha);
}catch(FileNotFoundException erro){
System.out.println("Arquivo nao encontrado!");
}catch(Exception erro){
System.out.println("Erro de leitura!");
}
}
public static String ler(int primeiro, int ultimo){
String dados = "";
char[] destino = new char[ultimo - primeiro];
memoria.getChars (primeiro, ultimo, destino, 0);
for (int i =0; i < destino.length;i++){
dados += destino[i];
}
return dados;
}

public static void gravar(String linha){
try{
BufferedWriter saida;
saida= new BufferedWriter(new FileWriter("cliente.txt",true));
saida.write(linha);
saida.flush();
saida.close();
}catch(Exception e){
System.out.println("Erro de gravacao!");
}

}
}
Essa implementao do algoritmo considera que os cdigos dos clientes so numerados a partir de 1.
O programa efetua uma busca no continer memoria, desde que ele no esteja vazio (verificao
feita na linha 15), para obter o cdigo atribudo ao ltimo cliente cadastrado. Como o arquivo de
dados um arquivo texto, utilizou-se um marcador (caractere #) que precede todos os nmeros de
cdigo dos clientes. Dessa forma, a posio do ltimo # obtido com a busca feita linha 16 e o fim do
campo cdigo obtido com a instruo da linha seguinte. Passamos as posies dos ndices de
incio e fim para o mtodo ler, que retorna o cdigo. Como esse cdigo est representado por
caracteres, j que se origina de um arquivo texto, o resultado obtido uma string de caracteres.
Utilizamos o mtodo parseInt da classe Integer para converter a string para inteiro. Como esse cdigo
o que foi atribudo ao ltimo cliente cadastrado, ele precisa ser acrescido de 1, garantindo a
seqencia e a unicidade de identificao. Obtm-se os demais dados por meio da entrada via teclado
e instancia-se um objeto, como feito anteriormente.
Para gravar os dados no arquivo, utilizaremos uma varivel linha, do tipo String, que ser
passada como parmetro para o mtodo gravar. A varivel linha recebe a concatenao dos diversos
campos do objeto, retornados pelos respectivos mtodos e dos caracteres separados, inclusive o
caractere # indicador do nmero de cdigo do cliente (linha 29).

Ateno: Lembre-se de que o arquivo precisa ser criado antecipadamente, com o mesmo nome
usado no cdigo.


ARQUIVO DE ACESSO ALEATRIO OPERAO DE CONSULTA

1) Operao de consulta arquivo de acesso direto.

Soluo:

a) algoritmo em pseudocdigo

inicio
tipo
reg_cliente = registro
cod_cli:inteiro;
nome: caracter;
140
telefone:caracter;
email:caracter;
fimregistro;
arq_cliente: arquivo direto de reg_cliente;

auxiliar:reg_cliente;
cliente:arq_cliente;
consulta_codcli:inteiro;
abrir(cliente);
leia(consulta_codcli);
se (consulta_codcli = auxiliar.cod_cli) entao
posicionar(cliente, auxiliar.cod_cli);
senao
escreva(Registro nao cadastrado);
fimse;
fechar(cliente);
fim.

Nota: O acesso direto/aleatrio ao registro a ser consultado feito por meio do campo chave.

b) programa em Java

import java.io.*;
class usaCliente2{
static StringBuffer memoria = new StringBuffer();
public static void main(String args[]){
try{
BufferedReader entrada;
entrada = new BufferedReader(new InputStreamReader(System.in));

BufferedReader arqentrada;
arqentrada = new BufferedReader(new FileReader("cliente.txt"));
String linha="";

while((linha = arqentrada.readLine()) != null){
memoria.append(linha + "\n");
}
System.out.println("Digite o codigo:");
String consulta_codcli = entrada.readLine();
int inicio = -1;
if (memoria.length() != 0){
inicio = memoria.lastIndexOf("#" + consulta_codcli);
if (inicio == -1){
System.out.println("Codigo nao encontrado!!");

}
}else{
System.out.println("O arquivo esta vazio!!!");

}
}catch(FileNotFoundException erro){
System.out.println("Arquivo nao encontrado!");
}catch(Exception erro){
System.out.println("Erro de leitura!");
}
}

}

A implementao da busca direta feita por meio do cdigo do cliente, resultando da entrada
via teclado, e do caractere associado a esse cdigo (caractere #). A instruo na linha 18 executa
essa operao e o mtodo usado o mesmo dos casos anteriores: indexOf, que retorna a posio
inicial do dado pesquisado no continer de memria e, conseqentemente, do arquivo originrio.
Foram introduzidos dois testes de verificao para garantir a execuo correta do programa.
Um deles, na linha 17, se o contnier de memria
141
est vazio, executando a busca somente no caso de existirem dados, ou seja, o tamanho de
memria obtido pelo mtodo length deve retornar um valor diferente de 0. A outra verificao indica
se a varivel inicio recebeu um valor diferente do atribudo quando de sua inicializao (-1),
significando que o cdigo foi encontrado. Caso o cdigo tenha sido encontrado, a varivel inicio ter
um valor igual ou maior que 0 e corresponder posio de incio do campo pesquisado.


ARQUIVO DE ACESSO ALEATRIO OPERAO DE ALTERAO

1) Operao de alterao arquivo de acesso direto.

Soluo:

a) algoritmo em pseudocdigo

inicio
tipo
reg_cliente = registro
cod_cli:inteiro;
nome: caracter;
telefone:caracter;
email:caracter;
fimregistro;
arq_cliente: arquivo direto de reg_cliente;

auxiliar:reg_cliente;
cliente:arq_cliente;
altera_codcli:inteiro;
novo_nome, novo_tel, novo_end, novo_email:caracter;
abrir(cliente);
leia(altera_codcli);
se (altera_codcli = auxiliar.cod_cli) entao
inicio
posicionar(cliente, auxiliar.cod_cli);
escreva(auxiliar.nome, auxiliar.telefone, auxiliar.endereco, auxiliar.email);
leia( novo_nome, novo_tel, novo_end, novo_email);
auxiliar.nome = novo_nome;
auxiliar.telefone = novo_tel;
auxiliar.endereco = novo_end;
auxiliar.email = novo_email;
armazenar(cliente, auxiliar);
fim;
senao
escreva(Registro nao cadastrado);
fimse;
fechar(cliente);
fim.

A classe regCliente deve ser modificada para a incluso dos mtodos que permitem alterao
dos atributos nome, tel e e-mail; tais mtodos devem ser compatveis com os nomes utilizados no
programa desse exemplo: alteraNome, alteraTel e alteraEmail. Caso voc queira atribuir outros
nomes aos mtodos, no h problema, desde que eles sejam compatveis, lembrando a questo das
letras maisculas e minsculas, que no pode ser desprezada, pois Java case-sensitive.

b) programa em Java

public class regCliente{
private int cod_cli;
private String nome;
private String telefone;
private String email;

public regCliente(int cod, String nom, String telef, String e_mail){
142
cod_cli = cod;
nome = nom;
telefone = telef;
email = e_mail;
}
public int mostraCod(){
return cod_cli;
}
public String mostraNome(){
return nome;
}
public String mostraTelefone(){
return telefone;
}
public String mostraEmail(){
return email;
}
public void alteraNome(String novoNome){
nome = novoNome;
}
public void alteraTel(String novoTelefone){
telefone = novoTelefone;
}
public void alteraEmail(String novoEmail){
email = novoEmail;
}
}


import java.io.*;
class usaCliente3{
static StringBuffer memoria = new StringBuffer();
public static void main(String args[]){
try{
BufferedReader entrada;
entrada = new BufferedReader(new InputStreamReader(System.in));

BufferedReader arqentrada;
arqentrada = new BufferedReader(new FileReader("cliente.txt"));
String linha="";

while((linha = arqentrada.readLine()) != null){
memoria.append(linha + "\n");
}
System.out.println("Digite o codigo:");
String altera_codcli = entrada.readLine();
int primeiro = -1;
if (memoria.length() != 0){
primeiro = memoria.lastIndexOf("#" + altera_codcli);
if (primeiro != -1){
int fim = memoria.indexOf("\t",primeiro);
int cod_cli = Integer.parseInt(ler(primeiro += 1,
fim));
primeiro = fim + 1;
fim = memoria.indexOf("\t",primeiro);
String nome = ler (primeiro, fim);
int inicio = fim +1;
fim = memoria.indexOf("\t",inicio);
String tel = ler(inicio,fim);
inicio = fim + 1;
fim = memoria.indexOf("\n",inicio);
String email = ler(inicio,fim);

System.out.println(nome + " " + tel + " " + email);

regCliente regCli1 = new regCliente(cod_cli, nome,
tel, email);
System.out.println("Entre com o novo nome:");
143
nome = entrada.readLine();
System.out.println("Entre com o novo telefone:");
tel = entrada.readLine();
System.out.println("Entre com o novo email:");
email = entrada.readLine();
regCli1.alteraNome(nome);
regCli1.alteraTel(tel);
regCli1.alteraEmail(email);
memoria.replace(primeiro, fim, regCli1.mostraNome()
+ "\t" + regCli1.mostraTelefone() + "\t"+ regCli1.mostraEmail());
gravar();
}else{
System.out.println("Codigo nao encontrado!");

}
}else{
System.out.println("O arquivo esta vazio!");
}
}catch(FileNotFoundException erro){
System.out.println("Arquivo nao encontrado!");
}catch(Exception erro){
System.out.println("Erro de leitura!");
}
}
public static String ler(int primeiro, int ultimo){
String dados = "";
char[] destino = new char[ultimo - primeiro];
memoria.getChars (primeiro, ultimo, destino, 0);
for (int i =0; i < destino.length;i++){
dados += destino[i];
}
return dados;
}

public static void gravar(){
try{
BufferedWriter saida;
saida= new BufferedWriter(new FileWriter("cliente.txt",true));
saida.write(memoria.toString());
saida.flush();
saida.close();
}catch(Exception e){
System.out.println("Erro de gravacao!");
}

}
}

O cdigo do cliente a ser pesquisado atribudo varivel alteraCod_cli e a busca feita nos
moldes do Exemplos anteriores. Porm, neste caso, utiliza-se uma varivel adicional: primeiro, que
armazena a posio inicial do trecho que ser alterado quando da atualizao do contnier memoria.
A varivel primeiro utilizada durante o percurso pelo registro at que ela represente a posio inicial
do campo Nome, quando ento se passa a utilizar a varivel inicio em conjunto com a varivel fim
para o percurso e a recuperao dos demais campos do registro. Isso se deve ao fato de que se
pretende preservar o campo cdigo do cliente, que um campo de controle e no pode ser alterado
pelo usurio.
Na linha 18, a varivel primeiro recebe a posio inicial do caractere # e o cdigo do cliente,
caso ele tenha sido encontrado. Na linha 19, testa-se a condio de primeiro ter recebido um ndice
vlido. Na linha 20, efetua-se a busca a partir da posio encontrada e a prxima posio de
tabulao, isolando-se as posies de incio e fim do cdigo do cliente. Observe que, para a
passagem de posies para o mtodo ler, a varivel primeiro incrementada em 1, visto que o
campo propriamente dito inicia-se a partir da posio seguinte, que corresponde aos caracteres do
nmero do cdigo do cliente. Deve-se desprezar o caractere #. Na linha 21, a varivel Cod_cli recebe
os dados do cdigo do cliente, que convertido para inteiro, seu tipo de dado original, como foi
declarado em regAgenda. Na linha 22, a varivel primeiro recebe a posio fim + 1, pois o prximo
campo a ser recuperado o campo Nome, que est na seqencia. Sua primeira posio equivale a
144
uma posio alm do final do campo cdigo. Na linha 25 passa-se a utilizar a varivel inicio,
permitindo-se que o valor da varivel primeiro permanea com o valor da posio que lhe foi atribuda
por ltimo. A tabela a seguir apresenta resumidamente um exemplo de possveis posies que os
campos de um registro poderiam assumir e as variveis utilizadas para recuperar as posies de
cada campo. Logo a seguir mostramos um teste de mesa aplicado a esse exemplo. A coluna 'LINHA'
corresponde linha do programa.
importante destacar que, no momento em que feita a atualizao dos dados no continer
da memria, so passadas as posies referentes ao valor das variveis primeiro e fim, que
correspondem ao intervalo de caracteres que vai de Nome at Email. No exemplo, esse intervalo vai
da posio 3 at a 39.


posio 0 1 2 3 a 8 9 10 a 17 18 19 a 38 39
contedo # Cdigo \ t Nome \ t Tel \ t Email \ n
varivel primeiro primeiro fim primeiro Fim inicio fim inicio fim
Posies possveis para os campos de um registro


Linha primeiro inicio fim
16 -1
18 0
20 0 2
22 3 2
23 3 9
25 3 10 9
26 3 10 18
28 3 19 18
29 3 19 39
Teste de mesa


ARQUIVO DE ACESSO ALEATRIO OPERAO DE EXCLUSO

Operao de excluso arquivo de acesso direto.

Soluo:

a) algoritmo em pseudocdigo

inicio
tipo
reg_cliente = registro
cod_cli:inteiro;
nome: caracter;
telefone:caracter;
email:caracter;
fimregistro;
arq_cliente: arquivo direto de reg_cliente;

auxiliar:reg_cliente;
cliente:arq_cliente;
consulta_codcli:inteiro;
resposta:caracter;
abrir(cliente);
leia(consulta_codcli);
se (consulta_codcli = auxiliar.cod_cli) entao
145
inicio
posicionar(cliente, auxiliar.cod_cli);
escreva(Deseja excluir? (Digite S ou N) );
leia(resposta);
auxiliar.endereco = novo_endereco;
se (resposta = S) entao
deletar(cliente,auxiliar);
fimse;
fim;
senao
escreva(Registro nao cadastrado);
fimse;
fechar(cliente);
fim.

b) programa em Java

import java.io.*;
class usaCliente4{
static StringBuffer memoria = new StringBuffer();
public static void main(String args[]){
try{
BufferedReader entrada;
entrada = new BufferedReader(new InputStreamReader(System.in));

BufferedReader arqentrada;
arqentrada = new BufferedReader(new FileReader("cliente.txt"));
String linha="";

while((linha = arqentrada.readLine()) != null){
memoria.append(linha + "\n");
}
System.out.println("Digite o codigo:");
String consulta_codcli = entrada.readLine();
int inicio = -1;
if (memoria.length() != 0){
inicio = memoria.indexOf("#" + consulta_codcli);
if (inicio != -1){
int fim = memoria.indexOf("\t",inicio);
int cod_cli = Integer.parseInt(ler(inicio + 1,
fim));
System.out.println("Deseja excluir cliente: " +
cod_cli + "? S/N");
String resposta = entrada.readLine();
if (resposta.equalsIgnoreCase("S")){
fim = memoria.indexOf("\n",inicio);
memoria.delete(inicio, fim +1);
gravar();
}
}else{
System.out.println("Codigo nao encontrado!");

}
}else{
System.out.println("O arquivo esta vazio!");
}
}catch(FileNotFoundException erro){
System.out.println("Arquivo nao encontrado!");
}catch(Exception erro){
System.out.println("Erro de leitura!");
}
}
public static String ler(int primeiro, int ultimo){
String dados = "";
char[] destino = new char[ultimo - primeiro];
memoria.getChars (primeiro, ultimo, destino, 0);
for (int i =0; i < destino.length;i++){
146
dados += destino[i];
}
return dados;
}

public static void gravar(){
try{
BufferedWriter saida;
saida= new BufferedWriter(new FileWriter("cliente.txt",true));
saida.write(memoria.toString());
saida.flush();
saida.close();
}catch(Exception e){
System.out.println("Erro de gravacao!");
}

}
}

Nesse exemplo, fazemos a busca do cdigo do cliente como no exemplo anterior. Obtemos,
assim, o incio do registro a ser excludo. Obtemos o cdigo pelo mtodo ler (linha 21), para exibi-lo
no pedido de confirmao ao usurio (linha 22). Se a resposta for igual a S (desprezando-se
maisculas e minsculas linha 25), procede-se excluso do registro no continer de memria. O
mtodo gravar efetiva a transferncia dos dados para o arquivo.


Exemplos diversos - utilizando as classes AWT, swing e event

a) O exemplo abaixo demonstra o cdigo necessrio para leitura e gravao de um arquivo texto
chamado arq.txt.


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;

class Exemplo1Arquivos extends JFrame implements ActionListener{
JLabel L1;
JButton B1,B2,B3;
TextArea TA1;
public static void main(String args[]){
JFrame Janela = new Exemplo1Arquivos();
WindowListener x = new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
};
Janela.addWindowListener(x);
Janela.show();
}
Exemplo1Arquivos(){
147
setTitle("Manipulao de arquivos texto");
setSize(500,250);
getContentPane().setBackground(new Color(150,150,150));
getContentPane().setLayout(new FlowLayout());
L1 = new JLabel("Texto a ser gravado");
L1.setForeground(Color.black);
B1 = new JButton("Gravar");
B2 = new JButton("Ler");
B3 = new JButton("Limpar");
B1.addActionListener(this);
B2.addActionListener(this);
B3.addActionListener(this);
TA1 = new TextArea(8,60);
getContentPane().add(L1);
getContentPane().add(TA1);
getContentPane().add(B1);
getContentPane().add(B2);
getContentPane().add(B3);
}

public void actionPerformed(ActionEvent e){
String nome_do_arquivo = "c:/arq.txt";
if(e.getSource() == B3) //limpar
TA1.setText("");
if(e.getSource() == B1){ //gravar
try{
String S = TA1.getText();
byte b[] = S.getBytes();
FileOutputStream out = new
FileOutputStream(nome_do_arquivo);
out.write(b);
out.close();
}catch(java.io.IOException exc){
System.out.println("Erro ao gravar arquivo!");
}
}
if(e.getSource() == B2) { //ler
try{
FileInputStream in = new
FileInputStream(nome_do_arquivo);
byte bt[] = new byte[10240];
in.read(bt);
String S = new String(bt);
TA1.setText(S);
in.close();
}catch(java.io.IOException exc){
System.out.println("Erro ao ler arquivo!");
}
}
}
}


b) O exemplo abaixo apresenta uma forma mais prtica de manipular arquivos texto, inserindo uma
caixa de dilogo a partir da classe FileDialog, uma pacote AWT. Quando o usurio pressiona o boto
gravar ou abrir, aparece uma caixa de dilogo semelhante utilizada pelo windows, por exemplo, no
bloco de notas. Com isso, torna-se possvel realizar a escolha do arquivo que ser lido ou gravado
pela aplicao. O exemplo ainda outras duas classes (FileWriter e FileReader) que podem ser
usadas para a manipulao de arquivos texto. O cdigo do exemplo apresentado abaixo:

148



import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;

class Exemplo2Arquivos extends JFrame implements ActionListener{
JLabel L1,L2;
JButton B1,B2,B3;
TextArea TA1;
JTextField T1;
JPanel P1;
FileDialog Fabrir, Fsalvar;
public static void main(String args[]){
JFrame Janela = new Exemplo2Arquivos();
WindowListener x = new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
};
Janela.addWindowListener(x);
Janela.show();
}
Exemplo2Arquivos(){
setTitle("Manipulao de arquivos texto");
setSize(500,300);
getContentPane().setBackground(new Color(150,150,150));
getContentPane().setLayout(new FlowLayout());
L1 = new JLabel("Texto a ser editado");
L1.setForeground(Color.black);
L2 = new JLabel("Status");
L2.setForeground(Color.black);
B1 = new JButton("Gravar");
B1.addActionListener(this);
B2 = new JButton("Abrir");
B2.addActionListener(this);
B3 = new JButton("Limpar");
B3.addActionListener(this);
T1 = new JTextField(35);
T1.setForeground(Color.red);
T1.setEditable(false);
P1 = new JPanel();
P1.setLayout(new FlowLayout());
P1.add(L2);
P1.add(T1);
TA1 = new TextArea(8,60);
Fabrir = new FileDialog(this, "Abrir arquivo", FileDialog.LOAD);
Fsalvar = new FileDialog(this, "Salvar arquivo", FileDialog.SAVE);
149
getContentPane().add(L1);
getContentPane().add(TA1);
getContentPane().add(B1);
getContentPane().add(B2);
getContentPane().add(B3);
getContentPane().add(P1);
}

public void actionPerformed(ActionEvent e){
String nome_do_arquivo = "c:/arq.txt";
if(e.getSource() == B3){ //limpar
TA1.setText("");
T1.setText("");
}
if(e.getSource() == B1){ //gravar
try{
Fsalvar.show();
if (Fsalvar.getFile() ==null) return;
nome_do_arquivo = Fsalvar.getDirectory() +
Fsalvar.getFile();
FileWriter out = new FileWriter(nome_do_arquivo);
out.write(TA1.getText());
out.close();
T1.setText("Arquivo gravado com sucesso!");
}catch(java.io.IOException exc){
System.out.println("Erro ao gravar arquivo!");
}
}
if(e.getSource() == B2) { //ler
try{
Fabrir.show();
if (Fabrir.getFile() ==null) return;
nome_do_arquivo = Fabrir.getDirectory() +
Fabrir.getFile();
FileReader in = new FileReader(nome_do_arquivo);
String S="";
int i = in.read();
while(i!= -1){
S = S + (char)i;
i = in.read();
}
TA1.setText(S);
in.close();
T1.setText("Arquivo aberto com sucesso!");
}catch(java.io.IOException exc){
System.out.println("Erro ao abrir arquivo!");
}
}
}
}

ci) O prximo exemplo mostra a leitura e gravao de outros formatos de arquivo (inteiro)..

Mtodos para leitura de tipos
primitivos
Mtodos para a gravao de
tipos primitivos
readBoolean() writeBoolean()
readDouble() writeDouble()
readFloat() writeFloat()
readInt() writeInt()
readLong() writeLong()
readShort writeShort()



150












import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;

class Exemplo3Arquivos extends JFrame implements ActionListener{
JLabel L1,L2;
JTextField T1, T2, T3;
JButton B1,B2,B3;

public static void main(String args[]){
JFrame Janela = new Exemplo3Arquivos();
WindowListener x = new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
};
Janela.addWindowListener(x);
Janela.show();
}
Exemplo3Arquivos(){
setTitle("Gravao de nmeros inteiros");
setSize(280,150);
getContentPane().setBackground(new Color(220,220,220));
L1 = new JLabel("Numero incial : ");
L1.setForeground(Color.black);
L2 = new JLabel("Numero final : ");
L2.setForeground(Color.black);
B1 = new JButton("Gravar");
B1.addActionListener(this);
B2 = new JButton("Limpar");
B2.addActionListener(this);
B3 = new JButton("Somar");
B3.addActionListener(this);
T1 = new JTextField();
T2 = new JTextField();
T3 = new JTextField();
getContentPane().setLayout(new GridLayout(4,2));
getContentPane().add(L1);
getContentPane().add(T1);
getContentPane().add(L2);
getContentPane().add(T2);
getContentPane().add(B1);
getContentPane().add(B2);
getContentPane().add(B3);
getContentPane().add(T3);
}

public void actionPerformed(ActionEvent e){
if(e.getSource() == B2){
T1.setText("");
T2.setText("");
return;
}
if(e.getSource() == B1){
151
try{
int N1 = Integer.parseInt(T1.getText());
int N2 = Integer.parseInt(T2.getText());

String S ="";
FileOutputStream arq = new
FileOutputStream("c:/arq.dat");
BufferedOutputStream buf = new BufferedOutputStream(arq);
DataOutputStream dado = new DataOutputStream(buf);
for(int i = N1; i < N2; i++){
dado.writeInt(i);
}
dado.close();
JOptionPane.showMessageDialog(null, "Arquivo gerado com
sucesso!", "Gravao de arquivo", JOptionPane.INFORMATION_MESSAGE);

}catch(java.io.IOException exc){
JOptionPane.showMessageDialog(null, "Erro ao gravar
arquivo!", "Erro!!", JOptionPane.ERROR_MESSAGE);
}
catch(NumberFormatException exc){
JOptionPane.showMessageDialog(null, "Digite apenas
valores numricos!", "Erro!!", JOptionPane.ERROR_MESSAGE);
}
}
if(e.getSource() == B3) {
int total =0;
try{
FileInputStream arq = new FileInputStream("c:/arq.dat");
BufferedInputStream buf = new BufferedInputStream(arq);
DataInputStream dado = new DataInputStream(buf);
while(true){
int i = dado.readInt(); //ao terminar gera a
excecao EOF
total = total + i;
}
}catch(java.io.EOFException exc){
T3.setText(""+total);
}
catch(java.io.IOException exc){
JOptionPane.showMessageDialog(null, "Erro ao ler
arquivo", "Erro!!", JOptionPane.ERROR_MESSAGE);
}
}
}
}

152
Exerccios de Fixao - arquivos

v) Dados dois arquivos concebidos seqencialmente, possuindo as informaes descritas nas
fichas esquematizadas, desenvolva um programa que realize uma unio deste. Essa
unio implica criar um terceiro arquivo no qual constem apenas informaes das pessoas
que faziam parte de ambos os arquivos seqenciais; informaes que no possurem
correspondncia no devero existir no terceiro arquivo.


Nome:

Endereo:

Telefone:




Nome:

Endereo:

Bairro: Cidade: Estado:

CEP: Data nasc:




w) A partir da estrutura do registro construa um programa para administrar os problemas
cotidianos de um clube:

Arquivo de associados: randmico
Chave: cdigo


N scio:

Nome:

Endereo:

Bairro: Cidade: Estado:

N dependentes: Data de associao:



Arquivo de mensalidades: seqencial



N scio:

Data vencimento: Valor:

Data de pagamento:




153
i) Calcular o nmero total de possveis freqentadores do clube (titulares + dependentes).
j) Apresentar a relao dos associados que aniversariam em determinado ms fornecido.
k) O programa dever ser capaz de fazer incluses, alteraes e excluses no arquivo de
associados.
l) Criar uma rotina que modifique a mensalidade para cada scio, na data e valor
fornecidos.
m) Apresentar a relao dos associados inadimplentes, junto com o respectivo valor total da
dvida, mostrando ao final o valor totalizado de todas as dvidas dos associados.

x) Com o modelo dos registros a seguir, construa um programa para administrao de contas
correntes em um banco.

9. Arquivo de correntistas: randmico
10. Chave: conta corrente



Conta corrente:

Correntista:

Data abertura:

Agncia:


11. Arquivo de agncias: randmico
12. Chave: nmero agncia



N agncia:

Nome agncia:



13. Arquivo de lanamento: seqencial


Conta corrente:

Data: Valor:

Docto: Histrico:



y) Exibir relatrio com a relao com o nome e a quantidade de correntistas de cada
agncia.
z) Exibir relatrio com um ranking das dez agncias com maior montante de saldo.
aa) Calcular o saldo de dado correntista em uma data fornecida.
bb) Exibir um relatrio para um perodo (data inicial e data final) e conta corrente
fornecida. O extrato deve apresentar o saldo anterior e, para cada
lanamento do perodo, deve apresentar a data, histrico, nmero do
documento e valor. Ao final deve apresentar o saldo remanescente.

cc) Dados dois arquivos concebidos randomicamente e um, seqencialmente, descritos atravs
do diagrama representativo de seus respectivos registros, elabore um programa que tem
por objetivo suprir as necessidades de uma vdeo-locadora:

154
Arquivo de clientes: randmico
Chave: cdigo


Cdigo: Telefone:

Nome:

Endereo:

RG: CPF:



Arquivo de fitas de vdeo: randmico
Chave: cdigo da fita


Cdigo: Oscar S/N:

Ttulo:

Assunto:

Data de compra: / / Preo:



Arquivo de movimento: seqencial



Cdigo fita:

Cdigo cliente:

Qtde. dias fora: Preo:




dd) Consultar quais nomes e assuntos dos filmes um cliente, fornecido, j locou.
ee) Consultar quais clientes (com nome e telefone) locaram determinada fita.
ff) Exibir relatrio:
De gastos de cada cliente;
Da relao das fitas que cada cliente locou mais de uma vez, com suas
respectivas quantidades;
De fita por assunto;
De filmes premiadas com um Oscar.
gg) Consultar quais filmes j premiados com o Oscar um determinado cliente j locou.
hh) Exibir relatrio com todas as fitas j locadas, e o total de tempo respectivo em que
cada uma foi locada.
ii) Exibir relatrio com as dez fitas mais locadas.
jj) Exibir relatrio com a rentabilidade acumulada das duas fitas que mais e das duas
que menos foram locadas.
kk) Exibir relatrio de quais fitas que j se pagaram.

Para os exerccios abaixo, escreva o pseudocdigo e codifique o programa em Java.

155
a) Elabore um cadastro que armazene os dados dos atletas de um clube. Devero ser armazenados:
nome, idade, altura, sexo, peso e modalidade esportiva. O programa dever permitir a manipulao
dos dados armazenados. Utilize o mtodo seqencial.

b) Elabore um programa que possibilite o armazenamento dos dados dos funcionrios de uma
empresa ra que seja gerada a folha de pagamento. Devero ser armazenados: nome do funcionrio,
cdigo funcionrio, data de admisso, salrio bruto, n[umero de dependentes e cargo. O programa
dever permitir a manipulao das informaes e possuir uma opo para calcular o salrio lquido de
cada funcionrio. Utilize o mtodo randmico.

Elabore um controle acadmico que permita:

o cadastro dos dados acadmicos que permita;
o cadastro dos dados pessoais dos alunos;
o cadastro das notas associadas grade do aluno;
a manipulao dos dados com controle de senha;

Crie um menu de opes e utilize todos os recursos aprendidos at agora. Utilize o mtodo
randmico. O programa dever verificar se o aluno foi aprovado ou reprovado nas disciplinas,
levando -se em considerao que a mdia de aprovao de 7.0 sem exame e de 5.0 com exame.

Elabore um controle de estoque que permita:

3. cadastrar novos produtos;
4. manipular as informaes cadastradas;
5. acompanhar a quantidade de produtos disponveis;
6. consultar o nome do produto, a quantidade disponvel e o preo;

Faa um menu de opes e utilize todos os recursos aprendidos. Utilize o mtodo sequencial.

































156

Programao Orientada a Objetos

Conceitos Preliminares

Introduo

termo orientao a objetos pressupe uma organizao de software em termos de coleo de
objetos discretos incorporando estrutura e comportamento prprios. Esta abordagem de
organizao essencialmente diferente do desenvolvimento tradicional de software, onde
estruturas de dados e rotinas so desenvolvidas de forma apenas fracamente acopladas.
Neste captulo, as primeiras noes de orientao a objetos sero introduzidas. Esta breve
viso geral do paradigma permitir entender melhor os conceitos associados programao
orientada a objetos e, em particular, s construes da linguagem Java
TM
.

O processo de Abstrao

Abstrao consiste de focalizar nos aspectos essenciais inerentes a uma entidade e ignorar
propriedades acidentais. Em termos de desenvolvimento de sistemas, isto significa concentrar-se no
que um objeto e faz antes de se decidir como ele ser implementado. O uso de abstrao preserva
a liberdade para tomar decises de desenvolvimento ou de implementao apenas quando h um
melhor entendimento do problema a ser resolvido.
Muitas linguagens de programao modernas suportam o conceito de abstrao de dados;
porm, o uso de abstrao juntamente com polimorfismo e herana, como suportado em orientao a
objetos, um mecanismo muito mais poderoso.
O uso apropriado de abstrao permite que um mesmo modelo conceitual (orientao a
objetos) seja utilizado para todas as fases de desenvolvimento de um sistema, desde sua anlise at
sua documentao.

Operaes de abstrao

Um programa de computador consiste na representao do modelo de resoluo de um
problema.
As operaes de abstrao mostram como o ser humano mentaliza, organiza e modela o
mundo ao seu redor. Ao pensarmos o mundo real, as seguintes operaes bsicas podem ser
aplicadas:

7. Classificao/instanciao
8. Generalizao/especializao
9. Agregao/decomposio
10. Associao

ClassificaoJInstanciao

Cada entidade tem determinadas caractersticas que a identificam.

Uma categoria define o conjunto de caractersticas que devem ser apresentadas por um
objeto, para que o mesmo possa ser classificado como pertencente a mesma. Assim, categoria o
mesmo que classe. Conclumos ento que cada objeto tem sua prpria existncia e caractersticas, e
todos os objetos que apresentam as mesmas caractersticas so definidos como pertencentes a uma
mesma classe.
Quando, em um grupo de objetos, identificamos um conjunto de caractersticas que so
comuns a todos, e a partir desta identificao, definimos a classe a qual pertencem todos estes
objetos, estamos fazendo uma operao de classificao. Por outro lado, quando construmos um
objeto contendo todas as caractersticas de determinada classe, estamos fazendo uma operao de
instanciao. A operao de instanciao ocorre sempre que criamos uma entidade de determinada
classe.
O
157
Uma classe define o conjunto de caractersticas dos objetos pertencentes a ela, isto , especifica que
aes podem ser executadas pelos objetos, como estes objetos so compostos, quais
relacionamentos decorrentes desta composio, etc.
O processo de identificao da pertinncia de um objeto a uma determinada classe pode ser
caracterizado, se ocorrer uma relao do tipo um entre o objeto e a classe.




















Classificao. Operao que tem por objetivo, atravs da anlise das caractersticas de um
objeto, definir que classe o mesmo pertence.

Instanciao. Operao que, dada uma determinada classe, define (ou cria) um objeto
pertencente a esta classe.


GeneralizaoJEspecializao

Sempre que, a partir de uma classe mais genrica, se definir uma classe mais especializada,
est se fazendo uma operao de Especializao. A classe mais especializada mantm (herda) todas
as caractersticas da classe mais geral e, adicionalmente, define caractersticas especficas.
De maneira inversa, podemos a partir de um grupo de classes, identificar caractersticas que
so comuns a todas e definir com estas caractersticas comuns, uma nova classe, a qual ser mais
geral. A esta operao denomina-se Generalizao.
A identificao da existncia de uma generalizao/especializao fica caracterizada, se
ocorrer a relao um tipo de entre a classe mais especializada e a mais geral.

Generalizao. Operao de anlise de um conjunto de classes que identifica caractersticas
comuns a todas, tendo-se por objetivo a definio de uma classe mais genrica, a qual especificar
estas caractersticas comuns.

AUTOMVEL

(tem motor; porta-malas; placa;
n.chassis; ano; modelo;
proprietrio; formato; monobloco;
etc)

Classe
(categoria)
Vectra do
Jos
Fusca da
Maria
Objeto
(entidade)
Instanciao Classificao
158
Especializao. Operao em que a partir de uma classe, identifica-se uma ou mais subclasses,
cada uma especificando caractersticas adicionais, em relao classe mais geral.




Para representarmos a operao de generalizao/especializao, usamos uma linha
contnua ligando a classe mais geral classe mais especializada, e com uma seta apontando para a
classe mais geral.


















AgregaoJDecomposio

Especializao
Generalizao
VECULO AUTOMOTOR

(tem motor; porta-malas; placa;
n.chassis; ano; modelo;
proprietrio; formato; monobloco;
etc)

(movimenta-se; pra; etc.)
AUTOMVEL

porta-malas; formato
monobloco.)


CAMINHO

(carroceria; n. de eixos; carga
mxima)


Classe mais geral



Classe mais especfica



159
Um objeto constitui-se em alguma coisa que apresenta determinadas caractersticas, as
quais esto definidas em sua classe. Estas caractersticas podem ser divididas em dois grupos:
caractersticas de composio e caractersticas de ao.
As caractersticas de ao so aquelas que dizem respeito aos servios que o objeto pode
executar.
As caractersticas de composio dizem respeito a constituio do objeto.
Um objeto pode ser composto por outros objetos. Quando unimos um conjunto de objetos,
com o objetivo de formamos um novo objeto, estamos realizando uma operao de agregao. Se,
analisando um objeto, isolamos cada um de seus componentes, estamos fazendo uma
decomposio.
O diagrama que expressa as operaes de agregao/decomposio tambm pode ser
chamado de Diagrama Todo/Parte. A operao de agregao caracterizada pela existncia da
relao composto por ou um agregado de.
Para mais facilmente visualizarmos uma operao de decomposio, pode-se procurar pela
existncia da relao parte de.

160

Decomposio


Agregao






































Para representar o processo de agregao/decomposio usamos uma linha contnua
juntamente com um losango unindo as duas classes envolvidas. O losango deve ser colocado junto
classe relativa entidade que representa o todo (classe agregadora).



Placa

(cidade; estado; cdigo
alfabtico; cdigo numrico)


Motor

(potncia; cilindrada;
combustvel; etc...)

(acionar; desligar; ...)






Vectra do Mauro
Placa do
Vectra do
Mauro
Porta-malas
do Vectra do
Mauro
Motor do
Vectra do
Mauro
Automvel

(tem porta-malas; tamanho
pequeno; formato monobloco;
etc...)

Veculo automotor

(tem motor;placa;
ano;n.chassis; modelo;
proprietrio; etc...)

(movimenta-se; pra; etc...)
Porta-malas

(capacidade; ...)


Classe agregadora Classe agregada
161

Associao

Uma associao consiste na descrio genrica de uma ou mais ligaes entre as entidades.
Em uma associao, as entidades que apresentam ligao existem independentemente uma da
outra. Veja que diferentemente de uma associao, quando fazemos uma operao de agregao
estamos modelando entidades que so compostas por outras entidades. A agregao/decomposio
implica em acoplamento forte entre as entidades envolvidas. A existncia de agregao fica
caracterizada, quando uma entidade parte integrante de outra entidade, no fazendo sentido a
existncia de uma, sem a existncia da outra. J na operao de associao, isto no acontece, isto
, as entidades envolvidas apresentam independentes.
Assim, se para realizar determinada tarefa, uma entidade necessitar de outra entidade, e
ambas entidades apresentarem existncias independentes, ou seja, uma no parte integrante da
outra, ento podemos definir a existncia de uma associao entre suas respectivas classes.
























Exerccios de Fixao - Conceitos bsicos de OO

1. O que voc entende por resolver um problema?
2. Defina abstraao
3. Fale sobre a relatividade do processo de abstraao. D exemplos.
+. O que uma entidade ou objeto?
5. O que uma classe?
6. Quais as operaoes de abstraao?
7. Quais as diferenas entre agregaao e associaao?
8. construa um diagrama mostrando as operaoes de abstraao realizadas para cada
um dos dominios a seguir:
- imveis;
- estudantes;
- computadores.
Professor Aluno
Associao
Professor
Jos
Aluno
Joaquim
162

O Modelo de Objetos

Conceitos Fundamentais

O conceito de orientao a objetos fundamentado nessa estrutura, pois possui quatro pilares
mestres, que so: classe, objeto, atributos e mtodos, os quais sero rapidamente expostos em
seguida, juntamente com conceitos que norteiam seu uso.

Classes e Objetos

A resoluo de um problema passa pela anlise de uma determinada situao real, tendo-se
por objetivo a construo de um modelo que represente esta situao real. Este modelo dever,
considerar os objetos (entidades) que integram o problema. Pode ser considerado como objeto,
qualquer coisa que tenha algum significado dentro do contexto do problema, seja ela concreta ou
abstrata.

Classe o conjunto de objetos que se define pelo fato de tais objetos, e s eles, terem uma
ou mais caractersticas em comum.

Pode-se observar que um objeto pode ser qualquer coisa que apresente alguma utilidade ou
sirva a algum propsito. Cada objeto consiste em uma entidade com identidade prpria. Assim,
mesmo que a partir de uma observao simples se diga que dois objetos so iguais, tem-se dois
objetos distintos. Se analisarmos dois exemplares deste texto, por exemplo, veremos que se
constituem em dois objetos distintos, apesar de terem a mesma quantidade de pginas, mesmo
contedo, etc.

Objeto uma ocorrncia especfica de uma classe, ou seja, uma instncia de uma classe ou
um elemento especfico do mundo real.

Em termos de programao podemos definir um objeto como sendo a abstrao de uma
entidade do mundo real, que apresenta sua prpria existncia, identificao, caractersticas de
composio e que tem alguma utilidade, isto , pode executar determinados servios quando
solicitado.

Atributo

o conjunto de caractersticas especficas de um objeto. Em sua obra (AMBLER, 1997),
define o atributo comparando-o a um elemento de dados definido em um registro.
O contedo de um atributo pode ser pblico ou privado. Quando privado, ocorre o efeito de
ocultamento de informaes de um atributo de uma determinada classe ou objeto, o qual no ser
visualizado ou utilizado na forma de acesso pblico.

Mtodo

O conceito de mtodo est associado forma como um determinado atributo ser alterado,
ou seja, mtodo a caracterstica que possibilita alterar a funcionalidade de um atributo. P conceito
de mtodo num nvel mais amplo possibilita efetuar op controle lgico que refletir uma determinada
ao (designar um comportamento) sobre o objeto e, por conseguinte, a sua classe tambm, ou
melhor, sua operao.
Em sua obra (AMBLER, 1997), afirma que um mtodo pode ser visto como uma funo
(funcionalidade) de um objeto, pois atravs dos mtodos que se torna possvel modificar os
atributos de um objeto, ou seja, um mtodo algo que estabelece o que realmente um objeto faz.





163
Termos empregados na POO

de fundamental importncia conhecer no s os termos empregados, mas saber fazer a
devida distino entre eles. A tabela seguinte apresenta um pequeno resumo dos termos utilizados
na definio dos quatro pilares indicados. A referida tabela possui o termo, descrio rpida de seu
significado e um possvel exemplo de sua aplicao, de acordo com o exposto em (AMBLER, 1997 e
FURLAN,1998).


TEPhD


0ESCPID


EXEhPLD

Abstrao 0efInIo da Interface de uma classe e de
seus elementos.
A classe mamiferos possuI como
elementos o conjunto de objetos de
vrIas espcIes, classIfIcadas segundo sua
familIa.
Acoplamento |edIda para avalIar o quanto duas ou maIs
classes se encontram conectadas.
D objeto ser humano e o objeto cavalo
possuem como pontos de conexo a
capacIdade de respIrarem e andarem.
Agregao CapacIdade de representar um
relacIonamento "faz parte de".
D objeto cavalo para o objeto humano
(num cenrIo rural) faz parte de sua vIda
e muItas vezes de sua subsIstncIa.
AtrIbuto CaracteristIcas especifIcas de uma classe ou
objeto.
D objeto ser humano possuI nome, sexo,
data de nascImento.
Classe Conjunto de objetos que possuem uma ou
maIs caracteristIcas comuns, podendo ser
abstratas ou concretas.
Dp ser humano pertence classe
bIologIca mamiferos.
Coeso CapacIdade de medIr o quanto de uma
determInada classe ou mtodo fazem
sentIdo.
D ser humano possuI como atrIbuto vocal
a capacIdade de falar, enquanto um
objeto cavalo no.
Colaborao CapacIdade de uma determInada classe
trabalhar em conjunto com outra classe a
fIm de desempenharem suas funes em
conjunto.
A classe mamiferos vIve em funo da
classe natureza, formando um so
ecosIstema.
Encapsulamento 0efInIo de como Implementar atrIbutos e
mtodos de uma classe.
Efetuar a operao do clculo da Idade a
partIr do atrIbuto data de nascImento
que herdado de uma classe paI.

TEPhD


0ESCPID


EXEhPLD

EspecIfIcao CapacIdade de acrescentar ou modIfIcar
atrIbutos e mtodos herdados por uma
classe fIlho a partIr de sua classe paI.
A classe paI possuI como atrIbuto
profIsso o mtodo de exercer medIcIna.
No entanto, a classe fIlho como atrIbuto
profIsso o mtodo engenharIa.
Estado SItuao do comportamento de um
determInado objeto em um determInado
momento.
D objeto ser humano encontrase em
hora de almoo.
Evento CaracteristIcas de uma ocorrncIa de nivel
sIgnIfIcatIvo do mundo real que deve ser
tratada.
D objeto ser humano possuI como mtodo
de ao trabalhar apos o almoo.
CeneralIzao CaracteristIca de compartIlhamento por
classes de atrIbutos ou mtodos comuns.
A classe fIlho e a classe paI possuem
como atrIbuto profIsso a mesma
atIvIdade economIca.
Herana CapacIdade de uma classe fIlho (subclasse)
herdar um ou maIs atrIbutos e mtodos de
uma ou maIs classes (classe paI).
D objeto fIlho herda do objeto paI a cor
azul e do objeto me cabelo lIso.
nstncIa
de classe
D mesmo que objeto, que uma ocorrncIa
especifIca de uma determInada classe.
D objeto ser humano uma InstncIa da
classe mamiferos.
|ensagem CapacIdade de comunIcao dIrecIonal
entre objetos no sentIdo de Invocar certa
operao.
nformar o atrIbuto do objeto ser humano
que possua o atrIbuto nome x.
|todo a caracteristIca que possIbIlIta alterar a
funcIonalIdade de um determInado atrIbuto
de um objeto.
D objeto ser humano possuI como
atrIbuto profIsso a funo vendedor. Ao
ser promovIdo para a funo gerente, ele
muda a funcIonalIdade de seu atrIbuto
profIsso.
164
Dbjeto Fepresentao de um elemento do mundo
real, InstncIa de uma classe, que pode ser
persIstente ou transItorIa.
Ser humano, cavalo, baleIa e golfInho do
uma InstncIa da classe mamiferos.
Dcultamento
de Informaes
CapacIdade de restrIngIr o acesso externo
dos atrIbutos de um determInado objeto.
D objeto ser humano possuI os atrIbutos
de profIsso e escolarIdade
desconhecIdos.
Dperaes LogIca de operao contIda em uma
determInada classe com o objetIvo
desIgnarlhe um determInado
comportamento.
Efetuar clculo da Idade de um IndIviduo,
a parIr do atrIbuto data de nascImento de
um objeto ser humano pertencente
classe mamiferos.
PolImorfIsmo CapacIdade de InteragIr atrIbutos de um
objeto sem a necessIdade de conhecer seu
tIpo. CapacIdade que um objeto possuI de
mudar sua forma para outra forma.
D objeto ser humano assume dIferentes
fases de desenvolvImento ao longo de sua
vIda: InfantIl, pradolescente,
adolescente, adulto e ancIo.










165
Java e o modelo de objetos

ara construir estruturas de extrema complexidade a natureza criou clulas, tecidos, rgos,
sistemas e organismos. Em uma maior escala estes organismos interagem com outros
organismos criando populaes e ecologias. A compartimentalizao e gerncia de
complexidade obtida atravs da modularizao dos sistemas biolgicos (clulas, tecidos, rgos,
organismos, etc) torna possvel o elevado grau de equilbrio presente na infinidade de sistemas
biolgicos formados por milhares de indivduos.
De forma similar e em menor escala o software um artefato extremamente complexo. So
necessrios diversos nveis de organizao para que qualquer software no trivial possa funcionar
adequadamente. Estas tcnicas de organizao de software so resultados de 50 anos de evoluo
da computao. Se comparada com os organismos vivos, poderamos dizer que a Engenharia de
Software ainda est no Pr-Cambriano.
O modelo de objetos uma metfora de desenvolvimento de software baseada na construo
de elementos computacionais que mimetizam objetos do mundo real.
As diversas realizaes do modelo de objetos, presentes nas dezenas de mtodos e
metodologias orientadas a objeto que so difundidas nos ambientes de programao so resultado
da contribuio de muitas pessoas durante diversos anos.
Tudo comeou com o Modelo Computacional de Von Neumann.
O modelo de Von Neumann, datado dos anos 40, ainda amplamente utilizado para mostrar
conceitos de programao de computador.













Os principais pontos a destacar no modelo so:

digo e dados compartilham a memria de uma forma homognea.

nstrues podem ser vistas como dados e vice-versa.

o existe a noo clara de tipo de dados.

o se falava em Engenharia de Software.


Muitos anos depois, a grande quantidade de erros cometidos durante o planejamento e
codificao dos programas, que comeavam a crescer de tamanho, provocou o surgimento de vrias
propostas de organizao de gerncia e desenvolvimento de software. A nvel de programao o
movimento de maior sucesso foi a programao estruturada.








P

CDIGO

DADOS
MEMRIA UNIDADE CONTROLE
PROCESSADOR
166
Programao Estruturada

Grandes disparidades de custos, prazos e qualidade com relao ao planejamento e
implementao de software nos anos 60 e 70 causaram a adoo do termo Engenharia de
Software.
A Programao Estruturada foi a primeira resposta bem sucedidad Engenharia de Software
no escopo de programao. Embora hoje parea simplista a aplicao dos conceitos de
SEQNCIA, DESVIO E LAO, representou um grande avano para a organizao da programao
em pequena escala.










SEQNCIA DESVIO LAO


A programao estruturada:

mps ordem ao cdigo espaghetti, reinante na poca, facilmente criado em
programas escritos em COBOL e FORTRAN, que no tinham mecanismos de
estruturao (modularizao) bem definidos.

o enfatiza a estruturao dos dados.


Depois de solucionado o problema do cdigo espaghetti percebeu-se que o cdigo a parte
de um programa mais sujeita a variaes. Comeo-se a avaliar quais eram os elementos que sofriam
maior variao quando da mudana dos requisitos do software.
Software um artefato bastante flexvel, e por isto mesmo sujeito a constante modificaes.
Todo software soluo para um problema especfico, e sua realizao se d pela construo de
trechos de cdigo e estruturas de dados. A figura abaixo d uma idia geral do impacto causado no
cdigo e nos dados de um programa, quando se modificam os requisitos de um sistema em geral.



Percebeu-se que pequenas variaes nos requisitos do sistema implicam em grandes
variaes no cdigo, enquanto que esta variao de requisitos produz menos impacto nos dados
deste mesmo programa.
A Programao Estruturada uma metodologia baseada principalmente na estruturao do
cdigo. Por ser baseada na parte mais sujeita a variaes. A programao estruturada no confere
alto grau de estabilidade ao software. Esta concluso levou criao de metodologias de
PEUISITDS PEUISITDS
CD0ICD
0A0DS
167
desenvolvimento de programas baseadas na modelagem dos dados. O mais bem sucedido foi o
Modelo Entidade-Relacionamento.
O Modelo Entidade-Relacionamento foi proposto por Peter Chen, em 1970. uma notao
para descrio e desenvolvimento de sistema de informao baseada na modelagem sem6antica de
dados. Obteve grande sucesso principalmente junto comunidade de desenvolvedores de bases de
dados.
A figura abaixo mostra parte de um pequeno modelo de um sistema de controle bancrio,
descrito utilizando-se o MER.


O Modelo E-R, principalmente na sua forma estendida (chamada de Modelo E-R Estendido).
Que permite modelar herana, entre outras coisas, um dos precursores mais prximos do modelo
de objetos, sob o ponto de vista de ferramenta para modelagem de sistemas.

A evoluo das tcnicas de programao foi acompanhada, em paralelo, pelo
desenvolvimento de novas linguagens e estruturas sintticas/semnticas que facilitam a
representao destes conceitos no cdigo. Examinaremos como se deu esta evoluo das
linguagens de programao.
A evoluo dos conceitos e modelos de programao teve efeito direto na re-estruturao das
linguagens de programao. Isto se reflete basicamente na distribuio topolgica dos dados e
cdigos na memria do computador. A figura abaixo mostra como se deu a evoluo desta
estruturao na vrias geraes de linguagem de programao no tempo.





















BANCO
CLIENTE CONTA
ATENDE
GERENCIA
MOVIMENTA
1/2 GERAO DE LINGUAGENS
SUBPROGRAMAS
DADOS
168














Mdulos










2/3 GERAO DE LINGUAGENS
FINAL DA 3 GERAO DE
LINGUAGENS
PEQUENAS/MDIAS APLICAES
ORIENTADAS A OBJETO
CD0ICD
0A0DS
169


Pode-se perceber que a tendncia evolutiva das linguagens tem sido aglutinar cdigo ao
redor de pequenas regies de dados na memria dos computadores. Este o princpio bsico de
implementao das linguagens orientadas a objetos.

Os principais elementos da estruturao topolgica das linguagens orientadas a objetos
refletem um pequeno conjunto de definies, as quais formam o ncleo do modelo de Objetos.


GRANDES APLICAES
ORIENTADAS A OBJETO
170
O Modelo de Objetos

Originalmente concebido para construir aplicaes de simulao utilizando a linguagem
Simula (1967), o Modelo de Objetos representa o mais destacado avano da tecnologia de
programao e desenvolvimento de software da atualidade. Hoje, o modelo no o nico e existem
efetivamente milhares de pessoas trabalhando no seu uso e aperfeioamento. So muitos, e algumas
vezes, mal-interpretados, os conceitos e terminologias adotadas nas diversas variaes do modelo.
Felizmente possvel comear a utilizar o modelo de objetos com um pequeno subconjunto
destes elementos. Estes elementos sero apresentados juntamente com os comandos e expresses
de Java que os representam. Eles so:
Objetos, mtodos e variveis
Agregao e mensagens
Classes e Instncias
Herana
Sobrecarga de operadores e Polimorfismo


Objetos, mtodos e variveis

Um OBJETO um pacote de software contendo dados e procedimentos (cdigo)
relacionados. Os procedimentos so chamados MTODOS. Os dados dos objetos so chamados
VARIVEIS ou COMPONENTES DO ESTADO.


Posteriormente veremos que em Java a interface de um objeto o conjunto dos seus
mtodos e dados que so declarados public e/ou protected. Quando a declarao de mtodos e/ou
variveis de um objeto for precedida pela clusula private nenhum outro objeto, alm do seu "dono",
tem acesso a estes componentes.












Agregao

As variveis de um objeto so tambm objetos. Deste modo, o estado de um objeto
formado por outros objetos. Objetos podem ser simples, como por exemplo uma String, ou
complexos, por exemplo um Banco. A idia de que o estado de um objeto composto por outros
objetos bastante utilizada no mundo real e chamada (no modelo de objetos) de AGREGAO.



Dbjeto
htodos
varIveIs
CIIente
171





























Mensagens

Objetos recebem mensagens de outros objetos atravs de sua interface. Quando um objeto x
invoca um mtodo sobre um outro objeto y, dizemos que ocorre o envio de uma mensagem, de x
para y. Uma mensagem composta pelo nome do mtodo invocado sobre o objeto, do objeto que
receber a mensagem, e de um conjunto opcional de parmetros. Na figura abaixo tempos uma
representao de um objeto cliente enviando uma mensagem para um objeto conta bancria. O nome
da mensagem debite, e tem dois parmetros: R$ 100 e 7/5/95.






Em Java este envio de mensagem poderia corresponder ao trecho de cdigo abaixo.
class Cliente {
...
public void envieMensagem() {
Nome, cpf,
contas
Conta
bancrIa
SaIdo ant., saIdo
atuaI, transaes
Conta
bancrIa
SaIdo ant., saIdo
atuaI, transaes
0ata,
vaIor
Transao
0ata,
vaIor
Transao
0ata,
vaIor
Transao
0ata,
vaIor
Transao
0ata,
vaIor
Transao
CIIente
Conta
ancrIa
0ebIte(P$ 100, 7l5l5)
0ebIte
172
...
contaBancaria.debite(100, new Date(5, 7, 1996));
...
}
...
}
Classes e instncias

Para tratar da criao e atualizao de vrias ocorrncias de um mesmo tipo objeto se faz til
a noo de CLASSE de objetos. Classes so "moldes" que definem os mtodos e as variveis a
serem includas em um tipo particular de objeto. A classe responsvel pela criao dos objetos.
Podemos estabelecer uma analogia de processos com objetos e programas com classes. Uma classe
um "molde" a partir do qual criamos objetos, do mesmo modo que podemos ver vrias ocorrncias
de um mesmo tipo de processo criadas a partir de um nico programa. Os objetos que pertencem a
uma classe so chamados de INSTNCIAS desta classe e contm valores particulares para as suas
variveis. As variveis de um objeto so chamadas, la Smalltalk, de VARIVEIS DE INSTNCIA.
Abaixo temos esqueletos de cdigo em Java que definem as classes: Cliente, ContaBancaria e
Transacao, as quais servem para criar os objetos representados na figura anterior.

class Cliente {
public String nome;
public int cpf;
private ContaBancaria[] contas;
...
}

class ContaBancaria {
private int saldoAnterior;
private int saldoAtual;
Transacao[] transacoes;
...
}

class Transacao {
public int valor;
public Date data;
...
}



Herana

Herana um mecanismo atravs do qual uma classe de objetos pode ser definida como
caso especial de uma classe mais geral. Casos especiais de uma classe so chamados de
SUBCLASSES. A classe mais geral chamada de SUPERCLASSE. Refinando nossa aplicao de
Controle Bancrio, poderemos definir tipos mais especficos de contas bancrias: conta corrente e
conta de poupana.





SaIdo ant., saIdo
atuaI, transaes
Conta
bancrIa
herana
herana
173








Abaixo temos esqueletos de cdigo em Java que descrevem como se faz essa estenso de
classes.
class ContaCorrente extends ContaBancaria {
...
}

class Poupanca extends ContaBancaria {
}
O fato das classes ContaCorrente e Poupanca herdarem de ContaBancaria implica em dizer
que TODOS os componentes no privados (isto , todas as variveis e mtodos que no so
precedidos pela clusula private na sua declarao) definidos na classe ContaBancaria esto
automaticamente definidos para as classes ContaCorrente e Poupanca.


Sobrecarga de Operadores e Polimorfismo

Polimorfismo uma tcnica sofisticada de construo de programas, que permite que objetos
sejam tratados de forma homognea e segura, simplificando a construo de cdigo. Sobrecarga
bastante similar a polimorfismo, embora mais simples de compreender. Vejamos o exemplo que se
segue. Suponha novamente o Controle de Contas Bancrias. Refinando mais ainda nossa aplicao
definamos dois tipos especiais de transaco: transao de dbito e transao de crdito. Em ambos
os tipos de transao, inclusive na superclasse Transacao, est definido o mtodo processe(int).
processe recebe como parmetro um inteiro e devolve outro valor inteiro, correspondendo ao valor
que recebeu, adicionado ou subtraido do valor da transao, conforme seja seu tipo (trasao de
dbito ou de crdito). Os esqueletos de cdigo abaixo mostram trechos da implementao do mtodo
nas duas subclasses (mostramos tambm pedaos da declarao da classe transao, onde temos
declarada a varivel valor.

abstract class Transacao {
int valor;
...
public abstract int processe(int valorAnterior);
}

class TransacaoCredito extends Transacao {
...
public int processe(int valorAnterior) {
return valorAnterior + valor;
}
}
Conta
corrente
Poupana
Conta
EspecIaI
Juros acumuIados,
taxa juros
LImIte,
taxa juros
herana
174

class TransacaoDebito extends Transacao {
...
public int processe(int valorAnterior) {
return valorAnterior - valor;
}
}
A sobrecarga de operadores pode ser observada na implementao do mtodo atualizeSaldo,
presente na classe ContaBancria. A computao do novo saldo atual da conta obtida somando-se
ou subtraindo-se do saldo anterior os valores das transacoes recebidas, conforme sejam de crdito
ou dbito, respectivamente.
Como cada subclasse de transao tem uma implementao distinta para o mtodo
processe, a implementao do mtodo atualizeSaldo pode ser mais simples. Observe o trecho de
cdigo abaixo:
class ContaBancaria {
private int saldoAnterior;
private int saldoAtual;
Transacao[] transacoes;
...
public void atualizeSaldo() {
int saldoCorrente = saldoAnterior;
for (int i = 0; i < transacoes.length; i++) {
saldoCorrente = transacoes[i].processe(saldoCorrente);
}
saldoAtual = saldoCorrente;
}
...
}
Embora possa parecer primeira vista que a sobrecarga complicou a compreenso do
cdigo, o uso rotineiro e organizado da sobrecarga e do polimorfismo um dos maiores
investimentos na reduo de tamanho dos programas orientados a objetos.
O conceito de polimorfismo ligeiramente mais sofisticado que sobrecarga e ser esclarecido
mais adiante.
175

Introduo s classes

lasse a construo lgica que define o formato e a natureza de um objeto e, por isso a
linguagem Java definida sobre esta construo. Qualquer implementao feita tem que estar
encapsulada em uma classe.
Uma classe define um novo tipo de dados. Uma vez definida, a classe pode ser utilizada para
criar objetos do novo tipo de dados. Assim, uma classe pode ser vista como sendo um modelo para
objetos e um objeto como sendo uma instncia de uma classe.

Definio de uma Classe em Java

Ao definir uma classe declarada sua natureza e sua forma. Isto feito especificando os
dados e o cdigo que manipula estes dados. O cdigo de uma classe define a interface para os seus
dados.
A declarao de uma classe em Java utiliza a palavra-chave class. O formato geral para se
definir uma classe
class nome_da_classe {
tipo varivel_de_instncia1;
tipo varivel_de_instancia2;
.
.
.
tipo varivel_de_instnciaN;

tipo nome_do_metodo1 (lista de parmetros){
//corpo_do_mtodo
}
tipo nome_do_metodo2 (lista de parmetros){
//corpo_do_mtodo
}
.
.
.
tipo nome_do_metodoN (lista de parmetros){
//corpo_do_mtodo
}
}
Os dados ou variveis definidas dentro de uma classe so chamadas de variveis de
instncia. O cdigo de uma classe fica encapsulado cm mtodos. Os mtodos e variveis definidas
em uma classe so chamados de membros da classe. Na maioria das vezes, as variveis de
instncias so acessadas e manipuladas atravs de mtodos. Desta maneira, so os mtodos que
definem como os dados sero utilizados.

Criando a Classe Caixa
Neste primeiro exemplo, ser definida uma classe para representar uma caixa. A classe
Caixa define trs variveis de instncia: largura, altura e profundidade. Neste ponto ainda no ser
definido nenhum mtodo para a classe Caixa.

class Caixa{
double largura;
double altura;
double profundidade;
}

Agora novos objetos do tipo Caixa podem ser criados a partir desta definio. A simples
declarao de um objeto no o suficiente para que este seja criado e possa ser acessado. Para
C
176
criar um objeto necessrio que seja utilizado o operador new e o construtor da classe que aloca a
memria necessria para o objeto. Portanto a criao de um objeto deve ser feitai da seguinte forma:

Caixa minhaCaixa; // cria apenas uma referencia para o objeto
minhaCaixa = new Caixa(); // cria efetivamente o objeto

Para acessar uma varivel de instncia de uma classe basta utilizar o operador ponto(.) entre
o nome do objeto e a varivel de instncia desejada. A seguir mostrado um exemplo completo de
um programa que utiliza a classe Caixa definida:

/* exemplo de um programa que usa a classe Caixa
salve em um arquivo chamada CaixaDemo.java */

class Caixa {
double largura;
double altura;
double profundidade;
}

// esta classe utiliza um objeto da classe Caixa
class CaixaDemo {
public static void main(String args[]) {
Caixa minhaCaixa;
double volume;

// cria o objeto minhaCaixa
minhaCaixa = new Caixa();

//atribui valores as variveis de instncia minhaCaixa.largura
= 12;
minhaCaixa.altura = 15;
minhaCaixa.profundidade = 23;

// calcula o volume de minhaCaixa
volume = minhaCaixa.largura * minhaCaixa.altura *
minhaCaixa.profundidade;

System.out.println("0 volume e " + volume);
}
}

O arquivo que contm este programa dever ser salvo com o nome de CaixaDemo.Java,
pois a classe que contm o mtodo main() a classe chamada CaixaDemo.
Ao compilar sero gerados os arquivos Caixa.class e CaixaDemo.class. Para compilar o
exemplo, digite:
javac CaixaDemo.java
Para executar o programa necessrio chamar o interpretador Java da seguinte
java CaixaDemo

A sada do programa ser
O volume e 4140.0

Introduo aos mtodos
Conforme mencionado anteriormente, as classes consistem basicamente de variveis de
instncia e de mtodos. Os mtodos necessitam uma maior ateno pois em Java eles possuem
bastante flexibilidade e podem ser complexos. O formato geral de um mtodo :

tipo nome_do_metodo(lista_de_parmetros) {
177
//corpo_do_mtodo
}

O tipo de dados retornado pelo mtodo especificado por tipo. Este pode ser qualquer tipo
incluindo classes criadas pelo programador. Caso o mtodo no retorne nenhum valor, necessrio
explicitar esta condio utilizando o tipo void. O nome do mtodo especificado por
nome_do_mtodo. A lista de parmetros especificada por lista_de_parametros formada por pares
de "tipo" e "identificador" separados por vrgula. Caso no haja parmetros, a lista de parmetros
deve ficar vazia.
Caso o tipo de retorno do mtodo seja diferente de void necessrio que seja utilizado o
operador return para retornar um valor para a rotina que chamou o mtodo. Isto feito da seguinte
forma:

return valor;

Onde valor define o valor a ser retornado pelo mtodo.


Incluindo um Mtodo na Classe Caixa

Embora possa ser definido uma classe apenas com dados, normalmente isto no ocorre. Na
maioria das vezes desejvel que sejam definidos os mtodos que manipulam ou acessam os
dados. Isto permite que o implementador esconda as estruturas de dados e suas manipulaes atrs
das abstraes dos mtodos. Um mtodo tambm acessado utilizando um ponto separando o
nome do objeto do nome do mtodo.
No exemplo anterior, o volume da caixa foi calculado pela classe chamada CaixaDemo.
Entretanto, como o volume de uma caixa depende somente de suas dimenses, faz mais sentido que
este clculo seja feito pela prpria classe Caixa. No exemplo abaixo definido um mtodo para
calcular o volume da caixa:

/* exemplo inclui um mtodo para o calculo do volume
dentro da classe Caixa.
salve em um arquivo chamada CaixaDemo2.java */

class Caixa {
double largura;
double altura;
double profundidade;

// calcula e exibe o volume do Caixa
void volume() {
double volume;
volume = largura * altura * profundidade;
System.out.println(0 volume e " + volume);
}

// esta classe utiliza um objeto da classe Caixa
class CaixaDemo2 {
public static void main(String args[]) {
Caixa minhaCaixa;

// cria o objeto minhaCaixa
minhaCaixa = new Caixa();

// atribui valores as variveis de instncia
minhaCaixa.largura = 12;
minhaCaixa.altura = 15;
minhaCaixa.profundidade = 23;

//calcula o volume de minhaCaixa
minhaCaixa.volume();
}
}
178

A sada deste programa exatamente igual do programa anterior.

Retornando um Valor

Suponha agora que em uma parte do programa deseja-se calcular o valor do volume sem
imprimi-lo. Neste caso, embora o volume tenha sido calculado dentro da classe Caixa, a melhor
maneira seria que o mtodo retornasse o valor do clculo ao invs de simplemente imprimi-lo. O
prximo exemplo, o mtodo volume() retorna o valor do clculo feito ao invs de imprim-lo.

/* exemplo inclui um mtodo para o calculo do volume
dentro da classe Caixa.
salve em um arquivo chamada CaixaDemo3.java */

class Caixa {
double largura;
double altura;
double profundidade;

// calcula o volume do Caixa
double volume(){
double volume;
volume = largura * altura * profundidade;
return volume;
}
}
//esta classe utiliza um objeto da classe Caixa
class CaixaDemo3 {
public static void main(String args[]) {
Caixa minhaCaixa;
double volume;

//cria o objeto minhaCaixa
minhaCaixa = new Caixa();
//atribui valores as variveis de instncia
minhaCaixa.largura = 12;
minhaCaixa.altura = 15;
ninhaCaixa.profundidade = 23;

//calcula o volume de minhaCaixa
volume = minhaCaixa.volume();

//imprime o volume na tela
System.out.println(0 volume e " + volume);
}
}


Incluindo um Mtodo com Parmetros Classe Caixa

A maioria dos mtodos necessita que sejam passados alguns parmetros. Nos exemplos
anteriores as variveis de instncia largura, altura e profundidade foram acessadas diretamente.
Contudo, em um programa orientado a objetos bem projetado, as variveis de instncia somente
devem ser acossadas por intermdio de mtodos. Isto previne que as variveis sejam manipuladas
de maneira incorreta. O exemplo abaixo apresenta uma melhor implementao da classe Caixa,
utilizando o mtodo defineDimensoes para atribuir os valores das dimenses da caixa:

/* exemplo inclui um mtodo para o calculo do volume dentro da classe Caixa.
salve em um arquivo chamada CaixaDemo4.java */

class Caixa {
double largura;
double altura;
double profundidade;

// calcula o volume da caixa
179
double volume() {
double volume;
volume = largura * altura * profundidade;
return volume;
}

// define as dimenses da caixa
void defineDimensoes(double l, double a, double p){
largura = l;
altura = a;
profundidade = p;
}
}

// esta classe utiliza um objeto da classe Caixa
class CaixaDemo4 {
public static void main(String args[]) {
Caixa minhaCaixa;
double volume;

// cria o objeto minhaCaixa
minhaCaixa = new Caixa();

//atribui valores as variveis de instncia
minhaCaixa.defineDimensoes(12, 15, 23);

//calcula o volume de minhaCaixa
volume = minhaCaixa.volume();

//imprime o volume na tela
System.out.println("0 volume e " + volume);
}
}

Construtores

O construtor responsvel por iniciar o objeto imediatamente aps a sua criao. Uma vez
definido o construtor, ele chamado automaticamente aps a criao do objeto antes que o operador
new termine de executar. O construtor um mtodo especial queno possui nenhum tipo de retorno,
nem mesmo void. Isto ocorre porque o retorno implcito de um construtor o objeto criado. Por
conveno, em Java, o construtor tem sempre o mesmo nome da sua classe. Ainda no exemplo da
classe Caixa, podemos utilizar o construtor para iniciar as dimenses da caixa e, utilizar o mtodo
defineDimensoes para modific-las em tempo de execuo conforme a listagem abaixo:

/* salve em um arquivo chamada CaixaDemo5.java
*/
class Caixa {
double largura;
double altura;
double profundidade;

// definio do construtor
Caixa(double l, double a, double p) {
defineDimensoes(l, a, p);
}

// calcula o volume da caixa
double volume() {
double volume;
volume = largura * altura * profundidade;
return volume;
}

// define as dimenses da caixa
void defineDimensoes(double l, double a, double p) {
largura = l;
altura = a;
180
profundidade = p;
}

// esta classe utiliza um objeto da classe Caixa
class CaixaDemo5 {
public static void main(String args[]) {
Caixa minhaCaixa;
double volume;

// cria o objeto minhaCaixa
minhaCaixa = new Caixa(12, 15, 23);

// calcula o volume de minhaCaixa
volume = minhaCaixa.volume();

//imprime o volume na tela
System.out.println('0 volume e " + volume);

// atribui novos valores as variveis de instncia
minhaCaixa.defineDimensoes(20, 11, 7);

//recalcula o volume de minhaCaixa
volume = minhaCaixa.volume();

//imprime o volume na tela
System.out.println("0 volume e " + volume);
}
}

A sada do programa :

O volume e 4140.0
O volume e 1540.0

Note que neste exemplo o construtor utilizou o mtodo defineDimensoes para iniciar as
variveis de instncia. Os mtodos sempre podem ser utilizados dentro de qualquer outro mtodo da
classe.

Garbage Collection

Conforme observado, os objetos so alocados dinamicamente atravs do operador new.
Programadores C++, utilizam o operador delete para liberar a memria alocada por um objeto para
que possa ser realocada posteriormente. Em Java, no necessrio que os programadores liberem
a memria alocada por um objeto. Este processo feito de forma transparente e automtica pela
JVM e, recebe o nome de Garbage Collection. Em Java, quando no houver nenhuma referncia a
um objeto, a memria alocada para ele pode ser liberada e realocada. O processo de Garbage
Collection ocorre de forma espordica (ou nunca, caso no haja necessidade) durante a execuo de
um programa.

O Mtodo finalize{)

Algumas vezes um objeto precisa executar alguma ao antes de ser destrudo. Por exemplo,
se um objeto estiver trabalhando com algum recurso no-Java como um arquivo, o programador deve
assegurar-se de liber-lo antes de que o objeto seja destrudo.
Para estas situaes especficas, Java oferece um mecanismo chamado de finalizao.
Assim, o programador pode especificar aes que ocorrero quando o objeto liberado pelo sistema
de Garbage Collection. Um mtodo finalizador de uma classe deve ser definido da seguinte maneira:
protected void finalize() {
// cdigo_de_finalizao
181
}

A palavra-chave protected previne que o mtodo finalize() tenha seu cdigo definido fora da
classe. Este e outros especificadores de acesso sero melhor comentados posteriormente.

Mais Detalhes Sobre Classes e Mtodos

Este captulo apresenta mais detalhes relacionados com as classes e mtodos incluindo
sobrecarga de mtodos, controle de acesso e as palavras-chaves static e final.

Sobrecarga de Mtodos

Em Java uma classe pode ter mais de um mtodo com o mesmo nome e implementaes
diferentes desde que as listas de parmetros sejam diferentes. Quando isto ocorri ocorreu uma
sobrecarga de mtodos. Sobrecarga de mtodos uma das maneiras que Java implementa o
polimorfismo. A seguir mostrado um exemplo de sobrecarga de mtodos:

// demonstrao de sobrecarga de mtodos
class SobrecargaDemo {

void teste() {
System.out.println("Teste sem parmetros");
}

// sobrecarga com l parmetro inteiro
void teste(int a){
System.out.println("a - " + a);
}

// sobrecarga com 2 parmetros inteiros
void teste(int a, int b){
System.out.println("a = " + a + " e b - " + b);
}

// sobrecarga com l parmetro e retorno doubl
double teste(double a) {
System.out.println("Double a - " + a);
return a*a/2;
}
}

class Sobrecarga {
public static void main(String args[]) {
SobrecargaDemo sd = new SobrecargaDemo();
double resultado;
// chama as diferentes verses de teste()
sd.teste();
sd.teste(5);
sd.teste(2,7);
resultado = sd.teste(12.37);
System.out.println("Resultado de sd.teste(12.37) = + resultado);
}
}

A sada do programa
Teste sem parmetros
a = 5
a = 2 e b = 7
Double a = 12.37
Resultado de sd.teste(12.37) = 76.50845
182

Sobrecarga de Construtores

Alm de sobrecarregar os mtodos comuns, os construtores tambm podem ser
sobrecarregados oferecendo diferentes formas de se iniciar um objeto. Voltando para o ltimo
exemplo da caixa, agora o seu construtor ser sobrecarregado conforme o exemplo abaixo:

class Caixa {
double largura;
double altura;
double profundidade;

// definio do construtor
Caixa(double l, double a, double p) {
defineDimensoes(l, a, p);
}

// sobrecarga do construtor sem parmetros
Caixa() {
defineDimensoes(0, O, 0);
}

// sobrecarga do construtor quando todas
// as dimenses da caixa so iguais
Caixa(double l) {
DefineDimensoes(l, l, l);
}

// calcula o volume da caixa
double volume() { double volume;
volume = largura * altura * profundidade;
return volume;
}

// define as dimenses da caixa
void defineDimensoes(double l, double a, double p) {
largura = l;
altura = a;
profundidade = p;
}

// esta classe utiliza um objeto da classe Caixa
class CaixaSobrecarga {
public static void main(String args[]) {
Caixa caixa1 = new Caixa();
Caixa caixa2 = new Caixa(13);
Caixa caixa3 = new Caixa(5,10, 31);
double volume;

// calcula e imprime o volume da caixa1 na tela
volume = caixa1.volume();
System.out.println(0 volume da caixa1 e " + volume);

// calcula e imprime o volume da caixa2 na tela
volume = caixa2.volume();
System.out.println("0 volume da caixa2 e " + volume);

// calcula e imprime o volume da caixa3 na tela
volume = caixa3.volume();
System.out.println("0 volume da caixa3 e " + volume);
}
}



A sada do programa
183

O volume da caixa1 e 0.0
O volume da caixa2 e 2197.0
O volume da caixa3 e 1550.0


A Palavra-Chave static

Normalmente, um membro de uma classe (mtodo ou varivel de instncia) somente pode
ser acessado atravs de um objeto da classe. Entretanto, possvel a definio de um membro uma
classe que pode ser acessado diretamente antes que qualquer objeto da classe seja criado e sem
referenciar qualquer objeto. Para definir um membro com esta caracterstica basta usar a palavra-
chave static em sua declarao. O exemplo mais comum do uso do static o mtodo main. O
mtodo main declarado como static porque necessrio chama-lo antes mesmo de qualquer
objeto ser criado.
Variveis de instncia declaradas como static so, essencialmente, variveis globais.
Quando objetos de sua classe so declarados nenhuma cpia da varivel static feita. Na realidade,
todas as instncias da classe compartilham a mesma varivel static.


A Palavra-Chave final

Para evitar que uma varivel seja modificada a palavra-chave final pode ser utilizada. Isto
significa que necessrio iniciar uma varivel final em sua declarao. Uma varivel do tipo final
pode ser considerada como uma constante em C/C++ declarada como const. Por exemplo:

final int ARQ_NOVO = 1;
final int ARQ_SALVAR = 2;
final int ARQ_FECHAR = 3;
final int ARQ_APAGAR = 4;

A partir deste ponto as outras partes do programa podem utilizar ARQ_NOVO,
ARQ_SALVAR, ARQ_FECHAR e ARQ_APAGAR como constantes sem se preocupar se os seus
valores vo ser alterados.
Herana

A herana um dos conceitos fundamentais da programao orientao a objetos pois
permite uma classificao hierrquica. O programador pode definir uma classe contendo
caractersticas comuns a um conjunto de items relacionados. Esta classe pode ento ser herdada por
outras classes mais especficas, cada uma delas acrescentando novas caractersticas nicas.

Fundamentos de Herana

Para se herdar uma classe necessrio simplesmente incorporar a definio de uma classe
dentro de outra atravs da palavra-chave extends. O formato geral de declarao de uma subclasse
que herda uma superclasse :

class nome_da_subclasse extends nome_da_superclasse {
//corpo_da_classe
}

Em Java somente herana simples suportada, ou seja, uma subclasse s ser herdada de
uma nica superclasse. Em outras linguagens como C++ possvel ter uma subclasse herdada de
mais de uma superclasse (a este tipo de herana d-se o nome de herana mltipla):

184
Exemplo de Herana

Para ilustrar o conceito de herana, considere o exemplo da Caixa dado anteriormente, uma
nova classe ser criada herdando as propriedades de Caixa e acrescentando um novo componente
chamado de peso. Assim a nova classe (exemplo abaixo) possui largura, altura, profundidade e peso.

class Caixa {
double largura;
double altura;
double profundidade;

// definio do construtor
Caixa(double l, double a, double p) {
DefineDimensoes(l, a, p);
}

// sobrecarga do construtor sem parmetros
Caixa () {
defineDimensoes(0, O, 0);
}

// sobrecarga do construtor quando todas
// as dimenses da caixa so iguais
Caixa(double l) {
DefineDimensoes(l, l, l);

}

// calcula o volume da caixa
double volume() {
double volume;
volume = largura * altura * profundidade;
return volume;
}

// define as dimenses da caixa
void defineDimensoes(double l, double a, double p) {
largura = l;
altura = a;
profundidade = p;
}

// esta classe utiliza um objeto da classe Caixa
class CaixaPeso extends Caixa {
double peso;

// construtor da classe
CaixaPeso(double lar, double alt, double pro, double pes) {
defineDimensoes(lar, alt, pro);
peso = pes;
}
}

class CaixaPesoDemo {
public static void main(String args[]) {
CaixaPeso.caixal = new CaixaPeso(5,10, 31, 22.5);
CaixaPeso.caixa2 = new CaixaPeso(3,12, 15, 6.64);
System.out.println("0 volume da caixa1 e " +
caixa1.volume());
System.out.println("O peso da caixa1 e " + caixa1.peso);

System.out.println("0 volume da caixa2 e " +
caixa2.volume()); System.out.println("O peso da caixa2 e
" + caixa2.peso);
}
}

185
A sada do programa
O volume da caixa1 e 1550.0 O peso da caixa1 e 22.5
O volume da caixa2 e 540.0 O peso da caixa2 e 6.64


Sobreposio de Mtodos

Ao utilizar a herana, quando um mtodo da subclasse possui um nome igual a um da
superclasse, diz-se que o mtodo da subclasse sobrepe o mtodo da superclasse. Quando um
mtodo sobreposto chamado, ser sempre utilizada a verso do mtodo definido na subclasse. A
verso do mtodo da superclasse ser escondida.
A sobreposio de mtodos permite que Java suporte polimorfismo em tempo de execuo.
O polimorfismo essencial em programao orientada a objetos por uma razo: permite que
uma classe geral especifique mtodos que sero comuns a todos os seus descendentes, permitindo
que as subclasses definam uma implementao especfica de alguns ou todos os mtodos da
superclasse.


Aplicando a Sobreposio de Mtodos

Neste exemplo, ser criada uma superclasse Figura2D que modela vrias figuras
bidimensionais. Esta classe define um mtodo rea() que calcula a rea de um ob exemplo apresenta
duas subclasses: Retngulo e Tringulo. Cada uma das subclasses sobrepe o mtodo rea() de
forma a retornar o valor correto.

class Figura2D {
double base;
double altura;

Figura2D(double b, double a) {
base = b;
altura = a;
}

double area() {
System.out.println("A rea para Figura2D e indefinida.");
return 0;
}
}

class Retangulo extends Figura2D {
Retangulo(double b, double a) {
super (b, a); // invoca o construtor da superdasse
}

double area(){
System.out.println("Calculando rea do retangulo.");
Return base* altura;
}
}

class Triangulo extends Figura2D {
Triangulo(double b, double a) {
super (b, a); // invoca o construtor da superdasse
}

double area() {
System.out.println("Calculando rea do tringulo.");
return base * altura / 2;
}
}

class CalculoArea {
public static void main(String args[]) {
186
Figura2D f = new Figura2D(5, 4);
Retangulo r = new Retangulo(2, 6);
Triangulo t = new Triangulo(3, 9);

System.out.println("Area e " + f.area());
System.out.println("Area e " + r.are());
System.out.println ("Area e " -r i.area());
}
}
A sada do programa
A rea para Figura2D e indefinida.
rea e 0.0
Calculando rea do retngulo.
rea e 12.0
Calculando rea do tringulo
rea e 13.5

Neste exemplo tambm foi utilizado a palavra super para chamar o construtor da
superclasse. Isto equivalente utilizao da palavra-chave inherited em Delphi.

Classes Abstratas

Em alguns casos, deseja-se definir uma classe que declara a estrutura geral de um conjunto
de objetos sem prover uma implementao de todos os mtodos. Os mtodos no implementados
so chamados de mtodos abstratos e as classes que possuem este tipo de mtodo so chamadas
de classes abstratas. Para criar um mtodo abstrato (sem implementao) a superclasse deve
declar-lo com a palavra-chave abstract. Obrigatoriamente, a classe que possui um mtodo abstrato
deve tambm ser declarada com a palavra-chave abstract. Assim, o formato geral de uma classe
abstrata :

abstract class nome_da_classe {
// corpo_da_classe
.
.
.
abstract tipo nome_do_mtodo_abstrato(lista_de_parmetros) {
// corpo_do_mtodo
}
.
.
.
// corpo_da_classe
}
No exemplo anterior, a classe Figura2D possua o mtodo area() indefinido que era
implementado em suas subclasses Retangulo e Tringulo. Uma alternativa implementao anterior
seria a definio de Figura2D como uma classe abstrata cujo mtodo area() seria abstrato. Esta
alternativa implementada abaixo:

abstract class Figura2D {
double base;
double altura;
Figura2D(double b, double a) {
base = b;
altura = a;
}
abstract double area();
}

class Retangulo extends Figura2D {
187
Retangulo(double b, double a) {
super(b,a); // invoca o construtor da superciasse
}

double area() {
System.out.printIn("Calculando rea do retangulo.");
return base * altura;
}

class Triangulo extends Figura2D {
Triangulo(double b, double a) {
super(b,a); // invoca o construtor da superclasse
}
i
double area(){
System.out.println("Calculando rea do tringulo.);
return base * altura / 2;
}
}

class CalculoArea2 {
public static void main(String args[]) {
Figura2D r = new Retangulo(2, 6);
Figura2D t = new Tringulo(3, 9);

System.out.println("Area e " + r.area());
System.out .println("Area e " +
t.area());
}
}

Note que se neste caso no possvel criar um objeto da classe Figura2D e utilizar o mtodo
area() pois isto geraria um erro de compilao j que este mtodo no est definido para a classe
Figura2D.

Pacotes e Interfaces

Pacotes

Nos exemplos anteriores o nome de cada classe exemplo foi obtido do mesmo espao de
nomes. Isto significa que cada classe tinha que ter um nome nico para evitar conflito de nomes. Java
permite que o espao de nomes seja dividido em blocos menores. Este mecanismo recebe o nome
de pacote (packages). De forma simples, um pacote pode ser definido como um conjunto de classes
que, dependendo do nvel de acesso, podem ser acessadas somente pelas classes internas do
pacote ou pelas classes de outros pacotes.

Criando um Pacote

Para definir um pacote basta incluir o comando package no inicio do arquivo fonte. Todas as
classes declaradas dentro deste arquivo faro parte do mesmo pacote. O pacote define um espao
de nomes, caso seja omitido, o espao de nomes padro ser utilizado. O formato geral de pacotes :
package nome_do_pacote;

Java utiliza os diretrios do sistema de arquivos para gerenciar os pacotes. Por exemplo, o
arquivo .class de qualquer classe declarada como parte de um pacote MeuPacote tem que estar
dentro de um diretrio chamado MeuPacote. Como Java case sensitive (diferencia letras
minsculas de maisculas), o nome do diretrio deve ser exatamente igual ao nome do pacote.
Pode-se criar uma hierarquia de pacotes. Para isso, basta separar cada pacote por um ponto
(.). O formato geral para pacotes multi-nveis :
package pacote1.[pacote2.[pacote3]];
188
Onde os elementos entre [ e ] so utilizados caso existam. Lembre-se que a hierarquia de
pacotes deve se refletir no sistema de arquivos. Assim, um pacote declarado como
package java.awt.image;
precisa ser armazenado no diretrio java/awt/image, java\awt\image ou java: awt: image em um
sistema de arquivos UNIX, Windows ou Macintosh, respectivamente. necessrio ateno na hora
de escolher o nome de um pacote pois para renome-lo, necessrio alternar o seu nome em todos
os seus arquivos e o nome do diretrio onde o pacote est armazenado.


A Varivel de Ambiente CLASSPATH

As classes Java organizadas em pacotes so mapeadas em diretrios. Contudo,
difererentemente do sistema de arquivos, sempre necessrio especificar todo o pacote e, nunca
parte dele. Por exemplo, o pacote para a classe java.awt.Button sempre especificado como
java.awt.
Suponha que se queira que o interpretador Java execute a aplicao contida na classe
chamada Teste.class no pacote util.meupacote. Se o caminho para este diretrio for
C:\java\MinhasClasses\util\meupacote, necessrio incluir na varivel de ambiente CLASSPATH o
diretrio C:\java\MinhasClasses.
Assim, para executar a aplicao Teste necessrio executar:
java -classpath C:\java\MinhasClasses til.meupacote.Teste
ou
set CLASSPATH="%CLASSPATH%;C:\java\MinhasClasses;.
java util.meupacote.Teste

Quando a aplicao executar, a JVM utiliza a varivel de ambiente CLASSPATH para
encontrar as outras classes definidas no pacote util.meupacote que forem utilizadas pela classe
Teste.
Note que todo o nome do pacote especificado no comando. No possvel, por exemplo,
incluir no CLASSPATH o diretrio C:\java\MinhasClasses\util\meupacote e usar o comando "java
Teste".

Controle de Acesso

Para o controle de acesso de dados ou mtodos membros de uma classe, Java possui 3
modificadores ou especificadores de acesso: private, protected e public. No total, Java 4 nveis de
acesso:
1. Padro - nenhum modificador especificado. Neste nvel, um membro da classe visvel para
qualquer classe e subclasse do pacote.
2. Privado - o modificador private utilizado. Neste nvel, um membro da classe pode ser
acessado somente pelos membros da mesma classe.
3. Protegido - utiliza o modificador protected. Neste nvel, um membro da classe pode ser visto
por subclasses de qualquer pacote e qualquer classe do mesmo pacote
4. Pblico - utiliza o modificador public. Neste nvel, um membro da classe pode ser visto por
qualquer classe ou subclasse de qualquer pacote.

rvate No dejndo rotected ublc
|esma classe

189
rvate No dejndo rotected ublc
Subclasse do mesmo
pacote


Nosubclasse do
mesmo pacote


Subclasse de outro
pacote


No subclasse de
outro pacote



Importando um Pacote

Para utilizar as classes definidas em um pacote necessrio importar todas as classes de um
pacote ou somente as classes desejadas. Para isso necessrio utilizar a palavra import. O import
equivalente ao uses do Object Pascal e ao include do C++.O uso do import deve ser feito
imediatamente aps a definio do pacote (caso exista). O geral para o import :
import pacote1.[pacote2].(nome_da_classe|*);
Onde os elementos entre [ e ] so utilizados caso existam. Caso seja utilizado o nome da
classe, ento somente ser importada aquela classe do pacote. Caso seja utilizado o *, todas as
classes do pacote sero importadas. A seguir mostrado um cdigo que importa a classe Date do
pacote java.util e todas as classes do pacote java.io.
import java.util.Date;
import java.io.*;

Interfaces

Interface um tipo de dados especial que especifica o que uma classe deve fazer mas no
especifica como fazer. As interfaces so muito semelhantes s classes, contudo, so desprovidas de
variveis de instncia e, seus mtodos so declarados sem implementao. Na prtica, isto significa
que podem ser definidas interfaces sem fazer qualquer suposio a respeito de sua implementao.
Uma vez definida uma interface, qualquer classe pode implement-la e uma classe pode implementar
quantas interfaces quiser. As interfaces so utilizadas para que classes no relacionadas possam
implementar mtodos com a mesma interface. O geral de uma interface :

acesso interface nome_da_interface{
tipo nome_da_constante1 = valor;
tipo nome_da_constante2 = valor;
.
.
.
tipo nome_da_constanteN = valor;

tipo nome_do_mtodo1(lista_de_parametros){
//corpo_do_metodo;
}
tipo nome_do_mtodo2(lista_de_parametros){
//corpo_do_metodo;
}
.
.
.
tipo nome_do_mtodoN(lista_de_parametros){
190
//corpo_do_metodo;
}
}

O acesso pode ser public ou default (sem especificador de acesso). Se nenhum
especificador de acesso for utilizado ento a interface pode ser acessada somente pelas classes do
seu pacote. As constantes declaradas dentro da interface tm que ser iniciadas e no podero ser
modificadas por classes que implementam a interface. Abaixo mostrado um exemplo de interface
que especifica um mtodo chamado imprimeMensagem() que tem como parmetro o cdigo da
mensagem.
interface Mensagem {
void imprimeMensagem(int codigo);
}

Esta interface pode ser implementada por uma classe que imprime o valor na tela com um
simples System.out.println, pode ser implementada por outra classe que imprime em um Applet ou
em uma aplicao que exibe uma caixa de dilogo.

Tratamento de Exceo

Fundamentos do Tratamento de Exceo

Uma exceo uma condio anormal que ocorre durante a execuo de uma seqncia de
cdigo. Ou seja, uma exceo um erro em tempo de execuo. Em linguagens como Object Pascal
e C++ o tratamento de exceo opcional, ou seja, o programador decide se faz ou no. Em Java o
tratamento de exceo obrigatrio, sempre que houver um mtodo que possa gerar uma exceo, a
classe que utilizar este mtodo ser obrigada a tratar de alguma forma a possvel exceo. Caso
contrrio ocorrer um erro de compilao.
Em Java o tratamento de exceo feito atravs de cinco palavras-chaves: try, catch throw,
throws e finally. O trecho de cdigo a ser monitorado fica contido em um bloco try. Caso a exceo
ocorra, ela ser executada no bloco de cdigo contido em catch. Para gerar manualmente uma
exceo utilizada a palavra-chave throw. Qualquer exceo que possa ser gerada por um mtodo
deve ser especificada por uma clusula throws. Qualquer cdigo que precise ser executado antes de
sair de um mtodo onde ocorreu uma exceo deve estar em um bloco finally. O formato geral de
um bloco de tratamento de exceo :

try {
// Bloco de cdigo monitorado
{
catch(ExcecaoTipol exObj) {
// Tratamento_da_exceo_tipol
}
catch(ExcecaoTipo2 exObj) {
// Tratamento_da_exceo_tipo2
}
catch(ExcecaoTipoN exObj) {
// Tratamento_da_exceo_tipoN
} finally {
// cdigo_executado_antes_de_sair_do_bloco
}

ExcecaoTipo especifica o tipo da exceo que ocorreu.



191
Tipos de Exceo

Todas as excees so subclasses derivadas da classe Throwable. Assim, Throwable est
no topo da hierarquia de classe das excees. Imediatamente abaixo de Throwable esto duas
subclasses que dividem as excees em duas ramificaes distintas. A primeira ramificao
originada na classe Exception. Esta classe utilizada para definir condies excepcionais que os
programas devem tratar. As excees criadas plos usurios devem utilizar a classe Exception.
A outra ramificao originada na classe Error, que define as excees que, sob condies
normais, no espera-se que sejam identificadas pelo programa. As excees deste ramo so
utilizadas pela JVM para indicar erros relacionados ao ambiente de execuo.

try-catch

Embora o tratador padro de excees do ambiente de execuo Java monitore algumas
excees e oferea informaes teis para depurao, muitas vezes o usurio prefere tratar estas
excees. Isto permite que o usurio corrija erros e evite que o seu programa seja finalizado. O
exemplo abaixo oferece o tratamento caso ocorra um erro de diviso por zero. Isto feito
monitorando a exceo ArithmeticException.

class ExcecaoDemo {
public static void main(String args[]) {
int i, a;
for(i = 5; i >= 0; i--) {
try{ // monitora um bloco de cdigo
System.out.println("Dividindo 35 por " + i +
"...);
a = 35 / i;
System.out.println("35 / " + i + " = " + a);
} catch (ArithmeticException e) {
// verifica diviso por zero
System.out.println("Erro: Diviso por zero");
}
}
}
}

A sada do programa
Dividindo 35 por 5... 35 / 5 7
Dividindo 35 por 4... 35 / 4 = 8
Dividindo 35 por 3... 35 / 3 11
Dividindo 35 por 2... 35 / 2 = 17
Dividindo 35 por l... 35/1-35
Dividindo 35 por O... Erro: Diviso por zero

throw

Na seo anterior foi mostrado como tratar uma exceo gerada pelo ambiente de execuo
Java. Entretanto, possvel que o programador usurio gere explicitamente uma exceo atravs da
palavra-chave throw. O formato geral :
throw instancia_de_uma_exceo,
A instncia da exceo a ser gerada deve ser necessariamente um objeto da classe
Throwable ou de uma subclasse de Throwable. A partir do ponto onde utilizado o throw, o fluxo
de execuo interrompido e nenhuma outra operao subsequente executada. O bloco try mais
prximo inspecionado para verificar se o bloco catch identifica a exceo gerada. Caso a exceo
seja identificada, a execuo do programa passa para o bloco catch. Se a exceo no for
identificada por nenhum bloco try-catch, ento o tratador padro de excees acionado
192
interrompendo a execuo do programa e imprimindo a pilha de rastreamento. A seguir mostrado
um exemplo de utilizao de throw:
class ThrowDemo {
static void demoThrowQ {
try {
// gera uma exceo throw
new NullPointerException("DEMO");
}catch (NulIPointerException e) {
System.out.println("Identifiada dentro de demoThrow);
// gera novamente a mesma exceo
throw e;
}
}

public static void main(String args[]) {
try {
demoThrow();
}catch (NullPointerException e) {
System.out.println("Identifiada novamente:" + e);
}
}
}

A sada do programa
Identificada dentro de demoThrow
Identificada novamente: java.lang.NullPointerException: DEMO


throws

Quando um mtodo "A" pode gerar uma exceo que ele no trata, necessrio especificar o
seu erro de maneira que outros mtodos que chamem o mtodo "A" previnam-se contra esta
exceo. Isto feito atravs da incluso da clusula throws na declarao do mtodo. A clusula
throws lista os tipos de excees que um mtodo pode gerar. A incluso desta clusula fora que os
usurios deste mtodo tratem as possveis excees. O formato geral :
tipo nome_do-metodo(lista_de_parmetros) throws lista_de_excees {
// corpo_do_mtodo
}
A seguir mostrado um exemplo de utilizao de throws:
class ThrowsDemo {
static void demoThrows() throws IllegalAccessException {
System.out.println("Identificada dentro de demoThrows");
// gera a exceo
throw new IllegalAccessException("DEMO");
}

public static void main(String args[]) {
try {
demoThrows();
} catch (IllegalAccessException e) {
System.out.println("Identificada novamente: " + e);
}
}
}
A sada do programa
Identificada dentro de demoThrows
193
Identificada novamente: java.lang.IllegalAccessException: DEMO

finally

Quando ocorre uma exceo o fluxo de execuo do mtodo alterada abruptamente. Muitas
vezes dependendo de como o mtodo codificado, possvel que o mtodo retorne de forma
prematura. Para evitar isto pode ser adicionado um bloco finally ao try-catch. O bloco finally ser
executado sempre, ocorrendo ou no uma exceo. A seguir mostrado um exemplo de utilizao do
bloco finally:

class FinallyDemo {
static void metodoA() {
try {
System.out.println("dentro do metodoA");
throw new RuntimeException("DEMO");
} finally {
System.out.println("dentro finally do metodoA");
}
}

static void metodoB() {
try {
System.out.println("dentro do metodoB");
return;
} finally {
System.out.println("dentro finally do metodoB");
}
}

static void metodoC() {
try {
System.out.println("dentro do metodoC");
} finally {
System.out.println("dentro finally do metodoC");
}
}

public static void main(String args[]) {
try {
metodoA();
} catch (Exception e) {
System.out.println("Excecao identificada");
}
metodoB();
metodoC();
}
}

A sada do programa
dentro do metodoA
dentro finally do metodoA
Exceo identificada
dentro do metodoB
dentro finally do metodoB
dentro do metodoC
dentro finally do metodoC

Note que o bloco finally sempre executado mesmo sendo gerada uma exceo como no
metodoA(), solicitando um retorno prematuro como no metodoB() ou quando nenhuma exceo
identificada como no metodoC().

194

Excees Padres em Java

Nesta seo sero apresentadas as excees definidas no pacote java.lang que portado
automaticamente em todo programa Java. Para as classes da ramificao RuntimeException. O
compilador no verifica se so tratadas por algum mtodo. Por outro lado, para as classes da
ramificao Exception o compilador verifica se elas so tratadas em algum mtodo do programa.
Muitas outras excees so definidas em outras bibliotecas.

Exceo 0escro
ArthmetcExcepton Erro arItmtIco como dIvIso por zero
ArrcylndexDutD]8oundsExcepton ndIce do crrcy fora do lImIte
ArrcyStoreExcepton AtrIbuIo de elemento de tIpo Incompativel
ClcssCcstExcepton Ccst InvlIdo
llleyclAryumentExcepton Argumento InvlIdo Invocando um mtodo
llleyclMontorStcteExcepton Dperao de monItoramento InvlIdo
llleyclStcteExcepton AmbIente ou aplIcao em estado Incorreto
llleyclThrecdStcteExcepton Dperao requIsItada Incompativel com estado atual
lndexDutD]8oundsExcepton Algum tIpo de indIce fora do lImIte
NeyctveArrcySzeExcepton Arrcy crIado com tamanho negatIvo
NullPonterExcepton Uso InvlIdo de referncIa nula
NumberFomctExcepton Converso InvlIda de Strny para numero
SecurtyExcepton TentatIva de vIolao de segurana
StrnylndexDutD]8ounds ndIce de Strny fora de lImIte
0nsupportedDperctonExcepton Uma operao no suportada foI encontrada
Subclasses de RuntimeException nao checadas pelo compilador.


Exceo 0escro
ClcssNotFoundExcepton Classe no encontrada
CloneNotSupportedExcepton TentatIva de clonar um objeto que no Implementa
a Interface Clonable
llleyclAcessExcepton Acesso negado a uma classe
lnstcncctonExcepton TentatIva de crIar um objeto de uma classe abstrata
ou Interface.
lnterruptedExcepton Uma Threcd foI InterrompIda por outra
NoSuchFeldExcepton Um campo requIsItado no exIste
NoSuchMethodExcepton Um mtodo requIsItado no exIste
Subclasses de Exception checadas pelo compilador.


Criando uma Exceo

Embora as excees padres de Java tratem a maioria dos erros comuns, o usurio pode
querer definir novas excees para outros erros. Para isso basta criar uma subclasse de Exception.
Abaixo mostrado um exemplo de criao de uma exceo:


class MinhaExcecao extends Exception {
private int cdigo;

195
MinhaExcecao(int cod) {
cdigo = cod;
}

public String toString() {
return "MinhaExcecao, cdigo " + cdigo;
}
}

class MinhaExcecaoDemo {
static void registra(int a) throws
MinhaExcecao {
System.out.println("registrando cdigo = " + a);
if(a > 10) throw new MinhaExcecao(a);
SyStem.out.printLn(cdigo = " + a + " registrado");
}

public static void main(String args[]) {
try {
registra(5);
registra(29);
} catch (MinhaExcecao e) {
System.out.println("Exceo identificada: + e);
}
}
}

sada do programa
registrando cdigo - 5
cdigo = 5 registrado
registrando cdigo = 29
Exceo identificada: MinhaExcecao, cdigo
=
29


EntradaJSada

Streams

Os programas Java trabalham com Entrada/Sada (E/S) atravs de streams. Uma stream
uma abstrao que produz ou consome informao. Uma stream ligada a um dispositivo fsico
atravs do sistema de E/S. Todas as streams apresentam comportamento igual mesmo que os
dispositivos a elas ligado forem diferentes. Assim, as mesmas classes e mtodos de E/S podem ser
utilizadas para diferentes tipos de dispositivos. Isto significa que uma Stream de entrada pode
abstrair muitos tipos diferentes de entradas como arquivos, teclado ou conexes de rede. Da mesma
forma, uma stream de sada pode referir-se ao terminal, a um arquivo ou a uma conexo de rede.


Streams de Bytes e de Caracteres
Java define dois tipos de streams: streams de bytes e streams de caracteres. As streams
de bytes oferecem meios para tratar a entrada e sada de bytes. Uma stream de bytes pode ser
utilizada, por exemplo, para ler ou escrever dados binrios. Streams de caracteres oferecem meios
para tratar a entrada e sada de caracteres. As streams de caracteres utilizam a codificao Unicode.
Classes de Streams de Bytes

As streams de bytes esto divididas em dois ramos hierrquicos. O primeiro tem incio na
classe abstrata InputStream. Todas as subclasses deste ramo correspondem a streams de bytes de
entrada utilizadas para a leitura de bytes de diversos dispositivos. O segundo ramo da hierarquia
originado na classe abstrata OutputStream. As subclasses deste ramo permitem a escrita de bytes
196
em diversos dispositivos. A tabela abaixo mostra quais so as classes que trabalham com streams de
bytes.

Classes de Streams de Caracteres

As streams de caracteres tambm esto divididas em dois ramos hierrquicos. O primeiro
ramo tem incio na classe abstrata Reader. Todas as subclasses deste ramo correspondem a
streams de bytes de entrada utilizadas para a leitura de caracteres de diversos dispositivos. O
segundo ramo da hierarquia originado na classe abstrata Writer. As subclasses deste ramo
permitem a escrita de diversos disposivos.

Classe Stream 0escro
8ufferednputStream Strecm de entrada bu]]erzcdc
8ufferedDutputStream Strecm de saida bu]]erzcdc
8yteArraynputStream Strecm de entrad que l de um array de bytes
8yteArrayDutputStream Strecm de saida que escreve em um array de byte
0atanputStream Strecm de entrada para leItura de tIpos de dados Java Padro
0ctcDutputStrecm Strecm de saida para escrIta em tIpos de dados Java Padro
FlelnputStrecm Strecm de entrada para leItura de arquIvos
FleDutputStrecm Strecm de saida para escrIta em arquIvos
FlterlnputStrecm Strecm de entrada que Implementa lnputStrecm
FlterDutputStrecm Strecm de saida que Implementa DutputStrecm
lnputStrecm Strecm de entrada (classe abstrata)
DutputStrecm Strecm de saida (classe abstrata)
PpedlnputStrecm Strecm de entrada ppe
PpedDutputStrecm Strecm de saida ppe
PrntStrecm Strecm de saida que possuI rnt e rntln
PushbccklnputStrecm Strecm de entrada que permIte devolver um byte lIdo
RcndomAccessFle Suporta escrIta e leItura de arquIvos
SequencelnputStrecm Strecm de entrada que combIna uma ou maIs strecms de entrada
Classes de Streams de bytes.

Streams Predefinidas

A stream de sada padro System.out. Por padro, esta stream est ligada ao terminal
(console). A stream de entrada padro System.in. Por padro, esta stream tambm est ligada ao
teclado. Stream de erro padro System.err. Por padro, esta stream tambm est ligada ao
terminal (console) mas pode ser redirecionada para qualquer dispositivo de E/S compatvel.
System.in um objeto do tipo InputStream. System.out e System.err so objetos do tipo
PrintStream. Estas so streams de bytes, contudo, so tipicamente utilizadas para ler caracteres do
teclado e escrever caracteres para o terminal.

Lendo Dados do Teclado

Em Java no existe um mtodo generalizado para leitura de teclado como o scanf do C ou o
read do Pascal. Na realidade os caracteres do teclado so lidos atravs da stream System.in. Para
se obter uma stream de caracteres necessrio empacotar o System.in em um objeto
BufferedReader. Para criar um objeto BufferedReader o formato do construtor padro :

197
BufferedReader(Reader ReaderDeEntrada)

ReaderDeEntrada ligado instncia de BufferedReader que est sendo criado. Reader
uma classe abstrata. Uma das suas subclasses concretas InputStreamReader que converte bytes
em caracteres. Para criar um objeto InputStreamReader pode-se usar o construtor:

InputStreamReader(InputStream StreamDeEntrada)

Neste caso, pode-se utilizar System.in como StreamDeEntrada para o construto do
InputStreamReader. Assim, para conectar um BufferedReader ao teclado necessrio incluir a
seguinte linha de cdigo:
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)

Aps a execuo desta linha, br estar conectado ao teclado atravs do System.in.

A tabela abaixo mostra quais so as classes que trabalham com streams de caracteres.

Classe Stream 0escro
8u]]eredRecder
Stream do caracteres de entrada bufferizada
8u]]eredWrter Stream de caracteres de saida bufferizada
ChcrArrcyRecder
Stream de entrada que l de um array de caracteres
ChcrArrcyWrter
Stream de saida que escreve em um array de caracteres
FleRecder Stream de entrada para leitura de arquivos
FleWrter
Stream de saida para escrita em arquivos
FlterRecder
Stream de entrada que implementa Reader
FlterWrter Stream de saida que implementa Writer
lnputStrecmRecder
Stream de entrada que traduz bytes em caracteres
DutputStrecmWrter Stream de saida que traduz bytes em caracteres
LneNumberRecder Stream de entrada que conta e l linhas
Recder
Stream de caracteres de entrada (classe abstrata)
Wrter
Stream de caracteres de saida (classe abstrata)
PpedRecder Stream de caracteres de entrada pipe
PpedWrter
Stream de caracteres de saida pipe
PrntWrter
Stream de caracteres de saida que possui print e println
Push8cckRecder Stream de caracteres de entrada que permite
devolver um byte lido
StrnyRecder Stream de caracteres de entrada que l de uma string
StrnyWrter Stream de caracteres de saida que escreve em uma String
Classes de streams de caracteres.

Leitura de Caracteres do Teclado

Para ler um caractere do teclado basta utilizar o mtodo read(). Observe que o mtodo pode
gerar uma exceo lOException. Abaixo mostrado um exemplo que l do teclado:

import java.io.*;

class LeCaracterTeclado {
public static void main(String args[]) throws lOException {
char c;
198
BufferedReader br = new BufferedReader(new
InputStreamReader(System.in)\

System.out.println("Digite um caracter qualquer ou 's' para sair);
do {
c = (char) br.read();
System.out.println(c);
} while (c != 's');
}
}

Observe que o comportamento deste programa um pouco diferente do esperado. Isto
ocorre porque System.in no repassa para o programa nenhum caractere at que seja pressionada
a tecla ENTER.

Leitura de Strings do Teclado

Para ler uma string do teclado basta utilizar o mtodo readLine(). Observe que o mtodo
readLine tambm pode gerar uma exceo lOException. Abaixo mostrado um exemplo que l uma
string do teclado:

import java.io.*; |
class LeStringTeclado {
public static void main(String args[]) throws lOException {
String s;
BufferedReader br = newBufferedReader(new InputStreamReader

(System.in));

System.out.println("Entre com texto e pressione ENTER");
System.out.println("Digite 'sair' para finalizar.");
do {
s = br.readLine();
System.out.println(s);
} while (!s.equals("sair"));
}
}


Escrevendo no Terminal

A escrita no terminal pode ser facilmente desempenhada atravs dos mtodo println() do
System.out, conforme consta nos exemplos exibidos at o momento. Estes mtodos so definidos
pela classe PrintStream (que o tipo de objeto referenciado por System.out.


Leitura e Escrita de Arquivos

Diversas classes e mtodos para leitura e escrita de arquivos so definidas em Java. Estas
classes fazem parte do pacote java.io. Em Java todos os arquivos so tratados como arquivos
binrios. Contudo, podem ser utilizadas streams de caracteres para escrita e leitura de arquivos.
Duas das classes mais comuns para manipulao de arquivos so FileinputStream e
FileOutputStream que criam streams de bytes conectadas a arquivos. Para abrir um arquivo basta
criar um objeto de uma destas classes especificando o nome do arquivo como parmetro do
construtor. Os construtores utilizados nos exemplos desta seo so:

FileInputStream(String nomeDoArquivo) throws FileNotFoundException
FileOutputStream(String nomeDoArquivo) throws FileNotFoundException

O parmetro nomeDoArquivo especifica o arquivo a ser aberto. Se ao criar uma stream de
entrada, se o arquivo no puder ser encontrado ou no existir, a exceo FileNotFoundException
199
gerada. No caso da stream de sada, caso o arquivo especificado no puder ser criado, a exceo
FileNotFoundException gerada. Quando o stream de sada criado, qualquer arquivo com o
mesmo nome ser destrudo.
Quando todas as operaes de leitura ou escrita tiverem sido concludas, necessrio fechar
o arquivo atravs do mtodo close() definido em ambas as classes FilelnputStream e
FileOutputStream. O mtodo close() pode gerar a exceo IOException.
Para ler bytes de um arquivo pode-se utilizar o mtodo read() da classe FileInputStream. O
mtodo read() pode gerar a exceo IOException. Sempre que chamado, o mtodo read() l um
byte e retorna o valor deste byte como um valor inteiro. Ao chegar ao fim do arquivo, o mtodo read()
retorna -1. O exemplo a seguir l um arquivo chamado TESTE.TXT e imprime na tela o seu contedo:

import java.io.*;
class ExibeArquivo {
public static void main(String args[]) throws IOException {
int i;
FileInputStream fis;

try {
fis = new FileInputStream(args[0]);
} catch (FileNotFoundException e) {
System.out.println("Arquivo no encontrado.");
return;
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Uso: ExibeArquivo nomeArquivo");
return;
}
// l os caracteres e imprime na tela
do {
i = fis.read();
if(i != -1) System.out.print((char) i);
} while (i != -1);

fis.close();
}
}

Para escrever em um arquivo pode ser utilizado o mtodo write() provido pela classe
FileOutputStream. Para este mtodo necessrio passar o valor do byte a ser escrito no arquivo.
Este parmetro do tipo inteiro, contudo, somente o byte menos significativo escrito no arquivo. O
mtodo write() pode gerar a exceo lOException. No exemplo abaixo write() utilizado para copiar
um arquivo:

import java.io.*;
class CopiaArquivo {.
public static void main(String args[]) throws lOException {
int i;
FileInputStream fis;
FileOuputStream fos;
try {
try {
fis = new FileInputStream(args[0]);
} catch (FileNotFoundException e) {
System.out.println("Arquivo origem no encontrado.);
return;
}
try{
fos = new FileOutputStream(args[1]);
} catch (FileNotFoundException e) {
System.out.println("Erro criando arquivo destino.");
return;
}
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Uso: CopiaArquivo origem destino");
return;
}
200
// copia arquivo
try {
do {
i = fis.read();
if(i != -1) fos.write(i);
} while (i != -1);
} catch (lOException) {
System.out.println("Erro");
}
fis.close();
fos.close();
}
}



201
Applets

Introduo aos Applets

odos os exemplos anteriores so aplicativos de terminal (interface de texto). Contudo, tem
outros tipos de aplicaes Java como os Applets. Um applet uma pequena aplicao que
pode ser acessada de um servidor de Web, transferida pela Internet, automaticamente instalada
e executada como parte de um documento HTML. Neste captulo sero apresentados os
fundamentos relacionados com a criao de um applet. Como ser constatado ao longo deste
captulo, os Applets so estruturados de maneira diferente dos aplicativos. Abaixo apresentado o
exemplo mais bsico de um applet:

import java.awt.*;
import java.applet.*;
public class PrimeiroApplet extends Applet{
public void paint(Graphics g) {
g.drawString("Primeiro exemplo de applet.", 20, 20);
}
}


Este applet importa dois pacotes, o primeiro o java.awt (Abstract Window Toolkit - AWT). Os
Applets interagem com o usurio atravs do AWT e no atravs do terminal como nos exemplos
anteriores. O AWT oferece suporte a interface grfica baseada em janelas. O AWT bastante
extenso e, maiores detalhes sobre as suas classes devem ser obtidos nos arquivos de ajuda de Java.
O segundo pacote o java.Applets que contm a classe Applet. Todos os Applets devem ser
subclasses de Applet.
Como o applet ser acessado por um outro programa necessrio declar-lo como public. O
mtodo paint() definido pelo AWT e deve ser sobreposto pelo applet. Este mtodo chamado
sempre que o applet precisar ser redesenhado. Isto ocorre em situaes como quando o applet
minimizado e restaurado ou quando ele coberto e descoberto por outra janela. O paint() tambm
chamado quando o applet iniciado. O parmetro do mtodo paint() um objeto da classe Graphics
que representa a rea onde o applet exibido. O drawString() da classe Graphics recebe como
parmetros a mensagem que ser escrita na rea do applet e a posio x e y onde ela ser
posicionada. A posio (0, 0) corresponde ao ponto do topo esquerdo do applet.
Observe que um applet no possui um mtodo main() pois ele executado imediatamente
aps ser carregado em um visualizador de applet ou em um navegador. Um applet compilado da
mesma forma que os aplicativos terminais. Contudo, para execut-lo o processo diferente. Existem
duas maneira de se executar um applet: '
Utilizando um navegador Web compatvel com Java como o Netscape ou verses do Internet
Explorer.
Utilizando um visualizador de applet como o utilitrio appletviewer provido com o Java. Neste
caso o applet executado em uma janela. Normalmente esta a maneira mais rpida de se
testar um applet.
Para executar um applet necessrio escrever um pequeno arquivo HTML contendo uma tag
APPLET indicando o nome do applet e suas dimenses (largura e altura ocupadas na tela). Abaixo
mostrado um possvel arquivo HTML:

<html>
<head>
<title> Primeiro Applet </title>
</head>
<body>
<applet code = "PrimeiroApplet" width = 3OO height = 200>
</applet>
</body>
</html>

Salve o arquivo como TesteApplet.html. Para executar o applet em um navegador basta
carregar o arquivo TesteApplet.html. Para executar no appletviewer basta executar:

T
202
appletviewer TesteApplet.html

De forma alternativa, para utilizar o appletviewer a tag APPLET pode ser includa no cdigo
do applet como comentrio do cdigo fonte do applet, conforme a listagem abaixo:

import java.awt.*;
import java.applet.*;
/*
<applet code = "PrimeiroApplet" width=300 height=200> </applet>
/
public class PrimeiroApplet extends Applet {
public void paint(Graphics g) {
g.drawString("Primeiro exemplo de applet.", 20, 20);
}
}


Desta forma, basta compilar o cdigo e executar o appletviewer passando o nome do
arquivo fonte (.java) do applet ao invs do arquivo HTML.


Esqueleto Bsico de um Applet

Quase todos os Applets sobrepem um conjunto de mtodos que oferecem o mecanismo
bscio para que o navegador ou o visualizador de applet controle a sua execuo. Quatro destes
mtodos so definidos pela classe Applet: init(), start(), stop() e destrroy(). Outro mtodo, paint(),
definido pela classe Component da biblioteca AWT. Uma implementao padro oferecida, assim
no necessrio sobrepor os mtodos que no sero utilizados. O esqueleto bsico de um applet
mostrado abaixo.


// Um esqueleto para Applets
import java.awt.*;
import java.applet.*;
/*
<applet code="EsqueletoApplet" width=300 height=200>
</applet>
*/
public class EsqueletoApplet extends Applet{
// Primeiro mtodo chamado
public void init() {
// inicializacao do applet
}

// Chamado aps init() e sempre que o applet e reiniciado
public void start() {
// inicia ou reinicia a execuo
}

// Chamado quando o applet e suspenso
public void stop() {
// suspende a execuo
}

// Chamado quando o applet e finalizado
// este e o ultimo mtodo executado
public void destroy() {
// executa o cdigo de finalizao do applet
}

// Chamado quando o applet precisa ser redesenhado
public void paint(Graphics g) {
// cdigo de desenho do applet
}
}
Embora este esqueleto no faa nada, ele pode ser compilado e executado.
203
Quando executado, ele gera uma janela limpa.


Iniciao e Finalizao de um Applet

importante observar a ordem em que cada um dos mtodos apresentados no esqueleto so
chamados. Quando o applet iniciado, o AWT chama em seqncia os seguintes mtodos:

1. init()
2. start()
3. paint()

Quando o applet finalizado a seguinte seqncia de mtodos chamada:
1. stop()
2. destroy()

init() - Este o primeiro mtodo a ser chamado. Nele devem ser iniciadas todas as vai mtodo
chamado uma nica vez durante a execuo do applet.
start() - O mtodo start() chamado imediatamente aps o init() e sempre que for reiniciada a
execuo do applet aps ter sido suspensa. Este mtodo chamado sempre que o documento HTML
exibido na tela.
paint() - Este mtodo chamado sempre que o applet precisa ser redesenhado. Isto pode varias
razes. Por exemplo, quando a janela do applet coberta e descoberta por outra janela. Ou quando a
janela do applet minimizada e restaurada. O mtodo recebe um parmetro Graphics que descreve
o ambiente grfico onde o applet est sendo executado.
stop() - O mtodo stop() chamado quando o navegador Web deixa o documento HTML contendo
o applet (quando ele carrega outra pgina, por exemplo). Quando stop() chamado, provavelmente
o applet est sendo executado. O mtodo stop() utilizado para suspender Threads que no
precisam ser executadas enquanto o applet no visvel. Elas podem ser reiniciadas atravs do
mtodo start() caso o usurio volte para a pgina.
destroy() - O mtodo destroy() chamado quando o ambiente de execuo determina que o applet
ser removido completamente da memria. Neste momento todos os recursos utilizados pelo applet
devem ser liberados. O mtodo stop() sempre chamado antes do mtodo destroy().

Cores do Applet

Para configurar a cor de fundo da janela de um applet, necessrio utilizar o mtodo
setBackground(). Para configurar a cor de desenho necessrio utilizar o mtodo
setForeground(). Estes mtodos so definidos pela classe Component e apresentam seguinte
forma:
void setBackground(Color novaCor)
void setForeground(Color novaCor)

Onde novaCor define a cor que ser configurada. A classe Cor define as seguintes constantes para
especificar uma cor:
Color.black Color.magenta
Color.blue Color.orange
Color.cyan Color.pink
Color.darkGray Color.red
Color.gray Color.white
Color.green Color.yellow
Color.lightGray

Abaixo mostrado um exemplo que modifica a cor de desenho e a cor do fundo. A
visualizao dele mostrada na figura abaixo:

import java.awt.*;
import java.applet.*;
/*
<applet code =- CorApplet" width=300 height= 200>
</applet>
*/
204
public class CorApplet extends Applet {
String msg;

// configura as cores
public void init() {
setBackground(Color.blue);
setForeground(Color.magenta);
msg = "Dentro do init() -- ";
}

public void start() {
msg += "Dentro do start() - ";
}

public void paint(Graphics g) {
msg += "Dentro do paint().";
// desenha a string
g.drawString(msg,5,90);
}
}

Desenhando Formas Geomtricas

Para desenhar figuras geomtricas necessrio utilizar os mtodos de desenho contidos na
classe Graphics atravs do parmetro "g" passado para o mtodo paint() do applet. Abaixo so
mostrados alguns mtodos oferecidos para desenhar formas geomtricas na janela do applet:


void drawLinc(int x1, int y1, int x2, int y2)
void draw0val(int x, int y, int width, int height)
void drawRect(int x, int y, int width, int height)


Abaixo mostrado um applet que utiliza estes mtodos:

import java.awt.*;
import java.applet.*;
/*
<applet code="DesenhoApplet" width=300 height=150>
</applet>
*/
public class DesenhoApplet extends Applet {
// configura as cores
public void init() {
setBackground(Color.lightGray); ;
setForeground(Color.black);
}

public void paint(Graphics g) {
// define cor e desenha uma linha
g.draw3tring("linha",125,18);
g.drawLine(5,20,295,20);

// define cor e desenha uma elipse
g.draw3tring("elipse",20,38);
g.drawOval(10,42,50,80);

// define cor e desenha um retangulo
g.drawString("retangulo",100,38);
g.drawRect(100,42,50,80);

// define cor e desenha um arco
g.drawString("arco",215,38);
g.drawArc(200,42,50,80,O,120);
}
)
205
ANEXO A:

Conceitos sobre a linguagem Java

Um Breve histrico

alvez a contribuio mais importante da revoluo dos microprocessadores at esta data seja o
fato de ela ter possibilitado o desenvolvimento de computadores pessoais, que agora chegam a
centenas de milhes em todo o mundo. Os computadores pessoais tiveram um profundo
impacto sobre as pessoas e a maneira como as organizaes conduzem e gerenciam seus negcios.
Muitas pessoas acreditam que a prxima rea importante em que os microprocessadores
tero um impacto profundo sero os dispositivos inteligentes destinados ao consumidor final.
Reconhecendo isso, a Sun Microsystems financiou uma pesquisa corporativa interna com o codinome
Green em 1991. O projeto resultou no desenvolvimento de uma linguagem baseada em C e C++ que
seu criador, James Gosling, chamou de Oak(carvalho) em homenagem a uma rvore que dava para
a janela do seu escritrio na Sun. Descobriu-se mais tarde que j havia uma linguagem de
computador chamada Oak. Quando uma equipe da Sun visitou uma cafeteria local, o nome Java
(cidade de origem de um tipo de caf importado) foi sugerido e pegou.
Mas o projeto Green atravessava algumas dificuldades. O mercado para dispositivos
eletrnicos inteligentes destinados ao consumidor final no estava se desenvolvendo to rapidamente
como a Sun tinha previsto. Pior ainda, um contrato importante pelo qual a Sun competia fora
concedido a outra empresa. Ento, o projeto estava em risco de cancelamento. Por pura sorte, a
World Wide Web explodiu em popularidade em 1993 e as pessoas da Sun viram o imediato potencial
de utilizar Java para criar pginas da Web com o chamado contedo dinmico. Isso deu nova vida ao
projeto.
Em maio de 1995, a Sun anunciou Java formalmente em uma conferncia importante.
Normalmente, um evento como esse no teria gerado muita ateno. Entretanto, Java gerou
interesse imediato na comunidade comercial por causa do fenomenal interesse pela World Wide
Web. Java agora utilizada para criar pginas Web com contedo interativo e dinmico, para
desenvolver aplicativos corporativos de grande porte, para aprimorar a funcionalidade de servidores
da World Wide Web (os computadores que fornecem o contedo que vemos em nossos
navegadores da Web), fornecem aplicativos para dispositivos destinados ao consumidor final(como
telefones celulares, pagers e assistentes pessoais) e para muitas outras finalidades.

Princpios bsicos de um ambiente Java clssico

Plataforma Java

Diversas plataformas esto disponveis no mercado tais como Microsoft Windows, Macintosh,
OS/2 UNIX
R
e NetWare
R
. Um arquivo binrio de uma aplicao que executa em uma plataforma no
pode ser executado em outra sem que o cdigo seja recompilado. Isto ocorre porque o arquivo
binrio especfico para uma determinada mquina e sistema operacional.
A plataforma Java uma plataforma de software projetada para a transferncia e execuo
dinmica, segura e interativa de applets e aplicativos de redes. A plataforma Java situa-se sobre as
demais plataformas de hardware/software compilando e executando bytecodes, que no so
orientados a uma arquitetura especfica, mas so instrues de uma mquina virtual. Um programa
escrito em Java e compilado em um arquivo bytecode pode ser executado em qualquer mquina e
qualquer sistema operacional que possua a plataforma Java disponvel. Esta portabilidade possvel
porque o ncleo da plataforma Java a Mquina Virtual java (JVM Java Virtual Machine).
Cada plataforma possui sua prpria implementao da JVM, por outro lado, a especificao
da JVM nica. Por isso, a plataforma Java pode oferecer uma interface de programao
padronizada e uniforme para applets e aplicativos em qualquer hardware. Portanto, a plataforma Java
ideal para a Internet, onde um programa deve poder ser executado em qualquer computador.

Benefcios da plataforma Java

T
206
A plataforma Java traz alguns benefcios para usurios finais, desenvolvedores e para a
equipe de suporte.

Benefcios para usurios finais. Atualmente, a plataforma Java oferece um contedo interativo
na World Wide Web, com acesso do tipo just-in-time ao software. Aplicativos so disponibilizados
em todos os sistemas operacionais.
Benefcios para desenvolvedores. A linguagem Java orientada a objetos. Os desenvolvedores
no precisam portar seus aplicativos para os diversos sistemas operacionais disponveis no
mercado, reduzindo com isso, o custo de desenvolvimento. A independncia de plataforma por si
s j configura motivo suficiente para a adoo de Java como linguagem de programao.
Benefcios administrativos e de suporte. O controle de verses e as atualizaes so
simplificados pois as aplicaes Java podem ser mantidas em um repositrio central e serem
disponibilizadas para usurios individuais. Em ambientes com mltiplas plataformas de mltiplos
fornecedores, o nmero de plataformas que receberem suporte reduzido para um. Com a
adoo de redes de computadores, o gerenciamento dos dados pode permanecer centralizado
enquanto o processamento feito localmente.

Em resumo Java possui os seguintes caractersticas:
Orientao a objetos
Portabilidade
Multitheading
Suporte comunicao
Acesso remoto a banco de dados


Linguagem Java

A linguagem Java o meio utilizado pelos desenvolvedores para escreverem cdigo fonte.
Applets e aplicativos escritos na linguagem Java so compilados para um arquivo executvel na
plataforma Java. A linguagem Java orientada a objetos, tipada, multitheaded, dinamicamente
linkada e possui um mecanismo automtico de garbage collection. Sua sintaxe baseada em C e
C++, de maneira que os programadores familiarizados com estas linguagens podem se adaptar
facilmente.
A linguagem Java oferece aos desenvolvedores a capacidade de fazer trs tipos de
programao em uma nica linguagem. Assim como a linguagem de programao simblica
smalltalk, Java orientada a objetos, dinamicamente linkada e possui uma hierarquia de classe
com herana simples. Para programao numrica, Java possui seus tipos de dados independentes
de plataforma, limites de arrays e uma aritmtica IEEE bem definida. Estas capacidades permitem
uma boa base para a escrita de algoritmos numricos que produzem resultados repetitivos. Para
programao de sistemas, as expresses, as instrues e os operadores da linguagem Java so, na
maioria das vezes, os mesmos da linguagem C.

Plataforma Java bsica

A plataforma Java bsica a plataforma mnima que os desenvolvedores podem assumir de
modo seguro que est presente para se executar applets e aplicativos Java. Esta plataforma se aplica
a redes de computadores, computadores pessoais e estaes de trabalho. Esta plataforma contm a
mesma JVBM mencionada anteriormente, mas possui uma API mnima conhecida como API bsica
Java. Os desenvolvedores podem escrever programas com esta API mnima sem se preocuparem
com bibliotecas de classes adicionais.


Applets e aplicativos

A plataforma Java permite a criao de dois tipos de programas distintos:

applets so programas que necessitam de um navegador para serem executados. A tag line
<applet> inserida em uma pgina HTML com o nome do programa a ser executado. Ao ser
acossada, pela Internet ou uma intranet corporativa, o automaticamente transferido do servidor e
executado na mquina cliente.
207
Aplicativos - so programas que no necessitam um navegador para serem ex< e no so
transferidos automaticamente como os applets. Ao ser chamado, o a executado da mesma
forma que os programas escritos em outra linguagem.

JavaOS

Java OS um sistema operacional que implementa a Plataforma Java Bsica para executar
applets e aplicativos. O JavaOS projetado para redes de computadores e dispositivos para redes de
computadores, tais como impressoras, copiadoras e controladores industriais. Estes dispositivos
podem ser ligados instantaneamente e dispensam administrao de sistemas e, quando em uma
rede, podem ser automaticamente atualizados.

Por Dentro da Plataforma Java

A Plataforma Java pode ser dividida em duas partes, a Mquina Virtual Java (JVM - Java
Virtual Machine) e a API Java, conforme mostra a figura abaixo.

Aplicativos e applets
API Bsica Java AP! estendida Java padrao
Classes Java Bsica Classes Java de Extensao padrao
Mquina Virtual Java {JVM)
Interface de Portabilidade
Adaptador Adaptador Adaptador JavaOS
Navegador
Sistema
Operacional
Sistema
Operacional
Sistema
Operacional
Hardware

Hardware

Hardware

Hardware


A JVM funciona como um computador virtual que pode ser implementado em software ou
hardware. Trata-se de uma mquina abstrata projetada para ser implementada sobre os
processadores existentes. A interface de portabilidade e os adaptadores permitem que a JVM seja
facilmente portada para um novo sistema operacional sem a necessidade de ser completamente re-
escrita.
A API Java constitui a interface padro para applets e aplicativos independente do sistema
operacional. A API Java define as funcionalidades essenciais para o desenvolvimento de aplicativos.
A API Bsica Java prov a linguagem bsica e os servios de I/O, rede, GUI e applets. A API
Estendida Padro Java estende as funcionalidades de Java alm da API bsica.
Na Figura acima, a Plataforma Java Bsica mostrada em preto, incluindo os blocos dos de
Adaptador. A API Java inclui tanto a API Bsica quanto a API Estendida As classes constituem a
implementao das APIs. A JVM est no ncleo da plataforma. A interface de portabilidade fica entre
a JVM e o sistema operacional ou navegador. Esta interface de portabilidade possui uma parte
independente de plataforma (em preto) e uma parte dependente da plataforma (Adaptador). O
sistema operacional e o JavaOS so os elementos que efetivamente implementam as funcionalidades
de janela, arquivo e rede. Mquinas diferentes podem ser conectadas atravs de uma rede conforme
mostrado na figura acima. A API Java aberta e extensvel.

208
Mquina Virtual Java {JVM - Java Virtual Machine)

A JVM a chave para a independncia de sistema operacional e hardware. Na realidade a
JVM encapsula e esconde as particularidades do sistema operacional e do hardware oferecendo uma
interface nica de execuo de cdigo. A JVM define um formato binrio de arquivo (.class)
independente de plataforma. Este formato inclui as instrues de um computador virtual na forma de
bytecodes.

API Bsica Java

Utilizando as APIs disponveis na Plataforma Java, os desenvolvedores tm a garantiade que
suas aplicaes funcionaro em qualquer JVM. Atualmente, a API Bsica Java definida como API
de Applet Java. Ao longo do tempo, conforme o amadurecimento da plataforma, esta API bsica
poder crescer, ao passo que algumas classes da API Estendida Padro migrarem para a API
Bsica.

API Estendidad Padro

A API Estendida Padro Java define um conjunto de extenses padres, pois geram uma API
publicada, uniforme e aberta, que pode ser implementada por qualquer pessoa. Uma vez definidas,
elas podem ser incrementadas mantendo compatibilidade com as verses anteriores. Ao longo do
tempo, novas extenses podem ser adicionadas e algumas delas podem migrar para a API Bsica
Java.

Compilador e Ambiente de Execuo Java
Um Ambiente de Desenvolvimento Java inclui o ambiente de compilao e o a execuo,
como na figura abaixo. A Plataforma Java representada pelo ambiente de execuo. O
desenvolvedor escreve o cdigo fonte Java (arquivo .java) e o compila em bytecodes (arquivo .class).
Estes bytecodes so instrues para a JVM. Para se criar um applet, o desenvolvedor armazena os
bytecodes em um servidor HTTP e adiciona, em uma pgina html, a tag line < applet code = filename
> que nomeia o ponto de entrada do arquivo de bytecode.
Quando o usurio visita esta pgina, a tag line < applet > faz com que os arquivos bytecode
sejam transferidos pela rede do servidor para o navegador do usurio na Plataforma Java. No passo
seguinte, os bytecodes so carregados na memria e ento so verificados os aspectos de
segurana antes de serem carregados na JVM.
Uma vez carregados na JVM, os bytecodes so interpretados pelo interpretador, e
normalmente so transformados em cdigo de mquina pelo gerador de cdigo JIT (Just-In_Time)
tambm conhecido como compilador JIT. O interpretador e o compilador JIT operam no contexto do
sistema de execuo (Threads, memria e outros recursos do sistema). Qualquer classe da biblioteca
de classes Java (API) so dinamicamente carregados conforme a necessidade do applet.
















209



Anexo B
Resumo dos conceitos abordados sobre a Linguagem Java.

Java uma linguagem de programao orientada a objetos desenvolvida pela Sun
Microsystems para ser portvel entre diferentes plataformas.

Algumas Caractersticas

orientada a objetos.
portvel, isto , seus programas podem ser utilizados em diferentes plataformas.
Seu cdigo de programao interpretado, o que garante maior velocidade de desenvolvimento e
portabilidade.
Permite que o programa execute mais de um Thread (linha de execuo).

A linguagem de programao Java possui um ambiente de desenvolvimento e um ambiente
de aplicativos. Ela resulta da busca de uma linguagem com as caractersticas do C++ aliadas
segurana do Smalltalk.

Recursos

O JVM Java Virtual Machine cria uma mquina imaginria, implementada por meio da
emulao de um software executado em uma mquina real. O cdigo do JVM est armazenado em
um arquivo .class.
O JVM fornece as especificaes da plataforma de hardware, o que permite a independncia
de plataforma, uma vez que o programa compilado em uma mquina imaginria. Essas
especificaes consistem em instrues e registro de linguagem de mquina, tamanho de cache,
velocidade do processador etc.

Coleta de Lixo

A garbage collection varre as memrias cujo ponteiro possui nmero de referncia 0. Ocorre
automaticamente durante o tempo de vida de um programa.

Ambiente Java de Compilao

COMPILAO TEMPO DE EXECUO




















CodIgo fonte
arquIvo .java
Classe
arquIvo.class
Carregamento
da classe
7erIfIcao
do bytecode
Interpretao
JT - Code
Cenerator
Tempo de
execuo
Hardware
O cdigo executado
Gerador de cdigo just-in-
time
210
Figura 1 - ambiente Java de compilao


Durante o Processo de Compilao

Os arquivos so compilados medida que so convertidos para bytecodes. Em tempo de
execuo, os bytecodes so carregados, verificados e executados. Durante a execuo, so feitas as
chamadas ao hardware subjacente.
O carregamento de classe responsvel pela carga de todas as classes necessrias
execuo do programa.
O interpretador verifica se foi gerado algum cdigo ilegal, com a finalidade de verificar se o
bytecode adere s especificaes JVM e no viola a integridade e a segurana do sistema.
Na gerao de cdigo, os bytecodes so compilados no cdigo de mquina nativo antes da
execuo, isto , o cdigo interpretado para a plataforma em questo.
Para desenvolver programas, ser necessrio utilizar o Java Development Kit (JDK), um
ambiente de desenvolvimento que, alm das ferramentas de desenvolvimento, contm todos os
elementos da plataforma Java. possvel adquirir o JDK gratuitamente no site da Sun:
www.sun.com.br

Arquivos do JDK

Quando se instala o JDK, criada a seguinte estrutura de diretrio:

0retro contedo
.hotjava ConfIgurao de cppletvewer para uso do J0K
bIn ArquIvos bInrIos (executveIs e bIblIotecas) do J0K.
demo Exemplos de aplIcaes e cpplets.
docs 0ocumentao da AP.
Include ArquIvos utIlIzados para Integrao com o codIgo natIvo.
lIb Classes da AP.
src CodIgo fonte das classes. Somente ser crIado se for especIfIcado
como opo na Instalao do J0K. Ds arquIvos desse dIretorIo podem
ser utIlIzados para depurao.

Algumas Definies

Modificadores tm a funo de modificar a atribuio de classes, mtodos e variveis-
membro. So utilizados como prefixos.
Construtores so utilizados para inicializaram objeto aps a sua criao.
Um construtor tem o mesmo nome da classe em que reside e no tem tipo de retorno, pois o tipo de
retorno implcito e do mesmo tipo da classe em que reside.
Mtodos so os conjuntos de instrues executveis de uma classe.
Cdigo fonte so os arquivos que contem as instrues escritas na linguagem de
programao escolhida, no caso, Java. O cdigo fonte pode ser escrito em um editor de textos como
o Edit do DOS ou o Notepad do Windows. Os arquivos devem ser salvos com um nome (que deve
ser idntico ao nome da classe), com um ponto (.) e com a extenso, que deve ser java. Por
exemplo: teste.java,mdia.java,cadastro.java etc.

1. //Exemplo de programa em Java
2. public class Ola{
3. public static void main(String args[]){
4. System.out.println(Ola para todos!);
5. }
6. }

Entendendo as Instrues do Cdigo Fonte:

1. // inicia um comentrio, utilizado para incluir explicaes no meio do cdigo.
211
2. A palavra public um especificador de acesso que permite ao programador controlar a
visibilidade de uma classe ou mtodo. class Ola a identificao do nome da classe.
3. static void main o main o principal mtodo. O Java procura esse mtodo para
interpretar uma classe. O void um modificador utilizado quando no necessrio retorno. O
main declarado como static,pois no preciso fazer referncia a uma distncia, uma vez
que ele chamado pelo interpretador antes que quaisquer instncia sejam criadas, isto , o
main no ir requerer a chamada de uma instncia dessa classe. O String args [] determina a
criao de um vetor chamado args, com elementos do tipo String utilizados para a entrada
de parmetros.
5. System nome da classe; out nome do objeto da classe System, responsvel pela sada;
println mtodo utilizado para exibir mensagens na tela do computador.
6. Os blocos de programa so delimitados por chaves. Esses blocos devem ser abertos { e
fechados }.

Nota: Esse arquivo deve ser gravado com o nome Ola.java, pois deve levar o mesmo nome da
classe.

Compilador Javac

O cdigo fonte contm instrues de alto nvel, isto , instrues em uma linguagem que o
homem capaz de compreender, mas a mquina no. Por isso, o cdigo fonte precisa ser compilado.
O arquivo responsvel pelo processo de compilao em Java o Java compiler, chamado javac.
O javac gera, a partir do cdigo fonte, um arquivo de bytecodes. Esse arquivo ter o mesmo
nome do arquivo fonte, mas com a extenso .class. Por exemplo: teste.class,
media.class, cadastro.class etc.

Cdigo fonte Bytecode




Figura 2 Diagrama de representao do processo de compilao

Para compilar um arquivo, basta digitar javac e o nome do arquivo. Por exemplo, no prompt
do DOS, conforme o modelo:

c:\> javac Ola.java

Exitem algumas opes que podem ser utilizadas para compilar o programa. Para isso,
utiliza-se a sintaxe javac [opes] arquivo [arquivo...]. Essas opes so relacionadas a
seguir:

javac [opes] arquivo [arquivos...]


Opes:

-classpath path[;...] - localizao das classes das classes j devidas. Sobrepe a varivel de
ambiente CLASSPATH.

-d dir especifica o diretrio raiz onde as classes compiladas sero armazenadas.

-deprecation ativa as mensagens de advertncia que indicam os membros ou as classes
que esto em desuso.

-g - cria tabelas de debugging que sero usados pelo debugger. Contm informaes como
variveis locais e nmeros de linha. A ao default do compilador somente gerar nmeros de
linhas. A opo -g:nodebug suprime a gerao dos nmeros de linha.

-nowarn desativa as mensagens de advertncia que informam problemas potenciais com o
cdigo fonte.


medIa.java

java.class

CodIgo de
mquIna

javac

Interpretao
212
-depend efetua a compilao de todos os arquivos que dependem do cdigo fonte que est
sendo compilado. Sem essa opo, so compilados apenas os arquivos cujas classes so invocadas
no arquivo que est sendo compilado.

-O otimiza o cdigo compilado para gerar programas mais rpidos. Na verso 1.1. inclui o
cdigo de todos os mtodos, em vez de simplesmente invoc-los (call); aumenta o tamanho dos
arquivos compilados

-J opo passa a string opo como argumento para o interpretador que ir executar esse
cdigo. A string opo no pode conter espaos em branco. O argumento -J pode ser usado
mltiplas vezes

Exemplo:

javac classpath .;c:\classes Ola.java
javac Ola.java Teste.java

Para Interpretar o Programa

Para executar (utilizar) o programa, basta digitar, no prompt do DOS, a palavra java seguida
do nome do programa. Por Exemplo:

c:\> java Ola

Palavras Reservadas

Anteriormente foi abordado o assunto identificadores (nomes) de variveis, sobre o qual foi
dito que no se devem utilizar palavras reservadas linguagem de programao. A seguir so
apresentadas as palavras reservadas linguagem Java.

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

Essas palavras no podem ser usadas como nomes de variveis, mtodos, interfaces ou
classes.

Variveis

A declarao de variveis em Java pode ser feita em qualquer parte do programa, e a
varivel pode ser declarada e inicializada. Para relembrar os tipos de dados em Java, consulte o
Captulo 3.
Exemplos:

byte idade;
short a1;
int i = 100;
long 1 = 5000;/* L:identificador long */
float v1,v2=4.578f; /* f.identificador float */
double d= 5,02e19; /* notao cientfica */
char h = 'h';
boolean resposta = true;
/* String so objetos, mas podem ser inicializados como tipos
primitivos */
213
String cadeia = String em Java no tipo primitivo;

As variveis podem ser declaradas dentro de uma classe. So as chamadas variveis-
membro, que podem ser acessadas por qualquer conjunto de instrues da classe. J as variveis
declaradas dentro de um dos mtodos da classe so chamadas de variveis locais.

Modificadores de Variveis

public a varivel visvel por todos.
private a varivel s visvel pela classe.
protected a varivel s visvel para a classe onde foi criada e para suas herdeiras.
private protected a varivel visvel somente para as subclasses.
static - a varivel ser chamada pelo nome da classe e no por um objeto dela.
final a varivel no pode ter seu valor alterado, pois uma constante.

Comentrios

s vezes torna-se importante a escrita de textos no meio do cdigo do programa para explicar
algo. Isso denominado comentrio e um recurso muito utilizado para documentar partes do
cdigo. Em Java, os comentrios podem ser feitos de trs maneiras:

// - para uma linha de comentrios, por exemplo:// comentrio
/* - para um trecho de comentrios. O trecho deve ser delimitado, por exemplo: /*
trecho */
/** - para documentao. O trecho deve ser delimitados, por exemplo: /** trecho */

Modificadores de classes

public pode ser instanciada e utilizada livremente, mesmo da classe interna.
protected pode ser utilizada apenas no mesmo package ou em subclasses da classe
externa.
private pode ser utilizada apenas na classe externa.
abstract no pode ser instanciada. Esse modificador utilizado para definir apenas
superclasses genricas.
final no permite definio de subclasses.

Modificadores de mtodos e variveis_membro

public pode ser chamado livremente e as variveis-membro podem ser utilizadas
livremente.
protected os mtodos e as variveis-membro podem ser chamadas apenas no mesmo
package e em subclasses; as variveis-membro seguem o mesmo padro.
private os mtodos e as variveis-membro podem ser chamados apenas na classe.
abstract no podem ser definidos nem mtodos nem variveis-membro.
final os mtodos no podem ser subescritos; utilizado para declarar constantes.
static tanto os mtodos como as variveis-membro podem ser invocados a partir do
nome da classe.
native utilizado para a definio de mtodos em cdigo nativo. No se aplica a
variveis-membro.
transient no se utiliza em mtodos e no h persistncia em variveis-membro.
synchronized para mtodos, no permite acesso simultneo e programas multithread.
No se aplica a variveis-membro.
volatile no aplicvel definio de mtodos e em variveis-membro no permite
cache.


Excees

214

Throwable

ExceptIon

Error
O tratamento de excees realizado por um mtodo que o Java possui para deteco de
erros. O tratamento de excees tambm conhecido como tratamento de erros, pois os erros so
capturados por esse recurso, que gera um alerta para o usurio.
As excees ou erros so derivados da superclasse Throwable, conforme pode se observado
a Figura 3.














legalAccessExceptIon LInkageError
nstantIatIonExceptIon Thread0eath
CloneNotSupportedExceptIon 7Irtual|achIneError
nterruptedExceptIon AWTError
NoSuch|ethodExceptIon
ClassNotFoundExceptIon
AWTExceptIon
FuntImeExceptIon
DExceptIon


RuntmeExceton l0Exceton LnkayeError VrtualMachneError
EmptyStockExceptIon EDFExceptIon ClassCIrcularItyError nternalError
NoSuchElementExceptIon FIleNotFoundExceptIon ClassFormatError DutDf|emoryError
ArIthmetIcExceptIon nterrupterDExceptIon ncompatIbleClassChangeError StackDverflowError
ArrayStoreExceptIon UTF0ataFormatExceptIon NoClass0efFoundError UnknownError
ClassCastExceptIon |alformedUFLExceptIon UnsatIsfIeldLInkError
llegalArgumentExceptIon ProtocolExceptIon 7erIfyError
llegal|onItorStartExceptIon SocketExceptIon
ndexDutDf8oundsExceptIon UnknownHostExceptIon
NullPoInterExceptIon UnknownServIceExceptIon
NegatIveArraySIzeExceptIon
SecurItyExceptIon

ArrayndexDutDf8oundExceptIon Abstract|ethodError
StrIngndexDutDf8oundsExceptIon legalAccessError
nstantIatIonError
legalThread8oundsExceptIon NoSuchError
NumberFormatExceptIon NoSuch|ethodError





215

Descrio de algumas classes

Exception so excees genricas que podem ser tratadas.
Error so erros graves que normalmente no podem ser tratados.
RunTimeException so as excees geradas por erros de programao.
NullPointerException uma exceo associada tentativa de acesso a propriedades
ou mtodos de referncias com valor null.
ArithmeticException uma exceo associada tentativa de utilizao incorreta de
operadores aritmticos como, por exemplo, a diviso por zero.
IndexOutOfBoundsException uma exceo associada a ndices de vetores ou strings.
ArrayStoreException uma exceo gerada pela tentativa de atribuir a um elemento
de um array um objeto incompatvel com o tipo declarado do array.

A captura das excees deve ser feita da seguinte forma:

try {
//cdigo que PODE gerar uma exceo
} catch(Exception e){// captura da exceo
//cdigo executado no tratamento da exceo
}


Sendo que o cdigo que pode gerar um exceo deve ser descrito no bloco try. Essas
excees, por sua vez, so capturadas no bloco catch (), que deve especificar os argumentos
(excees a serem tratadas).

Passagem da exceo pelo mtodo:

void metodo1() throws IOException {
// cdigo que pode gerar uma exceo IOException
}

Lanamento de exceo:

void metodo2() throws IOException {
// testa condio de exceo
if(excep) then throw(new IOException());
}

Classes mais utilizadas

1. String

A classe String prov objetos que so mais seguros e simples de utilizar do que os arrays
de caracteres. Os objetos String so constantes e no podem ser alterados.
Os objetos da classe String podem ser inicializados por atribuio direta, isto , quando se
declara um objeto, j se atribui um valor a ele. Por exemplo:
String nome = Rafael;

A concatenao de strings feita utilizando o operador +. Por exemplo:
nome + Rissetti; //o resultado ser Rafael Rissetti e ficar
armazenado na varivel nome.



Construtores

new String (char[] c) constri uma String a partir de um array de caracteres.
new String (String s) constri uma String a partir de uma outra String.
216
new String (StringBuffer sb) constri uma String a partir de um
Stringbuffer.


Principais mtodos

public char charAt (int indice) retorna o caracter na posio dada por indice.
public int campareTo (String var) compara uma string com parmetro String
var e retorna zero se ambas forem iguais, um nmero negativo se a String for menor e um
nmero positivo se for maior.
public static String CopyValueOf (char []) - retorna uma String com o
contedo do array de caracteres var.
public boolean equals (object o ) - verifica se o uma string com a mesma
seqncia de caracteres.
Public boolean equalsIgnoreCase (String var) compara uma string com a
String var. As diferenas entre maisculas e minsculas so ignoradas.
Public int length () - retorna o comprimento da string.
Public int indexOf (int var) retorna o ndice da primeira ocorrncia do caracter
var.
public int indexOf (int var, int incio) - retorna a ndice da primeira
ocorrncia do caracter var a partir de nicio.
public char [] toCharArray () - retorna um array com os caracteres da string.
Public String toLowerCase () - retorna uma cpia da string com todas as letras
convertidas para minsculas.
public String toUpperCase () - retorna uma cpia da string com todas as letras
convertidas para maisculas.
public String trim () - elimina os espaos em branco no incio e no fim da string.

Exemplos:
String nome = Rafael;
if (nome.equals(rafael.toUpperCase()))...
char [] teste = nome.toCharArray();

2. Classe que representa datas - java.util.date

A classe java.util.Date representa datas.

Construtores

new Date() - cria uma data que representa o momento de sua criao.
new Date(long tempo) - cria uma data com o tempo em milessegundos aps 1de janeiro
de 1970.


Principais mtodos

public long getTime() - retorna os milessegundos da data.
public void setTime (long temp) especifica a data com o tempo em
milessegundos.
public boolean before(Date data) - retorna true se data anterior a data.
public boolean after(Date data) - retorna true se data posterior a data.
public int compareTo(Date data) - retorna 0 se a data igual a data,um nmero
negativo se anterior e um positivo se posterior.

Exemplos:
Date data1 = new Date();
Date data2 = new Date();
System.out.println(Resposta: + data1.after(data2));


217
3. Classes de Entrada e Sada

java.io.BufferedReader filtro que age sobre um Reader, adicionando um buffer e
otimizando o acesso aos dados.

Construtores

new BufferedReader(Reader rd) - constri um BufferedReader a partir de um
Reader rd, com buffer de tamanho default.

Principais mtodos

public int read() throws IOException l um caractere da entrada-padro.
public int read(char[]c,int incio, int quant)throws IOException l
uma seqncia quant de caracteres e a coloca no array c a partir da posio dada por incio.
Retorna o nmero de caracteres lidos (-1 se no houver caracteres para ler).
public String readLine()throws IOException l uma linha de caracteres.
public void close()throws IOException fecha o Reader.

Exemplos:
BufferedReader arq;
arq = new BufferedReader(new FileReader(arquivo));
String linha;
try {
linha = arq.readLine();
} catch(IOException e){}


java.io.BufferedWriter filtro que age sobre um Writer, adicionando um buffer e
otimizando o acesso aos lados.

Construtores

new BufferedWriter(Writer wr) - constri um BufferedWriter a partir de um
Writer wr,com buffer de tamanho default.

Principais Mtodos

public void Write()throws IOException escreve um caracter na sada.
public void writer(char[]c,int incio, int quant)throws IOException
escreve quant,caracteres no array c a partir da posio dada por inicio.
public void newLine()throws IOException inicia uma nova linha.
public void flush()throws IOException descarrega a sada, forando a escrita de
caracteres que eventualmente estejam no buffer.
public void close()throws IOException fecha o Writer.

Exemplo:

BufferedWriter sada;
sada = new BufferedWriter (new FileWriter(arquivo);
String linha = linha do texto;
try {

saida.write(linha,0,s.lengt());
saida.newLine();
} catch (IOException e){}


218
java.io.RandomAccessFile - um stream de entrada e sada especfico para arquivos,
cujo acesso no precisa ser seqncial. Permite especificar se o modo de acesso ser somente para
leitura ou para escrita e leitura.

Construtores

public RandomAccessFile(String arq,String modo) throws IOException
cria um objeto para acesso a arquivo e o associa ao arquivo especificado em arq;modo especifica o
modo de acesso que pode ser: r(somente para leitura) ou rw(leitura e escrita).
public RandomAccessFile(String arq,String modo) throws IOException
cria um objeto para acesso a arquivo e o associa ao arquivo especificado por arq;modo especifica o
modo de acesso que pode ser: r (somente para leitura) ou rw (leitura e escrita).

Principais mtodos

public int read() throws IOException l um byte do arquivo.
public int read(byte[]x) throws IOException l um array de bytes do arquivo,
se houver informaes e retorna o nmero total de bytes lidos, se no retorna -1.
public int read(byte[]x,int incio,int qtd) throws IOException l uma
seqncia de qtd bytes e a coloca no array x a partir da posio dada por incio.Retorna o
nmero de bytes lidos ou ento -1.
public int readLine() throws IOException l uma linha de caracteres do arquivo.
public int skipBytes(long x) throws IOException descarta x bytes da
entrada e retorna nmero de bytes que foram descartados.
public void seek(long x) throws IOException posiciona o cursor de
leitura/escrita na posio x do arquivo (em bytes).
public long getFilePointer() throws IOException retorna a posio corrente
do cursor, em bytes.
public long skipBytes(long x) throws IOException descarta x bytes da
entrada.
public long length() throws IOException retorna o tamanho do arquivo em
bytes.
public void setlength(long x) throws IOException especifica o tamanho do
arquivo em bytes.
public void write()throws IOException escreve um byte no arquivo.
public void write(byte []b)throws IOException escreve um array de bytes no
arquivo.
public void write(byte[]x,int incio,int qtd) throws IOException
escreve a quantidade de bytes determinados por qtd bytes do array x a a partir da posio
determinada por incio no arquivo.
public void close()throws IOException fecha o arquivo.


4. File

A classe java.io.file representa um arquivo ou um diretrio.

Construtores

new File(String path) - cria um objeto File que representa um arquivo na patch
especificado.
new File(String dir,String nome) - cria um o objeto File que representa um arquivo
no diretrio dir com o nome especificado.
public File(File dir,String nome) - cria um objeto File que representa um arquivo
no diretrio dir com o nome especificado.

Principais mtodos

public boolean canRead() - verifica se o arquivo pode ser lido.
219
public boolean canWrite() - verifica se o arquivo pode ser escrito.
public int compareTo(File x) compara o path com o de outro arquivo
determinado por x e retorna 0 se ambos forem iguais.
public void delete() - apaga o arquivo associado a esse objeto.
public boolean exists() - verifica a existncia do arquivo ou diretrio.
public Starting getName() - retorna o nome do arquivo ou diretrio.
public String getPath() - retorna o path do objeto.
public boolean isDirectory() - verifica se o objeto representa um diretrio.
public boolean isFile() - verifica se o objeto representa um arquivo.
public long length() - retorna o tamanho do arquivo.
public String[] list() - retorna a lista de arquivos se o objeto representar um
diretrio.
public void mkdir() - cria um diretrio.
public void renameTo(File x) renomeia um arquivo ou diretrio de acordo com o
nome determinado por x.

220
Anexo C

Classes do pacote Swing

Introduo

Este captulo aborda a utiliza
o de classes j disponveis no Java, apropriadas para a criao de aplicaes grficas, conhecidas
inicialmente como pacote AWT Abstract Window Toolkit. Entretanto, como tudo tem sua evoluo, o
pacote AWT foi substitudo pelo swing pertencente biblioteca JFC (Java Foundation Classes),
portanto o swing uma extenso das classes AWT, sendo parte integrante do Java 2. por este motivo
este captulo dar enfoque s classes do swing que possuem diversas vantagens e muitos
aprimoramentos em relao s classes da AWT melhor aparncia, melhor tratamento de eventos,
recursos estendidos entre outros.
A diferena bsica entre as classes do swing em relao s do pacote AWT est na presena
da letra J antes do incio do nome da classe. Por exemplo: para inserir um boto do pacote AWT ,
usada a classe Button, j para usar um boto do pacote swing usada a classe JButton. O mesmo
vale para todas as classes do swing, pois todas iniciam com J.
As aplicaes grficas so aquelas que possibilitam a criao de uma GUI (Graphical User
Interface Interface Grfica do Usurio). Ao desenvolver uma aplicao dotada de uma GUI,
necessrio definir quais componentes sero utilizados e qual a disposio que eles tero na janela. O
swing possui inmeras classes que podem ser utilizadas na construo da GUI. Nesse ponto, a
linguagem comea a ficar mais interessante, pois abandonada a tela montona do shell (DOS ou
LINUX), partindo para janelas grficas. Ao projetar uma aplicao grfica, necessrio definir todos
os componentes que sero utilizados, quais seus objetivos e sua posio na janela.
Neste captulo sero abordados os componentes mais utilizados na criao de janelas. Um
componente da GUI um objeto visual (criado a partir de classes Java) que possibilita ao usurio
realizar a interao com a aplicao por meio do mouse e do teclado. Os componentes mais comuns
so: etiquetas, botes, caixas de texto, barras de rolagem, menus, objetos de mltipla escolha, entre
outros. Conforme ser apresentado, cada um dos componentes possui propriedades que podem ser
alteradas em tempo de desenvolvimento ou execuo (cor, tamanho, fonte, etc), assim como em
outras linguagens de programao. Todas as classes do swing so extenses do pacote AWT que,
por sua vez, so extenses da classe java.lang.Object, a superclasse de todas as classes do Java.

Todas as classes que sero elaboradas neste captulo necessitam de diversas classes
externas, tanto do pacote swing como do AWT. Por este motivo todos os exemplos apresentados
tero trs linhas com a diretiva import apontando para as classes externas, conforme as declaraes
seguintes:

n) import java.awt.*; - permite a utilizao de diversas classes do pacote AWT, alm de possuir
uma srie de constantes numricas.
o) Import java.awt.event.*; - usado para o processamento dos eventos que ocorrero na janela, tais
como: click do mouse, ENTER do campo texto, etc.
p) Import javax.swing.*; - permite a utilizao de diversas classes do pacote swing.


Criao de Frames

Frame o componente do pacote AWT responsvel pela criao de janelas parecidas com as
encontrada em aplicativos do ambiente Windows. O componente frame gera uma janela com barra de
ttulo, bordas e pode ter outros componentes em seu interior. Imagine o componente frame como uma
folha de projetos em que so inseridos diversos objetos. Em conjunto com esses objetos, o
componente frame gera uma visualizao grfica de um determinado aplicativo.
O exemplo1 demonstra a criao de uma janela por intermdio da classe JFrame do pacote
swing.


import java.awt.*;
import java.awt.event.*;
221
import javax.swing.*;

class ExIntGrafica1 extends JFrame{
ExIntGrafica1(){ //construtor
setTitle("Exemplo sobre interface grfica"); //titulo da janela
setSize(400,50); //dimensoes da janela (largura e comprimento)
setLocation(150,150); //canto esquerdo e topo da tela
setResizable(false); //a janela no pode ser redimensionada
getContentPane().setBackground(Color.gray); // cor de fundo da
janela
}
public static void main(String args[]) {
JFrame janela = new ExIntGrafica1(); //declaracao e inicializacao do
objeto janela
janela.show(); //mostra a jenala na tela
WindowListener x = new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
};
janela.addWindowListener(x);
}
}

Os aspectos mais importantes do exemplo1 so:

linha 4: class ExIntGrafica1 extends Jframe{ - toda aplicao grfica necessita utilizar as
funcionalidades da classe JFrame, responsvel por controlar a exibio da janela. A palavra
extends (lembre-se do conceito de herana) informa que a classe ExIntGrafica1 ir utilizar todos
os recursos da classe JFrame. Resumindo: a classe ExIntGrafica1 herdar todas as
caractersticas da classe JFrame e ter outras caractersticas prprias, definidas pelo seu mtodo
construtor, no caso o mtodo ExIntGrafica1 (mesmo nome da classe).
Linha 6: ExIntGrafica1() - o construtor da classe que mantm uma srie de informaes a
respeito da janela a ser criada, tais como: o ttulo da janela, suas dimenses, sua localizao na
tela, a cor de fundo, entre outras. Em todas as aplicaes com janelas, o mtodo construtor define
as caractersticas que a janela ter ao ser exibida.
Linha 17: JFrame janela = new ExIntGrafica1() - declarado um objeto com o nome janela,
contendo as caractersticas da classe ExIntGrafica1 e sua inicializao realizada.
Linha 18: janela.show() - a janela apresentada na tela do mtodo show().
Linhas 20 a 27 so as instrues responsveis pelo fechamento da janela. Se esses comandos
no fosse colocados, a janela do DOS/LINUX no poderia ser fechada pelo simples pressionar do
boto fechar. A janela da aplicao Java encerrada, entretanto a janela do DOS fica travada.


A tabela 1 mostra um resumo dos mtodos mais utilizados da classe JFrame:

Mtodo Funo
JFrame()
Cria uma janela vazia
getTitle() Obtm o ttulo da janela
isResizable() Verifica se a janela ou no dimensionvel
setResizable(boolean) Especifica se a janela ou no dimensionvel
setTitle(String) Especifica o ttulo da janela
Tabela 1 resumo dos mtodos da classe JFrame


Incluso de textos e imagens na janela

Para a incluso de textos nos frames, necessrio a utilizao da classe JLabel. possvel
controlar vrias propriedades do texto a ser utilizado, tais como: alinhamento, tipo de letra, tamanho,
cor, etc. A declarao de um objeto JLabel no programa observa a seguinte sintaxe:

222
JLabel <nome do label> = new JLabel (texto do label, Jlabel.<alinhamento>)

Para incluso de imagens na janela, pode ser usada a classe ImageIcon por meio da seguinte
sintaxe:
ImageIcon <nome do cone> = new ImageIcon(caminho e nome da imagem a ser inserida). Ao
inserir o caminho do arquivo, deve ser utilizada a barra normal (/). a barra invertida (\)
considerada caractere reservado para a quebra de linha. Depois de criado o objeto que armazena
a imagem, ele deve ser inserido na janela por meio do JLabel, da mesma forma que um texto
inserido. Desse modo, o modo JLabel pode ser usado para inserir um texto, uma imagem, ou
ainda os dois ao mesmo tempo, separados por vrgula.

O exemplo2 demonstra a utilizao da classe JLabel para incluir textos e figuras em uma
janela:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class ExIntGrafica2 extends JFrame{
JLabel L1, L2, L3, L4;
ImageIcon icone = new ImageIcon("c:/Windows/Cloud.gif");

ExIntGrafica2(){ //construtor
setTitle("Inserindo Labels e Imagens na janela"); //titulo da janela
setSize(400,150); //dimensoes da janela (largura e comprimento)
setLocation(50,50); //canto esquerdo e topo da tela
getContentPane().setBackground(new Color(220,220,220)); // cor de
fundo da janela
L1 = new JLabel(" Aprendendo",JLabel.LEFT);
L1.setForeground(Color.red);
L2 = new JLabel(icone);
L3 = new JLabel("Inserir ",JLabel.RIGHT);
L3.setForeground(Color.blue);
L4 = new JLabel("Labels e imagens",icone,JLabel.CENTER);
L4.setForeground(Color.black);
getContentPane().setLayout(new GridLayout(4,1));
getContentPane().add(L1);
getContentPane().add(L2);
getContentPane().add(L3);
getContentPane().add(L4);
}
public static void main(String args[]) {
JFrame janela = new ExIntGrafica2(); //declaracao e inicializacao do
objeto janela
janela.show(); //mostra a jenala na tela
WindowListener x = new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
};
janela.addWindowListener(x);
}
}

Os aspectos mais iomportantes do exemplo2 so:

Linha 6: contm a declarao dos objetos da classe JLabel, utilizados para armazenar e
manipular o texto. Eles so alinhados durante o procedimento da inicializao por meio de
constantes inteiras predefinidas pela linguagem (JLabel.LEFT que equivale a zero,
JLabel.CENTER que equivale a um e JLabel.RIGHT que equivale a dois). Quando o alinhamento
no for especificado, o default esquerda.
Linha 7: contm a declarao de um cone que ser usado em conjunto com um label. O objeto
cone est sendo declarado e inicializado com o endereo em que a imagem se localiza a partir do
disco C da mquina.
Linha 13: define a cor de fundo da janela utilizando setBackground(new Color(220,220,220)).
Os nmeros que aparecem dentro dos parnteses se referem ao padro RGB (Red-Gree-Blue) e
223
definem as tonalidades das cores vermelha, verde e azul. Os nmeros para a tonalidade podem
variar de 0 (mnimo) a 255 (mximo) e sua mistura ir formar uma cor especfica.
Linha 15: define a cor da fonte do objeto L1. Observe a formao: L1.setForeground(Color.red).
Da esquerda para a direita essa declarao pode ser interpretada assim: para o objeto L1 utilize a
cor de fonte (setForeground) vermelha (Color.red).
Linha 16: contm a inicializao do label L2 com o objeto cone. Observe que da mesma forma
que ocorre com o texto, um objeto Label pode ser inicializado com uma imagem. Dessa forma o
label L2 ter uma imagem atrelada a ele, e no um texto.
Linha 19: contm a inicializao do label L4 como um texto e uma imagem. Esta outra variao
de um objeto label: ele pode ser inicializado com um texto, uma imagem ou ambos.
Linha 20: realiza a formatao do texto do label L4, definindo que ser utilizada a fonte serif, em
negrito e com tamanho 20. Font.BOLD tambm uma constante da linguagem Java.
Linha 22: getContentPane().setLayout(new GridLayout(4,1)) todos os componentes
visualizados nas janelas de aplicaes grficas, tais como: Labels, botes, caixas de texto, etc.,
necesitam ser inseridos em locais predefinidos da janela, conhecidos por clulas. Para dividir uma
janela em clulas, necessria a utilizao de um gerenciador de layout, ou seja, um mtodo que
controla a maneira como os componentes sero dispostos na janela. Esta uma funo de
setLayout(), ou seja, utilizado para definir como o frame ser dividido. Nesse exemplo,
setLayout() define que o frame est composto por uma grade de quatro linhas e uma coluna (4,1)
em que os componentes sero inseridos. A representao da diviso do frame pode ser
interpretada da maneira seguinte:

Clula 1
Clula 2
Clula 3
Clula 4

Neste caso a janela foi dividida em quatro clulas, em que os componentes podem ser
inseridos. Caso no fosse definido o tipo de layout a ser usado na janela, o frame seria considerado
como contendo uma s clula. Existem diversos tipos de gerenciadores de layout em Java, os quais
demonstrados medida que forem usados nos exemplos.

Linhas 22 a 26: contm o mtodo add() utilizado para adicionar componentes ao frame. Os
componentes so inseridos no frame medida que aparecem no programa. A ordem com que os
componentes so inseridos muito importante para sua correta disposio na janela. Ao usar o
add(), os componentes so inseridos linha a linha (sempre de cima para baixo). Neste exemplo a
grade possui apenas uma coluna; caso existissem mais colunas, o preenchimento seria realizado
da seguinte forma: linha1_coluna1, linha1_coluna2, linha2_coluna1, linha2_coluna2 e assim
sucessivamente. Sendo assim, o preenchimento da janela dado sempre de cima para baixo
(linhas) e da esquerda para a direita (colunas).

O exemplo2 ainda no possui nenhuma funcionalidade, apenas serve para demonstrar a
incluso de texto e imagem na janela.


A tabela 2 mostra um resumo dos mtodos mais utilizados da classe JLabel:


Mtodo Funo
JLabel() Cria um label sem texto
JLabel(String) Cria um label com o texto dado
JLabel(String,int) Cria um label com o texto e o alinhamento dados
JLabel(String,image) Cria um labelI com o texto e imagem dados
JLabel(String,image,int) Cria um label com o texto, imagem e alinhamento
dados
getText() Obtm o texto do label
224
Mtodo Funo
setText() Especifica o texto do label
Tabela 2 resumo dos mtodos da classe JLabel


Incluso de botes nas janelas

Para incluso de botes nos frames, utilizada a classe JButton. Da mesma forma que no
JLabel, muitas propriedades podem ser manipuladas em Jbutton. Observe o exemplo3 que mostra o
uso dessa classe:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class ExIntGrafica3 extends JFrame implements ActionListener{
JButton b1,b2;
ImageIcon icone = new ImageIcon("c:/Windows/Cloud.gif");

ExIntGrafica3(){ //construtor
setTitle("Inserindo botons na janela"); //titulo da janela
setSize(350,100); //dimensoes da janela (largura e comprimento)
setLocation(50,50); //canto esquerdo e topo da tela
getContentPane().setBackground(new Color(180,180,180)); // cor de
fundo da janela
b1 = new JButton("Busca", icone);
b1.setHorizontalTextPosition(AbstractButton.LEFT);
b1.setBackground(new Color(100,180,180));
b1.setForeground(Color.black);
b1.setFont(new Font ("ScriptS",Font.BOLD,20));
b1.setEnabled(true);
b1.addActionListener(this);
b1.setToolTipText("Pressione aqui para fazer uma busca");
b1.setMnemonic(KeyEvent.VK_B);
b2 = new JButton("Cancelar");
b2.addActionListener(this);
b2.setMnemonic(KeyEvent.VK_C);
b2.setToolTipText("Pressione aqui para cancelar");
getContentPane().setLayout(new FlowLayout());
getContentPane().add(b1);
getContentPane().add(b2);
}

public void actionPerformed(ActionEvent e){
//metodo implementado pelo ActionListener
if (e.getSource() == b1){
System.out.println("Botao 1 pressionado");
}
if(e.getSource() == b2){
System.out.println("Botao 2 pressionado");
}
}
public static void main(String args[]) {
JFrame janela = new ExIntGrafica3(); //declaracao e inicializacao do
objeto janela
janela.show(); //mostra a jenala na tela
WindowListener x = new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
};
janela.addWindowListener(x);
}
}


Os aspectos mais importantes do exemplo3 so:
225

Linha 5: (implements ActionListener) em qualquer aplicao em que asaes do
usuriodevem ser interpretadas quando eles interagem com a janela (clicar num boto, por
exemplo), necessria a implementao de uma interface. Neste exemplo foi utilizada a interface
ActionListener. Como ser visto mais adiantem outras interfaces podem ser utilizadas. Quando
uma implementao de interface utilizada, torna-se obrigatrio inserir na aplicao um ou vrios
mtodos que que realizaro o processamento dos eventos. Ao contrrio das linguagens de
programao visuais (como Delphi, Visual Basic entre outras), no existe um mtodo separado
para cada evento gerado em uma janela. Em Java, existe a presena de apenas alguns mtodos,
comuns a todos os componentes, e actionPerformed um deles. Devido ao fato de no existir
um mtodo para cada evento dos componentes de uma janela, dentro do mtodo
actionPerformed necessrio verificar qual dos componentes responsvel pela gerao do
evento. Em outras palavras, necessrio reconhecer em qual componente o usurio clicou, ou
deu ENTER e assim por diante. As linhas 29 a 39 executam a tarefa de reconhecer qualdos
botes foi pressionado.
Linha 15: da mesma forma que u label, um objeto do tipo boto pode ser incializado de trs
maneiras: somente com um texto 9 o ttulo do boto), com uma imagem ou com ambos. Esta linha
inicializa o boto com um texto e uma imagem, definida na linha 8.
Linha 16:define a posio do texto em relao imagem inserida no boto pelo mtodo
setHorizontalTextPosition. Essa propriedade deve ser definida quando o boto possuir imagem
e texto ao mesmo tempo. O default o texto aparecer ao lado direito da imagem. Isso pode ser
modificado por meio da constante LEFT que far o texto aparecer ao lado esquerdo da imagem.
De maneira semelhante pode ser definido o alinhamento vertival do texto pelo mtodo
setVerticalTextPosition, usando as constantes (TOP topo) ou BOTTOM (abaixo).
Linha 17:define a cor do fundo do boto por meio do mtodo setBackground da mesma forma
que um label ou qualquer outro objeto utilizado em uma janela.
Linha 18:define a cor do ttulo do boto (cor do texto) por meio do mtodo setForeground da
mesma forma que um label ou qualquer outro objeto utilizado em uma janela.
Linha 19: define a fonte do ttulo do boto pelo mtodo setFont. Neste exemplo a fonte definida
do tipo AcriptS, em egrito (Font.BOLD) e de tamanho 20.
Linha 20: define que o boto est habilitado (true) pelo mtodo setEnabed. Essa condio
default, uma vez que todos os botes ao serem inicializados j esto habilitados. Sendo assim, ela
no necessitaria ter sido definida. Para definir que um boto fique desativado, basta colocar false
dentro dos parnteses.
Linha 21: registra o boto B1 para que o evento seja gerado por ele. Todo objeto inserido em um
frame deve ser registrado para que os eventos gerados pro ele sejam reconhecidos. Se um objeto
no for registrado, ele no ter nenhuma ao; ficar apenas como uma imagem esttica. Dessa
forma necessrio registrar os objetos e essa a funo do mtodo addActionListener(this).
Assim com o boto B1, todo boto deve ser adicionado ao processador de eventos. Se esse
mtodo no for invocado, o boto no poder realizar nenhuma funo e ser um boto
inoperante. Em outras palavras, todo boto que recebe um clique para realizar alguma funo
necessita invocar o mtodo addActionListener, de forma que o mtodo actionPerformed (linha
33) possa reconhec-lo.
Linhas 16 e 17:os mtodos setBackground e setForeground so, respectivamente, usados para
trocar a cor do fundo e a cor do texto de um boto.
Linha 22:adidiona uma mensagem ao boto por meio do mtodo setToolTipText. Quando o
ponteiro do mouse parar sobre o boto, essa mensagem ser mostrada. Esse mtodo pode ser
usado tambm em outros tipos de boto (CheckBox, Radio, etc.).
Linha 23:adiciona uma letra sublinhada ao ttulo do boto pelo mtodo setMnemonic.
Pressionando a tecla ALT em conjunto com a tecla B, o boto acionado, como se o mouse
tivesse clicado sobre ele. Esse mtodo tambm pode ser usado em outros tipos de boto ou
menus.
Linhas 24 e 25: inicializam o boto B2.
Linha 28: define o gerenciador de layout utilizado na janela como sendo do tipo seqncia de
fluxo: setLayout(new FlowLayout(). FlowLayout outro tipo de gerenciador de layout utilizado
para controlar o layout dos componentes inseridos na janela. o mais simples dos gerenciadores
de layout, pois os componentes so arranjados da esquerda para a direita na ordem em que so
adicionados ao frame. Se no houver mais espao na linha formada pelos componentes
adicionados, criada outra linha abaixo desta, seguindo o mesmo critrio de formao. O
gerenciador FlowLayout() possibilita que os componentes sejam distribudos em linhas, como os
editores de texto fazem com as palavras de um pargrafo, isto , preenchem a linha at que haja
226
espao; ao terminar o espao, muda para a linha abaixo. As linhas 29 e 30 adicionam os botes
janela, primeiro o B1 e depois o B2.
Linha 33: contm o mtodo que recebe todas as aes disparadas na janela, ou seja, todos os
eventos gerados a partir da interao do usurio com a aplicao. Esse mtodo deve ser
declarado como: public void actionPerformed(ActionEvent e), o qual responsvel por
reconhecer todas as aes do usurio sobre a janela. Sua utilizao obrigatria quando o frame
implementa a interface ActionListener, definida na linha 5. a letra e declarada como um objeto
da classe ActionEvent e receber todos os chamados aos eventos da janela. Todos os eventos
gerados sero tratados por esse mtodo actionPerformed e o objeto ActionEvent ser
responsvel por definir qual objeto gerou esse evento.
Linha 35: contm a declarao if (e.getSource() == B1) que quer dizer: se o objeto-fonte do
evento (e.getSource()), isto , se o objeto que gerou o evento for o boto B1. Dessa forma
reconhecido o objeto ActionEvent, no caso, o objeto e. Caso essa comparao seja verdadeira,
ser impressa uma mensagem indicando que o boto 1 foi pressionado (linha 37). os mesmos
procedimentos ocorrem por meio das linhas 39 a 42 para o boto B2.


A tabela 3 mostra um resumos dos mtodos mais utilizados da classe JButton:


Mtodo Funo
Button() Cria um boto sem texto
Button(String) Cria um boto com texto dado
Button(String, image) Cria um boto com texto e imagem dados
getLabel() Obtm o texto do boto
setLabel(String) Especifica o texto do boto
setEnabled(boolean) Define se o boto est habilitado (true) ou
desabilitado (false)
setHorizontalTextPosition() Define o tipo de alinhamento horizontal do texto
em relao a uma imagem. Pode assumir LEFT
(esquerda) ou RIGHT (direita)
setMnemonic Define uma letra que ser usada como
acionadora do evento click, em conjunto com a
tecla ALT.
setToolTipText Possibilita atrelar uma mensagem ao boto.
Quando o ponteiro do mouse estaciona sobre o
boto, a mensagem apresentada.
setVerticalTextPosition() Define o tipo de alinhamento vertical do texto em
relao a uma imagem. Pode assumir TOP (topo)
ou BOTTOM (abaixo)
Tabela 3 resumo dos mtodos da classe JButton


Incluso de caixas de texto

Para incluso de caixas de texto nos frames, utilizada a classe JtextField que tambm
possui vrias propriedades que podem ser modificadas. O exemplo4 demonstra o uso desta classe
para simular uma simples calculadora em que o usurio digita dois nmeros em dois JtextFields e
clica em um dos quatro botes existentes no frame (+, -, *, /) para realizar um clculo. Este exemplo
agrupa as classes JFrame, JLabel e JButton, estudadas at aqui.


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class ExIntGrafica4 extends JFrame implements ActionListener{
JLabel L1, L2, L3;
227
JButton B1,B2,B3,B4,B5;
JTextField T1, T2, T3;

public static void main(String args[]){
JFrame janela = new ExIntGrafica4();
janela.show();
WindowListener x = new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
};
janela.addWindowListener(x);
}

ExIntGrafica4(){
setTitle("Calculadora");
setSize(350,90);
setLocation(50,50);
getContentPane().setBackground(new Color(150,150,150)); // cor de
fundo da janela
getContentPane().setLayout(new GridLayout(3,4)); // 3 linhas e 4
colunas
L1 = new JLabel("Num.1");
L1.setForeground(Color.black);
L1.setFont(new Font("",Font.BOLD,14));
L2 = new JLabel("Num.2");
L2.setForeground(Color.black);
L2.setFont(new Font("",Font.BOLD,14));
L3 = new JLabel("Total");
L3.setFont(new Font("",Font.BOLD,14));
B1 = new JButton("+");
B1.addActionListener(this);
B2 = new JButton("-");
B2.addActionListener(this);
B3 = new JButton("x");
B3.addActionListener(this);
B4 = new JButton("/");
B4.addActionListener(this);
B5 = new JButton("Limpar");
B5.addActionListener(this);
B5.setBackground(Color.black);
B5.setForeground(Color.white);
T1 = new JTextField();
T2 = new JTextField();
T3 = new JTextField();
T3.setEditable(false); //define que o textField como seomente
leitura
getContentPane().add(L1);
getContentPane().add(T1);
getContentPane().add(B1);
getContentPane().add(B2);
getContentPane().add(L2);
getContentPane().add(T2);
getContentPane().add(B3);
getContentPane().add(B4);
getContentPane().add(L3);
getContentPane().add(T3);
getContentPane().add(B5);
}

public void actionPerformed(ActionEvent e){
if(e.getSource() == B5){
T1.setText("");
T2.setText("");
T3.setText("");
return;
}
float N1=0,N2=0,result = 0;
228
try{
N1 = Float.parseFloat(T1.getText());
N2 = Float.parseFloat(T2.getText());
}catch(NumberFormatException erro){
T3.setText("Erro!");
return;
}
if (e.getSource() == B1){ //botao somar
result = N1 + N2;
}
if (e.getSource() == B2){ //botao subtrair
result = N1 - N2;
}
if (e.getSource() == B3){ //botao multiplicar
result = N1 * N2;
}
if (e.getSource() == B4){ //botao dividir
result = N1 / N2;
}
T3.setText(""+result);
}

}

Os aspectos mais importantes do exemplo 4 so:

ll) Observe que o mtodo main sempre foi inserido por ltimo nos exemplos anteriores, dessa vez
aparece antes do mtodo construtor. Isso no representa nenhum problema, pois a ordem tanto
faz, uma vez que os mtodos so separados uns dos outros pelas chaves de abertura e
encerramento. A posio em que os mtodos so declarados na classe tanto faz,
mm) linha 9: declara as trs caixas de texto usadas na aplicao (T1, T2, T3)
nn) As linhas 36 a 40 inicializam e registram os cinco botes utilizados na aplicao.
oo) Linha 42: inicializa as caixas de texto em branco, isto , as caixas de texto aparecem sem
nenhum texto. A caixa de texto pode ser inicializada com um texto default se necessrio, por
exemplo: T1 = new JTextField(Linguagem Java). A dimenso da caixa de texto pode ser
controlada com a utilizao de um nmero inteiro dentro dos parnteses, por exemplo T1 = new
JTextField(25). Entretanto, isso vlido somente quando o gerenciador de layout utilizado no
frame for FlawLayout, pois ao utilizar GridLayout a caixa de texto assume o tamanho da clula,
independentemente do tamanho utilizado.
pp) Linha 43: T3.setEditable(false) esse recurso utilizado para que a caixa de texto, no caso
T3, no possa ser alterada pelo usurio. uma forma de fazer coma que a caixa de texto seja
somente leitura.
qq) Linhas 44 e 49: adicionam todos os objetos janela, exatamente na ordem em que
aparecem.
rr) Linhas 52 a 79: possuem o mtodo actionPerformed que utilizado para manipular todas as
aes da aplicao. Conforme j citado, esse mtodo recebe um ActionEvent usado para
verificar e reconhecer qual foi o objeto que disparou o evento.
ss) Linha 54: se foi pressionado o boto limpar (if e.getSource() == B5), ento todas as caixas de
texto so limpas (setText()). A instruo return 57 encerra o mtodo actionPerformed, isto ,
nenhuma instruo abaixo no cdigo ser executada.
tt) Linhas 60 a 64: realizam a converso dos valores digitados em valores numricos, uma vez que o
contedo de um objeto JTextField um texto e no pode ser usado diretamente para a realizao
de clculos matemticos. Caso haja algum erro de converso, no caso do usurio no ter digitado
um valor numrico, uma mensagem de erro ir aparecer no campo T3 (linha 67).
uu) para cada operao disponvel na calculadora existe e.getSource com a funo de
reconhecer o evento gerado.
vv) Linha 78: T3.setText(+result) a varivel result utilizada para armazenar o resultado da
operao escolhida pelo usurio, porm trata-se de uma varivel numrica que no pode ser
inserida diretamente em uma caixa de texto. Esta linha demonstra como simples a converso de
nmero em texto por meio de + result, ou seja, o resultado da operao concatenado com
um texto vazio. Quando um nmero concatenado com um texto, o resultado final transforma-se
em texto.
ww) Ressalta-se que toda vez que for necessrio ler o contedo de um campo texto, utiliza-se o
mtodo getText() e toda a vez que for necessrio armazenar algo no campo texto, usa-se o
229
mtodo setText().



A tabela 4 mostra um resumo dos mtodos mais utilizados da classe JTextField:


Mtodo Funo
JTextField() Cria uma caixa de texto vazia
JTextField(String) Cria uma caixa de texto com a String dada
JtextField(String, int) Cria uma caixa de texto com a String e a
quantidade de colunas especificada
JTextField(int) Cria uma caixa de texto com a quantidade de
colunas especificada
getText() Obtm o texto do objeto
getSelectedText() Obtm o texto selecionado no objeto
IsEditable() Verifica se o componente editvel ou no
selectAll() Seleciona todo o texto
setEditable(boolean) Especifica se o componente editvel ou no
setText() Especifica o testo a ser contido no componente.
Tabela 4 resumo dos mtodos da classe JTextField


Incluso de caixas de senha

Para incluso de caixas de senha nos frames, utilizada a classe JpasswordField.O
funcionamento da classe JpasswordField praticamente o mesmo da classe JTextField. A
diferena que o caracter digitado substitudo por outro caractere para esconder a senha digitada.
O caractere default que aparece no momento da digitao o *, entretanto qualquer caractere pode
ser definido pelo mtodo setEchoChar().
O exemplo 5 traz um aplicativo que reconhece e aceita a digitao de uma senha e quando o
usurio pressiona a tecla ENTER sobre o JPasswordField, sem a necessidade do uso de botes.
Assim como possvel registrar um boto para gerar um evento, tambm possvel registra um
campo texto ou um campo de senha. Este aplicativo simula uma tela de entrada em algum sistema,
em que o usurio digita uma senha. A aplicao imprimir uma mensagem que mostra se a senha foi
ou no aceita. O exemplo compara a palavra digitada com a palavra JAVA para verificar a validade
da senha.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class ExIntGrafica5 extends JFrame implements ActionListener{
JLabel L1, L2;
JTextField T1;
JPasswordField P1;

public static void main(String args[]){
JFrame janela = new ExIntGrafica5();
janela.show();
WindowListener x = new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
};
janela.addWindowListener(x);
}

ExIntGrafica5(){
230
setTitle("Verifica Senha");
setSize(350,65);
getContentPane().setBackground(new Color(150,150,150)); // cor de
fundo da janela
getContentPane().setLayout(new GridLayout(2,2)); // 3 linhas e 4
colunas
L1 = new JLabel("Digite a SENHA:");
L2 = new JLabel("Validao:");
L1.setForeground(Color.black);
L2.setForeground(Color.black);
L1.setFont(new Font("",Font.BOLD,14));
L2.setFont(new Font("",Font.BOLD,14));
T1 = new JTextField();
T1.setForeground(Color.red);
P1 = new JPasswordField();
P1.setEchoChar('*');
P1.addActionListener(this); //registra P1
getContentPane().add(L1);
getContentPane().add(P1);
getContentPane().add(L2);
getContentPane().add(T1);
}

public void actionPerformed(ActionEvent e){
try{
if(P1.getText().equals("JAVA"))
T1.setText("Senha vlida");
else
T1.setText("Senha invlida");
}catch(Exception erro){}
}

}

Os aspectos mais importantes do exemplo 5 so:

11. Linha 9: declara P1 como sendo um objeto da classe JPasswordField.
12. Linha 37: inicializa o objeto JPasswordField com o contedo vazio, exatamente como feito com
um objeto do tipo JTextField.
13. Linha 38: define o caractere que substituir o caractere digitado. Se essa linha no for declarada,
o caractere * ser usado.
14. Linha 39: registra o objeto P1 para gerar um evento, da mesma forma que um boto registrado.
Esse evento ser gerado quando o usurio pressionar ENTER quando o foco estiver sobre o
objeto P1.
15. Linha 46: realiza a comparao do texto digitado com a senha JAVA. Caso o texto digitado e a
senha sejam iguais, o campo T1 receber a mensagem Senha vlida (linha 47); caso contrrio,
T1 receber Senha invlida (linha 49). Observe que no mtodo actionPerformed no existe a
necessidade de verificar qual foi o objeto gerador do evento, uma vez que apenas o objeto P1 foi
registrado na aplicao, ou seja, apenas o objeto P1 poder gerar eventos e, conseqentemente,
invocar o mtodo actionPerformed.



Formatao de caixas de texto

Em muitos casos torna-se necessrio realizar a formatao das caixas de texto,
principalmente quando valores numricos so inseridos. Para realizar a formatao, podem ser
utilizadas diversas classes da linguagem Java. Este item apresenta um exemplo bem simples de
formatao de um nmero inteiro e de um nmero de ponto flutuante (double). Observe o exemplo 6.

231
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.text.NumberFormat;

class ExIntGrafica6 extends JFrame implements ActionListener{
JTextField T1,T2;
double valor1 = 1000.54;
int valor2 = 100;
NumberFormat df1, df2;

public static void main(String args[]){
JFrame janela = new ExIntGrafica6();
janela.show();
WindowListener x = new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
};
janela.addWindowListener(x);
}

ExIntGrafica6(){
setTitle("Formatando nmeros");
setSize(350,65);
getContentPane().setBackground(new Color(150,150,150)); // cor de
fundo da janela
getContentPane().setLayout(new GridLayout(1,2)); // 3 linhas e 4
colunas
df1 = NumberFormat.getNumberInstance();
df1.setMinimumFractionDigits(4);
df2 = NumberFormat.getNumberInstance();
df2.setMinimumFractionDigits(4);
T1 = new JTextField();
T2 = new JTextField();
T1.setText(""+df1.format(valor1));
T2.setText(""+df2.format(valor2));
getContentPane().add(T1);
getContentPane().add(T2);
}

public void actionPerformed(ActionEvent e)
{}
}

Os aspectos mais importantes do exemplo 6 so:

14. Linha 4: para realizar a formatao de nmeros, deve ser importada a classe NumberFormat
(existem outras como DecimalFormat) da classe Text.
15. Linha 10: declara dois objetos df1 e df2 que sero instncias da classe NumberFormat. Esses
objetos recebero algumas configuraes usadas na formatao de nmeros.
16. Linhas 32 e 34: inicializam os objetos df1 e df2 coma instncia default da mquina do usurio,
definida pelo sistema operacional.
17. Linhas 33 e 35: definem a quantidade de casas que ser usada na formatao do nmero.
18. Linhas 38 e 39: formatam o nmero de acordo com o formato definido nas 33 e 35 pelo mtodo
format.
19. Linha 43: apesar de este exemplo no gerar evento, deve ser declarado o mtodo
actionPerformed, pois a classe ExIntGrafica6 est implementando a interface actionListener.
Se Implements ActionListener for retirada da linha 5, o mtodo actionPerformed tambm pode
ser retirado (linhas 43 e 44).


232

Incluso de listas de seleo

As listas de seleo so objetos que possibilitam a escolha de um ou vrios valores
armazenados em uma lista de opes. Essa lista manipulada a partir da classe JList. Para
utilizao e melhor desempenho das lista de seleo, torna-se necessrio realizar alguns
procedimentos, conforme a listagem seguinte:

16) Declarar um objeto para instanciar a classe JList
17) Declarar um objeto que conter a lista das opes e adicionar a eles todas as opes.
18) Inicializar o objeto do item 1 com o objeto do item 2.
19) Criar um painel de rolagem.
20) Adicionar o objeto do item 1 ao painel de rolagem.

O exemplo7 demonstra como criar uma lista seguindo os procedimentos anteriores. Neste
exemplo so usados os principais mtodos envolvidos coma manipulao de listas de seleo. O
usurio pode adicionar itens lista (digitando na caixa de texto e pressionando ENTER), remover
itens, verificar o ndice selecionado e verificar a quantidade de itens existentes na lista.


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

class ExIntGrafica7 extends JFrame implements ListSelectionListener,
ActionListener{
JLabel L1;
JList lista;
JTextField T1;
JButton bquant, bindice,bclear;
DefaultListModel listModel;

public static void main(String args[]) {
JFrame janela = new ExIntGrafica7(); //declaracao e inicializacao do
objeto janela
janela.show(); //mostra a janela na tela
WindowListener x = new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
};
janela.addWindowListener(x);
}

ExIntGrafica7(){ //construtor
setLocation(300,100); //canto esquerdo e topo da tela
setTitle("Uso do JListBox"); //titulo da janela
setSize(200,250); //dimensoes da janela (largura e comprimento)

T1 = new JTextField();
T1.addActionListener(this);
L1 = new JLabel("Sem selecao");
L1.setForeground(Color.black);
bquant = new JButton("Quantidade de itens");
bquant.addActionListener(this);
bindice = new JButton("Indice selecionado");
bindice.addActionListener(this);
bclear = new JButton("Remove item");
bclear.addActionListener(this);
listModel = new DefaultListModel();
listModel.addElement("banana");
listModel.addElement("pera");
listModel.addElement("maca");
listModel.addElement("uva");
lista = new JList(listModel);
233
lista.addListSelectionListener(this); //registra a lista
JScrollPane painel = new JScrollPane(lista);
getContentPane().setLayout(new GridLayout(6,1));
getContentPane().add(L1);
getContentPane().add(T1);
getContentPane().add(painel);
getContentPane().add(bquant);
getContentPane().add(bindice);
getContentPane().add(bclear);
}
public void actionPerformed(ActionEvent e){
//metodo implementado pelo ActionListener
if (e.getSource() == T1){
listModel.addElement(T1.getText()); //adiciona itens a lista
T1.setText("");
}
if(e.getSource() == bquant){
T1.setText("Quantidade: "+listModel.getSize());
}
if(e.getSource() == bindice){
T1.setText("Indice selecionado: "+lista.getSelectedIndex());
}
if(e.getSource() == bclear){
int index = lista.getSelectedIndex();
L1.setText("Removido: "+lista.getSelectedValue());
listModel.remove(index);
}
}
public void valueChanged(ListSelectionEvent e){
L1.setText("Selecionado: "+lista.getSelectedValue());
}
}


Os aspectos mais importantes do exemplo7 so:

Linha 4: importa o pacote javax.swing.event para a manipulao dos eventos do JList. Cada vez
que o usurio escolhe um item da lista gerado um evento que ser tratado pelo mtodo
valueChanged (linha 80).
Linha 7: contm a implementao de duas interfaces: ActionListener e ListSelectionListener
(para tratamento dos eventos do JList). A implementao da interface ListSelectionListener se
faz necessria para que as opes do JList possam ser reconhecidas medida que o usurio
realiza a escolha, da mesma forma que foi implementada a interface ActionListener para o
componente JButton. Quando a interface ListSelectionListener utilizada, torna-se obrigatria a
declarao do mtodo valueChanged.
Linha 11: Declara lista como sendo um objeto da classe JList.
Linha 13: declara listModel como sendo sendo um objeto da classe DeafultListModel os itens
de um JList devem ser armazenados inicialmente em um objeto do tipo DefaultListModel para
depois serem inseridos na lista, portanto esse objeto ir conter todas as opes da lista. Observe
as linhas 44 a 49: o objeto listModel inicializado, as opes so adicionadas e ele adicionado
ao objeto JList.
Linha 50: lista.addListSelectionListener(this) para que a opo escolhida seja reconhecida no
momento da ao do usurio, o mtodo addListSelectionListener deve ser invocado, registrando
o objeto da mesma forma que feito com um boto. Desta forma possvel que o programa
realize uma ao no momento que a opo for escolhida.
Linha 51: JscroolPane painel = new JscroolPane(lista) declara e inicializa um objeto
chamado painel coma lista criada a partir da classe JList. Esse objeto painel do tipo painel de
rolagem, criado a partir da classe JScroolPane. A lista deve ser adicionada a um painel de
rolagem para que seja possvel navegar pelas opes existentes.
Linha 65: contm o mtodo addElement responsvel por inserir um elemento (opo) na lista.
Observe que os elementos adicionados so inseridos no objeto listModel e no no objeto lista. No
caso, est sendo inserido na lista o texto contido no campo T1:
listModel.addElement(T1.getText()).
Linha 69: verifica a quantidade de elementos existente na lista pelo mtodo getSize():
T1.setText(Quantidade: +listModel.getSize()). Esse mtodo retornar um nmero inteiro
234
correspondente quantidade de elementos que ser inserida no campo T1.
Linha 71: verifica qual dos elementos da lista est selecionado pelo mtodo getSelectedIndex():
T1.setText(Indice selecionado + lista.getSelectedIndex()). Esse mtodo retornar um nmero
inteiro correspondente ao elemento selecionado, em que o primeiro elemento ter ndice 0, o
segundo ndice 1 e assim sucessivamente. Esse mtodo torna-se importante no sentido de
reconhecer qual das opes o usurio escolheu. Por exemplo: suponha que numa lista existam as
opes dinheiro, cheque, carto. Dependendo da escolha feita pelo usurio, possvel realizar
procedimentos diferentes no programa, como, por exemplo, dar um desconto caso o pagamento
escolhido seja em dinheiro.
Linha 75: contm o mtodo getSelectedValue() que retorna o texto do elemento selecionado na
lista. Enquanto o mtodo getSelectedIndex() retorna um nmero inteiro referente ai ndice
selecionado, o mtodo getSelectedValue() retorna o texto referente opo escolhida. Nesta
linha o label L1 ir receber o texto referente ao item selecionado na lista que ser removido.
Linha 76: contm o mtodo remove() responsvel por remover um elemento da lista de acordo
com o ndice fornecido dentro dos parnteses. Em outras palavras, se for necessrio remover o
primeiro item da lista, deve-se utilizar lista.remove(0). Uma vez que o primeiro item da lista inicia
em zero. Nesta linha o item selecionado, armazenado por meio da linha 74, ser removido.
Linha 80: public void valueChanged(ListSelectionEvent e) contm a declarao do mtodo
que executado no momento em que o usurio escolhe uma das opes da lista com o clicar do
mouse, ou com o mover das setas direcionais, ou seja, toda vez que o elemento selecionado for
mudado. Neste exemplo, apenas o objeto lista ir gerar esse evento, sendo desnecessrio
verificar qual objeto foi o responsvel pela execuo do mtodo, entretanto, caso existissem
outros objetos que gerassem esse evento, a verificao da fonte da gerao seria necessria ,
algo do tipo: if(e.getSource == lista1). Ou seja, deveria ser realizado um procedimento
semelhante ao inserido no mtodo actionPerformed quando diversos botes so usados


A tabela 5 mostra um resumo dos mtodos mais utilizados da classe JList:


Mtodo Funo
JList() Cria uma caixa de seleo
getSelectValue() Obtm o texto do item slecionado
getSelectedIndex() Obtm o ndice do texto selecionado
setSelectedIndex() Seleciona o ndice especificado
setSelectedInterval(int,int) Seleciona diversos ndices dentro do intervalo
especificado
isSelectionEmpty() Verifica se existe algum item selecionado na lista,
retornando verdadeiro ou falso.
IsSelectedIndex(int) Verifica se o ndice est selecionado, retornando
verdadeiro ou falso
Tabela 5 resumo dos mtodos da classe JList

A tabela 6 mostra um resumo dos mtodos mais utilizados da classe DefaultListModel():


Mtodo Funo
addElement(String) Adiciona o texto como um novo item da lista
getSize() Obtm a quantidade total de itens da lista
remove(int) Remove o item do ndice especificado
235
Tabela 6 resumo dos mtodos da classe DefaultListModel.

Outra possibilidade das lista a mltipla seleo, ou seja, m,ais de uma opo pode ser
escolhida ao mesmo tempo. Existem duas formas de seleo: a contnua. Em que diversos itens
podem ser selecionados em seqncia (uso da tecla SHIFT), e a alternada, na qual os itens podem
ser selecionados alternadamente (uso da tecla CTRL). Para tornar essa caracterstica possvel, deve
ser utilizado o mtodo setSelectionMode(modo_de_seleo), em que modo de seleo pode ser 1
(seleo em seqncia) ou 2 (seleo alternada). Se voc desejar mudar o exemplo 7 para que
possa selecionar diversos itens ao mesmo tempo, acrescente a linha lista.setSelectionMode(1); logo
aps a linha 50. ressalta-se que ao trabalhar com mltipla seleo, diversos ndices podem estar
selecionados ao mesmo tempo, o que impe a utilizao do mtodo setSelectedIndex([]) que retorna
um array de ndices selecionados.

Incluso de caixas de seleo

As caixas de seleo so criadas a partir da classe JcomboBox e permitem que o usurio
selecione apenas um item de sua lista, ao contrrio da JList, em que mais de um item pode ser
selecionado. O componente JcomboBox funciona praticamente da mesma forma que o JList, porm
h diferenas entre os mtodos para manipulao de suas propriedades.
Observe o exemplo 9.8 que demonstra como utilizar vrios mtodos para manipulao do
LcomboBox.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

class ExIntGrafica8 extends JFrame implements ActionListener, ItemListener{
JLabel L1;
JTextField T1, T2, T3;
JComboBox combo;
JButton B1,B2,B3,B4,B5,B6,B7,B8;

public static void main(String args[]) {
JFrame janela = new ExIntGrafica8(); //declaracao e inicializacao do
objeto janela
janela.show(); //mostra a janela na tela
WindowListener x = new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
};
janela.addWindowListener(x);
}

ExIntGrafica8(){ //construtor
setTitle("Uso do JComboBox"); //titulo da janela
setSize(400,170); //dimensoes da janela (largura e comprimento)

getContentPane().setBackground(new Color(190,190,190));
L1 = new JLabel("Conteudo");
L1.setForeground(Color.blue);
L1.setFont(new Font("Arial",Font.BOLD, 15));
B1 = new JButton("Mostra o texto");
B1.addActionListener(this);
B2 = new JButton("Mostra Indice");
B2.addActionListener(this);
B3 = new JButton("Adiciona item");
B3.addActionListener(this);
B4 = new JButton("Remove item");
B4.addActionListener(this);
B5 = new JButton("Remove todos os itens");
B5.addActionListener(this);
B6 = new JButton("Quantidade de itens");
B6.addActionListener(this);
T1 = new JTextField();
236
T2 = new JTextField();
String[] cores = {"Branco","Vermelho","Azul","Verde"};
combo = new JComboBox(cores);
combo.addItemListener(this);
getContentPane().setLayout(new GridLayout(5,2));
getContentPane().add(L1);
getContentPane().add(combo);
getContentPane().add(B1);
getContentPane().add(B4);
getContentPane().add(B2);
getContentPane().add(B5);
getContentPane().add(B3);
getContentPane().add(T1);
getContentPane().add(B6);
getContentPane().add(T2);
}
public void actionPerformed(ActionEvent e){
if (e.getSource() == B1){
L1.setText("Texto" + combo.getSelectedItem());
}
if(e.getSource() == B2){
L1.setText("Indice" + combo.getSelectedIndex());
}
if(e.getSource() == B3){
if(T1.getText().length() != 0){
combo.addItem(T1.getText());
}
}
if(e.getSource() == B4){
combo.removeItemAt(combo.getSelectedIndex());
}
if(e.getSource() == B5){
combo.removeAllItems();
}
if(e.getSource() == B6){
T2.setText("" +combo.getItemCount());
}
}

public void itemStateChanged(ItemEvent e){
T1.setText("" +combo.getSelectedItem());
}
}

OS aspectos mais importantes do exemplo 9.8 so:

14) Linha 5: implementa a interface ItemListener responsvel por reconhecer quando ocorre a
mudana da opo selecionada no componente combo.
15) Linha 9: declara combo como sendo um objeto da classe JcomboBox.
16) Linha 41: String [] cores = {Branco, Vermelho,Azul,Verde} : contm a declarao
de um array de strings chamada cores que ser adicionado ao JComboBox. Esse Array deve ser
formado por todos os elementos (opes) que o combo ter, separados por vrgula.
17) Linha 42: combo = new JComboBox(cores): realiza a inicializao do objeto combo. Sua
lista conter as strings armazenadas no array cores.
18) Linha 43: registra o objeto combo para que a mudanas de seleo sejam reconhecidas e
tratadas pelo mtodo itemStateChanged. O evento ser gerado quando o usurio escolher uma
das opes do combo, seja com mouse ou com o teclado.
19) Linha 55: contm um mtodo getSelectdItem() utilizado para retornar o contedo do texto
selecionado, isto , retorna o texto da opo selecionado pelo usurio.
20) Linha 57: contm o mtodo getSelectdIndex() utilizado para retornar um valor inteiro
contendo o ndice da opo selecionada. Se estiver selecionada a opo 1, o mtodo retorna o
nmero 0 (zero), se a opo 2 estiver selecionada, o mtodo retorna o nmero 1 (um) e assim
sucessivamente.
21) Linha 61: contm o mtodo addItem() usado para adicionar um item lista do objeto combo,
no caso est sendo adicionado o contedo do campo texto T1.
22) Linha 65: contm o mtodo removeItemAt() utilizado para remover um item da lista a partir
237
de um ndice especificado. Utilizando em conjunto com o mtodo getSelectdItem() , o item a ser
excludo ser aquele que estiver selecionado na lista.
23) Linha 67: contm o mtodo removeAllItems() utilizado para limpar o contedo de um
JcomboBox, ou seja, remover todos os seus itens de uma s vez.
24) Linha 69: contm o mtodo getItemCount() utilizado para retornar a quantidade de
elementos existentes no objeto combo.
25) Linha 71: contm o mtodo itemStateChangel que executado toda vez que o usurio
seleciona uma das opes do componentes JcomboBox. Dessa forma, cada vez que uma opo
for selecionada, o contedo texto dessa opo aparecer no campo texto T1, de acordo com a
linha 73.






Mtodo Funo
jComboBox (String) Cria uma caixa de seleo JcomboBox com um
array do tipo string.
addItem (String) Adiciona o texto como um novo item
getSelectedItem() Obtm o texto do Item selecionado
getItemCount() Obtm a quantidade total de itens
getSelectedIndex() Obtm o ndice do item selecionado
removeItemAT(int) Remove o item com o indice especificado
removeAllitens(0 Remove todos os itens da lista.
Tabela 7 resumo dos mtodos da classe JComboBox






Incluso de caixas de opo

As caixas de opo so criadas a partir da classe JcheckBox e permitem representar uma
opo que est ativada (true) ou desativada (false). As caixas de opo so utilizadas para exibir
vrias opes dentre as quais o usurio pode optar por selecionar nenhuma, uma ou vrias delas.
Como exemplo prtico de utilizao, suponha um site de uma livraria em que o usurio aponta todos
os gneros de livro de seu interesse. O exemplo 9.9 demonstra a funcionalidade do JcheckBox
controlando a formatao de um determinado texto, de acordo com a escolha do usurio.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class ExIntGrafica9 extends JFrame implements ItemListener{
JLabel L1;
JCheckBox C1,C2;
static int negrito = 0,italico = 0;

public static void main(String args[]){
JFrame janela = new ExIntGrafica9();
janela.show();
WindowListener x = new WindowAdapter(){
public void windowClosing(WindowEvent e){
238
System.exit(0);
}
};
janela.addWindowListener(x);
}

ExIntGrafica9(){
getContentPane().setBackground(new Color(180,180,180));
setTitle("Uso do CheckBox");
setSize(300,70);
getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER));
L1 = new JLabel("Java");
L1.setFont(new Font("",Font.PLAIN,20));
L1.setForeground(Color.black);
C1 = new JCheckBox("Negrito");
C1.setBackground(new Color(180,180,180));
C1.addItemListener(this);
C2 = new JCheckBox("Italico");
C2.setBackground(new Color(180,180,180));
C2.addItemListener(this);
getContentPane().add(L1);
getContentPane().add(C1);
getContentPane().add(C2);
}

public void itemStateChanged(ItemEvent e){
if(e.getSource() == C1){
if (e.getStateChange() == ItemEvent.SELECTED){
negrito = Font.BOLD;
}else
negrito = Font.PLAIN;
}
if (e.getSource() == C2){
if (e.getStateChange() == ItemEvent.SELECTED){
italico = Font.ITALIC;
}else
italico = Font.PLAIN;
}
L1.setFont(new Font("Arial", negrito + italico,20));
}
}


O exemplo 9 apresenta uma janela que contm um Label e duas opes para o usurio
selecionar: negrito ou itlico. Conforme o usurio escolhe as opes, a fonte do Label alterada para:
negrito, negrito + itlico ou normal, de acordo com a combinao escolhida. Os aspectos mais
importantes desse exemplo so:

Linha 7: JCheckBox C1,C2 realiza a declarao de C1 e C2 como sendo objetos da classe
JCheckBox.
Linha 32: C1 = new JCheckBox(negrito) - realiza a inicializao do objeto C1, definindo o texto
que aparece na opo, isto , ser criado um boto de opo contendo o ttulo negrito. Esta a
forma mais simples de inicializao, pois possvel definir tambm se o objeto ir aparecer
selecionado ou no (true ou false). Quando nada definido, o objeto no aparecer selecionado.
Outra forma de inicializao : C1 = new JcheckBox(negrito, true). Isso faria que C1 aparecesse
selecionado no momento da exibio na tela.
Linha 34: C1.additemListener(this) para que a seleo seja reconhecida pelo mtodo
ItemStateChanged, necessrio invocar o mtodo addItemListener da mesma forma que o
JcomboBox.
Linha 42: itemStateChanged(ItemEvent e) o mtodo que ser executado quando o usurio
modificar a condio do objeto CheckBox, da mesma forma que foi descrito para o JcomboBox.
Linha 44: if(e.getSource()==C1) utilizado para verificar se o objeto que gerou o evento foi o
C1.
Linha 46: if(e.getStateChange()==ItemEvent.SELECTED) este mtodo utilizado para
verificar se o componente JcheckBox est ou no checado. A propriedade SELECTED indica que
o objeto est checado e DESELECTED indica que o objeto no est checado.
239
Linha 47, 49, 54 e 56: as constantes Font.PLAIN, font.BOLD e font.ITALIC so definidas
internamente na linguagem Java e possuem, respectivamente os valores inteiros 0 (zero), 1(um) e
2(dois). A combinao de seus valores gera tipos de fonte diferentes em setFont na linha 58.




A tabela 8 mostra um resumo dos mtodos mais utilizados da classe JcheckBox.


Mtodo Funo
jCheckBox (String) Cria um checkbox com o texto especificado e com
a opo no selecionada.
jCheckBox (String, Boolean) Cria um checkbox com o texto e estado
especificado, com a seleo definida em Boolean
(true ou false)
getStateChange() Obtm o estado do checkbox, retornando
verdadeiro ou falso.
getSelected(Boolean) Especifica o estado do checkbox
Tabela 8 Resumo dos mtodos da classe JCheckBox



Incluso de Painis e Botes de Rdio

Os painis so criados a partir da classe JPanel e podem ser utilizados quando vrios tipos
de layout necessitam ser inseridos ser inseridos em uma janela. Cada painel pode assumir um layout
diferente.
Os botes de rdio so criados a partir da classe JRadioButton e, diferentemente dos
JCheckBox, permitem que apenas uma entre vrias opes seja escolhido pelo usurio. Os botes
de rdio devem sempre ser agrupados em um ButtonGroup para cada conjunto de botes de rdio a
serem inseridos no frame. O exemplo 10 mostra o uso de painis e de botes de rdio.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

class ExIntGrafica10 extends JFrame implements ItemListener{
JLabel L1,L2;
float N1 =0, result = 0;
JTextField T1,T2;
JPanel P1,P2;
JRadioButton radio1, radio2, radio3;
ButtonGroup radiogroup;

public static void main(String args[]) {
JFrame janela = new ExIntGrafica10(); //declaracao e inicializacao do
objeto janela
janela.show(); //mostra a janela na tela
WindowListener x = new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
};
janela.addWindowListener(x);
}

ExIntGrafica10(){ //construtor
setTitle("Uso de botoes de radio"); //titulo da janela
setSize(340,120);
240
getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER));
L1 = new JLabel("Digite um valor");
L1.setForeground(Color.blue);
L2 = new JLabel("% do valor:");
L2.setForeground(Color.blue);
T1 = new JTextField(5);
T2 = new JTextField(5);
P1 = new JPanel();
P2 = new JPanel();
T2.setEditable(false);
radio1 = new JRadioButton("10% do valor");
radio1.addItemListener(this);
radio2 = new JRadioButton("20% do valor");
radio2.addItemListener(this);
radio3 = new JRadioButton("30% do valor");
radio3.addItemListener(this);
radio1.setMnemonic(KeyEvent.VK_1);
radio2.setMnemonic(KeyEvent.VK_2);
radio3.setMnemonic(KeyEvent.VK_3);
radiogroup = new ButtonGroup();
radiogroup.add(radio1);
radiogroup.add(radio2);
radiogroup.add(radio3);
P1.setLayout(new FlowLayout(FlowLayout.CENTER));
P1.setBackground(new Color(200,200,200));
P2.setLayout(new GridLayout(2,3));
P1.setBackground(new Color(200,200,200));
P1.add(L1);
P1.add(T1);
P2.add(radio1);
P2.add(radio2);
P2.add(radio3);
P2.add(L2);
P2.add(T2);
getContentPane().add(P1);
getContentPane().add(P2);
}
public void itemStateChanged(ItemEvent e){
if(T1.getText().length() == 0)
return;
try{
N1 = Float.parseFloat(T1.getText());
if(e.getSource() == radio1)
result = (N1*10)/100;
if(e.getSource() == radio2)
result = (N1*20)/100;
if(e.getSource() == radio3)
result = (N1*30)/100;
}catch(NumberFormatException erro){
T2.setText("Erro");
return;
}
T2.setText(""+result);
}
}

O exemplo 10 apresenta uma janela na qual o usurio digita um valor em uma caixa de texto
e escolhe uma opo em um boto de rdio. Cada boto realiza o clculo da porcentagem sobre o
valor digitado e o coloca em uma outra caixa de texto.
Os aspectos mais importantes do exemplo 9.10 so:

Linha 9: contm a declarao de dois painis P1 e P2 que podem ser encarados da mesma forma
que as janelas (frames), pois compartilham as mesmas propriedades: cor do fundo, layout, objetos
que contm,etc. Depois de definidas as propriedades de um painel, ele inserido na janela. Dessa
forma uma janela pode conter diversos painis, cada um com o tipo diferente de formao e
layout.
Linha 10: realiza a declarao de trs objetos da classe JRadioButton (radio1, radio2, radio3).
241
Linha 11: contm a declarao do objeto radiogroup referente classe ButtonGroup que servir
para agrupar e armazenar um conjunto de botes de rdio do tipo JRadioButton.
Linha 34: realiza a inicializao dos dois painis.
Linhas 36 a 38: realizam a inicializao dos botes de rdio com seus ttulos correspondentes nos
parnteses. A inicializao tambm pode ser feita com mais um argumento informando se o boto
aparece marcado ou no, da mesma forma que o JCheckBox. A declarao ficaria assim: radio1
= new JRadioButton(10% do valor, true). Com essa inicializao, o boto apareceria marcado.
Outra possibilidade inicializar um boto de rdio com um texto e uma imagem. Sendo assim, o
boto de rdio pode ser inicializado de diversas maneiras: com um texto, com uma imagem, com
um texto e uma imagem, alm da definio de estar checado ou no. Estas linhas tambm
registram o evento dos botes de rdio.
Linha 42: radiogroup = new ButtonGroup() - a inicializao do objeto radiogroup para conter
os botes de rdio.
Linha 43: adiciona cada um dos botes de rdio ao radiogroup. Dentre todos os botes inseridos,
apenas um deles pode ser escolhido pelo usurio.
Linha 44: define o layout do painel P3, ou seja, um painel de fluxo com os objetos centralizados.
Linha 45 e 47: definem a cor de fundo dos painis P1 e P2.
Linha 46: define o layout do painel P3, ou seja, um painel no formato grande contendo 2 linhas
por 3 colunas.
Linhas 48 a 50: adicionam os objetos aos painis correspondentes.
Linha 51: adiciona os painis janela e todos os objetos atrelados a eles.




A tabela 9 mostrar um resumo dos mtodos mais utilizados das classes JRadioButton e
JPanel.


Mtodo Funo
JRadioButton(String) Cria um boto de rdio com o texto especificado
JradioButton(String, boolean) Cria um boto de rdio com o texto especificado e
com a seleo definida (true ou false)
setSelected(boolean) Define se o boto est ou no selecionado (true
ou false)
ButtonGroup() Cria um grupo para botes de rdio
<nome_do_grupo>.add() Adiciona cada boto de rdio em um determinado
grupo
<nome_do_painel>.add() Adiciona objetos a um determinado painel
Tabela 9 Resumo dos mtodos da classe JRadioButton


Incluso de caixas de mensagem

A incluso de mensagens realizada por meio da classe JOptionPane, especializada na
gerao de caixas de dilogo, isto , pequenas janelas que fazem uma pergunta, avisam o usurio ou
fornecem uma mensagem qualquer. Essas janelas representam um modo de comunicao com o
usurio, possibilitando fornecer uma simples informao ou obter respostas. A classe JOptionPane
oferece vrios mtodos para criao de caixas de dilogo de acordo com a necessidade. Uma
caracterstica particular da classe JOptionPane a no-necessidade de declarao de objetos para
a criao das caixas, que so criadas diretamente pelos mtodos dessa classe.
Existem quatro tipos padro de caixas de dilogo, cujos detalhes sero tratados
individualmente nas descries seguintes:
MessageDialog -caixa de dilogo que apresenta uma mensagem, possibilitando
acrescentar cones de alerta ao usurio.
ConfirmDialog caixa de dilogo que alm de emitir uma mensagem, possibilita ao
242
usurio responder a uma pergunta.
InputDialog caixa de dilogo que alm de emitir uma mensagem, permite a entrada de
um texto.
OptionDialog caixa de dilogo que abrange os trs tipos anteriores.


MessageDialog

A caixa de dilogo MessageDialog utilizada para mostrar ao usurio alguma informao e
no retorna nenhum tipo de valor de resposta. Essas caixas de dilogo podem apresentar um cone
referente ao tipo de mensagem (pergunta, informao, alerta, erro ou definido pelo usurio) ou no
apresentar nada, apenas a mensagem na tela sem cone algum. Sua sintaxe a seguinte:

JoptionPane.showMessageDialog(Component, <mensagem>, <ttulo da
mensagem>, <tipo de mensagem>)

Em que:
Component refere-se a um objeto continer que permite definir a posio da tela em
que a caixa de mensagem ir aparecer. Normalmente esse argumento deixado como
null (default) para que a mensagem aparea centralizada na tela. Em nossos exemplos,
todas as mensagem utilizaro null nesse argumento.
Mensagem a mensagem do tipo String que a caixa de dilogo informar ao usurio.
Ttulo da mensagem o texto que aparece na barra de ttulo da janela caixa de dilogo.
Tipo da mensagem o cone que representa o tipo de mensagem que est sendo
informado ao usurio. Esse cone definido pelo usurio e pode ser at um gif animado,
dando maior beleza aplicao. A tabela 10 apresenta as constantes da linguagem Java
para definio dos cones a serem apresentados na tela.

cone Comando
QUESTION_MESSAGE
INFORMATION_MESSAGE

WARNING_MESAGE
ERROR_MESSAGE

INFORMATION_MESSAGE, <cone>
vazio PLAIN_MESSAGE

O exemplo 11 utiliza caixas de dilogo para exibir na tela vrios tipos de mensagem.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

class ExIntGrafica11 extends JFrame implements ActionListener{
ImageIcon icone = new ImageIcon("c:/windows/tips.gif"
);
JButton B1,B2,B3,B4,B5,B6;

public static void main(String args[]) {
JFrame janela = new ExIntGrafica11(); //declaracao e inicializacao do
objeto janela
janela.show(); //mostra a janela na tela
WindowListener x = new WindowAdapter(){
public void windowClosing(WindowEvent e){
243
System.exit(0);
}
};
janela.addWindowListener(x);
}

ExIntGrafica11(){ //construtor
setBackground(new Color (190,190,190));
setSize(350,100);
setTitle("Caixas de Mensagem"); //titulo da janela

getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER));
B1 = new JButton("Pergunta");
B1.addActionListener(this);
B2 = new JButton("Informao");
B2.addActionListener(this);
B3 = new JButton("Alerta");
B3.addActionListener(this);
B4 = new JButton("Erro");
B4.addActionListener(this);
B5 = new JButton("Definida pelo usurio");
B5.addActionListener(this);
B6 = new JButton("Somente mensagem");
B6.addActionListener(this);
getContentPane().add(B1);
getContentPane().add(B2);
getContentPane().add(B3);
getContentPane().add(B4);
getContentPane().add(B5);
getContentPane().add(B6);
}
public void actionPerformed (ActionEvent e){
if(e.getSource() == B1)
JOptionPane.showMessageDialog(null, "sera que estou aprendendo
Java?", "Pergunta", JOptionPane.QUESTION_MESSAGE);
if(e.getSource() == B2)
JOptionPane.showMessageDialog(null, "Esta uma mensagem de
informacao!","Mensagem de Informao", JOptionPane.INFORMATION_MESSAGE);
if(e.getSource() == B3)
JOptionPane.showMessageDialog(null, "Cuidado!","Mensagem de
alerta", JOptionPane.WARNING_MESSAGE);
if(e.getSource() == B4)
JOptionPane.showMessageDialog(null, "Ocorreu algum
erro!","Mensagem de erro", JOptionPane.ERROR_MESSAGE);
if(e.getSource() == B5)
JOptionPane.showMessageDialog(null, "Utilizando um gif
animado!","Definido pelo usurio", JOptionPane.INFORMATION_MESSAGE,icone);
if(e.getSource() == B6)
JOptionPane.showMessageDialog(null, "Aprendendo a usar caixas de
mensagem","Somente mensagem", JOptionPane.PLAIN_MESSAGE);
}
}


O exemplo 11 apresenta uma janela com vrios botes. Cada boto produz uma mensagem
diferente na tela, demonstrado as variaes existentes para uma caixa de dilogo com o uso da
classe MessageDialog.
Os aspectos mais importantes deste exemplo so:

Linha 44: contm o mtodo showMessageDialog da classe JOptionPane. Este o mtodo
responsvel por criar a caixa de mensagem de acordo com os parmetros fornecidos dentro dos
parnteses. No caso desta linha, fornecido o parmetro QUESTION_MESSAGE, uma constante
da linguagem Java que contm um valor correspondente ao cone de interrogao. Dessa forma a
mensagem exibida conter um texto (Ser que estou aprendendo Java?) e o cone de
interrogao.
Linhas 46,48,50,52 e 54: executam o mesmo procedimento da linha 44. modificando a constante
responsvel pela insero do cone na caixa de mensagem.
244





ConfirmDialog

As caixas de dilogo de confirmao so pequenas janelas que possibilitam ao usurio
responder algum questionamento por meio dos botes Yes, No e Cancel. Essas janelas so
formadas pelo uso do mtodo showConfirmDialog. Uma vez apresentada na tela,o usurio escolhe
uma das opes e, dependendo do boto clicado, gerado um valor inteiro pertencente classe
JOptionPane: YES_OPTION = 0, NO_OPTION = 1 e CANCEL_OPTION = 2, portanto esse valor
para conhecer qual dos botes foi clicado pelo usurio.
Existem trs tipos de caixas de dilogo de confirmao: as que apresentam os botes Yes e
NO (YES_NO_OPTION ou O), as que apresentam os botes Yes, No e Cancel
(YES_NO_CANCEL_OPTION ou 1) e as que apresentam os botes OK e Cancel
(OK_CANCEL_OPTION ou 2). A sintaxe da caixa de dilogo para confirmao a seguinte:

int resposta = JoptionPane.showConfirmDialog(Component, <mensagem>,
<ttulo da mensagem>, <botes presentes>, <tipo de mensagem>).

A nica diferena entre essa sintaxe e a usada para a caixa de mensagem do item anterior se
refere ao parmetro <botes presentes> no qual so inseridos os botes que aparecero na caixa de
dilogo, conforme citado no pargrafo anterior.

O exemplo 12 demonstra o uso de trs tipos de caixas de confirmao:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

class ExIntGrafica12 extends JFrame implements ActionListener{
JLabel L1;
JButton B1,B2,B3,B4,B5,B6;

public static void main(String args[]) {
JFrame janela = new ExIntGrafica12(); //declaracao e inicializacao do
objeto janela
janela.show(); //mostra a janela na tela
WindowListener x = new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
};
janela.addWindowListener(x);
}

ExIntGrafica12(){ //construtor
setBackground(new Color (190,190,190));
setSize(400,100);
setTitle("Caixas de Confirmao"); //titulo da janela

getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER));
L1 = new JLabel("Resposta: ");
B1 = new JButton("sim e nao");
B1.addActionListener(this);
B2 = new JButton("Sim, No e Cancelar");
B2.addActionListener(this);
245
B3 = new JButton("Ok e Cancelar");
B3.addActionListener(this);
getContentPane().add(B1);
getContentPane().add(B2);
getContentPane().add(B3);
getContentPane().add(L1);
}
public void actionPerformed (ActionEvent e){
int resp = 0;
if(e.getSource() == B1)
resp = JOptionPane.showConfirmDialog(null,"Erro ao acessar
arquivo. Tentar novamente?", "Erro de arquivo",JOptionPane.YES_NO_OPTION,
JOptionPane.ERROR_MESSAGE);
if(e.getSource() == B2)
resp = JOptionPane.showConfirmDialog(null,"Deseja salavar as
alteraes?", "Salvar arquivo",JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.WARNING_MESSAGE);
if(e.getSource() == B3)
resp = JOptionPane.showConfirmDialog(null,"Deseja abrir o
arquivo?", "Abrir arquivo",JOptionPane.OK_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE);
switch(resp){
case 0: L1.setText("Pressionado o boto yes/Ok");break;
case 1: L1.setText("Pressionado o boto No");break;
case 2: L1.setText("Pressionado o boto Cancel");break;
}
}
}

Os aspectos mais importantes deste exemplo so:
7. Linha 39: int resp = 0 a varivel resp servir para armazenar o valor inteiro correspondente
resposta dada pelo usurio na caixa de confirmao.
8. Linha 41, 43 e 45: contem as constantes inteiras da classe JOptionPane que determinam os
botes visveis na caixa de confirmao. Em vez de constantes, pode ser usado tambm o valor
correspondente a cada constante, conforme citado anteriormente.
9. Linha 46: switch(resp) verifica a resposat coletada da caixa de confirmao. Esta varivel
armazena um nmero inteiro que utilizado para determinar qual foi o boto pressionado pelo
usurio na caixa de confirmao.



InputDialog

As caixas de dilogo de entrada so geradas a partir do mtodo showInputDialog() e so
utilizadas para fazer uma pergunta ao usurio e solicitar a entrada de um texto. Esse texto ser
armazenado em uma varivel qualquer do tipo String. Essas caixas de dilogo so chamadas pelo
mtodo showInputDialog(). A sintaxe usada na criao de caixas de dilogo de entrada
praticamente a mesma usada nas caixas de mensagem, possuindo o formato seguinte:

Strind resp = JoptionPane.showInputDialog(null, <mensagem>, <ttulo
da mensagem>, <tipo de mensagem>).

O exemplo 13 demonstra o uso da caixa de entrada para solicitar o nome do usurio e depois
apresentar uma mensagem de boas vindas.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
246

class ExIntGrafica13 extends JFrame implements ActionListener{
JLabel L1;
JButton B1;

public static void main(String args[]) {
JFrame janela = new ExIntGrafica13(); //declaracao e inicializacao do
objeto janela
janela.show(); //mostra a janela na tela
WindowListener x = new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
};
janela.addWindowListener(x);
}

ExIntGrafica13(){ //construtor
setBackground(new Color (190,190,190));
setSize(230,100);
setTitle("Uso da caixas de entrada"); //titulo da janela

getContentPane().setLayout(new GridLayout(2,1));
L1 = new JLabel("",JLabel.CENTER);
L1.setForeground(Color.blue);
B1 = new JButton("Login");
B1.addActionListener(this);
B1.setToolTipText("Clique aqui para entrar no sistema");
B1.setMnemonic(KeyEvent.VK_L);
getContentPane().add(B1);
getContentPane().add(L1);
}
public void actionPerformed (ActionEvent e){
String resp = JOptionPane.showInputDialog(null,"Qual o seu
nome?","Login no sistema",JOptionPane.QUESTION_MESSAGE);
if(!(resp == null|| resp.equals("")))
L1.setText("Seja bem vindo "+ resp + "!!");
else
L1.setText("");
}
}

Os aspectos mais importantes deste exemplo so:

cii) Linha 37: String resp = JoptionPane.showInputDialog cria uma varivel de nome resp que
armazenar o contedo digitado pelo usurio na caixa de dilogo de entrada. Caso o usurio no
digite nada e pressione Ok, a varivel resp receber vazio (); caso o usurio pressione o boto
Cancel, a varivel resp receber nulo (null).
ciii) Linha 39: if(!(resp == null || resp.equals())) - ao aparecer a caixa de dilogo. solicitado
que se digite algo na caixa de texto. No ser executada a linha aps este comando caso a
resposta seja null (quando o usurio pressionar o boto Cancel) ou caso a resposta seja vazia
(quando o usurio no digitar nada na caixa de texto).
civ) Linha 41: L1.setText(Seja bem vindo +resp +!) - exibe uma mensagem de boas-vindas
ao usurio de acordo com o nome que foi digitado na caixa de dilogo de entrada.

247


OptionDialog

As caixas de dilogo de opo so geradas a partir do mtodo OptionDialog e so bem
complexas. Ela capaz de combinar todos os recursos j vistos nas outras caixas de dilogo. Sua
sintaxe :

int resposta = (null, <mensagem>, <ttulo da mensagem>,<botes
presentes>, <tipo de mensagem>, <cone>, <array de objetos>, <seleo
padro>).

Em que:
8. botes presentes um tipo de caixa que utiliza as variveis YES_NO_OPTION,
YES_NO_CANCEL_OPTION ou OK_CANCEL_OPTION. Deve-se utilizar 0 (zero) caso outros
botes sejam utilizados no lugar destes
9. tipo de mensagem uma das variveis de pergunta, informao, alerta ou erro ou
definida pelo usurio.
10. cone um objeto ImageIcon a ser apresentado no lugar de um dos cones do argumento
anterior (<tipo de mensagem>). Se nenhum cone for usado, deve-se colocar a palavra
null no lugar desse argumento.
11. Array de objetos um array de objetos que contm os componentes ou outros objetos
que representam as escolhas na caixa de dilogo, caso as opes YES_NO_OPTION,
YES_NO_CANCEL_OPTION ou OK_CANCEL_OPTION. no estejam sendo usadas.

O exemplo 14 demonstra o uso da caixa de dilogo de opo para fazer uma pergunta ao
usurio e aguardar ema entre trs respostas disponveis com o uso de trs botes.

1mpof ava.aWf."
1mpof ava.aWf.evenf."
1mpof avax.sW1ng."
1mpof avax.sW1ng.evenf."

c1ass LxlnfGaf1ca14 exfends JIame 1mp1emenfs Acf1onL1sfene{
JLabe1 L1
J8uffon 81

pub11c sfaf1c vo1d ma1n{5f1ng ags|]} {
JIame ane1a = neW LxlnfGaf1ca14{} //dec1aacao e 1n1c1a11zacao do
obefo ane1a
ane1a.shoW{} //mosfa a ane1a na fe1a
W1ndoWL1sfene x = neW W1ndoWAdapfe{}{
pub11c vo1d W1ndoWC1os1ng{W1ndoWLvenf e}{
5ysfem.ex1f{0}
}
}
ane1a.addW1ndoWL1sfene{x}
}

LxlnfGaf1ca14{}{ //consfufo
sef8ackgound{neW Co1o {190,190,190}}
sef51ze{250,100}
sef11f1e{"ca1xas de enfada"} //f1fu1o da ane1a

248
gefConfenfPane{}.sefLayouf{neW I1oWLayouf{I1oWLayouf.CLN1Lk}}
L1 = neW JLabe1{""}
L1.sefIoegound{Co1o.b1ue}
81 = neW J8uffon{"D1a1ogo de opo"}
81.addAcf1onL1sfene{fh1s}
gefConfenfPane{}.add{81}
gefConfenfPane{}.add{L1}
}
pub11c vo1d acf1onPefomed {Acf1onLvenf e}{
5f1ng|] esco1ha = {"Lnfe 1 e 20 anos","Lnfe 21 e 40 anos","Ma1s de
40 anos"}
1nf esp = JOpf1onPane.shoWOpf1onD1a1og{nu11,"qua1 sua
1dade?","ldade",0,JOpf1onPane.lNIOkMA1lONML55AGL,nu11,esco1ha,esco1ha|0]}

5f1ng 1dade = {esco1ha|esp]}
L1.sef1exf{"1dade: "+1dade}
}
}

Os aspectos mais importantes deste exemplo so:

4. Linha 35: 5f1ng|] esco1ha = {"Lnfe 1 e 20 anos","Lnfe 21 e 40 anos","Ma1s de 40 5f1ng|] esco1ha = {"Lnfe 1 e 20 anos","Lnfe 21 e 40 anos","Ma1s de 40 5f1ng|] esco1ha = {"Lnfe 1 e 20 anos","Lnfe 21 e 40 anos","Ma1s de 40 5f1ng|] esco1ha = {"Lnfe 1 e 20 anos","Lnfe 21 e 40 anos","Ma1s de 40
anos"} anos"} anos"} anos"} - o array escolha utilizado para definir i texto de trs botes na caixa de dilogo, de
acordo com as Strings apresentadas.
5. Linha 36: contm a criao das caixas de dilogo de opo. O array escolha criar trs botes
conforme a definio de seus nomes no array. O ltimo argumento escolha[0] especifica que o
primeiro elemento do array deve ser a seleo padro da caixa de dilogo, portanto o boto Entre
1 e 20 anos o que ficar selecionado quando a caixa de dilogo for aberta. A varivel resp
receber o ndice do boto clicado. Lembrando que o ndice inicia-se no 0 (zero).
6. Linha 37: String idade = (escolha[resp]) criada uma varivel idade do tipo String que
armazenar a resposta do usurio, dependendo do boto que foi clicado, cujo ndice foi
armazenado na varivel resp. Quando o usurio pressiona um dos botes da caixa de dilogo,
gerado um nmero correspondente ao seu ndice no array.







Incluso de barras de rolagem

As barras de rolagem constituem-se em componentes que possibilitam o controle de um valor
numrico, dentro de uma faixa de valores, compreendido entre um valor mnimo e um mximo.
Existem trs formas diferentes de mudar o valor da barra de rolagem:
ci) por meio das setas das extremidades so utilizadas para incrementar ou decrementar
valores de pequena quantidade (de um em um por default).
cii) Por meio do intervalo no meio utilizado para incrementar ou decrementar valores em
uma quantidade maior (de dez em dez por default).
ciii) Caixa no meio sua posio utilizada para mostrar onde o valor corrente est
localizado d entro do intervalo dos valores. Ao mover essa barra com o mouse, ocorre
uma mudana absoluta no valor com base na posio da caixa dentro da barra de
rolagem.
249

A sintaxe para criar uma barra de rolagem em Java a seguinte:

JscrollBar(<orientao>,<valor inicial>,<intervalo do meio>,<valor
mnimo>,<valor mximo>).

Em que:
ii) orientao um valor inteiro que define se a barra de rolagem horizontal (0) ou
vertical (1). A orientao pode ser definida tambm pelas constantes
JScrollBar.HORIZONTAL e JScrollBar.VERTICAL
iii) valor inicial o valor inicial da barra de rolagem que deve ser do tipo inteiro,
compreendido entre os valores mximo e mnimo da barra de rolagem.
iv) Intervalo do meio um valor do tipo inteiro que define o incremento ou decremento do
valor da barra de rolagem.
v) Valor mnimo define o valor inteiro mnimo da barra de rolagem
vi) valor mximo define o valor inteiro mximo da barra de rolagem.

O exemplo 15 demonstra o uso da barra de rolagem criando um pequeno conversor de
centmetros para polegadas:


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.text.NumberFormat;

class ExIntGrafica15 extends JFrame implements AdjustmentListener{
JScrollBar SB1;
JLabel L1,L2;

public static void main(String args[]) {
JFrame janela = new ExIntGrafica15(); //declaracao e inicializacao do
objeto janela
janela.show(); //mostra a janela na tela
WindowListener x = new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
};
janela.addWindowListener(x);
}

ExIntGrafica15(){ //construtor
setBackground(new Color (190,190,190));
setSize(250,100);
setTitle("Uso de barra de rolagem"); //titulo da janela

getContentPane().setLayout(new GridLayout(3,1));
SB1 = new JScrollBar(JScrollBar.HORIZONTAL,0,5,0,105);
SB1.addAdjustmentListener(this);
L1 = new JLabel(""+SB1.getValue(),JLabel.CENTER);
L1.setForeground(Color.black);
L2 = new JLabel("",JLabel.CENTER);
L2.setForeground(Color.black);
getContentPane().add(SB1);
getContentPane().add(L1);
getContentPane().add(L2);
}
public void adjustmentValueChanged(AdjustmentEvent e){
L1.setText(SB1.getValue()+" centmetros");
NumberFormat nf;

nf = NumberFormat.getNumberInstance();
nf.setMinimumFractionDigits(3);
double pol = SB1.getValue()/2.54;
250
L2.setText(nf.format(pol)+" Polegadas");
}
}


Os aspectos mais importantes do exemplo 15 so:

5. Linha 6: implementa a interface AdjustmentListener, utilizada para reconhecer a interao do
usurio com o objeto JScrollBar, ou seja, para reconhecer os eventos relacionados com o
JScrollBar da mesma forma que ActionListener usado para reconhecer o clique do mouse.
6. Linha 8: declara SB1 como um objeto da classe JScrollBar.
7. Linha 30: SB1 = new JscrollBar(JScrollBar.HORIZONTAL,0,5,0,105) inicializa o objeto SB1
como sendo uma barra de rolagem em que o primeiro argumento (JscrollBar.HORIZONTAL)
determina que ser uma barra de rolagem do tipo horizontal. O segundo argumento (0) determina
que a posio inicial barra de rolagem ser zero. O terceiro argumento (5) determina o valor para
incremento e decremento para o intervalo do meio, isto , quando o usurio clicar na rea da
barra. O quarto argumento (0) informa o valor mnimo da barra de rolagem. O quinto argumento
(105) informa o valor mximo da barra de rolagem, sendo que esse valor deve ser definido em
funo do valor do intervalo do meio; na realidade o valor mximo da barra ser 100 e no 105,
uma vez que o valor final deve ser acrescido com o valor do intervalo do meio. Sendo assim, a
barra de rolagem assumir valores entre 0 e 100.
8. Linha 31: SB1.addAdjustmentListener(this) registra a barra de rolagem SB1 para que o
evento seja gerado por ela.
9. Linha 32:SB1.getValue() - mtodo utilizado para obter o valor inteiro da posio da barra de
rolagem. Note que o objeto L1 j criado tendo como texto a posio inicial da barra de rolagem.
10. Linha 38: adjusmentValueChanged(AdjustmentEvent e) mtodo utilizado para receber as
aes geradas a partir da interao do usurio com o objeto JscrollBar(SB1).
11. Linha 44 a 46: definem um formato (trs casas decimais) para a apresntao do valor em
polegadas, inserindo no objeto L2.



A tabela 11 mostra um resumo dos mtodos mais utilizados da classe JScrollBar:

Mtodo Funo
JScrollBar(int,int,int, int,int) Cria uma barra de rolagem de acordo com os argumentos
definidos
getMaximum() Obtm o mximo valor da barra de rolagem
getMinimum() Obtm o mnimo valor da barra de rolagem
GetOrientation() Retorna o valor da orientao da barra de rolagem: 0 para
JScrollBar.HORIZONTAL e 1 para JScrollBar.VERTICAL
getValue() Obtm o valor inteiro corrente da barra de rolagem
getUnitIncrement() Obtm o valor do incremento por meio das setas das
extremidades
getBlockIncrement() Obtm o valor do incremento por intermdio do intervalo
do meio
setMaximum(int) Determina o valor mximo da barra de rolagem
setMinimum(int) Determina o valor mnimo da barra de rolagem
setOrientation(int) Determina o valor da orientao da barra de rolagem:
vertical ou horizontal
setValue(int) Determina o valor corrente da barra de rolagem
setUnitIncrement(int) Determina o valor do incremento por meio das setas das
extremidades
setBlockIncrement(int) Determina o valor do incremento por intermdio do
intervalo do meio.
Tabela 11 Resumo dos mtodos da classe JScrollBar.


Incluso de reas de texto
251

As reas de texto geradas a partir da classe JTextArea so semelhantes s caixas de texto,
porm com maior funcionalidade, possibilitando realizar o tratamento de diversas linhas de texto. A
sintaxe para a utilizao das reas de texto a seguinte:

JtextArea(<string>,<n de linhas iniciais>,<dimenso>)

Em que:
di) string um texto inicial qualquer que pode ser definido para o objeto no momento de sua
inicializao.
dii) n de linhas inicias - Um valor inteiro que especifica o nmero de linhas que a rea de
texto apresentar na tela, sem o uso de uma de uma barra de rolagem.
diii) dimenso um valor inteiro que especifica a dimenso da rea de texto em nmeros
de caracteres, isto , o nmero de caracteres que cabe em uma linha na rea de texto.
Esta definio no apresenta muita importncia, pois na realidade o nmero de caracteres
que uma linha pode conte est relacionado diretamente ao tipo de caractere usado. Por
exemplo, se o nmero de caracteres de uma linha for definido para 40, ento cabero
exatamente 40 caracteres W , entretanto cabero 62 caracteres A e 156 caracteres
I.

O exemplo 16 demonstra algumas funcionalidades da rea de texto.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.text.NumberFormat;

class ExIntGrafica16 extends JFrame implements ActionListener{
JTextArea TA1, TA2;
JTextField T1;
JButton B1,B2;

public static void main(String args[]) {
JFrame janela = new ExIntGrafica16(); //declaracao e inicializacao do
objeto janela
janela.show(); //mostra a janela na tela
WindowListener x = new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
};
janela.addWindowListener(x);
}

ExIntGrafica16(){ //construtor
setSize(420,280);
setTitle("Uso do JTextArea"); //titulo da janela

getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER));
T1 = new JTextField(40);
T1.addActionListener(this);
B1 = new JButton("Copia tudo");
B1.addActionListener(this);
B2 = new JButton("Copia selecao");
B2.addActionListener(this);
TA1 = new JTextArea("Editor de texto:\n",5,40);
TA2 = new JTextArea(5,40);
JScrollPane painel1 = new JScrollPane(TA1);
JScrollPane painel2 = new JScrollPane(TA2);
getContentPane().add(painel1);
getContentPane().add(T1);
getContentPane().add(B1);
getContentPane().add(B2);
getContentPane().add(painel2);
}
252
public void actionPerformed(ActionEvent e){
if(e.getSource() == T1) { //ao pressionar ENTER no JTextField
TA1.append(T1.getText());
T1.setText("");
}
if (e.getSource() == B1) //copia conteudo de TA1 em TA2
TA2.setText(TA1.getText());
if(e.getSource() == B2) //copia selecao
TA2.setText(TA1.getSelectedText());
}
}

Os aspectos mais importantes do exemplo 16 so:

ii) Linha 34: TA1 = new JTexArea (Editor de texto:\n,5,40) inicializa o objeto TA1 com uma
string mais o sinal de escape \n (serve para pular uma linha), o nmero de linhas (5) e o nmero
de colunas (40).
iii) Linha 35: TA2 = new JtexArea (5,40) inicializa o objeto TA2 apenas com o nmeros de linhas
e colunas para a rea de texto.
iv) Linha 47: insere o texto armazenado no campo texto T1 para o final da rea de texto TA1 por
meio do mtodo append () da classe JTestArea. Dessa forma, toda vez que o usurio pressionar
a tecla ENTER sobre o campo T1, seu contedo texto ser inserido no final de TA1.
v) Linha 51: o objeto TA2 obtm o texto armazenado no objeto TA1. Observe que o mtodo para
obter (getText()) ou armazenar (setText()) um texto em um objeto do tipo JTestArea so os
mesmos de um objeto JTextField.
vi) Linha 53: TA2.setText(TA1.getSelectedText()) - o objeto TA2 obtm o texto selecionado do
objeto TA1.Isto realizado pelo mtodo getSelectedText().

A figura 16 apresenta o resultado obtido com a execuo do exemplo 16.







A tabela 12 mostra um resumo dos mtodos mais utilizados da classe JTextArea.

Mtodo Funo
JTextArea() Cria uma rea de texto.
JTextArea(int, int) Cria uma rea de texto de acordo com o nmero de linhas
e colunas especificadas.
JTextArea(String) Cria uma nova rea de texto de acordo com o texto
especificado
JTextArea(String, int, int) Cria uma rea de texto de acordo com o texto, o nmero de
linhas e o nmero de colunas especificados
getColumns() Obtm o comprimento ou colunas da rea de texto em
caracteres.
253
Mtodo Funo
getRows() Obtm a largura ou linhas da rea de texto em caracteres.
getSelectedTex() Obtm o texto selecionado na rea de texto.
setColumns() Define o comprimento ou colunas da rea de texto.
setRows() Define a largura ou linhas da rea de texto.
insert(String, int) Insere a string especificada na posio indicada por uma
varivel inteira.
replaceRange(String, int,int) Substitui o texto fornecido na varivel string pelo texto
contido entre as posies definidas (incio e fim).
setTex(), getText(), setEditable() Mtodos da classe JtextComponent que Funcionam da
mesma forma em JTextField.


Incluso de menus

H dois tipos de menu utilizados em Java: as barras de menu que aparecem na parte
superior de quase todos os aplicativos de ambientes Windows e os menus Popup que aparecem
quando o usurio pressiona o boto direito do Mouse sobre algum objeto. Esses dois tipos de menus
sero mostrados separadamente nos itens seguintes.

Barra de menus

Antes de criar um menu, necessrio cria uma barra de menus para que ela possa conter o
conjunto de menus que aparece na parte superior da janela. Essa barra de menus criada usando a
sintaxe seguinte:

JMenuBar <nome da barra de menus> = new JMenuBar();

Para definir essa barra de menus como sendo o menu padro da janela, utilizado o mtodo
setJMenuBar() da seguinte maneira:

setJMenuBar(<nome da barra de menus>);

Com essas duas linhas de comando j possvel criar e definir a barra de menus, entretanto
necessrio criar tambm os menus que aparecero na barra, pois apenas com as declaraes
realizadas a janela conteria uma barra de menus, vazia. Para criar os menus utilizada a classe
JMenu , conforme a sintaxe seguinte:

JMenu <> = new JMenu();

Para que o menu criado seja adicionado barra de menus, deve-se utilizar o mtodo add da
seguinte forma:

<nome da barra de menus>.add(<nome do menu>)

Com isso um menu inserido na barra. Imagine, por exemplo, a insero do menu Arquivo de
um aplicativo qualquer. Depois de criado o menu, necessrio adicionar a eles os itens que
compem (para op menu Arquivo seriam: Novo, Salvar, SalvarComo...). Para inserir um item de
menu, usada a seguinte sintaxe:

JMenuItem <nome do item> = JMenuItem()

Para adicionar o item ao menu, utiliza-se o mtodo add:

<nome do menu>.add(<nome do item>)

De acordo com os pargrafos anteriores, pode-se notar que o processo de criao de menus
possui uma srie de passos que devem ser seguidos. A figura 17 ilustra os itens necessrios para a
criao de menus. Em resumo: cria-se uma barra de menus, adiciona-se a barra de menus janela.

O exemplo 17 demonstra como inserir dois menus com seus itens correspondentes,
identificando qual item foi escolhido pelo usurio.
254

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ExIntGrafica17 extends JFrame implements ActionListener{
JMenuBar M1;
JTextField T1;
JMenu menuCadastro, menuRelatorio;
JMenuItem micliente, mifornecedor, misair, mirlcliente, mirlfornecedor;

public static void main(String args[]) {
JFrame janela = new ExIntGrafica17(); //declaracao e inicializacao do
objeto janela
janela.show(); //mostra a janela na tela
WindowListener x = new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
};
janela.addWindowListener(x);
}

ExIntGrafica17(){ //construtor
setTitle("Uso de Menus"); //titulo da janela

setSize(270,130);
setLocation(50,50);
getContentPane().setBackground(new Color(0,128,128));
T1 = new JTextField();
M1 = new JMenuBar(); //cria a barra de menus
menuCadastro = new JMenu("Cadastro"); //cria um menu
menuRelatorio = new JMenu("Relatorio");
micliente = new JMenuItem("Cliente"); //cria um item
micliente.addActionListener(this);
mifornecedor = new JMenuItem("Fornecedor");
mifornecedor.addActionListener(this);
misair = new JMenuItem("Sair");
misair.addActionListener(this);
menuCadastro.add(micliente); //adiciona um item ao menu
menuCadastro.add(mifornecedor);
menuCadastro.add(misair);
mirlcliente = new JMenuItem("Relao de Clientes");
mirlcliente.addActionListener(this);
mirlfornecedor = new JMenuItem("Relao de Fornecedores");
mirlfornecedor.addActionListener(this);
menuRelatorio.add(mirlcliente);
menuRelatorio.add(mirlfornecedor);
M1.add(menuCadastro); //adiciona o menu na barra de menus
M1.add(menuRelatorio);
setJMenuBar(M1); //define a barra de menus como padrao
getContentPane().add(T1);
}
public void actionPerformed(ActionEvent e){
if(e.getSource() == micliente)
T1.setText("Escolhido o item cliente");
if (e.getSource() == mifornecedor)
T1.setText("scolhido o item fornecedor");
if(e.getSource() == mirlcliente)
T1.setText("Escolhido o item relao de clientes");
if(e.getSource() == mirlfornecedor)
T1.setText("Escolhido o item relao de fornecedores");
if(e.getSource() == misair)
System.exit(0);
}
}


255
Os aspectos mais importantes do exemplo 17 so:

6. Linhas 7,8 e 9: contm as declaraes dos objetos JMenuBar (Barra de menus), Jmenu(menu) e
JmenuItem(Item do menu) respectivamente.
7. Linha 31: M1 = new JmenuBar() - inicializa o objeto M1 como sendo uma barra de menus da
classe JMenuBar.
8. Linhas 32 e 33: inicializam os objetos menuCadastro e menuRelatrio como menus da classe
JMenu.
9. Linhas 34, 36, 38, 43, e 45: inicializam um objeto como sendo um item de menu da classe
JMenuItem
10. Linhas 40, 41, 42, 47 e 48: adicionam itens aos menus menuCadastro e MenuRelatorio.
11. Linhas 35, 37, 39, 44 e 46: registram o evento ActionListener para cada um dos itens do menu.
12. Linhas 49 e 50: adicionam os menus barra de menus M1.
13. Linha 51: setJMenuBar(M1) define a barra de menus M1 como sendo o menu padro da janela.
14. Linhas 54 a 66: contm o mtodo actionPerformed que verifica qual dos itens do menu foi
escolhido, inserindo uma mensagem no campo texto T1.




O exemplo 18 apresenta um menu mais profissional, demonstrando a utilizao de subitens,
cones, barra divisria e teclas de atalho para acessa os itens do menu.


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ExIntGrafica18 extends JFrame implements ActionListener{
JMenuBar M1;
JMenu menuArquivo, menuSalvar;
JMenuItem miNovo, miAbrir, miSair, miSalvar, miSalvarC, miSalvarT;

public static void main(String args[]) {
JFrame janela = new ExIntGrafica18(); //declaracao e inicializacao do
objeto janela
janela.show(); //mostra a janela na tela
WindowListener x = new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
};
janela.addWindowListener(x);
}

ExIntGrafica18(){ //construtor
setTitle("Uso de Menus"); //titulo da janela

setSize(250,150);
setLocation(50,50);
getContentPane().setBackground(new Color(0,128,128));
M1 = new JMenuBar(); //cria a barra de menus
menuArquivo = new JMenu("Arquivo"); //cria um menu
menuArquivo.setMnemonic(KeyEvent.VK_A);
menuArquivo.addActionListener(this);
menuSalvar = new JMenu("Salvar"); //cria um menu
miNovo = new JMenuItem("Novo",new ImageIcon("xxx.gif"));
miNovo.addActionListener(this);
256
miNovo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,
ActionEvent.ALT_MASK));
miNovo.setMnemonic(KeyEvent.VK_N);
miAbrir= new JMenuItem("Abrir",new ImageIcon("xxx.gif"));
miAbrir.addActionListener(this);
miAbrir.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A,
ActionEvent.ALT_MASK));
miAbrir.setMnemonic(KeyEvent.VK_B);
miSalvar= new JMenuItem("Salvar", new ImageIcon("xxx.gif"));
miSalvar.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,
ActionEvent.ALT_MASK));
miSalvar.addActionListener(this);
miSalvar.setMnemonic(KeyEvent.VK_S);
miSalvarC= new JMenuItem("Salvar Como");
miSalvarC.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,
ActionEvent.ALT_MASK));
miSalvarC.addActionListener(this);
miSalvarC.setMnemonic(KeyEvent.VK_C);
miSalvarT= new JMenuItem("Salvar Tudo");
miSalvarT.addActionListener(this);
miSalvarT.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T,
ActionEvent.ALT_MASK));
miSalvarT.setMnemonic(KeyEvent.VK_T);
miSair = new JMenuItem("Sair", new ImageIcon("xxx.gif"));
miSair.addActionListener(this);
miSair.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,
ActionEvent.ALT_MASK));
miSair.setMnemonic(KeyEvent.VK_X);
menuSalvar.add(miSalvar);
menuSalvar.add(miSalvarC);
menuSalvar.add(miSalvarT);
menuArquivo.add(miNovo);
menuArquivo.add(miAbrir);
menuArquivo.add(menuSalvar);
menuArquivo.addSeparator();
menuArquivo.add(miSair);
M1.add(menuArquivo); //adiciona o menu na barra de menus
setJMenuBar(M1); //define a barra de menus como padrao
}
public void actionPerformed(ActionEvent e){
if(e.getSource() == miNovo)
JOptionPane.showMessageDialog(null, "menu Novo", "Usando
menus",JOptionPane.INFORMATION_MESSAGE);
if (e.getSource() == miAbrir)
JOptionPane.showMessageDialog(null, "menu Abrir", "Usando
menus",JOptionPane.INFORMATION_MESSAGE);
if(e.getSource() == miSalvar)
JOptionPane.showMessageDialog(null, "Sub-menu Salvar", "Usando
menus",JOptionPane.INFORMATION_MESSAGE);
if(e.getSource() == miSalvarC)
JOptionPane.showMessageDialog(null, "Sub-menu Salvar Como",
"Usando menus",JOptionPane.INFORMATION_MESSAGE);
if(e.getSource() == miSalvarT)
JOptionPane.showMessageDialog(null, "Sub-menu Salvar Tudo",
"Usando menus",JOptionPane.INFORMATION_MESSAGE);
if(e.getSource() == miSair)
System.exit(0);
}
}


Os aspectos mais importante do exemplo 18 so:

Linha 32: menuArquivo.setMnemonic(KeyEvent.VK_A) cria um sublinhado embaixo da
letra especificada (no caso a letra A) para facilitar o acesso ao menu via teclado,
pressionando a tecla ALT mais a tecla sublinhada correspondente declarao (no caso ALT
+ A).
257
Linha 35: cria um item de menu com nome miNovo, contendo o texto Novo e uma imagem
criada no mesmo instante da inicializao por meio de new ImageIcon(MenuNovo.gif)
Linha 37: miNovo.setAccelerator(KeyStroke.getKeyStroke (KeyEvent.VK_N,
ActionEvent.ALT_MASK)) setAccelerator() o mtodo utilizado para criar um atalho para
o item de menu miNovo. Duas constantes, referentes a teclas, so passadas para esse
mtodo: KeyEvent.VK_N, ActionEvent.ALT_MASK. Dessa forma esse item de menu ser
acessado quando o usurio pressionar as teclas ALT+N.
Linha 62: menuArquivo.addSeparator() cria um separador no menu, isto , um trao
vertical que ser inserido logo aps o menu menuSalvar (linha 61) e antes do menu miSair
(linha 62).





Menus popup

Os menus do tipo Popup, conhecidos tambm como menus suspensos, so construdos
praticamente da mesma forma que os menus de barra. Eles podem ser atrelados a qualquer objeto
da janela e so acionados por meio do boto direito do mouse. Com essa caracterstica possvel
que uma mesma janela, dotada de diversos botes, invoque menus diferentes, dependendo do
posicionamento do mouse, isto , dependendo do posicionamento do ponteiro do mouse sobre um ou
outro boto, menus diferentes podem ser chamados.
A principal diferena entre os menus suspensos e os menus de barra se refere necessidade
de utilizao de uma classe especial que permitir que os diversos objetos da janela (como botes)
reconheam o menu suspenso. Essa classe especial pode ser elaborada dentro da prpria aplicao
e constitui-se na maneira mais simples de utilizao dos menus suspensos.

O exemplo 19 demonstra a utilizao de um menu suspenso que reconhecido por um
boto:


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ExIntGrafica19 extends JFrame implements ActionListener{
JPopupMenu mpopup;
JMenuItem miCopiar, miColar, miSalvar;
JMenuBar M1;
JTextField T1;
JButton B1, B2;

public static void main(String args[]) {
JFrame janela = new ExIntGrafica19(); //declaracao e inicializacao do
objeto janela
janela.show(); //mostra a janela na tela
WindowListener x = new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
};
janela.addWindowListener(x);
}

ExIntGrafica19(){ //construtor
258
setTitle("Uso de Menus Popup"); //titulo da janela

setSize(220,120);
setLocation(50,50);
getContentPane().setBackground(new Color(0,128,128));
getContentPane().setLayout(new GridLayout(3,1));
M1 = new JMenuBar(); //cria a barra de menus
T1 = new JTextField();
B1 = new JButton("Botao 1");
B2 = new JButton("Botao 2");
mpopup = new JPopupMenu();
MouseListener registra = new MostraPopup();
B1.addMouseListener(registra);
miCopiar = new JMenuItem("Copiar");
miCopiar.addActionListener(this);
miCopiar.setMnemonic(KeyEvent.VK_C);
miColar = new JMenuItem("Colar");
miColar.addActionListener(this);
miColar.setMnemonic(KeyEvent.VK_O);
miSalvar= new JMenuItem("Salvar", new ImageIcon("xxx.gif"));
miSalvar.addActionListener(this);
miSalvar.setMnemonic(KeyEvent.VK_S);
mpopup.add(miCopiar);
mpopup.add(miColar);
mpopup.add(miSalvar);
getContentPane().add(B1);
getContentPane().add(B2);
getContentPane().add(T1);
}
public void actionPerformed(ActionEvent e){
if(e.getSource() == miCopiar)
T1.setText("Copiar");
if (e.getSource() == miColar)
T1.setText("Colar");
if(e.getSource() == miSalvar)
T1.setText("Salvar");
}
class MostraPopup extends MouseAdapter{
public void mousePressed(MouseEvent e){
mpopup.show(e.getComponent(),e.getX(),e.getY());
}
}
}


Os aspectos mais importantes do exemplo 19 so:

Linhas 7 e 37: declaram e inicializam mpopup como sendo um PopUpMenu por intermdio
da classe JPopouMenu.
Linha 38: MouseListener registra = new MostraPopup(); - cria um evento chamado registro
a partir da classe MouseListener (uma classe que trata eventos do mouse) e o inicializa com
uma classe chamada MostraPopup. Esta a classe especial citada anteriormente que ser
usada para que o menu suspenso seja reconhecido pelos objetos da janela. Ela definida
entre as linhas 62 e 68.
Linha 39: B1.addMouseListener(registra); - registra o boto B1 como gerador do menu
suspenso, ou seja, quando o usurio pressionar o boto direito do mouse sobre o boto B1,
aparecer o menu suspenso, invocando a classe MostraPopup. Observe que o boto B1 o
nico objeto da aplicao que registra o menu suspenso. O boto B2, por exemplo, no
possui ao relacionada ao menu.
Linhas 62 a 68: definem a classe MostraPopup cuja funo foi descrita anteriormente. Essa
estende a classe MouseAdapter, uma classe interna da linguagem Java que realiza o
tratamento de eventos do mouse. A linha 64 possui o mtodo mousePressed que, como o
prprio nome indica, executado quando o boto do mouse pressionado, no caso o boto
direito. Na linha 66 invocado o mtodo show que se encarrega de pressionar o menu
suspenso na janela na posio definida pelas coordenadas X e Y do ponteiro do mouse.

259

Outros objetos podem ser inseridos em menus, aumentando s a complexidade. Por exemplo:
possvel inserir botes de rdio (JRdioButton) e caixas de marcao (JCeckBox). A forma de inseri-
los no menu a a mesma, ou seja, pelo mtodo ass (menu.add.objeto_selecionado)





Gerenciadores de Layout

A aparncia e esttica da aplicao so extremamente importantes, pois a interface do
usurio o carto de visitas da aplicao. Os objetos devem estar distribudos em harmonia pela
janela, agrupados de tal forma que facilitem a compreenso e execuo das tarefas por parte do
usurio, reduzindo a quantidade de movimentos necessria operao da aplicao.
No decorrer dos exemplos deste captulo, diversas vezes foram utilizados os gerenciadores
de layout de fluxo (FlowLayout) e de grade (GriLayout). Existem diversos detalhes envolvidos na
utilizao desses gerenciadores e, alm desses, existem outros tipos de gerenciadores. Este item
procura abordar de forma resumida os principais aspectos envolvidos no gerenciamento de Layout
das janelas por meio dos gerenciadores mais usados.
Uma interface de usurio construda a partir de componentes chamados conteiners que
contm outros componentes. Os maiores exemplos de continers usados at aqui so os Frames
(JFrame) e os painis (JPanel). Caso nenhum gerenciador de layout seja especificado na aplicao,
a linguagem Java considera que toda a extenso do continer formada por apenas uma clula,
possibilitando assim, a incluso de apenas um objeto.
Como o leitor observou nos exemplos anteriores deste captulo, os componentes na so
inseridos na janela por meio de coordenadas X e Y. em vez disso, eles so inseridos de acordo com
a organizao definida pelo gerenciador de layout da janela. Os principais gerenciadores de layout
disponveis pelo gerenciador so: FlowLayout, GridLayout, BorderLayout e CardLayout. Este item
aborda os principais aspectos envolvendo esses gerenciadores.


FlowLayout

O FlowLayout se constitui no mais simples gerenciador de layout da linguagem Java. Nele os
componentes so dispostos da esquerda para a direita na ordem em que aparecem, isto , na ordem
em que os componentes so adicionados janela pelo mtodo add. Quando no existe mais espao
em uma linha criada outra linha abaixo desta e este critrio usado em toda janela. A distribuio
dos objetos por meio do FlowLayout pode ser comparada distribuio das palavras que um editor
de texto qualquer faz, isto , ao terminar o espao da linha, a palavra colocada na linha abaixo.
Esse processo feito automaticamente de acordo com o tamanho da janela.
A sintaxe utilizada para a definio do layout de fluxo a seguinte:

getContentePane().setLayout(new FlowLayout([alinhamento,
espaamento_horizontal, espaamento_vertical|));

Em que;

Alinhamento refere-se ao alinhamento que os componentes assumiro no momento em que
forem inseridos no continer, podendo assumir os seguintes valores inteiros: 0 = esquerda, 1
= centralizado, 2 = direita. O alinhamento opcional e quando no especificado, assume
valor 0.
Espaamento_horizontal refere-se distncia que ser dada entre os objetos inseridos na
260
mesma linha do continer. O espaamento horizontal opcional e quando no especificado
considerado com 5 unidades.
Espaamento_vertical se refere distncia que ser dada entre as linhas do container
onde os objetos esto inseridos. O espaamento vertical opcional e quando no
especificado, condiderado com cinco unidades.

Sendo assim, um layout pode ser criado definindo o espaamento que os objetos tero entre
si na janela, da seguinte forma:

GetContentPane().setLayout(new FlowLayout(1,20,40));

Com esta declarao, ser criado um layout de alinhamento centralizado, 20 unidades de
espaamento horizontal e 40 unidades de espaamento vertical.





A tabela 13 apresenta as variaes possveis para a definio do layout de um continer por
meio do FlowLayout:

Mtodo Funo
FlowLayout() Cria um layout padro: alinhamento centralizado e
espaamento entre objetos com cinco unidades.
FlowLayout(int) Cria um layout com o alinhamento fornecido e
espaamentos entre objetos com cinco unidades.
FlowLayout(int,int,int) Cria um layout com o alinhamento, espaamento horizontal
e espaamento vertical fornecidos.


GridLayout

O GridLayout um gerenciador que divide um continer num conjunto fr clulas espalhadas
numa grade retangular, de maneira que todas as clulas possuam a mesma dimenso. Com o
GridLayout uma janela pode ser dividida em linhas e colunas de acordo com os argumentos
especificados no momento de sua criao. Os componentes so dispostos na ordem em que
aparecem, sendo inseridos na grade da esquerda para a direita e de cima para baixo. Os
componentes adicionados grade so expandidos de forma a ocuparem todo o espao da clula em
que esto inseridos. Qualquer modificao no tamanho da janela (ou painel) refletir
automaticamente no tamanho dos componentes adicionados a ela, ou seja, os componentes so
redimensionados em funo da nova dimenso da janela.

A sintaxe utilizada para a definio de layout da forma de grade a seguintes:

getContentePane().setLayout(new
FlowLayout([numero_de_linhas,numero_de_colunas, espaamento_horizontal,
espaamento_vertical|));

Em que:

Nmero_de_linhas refere-se quantidade de linhas que a grade ir conter. Se no
especificado, assume valor 1.
Nmero_de_colunas - refere-se quantidade de colunas que a grade ir conter. Se no
especificado, assume valor 1.
Espaamento_horizontal e espaamento_vertical idem ao descrito para o gerenciador
FlowLayout. So parmetros opcionais.

O espaamento GridLayout indicado quando os objetos a serem inseridos em um continer
necessitam estar dispostos em forma de linha e colunas, geralmente alinhados. Nem todas as
aplicaes utilizam objetos alinhados e, na maioria das vezes, o gerenciador GridLayout sozinho no
261
uma boa opo, de uma aplicao, geralmente usada uma combinao de diversos
gerenciadores, utilizando painis.
A tabela 14 apresenta as variaes possveis para a definio do layout de um continer por
meio do GridLayout:

Mtodo Funo
GridLayout() Cria um layout com uma linha e uma coluna.
GridLayout(int,int) Cria um layout com o nmero de linha e colunas
especificados.
GridLayout(int,int,int) Cria um layout com o nmero de linha e colunas
especificados.e com espaamento horizontal e
espaamento vertical fornecidos.


BorderLayout

O BorderLayout um gerenciador que divide um conteiner em cinco regies distintas: north
(regio superior), south (regio inferior), west (regio esquerda), east (regio direita) e center
(regio central). Diferentemente dos gerenciadores FlowLayout e GridLayout, a ordem com que os
componentes so inseridos irrelevante, uma vez que o conteiner dividido em regies fixas. Em
cada regio cabe apenas um componente, ou seja, como o conteiner dividido em cinco regies,
apenas cinco componentes podem ser inseridos nesse layout. Caso outro componentes seja inserido
em uma regio j ocupada, o componente ser sobreposto. Da mesma forma que o GridLayout, as
regies do BorderLayout so redimensionadas de acordo com as dimenses da janela.
A diviso de uma janela em apenas cinco regies parece uma desvantagem, porm cada
componente adicionado pode ser um painl que pode ter seus componentes prprios , gerenciados
por um layout prprio.

A sintaxe para definio do layout na forma de regies a seguinte:

getContentePane().setLayout(new BorderLayout([espaamento_horizontal,
espaamento_vertical]));

Em que:

Espaamento_horizontal e espaamento_vertical idem ao descrito para o gerenciador
FlowLayout e GridLayout. So parmetros opcionais.

Para a utilizao do BorderLAyout existe uma pequena diferena em relao aos
gerenciadores anteriores: necessrio informar no mtodo add em qual regio o objeto ser inseirod.

GetContentPane().add(North,B1);
GetContentPane().add(South,B2);
GetContentPane().add(West,B3);
GetContentPane().add(East,B4);
GetContentPane().add(Center,B5);
Outro ponto a ser observado com o uso do BorderLayout que as regies no necessitam
ser preenchidas obrigatoriamente. possvel usar apenas as regies desejadas. As regies no
usadas sero consideradas pelo gerenciador como uma regio nica que pode receber um
componente qualquer. Observe a seguinte listagem:

GetContentPane().add(North,B1);
GetContentPane().add(West,B3);
GetContentPane().add(T1);

Este trecho utilliza apenas as regies superior e esquerda; as outras regies no so usadas.
Dessa forma o objeto T1 (um campo texto) ir ocupar o restante do espao disponvel no layout.

A tabela 15 apresenta as variaes possveis para a definio do layout de um conteiner por
meio do BorderLayout.

Mtodo Funo
262
Mtodo Funo
BorderLayout() Cria um layout sem espaamento entre as regies
BorderLayout(int,int) Cria um layout com espaamento horizontal e vertical entre
as regies.


CardLayout

O CardLayout se constitui num gerenciador mais aprimorado que pode agrupar diversos
conteiners na forma de cartes, mostrando um de cada vez, como um baralho ou como pginas de
um livro, ou seja, apenas um conteiner visvel de cada vez. Com esse gerenciador torna-se possvel
a criao de pilhas de conteiners e qualquer um pode ser exibido de cada vez. Cada conteiner pode
possuir seu layout especfico, permitindo que diversos gerenciadores de layout sejam usados em um
mesmo espao da janela. Muitas aplicaes apresentam esse tipo de agrupamento, em que diversos
formulrios podem ser selecionados por meio de uma guia, geralmente na parte superior.

O exemplo 20 demostra o cdigo completo para a manipulao de layout. Cada boto faz
aparecer um novo painel, dando a impresso de trocar a pgina da janela.


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ExIntGrafica20 extends JFrame implements ActionListener{
JPanel painelBotoes, painelCard, P1, P2, P3;
JButton B1,B2,B3,B4,B5,B6, btpainel1, btpainel2, btpainel3;
JLabel L1, L2, L3;
JTextField T1, T2;

public static void main(String args[]) {
JFrame janela = new ExIntGrafica20(); //declaracao e inicializacao do
objeto janela
janela.show(); //mostra a janela na tela
WindowListener x = new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
};
janela.addWindowListener(x);
}

ExIntGrafica20(){ //construtor
setTitle("Uso do Gerenciador de CardLayout"); //titulo da janela

setSize(280,170);
setLocation(50,50);
getContentPane().setBackground(new Color(0,128,128));
getContentPane().setLayout(new BorderLayout());
B1 = new JButton("Botao 1");
B2 = new JButton("Botao 2");
B3 = new JButton("Botao 3");
B4 = new JButton("Botao 4");
B5 = new JButton("Botao 5");
B6 = new JButton("Botao 6");
L1 = new JLabel("Esse o painel 1", JLabel.CENTER);
L2 = new JLabel("Esse o painel 2", JLabel.CENTER);
L3 = new JLabel("Esse o painel 3", JLabel.CENTER);
T1 = new JTextField("Linguagem", 20);
T2 = new JTextField("Java", 10);
btpainel1 = new JButton("Painel 1");
btpainel1.addActionListener(this);
btpainel2 = new JButton("Painel 2");
btpainel2.addActionListener(this);
btpainel3 = new JButton("Painel 3");
btpainel3.addActionListener(this);
263
painelCard = new JPanel();
painelCard.setLayout(new CardLayout());
painelBotoes = new JPanel();
painelBotoes.setLayout(new GridLayout(1,3));
P1 = new JPanel();
P1.setLayout(new FlowLayout());
P1.add(L1);
P1.add(T1);
P1.add(T2);
P2 = new JPanel();
P2.setLayout(new GridLayout(4,1));
P2.add(L2);
P2.add(B1);
P2.add(B2);
P2.add(B3);
P3 = new JPanel();
P3.setLayout(new BorderLayout());
P3.add("North", B4);
P3.add("Center",L3);
P3.add("East",B5);
P3.add("South",B6);
painelBotoes.add(btpainel1);
painelBotoes.add(btpainel2);
painelBotoes.add(btpainel3);
painelCard.add(P1, "p1");
painelCard.add(P2, "p2");
painelCard.add(P3, "p3");
getContentPane().add("North",painelBotoes);
getContentPane().add("South",painelCard);
}
public void actionPerformed(ActionEvent e){
CardLayout c1 = (CardLayout) painelCard.getLayout();
if(e.getSource() == btpainel1) //se pressionado o botao painel 1
c1.show(painelCard, "p1"); //exiba o painel 1
if(e.getSource() == btpainel2) //se pressionado o botao painel 2
c1.show(painelCard, "p2"); //exiba o painel 2
if(e.getSource() == btpainel3) //se pressionado o botao painel 3
c1.show(painelCard, "p3"); //exiba o painel 3
}
}

Os aspectos mais impottante do exemplo 20 so:

Linha 30: define o layout da janela como sendo do tipo BorderLayout, ou seja, dividir a
janela em cinco regies.
Linhas 42 e 43: declarama e inicializam o objeto painelCard como sendo um painel de cartes
criado a partir da classe JPanel e gerenciado a partir de CardLayout.
Linhas 44 e 45: declaram e inicializam o objeto painelBotoes como um painel no formato
grade, contendo uma linhapor trs colunas. Esse painel obrigar os trs botes usados na
aplicao para trocar os painis da janela.
Linhas 46 a 48: criam e definem o objeto P1 como um painel de fluxo, adicionando a ele o
label L1 e os TextFields T1 e T2.
Linhas 49 a 51: criam e definem o objeto P2 como um painel de grade contendo quatro linhas
e uma coluna, adicionando a ele o label L2 e os botes B1, B2 e B3.
Linhas 52 a 54: criam e definem o objeto P3 como um painel de regies, adicionando a ele o
label L3 e os botes B4, B5 e B6.
Linhas 55 a 57: adicionam trs botes ao painelBotoes.
Linhas 58 a 60: adicionam os painis P1, P2 e P3 ao painelCard. Observe que cada painel
associado uma string de identificao, o que possibilitar invocar a exibio do painel quando
necessrio.
Linhas 61 e 62: adicionam janela da aplicao os painis painelBotoes e o painelCard que
contm os trs painis P1, P2 e P3.
Linha 67: declara e inicializa o objeto cl como sendo um painel da classe CardLayout que
contm o layout definido por painelCard. Esse objeto cl usado para invocar os painis
contidos no painelCard por meio do mtodo show(), conforme apresentam as linhas 69, 71 e
264
73. Observe que o mtodo show() contm como argumentos: o nome do painel que ser
utilizado (painelCard) e o identificador do painel que ser exbido (p1,p2,p3).



Conforme o leitor percebeu, utilizando o gerenciador de layout CardLayout possvel
apresentar diversos tipos de painel em uma s ajanela, sendo possvel apresentar diversos tipos de
painis em uma s janela, sendo possvel navegao entre eles pelos mtodos da classe
CardLayout. Observe na tabela 16 os mtodos usados para navegao entre os painis: possvel
exibir i primeiro, o ltimo, o prximo, o anterior ou exibir um painel diretamente por meio de seu nome,
conforme apresentado no exemplo 20. A ordem dos painis depende da ordem em que foram
inseridos.

Mtodo Funo
CardLayout() Cria um layout sem espaamento entre os painis
CardLayout(int,int) Cria um layout com espaamento horizontal e vertical entre
os painis.
first(container) Exibe o primeiro componente (painel) adicionado ao
CardLayout.
last(container) Exibe o ltimo componente (painel) adicionado ao
CardLayout.
previous(container) Exibe o componente anterior (painel) adicionado ao
CardLayout.
Next(container) Exibe o prximo componente (painel) adicionado ao
CardLayout.
show(container, String) Exibe o componente especificado pela string fornecida.