// Student rank // M.Menault 2024 #include #include #include "heapsort.h" void generate_grades(int **students_array, size_t students_number, size_t grades_number) { for (size_t i = 0; i < students_number; i++) { students_array[i] = malloc(grades_number * sizeof(int)); generate_array(students_array[i], grades_number); } } void generate_ranks(int **students_array, size_t students_number, size_t grades_number) { for (size_t i = 0; i < students_number; i++) { students_array[i] = calloc(grades_number, sizeof(int)); for (size_t j = 0; j < grades_number; j++) { students_array[i][j] = -1; } } } void free_array(int **students_array, size_t students_number) { for (size_t i = 0; i < students_number; i++) { free(students_array[i]); } } void print_student_array(int **students_array, size_t students_number, size_t grades_number) { printf("----------------------\n"); for (size_t i = 0; i < students_number; i++) { printf("Student %zu : ", i); print_array(students_array[i], grades_number); } printf("----------------------\n"); } int find_rank_student(int student_grade, int *grades_array, size_t students_number) { for (size_t i = 0; i < students_number; i++) { if (grades_array[i] == student_grade) { return i + 1; } } return -1; } void sort_students(int **students_rank, int **students_array, size_t students_number, size_t grades_number) { int *grades = malloc(students_number * sizeof(int)); int *sorted_grades = malloc(students_number * sizeof(int)); int *sums = calloc(students_number, sizeof(int)); for (size_t i = 0; i < grades_number; i++) { for (size_t j = 0; j < students_number; j++) { sums[j] += students_array[j][i]; grades[j] = sums[j] / (i + 1); sorted_grades[j] = grades[j]; } heapsort(sorted_grades, students_number); for (size_t j = 0, k = students_number - 1; j < k; j++, k--) { int temp = sorted_grades[j]; sorted_grades[j] = sorted_grades[k]; sorted_grades[k] = temp; } for (size_t j = 0; j < students_number; j++) { students_rank[j][i] = find_rank_student(grades[j], sorted_grades, students_number); } } free(grades); free(sorted_grades); free(sums); } int main(int argc, char **argv) { if (argc != 4) { printf("Usage : %s \n", argv[0]); return -1; } size_t students_length = atoi(argv[1]); size_t grades_length = atoi(argv[2]); int debug_mode = atoi(argv[3]); int **student_grades = malloc(students_length * sizeof(int *)); int **student_ranks = malloc(students_length * sizeof(int *)); generate_grades(student_grades, students_length, grades_length); generate_ranks(student_ranks, students_length, grades_length); sort_students(student_ranks, student_grades, students_length, grades_length); if (debug_mode) { print_student_array(student_grades, students_length, grades_length); print_student_array(student_ranks, students_length, grades_length); } free_array(student_grades, students_length); free_array(student_ranks, students_length); free(student_grades); free(student_ranks); return 0; }