Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Ciência da Computação com Java e Orientação a Objetos - Apostilas - Informática Part2, Notas de estudo de Informática

Apostilas de Informática sobre o estudo da Ciência da Computação com Java e Orientação a Objetos, História da Computação, Conversor de Temperaturas, Métodos com Vários Parâmetros.

Tipologia: Notas de estudo

2013

Compartilhado em 26/06/2013

Ipanema27
Ipanema27 🇧🇷

4.5

(170)

1 / 65

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
50 CAPÍTULO 8. LAÇOS E REPETIÇÕES
Números inteiros grandes: Um problema que surge quando queremos testar se um
número muito grande é primo é que variáveis do tipo int em Java utilizam 4 bytes (32 bits)
e, portanto, estão limitadas a conter valores entre -2.147.483.648 e 2.147.483.647. Esta
limitação pode ser resolvida utilizando-se variáveis do tipo long que podem armazenar
números bem maiores pois usam 8 bytes (64 bits). Um long pode guardar valores entre
-9.223.372.036.854.775.808 e 9.223.372.036.854.775.807; razoável, não?
Na janela de interações do DrJava é necessário digitar um Lmaiúsculo após um nú-
mero para indicar que ele é do tipo long. Assim, você pode tentar modificar a classe
GeradorDePrimos para utilizar números do tipo long e, então, digitar na janela de inte-
rações algo como gerador.verificaPrimalidade (76575411177311L).
Exercícios
1. Crie uma classe Fatorial com um método calculaFatorial(int x) que calcula o fatorial de xse
este for um número inteiro positivo e devolve -1 se xfor negativo.
Adicione o método testaCalculaFatorial() que testa o método calculaFatorial(int x) para
diferentes valores de x.
2. Crie uma classe Média contendo um método calculaMédia(int n) que devolve a média dos valores 1,
2, 3, ..., n, onde né o valor absoluto de um número fornecido ao método.
Adicione o método testaCalculaMédia() que testa o método calculaMédia(int n) para diferentes
valores de n.
3. Adicione as seguintes funcionalidades à classe Conversor5 vista neste capítulo:
(a) Crie o método imprimeTabelaCelsiusParaFahrenheit, que converte no sentido oposto do mé-
todo imprimeTabelaFahrenheitParaCelsius.
(b) Adicione um parâmetro aos métodos acima que permita a impressão de uma tabela com passos
diferentes de 10.0. Ou seja, o passo entre a temperatura atual e a próxima será dado por esse novo
parâmetro.
4. Escreva uma classe Fibonacci, com um método imprimeNúmerosDeFibonacci (int quantidade),
que imprime os primeiros quantidade números da seqüência de Fibonacci. A seqüência de Fibonacci é
definida da seguinte forma.
F1=1;
F2=1;
Fn=Fn1+Fn2, para todo inteiro positivo n>2.
O método deve então imprimir F1,F2,F3,...,Fquantidade .
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31
pf32
pf33
pf34
pf35
pf36
pf37
pf38
pf39
pf3a
pf3b
pf3c
pf3d
pf3e
pf3f
pf40
pf41

Pré-visualização parcial do texto

Baixe Ciência da Computação com Java e Orientação a Objetos - Apostilas - Informática Part2 e outras Notas de estudo em PDF para Informática, somente na Docsity!

50 CAPÍTULO 8. LAÇOS E REPETIÇÕES

Números inteiros grandes: Um problema que surge quando queremos testar se um

número muito grande é primo é que variáveis do tipo int em Java utilizam 4 bytes (32 bits)

e, portanto, estão limitadas a conter valores entre -2.147.483.648 e 2.147.483.647. Esta

limitação pode ser resolvida utilizando-se variáveis do tipo long que podem armazenar

números bem maiores pois usam 8 bytes (64 bits). Um long pode guardar valores entre

-9.223.372.036.854.775.808 e 9.223.372.036.854.775.807; razoável, não?

Na janela de interações do DrJava é necessário digitar um L maiúsculo após um nú-

mero para indicar que ele é do tipo long. Assim, você pode tentar modificar a classe

GeradorDePrimos para utilizar números do tipo long e, então, digitar na janela de inte-

rações algo como gerador.verificaPrimalidade (76575411177311L).

Exercícios

1. Crie uma classe Fatorial com um método calculaFatorial(int x) que calcula o fatorial de x se

este for um número inteiro positivo e devolve -1 se x for negativo.

Adicione o método testaCalculaFatorial() que testa o método calculaFatorial(int x) para

diferentes valores de x.

2. Crie uma classe Média contendo um método calculaMédia(int n) que devolve a média dos valores 1,

2, 3, ..., n, onde n é o valor absoluto de um número fornecido ao método.

Adicione o método testaCalculaMédia() que testa o método calculaMédia(int n) para diferentes

valores de n.

3. Adicione as seguintes funcionalidades à classe Conversor5 vista neste capítulo:

(a) Crie o método imprimeTabelaCelsiusParaFahrenheit, que converte no sentido oposto do mé-

todo imprimeTabelaFahrenheitParaCelsius.

(b) Adicione um parâmetro aos métodos acima que permita a impressão de uma tabela com passos

diferentes de 10.0. Ou seja, o passo entre a temperatura atual e a próxima será dado por esse novo

parâmetro.

4. Escreva uma classe Fibonacci, com um método imprimeNúmerosDeFibonacci (int quantidade),

que imprime os primeiros quantidade números da seqüência de Fibonacci. A seqüência de Fibonacci é

definida da seguinte forma.

  • F 1 = 1;
  • F 2 = 1;
  • Fn = Fn− 1 + Fn− 2 , para todo inteiro positivo n > 2.

O método deve então imprimir F 1 , F 2 , F 3 ,... , Fquantidade.

8.3. NÚMEROS PRIMOS 51

5. Abaixo, apresentamos uma pequena variação do método verificaPrimalidade. Ela não funciona cor-

retamente em alguns casos. Você deve procurar um exemplo no qual esta versão não funciona e explicar

o defeito usando suas próprias palavras. Note que a falha é sutil, o que serve como alerta: programar é

uma tarefa difícil, na qual pequenos erros podem gerar resultados desastrosos. Toda atenção é pouca!

∗ I mp ri me na t e l a s e um número i n t e i r o p o s i t i v o é primo ou não. ∗ / v o i d v e r i f i c a P r i m a l i d a d e ( i n t x ) { / / Todos o s números i n t e i r o s p o s i t i v o s s ã o d i v i s í v e i s p o r 1. i n t n ú m e r o D e D i v i s o r e s = 1 ; / / O p r i m e i r o c a n d i d a t o a d i v i s o r não t r i v i a l é o 2. i n t c a n d i d a t o A D i v i s o r = 2 ;

/ / T e s t a a d i v i s ã o p o r t o d o s o s números menores ou i g u a i s a x. w h i l e ( c a n d i d a t o A D i v i s o r <= x ) { c a n d i d a t o A D i v i s o r = c a n d i d a t o A D i v i s o r + 1 ; i f ( x % c a n d i d a t o A D i v i s o r == 0 ) n ú m e r o D e D i v i s o r e s = n ú m e r o D e D i v i s o r e s + 1 ; }

/ / Im pr im e a r e s p o s t a. i f ( n ú m e r o D e D i v i s o r e s == 2 ) System. o u t. p r i n t l n ( x + " é primo. " ) ; e l s e System. o u t. p r i n t l n ( x + " não é primo. " ) ; }

6. O laço no nosso verificaPrimalidade é executado mais vezes do que o necessário. Na verdade po-

deríamos parar assim que candidatoADivisor chegar a x/2 ou mesmo ao chegar à raiz quadrada de x.

Pense como mudar o programa levando em consideração estes novos limitantes.

7. Escreva uma classe Euclides, com um método mdc que recebe dois números inteiros a1 e a2, estritamente

positivos, com a1 >= a2, e devolve o máximo divisor comum entre eles, utilizando o algoritmo de

Euclides.

Breve descrição do algoritmo de Euclides (para maiores detalhes, consulte seu professor de Álgebra):

  • Dados a1 e a2, com a1 >= a2, quero o m.d.c.(a1, a2).
  • Calcule a3 = a1 % a2.
  • Se a3 = 0, fim. A solução é a2.
  • Calcule a4 = a2 % a3.
  • Se a4 = 0, fim. A solução é a3.
  • Calcule a5 = a3 % a4.
  • ...

Capítulo 9

Expressões e Variáveis Lógicas

Quais novidades veremos neste capítulo?

  • Condições como expressões lógicas;
  • Variáveis booleanas;
  • Condições compostas e operadores lógicos: &&, || e !;
  • Precedência de operadores.

9.1 Condições como expressões

Já vimos que em Java e outras linguagens de programação, as condições exercem um papel fundamental.

São elas que permitem que diferentes ações sejam tomadas de acordo com o contexto. Isso é feito através dos

comandos if e while.

Mas, o que são condições realmente? Vimos apenas que elas consistem geralmente em comparações, u-

sando os operadores ==, >=, <=, >, < e !=, entre variáveis e/ou constantes. Uma característica interessante

em linguagens de programação é que as condições são na verdades expressões que resultam em verdadeiro ou

falso. Vamos ver isso no DrJava:

Welcome to DrJava.

false

true

> int a = 2

> a == 2

true

> a >= 2

true

54 CAPÍTULO 9. EXPRESSÕES E VARIÁVEIS LÓGICAS

> a < a + 1

true

Vejam que cada vez que digitamos uma condição o DrJava responde true (para verdadeiro) ou false (para

falso).

Para entender bem o que ocorre, é melhor imaginar que em Java as condições são expressões que resultam

em um dos dois valores lógicos: “verdadeiro” ou “falso”. Neste sentido, Java também permite o uso de variáveis

para guardar os resultados destas contas, como vemos abaixo.

> boolean comp1 = 2 > 3

> comp

false

> int a = 3

> boolean comp2 = a < a + 1

> comp

true

Com isso, acabamos de introduzir mais um tipo de variável, somando-se aos tipos int e double já conhe-

cidos: o tipo boolean, que é usado em variáveis que visam conter apenas os valores booleanos (verdadeiro ou

falso). O nome é uma homenagem ao matemático inglês George Boole (1815-1864). Em português este tipo

de variável é chamada de variável booleana

Agora que começamos a ver as comparações como expressões que calculam valores booleanos, torna-

se mais natural a introdução dos operadores lógicos. Nós todos já estamos bem acostumados a condições

compostas. Algo como “eu só vou à praia se tiver sol e as ondas estiverem boas”. Nesta sentença a conjunção

e une as duas condições em uma nova condição composta que é verdadeira somente se as duas condições que

a formam forem verdadeiras.

Em Java o “e” lógico é representado pelo estranho símbolo &&. Ou seja, uma condição do tipo 1 <= a <=

10 seria escrita em Java como a >= 1 && a <= 10. Da mesma forma temos um símbolo para o ou lógico. Ele

é o símbolo ||. Isso mesmo, duas barras verticais. Por fim, o símbolo! antes de uma expressão lógica nega o

seu valor. Por exemplo, a condição "a não é igual a 0"poderia ser escrita em Java como !(a == 0)^1.

Tabelas da verdade contém todos os resultados que podem ser obtidos ao se aplicar uma ope-

ração lógica sobre variáveis booleanas. Abaixo apresentamos as tabelas da verdade para os

operadores &&, || e !.

&& (e) true false

true true false

false false false

|| (ou) true false

true true true

false true false

! (não) true false

false true

(^1) Daí vem a explicação para o fato do sinal de diferente conter o ponto de exclamação.

56 CAPÍTULO 9. EXPRESSÕES E VARIÁVEIS LÓGICAS

i n t n ú m e r o D e D i v i s o r e s = 1 ; / / O p r i m e i r o c a n d i d a t o a d i v i s o r não t r i v i a l é o 2. i n t c a n d i d a t o A D i v i s o r = 2 ;

/ / T e s t a a d i v i s ã o p o r t o d o s o s números menores ou i g u a i s a x. w h i l e ( c a n d i d a t o A D i v i s o r <= x ) { i f ( x % c a n d i d a t o A D i v i s o r == 0 ) n ú m e r o D e D i v i s o r e s = n ú m e r o D e D i v i s o r e s + 1 ; c a n d i d a t o A D i v i s o r = c a n d i d a t o A D i v i s o r + 1 ; }

i f ( n ú m e r o D e D i v i s o r e s == 2 ) r e t u r n t r u e ; e l s e r e t u r n f a l s e ; }

Note que, desta forma, podemos escrever algo do tipo:

i f (! éP ri mo ( x ) ) / / f a ç a alguma c o i s a

A construção acima deixa muito claro o significado da expressão, pois a lemos como “se não é primo x”, o

que é bem próximo do que seria uma frase falada em português: “se x não é primo”. Quanto mais próximo for

o seu código da linguagem falada, mais fácil será para outras pessoas o compreenderem; e a clareza do código

é um dos principais objetivos do bom programador.

9.2 Precedência de operadores

Como acabamos de apresentar vários operadores novos, devemos estabelecer a precedência entre eles.

Lembre-se que já conhecemos as regras de precedência dos operadores aritméticos há muito tempo. Já a

precedência dos operadores lógicos é coisa nova. A tabela abaixo apresenta os operadores já vistos, listados da

precedência mais alta (aquilo que deve ser executado antes) à mais baixa:

operadores unários -!

operadores multiplicativos * / %

operadores aditivos + -

operadores de comparação == != > < >= <=

“e” lógico &&

“ou” lógico ||

atribuição =

Entre operadores com mesma precedência, as operações são computadas da esquerda para a direita.

Note, porém, que, nos exemplos acima, abusamos dos parênteses mesmo quando, de acordo com a tabela de

precedência, eles são desnecessários. Sempre é bom usar parênteses no caso de expressões lógicas (ou mistas),

pois a maioria das pessoas não consegue decorar a tabela acima. Assim, mesmo que você tenha uma ótima

memória, o seu código torna-se mais legível para a maioria dos mortais.

9.3. EXEMPLOS 57

9.3 Exemplos

Primeiro, vamos retomar o método verificaLados da classe TianguloRetângulo3 vista no Capítulo 6.

Nele, testamos se não há lado de comprimento nulo. Entretanto, parece mais natural e correto forçar todos os

lados a terem comprimento estritamente positivo:

i f ( ( a > 0 ) && ( b > 0 ) && ( c > 0 ) ) { / / A q u i vão o s comandos p a r a v e r i f i c a r a c o n d i ç ã o p i t a g ó r i c a. }

Podemos também usar condições compostas para escrever uma versão mais rápida do método

éPrimo do capítulo anterior.

∗ V e r i f i c a s e um número i n t e i r o p o s i t i v o é primo ou não. ∗ / b o o l e a n é Prim o ( i n t x ) { i f ( x < 2 ) r e t u r n f a l s e ;

/ / Todos o s números i n t e i r o s p o s i t i v o s s ã o d i v i s í v e i s p o r 1. i n t n ú m e r o D e D i v i s o r e s = 1 ; / / O p r i m e i r o c a n d i d a t o a d i v i s o r não t r i v i a l é o 2. i n t c a n d i d a t o A D i v i s o r = 2 ;

/ / T e s t a a d i v i s ã o p o r t o d o s o s números menores ou i g u a i s a x / 2 ou / / a t é e n c o n t r a r o p r i m e i r o d i v i s o r. w h i l e ( ( c a n d i d a t o A D i v i s o r <= x / 2 ) && ( n ú m e r o D e D i v i s o r e s == 1 ) ) { i f ( x % c a n d i d a t o A D i v i s o r == 0 ) n ú m e r o D e D i v i s o r e s = n ú m e r o D e D i v i s o r e s + 1 ; c a n d i d a t o A D i v i s o r = c a n d i d a t o A D i v i s o r + 1 ; }

i f ( n ú m e r o D e D i v i s o r e s == 1 ) r e t u r n t r u e ; e l s e r e t u r n f a l s e ; }

Melhor ainda podemos finalmente escrever a classe GeradorDePrimos de forma completa. O método mais

interessante é o próximoPrimo que devolve o primeiro número primo maior do que o último gerado. Este

exemplo já é bem sofisticado, vocês terão que estudá-lo com calma. Uma sugestão: tentem entender o que o

programa faz, um método por vez. O único método mais complicado é o éPrimo, mas este nós já vimos.

c l a s s G e r a d o r D e P r i m o s { / / L i m i t e i n f e r i o r p a r a b u s c a de um novo primo. i n t c a n d i d a t o A P r i m o = 1 ;

/ ∗ ∗

9.3. EXEMPLOS 59

método, seu valor seria zerado.

Não deixem de brincar um pouco com objetos da classe GeradorDePrimos para entender melhor como

ela funciona! Agora um desafio para vocês: usando o método próximoPrimo, escrevam um novo método

void imprimePrimos (int quantidade) que imprime uma dada quantidade de números primos a partir do

candidatoAPrimo. Experimentem executar o método no DrJava passando 50 como parâmetro.

Exercícios

1. Escreva uma classe TrianguloRetângulo com um método denominado defineLados(double x1,

double x2, double x3) que recebe três valores e verifica se eles correspondem aos lados de um tri-

ângulo retângulo. Em caso afirmativo, o método devolve true, caso contrário ele devolve false. Note

que o programa deve verificar quais dos três valores corresponde à hipotenusa. Construa duas versões do

método, uma contendo três ifs e outra contendo apenas um if! Em seguida, crie um novo método que

verifica se ambos os métodos retornam o mesmo resultado para diferentes combinações de x1, x2 e x3.

2. Escreva uma classe Brincadeiras que possua 3 atributos inteiros. Escreva um método para carregar

valores nestes atributos e, em seguida, escreva os seguintes métodos:

(a) troca2Primeiros() que troca os valores dos dois primeiros atributos. Por exemplo, se antes da

chamada do método o valor dos atributos é <1, 2, 3>, depois da chamada, eles deverão valer <2, 1,

(b) imprime() que imprime o valor dos 3 atributos.

(c) imprimeEmOrdemCrescente() que imprime o valor dos 3 atributos em ordem crescente.

3. A linguagem Java oferece operadores que, se usados corretamente, ajudam na apresentação e digitação

do código, tornando-o mais enxuto. Veremos neste exercício dois deles: os operadores de incremento e

de decremento. Verifique o funcionamento desses operadores usando os métodos da classe abaixo.

c l a s s E x p e r i ê n c i a { v o i d v e r I n c r e m e n t o ( i n t n ) { i n t x = n ; System. o u t. p r i n t l n ( " Número i n i c i a l x −> " + x ) ; System. o u t. p r i n t l n ( " x++ −> " + x + + ) ; System. o u t. p r i n t l n ( " Novo v a l o r de x −> " + x ) ;

x = n ; System. o u t. p r i n t l n ( " Número i n i c i a l x −> " + x ) ; System. o u t. p r i n t l n ( " ++x −> " + ++x ) ; System. o u t. p r i n t l n ( " Novo v a l o r de x −> " + x ) ; } v o i d v e r D e c r e m e n t o ( i n t n ) { i n t x = n ; System. o u t. p r i n t l n ( " Número i n i c i a l x −> " + x ) ; System. o u t. p r i n t l n ( " x−− −> " + x −−); System. o u t. p r i n t l n ( " Novo v a l o r de x −> " + x ) ;

60 CAPÍTULO 9. EXPRESSÕES E VARIÁVEIS LÓGICAS

x = n ; System. o u t. p r i n t l n ( " Número i n i c i a l x −> " + x ) ; System. o u t. p r i n t l n ( "−−x −> " + −−x ) ; System. o u t. p r i n t l n ( " Novo v a l o r de x −> " + x ) ; } }

Entenda bem o código e observe os resultados. Em seguida, tire suas conclusões e compare-as com as

conclusões de seus colegas.

Além dos operadores de incremento e decremento, também existem os seguintes operadores resumidos:

+=, -=, *= e /=. Eles são úteis quando queremos efetuar uma operação em uma variável e guardar o

resultado na mesma. Isto é, a = a * 2; é completamente equivalente a a *= 2;.

62 CAPÍTULO 9. EXPRESSÕES E VARIÁVEIS LÓGICAS

Capítulo 10

Mergulhando no while

Quais novidades veremos neste capítulo?

  • Reforço em while;
  • O comando do...while.

10.1 Um pouco mais sobre primos

Vamos iniciar este capítulo com dois exercícios. Primeiro, que tal modificarmos o método de geração de

primos para que ele use o fato de que os únicos candidatos a primos maiores do que 2 são ímpares? Uma

complicação interessante é que o candidatoAPrimo para o próximo primo pode ser modificado pelo usuário a

qualquer momento chamando carregaCandidatoAPrimo. Isso deve ser contemplado na solução. Aqui vai a

resposta:

∗ A cada chamada , c a l c u l a um novo primo s e g u i n d o ordem c r e s c e n t e. ∗ / i n t p r ó x i m o P r i m o ( ) { / / Move o l i m i t e i n f e r i o r na d i r e ç ã o do p r ó x i m o primo. / / Temos que c o n s i d e r a r que o l i m i t e i n f e r i o r pode s e r p a r / / p o r q u e e l e pode s e r m o d i f i c a d o a q u a l q u e r momento com uma / / chamada a c a r r e g a C a n d i d a t o A P r i m o. i f ( c a n d i d a t o A P r i m o == 1 ) c a n d i d a t o A P r i m o = 2 ; e l s e i f ( c a n d i d a t o A P r i m o % 2 == 0 ) c a n d i d a t o A P r i m o = c a n d i d a t o A P r i m o + 1 ; e l s e c a n d i d a t o A P r i m o = c a n d i d a t o A P r i m o + 2 ;

/ / E n c o n t r a o p r ó x i m o p r i m o w h i l e (! éP ri mo ( c a n d i d a t o A P r i m o ) ) c a n d i d a t o A P r i m o = c a n d i d a t o A P r i m o + 2 ;

10.2. UMA BIBLIOTECA DE FUNÇÕES MATEMÁTICAS. 65

> m.fatoraInteiro(167890)

Obs: Note que na solução usamos uma rotina de impressão nova: System.out.print. Ela é muito parecida

com System.out.println com a diferença de que não muda a linha ao terminar de imprimir.

10.2 Uma biblioteca de funções matemáticas.

Terminamos com um exercício clássico. Vamos mostrar como construir uma pequena biblioteca de funções

matemáticas avançadas. Com será que o computador consegue calcular senos, cossenos, logaritmos? O segredo

para implementar essas funções em Java é um bom conhecimento de cálculo e laços.

Usando cálculo, sabemos que essas funções matemáticas “complicadas” possuem expansões de Taylor.

Estas expansões transformam uma função numa série de polinômios^1 , que podem ser facilmente calculados

usando laços. Vejamos a expansão de algumas dessas funções:

  • sen(x) = (^) 1!x − x

3

3! +^

x^5

5! −^...^ +^

(− 1 )kx(^2 k+^1 )

( 2 k+ 1 )! +^...

  • cos(x) = 1 − x

2

2! +^

x^4

4! −^

x^6

6! +^...^ +^

(− 1 )kx(^2 k)

( 2 k)! +^...

  • ln( 1 + x) = x − x

2

2 +^

x^3

3 −^

x^4

4 +^...^ +^

(− 1 )(k−^1 )xk

k +^...

Isso funciona bem sempre que |x| < 1.

O segredo para usar essas fórmulas no computador é continuar somando até que o módulo do próximo

termo seja muito pequeno e por isso possa ser desprezado.

Antes de apresentarmos aqui a solução que consideramos ideal, faça com cuidado e atenção os exercícios

1 (implementação das funções double pot(double x, int y) e double fat(double x)) e 2 (implemen-

tação da função double sen(double x) usando as funções do exercício 1.

Agora, após termos feito os exercícios 1 e 2, iremos criar uma nova classe, que chamaremos Matemática,

com métodos para calcular funções como as apresentadas acima. Abaixo vemos a classe com uma função que

calcula sen(x) implementada. Compare esta forma de implementar com as formas usadas no exercício. Qual é

mais rápida? Qual é mais fácil de entender?

c l a s s M a t e m á t i c a { do ub le e r r o = 1. 0 e −8; / / d e f i n e o e r r o a c e i t á v e l no c á l c u l o

do ub le s e n ( do ub le x ) { i n t k = 1 ; do ub le t e r m o = x ; do ub le s e n o = t e r m o ; w h i l e ( t e r m o ∗ t e r m o > e r r o ∗ e r r o )

(^1) Mais informações sobre séries de Taylor podem ser encontradas em livros de Cálculo.

66 CAPÍTULO 10. MERGULHANDO NO WHILE

/ / É m u i t o m a i s f á c i l c o n s t r u i r o p r ó x i m o t e r m o usando o a n t e r i o r. k = k + 2 ; t e r m o = −t e r m o ∗ x ∗ x / ( k − 1 ) / k ; s e n o = s e n o + t e r m o ; } r e t u r n s e n o ; } }

Um exemplo de uso:

Welcome to DrJava.

> m = new Matemática();

> m.sen(0.3)

> m.sen(0.5)

> m.sen(3.141596/2.0)

10.3 do...while

Para complementar os laços possíveis em Java, vejamos uma pequena variação do while. Nele a condição

é testada sempre antes de execução do corpo de comandos que compõe o laço. Já o laço do...while tem a

condição testada apenas no final. Conseqüentemente, no caso do do...while, existe a garantia que o conteúdo

no interior do laço será executado pelo menos uma vez, enquanto no while este pode nunca ser executado. Na

prática, a existência destes dois tipos de laços é uma mera conveniência sintática, já que um pode ser facilmente

substituído pelo outro.

Vejamos um exemplo de utilização do do...while:

i n t f a t o r i a l ( i n t x ) { i n t r e s u l t a d o = 1 ; do { r e s u l t a d o = r e s u l t a d o ∗ x ; x = x − 1 ; } w h i l e ( x > 1 ) r e t u r n r e s u l t a d o ; }

68 CAPÍTULO 10. MERGULHANDO NO WHILE

Capítulo 11

Caracteres e Cadeias de Caracteres

Quais novidades veremos neste capítulo?

  • Introdução do tipo char;
  • Uma classe da biblioteca padrão: String.

11.1 Um tipo para representar caracteres

Até o momento já vimos diferentes tipos de variáveis, como os inteiros (int) e os reais (double). Além

disto, também vimos as variáveis booleanas, que podem ter apenas dois valores, verdadeiro ou falso (boolean).

Parece intuitivo que as linguagens de programação também ofereçam variáveis para a manipulação de caracte-

res. No caso de Java temos o tipo char. Vejamos um exemplo de uso:

c l a s s C a r a c t e r e 1 { v o i d v e r i f i c a R e s p o s t a ( char ch ) { i f ( ( ch == ’ s ’ ) | | ( ch == ’ S ’ ) ) System. o u t. p r i n t l n ( "A r e s p o s t a f o i sim " ) ; e l s e i f ( ( ch == ’ n ’ ) | | ( ch == ’N ’ ) ) System. o u t. p r i n t l n ( "A r e s p o s t a f o i não " ) ; e l s e System. o u t. p r i n t l n ( " R e s p o s t a i n v á l i d a " ) ; } }

No exemplo acima podemos ver que para se representar um caractere usamos aspas simples (’). Também

podemos ver que os caracteres minúsculos são diferentes do mesmo caractere maiúsculo.

Um outro exemplo um pouco mais elaborado pode ser visto abaixo:

c l a s s C a r a c t e r e s {