#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SIZE 100

struct Student
{
	char name[50];
	int code;
	float grd;
};

void sort_by_grade(struct Student studs[], int num_studs);
void show_students(const struct Student studs[], int num_studs, float avg_grd);
int read_text(char str[], int size, int flag);

int main()
{
	int i;
	float sum_grd;
	struct Student studs[SIZE];

	sum_grd = 0;
	for(i = 0; i < SIZE; i++)
	{
		printf("\nGrade [0-10]: ");
		scanf("%f", &studs[i].grd);
		if(studs[i].grd == -1)
			break;

		sum_grd += studs[i].grd;
		getchar();

		printf("Name: ");
		read_text(studs[i].name, sizeof(studs[i].name), 1);

		printf("Code: ");
		scanf("%d", &studs[i].code);
	}
	if(i == 0)
		return 0;
	sort_by_grade(studs, i); /* Ταξινόμηση δομών σύμφωνα με την τιμή του πεδίου grd. Η μεταβλητή i δείχνει πόσοι φοιτητές εισήχθησαν. */
	show_students(studs, i, sum_grd/i); /* Το τελευταίο όρισμα είναι ο μέσος όρος των βαθμών. */
	return 0;
}

void sort_by_grade(struct Student studs[], int num_studs)
{
	int i, j;
	struct Student tmp;

	for(i = 0; i < num_studs-1; i++)
	{
		/* Γίνεται σύγκριση του πεδίου grd κάθε δομής με το αντίστοιχο πεδίο των υπολοίπων δομών και αν βρεθεί κάποια με μεγαλύτερη τιμή, τότε οι δομές αντιμετατίθενται. */
		for(j = i+1; j < num_studs; j++)
		{
			if(studs[i].grd < studs[j].grd)
			{
				tmp = studs[i];
				studs[i] = studs[j];
				studs[j] = tmp;
			}
		}
	}
}

void show_students(const struct Student studs[], int num_studs, float avg_grd)
{
	int i;

	for(i = 0; i < num_studs; i++)
	{
		if(studs[i].grd > avg_grd)
			printf("N: %s C: %d G: %f\n", studs[i].name, studs[i].code, studs[i].grd);
		else
			return; /* Αφού οι δομές έχουν ταξινομηθεί σε φθίνουσα σειρά και βρήκαμε κάποιον φοιτητή με βαθμό μικρότερο ή ίσο από τον μέσο όρο, δεν χρειάζεται να συνεχίσουμε την επανάληψη. */
	}
}

