/**************************************************** Nombre del modulo: Ejercicio 2b, practica 1 Descripcion: --- Autor: David Lopez y Alvaro Gomez Fecha: 27-02-08 Modulos propios que necesita: Ninguno Notas: Ninguna Modificaciones: Ninguna Mejoras pendientes: --- ****************************************************/ #include #include #include #define OK 1 #define ERR -1 #define MAX_ALUMNOS 50 #define MAX_CHAR 256 int leeContenidoFichero(const char * nombreFichero, int num_notas, float * notas); int ordenaBurbuja(const float * notas_in, float * notas_out, int num_notas); int percent(const float * notas, int num_notas, int percentil, float * result); int mediana(const float * notas, int num_notas, float * result); float media(const float * notas, int num_notas, float * result); int desviacion(const float * notas, int num_notas, float *result); int main () { int num_notas, i,control; char tmp[MAX_CHAR],nombreFichero[MAX_CHAR]; float notaMax, notaMin,notas[MAX_ALUMNOS],notas_ord[MAX_ALUMNOS], result; /* Peticion del numero de alumnos a solicitar */ printf("Cuantos alumnos son?\t"); fgets(tmp, MAX_CHAR, stdin); sscanf(tmp,"%d",&num_notas); /* En caso de que se introduzca un numero erroneo */ while (num_notas > MAX_ALUMNOS || num_notas <= 0){ printf("Parametro no valido, el numero de alumnos ha de ser mayor que cero y menor que %d \n", MAX_ALUMNOS); printf("Cuantos alumnos son?\t"); fgets(tmp, MAX_CHAR, stdin); sscanf(tmp,"%d",&num_notas); } //Peticion del nombre del archivo printf("Escriba el nombre del fichero:\t"); gets(nombreFichero); fflush(stdin); printf("\n"); //Lectura del fichero control=leeContenidoFichero(nombreFichero,num_notas,notas); switch(control){ case 1: printf("Error abriendo el fichero de entrada!\n"); return ERR; break; case 2: printf("Error en el formato del fichero!\n"); return ERR; break; } //Obtener la nota maxima y minima notaMax = notas[0]; notaMin = notas[0]; for(i=1; i notaMax) notaMax = notas[i]; else if (notas[i] < notaMin) notaMin = notas[i]; } /* Salida de la nota mas alta y la mas baja de todos los alumnos inscritos y con la cadena ordenada! */ printf("No hay mas alumnos...\n\n"); printf("La nota mas alta ha sido un %2.2f\n", notaMax); printf("La nota mas baja ha sido un %2.2f\n", notaMin); printf("Las notas, ordenadas: "); ordenaBurbuja(notas,notas_ord,num_notas); for(i=0; i< num_notas-1; i++) printf("%2.2f, ",notas_ord[i]); printf("%2.2f", notas_ord[num_notas-1]); /* Estadisticas */ printf("\n\nEstadisticas:\n"); /* Percentil */ percent(notas_ord, num_notas, 75, &result); printf("\t* El percentil al 75%% es: %2.2f\n", result); /* Mediana */ mediana(notas_ord, num_notas, &result); printf("\t* La mediana es: %2.2f\n", result); /* Media */ media(notas_ord, num_notas, &result); printf("\t* La media es: %2.2f\n", result); /* Desviacion */ desviacion(notas_ord, num_notas, &result); printf("\t* La desviacion tipica es: %2.2f\n", result); return OK; } /*------------------------------ Nombre: Leer contenido de Fichero Descripción: Lee el contenido de un fichero formateado de acuerdo con el enunciado Argumentos de entrada: El nombre del fichero, el numero de notas y el array donde se guardaran. Retorno: El array de notas ya lleno de notas. ---------------------------------*/ int leeContenidoFichero(const char * nombreFichero, int num_notas, float * notas) { FILE *fich=NULL; int i; char temp[MAX_CHAR]; if((fich=fopen(nombreFichero,"r"))==NULL){ return 1; //Salida de la funcion por error de apertura } for (i=0; i< num_notas;i++){ if ((fscanf(fich,"%s %f",temp,¬as[i])) == EOF) { return 2; //Salida de la funcion por error de lectura } printf("Alumno: %s\t Nota: %2.2f\n",temp,notas[i]); } return 0; } /*------------------------------ Nombre: Ordenamiento de burbuja Descripción: Dado un array de flotantes desordenado, los ordena de menor a mayor. Argumentos de entrada: El array desordenado, el array de salida y el numero de flotantes a ordenar. Retorno: El array de salida con los flotantes del de entrada ordenados de menor a mayor. ---------------------------------*/ int ordenaBurbuja(const float * notas_in, float * notas_out, int num_notas) { int i,otraVez; float temp; for (i=0; i< num_notas; i++) notas_out[i]=notas_in[i]; for(otraVez = 1; otraVez;){ for(otraVez=0, i = 0; i < (num_notas - 1) ; i++){ if(notas_out[i]>notas_out[i+1]){ temp=notas_out[i]; notas_out[i]=notas_out[i+1]; notas_out[i+1]=temp; otraVez = 1; } } } return OK; } /*------------------------------ Nombre: Percentil Descripción: Calcula el percentil de una serie de flotantes. Argumentos de entrada: El array de flotantes ordenados a calcular el percentil, el percentil, el numero de flotantes y la variable donde almacenar el resultado Retorno: El percentil estipulado por el usuario de dichos flotantes ordenados ---------------------------------*/ int percent(const float * notas, int num_notas, int percentil, float * result) { int posMedia; if ((notas==NULL) || (result == NULL) || (num_notas < 0 )) return ERR; posMedia = num_notas/(100/percentil); *result = notas[posMedia-1]; return OK; } /*------------------------------ Nombre: Mediana Descripción: Calcula el elemento central de un array de flotantes Argumentos de entrada: Un array de flotantes ordenados, el numero de flotantes y la variable donde almacenar el resultado Retorno: El valor del flotante situado en la posicion media del array. ---------------------------------*/ int mediana(const float * notas, int num_notas, float * result) { int posMedia; if ((notas==NULL) || (result == NULL) || (num_notas < 0 )) return ERR; posMedia = num_notas/2; *result = notas[posMedia]; return OK; } /*------------------------------ Nombre: Media Descripción: Calcula la media entre los flotantes de un array Argumentos de entrada: Un array de flotantes, el numero de flotantes y la variable donde almacenar el resultado Retorno: La media entre todos los flotantes del mismo array ---------------------------------*/ float media(const float * notas, int num_notas, float * result) { int i; float aux=0; if ((notas==NULL) || (result == NULL) || (num_notas < 0 )) return ERR; for(i=0;i