Jump to content

Imprimir árvore de Natal


Recommended Posts

Posted

Olá, eu sou nova nesta comunidade (o que não significa que já não tenha lido algumas conversas daqui e tenho a dizer que já aprendi bastante). Estou no primeiro ano do curso de Informática e tenho uma cadeira que é Algoritmia e Programação, que não é a minha melhor (por mais irónico que pareça). Portanto, vinha-vos pedir ajuda com um exercício que é o seguinte:

Citação

Ex14) Escreva um programa em C que apresente no ecrã uma árvore de Natal como a que se segue. (***) 
Para isso deverá pedir ao utilizador o valor de B que representa o número de asteriscos (*) na base da árvore. O valor de B deverá ser obrigatoriamente ímpar e maior ou igual 3. Deverá pedir também o valor de L e A que representam, respetivamente a largura e a altura do tronco da árvore. A largura do tronco L deverá ser pelo menos 1 asterisco, deverá ser obrigatoriamente impar e não poderá ultrapassar metade de B, isto é metade do número de asteriscos da base. A altura do tronco A deverá ser pelo menos 2 asteriscos e também não deverá ultrapassar metade de B. Em caso de valores inválidos o programa deverá apresentar um erro e voltar a pedi-los.

A sério eu já tentei de tudo mas o máximo que consegui foi dar resposta aos printfs e depois o programa "explodir". Mando aqui o meu código. Se alguém me pudesse ajudar, agradecia.

P.S.: Não pus foto porque não estava a aceitar. Desculpem-me.

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int main()
{
    int B, A, L, i, j, k;
    do
    {
       printf("Qual o numero de asteriscos na base da arvore?");
       scanf("%d", &B);
    }
    while(B<3 && B%2==0);
    
    do
    {
       printf("Qual o numero de asteriscos na largura?");
       scanf("%d", &L);
    }
    while(L<1 && L!=0.5*B);
    
    do
    {
        printf("Qual o numero de asteriscos na altura?");
        scanf("%d", &A);
    }
    while(A<2 && A!=0.5*B);
    
    
     for(i=3; i<=B; i++) 
     {
     printf("");
     printf("\n");
     
        for(i=1; i=L; i++)
        for(j=B/2; j>=i; j--)
        printf("*");
        printf("\n");
        
             for(i=2; i<=B; i++)
             for(k=B/2; k>=i; k--)
             printf("*\n");
         }
         getchar();
        
         return 0;

    system("pause");
}
Posted

Vou tentar fazer isto contigo! Mas em primeiro vamos arrumar o código.

Identa lá isso melhor e todo o código a seguir a um return é pura e simplesmente descartado!

Quando editares esse código, escolhe a opção "C" para activar a syntax highlight que ajuda o código a ficar mais legível! Quando vir isso feito, vamos tentar fazer isto por partes!

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Posted
Em 11/11/2016 às 23:36, PsySc0rpi0n disse:

Vou tentar fazer isto contigo! Mas em primeiro vamos arrumar o código.

Identa lá isso melhor e todo o código a seguir a um return é pura e simplesmente descartado!

Quando editares esse código, escolhe a opção "C" para activar a syntax highlight que ajuda o código a ficar mais legível! Quando vir isso feito, vamos tentar fazer isto por partes!

Assim o farei! Obrigada pela ajuda!

Em 12/11/2016 às 05:55, HappyHippyHippo disse:

poderias dar uma vista de olhos neste tópico : https://www.portugal-a-programar.pt/forums/topic/57368-árvore-de-natal/

ps : sê discriminatória na selecção das entradas que existem nesse tópico, porque nem tudo que está lá será direccionado para uma pessoa que está a iniciar

Por acaso baseei-me também nesse exercício! Mas não é bem o que eu preciso...Mas já ajuda!

Posted
Em 12/11/2016 às 05:55, HappyHippyHippo disse:

poderias dar uma vista de olhos neste tópico : https://www.portugal-a-programar.pt/forums/topic/57368-árvore-de-natal/

ps : sê discriminatória na selecção das entradas que existem nesse tópico, porque nem tudo que está lá será direccionado para uma pessoa que está a iniciar

Eu lembrava-me que já tinha tido uma luta deste género mas já nem me lembrava que tinha sido aqui que tinha colocado o problema!

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Posted
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int main()
{
    int B, A, L, i, j, k;
    
    do
    {
       printf("Qual o numero de asteriscos na base da arvore?");
       scanf("%d", &B);
    }
    while(B<3 && B%2==0);
    
    do
    {
       printf("Qual o numero de asteriscos na largura?");
       scanf("%d", &L);
    }
    while(L<1 && L!=0.5*B);
    
    do
    {
        printf("Qual o numero de asteriscos na altura?");
        scanf("%d", &A);
    }
    while(A<2 && A!=0.5*B);
    
    
     for(i=3; i<=B; i++) 
     {
     printf("");
     printf("\n");
     
      for(i=1; i=L; i++)
       for(j=B/2; j>=i; j--)
       printf("*");
       printf("\n");
        
        for(i=2; i<=B; i++)
         for(k=B/2; k>=i; k--)
         printf("*\n");
         }
         getchar();
        
         return 0;
}

Está mais legível?

Posted
16 minutos atrás, HappyHippyHippo disse:

as diferenças são minúsculas, logo podes aproveitar quase todo o tópico para criar a tua árvore

Eu pensei em copiar praticamente tudo, só que não dá, porque:

  1. naquele exercício havia 2 e não 3 variáveis;
  2. não podia copiar a parte inicial porque é o utilizador que escolhe o nº de asteriscos para a base, altura e largura da árvore, ou seja, não dá apenas um nº qualquer e depois aparece a árvore

É principalmente por causa do 2 que eu acho que não dá para copiar

Posted

Eu não sei se é do forum ou não, mas como no passado o forum tinha problemas a manter a identação que a gente tinha no código que postava, vou experimentar identar o teu código como se fosse o meu código a ver se fica como deve ser:

 

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

int main(){
    int B, A, L, i, j, k;
    
    do{
       printf("Qual o numero de asteriscos na base da arvore?\n");
       scanf(" %d", &B);
    }while(B<3 && B%2==0);
    
    do{
       printf("Qual o numero de asteriscos na largura?\n");
       scanf(" %d", &L);
    }while(L<1 && L!=0.5*B);
    
    do{
    	printf("Qual o numero de asteriscos na altura?\n");
        scanf(" %d", &A);
    }while(A<2 && A!=0.5*B);
    
    for(i=3; i<=B; i++){
    	printf("");
    	printf("\n");
     
    	for(i=1; i=L; i++)
        	for(j=B/2; j>=i; j--)
        		printf("*");
        
        printf("\n");
        
        for(i=2; i<=B; i++)
        	for(k=B/2; k>=i; k--)
            	printf("*\n");
    }
    getchar();
    return 0;
}

Eu não sei se era isto que pretendias fazer, mas em termos de identação, penso que esta seja uma das formas correctas de identar... Claro que haverá outras! 

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Posted
4 minutes ago, Daniela T said:

Eu pensei em copiar praticamente tudo, só que não dá, porque:

  1. naquele exercício havia 2 e não 3 variáveis;
  2. não podia copiar a parte inicial porque é o utilizador que escolhe o nº de asteriscos para a base, altura e largura da árvore, ou seja, não dá apenas um nº qualquer e depois aparece a árvore

É principalmente por causa do 2 que eu acho que não dá para copiar

isso não é razão nenhuma

se o ponto de partida é diferente, nada interfere sobre o processo de impressão da árvore.

achas que correr o código com A = 3 ou A = 5 o código é diferente ?

IRC : sim, é algo que ainda existe >> #p@p
Posted
1 minuto atrás, HappyHippyHippo disse:

isso não é razão nenhuma

se o ponto de partida é diferente, nada interfere sobre o processo de impressão da árvore.

achas que correr o código com A = 3 ou A = 5 o código é diferente ?

Claro que correr com A=3 ou A=5 não interfere em nada, só queria dizer que o processo de estruturação do código ia ser diferente

Posted (edited)

O problema é que com este código consigo responder bem às perguntas mas depois o programa explode. Ou seja, o problema está mesmo no código. Se alguém conseguisse identificar o erro ficava mesmo muito agradecida, porque eu  já tentei de tudo mesmo...

Edited by Daniela T
Acrescentar informação e melhora português
Posted
Just now, Daniela T said:

HappyHippyHippo Mas se num tens 2 variáveis e no outro tens 3, então alguma coisa vai mudar (nem que seja uma coisa infinitésimal)

O que eu acho que o HappyHippyHippo quer dizer é que a forma de imprimir a árvore é a mesma, não varia nada só porque há mais variáveis ou menos!

Portanto, o que eu acho que podes aproveitar dequela thread  é que, consoante os dados pedidos e as restrições que te são impostas no enunciado, deves calcular o número de asteriscos a imprimir e o número de espaços a imprimir. Depois é usar os 'for's' para imprimir asteriscos e espaços!

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Posted

PsySc0rpi0n Aí é que eu tenho outro problema...É que eu sei as fórmulas para o número de asteriscos, mas não sei como se calcula o número de espaços (é bem...)

Desculpem-me, mas eu no início disse que não era a minha melhor cadeira...

Posted
6 minutes ago, Daniela T said:

PsySc0rpi0n Aí é que eu tenho outro problema...É que eu sei as fórmulas para o número de asteriscos, mas não sei como se calcula o número de espaços (é bem...)

como tinha dito, a solução está no tópico que tinha referenciado : 

https://www.portugal-a-programar.pt/forums/topic/57368-%C3%A1rvore-de-natal/?do=findComment?comment=483596

IRC : sim, é algo que ainda existe >> #p@p
Posted (edited)
13 minutes ago, Daniela T said:

PsySc0rpi0n Aí é que eu tenho outro problema...É que eu sei as fórmulas para o número de asteriscos, mas não sei como se calcula o número de espaços (é bem...)

Desculpem-me, mas eu no início disse que não era a minha melhor cadeira...

Já sabes como calcular os asteriscos por cada linha? Óptimo! Coloca aí a fórmula que encontraste. Depois refaz-se o teu código ou faz-se um novo!

Então, quanto aos espaços:

em primeiro lugar, conta quantos espaços precisas de ter em cada linha, por exemplo, pensado que a largura da base da copa da árvore é 15... Ou seja, o teu B = 15...

Depois o raciocínio passa por arranjar uma fórmula que, dependendo do teu único dado fixo relativamente à largura da base da copa da árvore, ou seja o teu B, te dê o número de espaços por cada linha.

Quote

.......*

......***

.....*****

....*******

...*********

..***********

.*************

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

Vou dar um exemplo para a primeira linha:

Q: Quanto é o meu B?

A: 15

Q: Quantas linhas de altura tem a copa da minha árvore?

A: 8

Q: Quantos espaços tenho que ter na linha nº 1?

A: 7

Vê agora se consegues relacionar o número de espaços, com a altura da copa da árvore, com a largura da base da copa a árvore e com a linha em que estás a desenhar.

Edited by PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Posted (edited)

Eu não cheguei a ver a solução da outra thread, apenas vi que a principal ideia é calcular o número de asteriscos e o númeo de espaços! Depois é imprimir espaços e asteriscos! Eu voltei a tentar calcular as fórmulas e se calhar até podem ser simplificadas mas eu estou a usar de momento as primeiras versões das fórmulas que achei!

Edited by PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.