Académique Documents
Professionnel Documents
Culture Documents
"
# "
$
# %&
# %%
%'
()*
+,-*,)+.*/
01/ 23- %'
()*
+,-*)4+*/
.56. /
7-4 %'
()*
+,-*)4*)8
+7/-9+/4 %
()*
+,-*)48
:;/7-4 %
< %
= %>
%?
%!
%"
@ '&
+44+;)5 ,)(+* A5).*-4)5 +B+ '&
-9B)*43-,) / (-4) +4 ./
9; '%
-9B)*4C)4 1.-5D. /
7+4 '%
+4.,) / (-4 97-5(+. E
B)/
4 '%
4-,-. )78+,-(+*++)9. *+,+,),+,-4 '
8;-*/
.5-4 )4 -8
B/,-4 '>
F @ '!
'$
)8)2
3- /5(8)4 '$
)8)2
3- -5(-4 .+ &
)8)2
3- 97+,)+,+ '
)8)2
3-)97+,)+,+G). )*
-;H9)+ '
)8)2
3-)97+,)+,+G-5-;H9)+
)8)2
3-,)5I8 ./
(8+)47-8
J+ >
8;-*
/.5-4 )4-8
B/,-4 !
F &
>
)()./
23-7-5 .)4.
)9-/ 9E7/
- >
)()./
23-7-5 .)4.
)9-K /9+8 "
)()./
23-7-5 B+*/
DB)8,)7 -9.
*-8
) $
-5(+*+23-)9.*))4.*
1.1*+4,)*)().
/23- >&
1.*-4)L)5(8
-47 -5(8)5)9.+*)4 >>
F ?"
!" #$
M # !>
M !!
F M # !$
" %
# G = "&
# N O "&
)78
+*+23- "&
+9/
(18+23- "&
# N P O $!
)78
+*+23- $!
+9/
(18+23- $!
F P %&!
% & '
%&"
%&"
J+5+,+,)(*
-7),/
5)9.
-4 %&$
M %%%
# %%'
%%
+*
A5).
*-4K
-*5+/
4 %%
+*
A5).
*-4*
)+/
4 %%
%%
+4
4+;)5 ,)(+*
A5).
*-4(-*B+8
-* %%
+4
4+;)5 ,)(+*
A5).
*-4(-**)K
)*H97
/+ %%
< P %'%
( " ')
%'
%'
%'>
%'?
%'?
F %'!
F %&
F %'
F %>
%!
F %!
F %$
F %%
F %
F P Q RQ %?
< %>'
* & ! '$+
%>?
%>?
%>?
M %>?
8
+4 4
/K/
7+23-S94.
+97/
+23- %>?
)9)*+8/
T+23-S4()7/
+8
/T+2
3- %>!
;*);+23-S )7-5(-4/
23- %>"
44-7/
+23- %?%
F # %?%
! '+
%?'
%?'
%?'
%?'
%?
!" ! '+$
%??
%!&
0U).-4R56.-,-4)B+*/
DB)/
4 %!&
;*);+23- %!&
)94 +;)94 %!%
8+44
)4)/ 94.
A97/
+4 %!'
G)*+92+ %!'
-0*)7+*;+,) ()*+,-*
)4) -8
/
5-*
K/
45- %!
& , '#$
%!>
*
/+9,-+ 8+44) +/
L+ %!>
4+E,+,-(*-;*+5+4)*
D %!?
B-815)) % && %!?
%!?
97
81/
9,-15 6.-,-9+ 8
+44
) +/
L+ %!!
).-*
9+9,-15 +8
-* %!"
97
81/
9,-15 6.-,-7-5 +*
A5).
*-4V 8
+44
) +/
L+ %!"
%!$
%"&
P NO %"&
- . ''
%"%
%"'
< G %"
< G %"
- '
G %"
G %"
%">
(8
/
7+9,-+ -0*
)(-4
/23-,) 6.
-,-4 %">
%"?
* '#
%"!
*
/+9,-15 +7-.) %"!
+*
/DB)8,) 50/
)9.
) G %""
%""
%"$
%"$
/ & '0
%$&
%$%
W< G %$%
G Q %$%
G Q %$'
W %$
M M %$
%$
1 2 '0$
%$>
.
*)+54,) X.
)4),) +*
+7.
)*)4 %$>
.
*)+54 *
),)K
/9/
,+4 %$?
%$?
)/
.1*
+,) +*+7.
)*)4,- )7
8+,- %$!
)/
.1*
+,) .*
/9;4,- )78
+,- %$"
%$"
%$"
** '
'&%
# '&'
9/
7/
+23-) /
9+8
/
T+2
3-,)15 ((8
). '&
'&
G '&
/ 3 $
'&>
5 * )B)J/4
.:*/
7- '&>
*/
97E
(/-40D4/
7-4,)15 +50/)9.) +B+7
8D4
4/7
- '&>
-* )9.*-,+ 8+.+K
-*5+ +B+ '&!
-5(/8
+,-*) 50/ )9.),) L)712
3- +B+ '&"
/ 0
'&$
'&$
'&$
'&$
'%&
Y '%&
M '%&
'%%
'%'
'%'
# '%'
# '%
# '%
'%
# Z '%
M '%
'%>
P '%>
% .
*/
9; '%>
' 8
+44)[1)*)(*
)4)9.
+,+.
+4F U
+B+1.
/8,+.
) '%?
8
+44)4,) 9.*
+,+) +E
,+ '%!
/
8
) '%"
/
4567 86 9:;<
= 6>?
9:;<@
A
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:
+O
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.
AB
6CD 7 8<?
9:;<
= 6>?
9:;<86E : < <4F @
3
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.
= 6> <?
: C @
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.
E C
GH;<8<; H7C 4F 86<?
: C 7
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.
6E 676HC
<4F 86<?
: C 7
Um algoritmo uma linha de raciocnio, que pode ser descrito de diversas maneiras, como
por exemplo: pseudicdigo, descrio narrativa, fluxograma ou diagrama de Chapin.
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;
4
Diagrama Chapin ou N-S
Acionar o interruptor
Lmpada no
acendeu?
F V
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?
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;
5
Fluxograma ou Diagrama em blocos
incio
Soquetes testados
< 10
Acionar o interruptor
Lmpada no
acendeu?
Acionar interruptor
Subir na escada
Lmpada no
acendeu?
fim
6
I6 ;J
; 7 86 I<4F
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?
7
H;6C 7 A 7 ; 7 7 A 6<?
: C 7
O
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.
E7E CD 7
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.
"< D6?
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.
$%
! "
# " #
"
& ' ()$*'+ ($*,+
8
. -* ()* $/, /'- %/'+
(* $/, /'- %/,+
HC 6 7
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.
?
6<H 7
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.
H7C
<HC
67
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:
9
\ 5-,/
K/
7+,-*
)44
3-1.
/8
/T
+,-4(+*
+5-,/
K/
7+*++.
*/
01/
23-,)7
8+4
4)4
RB+*
/DB
)/4-156.
-,-4
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.
H;<4F HG ;<
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:
10
}
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.
6HC 7
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 */.
I6 E?\
/**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{
11
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);
}
}
9 : " 8
9 ; <# = " " 8 "
<#
9 7 > #
< " " 8 ? @ "
99 A " "
9B C " " A " " " "
8
;15+44
)[]H97
/+47
-5194,))4
7+()
E6 <8 67
E6<8 86<C A 4F
Ex:
nome = fulano de tal;
resultado = a + 5;
valor = 3;
C
<\ (+*
++8
;-*
/.
5-4(-,)5-41.
/8
/T
+*^<< (+*
+/9,/
7+*+.
*/
01/
23-
12
! ! "
. A ) " # 66 C $
" 6$ 5 " 66 (
" $
+> 66 ( $
) +
D A ) " # )) $
" )$ 5 " )) (
" $
+> )) ( $
+
= " <# E E E ( " " +
D # F F F ( " +
! ! "
5 " <# G EE A
5 " *- *G-
=8 H H (
" # "
" 4
1 4 *
1 H *>
# / ( +
$+
C <# 6 6 6 (
+
<# ) ) ) (
+
E6<8 67 6?
<; H<7
! ! "
= I I I ( 4
@
#
4 +
= 0 IJ IJ IJ ( 4
0
#
4 +
= K K K ( 4
@
#
4 +
= 0 KJ KJ KJ ( 4
0
#
4 +
13
! ! "
.0 LJ LJJ JJ ( 4 0
#
4
D4 KI MJ MJ ( 4
4
#
4
E6<8 67 ?
9:; 7
! ! "
5 NN C J 3 NN MJ 1 (
! 0 3
! 4 1 #
O
4 +
PP C J 3 PP MJ 1 (
! 0 3
! 4 1 #
" <Q
4 4 +
# # M M I 3 ( 4
@ 3
4 O
+
<A6?
<LD6 8<86
!! "
#$
% &' ( )* + % &' ( )* + % &' ( )* + % &'
#$
% && ' ( "& + % && ' , "& + % && ' !! ( "& + "% && '
- R R R R S
. R S S R S
S R S R R
S S S S R
14
* 6;68MH;<8 7 E6 <8 67
%
(+ T D @ "
UV &
<#
66 8 ) D " @
)) 8 )
66 ) D " @
)) )
6 =
) =
M : 0 <# 80
W O "
( " + O <#
E = " <# D @ "
F D #
H =8
6 C <# D @ "
) <#
%
KK D " @ D @ "
II D "
#
III D "
#
K 7 @ D @ "
KJ 7 0
I 7 @
IJ 7 0
. 4 O " <# "
JJ 7 0 D @ "
MJ 7 # 0
N 5 D @ "
G A D @ "
A 80
P A D @ "
A 80
NN 5 80 D @ "
PP A 80 D @ "
X ; D " @
J C <# D " @
6J C <# <#
)J C <# <#
EJ C <# " <#
FJ C <# #
HJ C <# 8
NJ C <# 5
GJ C <# A
PJ C <# A
KKJ C <# " @
IIJ C <# "
#
15
IIIJ C <# "
#
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));
}
}
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.
16
Ex.:
incio
comando 1;
se condicao1 ento
comando2;
comando3;
seno
comando4;
comando5;
fim-se
comando6;
fim
17
I6 ;J
; 7 86KI<4F
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
3. Sabe-se que o uso incorreto da precedncia de operadores ocasiona erros. Pensando nisso,
avalie as expresses a seguir e:
a) Delta <-- B2 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
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 " # CJ/ KI 3 CJ/ KI 3 CJ/ KI 3 # CJ/
7
"
18
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
19
7C C <7 86; HC ?
6
N
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.
7C C < 6=N6H;<?
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:
HJ
; S
S/,)9.
/K
/7+2
3-,-/
9E7
/-,-08
-7-7
-**
)4(-9,)9.
)+-+8
;-*
/.
5-
S
S,)7
8+*
+23-,+4B+*
/DB)/
4
SS7-*
(-,-+8
;-*
/.
5-
+23-%_
+23-'_
+23- _
+23-9_
K SSK/
5 ,-+8
;-*
/.
5-
*<77<:6 86E< G 6C 7 6 !
<D<
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.
I6 E? )\
20
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;
}
}
Exemplo:
java Exemplo4 Aprendendo Java
HD67F 86 E 7 6 <7CH:
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.
HD67567 C C;<7
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:
<7C86 E 7 H; E<C
JD67
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;
21
double d - 2.987;
A linguagem Java possui uma srie de classe que realizam essa tarefa de converso. Segue
abaixo tabela mostrando essa tarefa:
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:
I6 E? $3
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);
}
}
22
7 8 C
6;?
<8 E< <<6HC<8<868<8 7
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:
I6 E? +3
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);
23
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.
I6 E? #3
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");
}
}
}
" & \
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.
24
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.
I6 E?7\
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.
2
c) Construa um algoritmo para calcular as razes de uma equao do 2 grau (ax + 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(x1,y1) e Q(x2,y2), 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.
?
: C 7 67 ?
D8 7
?4567 6 !<D<3
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{
25
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);
26
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));
}
}
I6 ;J
; 7 86 I<4F O 7C C <76=N6H;<?
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.
27
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 m3 de gua que a piscina conter e o preo
de R$ 45.00 por m3.
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.
28
7C C <7 8676?
64F
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.
*<?
<D<7L;P<D66 !<D<
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
4
.+.
/7 4
1()* 4
`/.
7J 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
6?
64F E?
67
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;
a) if (<condio>)
C; // comando nico (ao primitiva)
b) if (<condio>) { // inicio do bloco verdade
C1;
29
C2; // seqncia de comandos
.
.
Cn;
} //fim do bloco verdade
Observe que a condio deve sempre aparecer entre parnteses, item obrigatrio na
linguagem Java.
I6 E?\ 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");
}
}
6?
64F E 7C
<
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;
30
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.
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.
I6 E?\ 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! ");
}
}
31
6?
64F H;<86<8<
6?
64F 6H;<86<8<-6C
6 :MH6<
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;
$ ( $ ) $ * $ + $ , % "
/ / 0 0 0 ( 1
2 0 / 0 0 ( 3
2 0 2 / /
2 0 2 2 0
I6 E?\ 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
32
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");
}
}
6?
64F 6H;<86<8<- :MH6<
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:
33
se <condio1> e <condio2> e <condio3> e <condio4> ento
W;
fimse;
$ ( $ ) $ * $ + % "
/ / / / 4
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;
- . /( - . /) - . /* - . /+ %
/ 2 2 2 1
2 / 2 2 3
2 2 / 2 5
2 2 2 / 6
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;
34
- . /( - . /) - . /* - . /+ %
/ 0 0 0 1
2 / 0 0 3
2 2 / 0 5
2 2 2 / 6
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.
6?
64F 86 Q?
CE?
<67; ?
P<
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;
35
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;
I6 E?7\
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:
$0
$
*
-
/
3 %
,' 1
$2 O )
*3
2. Crie um programa que receba pelo teclado (use DataInputStream) o valor de um produto e um
cdigo de aumento, segundo a tabela seguinte:
$0 1
$ $3
- *2
/ -3
' /2
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.
2 $#
[ E 6 (32E \ " +
36
2 $#
D .: ) KJ $222
.: J E' 3F$22
) I $222
.: J E1F$22
D .7 ) KJ 322
.7 J 2
) I 322 KJ $222
.7 J E3F$22
) I $222
.7 J E,F$22
@ .: ) .7
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.
? : C 7 67 ? D8 7
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.
?4567 6 !<D<3
%O
import java.io.*;
class ExSelecao4{
public static void main(String args[]){
BufferedReader entrada;
entrada = new BufferedReader (new InputStreamReader (System.in));
37
double preco;
int origem;
try{
System.out.println("Entre com o preo do produto:");
preco = Double.parseDouble(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");
}
}
}
'O
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);
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;
38
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");
}
}
}
O
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);
}
}
O
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());
Sal_Bruto = HT * SH + (50*ND);
//calculo do INSS
if(Sal_Bruto <=1000)
39
INSS = Sal_Bruto*8.5/100;
if(Sal_Bruto >1000)
INSS = Sal_Bruto*9/100;
//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");
}
}
I6 ;J
; 7 86KI<4F O 7C C <8676?
64F
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.
40
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
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
41
13) Faa um programa que receba a idade de uma pessoa e classifique-a seguindo o critrio a
seguir:
$
2 * 7 )
- $$ <
$* $1
*2 33
C 33
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:
( $ 78 %
$' */ , ' 1
*3 /2 / 3 %
/$ ,2 $ * -
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
42
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))
4 5 6 576
I */2 322
$'22 ^^P */22 /22
$*22 ^^P $'22 -22
%22 ^^P $*22 *22
KJ %22 $22
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:
2 8 # '
.4 *22
$2 22H *22 322
*2 22H " 322
43
$0 $
$ _ @ $2H
* ` # 3H
- 5 * " < @ !
/ 5 - " < @ ! $2H
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:
' 9
6 <#
) <#
E " <#
F #
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
Voadores Morcego
Aquticos Baleia
Tropical Avestruz
No-voadoras
Polar Pinguim
Aves
Nadadoras Pato
De rapina guia
44
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.
7C C <7 86 6E6C4F
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.
6E6C4F ; C
67C
6H HJ
;
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;
45
b) em Java
while(<condicao>){
}
inicio
//declarao de variveis
n1,n2,n3,n4,ma:real;
con:inteiro;
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:
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;
46
MAT = ACM/50; //calculo da media anual da turma
escreva(Media anual da turma =, MAT);
fim.
inicio
//declarao de variveis
ma, acm, mat:real;
con:inteiro;
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;
47
6E6C4F ; C
67C
6H KH<?
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.
I6 E?7\
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;
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;
48
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.
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:
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:
49
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;
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
Exemplos:
a) pseudocdigo
- enquanto
inicio
//declarao de variveis
n,cont:inteiro;
50
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.
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
51
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);
}
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!");
}
}
}
I6 ;J
; 7 86 I<4F O 7C C <86 6E6C4F
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.
52
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:
53
1,2,3,4 = voto para os respectivos candidatos;
5 = voto nulo;
6 = voto em branco.
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:
%
C * .
* - 3 22H
- 3 $2 22H
3 , $3 22H
C , *2 22H
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:
:
C a ;.=
=
O 75] A C7
D 7A .=
5 b .=
Elabore um programa que, lendo estes dados, calcule e imprima:
a quantidade de respostas timo;
a diferena percentual entre respostas bom e regular;
54
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.
C 7 6I6 E?7 ; E?
6 6HC
< 67
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.*;
55
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;
fim.
b) programa em Java
import java.io.*;
class ExemplosGerais2A{
public static void main(String args[]){
int a,b,c,aux;
56
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)
57
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.
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);
}
}
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!!!");
}
}
}
58
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:
Mn = C(1 + I)n
Onde:
Mn - 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);
montante = c;
taxa = taxa / 100;
n = 4 * x;
for (trimestre = 1;trimestre <= n;n++){
rendimento= taxa*montante;
59
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());
60
}
}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.*;
61
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());
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());
}
}
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:
62
;R $ $3
* $'
O * $'
R * $'
5 8 - *2
- *2
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
63
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;
64
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!");
}
}
}
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
65
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:
3 5
SenA = A- A + A - ...
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.
66
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.
67
/ 2 O 7C C <7 86; HC ?
6
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;
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.
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:
9) Foi feita uma pesquisa para determinar o ndice de mortalidade infantil em um certo perodo. Fazer
um programa que:
68
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:
69
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:
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
70
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.
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:
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.
71
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.
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.
S= 1 + 3 + 5 + 7 +...+ 99
1 2 3 4 50
21 + 22 + 23 +...+ 250
50 49 48 1
S= 37 X 38 + 36 X 37 + 35 X 36 +...+ 1 X 2
72
1 2 3 37
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:
29) Fazer um programa que calcule e escreva a soma dos 30 primeiros termos da srie:
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 A3 + A5 A7
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.
S= 1 - 1 + 1 - 1 + 1 ...
13 33 53 73 93
3
Sendo = S X 32
Fazer um programa para calcular e escrever o valor de com 51 termos.
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!
73
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
x
38) Fazer um programa que calcule o valor de e atravs da srie:
x 0 1 2 3
e = x + x + x + x +...
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.
S = X - X2 + X4 - X6 +...
3! 5! 7!
74
H4567 <C
6 C;<7 686 C H:6 !<D<
H4567 <C
6 C;<7
A
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:
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.
"
56 C 4 <# (+ = (K " I+>
c " "
" " 8
56 C 4 <# (+ " = 4 (K " I+>
"
"
"56 C 4 <# (+ " 4 = (K $I K *I+>
@ " "
56 C 4 <# (+ 4 = (K $I K *I+>
4 <# (+ # "
56 ? @ = @ (K " I+>
) 4 <#
(+ @ @ !
@ "
"
I6 E?7\
75
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));
}
}
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();
}
}
}
76
H4567 86 C H:
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>);
"
<56 C 4 <# (+ " K 0I 0 (+>
" 4 " T
5 4 ) d " <#
2 " $
0 "
= $ 56 ; 4 K 0I A "" O (+
> ; $ 56 ; 4 K 0I Z O (+
I6 E?7\
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()");
77
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");
}
}
78
I6 ;J
; 7 86KI<4F O KH4567 <C
6 C;<7 686 C H:7
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
3
volume de gua ser calculado pela frmula: volume = lado . 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
79
"6C 67 6 <C R67
"< D67 ; E 7C
<7 P :MH6<7
A
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.
"< D67 ; E 7C
<7 H8 6H7 H<7 S
D6C 67T
Declarao
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]);
58 4 -5.7 2 3.2 6 9 7 0 -1
0 1 2 3 4 5 6 7 8 9
Exemplo
a) algoritmo em pseudocdigo
inicio
A,B,C,D,E,F,G,H,I,J,NotaAcima:inteiro;
80
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());
81
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;
82
para x=1 ate 10 faca
se (vclasse[x] > media) entao
NotaAcima = NotaAcima+1;
fimse;
fimpara;
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;
83
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;
b) programa em Java
class PreencheVet{
public static void main(String args[]){
84
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.
85
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
86
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;
87
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");
}
}
}
LP
... 9999
$ * - / 3 % , $32
OC
... 9999
$ * - / 3 % , **2
Soluo:
a) algoritmo em pseudocdigo
inicio
LP:vetor[1..151] de inteiros;
OC:vetor[1..221] de inteiros;
i,j:inteiro;
88
i=1;
leia(OC[i]);
enquanto (OC[i] != 9999) faca
i = i + 1;
leia(OC[i]);
fimenquanto;
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());
}
89
}
}
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
331 0
3
. . .
. . .
. . .
35 447 90
1
36 221 16
37 291 15
Soluo:
a) algoritmo em pseudocdigo
inicio
Voos,LDisp:vetor[1..37] de inteiros;
cliente, Nvoo, apont, i:inteiro;
90
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());
}
}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).
91
Estrutura de dados principal:
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;
92
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!!");
}
}
}
93
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
94
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");
}
}
}
95
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!");
}
}
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]);
}
}
96
"< D67 ; E 7C
<7 ?
C8 6H7 H<7 S <C R67T
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
Exemplo:
Um vetor de 10 posies de reais poderia ter a seguinte definio e declarao:
Manipulao
2 $ * - ndices de coluna
ndices de linhas 2
$ msala[1,2]
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;
97
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++;
}
98
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;
//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;
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;
99
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;
100
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;
101
fimpara;
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:
102
a) algoritmo em pseudocdigo
inicio
A:matriz[1..4,1..4] de inteiros;
I,j,k:inteiro;
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
103
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!!");
}
}
}
104
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;
105
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!!");
}
}
106
}
I6 ;J
; 7 86 I<4F O D6C 67 6 <C R67
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.
107
8?
< R<4F
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.
6; E 7 4F
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.
* ;68 6HC 7
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.
108
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
Algoritmo principal
//declarao de variveis utilizadas no algoritmo principal
//Declarao do procedimento
Procedimento nome_do_procedimento()
SS,)78+*+7+-,+4B +*/
+B)/48
-7+/
4+-(*
-7),/
5)9.
-
/9/7
/-Z,-Z(* -7),/
5)9. -
/94.*
12 C)4,-(* -7),/5)9.-
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.
Mdulo
principal
(menu)
Soluo:
a) algoritmo em pseudocdigo
inicio
opcao:inteiro;
Procedimento ModAdicao();
v1,v2,res:real;
inicio
leia(v1,v2);
res = v1 + v2;
escreva (res);
109
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.
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
110
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");
}
}
}
H4567
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.
111
funo nome_da_funo (lista de parmetros):tipo_de_dado da funo
S
S,)7
8+*
+23-,-4-0U
).-4()*
.)97
)9.
)4+)4
.+K
192
3-N-0U
).-48
-7+/
4O
inicio
instrues da funo
fim;
Exemplos:
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;
}
}
7; E 86D< D67
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.
112
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.
*< G 6C 7
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
Exemplo:
a) algoritmo em pseudocdigo
procedimento multiplica*a,b:real)
res:real;
inicio
res = a * b;
escreva(res);
fim;
b) programa em Java
Parmetros reais
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{
113
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);
}
}
*<77<:6 86E< G 6C 7
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.
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
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!";
114
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!");
}
115
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:
116
import java.io.*;
class Diversos{
static BufferedReader entrada = new BufferedReader(new
InputStreamReader(System.in));
117
}
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));
}
}
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;
118
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.
2 2
L=A +B
c D
D = L2 + c
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.
119
Se M < P, por definio
p p
A m =0 eC 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.
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;
120
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.
I6 ;J
; 7 86 I<4F L 8?
< R<4F
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
2
usada a frmula: volume = (4.0/3.0)*pi*raio .
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
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;
121
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:
funo
230860256 dgito verificador igual a 2
funo
2308602562 dgito verificador igual a 0
122
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.
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.
123
= D7
HC 8 4F
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.
6KH4F 86< = D 7
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:
Cdigo do livro:
Ttulo:
Autor:
Assunto:
Editora: Ano:
124
Item da ficha
(campo)
Arquivo de ao Ficha
(arquivo) (registro)
<HE ?
<4F
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:
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.
125
Independentemente do tipo de um arquivo, ele tem a capacidade de executar algumas
operaes em comum, tais como: abertura, leitura e fechamento,
E 7 86< = D 7
Arquivo texto
R campos
e
g Nome Endereo CEP Telefone
i
s Z Man Rua dos bosque, 10 69025-952 251-8547
t
Maria Xiquinha Rua da Gruta, 247 69025-852 542-8756
r
o Jurubeba Silva Av. Leste-Oeste, 1002 69054-584 236-8547
s
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.
<7 86<;677
Os arquivos criados em meios magnticos podem ser acessados para leitura e/ou escrita na
forma seqencial, direta ou indexada, como definidos a seguir:
126
Exemplos acesso 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;
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;
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.
127
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:
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;
b) programa em Java
class regAgenda{
private String nome;
private String endereco;
private String 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.
128
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));
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:
129
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).
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.
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);
130
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"))
}
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
131
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.
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.
132
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;
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"));
133
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;
}
}
}
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.
134
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.
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.
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;
135
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"));
}
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;
}
136
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!");
}
}
}
6E 676HC
<4F 8< <HE ?
<4F 86 = D 7 86 ;677 ?
6<C
9
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.
Soluo:
137
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.
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="";
138
+ 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;
}
}
}
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.
Soluo:
a) algoritmo em pseudocdigo
inicio
tipo
reg_cliente = registro
cod_cli:inteiro;
nome: caracter;
139
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="";
}
}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
140
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.
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
141
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="";
142
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;
}
}
}
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
143
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 3a8 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
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
144
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="";
}
}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++){
145
dados += destino[i];
}
return dados;
}
}
}
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.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
146
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);
}
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:
147
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
148
getContentPane().add(L1);
getContentPane().add(TA1);
getContentPane().add(B1);
getContentPane().add(B2);
getContentPane().add(B3);
getContentPane().add(P1);
}
ci) O prximo exemplo mostra a leitura e gravao de outros formatos de arquivo (inteiro)..
149
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
150
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);
}
}
}
}
151
Exerccios 86 I<4F L < = D 7
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:
N scio:
Nome:
Endereo:
N scio:
Data de pagamento:
152
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.
Conta corrente:
Correntista:
Data abertura:
Agncia:
N agncia:
Nome agncia:
Conta corrente:
Data: Valor:
Docto: Histrico:
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:
153
Arquivo de clientes: randmico
Chave: cdigo
Cdigo: Telefone:
Nome:
Endereo:
RG: CPF:
Ttulo:
Assunto:
Cdigo fita:
Cdigo cliente:
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.
154
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.
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.
Faa um menu de opes e utilize todos os recursos aprendidos. Utilize o mtodo sequencial.
155
* : < <4F 6HC
<8<< AB
6C 7
H;6C 7 * 6? H< 67
HC 8 4F
O
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 JavaTM.
E ;677 86 A7C<4F
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.
E6 <4567 86<A7C<4F
7. Classificao/instanciao
8. Generalizao/especializao
9. Agregao/decomposio
10. Associao
?
<77 K;<4F 1 H7C
<H;<4F
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.
156
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.
?<77 K;<4F Operao que tem por objetivo, atravs da anlise das caractersticas de um
objeto, definir que classe o mesmo pertence.
H7C <H;<4F Operao que, dada uma determinada classe, define (ou cria) um objeto
pertencente a esta classe.
157
7E6;<?R<4F Operao em que a partir de uma classe, identifica-se uma ou mais subclasses,
cada uma especificando caractersticas adicionais, em relao classe mais geral.
"
#
#
" #
" $
: 6:<4F 1 6; E 7 4F
158
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.
159
6; E 7 4F
: 6:<4F
Veculo automotor
(tem motor;placa;
ano;n.chassis; modelo;
proprietrio; etc...) Placa
Automvel Motor
Porta-malas
(capacidade; ...)
Porta-malas
do Vectra do
Mauro
Placa do Motor do
Vectra do Vectra do
Mauro Mauro
Vectra do Mauro
160
77 ;<4F
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.
Professor Aluno
Associao
Professor
Jos Aluno
Joaquim
I6 ;J
; 7 86 I<4F O H;6C 7 A 7 ; 7 86
161
86? 86 AB
6C 7
H;6C 7 H8< 6HC
<7
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.
?
<7767 6 AB
6C 7
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.
CA C
>C8
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.
162
6 7 6 E 6:<8 7 H<*
#- 7 #? - :=> #F #7 @;
O # O " @ "
4 " 4 @
! #
O <# O " C 4 4 <#
! 4 8
4 " 4 <Q
!
5 " D 4 <# " 54 " <#
"
@ "
#- 7 #? - :=> #F #7 @;
5 O T ! "
0 4 @ <# "8 <
163
! 7 " <# 0 4 #
f @ " f 4
" 8
O " 0 ! "
4 <Q ! " 4 #
164
!<D<6 86? 86 AB
6C7
P
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.
% %
% % &
' && %
165
* : < <4F 7C C <8<
A programao estruturada:
% ?
H :I
- #G 9 :?: ? - #G 9 :?: ?
166
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.
% % &
-./0. +! % &
167
0./4. +! % &
123
5 % 4. +! %
&
H :I
% ?
168
% & ' +7 &
% & ,8
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.
169
86? 86 AB
6C 7
,J
78
Agregao
170
B
, K
, K
?
?
L
L
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.
, - M 1NN O C'C+' ( K
class Cliente {
...
public void envieMensagem() {
171
...
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.
, K
?
L
<
<
172
@
$ J
<
#
;
$ J
Abaixo temos esqueletos de cdigo em Java que descrevem como se faz essa estenso de
classes.
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.
173
class TransacaoDebito extends Transacao {
...
public int processe(int valorAnterior) {
return valorAnterior - valor;
}
}
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;
}
...
}
174
HC 8 4F X7 ;?
<7767
C
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.
6KH4F 86 < ?
<7766 !
<D<
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;
<H8 < ?
<776 <I<
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
175
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:
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:
class Caixa {
double largura;
double altura;
double profundidade;
}
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
HC 8 4F < 7 >C8 7
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) {
176
//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;
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:
class Caixa {
double largura;
double altura;
double profundidade;
177
A sada deste programa exatamente igual do programa anterior.
6C H<H8 "<?
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.
class Caixa {
double largura;
double altura;
double profundidade;
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:
class Caixa {
double largura;
double altura;
double profundidade;
// calcula o volume da caixa
178
double volume() {
double volume;
volume = largura * altura * profundidade;
return volume;
}
H7C C 67
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:
// definio do construtor
Caixa(double l, double a, double p) {
defineDimensoes(l, a, p);
}
179
profundidade = p;
}
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.
< A<:6 ?
?6;C H
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.
>C 8 KH<?R6S
T
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
180
}
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.
<7 6C
<?P67 A6 ?
<7767 6 >C 8 7
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.
void teste() {
System.out.println("Teste sem parmetros");
}
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
181
A 6;< :<86 H7C C 67
class Caixa {
double largura;
double altura;
double profundidade;
// definio do construtor
Caixa(double l, double a, double p) {
defineDimensoes(l, a, p);
}
A sada do programa
182
O volume da caixa1 e 0.0
O volume da caixa2 e 2197.0
O volume da caixa3 e 1550.0
<D<L P<D67C
*<? <C;
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.
*<?
<D<L P<D6KH<?
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:
-6<H4<
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.
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):
183
I6 E? 86-6 <H4<
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);
}
// 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);
184
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
A 6E 7 4F 86 >C 8 7
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.
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;
}
}
double area(){
System.out.println("Calculando rea do retangulo.");
Return base* altura;
}
}
double area() {
System.out.println("Calculando rea do tringulo.");
return base * altura / 2;
}
}
class CalculoArea {
public static void main(String args[]) {
185
Figura2D f = new Figura2D(5, 4);
Retangulo r = new Retangulo(2, 6);
Triangulo t = new Triangulo(3, 9);
A sada do programa
Neste exemplo tambm foi utilizado a palavra super para chamar o construtor da
superclasse. Isto equivalente utilizao da palavra-chave inherited em Delphi.
?
<7767 A7C<C
<7
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 :
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:
186
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 CalculoArea2 {
public static void main(String args[]) {
Figura2D r = new Retangulo(2, 6);
Figura2D t = new Tringulo(3, 9);
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.
*<; C
67 6 HC
6K<;67
*<; C
67
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.
<H8 *<; C
6
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]];
187
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;
ou
set CLASSPATH="%CLASSPATH%;C:\java\MinhasClasses;.
java util.meupacote.Teste
HC ?
686 ;677
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.
: '
=
188
: '
"
:# )
"
"
:#
"
E C
<H8 *<; C
6
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.*;
HC
6K<;67
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 :
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){
189
//corpo_do_metodo;
}
}
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.
<C
< 6HC 86 I;64F
H8< 6HC 7 8 <C
< 6HC 86 I;64F
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
}
190
E 7 86 I;64F
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.
CYL;<C
;P
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
C
P W
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,
191
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;
}
}
A sada do programa
Identificada dentro de demoThrow
Identificada novamente: java.lang.NullPointerException: DEMO
C
P W7
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 :
class ThrowsDemo {
static void demoThrows() throws IllegalAccessException {
System.out.println("Identificada dentro de demoThrows");
// gera a exceo
throw new IllegalAccessException("DEMO");
}
A sada do programa
Identificada dentro de demoThrows
192
Identificada novamente: java.lang.IllegalAccessException: DEMO
KH<?
?Y
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");
}
}
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().
193
I;64567 *<8 567 6 !<D<
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.
"
5 # "
g 4
C <# " "
C 0
" <#
C " <#
" <# @ "
C0 " 4
! " 0
# A 4 T
$ O # "
; <# 0 <
g 4
% A " <# # " 4
107
8+4
4)4,) 19.
/5) L7
)(.
/-993-7
J)7
+,+4()8
-7-5(/
8
+,-*
"
$ O #
; ! @ # "
4 $ '
C 0
; !
4
A 4 " "
$ A " @ #
A @ #
107
8+4
4)4,) L
7)(.
/-97
J)7
+,+4()8
-7-5(/
8
+,-*
194
MinhaExcecao(int cod) {
cdigo = cod;
}
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");
}
sada do programa
registrando cdigo - 5
cdigo = 5 registrado
registrando cdigo = 29
=
Exceo identificada: MinhaExcecao, cdigo 29
HC<8<1 <J
8<
C6< 7
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.
C6< 7 86 YC
67 686 < <;C
6 67
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.
<7767 86 C6< 7 86 YC
? 67
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
195
em diversos dispositivos. A tabela abaixo mostra quais so as classes que trabalham com streams de
bytes.
$
44 ." "
44 " "
& C &. " @ T & &
$ " @
$ @ "
$ @ "
( +
( +
#
#
# @ "
# ' @ "
( $ " @
@
Classes de Streams de bytes.
C6< 7 * 686KH8<7
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.
196
BufferedReader(Reader ReaderDeEntrada)
InputStreamReader(InputStream StreamDeEntrada)
A tabela abaixo mostra quais so as classes que trabalham com streams de caracteres.
$
( .
*)+5 ,-7
+*+7
.)*
)4,))9.
*+,+01K
K)*
/T+,+
) .
*)+5 ,)7
+*+7
.)*
)4,)4
+E,+01K
K)*
/T+,+
( .
*)+5 ,))9.
*+,+[1)8
H,)15 +*
*+X,)7
+*+7
.)*
)4
) .
*)+5 ,)4
+E,+[1))4
7*)B
))5 15 +*
*+X,)7
+*+7
.)*
)4
$ ( .
*)+5 ,))9.
*+,+(+*
+8)/
.1*
+,)+*
[1/
B-4
$ ) .
*)+5 ,)4
+E,+(+*
+)4
7*/
.+)5 +*
[1/
B-4
$ ( .
*)+5 ,))9.
*+,+[1)/
5(8
)5)
9.+ )+,)*
$ ) .
*)+5 ,)4
+E,+[1)/
5(8 +Q*
)5)9. /.
)*
( .
*)+5 ,))9.
*+,+[1).
*+,1T0X
.)4)5 7
+*+7
.)*
)4
) @ &
* ( .
*)+5 ,))9.
*+,+[1)7
-9.
+)8
H8/
9J+4
( .
*)+5 ,)7
+*+7
.)*
)4,))9.
*+,+N7
8+4
4)+04
.*+.
+O
) .
*)+5 ,)7
+*+7
.)*
)4,)4
+E,+N7
8+4
4)+04
.*+.
+O
# ( .
*)+5 ,)7
+*+7
.)*
)4,))9.
*+,+(/
()
# ) .
*)+5 ,)7
+*+7
.)*
)4,)4
+E,+(/
()
# ) .
*)+5 ,)7
+*+7
.)*
)4,)4
+E,+[1)(-4
4 E HC6E HC
1/ ?H
# '( .*
)+5 ,)7+*+7
.)*
)4,))9.
*+,+[1)()*
5/.
)
,)B-8
B)*15 0X.
)8/
,-
( .
*)+5 ,)7
+*+7
.)*
)4,))9.
* H,)15+4
+,+[1)8 .*/
9;
) .*
)+5 ,)7 +*
+7.
)*)4,)4
+E,+[1))4
7* ))5 15+ .
)B */
9;
Classes de streams de caracteres.
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;
197
BufferedReader br = new BufferedReader(new
InputStreamReader(System.in)\
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));
7;6D6H8 H 6 H<?
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.
6C <6 7; C
<86 = D7
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:
198
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;
}
199
// 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();
}
}
200
EE?
6C7
HC 8 4F < 7 EE?
6C7
T
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>
201
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);
}
}
7= 6?
6C 7 ; 86 EE?
6C
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.
202
Quando executado, ele gera uma janela limpa.
1. init()
2. start()
3. paint()
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().
67 8 EE?
6C
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
import java.awt.*;
import java.applet.*;
/*
<applet code =- CorApplet" width=300 height= 200>
</applet>
*/
203
public class CorApplet extends Applet {
String msg;
// configura as cores
public void init() {
setBackground(Color.blue);
setForeground(Color.magenta);
msg = "Dentro do init() -- ";
}
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);
}
204
/ 3
H;6C 7 7 A 6<?H: <:6 !<D<
6D6P7C
9;
T
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.
* H;J
E 7 A 7 ; 7 86 < A6HC
6!<D<;?77 ;
*?
<C<K <!<D<
Diversas plataformas esto disponveis no mercado tais como Microsoft Windows, Macintosh,
R R
OS/2 UNIX e NetWare . 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.
6H6K
J; 7 8<E?
<C<K <!<D<
205
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.
H: <:6 !<D<
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.
*?
<C<K <!<D<A 7 ;<
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.
EE?
6C7 6<E?;<CD 7
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.
206
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.
!<D<
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.
* 6HC 8<*?
<C<K <!<D<
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.
E?;<CD 7 6<EE?
6C7
* 7 ;<!<D< )4
.)9,/
,+ +B+(+,*
3-
?
<7767 !<D< 7 ;< 8
+44
)4 +B+,) L.
)94
3-(+,*
3-
= H<" C <?!<D<S
!" T
HC
6K<;686* C
<A?8<86
,+(.
+,-* ,+(.
+,-* ,+(.
+,-* +B+
+B);+,-* /4
.)5+ /4
.)5+ G+*
,`+*
)
()*
+7/
-9+8 ()*
+7/
-9+8
/4
.)5+
()*
+7/
-9+8 G+*
,`+*
) G+*
,`+*
)
G+*
,`+*
)
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.
207
= H<" C <?!<D<S
!" L !<D<" C <? <;PH6T
* 7 ;<!<D<
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.
* 7C
6H88<8*<8 F
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.
E?
<8 6 A6HC
686 I6; 4F !<D<
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.
208
H6I
67 8 7 ; H;6C 7 <A 8<8 7 7 A 6< H: <:6 !<D<
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).
6; 7 7
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.
?
6C<86 I
A garbage collection varre as memrias cujo ponteiro possui nmero de referncia 0. Ocorre
automaticamente durante o tempo de vida de um programa.
A6HC
6!<D<86 E?
<4F
COMPILAO TEMPO DE EXECUO
O8 0 4 O 0
@ !
R 4 <#
O &
@
Gerador de cdigo just-in-
time
c.; O
" <# ]
O cdigo executado
; "
<# [ Z
209
Figura 1 - ambiente Java de compilao
<HC
6 * ;677 86 E?
<4F
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
= D7 8 ! Z
Quando se instala o JDK, criada a seguinte estrutura de diretrio:
0 ?
! O 40 <# ! + " cDh
C@ ( + cDh
5 " " <Q
D <# C .
C@ " 0 <# 8 0
O C .
O8 0 4 4 " 4
"<# <# cDh @ 8 "
" " <#
?
: <7 6KH4567
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.
210
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.
E?
<8 !<D<;
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.
Para compilar um arquivo, basta digitar javac e o nome do arquivo. Por exemplo, no prompt
do DOS, conforme o modelo:
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:
E45673
-classpath path[;...] - localizao das classes das classes j devidas. Sobrepe a varivel de
ambiente CLASSPATH.
-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.
211
-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:
*< < HC
6 E 6C
< * :< <
Para executar (utilizar) o programa, basta digitar, no prompt do DOS, a palavra java seguida
do nome do programa. Por Exemplo:
*<?
<D<7 676 D<8<7
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.
Essas palavras no podem ser usadas como nomes de variveis, mtodos, interfaces ou
classes.
"< D67
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 */
212
String cadeia = String em Java no tipo primitivo;
6HC 7
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:
8K;<8 67 86;?
<7767
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.
I;64567
213
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.
; Z
5 " 5
. 0 C 5 " i 0 5
. 5 " ; D
O : "" 5 " R = 5
. " 5 " Cj ;5
: = 5 "
O : S 5 "
Cj ;5 "
7 5 "
. 5 "
C &. 4 5 " C = 5
0. 4 5 " . 0 C 5
. 5
. 0 ; 5 " : 5
: S 5 " : = 5
214
67; 4F 86<?
: <7 ;?
<7767
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.
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).
Lanamento de exceo:
?
<7767 <7 C?R<8<7
' C H:
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;
H7C C 67
215
new String (StringBuffer sb) constri uma String a partir de um
Stringbuffer.
* H;E<7 >C 8 7
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();
?
<776= 6 6E 676HC
<8<C
<7 O B
<D< C?8<C
6
A classe java.util.Date representa datas.
H7C C 67
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.
* H;E<7 >C 8 7
Exemplos:
Date data1 = new Date();
Date data2 = new Date();
System.out.println(Resposta: + data1.after(data2));
216
?
<7767 86 HC<8<6 <J
8<
java.io.BufferedReader filtro que age sobre um Reader, adicionando um buffer e
otimizando o acesso aos dados.
H7C C 67
* H;E<7 >C 8 7
Exemplos:
BufferedReader arq;
arq = new BufferedReader(new FileReader(arquivo));
String linha;
try {
linha = arq.readLine();
} catch(IOException e){}
H7C C 67
* H;E<7 >C 8 7
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){}
217
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.
H7C C 67
* H;E<7 >C 8 7
) ?
6
A classe java.io.file representa um arquivo ou um diretrio.
H7C C 67
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.
* H;E<7 >C 8 7
218
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.
219
H6I
?
<7767 8 E<; C
6 W H:
HC 8 4F
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.
<4F 86 < 67
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.*;
220
import javax.swing.*;
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.
Mtodo Funo
JFrameNO 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
H;?7F 86C
6IC 7 6 <:6H7 H<B
<H6?
<
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:
221
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.*;
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);
}
}
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
222
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).
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
223
Mtodo Funo
setText() Especifica o texto do label
Tabela 2 resumo dos mtodos da classe JLabel
H;?7F 86A C
567 H<7 B
<H6?
<7
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.*;
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);
}
224
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
225
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.
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
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.*;
226
JButton B1,B2,B3,B4,B5;
JTextField T1, T2, T3;
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);
}
227
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);
}
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
228
mtodo setText().
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
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
ExIntGrafica5(){
229
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);
}
<C
<4F 86;<I<7 86C
6IC
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.
230
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.text.NumberFormat;
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);
}
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).
231
H;?7F 86?7C
<7 8676?
64F
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:
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.*;
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);
232
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());
}
}
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
233
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
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
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
234
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.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
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();
235
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());
}
}
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
236
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
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
237
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);
}
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:
238
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.
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
H;?7F 86*<H>7 6 C
567 86 8
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.*;
ExIntGrafica10(){ //construtor
setTitle("Uso de botoes de radio"); //titulo da janela
setSize(340,120);
239
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).
240
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
241
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.
677<:6 <?:
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.*;
242
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:
243
HK <?:
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.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
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);
244
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;
}
}
}
HE C <?:
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.*;
245
class ExIntGrafica13 extends JFrame implements ActionListener{
JLabel L1;
JButton B1;
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("");
}
}
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.
246
EC H <?:
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.
!
"
#$ #
%)! ++ $
# 3 $ % / % 415 415 41))
& , %6715 11)
8 %9 9) ++ $
247
/ : %) 0 $ % 0 $ % 0 $ / ;8 <))
* " %99)
$ %/ " $ )
# * #$ %9= >? 9)
# % - )
/ : %) %# )
/ : %) % )
2
$" : % )!
& '( - * !9 61 959 6 1 959@
1 92
* A : - A = % $ 59B$ $
C959 9515 A : ; A<@ 8 A;D@ && 5 $ 5 - 5 - '1()
& * % - ' ()
8 %9 E 9F )
2
2
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.
248
A sintaxe para criar uma barra de rolagem em Java a seguinte:
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.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.text.NumberFormat;
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;
249
L2.setText(nf.format(pol)+" Polegadas");
}
}
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.
250
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:
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.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.text.NumberFormat;
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);
}
251
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());
}
}
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().
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.
252
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.
H;?7F 86 6H 7
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.
< <86 6H 7
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:
Para definir essa barra de menus como sendo o menu padro da janela, utilizado o mtodo
setJMenuBar() da seguinte maneira:
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:
Para que o menu criado seja adicionado barra de menus, deve-se utilizar o mtodo add da
seguinte forma:
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:
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.
253
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
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);
}
}
254
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.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
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);
255
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);
}
}
256
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).
6H 7 E E E
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
ExIntGrafica19(){ //construtor
257
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());
}
}
}
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.
258
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)
6 6H;<8 67 86 <Y C
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.
?W <Y C
;).-9.)9.
) +9)NO 4).+X-1.N9)` 8
-` +X-1.
Nb+8
/
9J+5)9.
-R
)4(+2
+5)9.-ZJ-*/
T -9.
+8R)4(+2+5)9.
-ZB)*
./
7+8
cOO_
Em que;
259
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));
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.
8 <Y C
260
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.
86 <Y C
getContentePane().setLayout(new BorderLayout([espaamento_horizontal,
espaamento_vertical]));
Em que:
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.
Mtodo Funo
261
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.
< 8 <Y C
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.*;
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);
262
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
}
}
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
263
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).
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.
264