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; }