Exercicios Resolvidos Java
Exercicios Resolvidos Java
Exercicios Resolvidos Java
VERSO 2.0 20 10
F. Mrio Martins
2009-2010
F. Mrio Martins
Pg. 2
(cf. Windows, Linux, Solaris, PDA, Java Card, etc.). Neste facto reside a grande portabilidade e flexibilidade da linguagem JAVA.
Biblioteca de Classes
S D K
JVM
Interpretador de Java Compilador Just-in-Time
Sistema Operativo
Hardware
public class Teste1 { public static void main(String[] args) { // declaraes e cdigo // ............ } }
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).
Pg. 3
F. Mrio Martins
2009-2010
public class Teste2 { public static <tipoRes> metodo_Aux1 (argumentos opcionais) { // .. } public static <tipoRes> metodo_Aux2 (argumentos opcionais) { // .. }
Edio
Laboratrios de JAVA: Java Base F. Mrio Martins Pg. 4
Execuo
Resultados
Tipo
Valores false, true caracter unicode inteiro c/ sinal inteiro c/ sinal inteiro c/ sinal inteiro c/ sinal IEEE 754 FP IEEE 754 FP
Bits 1 16 8 16 32 64 32 64
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)
Pg. 5
F. Mrio Martins
2009-2010
long diametro = 34999L; double raio = -1.7E+5; double j = .000000123; // parte inteira igual a 0 int altura = dim + delta; // inicializao usando clculo de expresso
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.
+, ! *, / /,% +, <, <= >, >= == != ^ | && || = *= += <<= >>>= ^= /= -= >>= &= |= %=
varivel, qualquer varivel, qualquer varivel, qualquer varivel, qualquer varivel, qualquer
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.
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 */
F. Mrio Martins
Pg. 6
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);
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.);
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):
Pg. 7
F. Mrio Martins
2009-2010
%[ndice_arg$] [flags] [dimenso][.decimais] converso
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);
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);
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
F. Mrio Martins
Pg. 8
java.lang.Integer java.lang.Double java.lang.Float <classe>.MAX_VALUE; <classe>.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
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."); } }
F. Mrio Martins
2009-2010
Ex3: Sendo N dado pelo utilizador, ler N reais e dar os resultados das suas potncias de expoente Exp, tambm introduzido pelo utilizador.
import static java.lang.System.out; import java.util.Scanner; public class Expoentes { public static void main(String[] args) { Scanner input = new Scanner(System.in); // l via teclado int total; double valor; int exp; out.print("Total de valores a ler: "); total = input.nextInt(); out.print("Expoente a que os quer elevar: "); exp = input.nextInt(); for(int i = 1; i <= total; i++) { out.print("Introduza valor real: "); valor = input.nextDouble(); out.printf("Valor %7.2f elevado a %2d = %8.4f%n", valor, exp, Math.pow(valor, exp)); } } }
Ex4: Ler uma sequncia de inteiros positivos (terminada pelo valor -1) e determinar a diferena entre o maior e o menor inteiro lidos. Imprimir esse valor, bem como o maior e o menor.
import java.util.Scanner; import static java.lang.System.out; public class DiferencaInt { public static void main(String[] args) { int valor; int maior = Integer.MIN_VALUE; int menor = Integer.MAX_VALUE; int diferenca; Scanner input = new Scanner(System.in); // l via teclado valor = input.nextInt(); while(valor != -1) { if (valor > maior) maior = valor; if (valor < menor) menor = valor; } diferenca = maior menor; out.println("Maior = " + maior + " Menor = " + menor + "\n"); out.println("A diferena entre eles : " + diferenca); } }
Ex5: Escrever um programa que calcule o factorial de um valor inteiro, dado como argumento do mtodo main() atravs dos argumentos deste mtodo.
import static java.lang.System.out; public class FactorialInt{ public static long factorial(long n) { if (n==1) return 1; else return n*factorial(n-1); } public static void main(String[] args) { long i = Integer.parseInt(args[0]); out.println( i + "! = " + factorial(i) ); } }
Execuo: > FactorialInt 4 (em Bluej em args introduzir {4}) Nota: Para outro tipo teramos parseDouble(), parseFloat(), parseByte(), etc.
F. Mrio Martins
Pg. 10
Ex6: Escrever um programa que determine a data e hora do sistema, realize um ciclo com 10 milhes de incrementos unitrios de uma dada varivel, determine a hora aps tal ciclo, e calcule o total de milissegundos que tal ciclo demorou a executar.
import java.util.Scanner; import java.util.Calendar; import static java.lang.System.out; public class Ex6 { public static void main(String[] args) { int x = 0; Calendar inicio = Calendar.getInstance(); for(int i = 0; i < 10000000; i++) x = x +1; Calendar fim = Calendar.getInstance(); long milisegs = fim.getTimeInMillis() - inicio.getTimeInMillis(); out.println("O ciclo demorou " + milisegs + " milisegundos a executar."); out.println("A varivel x tem o valor: " + x); } }
Ex7: Escrever um programa que use um mtodo auxiliar que aceite duas datas e determine a sua diferena em dias, horas, minutos e segundos. O resultado do mtodo dever ser uma string.
import java.util.Scanner; import java.util.GregorianCalendar; import static java.lang.System.out; public class Ex7 { public static String difDatas(GregorianCalendar fim, GregorianCalendar inicio) { long totalmilis = fim.getTimeInMillis() - inicio.getTimeInMillis(); long milis = totalmilis%1000; long totalseg = totalmilis/1000; long seg = totalseg%60; int totalmin = (int) totalseg/60; int min = totalmin%60; int totalhoras = totalmin/60; int horas = totalhoras%60; int totaldias = totalhoras/24; return totaldias + " dias, " + horas +" horas, "+ min+ " minutos e " + seg + "," + milis + " segundos."; } public static void main(String[] args) { GregorianCalendar inicio = new GregorianCalendar(); inicio.set(GregorianCalendar.YEAR, 2007); inicio.set(GregorianCalendar.MONTH, 2); inicio.set(GregorianCalendar.DAY_OF_MONTH, 8); inicio.set(GregorianCalendar.HOUR, 12); inicio.set(GregorianCalendar.MINUTE, 20); inicio.set(GregorianCalendar.SECOND, 33); inicio.set(GregorianCalendar.MILLISECOND, 111); // ou new GregorianCalendar(2007, Calendar.MARCH, 8, 23, 15); GregorianCalendar fim = new GregorianCalendar(); fim.set(GregorianCalendar.YEAR, 2009); fim.set(GregorianCalendar.MONTH, 2); fim.set(GregorianCalendar.DAY_OF_MONTH, 13); fim.set(GregorianCalendar.HOUR, 22); fim.set(GregorianCalendar.MINUTE, 12); fim.set(GregorianCalendar.SECOND, 15); fim.set(GregorianCalendar.MILLISECOND, 444); // ou new GregorianCalendar(2007, Calendar.MARCH, 10, 12, 15); String difTempo = difDatas(fim, inicio); out.println("Diferena: " + difTempo); } }
Pg. 11
F. Mrio Martins
2009-2010
Ex8: Escrever um programa aceite N classificaes (nmeros reais) entre 0 e 20 e determine a sua mdia (usar printf() para os resultados).
import static java.lang.System.out; public class Ex8 { public static void main(String[] args) { double nota, soma = 0.0; int total; out.print("Total de notas a ler: "); total = Input.lerInt(); for(int i = 1; i <= total; i++) { out.println("Nota N. " + i); nota = Input.lerDouble(); soma += nota; } out.printf("A mdia das %2d notas %4.2f%n", total, soma/total); } }
Ex9: Escrever um programa aceite N temperaturas inteiras (pelo menos duas) e determine a mdia das temperaturas, o dia (2,3, ) em que se registou a maior variao em valor absoluto relativamente ao dia anterior e qual o valor efectivo (positivo ou negativo) dessa variao. Os resultados devem ser apresentados sob a forma:
A mdia das N temperaturas foi de ____ graus. A maior variao de temperatura registou-se entre os dias __ e __ e foi de ___ graus. A temperatura entre o dia __ e o dia __ subiu/desceu ___ graus. import java.util.Scanner; import static java.lang.System.out; import static java.lang.Math.abs; public class Temperaturas { public static void main(String[] args) { int temp; int anterior; int dia = 0; int total; int maiorDif = 0; int soma = 0; int difReal = 0, difAbs = 0; Scanner input = new Scanner(System.in); // l via teclado out.print("Total de temperaturas a ler: "); total = Input.lerInt(); out.print("Temperatura " + 1 + " : "); temp = Input.lerInt(); soma = temp; for(int i = 2; i <= total; i++) { anterior = temp; out.print("Temperatura " + i + " : "); temp = Input.lerInt(); soma += temp; difReal = temp - anterior; difAbs = abs(temp - anterior); if (difAbs > maiorDif) { dia = i; maiorDif = difAbs; } } // resultados out.printf("A mdia das %2d temperaturas %4.2f%n", total, ((double) soma)/total); out.println("Maior variao de temperaturas entre os dias " + (dia-1) + " e " + dia); String txt = difReal > 0 ? "subiu " : "desceu "; out.println("A temperatura entre esses dias " + txt + difAbs + " graus."); } }
F. Mrio Martins
Pg. 12
Ex10: Escrever um programa que leia sucessivas vezes o raio (real) de um crculo e calcule a rea e o permetro respectivos com grande preciso (5 decimais). Usar printf() para os resultados. O programa apenas dever terminar com a leitura de um raio = 0.0
import static java.lang.Math.PI; import static java.lang.System.out; public class AreaCirculo { public static void main(String[] args) { double raio; out.print("Valor do raio: "); raio = Input.lerDouble(); while(raio != 0.0) { out.printf("Raio = %7.3f => rea = %9.5f e Permetro = %9.5f%n", raio, PI*raio*raio, 2*PI*raio); out.print("Valor do raio: "); raio = Input.lerDouble(); } } }
Ex11: Escrever um programa que faa a leitura de uma sequncia no vazia de nmeros reais terminada por 0.0 e calcule o seu somatrio () e o seu produtrio () com preciso de 4 casas decimais no resultado.
import static java.lang.System.out; public class Ex11 { public static void main(String[] args) { double soma = 0; double prod = 1; double num; int conta = 0; out.print("Nmero Real: "); num = Input.lerDouble(); while(num != 0.0) { soma += num; prod *= num; conta++; out.print("Nmero Real: "); num = Input.lerDouble(); } out.printf("Soma dos %2d nmeros reais = %8.4f ; Produto = %12.4f%n%n", conta, soma, prod); } }
Ex12: Escrever um programa leia um inteiro N e imprima todos os nmeros mpares inferiores a N.
import static java.lang.System.out; public class Impares { public static void main(String[] args) { int limite; out.print("Ler nmero limite: "); limite = Input.lerInt(); out.println("Nmeros mpares menores ou iguais a " + limite); for(int i = 1; i <= limite; i = i + 2) out.println(i); } }
Ex13: Escrever um programa que apresente ao utilizador um menu vertical com as opes:
1.- Inserir 2.- Remover 3.- Consultar 4.- Gravar 5.- Sair
Em seguida, o programa dever ler um int, que apenas ser vlido se entre 1 e 5, e dever apresentar ao utilizador, textualmente, a opo escolhida (Inserir, Remover, etc.) ou a mensagem Opo Invlida!. O programa dever repetir a apresentao do menu at que o utilizador seleccione a opo 5.- Sair.
Pg. 13
F. Mrio Martins
2009-2010
import static java.lang.System.out; public class Ex13 { public static void menu() { out.println("--------------------------------------------"); out.println("-OPCOES DISPONVEIS ---"); out.println("--------------------------------------------"); out.println(" 1. INSERIR "); out.println(" 2. REMOVER "); out.println(" 3. CONSULTAR "); out.println(" 4. GRAVAR "); out.println(" 5. SAIR "); out.println("--------------------------------------------"); } public static int opcao() { int opcao; boolean valida = false; do { out.print("OPCAO: "); opcao = Input.lerInt(); valida = (opcao >= 1) && (opcao <= 5); if(!valida) out.println("OPCAO INVLIDA !!"); } while(!valida); return opcao; } public static void texto_opcao(int op) { switch(op) { case 1 : out.println("INSERIR"); break; case 2 : out.println("REMOVER"); break; case 3 : out.println("CONSULTAR"); break; case 4 : out.println("GRAVAR"); break; case 5 : out.println("SAIR"); break; } } public static void main(String[] args) { int escolha; do { menu(); escolha = opcao(); texto_opcao(escolha); } while(escolha != 5); out.println("FIM DE PROGRAMA !!"); } }
Ex14: Escrever um programa que gere um nmero aleatrio entre 1 e 100. O programa dar 5 tentativas ao utilizador para acertar no nmero gerado. A cada tentativa do utilizador, o programa indicar se o nmero gerado maior ou menor que o nmero dado pelo utilizador. terceira tentativa falhada o utilizador perde. Quer perca quer acerte, o programa deve perguntar ao utilizador se quer continuar a jogar ou no. Se sim, novo nmero ser gerado e o jogo retomado.
import static java.lang.System.out; import static java.lang.Math.random; public class Ex14 { public static int geraNumero() { int numAleat = 1 + (int) (random() * 100); return numAleat; }
Laboratrios de JAVA: Java Base F. Mrio Martins Pg. 14
public static void main(String[] args) { int numero; int opcao; int tentativa; int palpite; int resposta; boolean acertou; do { numero = geraNumero(); tentativa = 1; out.print("Tentativa " + tentativa + " - Qual o numero gerado? "); palpite = Input.lerInt(); acertou = false; while( tentativa < 5 && !acertou) { if(palpite == numero) acertou = true; else { if (palpite > numero) out.println("PARA BAIXO !!"); else out.println("PARA CIMA !!"); tentativa++; out.print("Tentativa " + tentativa + " - Qual o numero gerado? "); palpite = Input.lerInt(); } } // verifica se acertou ou no if (acertou) out.println("PARABNS ACERTOU !!"); else out.println("FALHOU ! O nmero era o " + numero); out.println("Continuar Jogo (1) ou Sair(outro): "); resposta = Input.lerInt(); } while(resposta == 1); out.println("FIM DO JOGO ........"); } }
Ex15: Escrever um programa que leia o ano, ms e dia de nascimento de uma pessoa e calcule a sua idade actual, indicando ao utilizador a data de nascimento lida, o dia de hoje e a idade que foi calculada.
import java.util.GregorianCalendar; import static java.lang.System.out; public class Ex15 { public static void main(String[] args) { int ano, mes, dia; String resp = ""; do { out.print("Ano de nascimento: "); ano = Input.lerInt(); do { out.print("Ms de nascimento: "); mes = Input.lerInt(); } while(mes <= 0 || mes > 12); do { out.print("Dia de nascimento: "); dia = Input.lerInt(); } while(dia <= 0 || dia > 31); // Nota: Janeiro = 0 para um Calendar !! GregorianCalendar dataNascimento = new GregorianCalendar(ano, mes-1, dia); out.printf("NAscido a %1$td/%1$tm/%1$tY%n", dataNascimento); GregorianCalendar hoje = new GregorianCalendar();
Pg. 15
F. Mrio Martins
2009-2010
// diferena de anos int anos = hoje.get(GregorianCalendar.YEAR) dataNascimento.get(GregorianCalendar.YEAR); out.printf("DATA ACTUAL : %1$td-%1$tm-%1$tY%n", hoje); out.println("IDADE NO CORRIGIDA: " + anos + " anos."); GregorianCalendar diaDeAnosEsteAno = dataNascimento; // dia de anos este ano = data de nascimento + idade no corrigida diaDeAnosEsteAno.add(GregorianCalendar.YEAR, anos); out.printf("ANOS A %1$td-%1$tm-%1$tY%n", diaDeAnosEsteAno); // j fez anos ou no ?? if (hoje.before(diaDeAnosEsteAno)) out.println("Ainda l no chegamos !!"); anos--; out.println("A pessoa tem " + anos + " anos !"); out.println("------------------------------------------"); out.print("Quer calcular mais (S/*) ? "); resp = Input.lerString(); out.println(); } while(resp.equals("S") || resp.equals("s")); out.println("---- FIM DO CALCULADOR DE IDADES .... "); } }
Ex16: Escrever um programa que leia duas datas (ano, ms e dia) e determine o nmero de anos entre tais datas.
/** * Clculo da Diferena em Anos entre duas Datas * * @author FMM * @version 1.0/2009 */ import java.util.GregorianCalendar; import static java.lang.System.out; public class Ex16 { public static GregorianCalendar lerData() { int ano, mes, dia; do { out.print("Ano a considerar: "); ano = Input.lerInt(); } while(ano <= 0); do { out.print("Ms (Janeiro = 0) : "); mes = Input.lerInt(); } while(mes <= 0 || mes > 12); do { out.print("Dia: "); dia = Input.lerInt(); } while(dia <= 0 || dia > 31); return new GregorianCalendar(ano, mes, dia); }
F. Mrio Martins
Pg. 16
public static int totalAnos(GregorianCalendar data1, GregorianCalendar data2) { long dif = data1.getTimeInMillis() - data2.getTimeInMillis(); // de milisegundos para anos long totalSeg = dif/1000; int totalMin = (int) totalSeg/60; int totalDias = totalMin/(60*24); int anos = totalDias/(30*12); return anos; } public static void main(String[] args) { out.println("DATAS EM COMPARAO : "); GregorianCalendar data1, data2; data1 = lerData(); data2 = lerData(); out.printf("DATA1 %1$td/%1$tm/%1$tY%n", data1); out.printf("DATA1 %1$td/%1$tm/%1$tY%n", data2); int anos = 0; if(data1.before(data2)) anos = data2.get(GregorianCalendar.YEAR) - data1.get(GregorianCalendar.YEAR); if(data2.get(GregorianCalendar.MONTH)< data1.get(GregorianCalendar.MONTH)) anos--; out.println("Diferem de " + anos + " anos!"); // ou ainda long anos1 = (data1.before(data2)) ? totalAnos(data2, data1) : totalAnos(data1, data2); if(data2.get(GregorianCalendar.MONTH) < data1.get(GregorianCalendar.MONTH)) anos--; out.println("Diferem de " + (int) anos1 + " anos!"); } }
Pg. 17
F. Mrio Martins