| 
									
										
										
										
											2024-09-02 23:11:04 +02:00
										 |  |  | // Student rank
 | 
					
						
							|  |  |  | // M.Menault 2024
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <stdio.h>
 | 
					
						
							|  |  |  | #include <stdlib.h>
 | 
					
						
							|  |  |  | #include "heapsort.h"
 | 
					
						
							| 
									
										
										
										
											2024-09-03 08:26:03 +02:00
										 |  |  | #include "bubblesort.h"
 | 
					
						
							| 
									
										
										
										
											2025-09-15 14:34:48 +02:00
										 |  |  | #include "quicksort.h"
 | 
					
						
							| 
									
										
										
										
											2024-09-02 23:11:04 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | void generate_grades(int** students_array, int students_number, int grades_number) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int i = 0; | 
					
						
							|  |  |  |     for(i=0;i<students_number;i++) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  | 	students_array[i] = (int*) malloc(grades_number*sizeof(int)); | 
					
						
							|  |  |  |         generate_array(students_array[i],grades_number); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void generate_ranks(int** students_array, int students_number, int grades_number) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int i = 0; | 
					
						
							|  |  |  |     int j = 0; | 
					
						
							|  |  |  |     for(i=0;i<students_number;i++) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  | 	students_array[i] = (int*) malloc(grades_number*sizeof(int)); | 
					
						
							|  |  |  |         for(j=0;j<grades_number;j++) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  |             students_array[i][j] = -1; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void free_array(int** students_array, int students_number) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int i = 0; | 
					
						
							|  |  |  |     for(i=0;i<students_number;i++) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         free(students_array[i]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void print_student_array(int** students_array, int students_number, int grades_number) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int i = 0; | 
					
						
							|  |  |  |     printf("----------------------\n"); | 
					
						
							|  |  |  |     for(i=0;i<students_number;i++) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  | 	printf("Student %d : ",i); | 
					
						
							|  |  |  |         print_array(students_array[i],grades_number); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     printf("----------------------\n"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int find_rank_student(int student_grade, int* grades_array, int students_number) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int position = -1; | 
					
						
							|  |  |  |     int i = 0; | 
					
						
							|  |  |  |     for(i = students_number-1; i >= 0; i--) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2025-09-15 14:34:48 +02:00
										 |  |  |         if(grades_array[i] == student_grade){ | 
					
						
							| 
									
										
										
										
											2024-09-02 23:11:04 +02:00
										 |  |  |             position = students_number-i; | 
					
						
							| 
									
										
										
										
											2025-09-15 14:34:48 +02:00
										 |  |  | 	       break; | 
					
						
							|  |  |  | 	   } | 
					
						
							| 
									
										
										
										
											2024-09-02 23:11:04 +02:00
										 |  |  |     } | 
					
						
							|  |  |  |     return position; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void sort_students(int** students_rank, int** students_array, int students_number, int grades_number) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int i = 0, j = 0; | 
					
						
							|  |  |  |     for(i = 0; i < grades_number; i++) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         int * grades = (int*) malloc(students_number*sizeof(int)); | 
					
						
							|  |  |  | 	for(j = 0; j < students_number; j++) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	    grades[j] = students_array[j][i]; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2025-09-15 14:34:48 +02:00
										 |  |  |         quicksort(grades, 0, students_number - 1); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-02 23:11:04 +02:00
										 |  |  | 	for(j = 0; j < students_number; j++) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  |             students_rank[j][i] = find_rank_student(students_array[j][i],grades,students_number); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	free(grades); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-15 14:34:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-02 23:11:04 +02:00
										 |  |  | int main(int argc, char** argv) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int** student_grades = NULL; | 
					
						
							|  |  |  |     int** student_ranks = NULL; | 
					
						
							|  |  |  |     int students_length = 0; | 
					
						
							|  |  |  |     int grades_length = 0; | 
					
						
							|  |  |  |     int debug_mode = 0; | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     if(argc != 4) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         printf("Usage : %s <number of student> <number of grade per student> <debug mode : 0|1>\n",argv[0]); | 
					
						
							|  |  |  |         return -1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     students_length = atoi(argv[1]); | 
					
						
							|  |  |  |     grades_length = atoi(argv[2]); | 
					
						
							|  |  |  |     debug_mode = atoi(argv[3]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     student_grades = (int**) malloc(students_length*sizeof(int*)); | 
					
						
							|  |  |  |     student_ranks = (int**) 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; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 |