#include typedef union Student { char name[50]; int roll_number; int grades[3]; } Student; double student_average_grade(Student student) { double average_grade = 0.0; for(int i = 0; i < 3; i++) { average_grade += student.grades[i]; } return average_grade/3; } double all_student_averages(Student arr[], int len) { double average_grade = 0.0; for(int i = 0; i < len; i++) { average_grade += student_average_grade(arr[i]); } return average_grade/len; } Student highest_grade(Student arr[], int len) { Student highest = arr[0]; for(int i = 0; i < len; i++) { if(student_average_grade(arr[i]) > student_average_grade(highest)) { highest = arr[i]; } } return highest; } int main() { // Students to test functions // All will just have grades, nothing else filled out so we can test mark checking functions Student John; John.grades[0] = 3; John.grades[1] = 4; John.grades[2] = 3; Student Bob; Bob.grades[0] = 4; Bob.grades[1] = 4; Bob.grades[2] = 4; Student Bo; Bo.grades[0] = 2; Bo.grades[1] = 1; Bo.grades[2] = 2; Student arr[3]; arr[0] = John; arr[1] = Bob; arr[2] = Bo; printf("Average Grade: %0.02f\n", student_average_grade(arr[0])); printf("Average Grade: %0.02f\n", student_average_grade(arr[1])); printf("Average Grade: %0.02f\n", student_average_grade(arr[2])); printf("Average Grade: %0.02f\n", all_student_averages(arr, sizeof(arr) / sizeof(arr[0]))); // It is impossible to print the name of the student with the highest total marks, // Because it is a union, and if the student has marks, they cannot have the name member also populated // Therefore, this will print nonsense for the name of the student with highest grades Student highest = highest_grade(arr, sizeof(arr) / sizeof(arr[0])); printf("Student with highest grades: %s", highest.name); return 0; }