Baixe o app para aproveitar ainda mais
Prévia do material em texto
Isaias Camilo Boratti 3. Comandos de Controle de Fluxo Exercício Escrever uma aplicação que, para um conjunto de pessoas, determine: a) A idade média das pessoas; b) A quantidade de homens com idade acima de 80 anos; c) A pessoa mais idosa; Isaias Camilo Boratti Comando do/while Forma geral: do comando; while ( expressão lógica ); ou do bloco while (expressão lógica); onde comando representa um único comando e bloco consiste em um conjunto de comandos colocados entre chaves. Exemplos: int i = 0; do System.out.println(“i=“ + i++); while ( i < 5 ); Isaias Camilo Boratti int soma = 0, par = 0; do { par = par + 2; soma = soma + par; } while ( par < 20 ) ; Comando if forma geral: if (expressão lógica ) comando; ou bloco ou if (expressão lógica) comando1; ou bloco else comando2; ou bloco Isaias Camilo Boratti Exemplo: if (vendas == 0) comissao = 0; else if (vendas <= 2000.00) { comissao = vendas*0.1 + 100.0; desempenho = “Regular” ; } else { comissao = vendas * 0.12 + 100.0; desempenho = “Muito bom”; } Isaias Camilo Boratti Exercício: Considere um objeto que represente um número inteiro positivo. Escreva a classe deste objeto de forma que o mesmo tenha a capacidade de: a) Informar se está representando ou não um número par; b) Fornecer a soma de todos os ímpares menores que o valor por ele representado; c) Informar se está representando ou não um número primo; d) Fornecer o fatorial do número que representa; e) Fornecer a soma dos dígitos que formam o valor por ele representado; f) Denominando de N o valor representado pelo objeto, fornecer a valor do somatório (S1) dado por: S1 = N + (N-1)/2 + (N-2)/3 + (N-3)/4 + ... + 1/N g) Informar se está representando ou não um quadrado perfeito. Um inteiro positivo é um quadrado perfeito se o mesmo for igual a soma de seus divisores, excluindo ele próprio; Exemplo: 28=1+2+4+7+14 Isaias Camilo Boratti h) Informar se representa um valor que é “amigo” do valor representado por outro objeto da mesma classe. Considere que dois valores são “amigos” se cada um for igual a soma dos divisores do outro, incluindo o divisor 1 e excluindo o divisor igual ao próprio valor; i) Fornecer a raiz quadrada do valor que está representando, usando o processo de cálculo a seguir. 1) Se N é um número positivo cuja raiz quadrada é X, então o valor para a primeira aproximação para sua raiz é: X1 = N/2 2) As sucessivas aproximações serão: Xi+1 = ( Xi2 + N)/ (2Xi) O processo deve calcular várias aproximações, até que o módulo da diferença entre duas aproximações sucessivas seja menor que 1E-06. O valor da última aproximação será a raiz quadrada do número. Exercícios propostos: 1) Escreva uma classe que tenha a capacidade de determinar: a) O MDC(x,y); b) A soma dos termos da série de Fibonacci 1, 1, 2, 3, 5, 8, 13, .... c) O valor da constante e dado por: e = 1/0! + 1/1! + 1/2! + 1/3! + 1/4! + ...... 2) Considere uma fração como um objeto. Escreva a classe deste objeto. Coloque métodos de forma a poder somar duas frações, multiplicar duas frações, dividir duas frações, simplificar duas frações, etc. 3) Considere o método quer_Continuar da classe Interface. Este método deve perguntar ao usuário se deseja continuar o processamento ou não. Assim, o usuário deverá digitar o caracter S (sim) ou o caracter N (não) e o método deve devolver este caracter como resposta. Caso o usuário digite um caracter que não seja S ou N, o método deve informar ao usuário que este entrou com um caracter inválido e solicitar que o usuário digite novamente. O método quer_Continuar só deverá ser encerrado quando o usuário digitar um valor válido. Escreva a implementação completa deste método. Isaias Camilo Boratti 4) Escreva uma classe de forma que um número complexo possa ser tratado como um objeto. Uma instância da classe deve ter a capacidade de: informar o valor da parte real do complexo que representa; informar o valor da parte imaginária; fornecer o valor do módulo; fornecer a soma do complexo que representa com o complexo representado por outra instância; idem para a diferença e multiplicação. 5) Escreva uma classe que possibilite manipular o objeto arco (ângulo). Faça com que um arco tenha a capacidade de determinar seus valores trigonométricos, tais como seno, co-seno, tangente, co-tangente, secante e co- secante. Os valores de seno(x) e co-seno(x) devem ser calculados de acordo com as séries a seguir, considerando x expresso em radianos. Escreva uma aplicação que mostre os valores trigonométricos para arcos de 0 a 90 graus. seno(x) = x – x3/3! + x5/5! – x7/7! + ... co-seno(x) = 1 – x2/2! + x4/4! – x6/6! + ... Isaias Camilo Boratti Operadores relacionais == --> igual a != --> diferente de > --> maior que >= --> maior ou igual a < --> menor que <= --> menor ou igual a Operadores lógicos && --> E lógico (AND) || --> Ou lógico (OR) ! --> Não lógico (NOT) & --> E lógico (bit a bit) | --> Ou lógico (bit a bit) ^ --> Ou lógico exclusivo ( bit a bit ) Quando aplicado a expressões lógicas, os operadores && e &, assim como || e | produzem o mesmo resultado exceto que & e | fazem a avaliação completa da expressão. Exemplo: int b, a = 10; double media; int frequencia; String resultado; .......................... if ( media >= 6 && frequencia >50 ) resultado = “Aprovado”; else if ( media < 5 || frequencia < 30) resultado = “Reprovado”; b = a & 3; // b=2 - operado bit a bit b = a | 3; // b = 11 b = a ^ 3; // b = 9 Isaias Camilo Boratti if ( media > 5 ^ frequencia < 50) resultado = “Aprovado”; // ???? Comando while Forma geral: while ( expressão lógica ) comando; ou bloco onde comando deve ser um único comando e bloco é um conjunto de comandos colocados entre chaves. Exemplo: ........................... int i = 0; long fat = 1; while ( i < n ) { i++; fat = fat * i; } Isaias Camilo Boratti public double pegueNota() { double nota; String entrada; entrada =JOptionPane.showInputDialog( “Entre com nota”); nota = Double.parseDouble(entrada); while (nota >10 || nota < 0 ) { JOptionPane.showMessageDialog(null, “nota inválida”); entrada =JOptionPane.showInputDialog( “Entre com nota”); nota = Double.parseDouble(entrada); } return nota; } Isaias Camilo Boratti Operadores aritméticos de atribuição Operador Exemplo equivalente += c += 7; c = c + 7; -= d -= 2; d = d - 2; *= e *= 3; e = e * 3; /= f /= 2; f = f / 2; %= g %= 11; g = g % 11; Operadores de incremento e decremento Operador Nome ex. Obs. ++ pré-increm. ++i; aumenta 1 em i e após utiliza-o ++ pós-increm. i++; utiliza i e após incrementa-o -- pré-increm. --cont; decrementa cont e após utiliza-o -- pós-increm. cont--; utiliza cont e após decrementa-o Isaias Camilo Boratti Exemplos: int a=6; System.out.println(a++); /* imprime o valor 6 e após faz a = 7 */ int cont = 0, soma = 0; while ( cont++ < 5) soma += cont; // aqui soma tem o valor 10 int a=10, b=20, c; c = ++a+b--; // aqui a=11, b=19 e c = 31 Obs.: Os operadores ++ e -- são operadores unários (aplicados a um único operando) e podem ser aplicados dentro de qualquer expressão. Comando for Forma geral : for ( expressao1 ; expressao2 ; expressao3 ) comando; ou bloco Obs.: expressao2 deve definir um valor tipo boolean. Funcionamento: Ao ser encontrado um for, será executada expressao1. Após será executada expressao2. Caso expressao2 seja uma expressão com valor true, será executado comando (ou bloco) interno ao for e após será executada expressao3. Após, será novamente executada expressao2. Caso expressao2 seja true, o processo se repete, e caso expressao2 seja uma expressão comvalor false, o comando for será encerrado. expressao1 --> normalmente usada para inicializar uma variável de controle expressao2 --> expressão boolean que controla a repetição expressao3 --> normalmente um comando que modifica a variável de controle As três expressões são opcionais. Caso expressao2 seja omitida será assumido valor true (laço infinito). Isaias Camilo Boratti Exemplos: double soma = 0; for (int i = 0 ; i<5; i++ ) soma = soma + Math.pow(i,2); // aqui soma tem o valor 30.0 Obs.: variáveis declaradas dentro de um for tem sua localidade restrita ao for. long somaPar = 0; for ( int k = 20; k>0; k=k-2) somaPar = somaPar + k; String s = new String(); for (char letra = ‘A’; letra<= ‘Z’; letra++) s = s + letra; // aqui s = ABCDEFGHI............Z Isaias Camilo Boratti Na maioria dos casos, um comando for pode ser substituído por um while. NumeroPositivo numero = new NumeroPositivo(1); ................................................ for ( int i = 1; i <100; i++) { numero.recebaValorNumero(i); if ( numero.ePrimo() ) cont++; } int i = 1; while ( i<100 ) { numero.recebaValorNumero(i); if ( numero.ePrimo() ) cont++; i = i + 1; } Isaias Camilo Boratti int soma = 0; for (int k = 10; k > 5; k--); soma = soma + k; for ( cont = 10; cont < 10; cont++) System.out.println( “*************”); // O comando interno a este for será executado zero vezes Pacotes “package” é um recurso de Java que permite formar um grupo de classes relacionadas entre si de forma que estas classes possam oferecer facilidades uma as outras. Exemplo: // arquivo Circulo.java package geometria; public class Circulo { protected double raio; ............................ } // arquivo Ponto.java package geometria; public class Ponto { ............................ } Isaias Camilo Boratti // arquivo Reta.java package geometria; public class Reta { ............................ } Com a compilação de cada uma destas classes será criada uma pasta de nome geometria (no diretório em que se encontram os arquivos Circulo.java, Ponto.Java e Reta.java) e nesta pasta serão colocadas as classes já compiladas. Para que outra classe possa usar o pacote, é necessário que: - Seja criada (caso ainda não exista) uma pasta de nome classes em c:\j2dk1.4.0\jre\ - Seja colocado na pasta classes, a pasta geometria que contem as classes do pacote geometria. Para um mesmo pacote, tudo o que estiver declarado com o qualificador public ou protected (classe, método, atributo) ou não apresentar qualificador estará acessível dentro de qualquer classe do pacote. Dentro de um pacote pode-se ter outro pacote. Assim, o comando package poderia ser, por exemplo: package geometria.figurasregulares; Neste caso, ao compilar a classe que contem esta instrução será criada a pasta geometria e nesta pasta será criada a pasta figurasregulares. Para que uma classe possa utilizar outra classe de determinado pacote basta especificá-la no comando import. Exemplos: import geometria.*; import geometria.Circulo; import geometria.figurasregulares.*; Quando usado, o comando package deve ser o primeiro comando. Antes deles , apenas documentação. Isaias Camilo Boratti Encapsulamento Encapsular --> Ocultar informações Através encapsulamento, um entidade esconde informações as quais são necessárias apenas para o funcionamento da entidade, não interessando, e portanto não estando disponível ao usuário da entidade. Da mesma forma, em POO, quando modelamos determinada classe, é fundamental que esta modelagem faça com que as características de uma instância que só interessa a própria instância fiquem encapsuladas. Qualificador visibilidade private Classe protected Classe, demais classes do pacote public Classe, pacote, e qualquer classe importá-la sem qualificador Classe e demais classes do pacote public class Aluno { protected String nome; public float n1, n2; // CUIDADO! Atributo público public Aluno(String vNome, float vn1, float vn2) { nome = vNome; n1 = vn1; if (vn1 < 0 ) n1 = 0; if (vn1 > 10) n1 = 10; n2 = vn2; if (vn2 < 0) n2 = 0; if (vn2 > 10) n2 = 10; } public float informeNota1() { return n1; } public float informeNota2() { return n2; } Isaias Camilo Boratti public String informeNome() { return nome;} public float fornecaMedia() { return ( n1 + n2 ) /2; } } // usuário do objeto ( outro objeto ou classe) Aluno umAluno = new Aluno(“Maria”, 8.0, 4.5); umAluno.n1 = 12.0; // (possível dado que n1 é public) System.out.println( umAluno.informeNome()+ “media: ”+ umAluno.FornecaMedia()); public class Aluno { protected String nome; protected float n1,n2; public Aluno (String vNome, float vn1, float vn2) { nome = vNome; n1 = vn1; if (vn1 < 0 ) n1 = 0; if (vn1 > 10) n1 = 10; n2 = vn2; if (vn2 < 0) n2 = 0; if (vn2 > 10) n2 = 10; } public String informeNome() { return nome} public void recebaValorNome( String vNome) { nome = vNome; } // método de acesso ao atributo n1 public void recebaValorN1( float vN1) { n1 = vN1; if (vN1 < 0 ) n1 = 0; else if (vN1 > 10) n1 = 10; } public float informeN1() { return n1 ; } public void recebaValorN2( float vN2) { // colocar comandos } public float informeN2() { return n2; } public float fornecaMedia() { return (n1 + n2) / 2; } Isaias Camilo Boratti É fundamental que o objeto proteja seus dados, não permitindo que outro objeto os acesse diretamente, mas somente, se for o caso, através métodos de acesso. Métodos de acesso devem ser construídos (implementados) de forma a garantir um acesso seguro ao respectivo atributo - Integridade. ------------------------------------------------------------------------------------------- As declarações em um arquivo fonte Java devem apresentar a seguinte ordem: - package - import - definições de classe Se o arquivo contiver mais que uma classe, somente uma poderá ser pública Isaias Camilo Boratti Comando break Ao ser executado causa saída imediata de um while, for, do/while ou switch Exemplo: String s = “” ; int cont; for ( cont = 1; cont <=10; cont++) { if (cont==5) break; s = s + cont + “ “; } Comando break fora dos comandos while, for, switch, do/while causa erro de compilação Isaias Camilo Boratti Comando switch Exemplo: char conceito; int aprov = 0, reprov = 0; String mensagem; ................. Switch (conceito) { case ‘A’: mensagem = “Excelente”; aprov++; break; case ‘B’ : mensagem = “Bom”; aprov++; break; case ‘C’ : mensagem = “Regular”; aprov++; break; default : mensagem = “Insuficiente”; reprov++; } A expressão de um switch deve ser inteira (exceto long) ou tipo char opcional Isaias Camilo Boratti Comando continue O comando continue quando executado dentro de um comando de repetição (for, while, do/while) faz com que o fluxo de execução pule as instruções restantes do bloco e passe para nova iteração. ............................. int soma = 0, k=0, cont=0; while (i<n) { i++; idade = umaPessoa.informeIdade(); if ( idade < 18 ) { cont++; continue; } soma +=idade; } Comando continue fora de loop causa erro de compilação Alguns métodos da classe Math (java.lang) Nome tipo argumento tipo resultado Obs. PI - double Valor da constante ? E - double Valor da constante e abs(x) double/float/int/long mesmo do arg. |x| - módulo de x ceil(x) double (ou compat.) double arredonda x para o menor inteiro não menor que x cos(x) double (ou comp.) double cosseno(x). x em rd. sin(x) double (ou comp.) double seno(x). x em rd. tan(x) double (ou comp.) double tangente(x). x em rd. floor(x) “ “ arredonda x p/ >inteiro não maior que x exp(x) “ “ ex log(x) “ “ log. natural de x max(x,y) double/float/int/long mesmo do arg. maior entre x e y min(x,y) double/float/int/long mesmo do arg. menor entre x e y Isaias Camilo Boratti pow(x,y) double/double double xy sqrt(x) double (ou comp.) double raíz quadrada de x random() - double gera aleatório >=0.0 e <1.0 Isaias Camilo Boratti Para formatar um número na forma de um string: double x = 1000/3.0; DecimalFormat df = new DecimalFormat(“#.####”); String s = df.format(x); DecimalFormat --> java.text.DecimalFormat Isaias Camilo Boratti Sobrecarga de métodos public class MinhaClasse { public static double maximo(double x, double y) { if (x > y) return x; else return y; } public static double maximo(double x, double y, double z) { return MinhaClasse.maximo (x, MinhaClasse.maximo(y,z)); } public static int maximo ( int x, int y) { if ( x > y ) return x; else return y; } } Isaias Camilo Boratti Recursividade public static long fatorial ( int n) { if ( n <= 1) return 1; else return n*fatorial(n-1); } Exercícios propostos: 1) Escreva um método de classe recursivo que determine o termo de ordem n da série de fibonacci. 1 1 2 3 5 8 13 21 .... 2) Escreva um método de classe recursivo que determine Xn onde n é um inteiro. Isaias Camilo Boratti Como trabalhar com números grandes - Os tipos primitivos byte, int, float, etc. apresentam limitações quanto a magnitude do valor que o tipo suporta. Ex.: float --> -3.40292347E+38 a 3.40292347E+38 - Para trabalhar com números “grandes” java apresenta as classes BigInteger (inteiros grandes) e BigDecimal (números decimais grandes). Tais classes encontram-se no pacote java.math. - Assim, por exemplo, podemos definir: BigInteger valor = new BigInteger(“123456789012345678901234567”); BigInteger outrovalor = BigInteger.valueOf(10); // a classe não tem construtor que aceite um inteiro como parâmetro Isaias Camilo Boratti Exemplo: BigInteger a = new BigInteger("123"); // a=123 int i = 10; BigInteger b = BigInteger.valueOf(i); // b=10 BigInteger c = a.add(b); // c=a+b BigInteger d = c.multiply(b.add(BigInteger.valueOf(3))); // d=c*(b+3) BigInteger f = a.multiply(d).divide(BigInteger.valueOf(i)); // f=a*d/10 BigInteger g = new BigInteger("-1234"); // g=-1234 g = g.add(BigInteger.valueOf(34)); // g=g+34 System.out.println(g); g = a.mod(BigInteger.valueOf(10)); // g= a % 10 = 3 System.out.println(g); Isaias Camilo Boratti Classes “empacotadoras” Permitem converter / manipular um valor de um tipo primitivo para um objeto. Classes --> Integer, Long, Float, Double, Short, Boolean, Byte, Character Exemplos: uma int a = 10; Integer uma = new Integer(a); int aa = uma.intValue(); Integer umObjeto = Integer.valueOf("34"); String s = uma.toString(); aa s umObjeto 10 10 34 10 Isaias Camilo Boratti float c = 30.0f; Float umc = new Float(c); float cc= umc.floatValue(); Float umd = Float.valueOf("12.5"); float valor = Float.parseFloat(“12.3”); char car ='A'; Character umCar = new Character(car); char letra = umCar.charValue(); String str = umCar.toString(); Obs.: 1) Outros métodos da classe Character são apresentados no capítulo 5. 2) As classes “empacotadoras” são declaradas com o modificador final. 3) Não é possível alterar diretamente o valor primitivo representado por um objeto de uma classe empacotadora.
Compartilhar