Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema en el cálculo del mínimo de un fichero

Estas en el tema de Problema en el cálculo del mínimo de un fichero en el foro de C/C++ en Foros del Web. El programa se encarga de abrir un fichero de texto y calcular de entre sus elementos, el máximo, el mínimo y la media de ellos. ...
  #1 (permalink)  
Antiguo 06/11/2012, 12:44
Avatar de rodrigoemece  
Fecha de Ingreso: septiembre-2011
Mensajes: 68
Antigüedad: 12 años, 7 meses
Puntos: 1
Exclamación Problema en el cálculo del mínimo de un fichero

El programa se encarga de abrir un fichero de texto y calcular de entre sus elementos, el máximo, el mínimo y la media de ellos. El problema aparece al calcular el máximo exclusivamente. La respuesta por pantalla siempre resulta ser el primer elemento del fichero y no entiendo por qué. Muchas gracias por vuestra ayuda.

doc.txt
Código:
45 32 332 89 1
main.c
Código:
/* 
 * Nome:      Exercicio 1
 * Arquivo:   main.c
 * Autor:     Rodrigo M.
 * Data:      06 de Novembro de 2012
 */

#include <stdio.h>
#include <stdlib.h>
#define LNX 99999

float mx=0, mn=0, me=0; 

float max(float);
float min(float);
float med(float,int,int);

main(){
int v[LNX], i=0, z=1;
float ma=0, mi=0, md=0; 

FILE *fp;
fp = fopen("doc.txt","rt");
if(fp==NULL){
    printf("Erro na apertura do arquivo.\n");
    exit(1);
}

else{
    
 do{
   fscanf(fp,"%d",&v[i]);
   mn=v[0];
   mx=v[0];
   
   if (feof(fp)!=0 || i>=LNX) z=i+1;
   ma=max(v[i]);
   mi=min(v[i]);
   md=med(v[i],i,z);
   i++;  
    }while(feof(fp)==0 && i<LNX);
          
    printf("O maximo do arquivo e: %f\n", ma);
    printf("O minimo do arquivo e: %f\n", mi);
    printf("A media do arquivo e: %f\n", md);
     }
  fclose(fp);
      }

float max(float vec)
{
    if (vec>mx) mx = vec;              
    return mx;
}

float min(float vec)
{
    if (vec<mn) mn = vec;              
    return mn;    
}

float med(float vec, int a, int x)
{
    me = (me + vec)/x;
    return me;
}
Output
Código:
O maximo do arquivo e: 45.000000
O minimo do arquivo e: 1.000000
A media do arquivo e: 99.800003

RUN SUCCESSFUL (total time: 11ms)
  #2 (permalink)  
Antiguo 06/11/2012, 18:29
Avatar de cotolon  
Fecha de Ingreso: octubre-2012
Mensajes: 55
Antigüedad: 11 años, 6 meses
Puntos: 10
Respuesta: Problema en el cálculo del mínimo de un fichero

Puede ser que el error esté en el .txt
Porque tu tienes los números así:

45 32 332 89 1

Tal vez funcione si los tienes así:

45
32
332
89
1

Fíjate en eso, si no es eso entonces no lo sé, aún no veo ficheros xd
  #3 (permalink)  
Antiguo 07/11/2012, 01:59
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 3 meses
Puntos: 89
Respuesta: Problema en el cálculo del mínimo de un fichero

Depura y vete viendo que valores te lee del archivo.
  #4 (permalink)  
Antiguo 07/11/2012, 04:50
 
Fecha de Ingreso: julio-2012
Mensajes: 133
Antigüedad: 11 años, 9 meses
Puntos: 22
Respuesta: Problema en el cálculo del mínimo de un fichero

Hola.

Creo que te estas complicando mucho, el código puede ser mucho más simple:
Código C:
Ver original
  1. #include <stdio.h>
  2. #define MAX 99999
  3.  
  4. int main(){
  5.   int v[MAX], i=0;
  6.   float ma=-MAX, mi=MAX, md=0;
  7.   FILE *fp = fopen("doc.txt", "rt");
  8.  
  9.   if(fp==NULL){
  10.     printf("Error abriendo el archivo.\n");
  11.     exit(1);
  12.   }
  13.   while(!feof(fp)){
  14.     fscanf(fp, "%d", &v[i]);
  15.     if(v[i] > ma) ma = v[i];
  16.     if(v[i] < mi) mi = v[i];
  17.     md += v[i++];
  18.   }
  19.   fclose(fp);
  20.   printf("Numero mayor: %8.3f\n", ma);
  21.   printf("Numero menor: %8.3f\n", mi);
  22.   printf("Promedio    : %8.3f\n", md/i);
  23.   return 0;
  24. }

Saludos.
  #5 (permalink)  
Antiguo 07/11/2012, 06:34
Avatar de rodrigoemece  
Fecha de Ingreso: septiembre-2011
Mensajes: 68
Antigüedad: 12 años, 7 meses
Puntos: 1
Respuesta: Problema en el cálculo del mínimo de un fichero

A ver, creo que el problema creo que está en que metí el cálculo de las funciones del main dentro del bucle. El programa que dice ecfisa es idóneo, lo que pasa es que tengo la obligación de crearlo con tres funciones que calculen los tres valores. Muchas gracias a los tres :) reposteo el código cuando lo solucione!
  #6 (permalink)  
Antiguo 07/11/2012, 06:39
Avatar de rodrigoemece  
Fecha de Ingreso: septiembre-2011
Mensajes: 68
Antigüedad: 12 años, 7 meses
Puntos: 1
Respuesta: Problema en el cálculo del mínimo de un fichero

pfff nadie ve qué problema hay en la función max? :/
  #7 (permalink)  
Antiguo 07/11/2012, 06:48
Avatar de rodrigoemece  
Fecha de Ingreso: septiembre-2011
Mensajes: 68
Antigüedad: 12 años, 7 meses
Puntos: 1
Respuesta: Problema en el cálculo del mínimo de un fichero

Así me funciona el máximo pero no el mínimo, pero no entiendo por qué :S (Cambios en líneas 23 y 26)

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define LNX 99999
  4.  
  5. float mx=0, mn=0, me=0;
  6.  
  7. float max(float);
  8. float min(float);
  9. float med(float,int,int);
  10.  
  11. main(){
  12. int v[LNX], i=0, z=1;
  13. float ma=0, mi=0, md=0;
  14.  
  15. FILE *fp;
  16. fp = fopen("doc.txt","rt");
  17. if(fp==NULL){
  18.     printf("Erro na apertura do arquivo.\n");
  19.     exit(1);
  20. }
  21.  
  22. else{
  23. mx=v[0];
  24.  do{
  25.    fscanf(fp,"%d",&v[i]);
  26.    mn=v[0];
  27.  
  28.    if (feof(fp)!=0 || i>=LNX) z=i+1;
  29.    ma=max(v[i]);
  30.    mi=min(v[i]);
  31.    md=med(v[i],i,z);
  32.    i++;  
  33.     }while(feof(fp)==0 && i<LNX);
  34.          
  35.     printf("O maximo do arquivo e: %f\n", ma);
  36.     printf("O minimo do arquivo e: %f\n", mi);
  37.     printf("A media do arquivo e: %f\n", md);
  38.      }
  39.   fclose(fp);
  40.       }
  41.  
  42.  
  43. float max(float vec)
  44. {
  45.     if (vec>mx) mx = vec;              
  46.     return mx;
  47. }
  48.  
  49. float min(float vec)
  50. {
  51.     if (vec<mn) mn = vec;              
  52.     return mn;    
  53. }
  54.  
  55. float med(float vec, int a, int x)
  56. {
  57.     me = (me + vec)/x;
  58.     return me;
  59. }

Última edición por rodrigoemece; 07/11/2012 a las 07:16
  #8 (permalink)  
Antiguo 07/11/2012, 08:18
 
Fecha de Ingreso: julio-2012
Mensajes: 133
Antigüedad: 11 años, 9 meses
Puntos: 22
Respuesta: Problema en el cálculo del mínimo de un fichero

Hola rodrigoemece.

Proba de este modo:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define MAX 99999
  5.  
  6. float max(int *, int);
  7. float min(int *, int);
  8. float med(int *, int);
  9.  
  10. void main(){
  11.   int v[MAX], i=0;
  12.  
  13.   FILE *fp;
  14.   fp = fopen("C:\\TMP\\doc.txt","rt");
  15.   if(fp==NULL){
  16.     printf("Error abriendo el archivo.\n");
  17.     exit(1);
  18.   }
  19.   while(!feof(fp)) fscanf(fp, "%d", &v[i++]);
  20.   fclose(fp);
  21.   printf("Numero mayor: %8.3f\n", max(v,i));
  22.   printf("Numero menor: %8.3f\n", min(v,i));
  23.   printf("Promedio    : %8.3f\n", med(v,i));
  24.   getchar();
  25. }
  26.  
  27. float max(int *v, int n) {
  28.   int i,mx=0;
  29.   for(i=0;i<n;i++)
  30.     if (v[i]> mx) mx = v[i];
  31.   return mx;
  32. }
  33.  
  34. float min(int *v, int n) {
  35.   int i, mi=MAX;
  36.   for(i=0;i<n;i++)
  37.     if (v[i]<mi) mi = v[i];
  38.   return mi;
  39. }
  40.  
  41. float med(int *v, int n) {
  42.   int i, me=0;
  43.   for(i=0;i<n;i++) me += v[i];
  44.   return (float)me/n;
  45. }

Saludos
  #9 (permalink)  
Antiguo 07/11/2012, 08:38
Avatar de rodrigoemece  
Fecha de Ingreso: septiembre-2011
Mensajes: 68
Antigüedad: 12 años, 7 meses
Puntos: 1
Respuesta: Problema en el cálculo del mínimo de un fichero

Perfecto :) pero te importaría mucho explicar mi error?
  #10 (permalink)  
Antiguo 07/11/2012, 11:42
 
Fecha de Ingreso: julio-2012
Mensajes: 133
Antigüedad: 11 años, 9 meses
Puntos: 22
Respuesta: Problema en el cálculo del mínimo de un fichero

Cita:
Perfecto :) pero te importaría mucho explicar mi error?
No, en absoluto.
Uno de los motivos es que inicializas variables globales dentro del ciclo do/while.

Cita:
Así me funciona el máximo pero no el mínimo, pero no entiendo por qué
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.
  #11 (permalink)  
Antiguo 08/11/2012, 01:27
Avatar de rodrigoemece  
Fecha de Ingreso: septiembre-2011
Mensajes: 68
Antigüedad: 12 años, 7 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 :)

Etiquetas: fichero, int, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:11.