telele97 Posted December 28, 2012 at 11:49 PM Report #488899 Posted December 28, 2012 at 11:49 PM 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; }
NunoDinis Posted December 28, 2012 at 11:58 PM Report #488901 Posted December 28, 2012 at 11:58 PM Se a tua dúvida é de pascal, porque publicaste na secção de C ? 1 Report Estranha forma de vida que tem a capacidade de transformar comandos em mensagens de erro. ndsotware.org
pmg Posted December 29, 2012 at 12:02 AM Report #488902 Posted December 29, 2012 at 12:02 AM (edited) 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 December 29, 2012 at 12:03 AM 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!
telele97 Posted December 29, 2012 at 12:18 AM Author Report #488904 Posted December 29, 2012 at 12:18 AM (edited) 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 December 29, 2012 at 12:27 AM by apocsantos
HappyHippyHippo Posted December 29, 2012 at 12:21 AM Report #488905 Posted December 29, 2012 at 12:21 AM (edited) 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 December 29, 2012 at 12:08 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
pmg Posted December 29, 2012 at 12:22 AM Report #488906 Posted December 29, 2012 at 12:22 AM (edited) 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 December 29, 2012 at 12:26 AM 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!
NunoDinis Posted December 29, 2012 at 12:22 AM Report #488907 Posted December 29, 2012 at 12:22 AM Está boa 🙂 Desculpem... Estranha forma de vida que tem a capacidade de transformar comandos em mensagens de erro. ndsotware.org
telele97 Posted December 29, 2012 at 12:24 AM Author Report #488908 Posted December 29, 2012 at 12:24 AM 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 ?
HappyHippyHippo Posted December 29, 2012 at 12:26 AM Report #488910 Posted December 29, 2012 at 12:26 AM 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 Portugol Plus
telele97 Posted December 29, 2012 at 04:09 PM Author Report #488930 Posted December 29, 2012 at 04:09 PM (edited) 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 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 December 29, 2012 at 04:15 PM by pmg extra bold; falta LP
pmg Posted December 29, 2012 at 04:19 PM Report #488931 Posted December 29, 2012 at 04:19 PM (edited) 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 December 29, 2012 at 04:19 PM 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!
HappyHippyHippo Posted December 29, 2012 at 04:53 PM Report #488934 Posted December 29, 2012 at 04:53 PM 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; } 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
telele97 Posted December 29, 2012 at 05:24 PM Author Report #488937 Posted December 29, 2012 at 05:24 PM 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?
HappyHippyHippo Posted December 29, 2012 at 05:37 PM Report #488939 Posted December 29, 2012 at 05:37 PM (edited) 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 December 29, 2012 at 05:38 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now