Buscar

Cap. 03 Comandos de Controle de Fluxo

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.

Continue navegando