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:
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");
}
}
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");
}
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
}
}
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));
}
}
}
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
#
###
#####
#######
#########
###########
#############
###############
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))
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).
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)
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();
}
}