dramos21 Posted December 16, 2012 at 09:07 PM Report #487414 Posted December 16, 2012 at 09:07 PM (edited) Boa noite pessoal, eu estou a fazer um trabalho sobre polinomios e gostava de ter a vossa ajuda. É assim, eu tenho um polinomio, e fiz uma funcao para calcular os pontos de 1 a 20 nesse polinomio. Desenvolvi uma funcao para fazer isso e fiz um ciclo para percorrer esses 20 pontos de valor 1 a 20. os primeiros dois pontos têm o valor correcto, a partir do 3, começa a aumentar duma maneira que eu nao percebo o valor. paplica é o vector onde vao ficar guardados os valores para cada ponto. k é o grau do polinomio. na main chamei a funcao, e fiz apenas o ciclo de 1 a 20 para imprimir o ponto com o valor calculado à frente para cada um. void aplicaP2(double p[],double paplica[], int k) { int i,j; double termoX=1.0; for(j=1; j<=20; j++){ for(i=0; i<= k; i++){ paplica[j]=paplica[j] + p[i]*termoX; termoX=termoX*j; } } return; } Se me conseguirem ajudar de alguma maneira, Desde já obrigado. Edited December 16, 2012 at 09:15 PM by pmg Falta LP
HappyHippyHippo Posted December 16, 2012 at 09:17 PM Report #487416 Posted December 16, 2012 at 09:17 PM tu não disseste qual é o polinómio que queres codificar IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
pmg Posted December 16, 2012 at 09:18 PM Report #487417 Posted December 16, 2012 at 09:18 PM O primeiro elemento de cada array tem o indice 0. No teu snippet, o elemento com indice 0 do array paplica[] nao esta a ser utilizado. 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!
dramos21 Posted December 16, 2012 at 09:19 PM Author Report #487418 Posted December 16, 2012 at 09:19 PM Como assim codificar? eu peço ao utilizador um conjunto de valores para formar um polinomio. na funcao corresponde ao p[k]. e o vector paplica guarda o valor de cada ponto de 1 a 20 aplicado a esse polinomio. nao sei se te ajudei a perceber.
pmg Posted December 16, 2012 at 09:20 PM Report #487419 Posted December 16, 2012 at 09:20 PM Por exemplo, o polinomio "-3*x^6 + x^2 -100x + 4", como e que o codificas? Qual o resultado que esperas obter dos 20 valores??? 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 16, 2012 at 09:21 PM Report #487420 Posted December 16, 2012 at 09:21 PM (edited) Como assim codificar? eu peço ao utilizador um conjunto de valores para formar um polinomio. na funcao corresponde ao p[k]. e o vector paplica guarda o valor de cada ponto de 1 a 20 aplicado a esse polinomio. nao sei se te ajudei a perceber. fizeste, obrigada. Por exemplo, o polinomio "-3*x^6 + x^2 -100x + 4", como e que o codificas? parece que seja : {4, -100, 1, 0, 0, 0, -3, 0, ...} Edited December 16, 2012 at 09:23 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
dramos21 Posted December 16, 2012 at 09:28 PM Author Report #487421 Posted December 16, 2012 at 09:28 PM pmg, faço isso porque eu quero calcular os pontos de 1 a 20. eu uso em termoX=termoX*j o valor de 1 a 20. se iniciasse a 0, automaticamente dava zero para tudo. mas por exemplo. se eu iniciar o vector com 20 elementos e for de 1 a 20, a posicao 20 nao vai existir ainda assim? pmg, para quando o ponto é 1, quero obter o valor -98 para esse polinomio que disseste. que é substituindo o x por 1. HappyHippy nao consegui perceber a resposta que deste ao que o pmg disse, onde foste buscar esses valores? para x=1 quero um valor, para x=2 quero outro, e assim sucessivamente até 20.
HappyHippyHippo Posted December 16, 2012 at 09:29 PM Report #487422 Posted December 16, 2012 at 09:29 PM (edited) vou ver se percebi ao apresentar uma solução usando o polinómio perguntado pelo @pmg #include <math.h> // p = {4, -100, 1, 0, 0, 0, -3, 0, ...} // k = 6 void aplicaP2(double p[],double paplica[], int k) { int i,j; for(j=1; j<=20; j++){ // para X de 1 a 20 paplica[j-1] = 0,0; for(i=0; i<= k; i++){ // para cada Xi paplica[j-1] += p[i] * pow(j, i); // p[i] = Ai e pow(j, i) = X^i, para X = j } } return; } é isso ? Edited December 16, 2012 at 09:30 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
dramos21 Posted December 16, 2012 at 09:39 PM Author Report #487423 Posted December 16, 2012 at 09:39 PM Hippy, sim percebi a tua maneira de fazeres, possivelmente mais simples e facil de entender que a minha. vou testá-la. já te digo se consegui que resultasse ou nao. Obrigado! Funciona perfeitamente, agradeço-te HappyHippy e pmg pela ajuda.
HappyHippyHippo Posted December 16, 2012 at 09:52 PM Report #487427 Posted December 16, 2012 at 09:52 PM (edited) se está correcto, então o melhor que farias era a técnica de dividir para conquistar, isto porque como verás dar-te-á a possibilidade de reutilização de código: double calc_pol(double X, double coef[], int grau) { int i = 0; double result = 0.0; for (i = 0; i <= grau; i++) // de X0 a Xgrau result += coef[i] * pow(X, i); return result; } void calc_pol_1_a_20(double coef[], int grau, double results[]) { int i; for (i = 1; i <= 20; i++) results[i] = calc_pol(i, ceof, grau); } Edited December 16, 2012 at 09:55 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
dramos21 Posted December 16, 2012 at 11:15 PM Author Report #487445 Posted December 16, 2012 at 11:15 PM sim sim, eu ja tinha feito isso mesmo que meteste aí. Essa parte do meu trabalho felizmente já está resolvida. Só me falta uma parte para acabar todo o trabalho e não consigo sair dali. é simplesmente um printf que nao consigo fazer. Tendo os valores do polinomio por exemplo: p=[0, 2, 3, 0, 0, 1]; 0 + 2x + 3x^2 + 0x^3 + 0x^4 + x^5, tenho que fazer um printf do tipo: 2 x**1 + 3 x**2 + x**5. em que os valores que têm zero nao devem comparecer. mas o meu problema não é esse. é os '+' . tipo: printf("%f x** %d + "); tendo em conta que o ultimo termo nao vai ter um +. e o facto de os que tem 0 tambem nao aparecerem +
HappyHippyHippo Posted December 17, 2012 at 08:40 AM Report #487457 Posted December 17, 2012 at 08:40 AM isso já é outra questão o que necessitas ter é para i de grau a 1 se coeficiente for diferente de 0 então apresenta termo apresenta termo de grau 0 IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
dramos21 Posted December 17, 2012 at 10:33 AM Author Report #487470 Posted December 17, 2012 at 10:33 AM Sim, o que esse codigo que me mostraste faz é apenas mostrar os valores que sao diferentes de 0 certo? eu tenho tambem que imprimir a posicao desse mesmo vector, que corresponde ao grau daqueles que sao diferentes de 0. os que são iguais a 0 não vêm para a formula. o problema é eu ter que apresentar uma formula. consigo imprimir cada valor diferente de 0 , tipo: 2 x**1 3 x**4 5x**6 mas para meter os "+" entre cada valor, é que eu nao consigo.
HappyHippyHippo Posted December 17, 2012 at 10:35 AM Report #487471 Posted December 17, 2012 at 10:35 AM apresenta o código que já fizeste IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
dramos21 Posted December 17, 2012 at 10:43 AM Author Report #487472 Posted December 17, 2012 at 10:43 AM (edited) Entao o que eu tenho, é uma funcao que imprime a Formula, visto que preciso de usar a Formula varias vezes. void imprimeFormula(double p[], int k[]) { int i; for (i = 0; i < k; i++) { if (p[i] != 0) { printf(" %f x** %d + ", p[i], i); } else { printf(" "); } } return; } Este codigo nao faz muito sentido, mas eu nao o consigo por de maneira certa. Edited December 17, 2012 at 10:55 AM by pmg Falta LP; indentacao; chavetas
HappyHippyHippo Posted December 17, 2012 at 11:01 AM Report #487476 Posted December 17, 2012 at 11:01 AM /** * Função de apresentação de um polinómio. * * exemplo: * p = {10, -20, 0, 0, 50} * k = 4 * * output = +50.00 x**4 -20.00 x**1 +10.00 * * @param p Array com os coeficentes do polinómio codificados de grau 0 até N, por esta ordem * @param k Grau do polinómio a ser apresentado */ void imprimePolinomio(double p[], int k) { int i; /* ciclo de itera de grau até 0 inclusivé */ for(i=k; i>=0; i--) { /* verificar se o coeficiente é diferente de 0 */ if(p[i] != 0) { /* verificar se é para apresentar o de grau 0, porque este não apresente o x**0 */ if (i != 0) { /* apresentar o copmponente do polinómio */ printf("%c%.2f x**%d ", // formato do componente a ser apresentado p[i] < 0 ? ' ' : '+', // apresentar o caracter '+' se o coeficiente for positivo p[i], // apresentar o coeficiente (absoluto para remover o sinal) i); // apresentar o grau } else { printf("%c%.2f", // formato do componente a ser apresentado p[i] < 0 ? ' ' : '+', // apresentar o caracter '+' se o coeficiente for positivo p[i]); // apresentar o coeficiente (absoluto para remover o sinal) } } } printf("\n"); return; } IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
dramos21 Posted December 17, 2012 at 11:15 AM Author Report #487478 Posted December 17, 2012 at 11:15 AM Ok, não tinha sequer pensado em strings, foi isso que usaste para os + certo? ainda não estou muito dentro do assunto porque achava nem ser preciso para este trabalho que estou a fazer. esclarece-me só o que faz os ? e o : quando apresentas o caracter +. Pelo que percebi, p<0 ? ' ' faz que se o numero for menor que 0 nao imprime nada porque o proprio numero ja tem o sinal - . e o : é caso p>0 , para imprimir o +.
HappyHippyHippo Posted December 17, 2012 at 11:16 AM Report #487480 Posted December 17, 2012 at 11:16 AM (edited) Ok, não tinha sequer pensado em strings, foi isso que usaste para os + certo? nop, são caracteres. vê que o delimitador é um apóstrofe e não aspas. "string" <---- string 'c' <---- caracter (só pode ter um elemento dentro dos delimitadores) são muito diferentes !!! tem cuidado !!! esclarece-me só o que faz os ? e o : quando apresentas o caracter +. isso é o que se chama um operador ternário é como se fosse um if, mas como é um operador, devolve um valor o significado é este: <resultado> = (<condição> ? <verdadeiro> : <falso>) a <condição> é uma instrução que será avaliada como se fosse o argumento de um if agora o interessante é que o <verdadeiro> e o <falso> podem ser um conjunto de instruções que poderam ser usadas como resultado exemplo : if (idade >= 18) pode_beber = "tudo"; else pode_beber = "agua"; // isto é a mesma coisa que pode_beber = idade >= 18 ? "tudo" : "agua"; // para se ler melhor : pode_beber = (idade >= 18 ? "tudo" : "agua"); ps : não é obrigatório usar o resultado do operador !! exemplo: idade >= 18 ? entra_no_bar_strip() : chamar_a_policia(); Edited December 17, 2012 at 11:17 AM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
dramos21 Posted December 17, 2012 at 11:21 AM Author Report #487481 Posted December 17, 2012 at 11:21 AM certo, consegui entender, agora não consigo testar no meu trabalho porque estou num computador onde nao tenho nenhum compilador. Assim que tenha acesso, vou adaptar o que me deste ao meu trabalho e logo te direi se resultou, mas deverá resultar. Obrigado por me teres tirado as duvidas que tinha.
dramos21 Posted December 17, 2012 at 09:25 PM Author Report #487569 Posted December 17, 2012 at 09:25 PM consegui exactamente igual ao que reproduziste no que me mostraste. Obrigado. Quando compilo o trabalho e depois o executo ele demora um bocado, não penso que seja normal, acho que me está a usar memoria a mais quando o executo, o que é que dá para melhorar no trabalho para que isso seja reduzido?
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