Exercicios Resolvidos Java

  • Published on
    09-Jul-2015

  • View
    14.701

  • Download
    1

Embed Size (px)

Transcript

<p>FICHA PRTICA 1</p> <p>LABORATRIO BASE DE JAVA6</p> <p>TIPOS PRIMITIVOS &amp; ESTRUTURAS DE CONTROLO</p> <p>PROF. F. MRIO MARTINS D I /U M</p> <p>VERSO 2.0 20 10</p> <p> F. Mrio Martins</p> <p>Laboratrios de JAVA: Java Base</p> <p>2009-2010</p> <p>FICHA PRTICA 1 LABORATRIO BASE DE JAVASNTESE TERICAJAVA uma linguagem de programao por objectos. Porm, a tecnologia JAVA muito mais do que a linguagem de programao em que se baseia. A figura seguinte mostra a arquitectura de software correspondente ao ambiente JSE6 que necessrio instalar nas nossas mquinas para executarmos e criarmos programas escritos em JAVA (na sua verso mais actual JAVA6).</p> <p>Figura 1 - Arquitectura JSE6Quando programamos em JAVA6 temos nossa disposio todas estas bibliotecas predefinidas, que possuem disponveis classes para quase todas as mais diferentes funcionalidades necessrias s nossas aplicaes. Porm, o nosso objectivo neste contexto conhecermos o ncleo fundamental da linguagem, e as suas construes bsicas para realizarmos programao sequencial, mas seguindo princpios rigorosos da Engenharia de Software que so mais facilmente respeitados se utilizarmos correctamente caractersticas e propriedades disponveis no paradigma da Programao por Objectos e suas linguagens (cf. C++, C# e JAVA). A execuo de um programa JAVA passa fundamentalmente pela compilao do seu cdigo fonte para um cdigo intermdio, designado byte-code. Este byte-code, que o resultado da compilao, um cdigo standard que poder ser em seguida executado (interpretado) por uma qualquer Java Virtual Machine (JVM). Naturalmente que, para cada sistema operativo e arquitectura, existir uma JVM especfica que interpreta correctamente o byte-code em tal contexto</p> <p>Laboratrios de JAVA: Java Base</p> <p> F. Mrio Martins</p> <p>Pg. 2</p> <p>(cf. Windows, Linux, Solaris, PDA, Java Card, etc.). Neste facto reside a grande portabilidade e flexibilidade da linguagem JAVA.</p> <p>Java byte-code (1010100010010001)</p> <p>Biblioteca de Classes</p> <p>Java Class Loader</p> <p>S D K</p> <p>JVMInterpretador de Java Compilador Just-in-Time</p> <p>Sistema de Runtime de Java</p> <p>Sistema Operativo</p> <p>Hardware</p> <p>SINTAXE ESSENCIAL 1.- ESTRUTURA BASE DE UM PROGRAMA JAVAEm JAVA tudo so classes. Um programa JAVA uma classe especial que, entre outros, possui obrigatoriamente um mtodo main() pelo qual se inicia a execuo do cdigo do programa. O nome do programa (classe) dever ser igual ao do ficheiro fonte que a contm. Exemplo: a public class Teste1 dever ser guardada no ficheiro Teste1.java.</p> <p>public class Teste1 { public static void main(String[] args) { // declaraes e cdigo // ............ } }</p> <p>Porm, e por razes de estruturao do cdigo, nada impede que se criem mtodos externos ao mtodo main() que pertencem igualmente ao programa e que podem ser invocados a partir do mtodo main() e, at, invocarem-se entre si. A figura seguinte mostra este tipo um pouco mais complexo de estruturao do programa, mas que apenas um caso particular do primeiro. Finalmente, e por razes a ver posteriormente, todos estes mtodos devem possuir o atributo static, podendo ser public ou no (usaremos de momento sempre public).</p> <p>Pg. 3</p> <p> F. Mrio Martins</p> <p>Laboratrios de JAVA: Java Base</p> <p>2009-2010</p> <p>public class Teste2 { public static metodo_Aux1 (argumentos opcionais) { // .. } public static metodo_Aux2 (argumentos opcionais) { // .. }</p> <p>public static void main(String[] args) { // ............ // declaraes e cdigo // ............ } }</p> <p>2.- COMPILAO E EXECUO A PARTIR DE LINHA DE COMANDOSFicheiro fonte: Teste1.java Compilao: &gt; javac Teste1.java Execuo: &gt; java Teste1 cria ficheiro Teste1.class</p> <p>3.- EDIO, COMPILAO E EXECUO USANDO BLUEJ- Invocar o BlueJ (eventualmente usar opo New Project ); - Criar o ficheiro fonte usando a opo New Class (ou editar ficheiro existente); - Se fizermos apenas Save criado um cone sombreado com o nome do ficheiro criado, que se apresentar a tracejado indicando que no se encontra compilado ainda; - Pode no entanto usar-se a opo Compile imediatamente aps o fim da edio; - Se no existirem erros, aparece o mesmo cone mas sem qualquer tracejado; - Para ficheiros no compilados, clicar no boto direito do rato e executar a opo Compile - Para executar o programa, sobre o cone clicar no boto direito do rato e seleccionar o mtodomain()</p> <p>- Os resultados so apresentados na Terminal Window do BlueJ EXEMPLO:</p> <p>EdioLaboratrios de JAVA: Java Base F. Mrio Martins Pg. 4</p> <p>Execuo</p> <p>Resultados</p> <p>4.- TIPOS PRIMITIVOS E OPERADORESOs tipos primitivos de JAVA so os usuais tipos simples que se associam a variveis nas quais pretendemos guardar valores (cf. Pascal, C, etc.). A tabela seguinte mostra os tipos disponveis, gama de valores aceites e nmero de bits de representao.</p> <p>Tipo</p> <p>Valores false, true caracter unicode inteiro c/ sinal inteiro c/ sinal inteiro c/ sinal inteiro c/ sinal IEEE 754 FP IEEE 754 FP</p> <p>Omisso false \u0000 0 0 0 0L 0.0F 0.0</p> <p>Bits 1 16 8 16 32 64 32 64</p> <p>Gama de valores false a true \u0000 a \uFFFF -128 a +127 -32768 a +32767 -2147483648 a 2147483647 -1E+20 a 1E+20 3.4E+38 a 1.4E-45 (7 d) 1.8E+308 a 5E-324 (15d)</p> <p>boolean char byte short int long float double</p> <p>Tabela 1 Tipos primitivos de Java</p> <p>5.- DECLARAO E INICIALIZAO DE VARIVEIS.Associadas a um tipo de dados, poderemos ter uma sequncia de declaraes de variveis separadas por vrgulas, eventualmente com atribuies dos valores de expresses para a inicializao de algumas delas, cf. a forma geral e os exemplos seguintes: id_tipo id_varivel [ = valor] [, id_varivel [ = valor ] ] ;int dim = 20, lado, delta = 30; char um = '1'; char newline = '\n'; byte b1 = 0x49; // hexadecimal, cf. 0x como prefixo</p> <p>Pg. 5</p> <p> F. Mrio Martins</p> <p>Laboratrios de JAVA: Java Base</p> <p>2009-2010long diametro = 34999L; double raio = -1.7E+5; double j = .000000123; // parte inteira igual a 0 int altura = dim + delta; // inicializao usando clculo de expresso</p> <p>Associados a estes tipos simples existe um conjunto de operadores necessrios sua utilizao, comparao, etc. Vejamos os mais importantes na tabela seguinte.Precedncia 12 11 9 8 4 3 1 Operador Tipos dos Operandos nmero boleano nmero, nmero inteiro, inteiro nmero, nmero nmeros aritmticos primitivos primitivos boleanos boleanos boleano boleano varivel, qualquer Associao D D E E E E E E E E E E E D D D D D D Operao sinal; unrio negao multipl, diviso quoc. int e mdulo soma e subtraco comparao comparao igual valor valor diferente OUEXC lgico OU lgico E condicional OU condicional atribuio atribuio aps oper. atribuio aps oper. atribuio aps oper. atribuio aps oper. atribuio aps oper.</p> <p>+, ! *, / /,% +, = == != ^ | &amp;&amp; || = *= += &gt;= ^= /= -= &gt;&gt;= &amp;= |= %=</p> <p>varivel, qualquer varivel, qualquer varivel, qualquer varivel, qualquer varivel, qualquer</p> <p>Tabela 2 Operadores de JAVA para tipos simples</p> <p>6.- DECLARAO DE CONSTANTES.As constantes JAVA so tambm, por razes de estilo e de legibilidade, identificadas usando apenas letras maisculas, em certos casos usando-se tambm o smbolo _. As seguintes declaraes,final double PI = 3.14159273269; final double R_CLAP = 8.314E+7;</p> <p>definem, num dado contexto, constantes identificadas, cujos valores no podero ser alterados por nenhuma instruo. O atributo final garante que um erro de compilao ser gerado caso haja a tentativa de modificar tal valor.</p> <p>7.- COMENTRIOS.// este um comentrio monolinha; termina no fim desta linha /* este multilinha; s termina quando aparecer o delimitador final */ /** este um comentrio de documentao para a ferramenta javadoc */</p> <p>Laboratrios de JAVA: Java Base</p> <p> F. Mrio Martins</p> <p>Pg. 6</p> <p>8.- ESTRUTURAS DE CONTROLOif if if if (condio) (condio) (condio) (condio) instruo; { instruo1; instruo2; } instruo1; else instruo2; ou { instrues } { instruo1; instruo2; } else { instruo1; instruo2; }</p> <p>switch (expresso_simples) { case valor_1 : instrues; [break;] case valor_n : instrues; [break;] default: instrues; } for (inicializao; condio de sada; incremento) instruo; ou { instrues } for (Tipo varivel : array de elementos de tipo Tipo) instruo; ou { instrues } while (condio de execuo) { instrues } do { instrues; } while(condio de repetio);</p> <p>9.- IMPORTAO NORMAL E ESTTICA REUTILIZAO DE CLASSESImportao por omisso: import java.lang.*; Importao global de um package: import java.util.*; Importao selectiva de classes: import java.lang.Math; Importao esttica (elimina prefixos): import static java.lang.Math.abs;</p> <p>10.- OUTPUT BSICO E FORMATADO10.1- As instrues bsicas de escrita (output) de JAVA so dirigidas ao dispositivo bsico de sada, o monitor, que a partir do programa visto como um ficheiro de caracteres do sistema designado por System.out. Assim, so mensagens bsicas todas as strings (cf. abc mais operador de concatenao + para strings e valores de tipos simples) enviadas para tal ficheiro usando a instruo println(), o que se escreve:System.out.println("Bom dia e \tbom trabalho!\n\n\n"); System.out.println("Linguagem : " + lp + 5); System.out.println(nome + ", eu queria um " + carro + "!");</p> <p>Se nos programas em que tivermos que realizar muitas operaes de sada escrevermos no seu incio a clusula de importao import static java.lang.System.out;, ento, em vez de se escrever System.out.println(.) bastar escrever-se out.println(.), cf. em:out.println(Hello Java!); out.println(nome + tem + idade + anos.);</p> <p>10.2 10.2.- JAVA possui tambm uma forma formatada de escrita de dados, baseada em especial no .2 mtodo printf(). O mtodo printf(formatString, lista_valores) permitir a sada de uma lista de valores (sejam variveis, constantes ou expresses), que sero formatados segundo as directivas dadas na string de formatao, que o primeiro parmetro, e que pode incluir texto livre. A forma geral de formatao de valores de tipos primitivos a seguinte (para cada valor a formatar):</p> <p>Pg. 7</p> <p> F. Mrio Martins</p> <p>Laboratrios de JAVA: Java Base</p> <p>2009-2010%[ndice_arg$] [flags] [dimenso][.decimais] converso</p> <p>Os caracteres de converso so os que indicam o tipo de valor resultado da converso do parmetro, sendo: c (carcter), b (boleano), o (octal), h (hexadecimal), d (inteiro), f (real, vrgula fixa), s (string), e (real, vrgula flutuante), t (data) e n (newline independente da plataforma). Um valor de dado tipo se formatado para outro tipo compatvel automaticamente convertido. As flags podem permitir alinhar os resultados esquerda (-), obrigar a incluir sempre o sinal (+), colocar zeros no incio (0), colocar espaos no incio ( ) ou colocar parntesis (() se o nmero for negativo.float f1 = 123.45f; double d2 = 234.678; double d3 = 12.45E-10; out.printf("R1 %5.2f R2 %3$-12.7f Exp1 %2$8.4e%n",f1, d2, d3);</p> <p>Por exemplo, usando apenas caracteres de converso podemos automaticamente fazer a converso de um nmero inteiro na base 10 para a base 8 e para a base 16.int x = 1261; out.printf("Inteiro %d = Octal %o = Hexa %h%n", x,x,x); out.printf("Inteiro %d = Octal %1$o = Hexa %1$h%n", x);</p> <p>11.- INPUT COM CLASSE SCANNERA classe java.util.Scanner possui mtodos para realizar leituras de diversos tipos a partir de diversos ficheiros, e no s. Interessa-nos aqui ver como podemos usar esta classe para realizar leituras de valores de tipos simples a partir do teclado. O teclado est, por omisso, associado a uma varivel designada System.in. Assim, teremos que associar um Scanner ao teclado para se poder ler os valores primitivos necessrios aos programas. Vejamos os passos: 1.- Escrever no incio do ficheiro a clusula de importao import java.util.Scanner; 2.- Criar um Scanner que se vai associar ao teclado, e que vamos designar por input:Scanner input = new Scanner(System.in);</p> <p>3.- Tendo o scanner input associado ao teclado, usar mtodos de Scanner para ler os valores, cf.:String nome = input.next(); String linha = input.nextLine(); int x = input.nextInt(); double pi = input.nextDouble(); input.nextTipoSimples(); input.close(); // // // // // // l uma string l uma linha de texto terminada por \n l um inteiro vlido l um real vlido, sendo , o separador l um valor de qualquer tipo simples fecha o scanner</p> <p>Nota: Posteriormente usaremos uma classe Input especialmente desenvolvida</p> <p>12.- CLASSES PREDEFINIDAS IMPORTANTESjava.lang.Math Math.PI; Math.E: // valores de PI e da base E com grande preciso tipo_numrico abs(tipo_numrico val); // valor absoluto double sqrt(double val); // raiz quadrada double pow(double base, double exp); // potenciao double random(); // resultado no intervalo [0.0 1.0[ tipo_numrico max (tipo_numrico val1, tipo_numrico val2); tipo_numrico min (tipo_numrico val1, tipo_numrico val2); int round(float val); float round(double val); // seno e coseno double sin(double val); double cos(double val);</p> <p>Laboratrios de JAVA: Java Base</p> <p> F. Mrio Martins</p> <p>Pg. 8</p> <p>java.lang.Integer java.lang.Double java.lang.Float .MAX_VALUE; .MIN_VALUE // mximo e mnimo definidos java.util.GregorianCalendar // classe til para tratamento de datas GregorianCalendar agora = new GregorianCalendar(); // idem GregorianCalendar hoje = new GregorianCalendar(2007, Calendar.MARCH, 10, 23, 15); // define data hoje.set(GregorianCalendar.YEAR, 2009); // modifica o campo ANO int ms = hoje.get(GregorianCalendar.MONTH); // consulta o campo MS // tempo decorrido desde o incio da ERA at data e hora actuais em ms long milis = agora.getTimeInMillis(); // diferena entre duas datas (agora e inicio) em nmero de dias long dif_milis = agora.getTimeInMillis() - inicio.getTimeInMillis(); int dias = dif_milis/(24*60*60*1000); // escrever a hora actual e escrever a data actual out.printf(%tT%n, agora) // 12:23:35 out.printf(%1$tY/%1$tm/%1$td%n, agora); // 2005/03/21 java.lang.String Constantes: abcd Uma linha\n Exemplo\t\tFinal\n\n Concatenao: abc + 25 Lus + Carlos Linha1\n + Linha2\n String valueOf(tipo_simples val); // converte para string um valor simples char charAt(int ndex); // devolve o carcter na posio ndex da string int length(); //devolve o comprimento da string String substring(int inic, int fim); // devolve uma substring boolean equals(String str) // igualdade de strings</p> <p>EXERCCIOS RESOLVIDOS:Ex1: Ler um nome e uma idade e imprimir um texto com os resultados.1 2 3 4 5 6 7 8 9 10 11 import java.util.Scanner; public class Leitura1 { public static void main(String[] args) { String nome; int idade; // Scanner: classe para leitura Scanner input = new Scanner(System.in); // l via teclado System.out.print("Nome: "); nome = input.next(); System.out.print("Idade: "); idade = input.nextInt(); System.out.println(nome + " tem " + idade + " anos."); } }</p> <p>Ex2: Ler 10 inteiros e determinar o maior inteiro introduzido.1 import java.util.Scanner; 2 public class MaxInt { 3 public static void main(String[] args) { 4 Scanner input = new Scanner(System.in); // l via teclado 5 int valor; int maior = Integer.MIN_VALUE; 6 for(int i = 1; i maior) maior = valor; 10 } 11 System.out.println("Maior inteiro = " + maior); 12 } 13 }Pg. 9</p> <p> F. Mrio Martins</p> <p>Laboratrios de JAVA: Java Base</p> <p>2009-2010</p> <p>Ex3: Sendo N dado pelo utilizador, ler N reais e dar os resultados das suas potncias de expoente...</p>