Ver Mensaje Individual
  #1 (permalink)  
Antiguo 31/03/2010, 04:43
minette1988
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 2 meses
Puntos: 0
fichero binario que calcula la media

Hola, el siguiente ejercicio consiste en crear un fichero binario e ir almacenando en él los N registros con los apellidos, el nombre y la nota de los alumnos. Para ello realizamos la operación de escritura sobre el fichero binario para guardar esos datos. Una vez hecho esto hay que hacer la operación de lectura sobre el fichero binario para calcular la media y saber los alumnos que estań por encima de la media. a la hora de compilar tiene que salir los apellidos, el nombre y la nota de aquellos alumnos que están por encima de la media.

Código C:
Ver original
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4. struct alumno{
  5.        char nom[20];
  6.        char apell1[50];
  7.        char apell2[50];
  8.        double nota;
  9. };
  10. #define LEE_CAD(c,t){int i=0;\
  11.         c=getchar();\
  12.              while((c=='\n')||(c=='\t')) c=getchar();\
  13.              while((c!='\n')&&(i<(t-1))){\
  14.                 i++;\
  15.                    c=getchar();}\
  16.              c='\0';}
  17.  
  18. #define lee_char(c) { c=getchar();\
  19.            while((c==' ')||(c=='\n'))\
  20.             c=getchar();}            
  21.  
  22. int main(){
  23.  
  24.    void alta_alumno(const char[]);
  25.    double media(const char[]);
  26.    void mostrar_mayores_media(const char[], double);
  27.  
  28.    alta_alumno("notas.txt");
  29.    mostrar_mayores_media("notas.txt", media("notas.txt"));
  30.    exit(0);
  31. }
  32.  
  33. void alta_alumno(const char nom_fich[]){
  34.  
  35.    FILE *pf;
  36.    char otro;
  37.    struct alumno al;
  38.  
  39.    if((pf = fopen(nom_fich, "wb")) == NULL){
  40.        perror("Error al abrir el fichero alumnos\n");
  41.        exit(1);
  42.    }
  43.  
  44.    do{
  45.       printf("Dame los dos apellidos, nombre y nota:");
  46.       scanf("%49s %49s %19s %lf", al.apell1, al.apell2, al.nom, &al.nota);
  47.  
  48.       fwrite(&al, sizeof(al), 1, pf);
  49.  
  50.       printf("¿Otro alumno?(s/n) ");
  51.       lee_char(otro);
  52.    }while((otro == 's') || (otro == 'S'));
  53.  
  54.    if(fclose(pf) == EOF){
  55.       printf("Error al cerrar el fichero de alumnos\n");
  56.       exit(2);
  57.    }
  58. }
  59.  
  60. double media(const char nom_fich[]){
  61.  
  62.    FILE *pf;
  63.    double res=0.0;
  64.    int num_alumnos=0;
  65.    struct alumno al;
  66.  
  67.    fread(&al, sizeof(al), 1, pf);
  68.  
  69.    if((pf = fopen(nom_fich, "rb")) == NULL){
  70.        perror("Error al abrir el fichero de alumnos\n");
  71.        exit(3);
  72.    }
  73.    while(!feof(pf)){
  74.        res=res + al.nota;
  75.        num_alumnos++;
  76.        fread(&al, sizeof(al), 1, pf);
  77.    }
  78.    fclose(pf);
  79.    res=res/(double)num_alumnos;
  80.    return(res);
  81. }
  82.  
  83. void mostrar_mayores_media(const char nom_fich[], double m){
  84.  
  85.    FILE *pf;
  86.    struct alumno al;
  87.    double media(const char[]);
  88.    m=media(nom_fich);
  89.  
  90.    if((pf = fopen(nom_fich, "rb")) == NULL){
  91.       perror("Error al abrir el fichero de alumnos\n");
  92.       exit(4);
  93.    }
  94.    fread(&al, sizeof(al), 1, pf);
  95.    while(!feof(pf)){
  96.      if(al.nota >= m)
  97.         printf("%s %s %s %.2lf\n", al.apell1, al.apell2, al.nom, al.nota);
  98.  
  99.      fread(&al, sizeof(al), 1, pf);
  100.    }
  101.    fclose(pf);
  102. }

A la hora de compilarlo cuando me pregunta ¿Otro alumno? y pongo que no me da fallo de segmentación. Alguien puede decirme por qué me da este tipo de fallo?. Gracias.