#include <stdio.h>
#include <stdlib.h>
#define MAX_CHAR 10000
struct Talumno{
char nombre[50];
char apellido1[100];
char apellido2[100];
float notas[2];
float media;
};
struct Talumno *leerdatos(char *nombrearchivo, int numlineas);
int numlineasarchivo(FILE *p);
int mediamasalta(struct Talumno *info, int tam);
int main(int argc, char* argv[]){
struct Talumno *clase;
int numalumnos,mejornota;
FILE *parchivo;
if (argc!=2)
printf("Error, el número de argumentos no es correcto\n");
else {
parchivo=fopen(argv[1],"r");
if (parchivo==NULL) {
printf("Error al abrir el archivo");
}
else {
//obtenemos el número de líneas del fichero
numalumnos =numlineasarchivo(parchivo);
fclose(parchivo);
clase=leerdatos(argv[1],numalumnos);
mejornota=mediamasalta(clase,numalumnos);
printf("El alumno con mejor nota se llama %s %s %s y ha sacado un %f\n",(clase+mejornota)->nombre,(clase+mejornota)->apellido1, (clase+mejornota)->apellido2,(clase+mejornota)->media);
free(clase);
}
}
return 0;
}
int numlineasarchivo(FILE *p)
{
int nlineas;
char linea[MAX_CHAR];
//obtenemos el número de líneas del fichero
nlineas = 0;
while (!feof(p)) {
fgets(linea,MAX_CHAR,p);
nlineas++;
}
return nlineas;
}
struct Talumno *leerdatos(char *nombrearchivo, int numlineas)
{
FILE *parchivo;
struct Talumno *info;
int i;
parchivo=fopen(nombrearchivo,"r");
if (parchivo==NULL) {
printf("Error al abrir el archivo");
}
else {
//reservamos espacio para la matriz
info=(struct Talumno*)malloc(sizeof(struct Talumno)*numlineas);
//leemos los datos
for (i=0; i<numlineas; i++) {
fscanf (parchivo, "%s %s %s %f %f",(info+i)->nombre,(info+i)->apellido1, (info+i)->apellido2,&(info+i)->notas[0],&(info+i)->notas[1]);
(info+i)->media=((info+i)->notas[0]+(info+i)->notas[1])/2;
}
}
fclose(parchivo);
return info;
}
int mediamasalta(struct Talumno *info, int tam)
{
int res,i;
res=0;
for (i=0; i<tam; i++) {
if ((info+i)->media > (info+res)->media) {
res=i;
}
}
return res;
}