Jump to content

Duvida: centrar Árvore de Natal


LegaliZe
 Share

Recommended Posts


void tronco(int niveis, int max_ast){
	int zi = niveis - 1,zf = niveis +1;
	int altura = 4,j,i;
	for(j = 0 ; j < altura ; j++){
	 for( i = 1 ; i <= max_ast; i++){
		 if(i >= zi && i <= zf) printf("*");
		 else printf(" ");
}
	 printf("\n");
}
}

void arvore(){
	 int niveis = 7,zi,zf;
	 int max_ast = niveis * 2 -1,j,i;
	 zi = niveis;
	 zf = zi;		 
                for(j = 0 ; j < niveis ; j++){
	 for(i = 1 ; i <= max_ast; i++){
		 if(i >= zi && i <= zf) printf("*");
		 else printf(" ");

	 }
	 printf("\n");
	 zi--;
	 zf++;
	 }
	 tronco(niveis,max_ast);
	}




Está genérico acho eu, basta so alterares o valor dos niveis para dar arvores maiores. Percebe o código o que nao percebes diz, que depois explico.

Link to comment
Share on other sites

nao a problema tipo eu tb tenho o meu codigo posso postar vao ver que não e nada do genero, para mim o meu é muito mais simples xD so ke o meu codigo estava a gerar a arvore sem estar centrada e estive bastante tempo a tentar resolver isso mas n consegui vou ver se chego lá senão conseguir volto cá com o meu codigo

Link to comment
Share on other sites

ok não tou mesmo a entender isso dos espaços  🙂 o que eu tenho é

#include <stdio.h>
int main ()
{
int base,largura,altura,i,j,metadebase;
do
{
	printf("Valor da Base\n");
	scanf("%d",&base);	
}
while (base<3 || (base%2==0));
do
{
  		printf("Valor da Largura\n");
	scanf("%d",&largura);
}
while ((largura%2==0) || largura<1 || (base/2)<largura);
do
{
	printf("Valor da Altura\n");
	scanf("%d",&altura);
}
while ((base/2)<altura || altura<2);
	for (i=1; i<=base; i+=2)
        {
  		for (j=1; j<=i; j++)
	printf("*");
	printf("\n");
	}
for (i=1;i<=altura;i++)
 {
 	for (j=i;j<=largura+i-1;j++)
 	printf("*");
 	printf("\n");
}

}
Link to comment
Share on other sites

A ideia é simples, tu tens:

nivel 1 -> * na posição 7

nivel 2 -> * na posiçao 678

nivel 3 -> * na posiçao 5 6 7 8 9

e por ai fora

O que tens que fazer é mandar imprimir espaços menos na posiçao 7 no nivel 1,

depois na posiçao 6 a 8 (nivel 2) , dps 5 a 9 (nivel 3)ect, o que eu fiz foi definir o inicio e o fim de quando é imprimir os * sempre que passa um nivel eu decremento o inicio (zi--🙂 e incremento o fim (z++😉  que é o que acontece se reparares.

Corresponde no meu código a esta instruçao if(i >= zi && i <= zf) printf("*"); imprimi * quando i esta entre zi e zf.

Se nao meteres printf(" "); ele vai te imprimir sempre os * a esquerda do ecra.

Link to comment
Share on other sites

ok não tou mesmo a entender isso dos espaços  🙂 o que eu tenho é

#include <stdio.h>
int main ()
{
	while ((base/2)<altura || altura<2);
	for (i=1; i<=base; i+=2)
        {
  		for (j=1; j<=i; j++)
	printf("*");
	printf("\n");
	}
for (i=1;i<=altura;i++)
 {
 	for (j=i;j<=largura+i-1;j++)
 	printf("*");
 	printf("\n");
}

}

Tu nao tens a imprimir espaços no inicio por isso é que ele mete todos os * a esquerda.

Tens que meter algo do genero printf(" "); quando i != 7 dps printf("*") para i = 7 e aplicas a ideia do meu posto anterior para o restantes niveis.

Link to comment
Share on other sites

Estas a complicar largo:

for (l=1; l<=m; l++)
                {
                printf(" ");
                }
                for (j=i;j<=largura+i-1;j++)
                printf("*");
                printf("\n");

Transforma so num ciclo, que imprime todas as posiçoes com espaço menos a posiçao 6,7 e 8, estas imprimes com *

Link to comment
Share on other sites

se és da ubi podias ter visto uma solução que está no forum do ninf.

#include <stdio.h>
void ec(char a ,int b){
       int k;
       for(k=1;k<=b;k++)
               printf("%c",a);
}
main(){

  /*declaracao de variaveis*/

       int B,L,A,espaco,cont=1,i;
       char e=' ',x='*';

       /*pedir as variaveis*/

       do{
               printf("digite B (sendo impar e >=3) \n");
               scanf("%d",&B)
       }while(B<3||B%2==0);

       do{
               printf("digite L (sendo impar, >=3 e menor que B/2) \n");
     scanf("%d",&L);
       }while(L<3||L%2==0||L>(B/2));

       do{
               printf("digite A (sendo impar e >=3 e menor que B/2) \n");
               scanf("%d",&A);
       }while(A<3||A%2==0||(A>B/2));

       /*desenhar parte superior*/

  espaco=(B-1)/2;
       for(i=1;i<=(((B-1)/2)+1);i++){
               ec(e,espaco);
               espaco=espaco-1;
               ec(x,cont);
               cont=cont+2;
               printf("\n");}

       /*desenhar parte inferior*/

  espaco=(B-L)/2;
       for(i=1;i<=A;i++){
               ec(e,espaco);
               ec(x,L);
               printf("\n");}
}
cumps
Link to comment
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
 Share

×
×
  • 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.