Jump to content

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


telele97
 Share

Recommended Posts

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;
}
Link to comment
Share on other sites

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 😄

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 comment
Share on other sites

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?

Edited by apocsantos
Link to comment
Share on other sites

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

Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

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().

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 comment
Share on other sites

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]);
}
Edited by pmg
extra bold; falta LP
Link to comment
Share on other sites

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! */
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 comment
Share on other sites

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;
}
  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

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?

Link to comment
Share on other sites

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

Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
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.