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/