Ver Mensaje Individual
  #11 (permalink)  
Antiguo 08/11/2012, 01:27
Avatar de rodrigoemece
rodrigoemece
 
Fecha de Ingreso: septiembre-2011
Mensajes: 68
Antigüedad: 13 años, 3 meses
Puntos: 1
Respuesta: Problema en el cálculo del mínimo de un fichero

Cita:
Iniciado por ecfisa Ver Mensaje
No, en absoluto.
Uno de los motivos es que inicializas variables globales dentro del ciclo do/while.


Funciona el máximo por que quitaste la variable mx desde dentro del do/while, y no funciona el mínimo por que lo estabas incializando a cero y luego no encontraba valor menor para efectuar el reemplazo. La variable mn, tiene que ser inicializada a un valor mayor al mayor de los datos, para que al compararlo, pueda tomar por menor a qualquiera de ellos. Del mismo modo la variable mx debe tomar un valor menor al menor valor esperado.

Por otro lado, aunque no afecta el funcionamiento, el arreglo de enteros v es innecesario, al igual que el tercer parámetro de la función med.

El codigo podria quedar así:
Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. #define LNX 99999
  4.  
  5. float mx=0, mn=LNX, me=0;
  6.  
  7. float max(float);
  8. float min(float);
  9. float med(float,int);
  10.  
  11. main(){
  12.   int v, i=0, z=1;
  13.   float ma=0, mi=0, md=0;
  14.   FILE *fp;
  15.  
  16.   fp = fopen("doc.txt","rt");
  17.   if(fp==NULL) {
  18.     printf("Erro na apertura do arquivo.\n");
  19.     exit(1);
  20.   } // El operador [B]else[/B] es innecesario, sale por exit
  21.   do{
  22.     fscanf(fp,"%d",&v);
  23.     if (feof(fp)!=0 || i>=LNX) z=i+1;
  24.     ma=max(v);
  25.     mi=min(v);
  26.     md=med(v,z);
  27.     i++;
  28.   }while(feof(fp)==0 && i<LNX);
  29.   printf("O maximo do arquivo e: %f\n", ma);
  30.   printf("O minimo do arquivo e: %f\n", mi);
  31.   printf("A media do arquivo e: %f\n", md);
  32.   fclose(fp);
  33.   getchar();
  34. }
  35.  
  36. float max(float vec) {
  37.   if (vec>mx) mx = vec;
  38.     return mx;
  39. }
  40.  
  41. float min(float vec) {
  42.   if (vec<mn) mn = vec;
  43.     return mn;    
  44. }
  45.  
  46. float med(float vec, int x) {
  47.   me = (me + vec)/x;
  48.     return me;
  49. }
Para detectar los fallos es muy útil hacer una prueba de escritorio sobre el código.

Saludos.
Muchísimas gracias por explicarlo :)