for
encaixadosTal como encaixámos if
s dentro de if
s, também podemos encaixar, ou aninhar, ciclos for
. No pedaço de código seguinte, quantas vezes é escrita a palavra Blah no ecrã?
for (int i = 1 ; i <= 3 ; i++) {
for (int j = 1 ; j <= 2 ; j++) {
System.out.print("Blah");
}
}
Relembre o fluxograma do ciclo for
ao interpretar o código acima.
i
é inicializada a 1. Como 1 é menor ou igual a 3, o corpo do ciclo é executado, ou seja, o ciclo for
interno é iniciado.j
fica com o valor 1. Como 1 é menor ou igual a 2, a instrução System.out.print("Blah")
é executada. De seguida j
fica com o valor 2 e a mesma instrução é executada de novo. De seguida j
fica com o valor 3 e o ciclo interno termina.i
é incrementada para o valor 2 que, por ser menor ou igual a 3, provoca uma nova execução do corpo do ciclo, ou seja, o ciclo interno é de novo executado e assim sucessivamente até i
tomar o valor 4.O que constatamos aqui? Que o corpo do ciclo externo (formado por uma única instrução, que é o ciclo for
interno) é executado 3 vezes. Por sua vez, o corpo deste ciclo interno (a instrução System.out.print("Blah")
) é executado 2 vezes.
Então, a instrução System.out.print("Blah")
é executada 3 x 2 vezes, ou seja, a palavra "Blah" é escrita seis vezes.
Como provocar uma mudança de linha de cada vez que se escrevem dois Blah
s, ou seja, de cada vez que o ciclo interno termina?
Basta adicionar a instrução System.out.println()
logo após o ciclo interno. Desta forma o corpo do ciclo externo fica com duas instruções: o ciclo interno e a mudança de linha.
xxxxxxxxxx
for (int i = 1 ; i <= 3 ; i++) {
for (int j = 1 ; j <= 2 ; j++) {
System.out.print("Blah");
}
System.out.println();
}
Vamos supor que queremos imprimir uma tabela da multiplicação para as tabuadas dos naturais de limInf
a limSup
, com m
valores cada. Se limInf
for 1, limSup
for 9 e m
for 10 queremos o seguinte:
xxxxxxxxxx
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
Vamos dividir a tarefa da seguinte forma:
n
, com m
valores?n
num dado intervalo [ limInf
, limSup
]?O método seguinte resolve a sub-tarefa 1:
x/**
* Escrever os primeiros multiplos de um dado natural no standard output
* @param n - O numero
* @param m - o numero de valores a imprimir
* @requires m > 0 && n > 0
*/
static void imprimeMultiplos (int n, int m) {
for (int i = 1 ; i <= m ; i++) {
System.out.print(n * i + " ");
}
System.out.println();
}
A última instrução é para provocar a mudança de linha.
Para resolver a sub-tarefa 2, invocamos o método anterior para valores de n
no intervalo [ limInf
, limSup
]. O seguinte método realiza essa tarefa:
xxxxxxxxxx
/**
* Imprimir as tabuadas dos naturais de 1 até um dado valor, no standard output
* @param limInf - O primeiro natural
* @param limSup - O último natural
* @param m - O numero de valores que as tabuadas devem ter
* @requires limInf > 0 && limSup > 0 && m > 0
*/
static void imprimeTabuadas (int limInf, int limSup, int m) {
for (int linha = limInf ; linha <= limSup ; linha++) {
imprimeMultiplos(linha, m);
}
}
O seguinte programa escreve no ecrã as tabuadas dos naturais de 1 a 9, cada uma com 10 valores:
xxxxxxxxxx
public class TabelaDeTabuadas {
public static void main (String [] args) {
imprimeTabuadas(1, 9, 10);
}
}
Repare que, embora divididos por dois métodos, o que temos aqui é um ciclo encaixado noutro – para cada valor de linha
no ciclo do método imprimeTabuadas
, é executado o ciclo definido no método imprimeMultiplos
.
O seguinte programa é equivalente ao anterior:
xxxxxxxxxx
public class TabelaDeTabuadasV2 {
public static void main (String [] args) {
imprimeTabuadas(1, 9, 10);
}
static void imprimeTabuadas (int limInf, int limSup, int m) {
for (int linha = limInf ; linha <= limSup ; linha++) {
for (int i = 1 ; i <= m ; i++) {
System.out.print(linha * i + " ");
}
System.out.println();
}
}
}
Anterior: 6.2. A instrução for
Seguinte: 6.4. Ainda a abstração procedimental