Dulthis Posted May 15, 2012 at 05:56 PM Report #455825 Posted May 15, 2012 at 05:56 PM Boa tarde! Estou a desenvolver um trabalho onde tenho que achar a media dos valores de um determinado ficheiro. O problema é o seguinte: O ficheiro abre bem e o código parece estar correcto mas por alguma razão quando vai a achar a média divide duas vezes pelo numero de elementos... O código é o seguinte: { float soma, media; int i=0; for(i=0;i<N;i++) { if(a[i].RR_Bj > -999.9 && a[i].RR_Bg > -999.9 && a[i].RR_Lb > -999.9 && a[i].RR_Pt > -999.99) { soma=a[i].RR_Bj+a[i].RR_Bg+a[i].RR_Lb+a[i].RR_Pt; media=soma/4; printf("A media e de %f\n", media); } if(a[i].RR_Bj == -999.9 && a[i].RR_Bg > -999.9 && a[i].RR_Lb > -999.9 && a[i].RR_Pt > -999.99) { soma=a[i].RR_Bg+a[i].RR_Lb+a[i].RR_Pt; media=soma/3; printf("A media e de %f\n", media); } if(a[i].RR_Bj > -999.9 && a[i].RR_Bg == -999.9 && a[i].RR_Lb > -999.9 && a[i].RR_Pt > -999.99) { soma=a[i].RR_Bj+a[i].RR_Lb+a[i].RR_Pt; media=soma/3; printf("A media e de %f\n", media); } if(a[i].RR_Bj > -999.9 && a[i].RR_Bg > -999.9 && a[i].RR_Lb == -999.9 && a[i].RR_Pt > -999.99) { soma=a[i].RR_Bj+a[i].RR_Lb+a[i].RR_Pt; media=soma/3; printf("A media e de %f\n", media); } if(a[i].RR_Bj > -999.9 && a[i].RR_Bg > -999.9 && a[i].RR_Lb > -999.9 && a[i].RR_Pt == -999.99) { soma=a[i].RR_Bj+a[i].RR_Lb+a[i].RR_Bg; media=soma/3; printf("A media e de %f\n", media); } if(a[i].RR_Bj == -999.9 && a[i].RR_Bg == -999.9 && a[i].RR_Lb > -999.9 && a[i].RR_Pt > -999.99) { soma=a[i].RR_Lb+a[i].RR_Pt; media=soma/2; printf("A media e de %f\n", media); } if(a[i].RR_Bj == -999.9 && a[i].RR_Bg > -999.9 && a[i].RR_Lb == -999.9 && a[i].RR_Pt > -999.99) { soma=a[i].RR_Bg+a[i].RR_Pt; media=soma/2; printf("A media e de %f\n", media); } if(a[i].RR_Bj == -999.9 && a[i].RR_Bg > -999.9 && a[i].RR_Lb > -999.9 && a[i].RR_Pt == -999.99) { soma=a[i].RR_Bg+a[i].RR_Lb; media=soma/2; printf("A media e de %f\n", media); } if(a[i].RR_Bj > -999.9 && a[i].RR_Bg == -999.9 && a[i].RR_Lb == -999.9 && a[i].RR_Pt > -999.99) { soma=a[i].RR_Bj+a[i].RR_Pt; media=soma/2; printf("A media e de %f\n", media); } if(a[i].RR_Bj > -999.9 && a[i].RR_Bg == -999.9 && a[i].RR_Lb > -999.9 && a[i].RR_Pt == -999.99) { soma=a[i].RR_Bj+a[i].RR_Lb; media=soma/2; printf("A media e de %f\n", media); } if(a[i].RR_Bj > -999.9 && a[i].RR_Bg > -999.9 && a[i].RR_Lb == -999.9 && a[i].RR_Pt == -999.99) { soma=a[i].RR_Bj+a[i].RR_Bg; media=soma/2; printf("A media e de %f\n", media); } if(a[i].RR_Bj > -999.9 && a[i].RR_Bg == -999.9 && a[i].RR_Lb == -999.9 && a[i].RR_Pt == -999.99) { media=a[i].RR_Bj; printf("A media e de %f\n", media); } if(a[i].RR_Bj == -999.9 && a[i].RR_Bg > -999.9 && a[i].RR_Lb == -999.9 && a[i].RR_Pt == -999.99) { media=a[i].RR_Bg; printf("A media e de %f\n", media); } if(a[i].RR_Bj == -999.9 && a[i].RR_Bg == -999.9 && a[i].RR_Lb > -999.9 && a[i].RR_Pt == -999.99) { media=a[i].RR_Lb; printf("A media e de %f\n", media); } if(a[i].RR_Bj == -999.9 && a[i].RR_Bg == -999.9 && a[i].RR_Lb == -999.9 && a[i].RR_Pt > -999.99) { media=a[i].RR_Pt; printf("A media e de %f\n", media); } } }
pedrosorio Posted May 15, 2012 at 07:47 PM Report #455862 Posted May 15, 2012 at 07:47 PM (edited) Para achar uma média a melhor maneira que arranjas é pôr N if's em sequência? É muito complexo e pouco elegante. Em primeiro lugar, devo alertar-te para o facto de que comparar números de floating point exatamente não é boa ideia e deves sempre usar uma tolerância. Não sei porque é que estás a usar -999.9 ou -999.99 (em RR_Pt usas a segunda), mas não podes usar simplesmente -1000? De qualquer forma, aquilo que tu queres é fazer a média das variáveis maiores que -1000, entre a.RR_Bj, a.RR_Bg, a .RR_Lb e a .RR_Pt. Isso pode ser feito muito facilmente: float vars[4],soma,media; int num=0; if(a[i].RR_Bj > -1000) vars[num++]=a[i].RR_Bj; if(a[i].RR_Bg > -1000) vars[num++]=a[i].RR_Bg; if(a[i].RR_Lb > -1000) vars[num++]=a[i].RR_Lb; if(a[i].RR_Pt > -1000) vars[num++]=a[i].RR_Pt; int k; for(k=0;k<num;k++) soma += vars[k]; if(num>0) { media=soma/num; printf("A media e de %f\n", media); } else printf("Nao existe nenhum elemento > -1000\n"); Repara que em primeiro lugar verificamos se queremos usar cada uma das variáveis para fazer a média (e contamos quantas variáveis estamos a usar, fazendo num++) e depois sim calculamos a média. Muito mais simples, em vez de estar a ver as hipóteses todas. Edited May 15, 2012 at 08:23 PM by pedrosorio Não respondo a dúvidas por mensagem.
KTachyon Posted May 15, 2012 at 07:56 PM Report #455868 Posted May 15, 2012 at 07:56 PM Eu vou alertar duas outras coisas: 1. O teu código é... feio. Há formas mais eficazes de desenvolveres este algoritmo sem estares a fazer as comparações de todos os casos 1 a 1. 2. Estas a colocar ifs seguidos de ifs. Se te tiveres enganado numa comparação, podes facilmente cair em duas condições distintas. Este problema é directamente afectado pelo facto de estares a fazer comparações para todos os casos. “There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.” -- Tony Hoare
Dulthis Posted May 15, 2012 at 08:00 PM Author Report #455871 Posted May 15, 2012 at 08:00 PM As variáveis não são 4, é 1 ficheiro Excel com 8036 linhas, onde tenho que achar a media de precipitação (RR_"cidade" onde são 4 cidades). A prof disse para usar o -999.99 para os valores q são lixo (0 ou não existem no ficheiro) para contar só com os valores reais e fazendo assim todas as hipóteses possíveis eliminando assim esse "lixo". Desde já peço desculpa se estou errado (ainda estou a aprender), só fiz de acordo como a prof. disse para fazermos.
HappyHippyHippo Posted May 15, 2012 at 08:06 PM Report #455878 Posted May 15, 2012 at 08:06 PM meu deus .. duas veias estoiraram quando vi o código !!! IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
pedrosorio Posted May 15, 2012 at 08:26 PM Report #455885 Posted May 15, 2012 at 08:26 PM (edited) As variáveis não são 4, é 1 ficheiro Excel com 8036 linhas, onde tenho que achar a media de precipitação (RR_"cidade" onde são 4 cidades). A prof disse para usar o -999.99 para os valores q são lixo (0 ou não existem no ficheiro) para contar só com os valores reais e fazendo assim todas as hipóteses possíveis eliminando assim esse "lixo". Desde já peço desculpa se estou errado (ainda estou a aprender), só fiz de acordo como a prof. disse para fazermos. Peço desculpa mas eu limitei-me a ler o teu código. De acordo com o que disseste agora, estás a fazer a média de precipitação nas 4 cidades para a i-ésima medição (que é o que está no código que escrevi acima). Agora que dizes isso, presumo que queiras, isso sim, calcular a média de precipitação em cada cidade, usando todas as medições. Podes fazer isso também com um ciclo para cada cidade. Em relação à sugestão que a tua professora fez, para já valor 0 de precipitação deve ser deixado a 0 (significa que não existe precipitação), se não existem no ficheiro podes usar um valor que indique isso, mas -999.99 parece-me uma escolha estranha. Por que não usar -1? Quando estás a calcular a média basta-te testar se o valor é maior que 0, e caso seja, adicioná-lo à variável soma. Edited May 15, 2012 at 08:26 PM by pedrosorio Não respondo a dúvidas por mensagem.
Dulthis Posted May 15, 2012 at 08:57 PM Author Report #455898 Posted May 15, 2012 at 08:57 PM Peço desculpa mas eu limitei-me a ler o teu código. De acordo com o que disseste agora, estás a fazer a média de precipitação nas 4 cidades para a i-ésima medição (que é o que está no código que escrevi acima). Agora que dizes isso, presumo que queiras, isso sim, calcular a média de precipitação em cada cidade, usando todas as medições. Podes fazer isso também com um ciclo para cada cidade. Em relação à sugestão que a tua professora fez, para já valor 0 de precipitação deve ser deixado a 0 (significa que não existe precipitação), se não existem no ficheiro podes usar um valor que indique isso, mas -999.99 parece-me uma escolha estranha. Por que não usar -1? Quando estás a calcular a média basta-te testar se o valor é maior que 0, e caso seja, adicioná-lo à variável soma. Exacto, estive a experimentar e pus o valor 0 em vez do -999.9 e deixou de dar problemas... Problema resolvido. 🙂 Obrigado a todos !
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