Variáveis primitivas e controle de fluxo - Informática

Propaganda
Desenvolvimento OO com Java
Variáveis primitivas e
controle de fluxo
Vítor E. Silva Souza
([email protected])
http://www.inf.ufes.br/~vitorsouza
Departamento de Informática
Centro Tecnológico
Universidade Federal do Espírito Santo
Licençaparausoedistribuição
• EsteobraestálicenciadacomumalicençaCreative
Commons Atribuição-CompartilhaIgual 4.0Internacional;
• Vocêtemodireitode:
– Compartilhar:copiareredistribuiromaterialem
qualquersuporteouformato
– Adaptar:remixar,transformar,ecriarapartirdo
materialparaqualquerfim,mesmoquecomercial.
• Deacordocomostermosseguintes:
– Atribuição:vocêdevedarocréditoapropriado,proverumlinkpara
alicençaeindicarsemudançasforamfeitas.Vocêdevefazê-loem
qualquercircunstânciarazoável,masdemaneiraalgumaquesugira
aolicencianteaapoiarvocêouoseuuso;
– CompartilhaIgual:sevocêremixar,transformar,oucriarapartirdo
material,temdedistribuirassuascontribuiçõessobamesma
licençaqueooriginal.
Mais informações podem ser encontradas em:
http://creativecommons.org/licenses/by-sa/4.0/
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
2
Conteúdodocurso
• OqueéJava;
• Variáveisprimitivase
controledefluxo;
• Orientaçãoaobjetos
básica;
• Umpoucodevetores;
• Modificadoresdeacesso
eatributosdeclasse;
• Herança,reescritae
polimorfismo;
• Classesabstratas;
• Interfaces;
• Exceçõesecontrolede
erros;
• UtilitáriosdaAPIJava.
EstesslidesforambaseadosnaapostiladocursoFJ-11:Javae
OrientaçãoaObjetosdaCaelum ena apostila Programação
Orientada aObjetos em Javadoprof.Flávio MiguelVarejão.
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
3
Declaração euso devariáveis
• JavafuncionacomoC,comtipagem estática:
// Define a variável e já atribui um valor:
int idade = 35;
System.out.println(idade); // 35
// Define a variável, depois atribui um valor:
int idadeAnoQueVem;
idadeAnoQueVem = idade + 1;
System.out.println(idadeAnoQueVem); // 36
Para executar, o código acima deve
estar dentro de um método main(),
como explicado na aula anterior.
Convenção de código: variáveis começam
com letra minúscula e usam CamelCase.
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
4
Tiposprimitivos
• Existem8tiposdedadosbásicos paravaloresinteiros,
reais,caractereselógicos;
• Sãochamadosprimitivos porque:
– Não sãoobjetos;
– Sãoarmazenadosnapilha.
• Javanão éOOpuraporcausadeles;
• Existempormotivosdeeficiência;
• Sãocompletamentedefinidos naespecificação Java
(nome,tamanho,etc.).
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
5
Tiposprimitivosinteiros
Tipo
Tamanho
Alcance
byte
1 byte
-128 a 127
short
2 bytes
-32.768 a 32.767
int
4 bytes
-2.147.483.648 a 2.147.483.647
long
8 bytes
-9.223.372.036.854.775.808 a
9.223.372.036.854.775.807
/* Cuidados com o alcance do tipo: */
byte b = 127;
System.out.println("b = " + b); // b = 127
b++;
System.out.println("b = " + b); // b = -128
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
6
Representaçãodevaloresliterais
// Especificando o tipo do literal.
int i = 10;
long l = 10l;
float f = 10.0f;
double d = 10.0;
// Números longos (Java 7).
int bilhao = 1_000_000_000;
// Representação em diferentes bases (binário - Java 7).
int binario = 0b0001_0000;
int octal = 020;
int decimal = 16;
int hexa = 0x10;
System.out.println(binario + ", " + octal + ", " +
decimal + ", " + hexa); // 16, 16, 16, 16
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
7
Tiposprimitivosreais
• Tambémconhecidocomo“ponto flutuante”.
Tipo
Tamanho
Alcance
float
4 bytes
aprox. ±3.402823 E+38F
double
8 bytes
aprox. ±1.79769313486231 E+308
// A separação decimal é feita com "."
float f = 1.0f / 3.0f;
double d = 0.1e1 / 3.; // 0.1e1 = 0,1 x 101
// Note a diferença na precisão.
System.out.println(f); // 0.33333334
System.out.println(d); // 0.3333333333333333
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
8
Precisãodepontoflutuante
• Aprecisãoserefereaonúmerodecasas decimais,não
aotamanho (ex.:3.4x 1038);
• Quandoaprecisão éfundamental,devemosusara
classeBigDecimal enãoostiposprimitivos.
double d = 1.230000875E+2;
System.out.println(d); // 123.0000875
// Converte de double para float.
float f = (float)d;
System.out.println(f); // 123.000084
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
9
Tipoprimitivocaractere
• Paracaracteres,Javausaotipochar:
– SegueopadrãoUnicode;
– Ocupa2bytes;
– Representa32.768 caracteresdiferentes;
– Permiteaconstruçãodesoftware
internacionalizado;
– Dependetambémdosuporte doSO.
• Representaçãoentreaspassimples:
– 'a','5','\t','\u0061',etc.
http://www.joelonsoftware.com/articles/Unicode.html
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
10
Umcaractereéuminteiro
• Porsuarepresentaçãointerna serumnúmerointeiro
(códigoUnicode),umchar podefuncionar comoum
inteiro:
char c = 'a';
System.out.println("c: " + c); // c: a
c++;
System.out.println("c: " + c); // c: b
c = (char)(c * 100 / 80);
System.out.println("c: " + c); // c: z
int i = c;
System.out.println("i: " + i); // i: 122
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
11
Caracteresespeciais
Código
Significado
\n
Quebra de linha (newline ou linefeed)
\r
Retorno de carro (carriage return)
\b
Retrocesso (backspace)
\t
Tabulação (horizontal tabulation)
\f
Nova página (form feed)
\'
Aspas simples (apóstrofo)
\"
Aspas
\\
Barra invertida (“\”)
\u233d
Março2016
Caractere unicode de código 0x233d (hexadecimal)
OO&Java- Variáveisprimitivasecontroledefluxo
12
Cadeiasdecaractere
• Algumaslinguagens definemumtipoprimitivo string
paracadeiasdecaracteres;
• Javanãopossuiumtipoprimitivo string;
• EmJava,strings sãotiposcompostos(objetos);
• Veremosmaisadiante...
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
13
Tipoprimitivológico(booleano)
• Valoresverdadeiro (true)oufalso (false);
• Não existeequivalência entrevaloreslógicosevalores
inteiros (comoemC);
boolean b = true;
if (b) System.out.println("OK!"); // OK!
int i = (int)b; // Erro de compilação!
i = 1;
if (i) System.out.println("??"); // Idem!
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
14
Conversõesentretiposnuméricos
• Tiposnuméricos podemsemisturar emoperações,
seguindoasseguintesregras:
– Seumdosoperandosfordouble eooutronão,será
convertidoparadouble;
– Senão,seumdosoperandosforfloat eooutro
não,seráconvertidoparafloat;
– Senão,seumdosoperandosforlong eooutronão,
seráconvertidoparalong;
– Nosdemais casos,osoperandosserãosempre
convertidosparaint,casojánãoosejam.
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
15
Conversõesentretiposnuméricos
byte b = 2; short s = 4; int i = 8;
long l = 16; float f = 1.1f; double d = 9.9;
d = s + l + d;
Float é o único que
precisa especificar o
tipo do valor literal.
long
double
// i + b resulta em int, convertido pra long;
l = i + b;
// Erro: b + s resulta em int!
s = b + s;
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
16
Conversõesentretiposnuméricos
• Conversõesdeumtipomenor paraumtipomaior
ocorremautomaticamente;
• Podemosforçar conversõesnosentidocontrário,
sabendodaspossíveisperdas;
• Utilizamosooperadordecoerção (cast):
double x = 9.997;
int nx = (int)x;
System.out.println(nx); // 9
nx = (int)Math.round(x);
System.out.println(nx); // 10
Cast: to give a shape to (a substance) by pouring in liquid or
plastic form into a mold and letting harden without pressure.
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
17
Operadoresaritméticos
Símbolo
Significado
Exemplo
+
Adição
a + b
-
Subtração
a - b
*
Multiplicação
a * b
/
Divisão
a / b
%
Resto da divisão inteira
a % b
-
(Unário) inversão de sinal
-a
+
(Unário) manutenção de sinal
+a
++
(Unário) Incremento
++a ou a++
--
(Unário) Decremento
--a ou a--
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
18
Operadoresrelacionais
Símbolo
Significado
Exemplo
==
Igual
a == b
!=
Diferente
a != b
>
Maior que
a > b
>=
Maior que ou igual a
a >= b
<
Menor que
a < b
<=
Menor que ou igual a
a <= b
• Observações:
– Osparâmetros devemserdetiposcompatíveis;
– Nãoconfunda= (atribuição)com== (igualdade).
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
19
Operadoreslógicos
Símbolo
Significado
Exemplo
&&
AND (E)
a && b
&
AND sem curto-circuito
a&b
||
OR (OU)
a || b
|
OR sem curto-circuito
a|b
^
XOR (OU exclusivo)
a^b
!
NOT (NÃO, inversão de valor, unário)
!a
• Observações:
– Sóoperam sobrevaloreslógicos;
– Podemsercombinados emexpressõesgrandes.
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
20
Curto-circuito
int x = 10, y = 15, z = 20;
// (z > y) não é avaliado.
if ((x > y) && (z > y)) { /* ... */ }
// (z == y) não é avaliado.
if ((x == 10) || (z == y)) { /* ... */ }
// Ambos são avaliados.
if ((x > y) & (z > y)) { /* ... */ }
// Ambos são avaliados.
if ((x == 10) | (z == y)) { /* ... */ }
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
21
Operadordeatribuição
• Usadoparaalterar ovalordeumavariável:
ü x = 10 * y + 4;
• Váriasatribuições podemserfeitasemconjunto:
ü x = y = z = 0;
• Oladodireito daatribuiçãoésemprecalculado
primeiro,seuresultado éarmazenadonavariável do
ladoesquerdo:
ü int x = 5;
ü x = x + 2;
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
22
Operadoresbitabit
• Operamemvariáveisinteiras,bitabit:
Símbolo
Significado
Exemplo
&
AND (E)
a&b
|
OR (OU)
a|b
^
XOR (OU exclusivo)
a^b
~
NOT (NÃO, unário)
~a
>>
Deslocamento de bits para a direita
a >> b
<<
Deslocamento de bits para a esquerda
a << b
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
23
Atribuiçãocomposta
• Une-seumoperadorbinário comosinaldeatribuição:
Expresão
Equivale a
Expresão
Equivale a
x += y
x = x + y
x &= y
x = x & y
x -= y
x = x - y
x |= y
x = x | y
x *= y
x = x * y
x ^= y
x = x ^ y
x /= y
x = x / y
x >>= y
x = x >> y
x %= y
x = x % y
x <<= y
x = x << y
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
24
Incrementoedecremento
• Somar/subtrair1deumavariávelinteiraétãocomum
queganhouumoperador sóparaisso:
ü ++x ex++ equivalem ax = x + 1;
ü --x ex-- equivalem ax = x – 1.
• Quandopartedeumaexpressão maior,aforma
prefixadaédiferente dapós-fixada:
int x = 7;
int y = x++; // y = 7, x = 8.
x = 7;
y = ++x;
Março2016
// y = 8, x = 8.
OO&Java- Variáveisprimitivasecontroledefluxo
25
Operadorternário
• Formasimplificada deumaestruturaif – else (que
veremosmaisadiante);
• Produzumvalor deacordocomumaexpressão:
ü <expressão> ? <valor 1> : <valor 2>
üSe<expressão> fortrue,oresultadoé
<valor 1>,docontráriooresultadoé<valor 2>.
int x = 7;
int y = (x < 10) ? x * 2 : x / 2;
System.out.println("y = " + y); // y = 14
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
26
Precedênciadeoperadores
• Podemoscombinar expressões:
ü x = a + b * 5 – c / 3 % 10;
• Atençãoàprecedência deoperadores!
1) b * 5;
2) c / 3;
3) (resultadodec / 3)% 10;
4) Daesquerdaparaadireita.
• Podemosusarparênteses paramodificá-la:
ü x = (a + b) * (5 – (c / 3)) % 10;
• Nadúvida,utilizeparênteses.
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
27
Precedênciadeoperadores
• Asexpressõessãoavaliadas segundoumaordemde
precedência dosoperadores:
Ordem
1
2
Operadores
. [] ()
++ -- ~
instanceof new –
(unário)
Ordem
Operadores
8
&
9
^
10
|
3
* / %
11
&&
4
+ -
12
||
5
>> << >>>
13
?:
6
> < >= <=
14
= += -= *= /= ...
7
== !=
15
,
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
28
Escopodevariável
• Variáveispodemserdeclaradas emqualquer ponto do
programa;
• Oescopo defineondeavariávelévisível (onde
podemosler/atribuirseuvalor);
• Oescopodeumavariávelvaido“{“ anterioràsua
declaraçãoatéopróximo“}”.
int i = 10;
if (i > 0) {
int j = 15;
System.out.println(i + j); // 25
}
j = i + j; // Erro: variável fora de escopo!
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
29
Nomesdevariáveis
•
•
•
•
•
Deveseriniciado porumaletra,_ou$;
Seguido deletras,números,_ou$;
Podemterqualquer tamanho;
Não podemserigualaumapalavrareservada;
Lembre-sesempre:Javaécasesensitive.
Março2016
Nomes válidos
Nomes inválidos
a1
total
$_$$
_especial
Preço
1a
total geral
numero-minimo
tico&teco
void
OO&Java- Variáveisprimitivasecontroledefluxo
30
Palavrasreservadas
abstract
continue
for
new
switch
assert
default
goto
package
synchronized
boolean
do
if
private
this
break
double
implements
protected
throw
byte
else
import
public
throws
case
enum
instanceof
return
transient
catch
extends
int
short
try
char
final
interface
static
void
class
finally
long
strictfp
volatile
const
float
native
super
while
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
31
Constantes
• Paradeclararconstantes,bastausarapalavra-chave
final:
final double CM_POR_POLEGADA = 2.54;
CM_POR_POLEGADA = 2.55; // Erro!
double larguraPol = 13.94;
double larguraCm = larguraPol * CM_POR_POLEGADA;
System.out.println(larguraCm);
Convenção de código: constantes são
escritas em CAIXA_ALTA.
Julho2013
DesenvolvimentoOOcomJava
32
DesenvolvimentoOOcomJava- Variáveisprimitivasecontroledefluxo
CONTROLEDEFLUXO
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
33
Controledefluxo
• Somenteprogramas muitosimples sãoestritamente
sequenciais:
– Leiatrêsnotasdeumaluno:N1,N2eN3;
– CalculeamédiadoalunopelafunçãoM=(N1+N2+
N3)/3;
– SeamédiaMformaiorouiguala7:
– Imprima“Alunoaprovado”;
– Seamédianãoformaiorouiguala7:
– Calculeanotaqueoalunoprecisaparapassarpela
funçãoPF=(2*F)– M;
– Imprima“Alunoemprovafinal,notamínima:<PF>”.
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
34
Controledefluxo
• LPs imperativas geralmentepossuemasseguintes
estruturasdecontroledefluxo:
– Estruturasdedesviodefluxo:desvia ofluxoequebra
aestruturasequencial.Podesercondicional ou
incondicional.EmJavatemosif eswitch;
– Estruturasderepetiçãosimples:repete umoumais
comandos emlaços ouloops umnúmerofixo de
vezes.EmJava,temosadiretivafor;
– Estruturasderepetiçãocondicional:semelhanteà
repetiçãosimples,masumnúmeroindefinidode
vezes,associadaaumacondição.EmJavatemos
while edo while.
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
35
Estruturasdedesviodefluxo
• Desviam ocódigoparaumoutrotrecho,aoinvésde
prosseguirparaalinhaseguinte;
• Hádoistipos dedesviodefluxo:
– Desviocondicional (if, switch);
– Desvioincondicional (goto).
• Javanãopossuigoto.Possuidoiscasosespecíficosde
desvioincondicional combreak econtinue.
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
36
Conceitosbásicos:diretivas
• Diretivas (statements) sãoasinstruções queumaLP
forneceparaaconstruçãodeprogramas;
• Devehaveralgumaforma deseparar umadiretivada
outra:
– Cadaumaemumalinha;
– Separadasporumcaractere (ex.:“.”,“;”,etc.).
• Javaherdou deC/C++ aseparaçãocom“;”:
diretiva1;
diretiva2; diretiva3;
diretiva4;
...
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
37
Conceitosbásicos:blocos
• Diretivas podemserdispostasemblocos;
• Umblocorecebe omesmotratamento deumadiretiva
individual;
• Javatambémherdou deC/C++ adefiniçãodeblocos
com“{“e“}”:
{
diretiva1;
diretiva2; diretiva3;
diretiva4;
...
}
...
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
38
Estruturasdedesviodefluxo
• Desviam ocódigoparaumoutrotrecho,aoinvésde
prosseguirparaalinhaseguinte;
• Hádoistipos dedesviodefluxo:
– Desviocondicional (if, switch);
– Desvioincondicional (goto).
• Javanãopossuigoto.Possuidoiscasosespecíficosde
desvioincondicional combreak econtinue.
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
39
Desviocondicionalcomif
if ([expressão])
[diretiva 1]
else
[diretiva 2]
– [expressão]:expressãológicaavaliada(deveretornar
valordotipoboolean);
– [diretiva1]:diretiva oublocodediretivasexecutadas
seacondiçãoretornartrue;
– [diretiva2]:diretiva oublocodediretivasexecutadas
seacondiçãoretornarfalse.
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
40
Funcionamentodoif
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
41
Apartedoelse éopcional
if ([expressão])
[diretiva]
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
42
Encadeamentodeifs
• Oif éumadiretiva comoqualqueroutra;
• Podemos colocá-locomo[diretiva2],logoapós oelse
(executadaquandoexpressãoéfalse):
if ([expressão])
[diretiva 1]
else if ([expressão 2])
[diretiva 2]
else if ([expressão 3])
[diretiva 3]
...
else
[diretiva N]
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
43
Exemplos
int x = 10, y = 15, z = 20;
boolean imprimir = true;
if ((x == 10) || (z > y)) {
if (imprimir) System.out.println(x);
}
else if (x == 20) {
z += x + y;
if (imprimir) System.out.println(z);
}
else System.out.println("Não sei!");
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
44
Desviocondicionalcomswitch
switch ([expressão ordinal ou string]) {
case [valor ordinal 1]:
[diretiva 1]
break;
case [valor ordinal 2]:
[diretiva 2]
break;
...
default:
[diretiva N]
}
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
45
Desviocondicionalcomswitch
• [expressãoordinaloustring]:expressão queretornaum
valordealgumtipodiscreto(int, char,etc.)oustring
(apartirdoJava7);
• [valorordinalX]:umdospossíveis valoresquea
expressão ordinalpodeassumir(deveserdomesmo
tipo);
• [diretivaX]:diretiva ouconjuntodediretivas(nãoé
necessárioabrirumbloco)executado seaexpressão
ordinalforigualao[valorordinalX].
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
46
Funcionamentodoswitch
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
47
Características
• Épossívelconstruir umif equivalente aoswitch,mas
esteúltimo temdesempenho melhor;
• Terumaopção default éopcional;
• Ofluxoédesviado paraocase apropriado econtinua
daliatéencontrarumbreak ouofimdoswitch.
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
48
Exemplo
switch (letra) {
// letra é do tipo char
case 'a':
case 'A': System.out.println("Vogal A");
break;
case 'e': case 'E':
System.out.println("Vogal E");
break;
/* ... */
case 'u': case 'U':
System.out.println("Vogal U");
break;
default:
System.out.println("Não é uma vogal");
}
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
49
Estruturasderepetiçãosimples
• Repetição deumtrecho decódigo;
• Númerofixo derepetições (sabe-sedeantemão
quantasvezesotrechoserárepetido);
• Javadispõedadiretiva for (tambémherdada deC):
// Contar de 1 a 10:
for (int i = 1; i <= 10; i++)
System.out.println(i);
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
50
Estruturadofor
for ([início]; [condição]; [inc/dec])
[diretiva]
– [início]:diretivaexecutada antes dolaçocomeçar
(geralmente,atribuirovalorinicialdocontador);
– [condição]:expressãodecondição deparada dolaço
(geralmente,comparaçãocomovalorfinal);
– [inc/dec]:diretivaexecutada apóscadaiteração do
laço(geralmenteusadaparaincrementar ou
decrementar ocontador);
– [diretiva]:diretiva oublocodediretivasexecutadas
emcadaiteração dolaço.
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
51
Funcionamentodofor
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
52
Oscamposdoforsãoopcionais
// Conta até 10.
int i = 1;
for (; i < 10;) {
System.out.println(i++);
}
// Preenche um vetor.
int[] v = new int[5];
for (int i = 0; i < 5; v[i] = i++);
// Loop infinito.
for (;;);
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
53
Repetiçãocondicionalcomofor
• Emváriaslinguagens deprogramação,ofor(ousimilar)
servesomente pararepetiçãosimples:
para i de 1 até 10 faça
Escreva i
fim_para
• EmJava pode-seusarparafazerrepetiçãocondicional:
boolean achou = false;
for (int i = 0; (! achou); i++) {
/* ... */
}
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
54
Inicialização/incrementomúltiplo
• Podemosefetuarmúltiplas diretivasnainicialização e
noincremento,senecessário,separandocomvírgulas:
for (int i = 1, j = i + 10; i < 5; i++, j = i * 2) {
System.out.println("i= " + i + " j= " + j);
}
• Claroquetambémpodemostercondicionaisgrandes
(usandooperadoreslógicos):
for (int i = 0; (i < 5) && (! achou); i++) {
/* ... */
}
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
55
Estruturasderepetiçãocondicional
• Repetição deumtrecho decódigo;
• Númeroindeterminado derepetições,dependedeuma
condição (expressãológica);
• Javadispõedadiretiva while edo while (sintaxe
tambémherdada deC/C++):
// Contar de 1 a 10:
int i = 1;
while (i <= 10) System.out.println(i++);
i = 1;
do System.out.println(i++); while (i <= 10);
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
56
Estruturadewhile edowhile
while ([condição]) [diretiva]
do [diretiva] while ([condição])
– [condição]:expressãodecondição deparada dolaço
(expressãológica);
– [diretiva]:diretiva oublocodediretivasexecutadas
emcadaiteração dolaço.
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
57
Funcionamentodowhile
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
58
Funcionamentododo while
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
59
Características
• while avaliaacondiçãoantes dadiretiva,podendo
nunca executá-la;
• do while sóavaliadepois,certamenteexecutandoa
diretivaaomenosumavez;
• Oprogramador devegarantirqueacondição setorna
falsa emalgummomentonadiretiva,docontrário
poderágerarumloop infinito.
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
60
Exemplos
int i = 0, j = 10;
while (i <= j) {
System.out.println(i + " - " + j);
i++; j--;
}
// Executará ao menos 1 vez!
do {
System.out.println(i + " - " + j);
i++; j--;
} while (i <= j);
// Podemos fazer um for equivalente!
for (i = 0, j = 10; i <= j; i++, j--) {
System.out.println(i + " - " + j);
}
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
61
Desviosincondicionais
• Ousodedesviosincondicionais comgoto levama
programasdebaixa legibilidade;
• Javasótemdoiscasosespecíficosdedesvios
incondicionais:break econtinue;
• Podemserusadosdentrodelaçosoudentroda
estruturaswitch (comojávimos):
– break sai daestrutura(laçoouswitch);
– continue vaiparaapróxima iteração (somente
laços).
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
62
Exemplos
while (ano < 2001) {
saldo = (saldo + salario) * (1 + juros);
if (saldo >= saldoLimite) break;
ano++;
}
for (int i = 0; i < 100; i++) {
if (i % 9 == 0) continue;
System.out.println(i);
}
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
63
break econtinuecomrótulos(labels)
• Rótulos podemindicardequallaçoqueremossairou
continuarapróximaiteração;
• Podemserusadosapenasemlaçosesófazemsentido
emlaçosaninhados.
externo:
for (int i = 1; i < 100; i++) {
for (j = 5; j < 10; j++) {
int x = i * j - 1;
if (x % 9 != 0) break;
if (x % 15 == 0) break externo;
System.out.println(x);
}
}
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
64
DesenvolvimentoOOcomJava- Variáveisprimitivasecontroledefluxo
ENTRADAESAÍDA BÁSICA
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
65
Entradaesaídadedadosbásica
• Todalinguagem deprogramaçãodeveproverummeio
deinteração comousuário;
• Omeiomaisbásico éousodoconsole,comentradade
dadospeloteclado esaídaemtexto;
• Outrosmeiossão:interfacegráfica(janelas),pelaWeb,
comandosdevoz,etc.;
• Aprenderemosagoraaformadeinteraçãobásica,pelo
console:
– O“shell”ou“console”doLinux/Mac;
– O“prompt decomando”doWindows.
Agosto2015
DesenvolvimentoOOcomJava
66
Saídadedadospeloconsole
• Javausaoconceitodestream:umduto capazde
transportar dadosdeumlugaraoutro;
• Aclassejava.lang.System ofereceumstream padrão
desaída chamadoout;
– Éumobjeto daclassejava.io.PrintStream,
aberto emantidoautomaticamente pelaJVM;
– Oferecevários métodosparaimpressão dedados:
print(), println() eprintf().
• Podemostrocar odispositivopadrão desaída:
System.setOut(novaStream).
Agosto2015
DesenvolvimentoOOcomJava
67
Exemplos
// 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
for (i = 1; i < 10; i++) {
System.out.print(i + ", ");
}
System.out.println(10);
String s = "Olá, Java!";
float valor = 45.67;
boolean teste = true;
System.out.println(s);
System.out.print(valor);
System.out.println();
System.out.println(teste);
Agosto2015
//
//
//
//
Olá, Java!
45.67 (sem quebra)
Quebra de linha
true
DesenvolvimentoOOcomJava
68
Saídaformatada
• ApartirdoJava5,afunçãoprintf() doC foicolocada
naclassePrintWriter;
– Facilitaamigração decódigoC paraJava;
– Éumaformamaispoderosa deformatar asaída;
– Otrabalhodeformatação é,naverdade,feito pela
classejava.util.Formatter.
Agosto2015
DesenvolvimentoOOcomJava
69
Comofuncionaoprintf
• Argumentos:
– Umastringdeformatação,comcódigos especiais;
– Umalistadeargumentos aseremimpressos.
• Exemplos:
System.out.printf("Olá, Java!%n"); // Olá, Java!
// [
12] e [12345678]
System.out.printf("[%5d]%n", 12);
System.out.printf("[%5d]%n", 12345678);
double PI = 3.141592;
System.out.printf("[%6.6f]%n", PI); // [3.141592]
System.out.printf("[%6.4f]%n", PI); // [ 3.1416]
Agosto2015
DesenvolvimentoOOcomJava
70
Códigosdeformatação
• Possuemaseguintesintaxe:
%[i$][flags][tam][.prec]conversão
– i:índice doargumento(opcional);
– flags:modificamoformato desaída(opcional);
– tam:tamanho dasaídaemcaracteres(opcional);
– prec:precisão dascasasdecimais(opcional);
– conversão: códigodeconversão (indicaseéum
texto,inteiro,real,booleano,etc.– obrigatório).
Agosto2015
DesenvolvimentoOOcomJava
71
Códigosdeconversão
Código
Tipo do
arg.
'b' ou 'B'
Booleano
's' ou 'S'
Geral
'c' ou 'C'
Descrição
Imprime true ou false.
Imprime como string (texto).
Caractere O resultado é um caractere Unicode.
'd'
Inteiro
'e' ou 'E'
Real (PF)
O resultado é formatado como número decimal
em notação científica.
'f'
Real (PF)
O resultado é formatado como número decimal.
'g' ou 'G'
Real (PF)
Uma das duas opções acima (depende do valor).
'%'
-
O resultado é o caractere %.
'n'
-
O resultado é uma quebra de linha.
Agosto2015
O resultado é formatado como número inteiro na
base decimal.
DesenvolvimentoOOcomJava
72
Maisexemplos
// 5, 00005
System.out.printf("%1$d, %1$05d%n", 5);
// Agora: 12 de Maio de 2006 - 04:29:42 PM.
System.out.printf("Agora: %te de %<tB de %<tY %<tr.%n", new Date());
// PI = 3.141592654
System.out.printf("PI = %.9f%n", Math.PI);
// PI = 3,141592654
Locale br = new Locale("pt", "BR");
System.out.printf(br, "PI = %.9f%n", Math.PI);
// Veja outros formatos na documentação!
Agosto2015
DesenvolvimentoOOcomJava
73
Entradadedadospeloconsole
• Aclassejava.lang.System oferece umstream padrão
deentrada chamadoin;
– Éumobjeto daclassejava.io.InputStream,
abertoemantidoautomaticamente pelaJVM;
– Seusmétodosdeleitura sãomuitoprimitivos,se
comparados comosmétodosdeescrita quevimos;
– Precisamosdeoutras classesqueauxiliem naleitura.
• Alémdaleitura porSystem.in, podemoslertambém
osargumentos passadosnachamada doprograma.
– Já vimos isso na classe Eco.java.
Agosto2015
DesenvolvimentoOOcomJava
74
Leituradeargumentos
• Ométodo main() possuiaseguinteassinatura:
public static void main(String[] args);
• Ovetor args contémosdados passadoscomo
argumentos paraoprograma.
Agosto2015
DesenvolvimentoOOcomJava
75
Eco.java novamente
public class Eco {
// Método principal.
public static void main(String[] args) {
// i vai de 0 até o nº de argumentos.
for (int i = 0; i < args.length; i++) {
// Imprime o argumento na tela.
System.out.print(args[i] + " ");
}
// Quebra de linha ao final do programa.
System.out.println();
}
}
Agosto2015
DesenvolvimentoOOcomJava
76
Aclassejava.util.Scanner
• Poderoso meiodeler dadosdequalquerstream de
entrada,existenteapartirdoJava5;
• Funcionamento:
– Quebra ainformaçãoemtokens deacordocomum
separador (quepodeserconfigurado);
– Lê umainformaçãodecadavez;
– Converte paraotipo dedadosadequado (quando
possível).
Agosto2015
DesenvolvimentoOOcomJava
77
Exemplos
// Lê do console.
Scanner scanner = new Scanner(System.in);
// Lê linha por linha e imprime o "eco".
while (scanner.hasNextLine()) {
String s = scanner.nextLine();
System.out.println("Eco: " + s);
}
// Quebra palavra por palavra.
while (scanner.hasNext()) {
String s = scanner.next();
System.out.println("Eco: " + s);
}
// Depois de usado deve ser fechado.
scanner.close();
Agosto2015
DesenvolvimentoOOcomJava
78
Maisexemplos
// Lê do console.
Scanner scanner = new Scanner(System.in);
// Lê números e imprime o dobro.
while (scanner.hasNextDouble()) {
double d = scanner.nextDouble();
System.out.println("Dobro: " + (d * 2));
}
// Separa os tokens usando vírgulas.
scanner.useDelimiter(",");
while (scanner.hasNext()) {
String s = scanner.next();
System.out.println("Eco: " + s);
}
scanner.close();
Agosto2015
DesenvolvimentoOOcomJava
79
Exercitar é fundamental
• ApostilaFJ-11daCaelum:
– Seção 3.13,página 30(exercícios simples);
– Seção 3.14,página 31(Fibonacci).
Faremos exercícios em
laboratório em breve…
Março2016
OO&Java- Variáveisprimitivasecontroledefluxo
80
http://nemo.inf.ufes.br/
Download