Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Piramide de asteriscos

Olá. Nesse curso fizemos meia piramide de asteriscos: http://1.bp.blogspot.com/-TikFQyLULcw/TrGuqHMjVfI/AAAAAAAABsQ/bjUQq8R2LKk/s1600/result.jpg (logo a primeira)

Gostaria de fazer uma piramide inteira, usando asteriscos e espaços assim: http://4.bp.blogspot.com/-MHJBdQ8Jsfs/Tjvt8EeknlI/AAAAAAAAAV0/dqDv0uKDbIk/s1600/piramide_asteriscos.JPG

Alguém poderia me dar uma luz?

4 respostas

Boa noite Leonardo,

Eis uma sugestão:

import java.util.Scanner;

public class Piramide {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in) ;
        int pisos = -1;
        do {
            System.out.println("Quantos pisos deseja que tenha a piramide (maximo 40)?");
            pisos = -1;
            String str = in.next();
            try {
                pisos = Integer.parseInt(str);
            } catch(Exception e){ System.out.println("Digite um numero inteiro entre 1 e 40."); }
        } while (pisos < 1 || pisos > 40);

        StringBuilder linha = new StringBuilder("");
        StringBuilder piramide = new StringBuilder("");

        for(int j = 0; j < pisos*2-1; j++) piramide.append('*'); // base

        linha.append(piramide);
        int ini = 1, fim = 2;

        while(ini != fim) {
            ini = linha.indexOf("*");
            fim = linha.lastIndexOf("*");

            linha.replace(ini, ini+1, " ");
            linha.replace(fim, fim+1, " ");

            piramide.insert(0, linha+"\n");
        }
        System.out.print(piramide);
        in.close();
    }
}

Avisa aí se der certo.

Abraço.

Olá Rafael. O código funcionou perfeitamente, obrigado. Mas está um pouco complexo pra mim. comecei a estudar programação a pouco tempo e não entendi muita coisa aí. hehe

solução!

Bom dia Leonardo,

Hehehe. Vou tentar explicar então.

Pensei no seguinte: construir a pirâmide debaixo para cima.

Para um dado número de pisos "n", você vai ter na base "2n-1" asteriscos. Ou seja:

  • Para n=2 (dois pisos), base vai ter 2n-1=3 asteriscos.
  • Para n=3 (três pisos), base vai ter 2n-1=5 asteriscos.

E assim vai. No caso do teu post, são 15 pisos, ou seja, n=15. Logo a base vai ter 2n-1=2*15-1 = 29 asteriscos.

Para construir as linhas de cima, pensei no seguinte: a linha de cima tem sempre dois asteriscos a menos que a linha debaixo. Um retirado da primeira posição, outro da última.

Se você pega n=15, vimos que a base tem 29 asteriscos. A linha anterior (14.ª linha) tem 27 asteriscos (dois a menos). A 13.ª linha tem 2 asteriscos a menos que a 14.ª, ou seja, 25 asteriscos. E assim segue, até a primeira linha.

Deste modo, para detectar onde está o primeiro asterisco a remover da linha debaixo, uso o indexOf e ponho o valor na variável "ini". Para detectar onde está o último, uso o lastIndexOf e ponho o valor em "fim".

Para remover, uso replace, que substitui o asterisco por espaço, nas posições "ini" e "fim" referidas acima.

E, tendo esta nova linha, coloco-a em cima das linhas anteriores com o insert. E concateno com "\n" pra pular linha.

Repito isso até que "ini" == "fim", condição que ocorre ao se chegar à linha do topo, por ela ter só um asterisco.

Ah, a parte do Scanner e do-while é pra ler o número de pisos a partir do teclado do usuário.

Consegui explicar? Rs... Avisa aí se ficou mais claro ou se resta dúvida.

Abraço!

Claríssimo Rafael! Muito obrigado!