Executando verificação de segurança...
3
Marley
1 min de leitura ·

Como vocês fariam esse codigo?

Esse codigo em C pede um input do usuario de uma altura(entre 1 e 8) e printa uma piramide de acordo com o input, por exemplo:

https://ibb.co/FbnZkps

Pode ser na linguagem de sua preferência, só queria saber outras formas de fazer isso.

CODIGO

#include <stdio.h>
#include <cs50.h>

int isBtw1And8(int size);

void MakePyramid(int h);

int main(void)
{
    int h;
    do
    {

        h = get_int("height: ");

    }while(isBtw1And8(h) == false);

    MakePyramid(h);

}

int isBtw1And8(int size)
{
    if(size >= 1 && size <= 8)
    {
        return true;
    }
    else
    {
        return false;
    }
}

void MakePyramid(int h)
{
    for(int i = 1 ,c,s; i <= h; i++)
    {
        c = i;
        s = (h - i);

        while(s != 0)
        {
            printf(" ");
            s--;
        }
        while(c != 0)
        {
            printf("#");
            c--;
        }
        printf("\n");

    }
}
Carregando publicação patrocinada...
3

Vc pode usar as próprias opções do printf para formatar a quantidade de espaços e #:

int height = // ler valor e verificar se está entre 1 e 8
for (int i = 1; i <= height; i++)
    printf("%*s%.*s\n", height - i, "", i, "#########");

Saída para height igual a 8:

       #
      ##
     ###
    ####
   #####
  ######
 #######
########

Veja aqui o código rodando.

Referência: https://stackoverflow.com/questions/7105890/set-variable-text-column-width-in-printf


E pra ler a altura, nem precisa de uma função pra validar, pode ser apenas:

int height;
do {
    printf("height: ");
    scanf("%d", &height);
} while (height < 1 || height > 8);

Mas se quiser muito continuar com a função, dá pra simplificar:

int isBtw1And8(int size) {
    return size >= 1 && size <= 8;
}

Simplifiquei, pois sempre que vc tem algo como if (algo) return true; else return false;, pode trocar por return algo;.

E no main ficaria:

int height;
do {
    printf("height: ");
    scanf("%d", &height);
} while (! isBtw1And8(height));

Os códigos acima não validam se o usuário não digitar um número válido (por exemplo, se digitar "xyz"). E tem várias formas diferentes de fazer (veja este link e escolha uma) :-)


Por fim, daria para fazer assim também:

int height = // ler valor entre 1 e 8
for (int i = 1; i <= height; i++) {
    for (int j = 0; j < height; j++) {
        if (j < height - i) {
            printf(" ");
        } else {
            printf("#");
        }
    }
    printf("\n");
}
1

Se possível, eu mudaria para

printf("%*s%.*s\n", height - i, "", (i + (i-1)), "#################");

Pois acho o resultado final mais aesthetic.

1

Mas aí fica diferente do que foi proposto.

Repare que o código original imprime N vezes o caractere # na linha N, alinhado à direita, que é diferente do que vc fez.

Sei que no texto ele cita "pirâmide", e que na prática ele quer apenas metade dela, enquanto o seu código imprime a pirâmide inteira, mas enfim...

2

Em JavaScript, seria similar à outras apresentadas, aproveitando o método repeat, que repete uma string várias vezes:

var height;
while (true) {
    height = parseInt(prompt('Digite a altura:'));
    if (1 <= height && height <= 8) {
        break;
    } else {
        console.log('Altura deve ser um número entre 1 e 8'); // pode usar alert em vez de console.log
    }
}

for (var i = 1; i <= height; i++) {
    console.log(' '.repeat(height - i) + '#'.repeat(i));
}

Para ler o número, estou levando em conta que está rodando em um browser, pois uso prompt para obter a entrada do usuário. Se estiver rodando em outro ambiente (por exemplo, Node na linha de comando), pode usar outras alternativas.

Vale lembrar que o código acima dá a mesma mensagem caso o número esteja fora da faixa entre 1 e 8, ou se não for digitado um número (por exemplo, "xyz"). Mas se quiser separar as mensagens, pode fazer:

var height;
while (true) {
    height = parseInt(prompt('Digite a altura:'));
    if (isNaN(height)) { // se não digitar um número (por exemplo, "xyz"), cai aqui nesse if
        console.log('Você não digitou um número válido')
    } else if (1 <= height && height <= 8) {
        break; // número entre 1 e 8, sai do while
    } else { // se número estiver fora do intervalo, cai aqui no else
        console.log('Altura deve ser um número entre 1 e 8'); // pode usar alert em vez de console.log
    }
}
2

Não podia faltar a versão em Javinha:

import java.util.Scanner;

public class App {

    record Tree(int size) {
        @Override
        public String toString() {
            var builder = new StringBuilder();
            for(int i=0;i<=size;i++) {
                builder.append(String.format("%" + size + "s\n", "#".repeat(i)));
            }
            return builder.toString();
        }
    }

    public static void main(String[] args) {
        System.out.print("Tamanho: ");
        var scanner = new Scanner(System.in);
        if(scanner.hasNextInt()) {
            var size = scanner.nextInt();
            System.out.println(new Tree(size));
        }
    }
}
1

Em Ruby eu faria assim:

def mostrar_piramide(linhas)
  for linha in 1..linhas
    espacos = linhas - linha
    colunas = 2 * linha - 1
    puts ' ' * espacos + '#' * colunas
  end
end

puts "Digite a quantidade de linhas da pirâmide:"
linhas = gets.chomp.to_i

if linhas >= 1 && <= 8
  mostrar_piramide(linhas)
else
  puts 'Quantidade de linhas tem que ser entre 1 e 8'
end

Rodando

Digite a quantidade de linhas da pirâmide:
8

       #
      ###
     #####
    #######
   #########
  ###########
 #############
###############
2

Não querendo ser xaropão, mas ...

  • Está no enunciado (entre 1 e 8). O teu exemplo não faz essa checagem e aceita qualquer valor.
  • No enunciado diz: uma pirâmide e o exemplo mostra um triângulo retângulo. Aí o teu programa está correto e o enunciado está errado.
2
1

Em Python dá pra aproveitar o fato de que uma string pode ser "multiplicada" por um número: por exemplo, "a" * 3 resulta em "aaa". Sendo assim, fica simples construir cada linha:

while True:
  try:
    height = int(input('height: '))
    if 1 <= height <= 8:
      break
    else:
      print('número deve estar entre 1 e 8')
  except ValueError:
    print('Você não digitou um número')
 
print("pirâmide:", height)
for i in range(1, height + 1):
  print((" " * (height - i)) + ("#" * i))
1

Como o TabNews não salienta a sintaxe de algumas linguagens, coloquei uma screenshot. Não tenho uma linguagem de preferência e resolvi mostrar como poderia ficar em duas linguagens

  • Na esquerda FreePascal (Pascal é antiga mas capaz e ainda utilizada). Nada de mais. Apenas mostrando a criação de um tipo de variável que aceita apenas uma faixa de 1 a 8. Valores diferentes causam uma exceção facilitando o tratamento da entrada.
  • Na direita M (MUMPS). Primeira linguagem com BD não relacional embutido na linguagem. Mais para mostrar que a linguagem pode ser bastante consisa. Poderia ter abreviado os comandos/funções para uma letra (READ=R, IF,I, WRITE,W, FOR=F, DO=D, $JUSTIFY=$J e $EXTRACT=$E).

mumpas

1

Olá, eu fiz esse exemplo em python que estou aprendendo. Então pode ser que outro modo de fazer seja mais performático.
É só trocar o tamanho por um input ou o que vc quiser.

tamanho = 8

for tam in range(tamanho):
    quant = (tamanho - tam) - 1
    espace = ' ' * quant
    simbol = '#'*(tam+1)
    print(espace + simbol)

1

É basicamente o que eu fiz aqui, mas sem as variáveis intermediárias :-)

Quanto a ser performático, talvez não seja muito porque precisa gerar várias strings, pode ser que um loop simples imprimindo um caractere por vez seja ligeiramente mais rápido. Mas em um código tão pequeno provavelmente não faz tanta diferença.

1

Quebrei a cabeça para fazer esse código, achei várias soluções que resolveriam esse problema, mas como todo curioso (e preguiçoso hahah) procurei a maneira mais simples de fazer e consegui resolver dessa forma:

using System;
class Program
{
static void Main()
{
int altura = 8;

    for (int i = 1; i <= altura; i++)
    {  
        Console.WriteLine(new string('#', i));
    }
    Console.ReadLine(); 
}

}