Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- // Student Average - Student average of all tests
- // TOTAL AVERAGE - Average of all student averages
- // Two groups:
- // 1. Average >= TOTAL AVERAGE
- // 2. Average < TOTAL AVERAGE
- #define SIZE 3
- #define scanf scanf_s
- typedef struct student_init_data
- {
- int student_id;
- double* grades;
- int num_of_tests; // total tests
- } Student_Data;
- typedef struct student_processed_data // each student data
- {
- int id;
- double student_average;
- } Processed_data;
- typedef struct stataistics
- {
- Processed_data* data_arr_1;
- Processed_data* data_arr_2;
- int size_data_arr_1;
- int size_data_arr_2;
- double total_average;
- } Statistics;
- // End of structs
- // Functions
- int* input_data(Student_Data s1)
- {
- double current_grade = 0;
- double* student_grades = (double*)malloc((s1.num_of_tests + 1) * sizeof(double));
- for (int i = 0; i < s1.num_of_tests; i++)
- {
- printf("\n(Student %d)\nTest %d grade: ", s1.student_id, i + 1);
- scanf("%lf", ¤t_grade);
- student_grades[i] = current_grade;
- current_grade = 0;
- }
- return student_grades;
- } // V
- double student_average(double* grades, int size)
- {
- double sum = 0;
- for (int i = 0; i < size; i++)
- {
- sum += grades[i];
- }
- return sum / size;
- }
- double total_average(double* grades, int size)
- {
- double sum = 0;
- for (int i = 0; i < size; i++)
- {
- sum += grades[i];
- }
- return sum / size;
- }
- void print_processed_data(Processed_data p1)
- {
- printf("\nStudent ID: %d\n", p1.id);
- printf("\nStudent Average: %lf\n", p1.student_average);
- }
- void classification(Student_Data* data_arr, int size, Statistics* stats_pass)
- {
- Statistics stats;
- double s_average = 0;
- double t_sum = 0;
- double t_average = 0;
- // Can be more efficient
- // Instead of 3 function calls and 3 loops can be made with 1 utility array that holds the averages of each student.
- int arr_1_size = 0; // Above average arr
- int arr_2_size = 0; // Below average arr
- for (int j = 0; j < size; j++) // Sum of total tests
- {
- t_sum += student_average(data_arr[j].grades, data_arr[j].num_of_tests);
- }
- t_average = t_sum / size;
- for (int i = 0; i < size; i++)
- {
- s_average = student_average(data_arr[i].grades, data_arr[i].num_of_tests);
- if (s_average >= t_average)
- arr_1_size++;
- else
- arr_2_size++;
- s_average = 0;
- }
- Processed_data* p_data1 = (Processed_data*)malloc((arr_1_size) * sizeof(Processed_data));
- Processed_data* p_data2 = (Processed_data*)malloc((arr_2_size) * sizeof(Processed_data));
- int index_1 = 0;
- int index_2 = 0;
- for (int k = 0; k < size; k++)
- {
- s_average = student_average(data_arr[k].grades, data_arr[k].num_of_tests);
- if (s_average >= t_average)
- {
- p_data1[index_1].id = data_arr[k].student_id; // Above average
- p_data1[index_1++].student_average = s_average;
- }
- else
- {
- p_data2[index_2].id = data_arr[k].student_id; // Below average
- p_data2[index_2++].student_average = s_average;
- }
- s_average = 0;
- }
- printf("\n\n\n\n");
- stats.data_arr_1 = p_data1;
- stats.data_arr_2 = p_data2;
- stats.size_data_arr_1 = arr_1_size;
- stats.size_data_arr_2 = arr_2_size;
- stats.total_average = t_average;
- *stats_pass = stats;
- //free(p_data1);
- //free(p_data2);
- }
- void print_student(Student_Data s1)
- {
- printf("\nStudent ID: %d\n", s1.student_id);
- printf("Number of tests: %d\n", s1.num_of_tests);
- printf("Grades: [");
- for (int i = 0; i < s1.num_of_tests; i++)
- {
- printf("%lf, ", s1.grades[i]);
- }
- printf("]\n");
- }
- void print_tab(Statistics stats)
- {
- printf("\n--Statistics--\n\n");
- printf("%d Students above average:\n", stats.size_data_arr_1);
- for (int i = 0; i < stats.size_data_arr_1; i++)
- {
- print_processed_data(stats.data_arr_1[i]);
- }
- printf("\n%d Students below average:\n", stats.size_data_arr_2);
- for (int j = 0; j < stats.size_data_arr_2; j++)
- {
- print_processed_data(stats.data_arr_2[j]);
- }
- printf("\n\nTotal average: %lf\n", stats.total_average);
- }
- void free_memory(Student_Data *a1, double *a2)
- {
- free(a1);
- free(a2);
- }
- void main()
- {
- Student_Data* student_arr = (Student_Data*)malloc(SIZE * sizeof(Student_Data)); // 3 students
- int tests_number = 0; // default 0
- double* averages_arr = (double*)malloc(SIZE * sizeof(double));
- Statistics stats;
- for (int i = 0; i < SIZE; i++) // Initialize Students array
- {
- student_arr[i].student_id = i + 1; // student_id
- printf("Enter number of tests for student %d: ", i + 1);
- scanf("%d", &tests_number);
- student_arr[i].num_of_tests = tests_number; // *num_of_tests
- student_arr[i].grades = input_data(student_arr[i]); // *grades
- averages_arr[i] = student_average(student_arr[i].grades, student_arr[i].num_of_tests);
- }
- double t_average = total_average(averages_arr, SIZE);
- classification(student_arr, SIZE, &stats);
- print_tab(stats);
- free_memory(student_arr, averages_arr);
- }
Add Comment
Please, Sign In to add comment