Você está na página 1de 39

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.

Isaias Camilo Boratti


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.
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! – x 6/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 )

Isaias Camilo Boratti


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
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.

Isaias Camilo Boratti


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 com
valor 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).
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

Isaias Camilo Boratti


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
{
............................
}
// 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.

Isaias Camilo Boratti


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.
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

Isaias Camilo Boratti


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; }
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());

Isaias Camilo Boratti


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; }
É 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; A expressão de um switch
String mensagem; deve ser inteira (exceto
................. long) ou tipo char
Switch (conceito)
{ case ‘A’: mensagem = “Excelente”;
aprov++;
break;
case ‘B’ : mensagem = “Bom”;
aprov++;
break;
case ‘C’ : mensagem = “Regular”;
opcional aprov++;
break;
default : mensagem = “Insuficiente”;
reprov++;
}
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; Comando continue fora
} de loop causa erro de
compilação
soma +=idade;
}
Isaias Camilo Boratti
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
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);
10
int aa = uma.intValue();
Integer umObjeto = Integer.valueOf("34");
String s = uma.toString(); aa

s umObjeto 10
10
34

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.
Isaias Camilo Boratti