#include #include #include #include typedef unsigned long long int counter_type; typedef double grade_type; #define LAB_COUNT 10 #define QUIZ_COUNT LAB_COUNT #define EXAM_COUNT 3 #define min(a, b) ((a) < (b) ? (a) : (b)) int min_i(int a, int b) { return a < b ? a : b; } // int min_count = 10 < 10 ? 10 : 10; int min_count = min ( min(LAB_COUNT, QUIZ_COUNT), EXAM_COUNT ); double calculate_average(grade_type grade_count, bool remove_min_grade) { // Por cada asignacion grade_type grade_sum = 0.0, min_grade = DBL_MAX; for ( counter_type grade_counter = 0; grade_counter < grade_count; ++grade_counter ) { // Leer el laboratorio double current_grade = 0.0; if ( scanf("%lg", ¤t_grade) != 1 ) return -1.0; // Sumar la nota del laboratorio a la suma_laboratorio grade_sum += current_grade; // Si es el primero que leo if ( grade_counter == 0 ) { // Asginar minimo_laboratorio al que acabo de leer min_grade = current_grade; } else { // De lo contrario // Si el laboratorio que acabo de leer es menor que minimo_laboratorio if ( current_grade < min_grade ) { // asigno minimo_laboratorio al que acabo de leer min_grade = current_grade; } } } // Leer los tres examenes // Quitar la nota mas baja if ( remove_min_grade ) { grade_sum -= min_grade; } // Calculo promedio laboratorio dividiendo entre 9 // Calculo promedio quices dividiendo entre 9 // Calculo promedio de examenes entre 3 return grade_sum / (grade_count - remove_min_grade); } int main() { // Leer cantidad de grupos int group_count = 0; if ( scanf("%d", &group_count) != 1 ) return 1; // Por cada grupo: for ( int group_counter = 0; group_counter < group_count; ++group_counter ) { // Leer numero grupo y cantidad de estudiantes int group_number = 0, student_count = 0; if ( scanf("%d %d", &group_number, &student_count) != 2 ) return 2; // Imprimir encabezado del grupo if ( group_counter ) putchar('\n'); printf("Grupo %d:\n", group_number); // Por cada estudiante: for ( int student_counter = 0; student_counter < student_count; ++student_counter ) { // Leer carne char student_id[7]; if ( scanf("%6s", student_id) != 1 ) return 3; double lab_average = calculate_average(LAB_COUNT, true); double quiz_average = calculate_average(QUIZ_COUNT, true); double exam_average = calculate_average(EXAM_COUNT, false); // Calcular nota correcta como: double right_grade = 0.3 * lab_average + 0.2 * quiz_average + 0.5 * exam_average; // Leer nota del profesor double professor_grade = 0.0; if ( scanf("%lg", &professor_grade) != 1 ) return 5; // Redondear a dos decimales para poder comparar right_grade = round(right_grade * 100.0) / 100.0; professor_grade = round(professor_grade * 100.0) / 100.0; // Si nota del profesor es distinta de la nota correcta if ( professor_grade != right_grade ) { // Imprimir carnet, nota de profesor, y nota correcta printf("%s %.2lf %.2lf\n", student_id, professor_grade, right_grade); } } } return 0; }