Jump to content

[Resolvido] Problema a achar a média


Recommended Posts

Posted

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);
 }
}
}
Posted (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 by pedrosorio

Não respondo a dúvidas por mensagem.

Posted

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

Posted

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.

Posted (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 by pedrosorio

Não respondo a dúvidas por mensagem.

Posted

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 !

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
×
×
  • 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.