Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

telele97

Duvidas de programação -- triangulo de pascal dinamico

Mensagens Recomendadas

telele97

Boas pretendo fazer uma função que me construa o triangulo de pascal numa matriz para essa construção a função vai receber o numero de niveis e nada mais. Alguém em pode dar uma dica como posso começar a fazer isto .

O código que já tenho e este

int **Pascal(int nivel){
int **mp;
int i;
mp=(int**)malloc(sizeof(int*)*nivel);
for(i=0;i<nivel;i++){
mp[i]=(int*)malloc(sizeof(int)*nivel);
}
return mp;
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Tas no bom caminho (embora o cast ao valor devolvido pelo malloc() seja redundante).

So te falta meter os valores correctos na matrix que criaste.

Nao te esquecas de libertar a memoria ocupada pela matrix quando ja nao precisares dessa memoria!

Se a tua dúvida é de pascal, porque publicaste na secção de C ?

LOL!

O triangulo de Pascal nao tem a ver com nenhuma linguagem de programacao :D

Editado por 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
telele97

Hahahaa ... Obrigado pelas respostas. O que eu consegui fazer foi isto

for(i=0;i<nivel;i++){
for(j=0;j<nivel;j++){
if(j==0 || j==i)
mp[i][j]=1;
else
mp[i][j]=mp[i-1][j]+mp[i-1][j-1];
}
}

acho que assim isto já vai dar correcto. Agora uma dúvida : não será melhor colocar as outras entradas da matriz a 0 por exemplo para eu saber que nao tem signficado?

png tenho colegas meus que dizem que tenho que colocar sempre o cast porque tu dizes isso?

P.S. Visto retornar a matriz com o triangulo de pascal so devo libertar o espaço associado no main certo?

Editado por apocsantos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Hahahaa ... Obrigado pelas respostas. O que eu consegui fazer foi isto

for(i=0;i<nivel;i++){
 for(j=0;j<nivel;j++){
  if(j==0 || j==i)
   mp[i][j]=1;
  else
   mp[i][j]=mp[i-1][j]+mp[i-1][j-1];   
 }
}

acho que assim isto já vai dar correcto.

sim, está correcto

EDIT : informação repetida removida

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

acho que assim isto já vai dar correcto.

Nao analisei o teu codigo.

não será melhor colocar as outras entradas da matriz a 0 por exemplo para eu saber que nao tem signficado?

Pode tornar o resto do codigo mais facil. Mas nao precisas do indicador de significado: repara que na primeira linha so um valor tem significado; na segunda linha so dois valores tem significado; ...; na N-esima linha so N valores tem significado; ...

png tenho colegas meus que dizem que tenho que colocar sempre o cast porque tu dizes isso?

Os teus colegas devem estar a confundir C++ com C. Em C, valores de tipo void* podem-se atribuir a objectos de tipo ponteiro para qualquer coisa.

Meter o cast é redundante na melhor das hipoteses. Uma situacao que pode ocorrer em que o cast esconde um erro é a ausencia de prototipo para a funcao malloc().

Editado por 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
telele97

A diferença entre o calloc e o malloc é que o calloc inicializa as posições a NULL certo?

Depois para imprimir verifica se era diferente de NULL se for imprimo ?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

A diferença entre o calloc e o malloc é que o calloc inicializa as posições a NULL certo?

não, coloca os bits a 0

Depois para imprimir verifica se era diferente de NULL se for imprimo ?

não, apresentas "linhas" valores

1a linha - 1 valor

2a linha - 2 valores

...


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
telele97

Queria imprimir no terminal uma tabela deste género mas a minha fica toda "torta"

No meu caso não quero a coluna da esquerda

64d37a3311d35a03f675ce04a63d7291.png

   printf(" ");
   for(j=0;j<nivel;j++){
    if(fib[j]!=0)
    printf(" %d", fib[j]);
   }

for(i=0;i<nivel;i++){
for(j=0;j<nivel;j++){
if(mp[i][j]!=0)
printf("%d ", mp[i][j]);
else
printf(" ");
}
printf("- %d\n", soma[i]);
}

Editado por pmg
extra bold; falta LP

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Para imprimires valores com quantidades diferentes de digitos e ficarem todos alinhados, uma solucao comum é especificar o tamanho (minimo) para cada especificador de formato

printf("%4d", 42);    /* imprime <ESPACO><ESPACO><4><2> */
printf("%4d", -42);   /* imprime <ESPACO><-><4><2> */
printf("%4d", 0);     /* imprime <ESPACO><ESPACO><ESPACO><0> */
printf("%4d", 1234);  /* imprime <1><2><3><4> */
printf("%4d", 12345); /* imprime <1><2><3><4><5> desalinhando tudo! */

Editado por 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

visto já teres o principal do trabalho feito, vou apresentar o sniplet que tenho de criação do triângulo de Pascal:

/*
* Sniplet de apresentacao do triangulo de Pascal.
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

/* definir um valor maximo de escolha de linhas */
#define MAX 40

int main()
{
   int target = 0, row = 0, column = 0, delrow = 0;
   long ** matrix = NULL, max = 0;
   char format[10];
   char buffer[256];

   /* pedir o número de linhas a serem apresentadas */
   while (target == 0) {
       printf("Enter the number of the rows to be presented (1 to %d) : ", MAX);
       fflush(stdout);
       fgets(buffer, 256, stdin);
       if (!sscanf(buffer, "%d", &target) || target < 1 || target > MAX)
           target = 0;
   }

   /* alocar a primeira dimensao da matrix para o calculo do triangulo */
   if ((matrix = malloc(target * sizeof(long))) == NULL) {
       printf("Error allocating memory\n");
       return -1;
   }

   /* ciclo de alocacao da segunda dimensao da matrix */
   for (row = 0; row < target; row++) {
       if ((matrix[row] = malloc(target * sizeof(long))) == NULL) {
           /* libertar a memoria ja alocada */
           for (delrow = 0; delrow < row; delrow++)
               free(matrix[delrow]);
           free(matrix);

           printf("Error allocating memory\n");
           return -1;
       }
   }

   /* ciclo de calculo do triangulo de Pascal */
   max = 1;
   for(row = 0; row < target; row++) {
       matrix[row][0] = 1;
       for (column = 1; column <= row; column++) {
           matrix[row][column] = matrix[row - 1][column - 1] + matrix[row - 1][column];
           max = (matrix[row][column] > max ? matrix[row][column] : max);
       }
   }

   /* ciclo de determinacao do numero de espacos necessarios para apresentar o triangulo calculado */
   column = 0;
   while (max != 0)
   {
       column++;
       max /= 10;
   }

   /* criação do formato de apresentacao dos numeros */
   sprintf(format, "%%%dld ", column);

   /* ciclo de apresentacao do triangulo */
   for(row = 0; row < target; row++) {
       for (column = 0; column <= row; column++)
           printf(format, matrix[row][column]);
       printf("\n");
   }

   /* libertar a memoria alocada */
   for (row = 0; row < target; row++)
       free(matrix[row]);
   free(matrix);

   return 0;
}

  • Voto 1

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
telele97

visto já teres o principal do trabalho feito, vou apresentar o sniplet que tenho de criação do triângulo de Pascal:

Essa forma para apresentar os espaços esta muito bem pensada.

Quando tens

(matrix[row][column] > max ? matrix[row][column] : max);

o ponto de interogação faz o que aqui?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

o que está a "acontecer" é uma operação chamada ternária

este é o modelo do código :

<condição> ? <verdadeiro> : <falso>

o componente <condição> é avaliado como se fosse o argumento de um if

caso seja verdadeiro, o componente <verdadeiro> é executado, caso contrário será o <falso>

no entanto, tem uma vantagem significativa em relação ao if. é que o resultado da execução dos componentes <verdadeiro> ou <falso> pode ser usado.

é essa a razão do porque da linha :

max =                            // max irá ficar com o valor de retorno do operador ternario
    (
     matrix[row][column] > max  // se o valor calculado for maior que o valor da variavel "max"
     ?                          // inicio da condicao <verdadeiro>
     matrix[row][column]        // o resultado da operacao ternaria e o valor calculado
     :                          // inicio da condicao <falso>
     max                        // o resultado da operacao ternaria e o valor de max
    );

// conclusao do codigo apresentado : a variavel max tera o maior valor dos dois

nota que o componente <verdadeiro> ou o <falso> pode ser qualquer coisa que retorne um valor, como a chamada de uma função

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.