Ver Mensaje Individual
  #5 (permalink)  
Antiguo 01/04/2010, 06:21
minette1988
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: fichero binario que calcula la media

Este es el código:

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.    if(pf = fopen(nom_fich, "rb"));
  64.    double res=0.0;
  65.    int num_alumnos=0;
  66.    struct alumno al;
  67.  
  68.    fread(&al, sizeof(al), 1, pf);
  69.  
  70.    if((pf = fopen(nom_fich, "rb")) == NULL){
  71.        perror("Error al abrir el fichero de alumnos\n");
  72.        exit(3);
  73.    }
  74.    while(!feof(pf)){
  75.        res=res + al.nota;
  76.        num_alumnos++;
  77.        fread(&al, sizeof(al), 1, pf);
  78.    }
  79.    fclose(pf);
  80.    res=res/(double)num_alumnos;
  81.    return(res);
  82. }
  83.  
  84. void mostrar_mayores_media(const char nom_fich[], double m){
  85.  
  86.    FILE *pf;
  87.    struct alumno al;
  88.    double media(const char[]);
  89.    m=media(nom_fich);
  90.  
  91.    if((pf = fopen(nom_fich, "rb")) == NULL){
  92.       perror("Error al abrir el fichero de alumnos\n");
  93.       exit(4);
  94.    }
  95.    fread(&al, sizeof(al), 1, pf);
  96.    while(!feof(pf)){
  97.      if(al.nota >= m)
  98.         printf("%s %s %s %.2lf\n", al.apell1, al.apell2, al.nom, al.nota);
  99.  
  100.      fread(&al, sizeof(al), 1, pf);
  101.    }
  102.    fclose(pf);
  103. }