aula 315

Como imprimir uma pirâmide de asteriscos? (triângulo isósceles)

Nesta aula vamos aprender como imprimir um triângulo de asteriscos, ou ainda um triângulo isósceles, triângulo que possui dois de seus lados iguais. Dizendo em outras palavras, o objetivo é produzir uma saída parecida com o desenho a seguir:

   * *
  ** **
 *** ***
**** ****

Observe que se desejássemos apenas a metade direita desse triângulo seria bastante simples. Contudo, temos duas metades de um triângulo e ainda espaços à esquerda, o que complica um pouco a lógica envolvida.

Como já foi dito inúmeras vezes aqui no curso, uma ótima estratégia para resolver problemas como este (e de programação em geral) é a sofisticada técnica conhecida como dividir pra conquistar. Pensar na solução do problema como um todo pode ser bastante complicado, então podemos dividi-lo em partes e, ao solucionar cada parte, solucionamos o problema completo. Neste caso podemos dividir o problema em três partes bem definidas: (1) os espaços à esquerda; (2) a primeira metade do triângulo (à esquerda); e (3) a segunda metade do triângulo, à direita.

Vamos nos concentrar na primeira parte, os espaços à esquerda. Observe que se assumirmos n como sendo o número de linhas, a primeira linha possui n – 1 espaços, a segunda linha possui n – 2, e assim por diante. Tanto no triângulo acima quanto na figura na capa do vídeo abaixo é possível notar que há 4 linhas (então n = 4). A primeira linha possui 3 espaços, a segunda linha possui 2 espaços, a terceira linha possui 1 espaço e a quarta linha possui 0 espaço. Precisamos construir uma(s) repetição para isso. Como cada linha possui uma quantidade diferente de espaços, precisaremos de 2 repetições, uma que irá rodar n vezes, e outra interna para imprimir os espaços de uma linha, mais ou menos assim:

/*
    Repetições para imprimir os espaços à esquerda
*/
    for(i = 1; i <= n; i++){
        for(j = n - i; j >= 1; j--) // imprime os espaços à esquerda
            printf(" ");
        
        printf("\n");
    }

Observe que o for interno é decrescente e usa o valor da variável i para determinar quantas vezes irá rodar. Quando i vale 1 o for interno irá rodar n – 1 vezes. Quando o i vale 2, o for interno irá rodar n – 2 vezes. Quando o i vale 3, o for interno irá rodar n – 3 vezes. É assim que conseguimos uma quantidade de espaços decrescente.

Na sequência, temos a segunda parte, a metade esquerda do triângulo. Observe que esta parte é o oposto da anterior. A primeira linha possui 1 asterisco. A segunda linha possui 2 asteriscos, e assim por diante até a linha n com n asteriscos. Para obter esse efeito novamente precisamos de 2 repetições. Como já temos uma repetição externa no trecho anterior, podemos acrescentar uma segunda repetição logo abaixo da repetição que imprime os espaços para imprimir os asteriscos, antes de saltar uma linha, afinal desejamos os asteriscos na frente dos espaços. Como a variável i do for externo inicia com 1 e é crescente, podemos fazer uma repetição interna que inicia em 1 e vai até i, assim:

/*
    Repetições para imprimir os espaços à esquerda e a primeira metade do triângulo
*/
    for(i = 1; i <= n; i++){
        for(j = n - i; j >= 1; j--) // imprime os espaços à esquerda
            printf(" ");
        for(j = 1; j <= i; j++) // imprime os * à esquerda
            printf("*");
        printf(" ");

        printf("\n");
    }

Por fim, chegamos à terceira parte. Esta é a mais fácil uma vez que basta imprimir uma sequência crescente de asteriscos. Aqui teremos outro for interno exatamente igual ao anterior. A diferença é que, como não há espaços à esquerda teremos meio triângulo na inclinação oposta a outra metade, assim:

/*
    Repetições para imprimir os espaços à esquerda e a primeira metade do triângulo
*/
    for(i = 1; i <= n; i++){
        for(j = n - i; j >= 1; j--) // imprime os espaços
            printf(" ");
        for(j = 1; j <= i; j++) // imprime os * à esquerda
            printf("*");
        printf(" ");
        for(j = 1; j <= i; j++) // imprime os * à direita
            printf("*");
        printf("\n");
    }

Código Completo em C

/*
       Código escrito em 20/06/2022
       por Wagner Gaspar
*/

#include <stdio.h>
#include <stdlib.h>

int main() {
    int i, j, n;

    printf("Digite o valor de n: ");
    scanf("%d", &n);

    for(i = 1; i <= n; i++){
        for(j = n - i; j >= 1; j--) // imprime os espaços
            printf(" ");
        for(j = 1; j <= i; j++) // imprime os *
            printf("*");
        printf(" ");
        for(j = 1; j <= i; j++) // imprime os *
            printf("*");
        printf("\n");
    }

    return 0;
}

Deixe um comentário

14 + 15 =

Wagner Gaspar

Capixaba de São Gabriel da Palha, Espírito Santo. Bacharel em Ciência da Computação pela Universidade Federal do Amazonas e mestre em informática pela Universidade Federal do Espírito Santo.