Como vimos em alguns dos exemplos anteriores, um laço pode ser aninhado dentro de outro. Os laços aninhados são usados para resolver uma grande variedade de pro- blemas de programação e são parte essencial do ato de programar. Portanto, antes de encerrarmos o tópico das instruções de laço Java, examinemos mais um exemplo de laço aninhado. O programa a seguir usa um laço for aninhado para encontrar todos os fatores (exceto 1 e o próprio número) dos números de 2 a 100. Observe que o laço externo produz os números cujos fatores serão obtidos. O laço interno determina os fatores dos números.
/*
Usa laços aninhados para encontrar os fatores dos números de 2 a 100.
*/
class FindFac {
public static void main(String[] args) {
for(int i=2; i <= 100; i++) {
System.out.print("Factors of " + i + ": "); for(int j = 2; j < i; j++) if((i%j) == 0) System.out.print(j + " "); System.out.println(); } } }
Aqui está uma parte da saída produzida pelo programa:
Factors of 2: Factors of 3: Factors of 4: 2
Choose one (q to quit): 6
The break:
break; or break label;
Help on: 1. if 2. switch 3. for 4. while 5. do-while 6. break 7. continue
Factors of 5: Factors of 6: 2 3 Factors of 7: Factors of 8: 2 4 Factors of 9: 3 Factors of 10: 2 5 Factors of 11: Factors of 12: 2 3 4 6 Factors of 13: Factors of 14: 2 7 Factors of 15: 3 5 Factors of 16: 2 4 8 Factors of 17: Factors of 18: 2 3 6 9 Factors of 19: Factors of 20: 2 4 5 10
No programa, o laço externo executa i de 2 a 100. O laço interno testa sucessivamente todos os números de 2 a i, exibindo aqueles cuja divisão por i é exata. Observe o uso do operador % para determinar quando um valor gera uma divisão exata por outro. Se o resultado for zero, o divisor é um fator. Um desafio adicional: o programa anterior pode ser mais eficiente. Consegue ver como? (Dica: o número de iterações do laço interno pode ser reduzido.)
EXERCÍCIOS
1. Escreva um programa que leia caracteres do teclado até um ponto ser recebido. Faça-o contar o número de espaços. Relate o total no fim do programa.
2. Mostre a forma geral da escada if-else-if. 3. Dado o código if(x < 10) if(y > 100) { if(!done) x = z; else y = z; }
else System.out.println("error"); // que if?
a que if o último else está associado?
4. Mostre a instrução for de um laço que conte de 1.000 a 0 em intervalos de -2. 5. O fragmento a seguir é válido?
for(int i = 0; i < num; i++) sum += i;
6. Explique o que break faz. Certifique-se de explicar suas duas formas. 7. No fragmento a seguir, após a instrução break ser executada, o que é exibido?
for(i = 0; i < 10; i++) { while(running) { if(x<y) break; // ... } System.out.println("after while"); } System.out.println("After for");
8. O que o fragmento abaixo exibe?
for(int i = 0; i<10; i++) { System.out.print(i + " ");
if((i%2) = = 0) continue;
System.out.println(); }
9. Nem sempre a expressão de iteração de um laço for tem de alterar a variável de controle de laço adicionando ou subtraindo um valor fixo. Em vez disso, a va- riável de controle pode mudar de qualquer maneira arbitrária. Usando esse con- ceito, escreva um programa que use um laço for para gerar e exibir a progressão 1, 2, 4, 8, 16, 32 e assim por diante.
10. As letras minúsculas ASCII ficam separadas das maiúsculas por um intervalo
igual a 32. Logo, para converter uma letra minúscula em maiúscula, temos de subtrair 32 dela. Use essa informação para escrever um programa que leia ca- racteres do teclado. Faça-o converter todas as letras minúsculas em maiúsculas e todas as letras maiúsculas em minúsculas, exibindo o resultado. Não faça alterações em outros caracteres. O programa será encerrado quando o usuário pressionar o ponto. No fim, ele deve exibir quantas alterações ocorreram na cai- xa das letras.
11. O que é um laço infinito?
12. No uso de break com um rótulo, este deve estar em uma instrução ou bloco que
contenha break?
13. Qual é a diferença entre os três valores literais a seguir: 5, ‘5’, “5”?
14. Suponha que c seja uma variável de tipo char. Como você verificaria se o valor
de c é o caractere de aspas simples?
15. A classe ContDemo deste capítulo mostra uma maneira de usarmos um laço
for para exibir os números pares de 0 a 100. Crie programas que exibam essa mesma saída, mas como descrito a seguir:
A. Usando um laço for que incremente a variável de controle em duas unida- des a cada iteração.
C. Usando um laço for cuja variável de controle retroceda de 100 a 0. D. Usando um laço for infinito sem expressão condicional e saindo do laço
com uma instrução break. E. Usando um laço while.
F. Usando um laço do-while.
16. Crie um programa que use um laço para exibir as potências de 3, de 30 até e in-
cluindo39.
17. Crie um programa que use um laço para exibir uma lista de 100 números com-
posta por 1s e –1s alternados, começando com 1.
18. A classe FindFac discutida neste capítulo exibe os fatores de todos os números
de 1 a 100. Modifique essa classe para que, em vez de parar em 100, ela conti- nue até encontrar um número com exatamente nove fatores.
19. Crie um programa que leia caracteres do teclado até ler um caractere de alimen-
tação de linha ‘\n’. Em seguida, faça-o exibir o número de vogais, de consoan- tes, de dígitos e de outros caracteres. Inclua o caractere final de alimentação de linha na contagem dos outros caracteres.
20. O programa StarPattern abaixo exibe o padrão de asteriscos que aparece logo
após. Modifique o programa para que exiba os outros padrões usando laços ani- nhados.
class StarPattern {
public static void main(String[] args) {
for(int i = 1; i <= 5; i++) { for(int j = 1; j <= i; j++) System.out.print('*'); System.out.println(); } } } * ** *** **** ***** A. ***** **** *** ** * B. * ** *** **** *****
C. **********
********
******
****
**
21. Como mencionado no texto, um identificador Java é composto por um ou mais
caracteres. O primeiro caractere deve ser uma letra maiúscula ou minúscula do alfabeto, um sublinhado (_) ou um cifrão ($). Cada caractere restante deve ser uma letra maiúscula ou minúscula do alfabeto, um dígito de 0 a 9, um subli- nhado ou um cifrão. Crie um programa Java que leia uma linha de caracteres e exiba se ela é um identificador Java válido.
22. Infelizmente, os valores Unicode dos caracteres ‘0’-‘9’ não correspondem aos
seus valores inteiros. Isto é, os valores Unicode de ‘0’-‘9’ são 48-57 e não 0-9. Mas podemos converter facilmente esses caracteres em seus valores inteiros subtraindo 48. Especificamente, se c for uma variável de tipo char contendo um dígito de ‘0’-‘9’, então podemos criar uma variável x de tipo int com os valores inteiros correspondentes como descrito a seguir:
int x = c – 48;
Use essa técnica de conversão em um programa que leia três dígitos, converta- -os em um inteiro com os três dígitos, dobre o valor do inteiro e então exiba o resultado. Por exemplo, se a entrada for ‘3’, ‘4’ e ‘5’, a saída será 690.
23. Se você dividir 1 por 2, obterá 0,5. Se dividir novamente por 2, obterá 0,25.
Crie um programa que calcule e exiba quantas vezes temos que dividir 1 por 2 para obter um valor menor do que um décimo de milésimo (0,0001).
PRINCIPAIS HABILIDADES E CONCEITOS
䊏 Saber os fundamentos da classe
䊏 Entender como os objetos são criados
䊏 Entender como as variáveis de referência são atribuídas
䊏 Criar um método
䊏 Usar a palavra-chave return
䊏 Retornar um valor de um método
䊏 Adicionar parâmetros a um método
䊏 Utilizar construtores
䊏 Criar construtores parametrizados
䊏 Entender new
䊏 Entender a coleta de lixo e os finalizadores
䊏 Usar a palavra-chave this
Antes de ir adiante em seu estudo de Java, você precisa conhecer a classe. A classe é a essência de Java. Ela é a estrutura lógica sobre a qual a linguagem Java é construída, porque define a natureza de um objeto. Como tal, forma a base da programação orien- tada a objetos em Java. Dentro de uma classe, são definidos dados e o código que age sobre eles. O código fica contido em métodos. Como classes, objetos e métodos são fundamentais para Java, eles serão introduzidos neste capítulo. Ter um entendimen- to básico desses recursos permitirá que você escreva programas mais sofisticados e compreenda melhor certos elementos-chave de Java descritos no próximo capítulo.