Este es el código:
Código C:
Ver original#include <stdlib.h>
#include <stdio.h>
struct alumno{
char nom[20];
char apell1[50];
char apell2[50];
double nota;
};
#define LEE_CAD(c,t){int i=0;\
c=getchar();\
while((c=='\n')||(c=='\t')) c=getchar();\
while((c!='\n')&&(i<(t-1))){\
i++;\
c=getchar();}\
c='\0';}
#define lee_char(c) { c=getchar();\
while((c==' ')||(c=='\n'))\
c=getchar();}
int main(){
void alta_alumno(const char[]);
double media(const char[]);
void mostrar_mayores_media(const char[], double);
alta_alumno("notas.txt");
mostrar_mayores_media("notas.txt", media("notas.txt"));
}
void alta_alumno(const char nom_fich[]){
FILE *pf;
char otro;
struct alumno al;
if((pf
= fopen(nom_fich
, "wb")) == NULL
){ perror("Error al abrir el fichero alumnos\n"); }
do{
printf("Dame los dos apellidos, nombre y nota:"); scanf("%49s %49s %19s %lf", al.
apell1, al.
apell2, al.
nom, &al.
nota);
fwrite(&al
, sizeof(al
), 1, pf
);
printf("¿Otro alumno?(s/n) "); lee_char(otro);
}while((otro == 's') || (otro == 'S'));
printf("Error al cerrar el fichero de alumnos\n"); }
}
double media(const char nom_fich[]){
FILE *pf;
if(pf
= fopen(nom_fich
, "rb")); double res=0.0;
int num_alumnos=0;
struct alumno al;
fread(&al
, sizeof(al
), 1, pf
);
if((pf
= fopen(nom_fich
, "rb")) == NULL
){ perror("Error al abrir el fichero de alumnos\n"); }
res=res + al.nota;
num_alumnos++;
fread(&al
, sizeof(al
), 1, pf
); }
res=res/(double)num_alumnos;
return(res);
}
void mostrar_mayores_media(const char nom_fich[], double m){
FILE *pf;
struct alumno al;
double media(const char[]);
m=media(nom_fich);
if((pf
= fopen(nom_fich
, "rb")) == NULL
){ perror("Error al abrir el fichero de alumnos\n"); }
fread(&al
, sizeof(al
), 1, pf
); if(al.nota >= m)
printf("%s %s %s %.2lf\n", al.
apell1, al.
apell2, al.
nom, al.
nota);
fread(&al
, sizeof(al
), 1, pf
); }
}