Ajude nosso projeto a se manter online.

Laços aninhados em C++ - Laço dentro de laço

Agora que já treinamos bastante o conceito de laços e loopings, aprendendo a fazer, vamos aprender outro conceito importante, o de laços aninhados, ou laços dentro de laços.

Estruturas de Repetição aninhadas em C++

Veja nos tutoriais anteriores, onde usamos exercícios famosos para fixar nossos conhecimentos em estruturas de repetição, especificamente, nos códigos do laço DO WHILE:

Colocamos um laço FOR dentro do laço DO WHILE.
Ou seja, existe um looping maior, um laço pai, o DO WHILE, que vai ficar repetindo uma estrutura base.

Dentro de cada iteração dessa, um laço FOR é executado.
Esse laço de dentro está aninhado ao laço de fora.

Consegue ver e entender sua função, por que ele funciona?
É bem simples, mas é uma técnica muito poderosa.

Usando laços aninhados em C++

Vamos usar a técnica das estruturas de repetição aninhadas para imprimir um tabuleiro N x N, ou seja, de N linhas e N colunas. Veja um exemplo de tabuleiro 3x3, pra jogar jogo da velha:
-   -   -
-   -   -
-   -   -

O segredo aqui é usar um laço pras linhas e outro, interno ao primeiro, para cuidar das colunas em cada linha.

O primeiro FOR vai de 1 até N, é o responsável pelas linhas.
Note que ao final dele tem uma quebra de linha, para imprimir a próxima iteração na linha de baixo.

Dentro do FOR de linha, vamos imprimir N tracinhos.

Veja como fica nosso código:
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
    int lin, col, N;

    cout<<"Tamanho do tabuleiro N x N: ";
    cin >> N;

    for(lin=1 ; lin<=N ; lin++){
        for(col=1 ; col<=N ; col++)
            cout<<" - ";

        cout <<endl;
    }

    return 0;
}

Como usar laços aninhados em C++

Vamos criar um programa para imprimir a seguinte tabela da imagem:

Estruturas de repetição aninhadas

Veja que tabela bonita, que tabela formosa, que tabela bem feita.
Vamos aprender como fazer ela?

Primeiro, note duas duas, ela tem:

  • 4 linhas
  • 4 colunas

Vamos usar dois laços, um para cuidar das linhas e outro para cuidar das colunas.
Para controlar esses laços, vamos usar as variáveis lin e col, bem como uma variável que vai receber os números de 1 até 16, a num.

Vamos, de início, trabalhar nas linhas:
    for(lin=1 ; lin<=4 ; lin++){
        // alguma coisa
        cout <<endl;
    }

Note que ao término de cada iteração, temos que dar uma quebra de linha, para ir para a linha de baixo.

Dentro de cada iteração desta, precisamos imprimir as colunas, que são 4 por linhas.
Então vamos usar outro laço aninhado:
    for(lin=1 ; lin<=4 ; lin++){
        for(col=1 ; col<=4 ; col++){
            // alguma coisa
        }
        cout <<endl;
    }

Dentro desse for aninhado, tamos imprimir os números.
Como a variável col vai de 1 até 4, ele imprime quatro números em cada linha.

Vamos usar a variável num, inicialmente com valor 1, para imprimir esses valores.
Após a iteração interna, temos que incrementar essa variável.

Para a tabela sair bonitinha e formatada, vamos usar o comando setw, para definir como tamanho de 4 espaçamentos (você precisa incluir a biblioteca iomanip, pra usar esse comando).

Veja como ficou nosso código:
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
    int lin, col, num=1;

    for(lin=1 ; lin<=4 ; lin++){
        for(col=1 ; col<=4 ; col++){
            cout<<setw(4) << num;
            num++;
        }
        cout <<endl;
    }

    return 0;
}
Bacana, né?

Exemplo de uso de laços aninhados

Vamos agora imprimir um triângulo de asteriscos, do tamanho que o usuário quiser.
Por exemplo, um triângulo de tamanho 5:
*
**
***
****
*****

Note que vai ter 5 linhas.
Na primeira linha, tem 1 coluna.
Na segunda linha, tem 2 colunas.
...
Na quinta coluna, tem 5 colunas.

O primeiro FOR, a variável de controle lin vai de 1 até N, onde N é o tamanho do triângulo que o usuário quiser.
Dentro de cada FOR, vamos usar outro FOR para imprimir os asteriscos. Eles devem imprimir de 1
até lin, consegue captar essa ideia?

Na primeira linha, imprime 1 asterisco.
Na segunda linha, imprime 2 asteriscos.
...
Na N-ésima linha, imprime N asteriscos.

Veja como fica nosso código:
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
    int lin, col, N;

    cout<<"Tamanho do triângulo: ";
    cin >> N;

    for(lin=1 ; lin<=N ; lin++){
        for(col=1 ; col<=lin ; col++)
            cout<<"*";

        cout <<endl;
    }

    return 0;
}
Note que o FOR de fora, usa chaves, pois tem mais de uma linha de comando abaixo dele.
Já o FOR de dentro, não precisa, pois ele só tem uma linha de comando.
Cuidado para não confundir as chaves! Faça sempre um espaçamento e uma indentação correta, para não errar.

Laço dentro de laço de laço dentro de laço...

Ok, já vimos como aninhar estruturas de repetição, colocamos um FOR dentro de outro.
E que tal agora colocar mais um FOR, aninhado aos outros dois?

Vamos mostrar todos os horários possíveis de um relógio, durante o dia, no formato:
hour:min:sec

Ou seja, vai de : 00:00:00
Até o : 23:59:59

Vamos usar três variáveis: h, m e s
h vai de 0 até 23, tanto m como s vão de 0 até 59, pois representam os minutos e segundos.

Nosso código fica assim:
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
    cout.fill('0');
    for(int h=0 ; h < 24 ; h++)
        for(int m=0 ; m < 60 ; m++)
            for(int s=0; s<60 ; s++){
                cout<<setw(2)<<h<<":";
                cout<<setw(2)<<m<<":";
                cout<<setw(2)<<s<<endl;
            }

    return 0;
}
Usamos o setw(2) para definir 2 caracteres de espaçamento.
Quando não tiver nada pra aparecer nesse espaçamento, vai aparecer 0, pois usamos cout.fill('0')

Nenhum comentário:

Postar um comentário