Jump to content

Árvore de natal


PsySc0rpi0n

Recommended Posts

PsySc0rpi0n

Tenho este exercício para fazer que é fazer um programa que desenhe um árvore consoante o número de ramos que o utilizador insere:

Eu tenho o programa assim mas não está a funionar coo eu queria...

Sem me dizerem qual a solução queria que me ajudassem a entender o que tenho mal.

#include  <stdio.h>
int main () {
int i, j, k=1, num;
 printf ("Insira um número:\n");
 scanf ("%d", &num);
 for (i=1; i<=num; i++){
  for (j=num; j>=i; j--)
printf (" ");
  for (k=1; k<=i*2-1; k++)
printf ("*");
  printf ("\n");
 }
 for (m=num/2; m<num; m++){
  for (n=1; n<=k/2; n++)
   printf (" ");
 printf ("*\n");
 }
getchar ();
return 0;
}
Edited by PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Link to post
Share on other sites
  • Replies 80
  • Created
  • Last Reply

Top Posters In This Topic

  • PsySc0rpi0n

    37

  • HappyHippyHippo

    21

  • pmg

    8

  • thoga31

    7

Top Posters In This Topic

Aqui

for (l = 0; l <= i; l += i)

Quando i é 0 (a primeira vez do ciclo mais abrangente) o l nunca se altera e ficas "trancado" num ciclo infinito.

[Edit]

Nao uses l (L minusculo) como nome duma variavel. Esse nome é muito facilmente confundivel com o numero 1 ou I (i maiusculo).

[/Edit]

Edited by pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to post
Share on other sites
PsySc0rpi0n

Aqui

for (l = 0; l <= i; l += i)

Quando i é 0 (a primeira vez do ciclo mais abrangente) o l nunca se altera e ficas "trancado" num ciclo infinito.

[Edit]

Nao uses l (L minusculo) como nome duma variavel. Esse nome é muito facilmente confundivel com o numero 1 ou I (i maiusculo).

[/Edit]

Vou alterar a parte do L, mas a explicação do loop infinito acho que não percebi!

Vou voltar a olhar para o código... (já estou há horas de volta disto) :(

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Link to post
Share on other sites

Vou alterar a parte do L, mas a explicação do loop infinito acho que não percebi!

Se i=0, então tens um loop infinito porque, a cada iteração, estás a somar i à variável de controlo l - estás a somar zero, portanto -, pelo que l mantém-se inalterado.

Knowledge is free!

Link to post
Share on other sites
PsySc0rpi0n

Se i=0, então tens um loop infinito porque, a cada iteração, estás a somar i à variável de controlo l - estás a somar zero, portanto -, pelo que l mantém-se inalterado.

Sim, já me apercebi dessa parte...

Então como devo pensar para resolver o problema?

Eu sei que o número de asteríscos, excepto para a primeira linha, é sempre o número de linhas + 2... Mas a pensar assim, não sei qual é a verificação para o terceiro for...

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Link to post
Share on other sites

Em vez de começares, no primeiro for, em i=0 começa em i=1 e altera o que for necessário em consequência desta modificação. Assim o teu terceiro for irá funcionar garantidamente.

(se o output final é o pretendido já não sei, não testei)

Edited by thoga31

Knowledge is free!

Link to post
Share on other sites
PsySc0rpi0n

Neste momento tenho assim, mas só me desenha metade da árvore.

#include  <stdio.h>
int main (void) {
int i, j, k, num;
 printf ("Insira um número:\n");
 scanf ("%d", &num);
 for (i=0; i<num; i++){
  for (j=num; j>i; j--)
printf (" ");
  for (k=1; k<=2*i+1; k+=2)
printf ("*");
  printf ("\n");
 }
getchar ();
return 0;
}

que é o mesmo que ter

#include  <stdio.h>
int main (void) {
int i, j, k, num;
 printf ("Insira um número:\n");
 scanf ("%d", &num);
 for (i=1; i<=num; i++){
  for (j=num; j>=i; j--)
printf (" ");
  for (k=1; k<=i; k++)
printf ("*");
  printf ("\n");
 }
getchar ();
return 0;
}

Resulta nisto:

*

**

***

****

*****

Não estou mesmo a conseguir...

Edited by PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Link to post
Share on other sites
PsySc0rpi0n

o objectivo é criar uma árvore ..mas que a saída dos asteriscos fique direita... é isso? Vou tentar também..cumps

O objectivo é:

*

***

*****

*******

********

mas o número de ramos da árvore é introduzido pelo utilizador...

Edit;

Não consigo fazer respeitar os espaços...

ou seja:

número inserido pelo user : 5

1ª linha:

5 espaços * (x1)

2ª linha:

4 espaços *** (x3)

3ª linha:

3 espaços ***** (x5)

4ªa linha:

2 espaços ******* (x7)

5ª linha:

1 espaço ********* (x9)

Edited by PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Link to post
Share on other sites

..descobri..

A ideia é adicionar o numero de espaços na primeira linha exactamente igual ao maior numero impar possível de asteriscos!

Isto é, ...se o utilizador inserir o numero de ramos por exemplo em 5, o maior numero impar de asteriscos será 9 (o que ficará na base)...

Pois, 5 ramos:

* - 1 asterisco

*** - 3 asteriscos

***** - 5 asteriscos

******* - 7 asteriscos

********* - 9 asteriscos

E depois a partir da segunda linha de ramos decrementa-se o numero de espaços numa unidade até igualar ao numero de ramos. Ou seja, na primeira linha antes do asterisco colocamos 9 espaços...na segunda serão 8 espaços, terceira ficam 7, etc..até chegar à ultima linha que terá exactamente o mesmo nº que receberá o numero de ramos inseridos pelo utilizador.

Assim, resumindo e pondo em hipotese o numero de ramos em 5:

9 espaços * 1 asterisco

8 espaços *** 3 asteriscos

7 espaços ***** 5 asteriscos

6 espaços ******* 7 asteriscos

5 espaços ********* 9 asteriscos

Espero ter ajudado,

...se tiver mais programas assim para me dar a volta ao brain mande vir ehe.

cumps

Edited by SS22
Link to post
Share on other sites

Posso sugerir uma coisa? :)

Escrevam funcoes. Separem as funcionalidades do programa em funcoes diferentes.

A funcao main() do meu teste ficou assim:

int main(void) {
 int altura, linha;
 if (leraltura(&altura)) exit(EXIT_FAILURE); // 1a funcao: pedir e devolver informacoes
 for (linha = 0; linha < altura; linha++) {
   imprimirespacos(linha, altura);           // 2a funcao: imprimir espacos com base na linha actual
   imprimirasterixes(linha, altura);         // 3a funcao: imprimir 'asterixes'
   puts("");
 }
 return 0;
}

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to post
Share on other sites
HappyHippyHippo

esquecendo o que foi dito ...

pensa assim

- para calcular o número de espaços e asterisco em cada linha tens de saber a altura total da árvore

- tenta descobrir a fórmula matemática que te dá o número de asteriscos em cada linha

   *     - f(0) = 1
  ***    - f(1) = 3
 *****   - f(2) = 5
*******  - f(3) = 7
********* - f(4) = 9

- tenta descobrir a fórmula matemática que te dá o número de espaços em cada linha (aqui necessitas da altura)

   *     - f(0, altura) = 4
  ***    - f(1, altura) = 3
 *****   - f(2, altura) = 2
*******  - f(3, altura) = 1
********* - f(4, altura) = 0

depois é só criares as funções que o @pmg disse e imprimires o que tens a imprimir

IRC : sim, é algo que ainda existe >> #p@p
Link to post
Share on other sites
PsySc0rpi0n

Posso sugerir uma coisa? :)

Escrevam funcoes. Separem as funcionalidades do programa em funcoes diferentes.

A funcao main() do meu teste ficou assim:

int main(void) {
 int altura, linha;
 if (leraltura(&altura)) exit(EXIT_FAILURE); // 1a funcao: pedir e devolver informacoes
 for (linha = 0; linha < altura; linha++) {
imprimirespacos(linha, altura);		   // 2a funcao: imprimir espacos com base na linha actual
imprimirasterixes(linha, altura);		 // 3a funcao: imprimir 'asterixes'
puts("");
 }
 return 0;
}

Pois, assim talvez seja mais fácil... A questão é que ainda não é suposto usarmos funções...

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Link to post
Share on other sites
HappyHippyHippo

Pois, assim talvez seja mais fácil... A questão é que ainda não é suposto usarmos funções...

atŕ podes não usar funções, mas o problema fundamental não é isso, pois não ?

IRC : sim, é algo que ainda existe >> #p@p
Link to post
Share on other sites
PsySc0rpi0n

esquecendo o que foi dito ...

pensa assim

- para calcular o número de espaços e asterisco em cada linha tens de saber a altura total da árvore

- tenta descobrir a fórmula matemática que te dá o número de asteriscos em cada linha

* - f(0) = 1
*** - f(1) = 3
***** - f(2) = 5
******* - f(3) = 7
********* - f(4) = 9

- tenta descobrir a fórmula matemática que te dá o número de espaços em cada linha (aqui necessitas da altura)

* - f(0, altura) = 4
*** - f(1, altura) = 3
***** - f(2, altura) = 2
******* - f(3, altura) = 1
********* - f(4, altura) = 0

depois é só criares as funções que o @pmg disse e imprimires o que tens a imprimir

Eu comecei por relaionar os espaços com as linhas, ou seja o for das linhas com o for dos espaços. Á medida que as linhas aumentam, os espaços diminuem na mesma razão, ou seja, 1ª linha, 5 espaços, 2ª linha, 4 espaços, 3ª linha, 3 espaços etc, etc...

Não consigo é relacionar o for dos asteríscos om nenhum dos outros dois for's...

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Link to post
Share on other sites
HappyHippyHippo

Eu comecei por relaionar os espaços com as linhas, ou seja o for das linhas com o for dos espaços. Á medida que as linhas aumentam, os espaços diminuem na mesma razão, ou seja, 1ª linha, 5 espaços, 2ª linha, 4 espaços, 3ª linha, 3 espaços etc, etc...

Não consigo é relacionar o for dos asteríscos om nenhum dos outros dois for's...

ok, uma pista

int n_espacos;
int n_asteriscos;

for (linha = 0; linha < altura; linha++)
{
 // calcular o n_espacos
 // calcular o n_asteriscos

 for (i = 0; i < n_espacos; i++)
   printf(" ");

 for (i = 0; i < n_asteriscos; i++)
   printf(" ");

 for (i = 0; i < n_espacos; i++)
   printf(" ");

 printf("\n");
}

não existe relação nenhuma entre for's ...

IRC : sim, é algo que ainda existe >> #p@p
Link to post
Share on other sites
PsySc0rpi0n

ok, uma pista

int n_espacos;
int n_asteriscos;

for (linha = 0; linha < altura; linha++)
{
 // calcular o n_espacos
 // calcular o n_asteriscos

 for (i = 0; i < n_espacos; i++)
printf(" ");

 for (i = 0; i < n_asteriscos; i++)
printf(" ");

 for (i = 0; i < n_espacos; i++)
printf(" ");

 printf("\n");
}

não existe relação nenhuma entre for's ...

Não percebi... Os printf's imprimem todos espaços?

E será mesmo impossível desenhar a ávore com um encadeamento de 3 for's?

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Link to post
Share on other sites
HappyHippyHippo

erro meu : o segundo for deveria ter:

printf("*");

E será mesmo impossível desenhar a ávore com um encadeamento de 3 for's?

não faz sentido ter 3 fors encadeados

for()
 for()
   for()
     // faz o que ?
Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to post
Share on other sites

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.