Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
Diutsu

Pirâmide de Números

Recommended Posts

Diutsu

Boas,

Tenho aqui um enunciado de um exercicio que é para fazer para a proxima aula prática, de IAED, e não percebo  o que é pedido. Ou seja não sei qual é o output pretendido, porque o enunciado não é muito explicito nesse ponto.

Não preciso de código nenhum, é só mesmo o output, o codigo faço eu dps.

O exercicio é o 11, mas ponho aqui o 9 e o 10 porque estão relacionados.

9. (Pirâmide de Números 1) Escreva um programa que desenhe uma pirâmide de números utilizando a função void piramide (int N);. O valor de N, dado pelo utilizador, deverá ser obrigatoriamente superior ou igual 2. A pirâmide apresentada é o exemplo para N = 5.

               

              1

            1  2  1

        1  2  3  2  1

    1  2  3  4  3  2  1

1  2  3  4  5  4  3  2  1

10. (Pirâmide Invertida) Altere o programa anterior para desenhar uma pirâmide de números invertida usando a função void piramideInvertida (int N);. A pirâmide apresentada é o exemplo para N = 5.

1  2  3  4  5  4  3  2  1

  1  2  3  4  3  2  1

      1  2  3  2  1

          1  2  1

              1

11. (Pirâmide de Números 2) Altere o programa anterior para que a função pirâmide utilize as funções void escreveCaracter (char c, int n); (escreve o caracter passado no primeiro parâmetro tantas vezes quantas forem passadas no segundo parâmetro); void escreveNumerosAsc (int a, int :P ; (escreve os números inteiros entre o primeiro parâmetro e o segundo em ordem crescente); e void escreveNumerosDesc (int a, int :P (escreve os números inteiros entre o primeiro parâmetro e o segundo em ordem decrescente).

Cumps.


XX SINFO - Semana Informática

Share this post


Link to post
Share on other sites
Diutsu

Isso eu já sei, até porque o 9 e o 10 já estão feitos, mas por mais que leia o 11, não percebo qual é o objectivo.

Por outras palavras não estou a visualizar o resultado final.


XX SINFO - Semana Informática

Share this post


Link to post
Share on other sites
Localhost

A mim parece-me que a última é a mais fácil.

Na primeira função o que fazes é um for que escreve o caracter ou seja:

void escreveCaracter(char ch, int n) {
  int aux = 0;
  for(aux = 0; aux < n; aux++) {
    putchar(ch);
  }
}

As outras funções também utilizas um for, é a mesma ideia.


here since 2009

Share this post


Link to post
Share on other sites
Diutsu

a ideia é fazer uma piramide de qq coisa

ou seja o resultado pretendido é algo como isto:

para esta função: escreveCaracter(c,10)

        c

      c c c

  c c c c c

c

para escreveNumerosAsc(3,9)

        3

      4 5 6

  7 8 9

e para escreveNumeroDes(2,12) é isto?

            12

      11 10 9

    8  7  6  5 4

3  2

É que se for isto fazer o código é bastante fácil, não tem lá grande sentido

enfim.

De qq maneira, obrigado pelas respostas.


XX SINFO - Semana Informática

Share this post


Link to post
Share on other sites
Localhost

Ah, eu não tinha percebido isso do exercício. Então fazes o mesmo só que com o que te mostrei (fazes o mesmo que fizeste para o outro exericicio de contruir a piramide).


here since 2009

Share this post


Link to post
Share on other sites
TheDark

Segundo entendi, não é bem isso o pretendido, é ainda mais simples ::)

O output das funções será:

escreveCaracter('c', 10)

cccccccccc

escreveNumerosAsc(3, 9)

3 4 5 6 7 8 9

escreveNumeroDes(12, 2)

12 11 10 9 8 7 6 5 4 3 2

sendo o objectivo, depois de as implementares, utilizares a função escreveCaracter para escrever os espaços antes de cada linha das pirâmides, e as outras duas para escrever os números de cada linha. Por exemplo, para escreveres a pirâmide

1 2 3 4 3 2 1

  1 2 3 2 1

    1 2 2

      1

utilizarias

/*escreveCaracter(' ', 0);*/ escreveNumerosAsc(1, 4); escreveNumerosAsc(3, 1);
escreveCaracter(' ', 2); escreveNumerosAsc(1, 3); escreveNumerosDes(2, 1);
escreveCaracter(' ', 4); escreveNumerosAsc(1, 2); escreveNumerosDes(1, 1);
escreveCaracter(' ', 6); escreveNumerosAsc(1, 1); /*escreveNumerosDes(0, 1);*/

O que está comentado não é necessário para utilização "por extenso", mas dá jeito para compreender o que utilizar dentro de um ciclo.


Desaparecido.

Share this post


Link to post
Share on other sites
Diutsu

Antes de mais obrigado pelas ajudas.

Entretanto já tive a dita aula, e perguntei qual era o objectivo do exercicio, a resposta foi muito semelhante à dada pelo TheDark.

Deixo aqui o código do exercício se alguém estiver interessado:

void escreveCaracter(char c, int n)
{
int i;
for(i=0; i<n; i++)
{
	putchar(c);
}
}

void escreveNumeroAsc(int a, int b)
{
while(a<=b)
{
printf("%2d",a++);
}
}

void escreveNumeroDesc(int a, int b)
{
while(a>=b)
{
printf("%2d", a--);
}
}

void piramid_11 (int N)
{
int i=N;

while(N>=2 && i>=1)
{
	/*meter os espaços antes da linha*/
	escreveCaracter(' ', 2*(N-i));

	/*escrever primeira metade*/
	escreveNumeroAsc(1, i);

	/*escrever segunda metade*/
	escreveNumeroDesc(i-1, 1);

	/*decrementaaaaahhh!!*/
	i--;
	putchar('\n');

}
}

int main()
{
int n;
do
{
printf("Escrever a piramide para quantas linhas? ");
scanf("%d", &n);
printf("\n");
} while(n<2);
piramid_11(n);
return 0;
}
 

cumps


XX SINFO - Semana Informática

Share this post


Link to post
Share on other sites
jarsantos

void imprimeEspacos(int tamanho)
{
for(int i = tamanho; i > 0; i--)
	printf(" ");
}

void imprimeLinha(int tamanho)
{
int metade;

metade = (tamanho / 2) + 1;

for(int i = 1; i <= metade; i++)
	printf("%d ", i);

metade = tamanho - metade;

for(int i = metade; i > 1; i--)
	printf("%d ", i);

printf("1\n");
}


void piramide(int num_linhas)
{
int tamanhoUltimaLinha = (num_linhas * 2) - 1;

imprimeEspacos(2 * num_linhas - 2);
printf("1\n");

for(int i = 3, s = 2 * num_linhas - 4; i <= tamanhoUltimaLinha; i += 2, s -= 2)
{
	imprimeEspacos(s);
	imprimeLinha(i);
}
}

void piramideInversa(int num_linhas)
{
int tamanhoPrimeiraLinha = (num_linhas * 2) - 1;

for(int i = tamanhoPrimeiraLinha, s = 0; i > 1; i -= 2, s += 2)
{
	imprimeEspacos(s);
	imprimeLinha(i);
}

imprimeEspacos(2 * num_linhas - 2);
printf("1\n");
}


int main(array<System::String ^> ^args)
{
int num_linhas;

printf("Deseja uma piramide de quantas linhas? ");
scanf("%d", &num_linhas);

printf("\n");
piramide(num_linhas);

printf("\n");
piramideInversa(num_linhas);

scanf("%d", &num_linhas);
}

Atenção: fiz isto no visual studio como projecto de C++, mas acho que funciona para C...tirando a definição da estrutura para receber argumentos do main.

Share this post


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
Sign in to follow this  

×

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.