#ifndef GRADE_H
#define GRADE_H

typedef struct GRADE_NODE_S
{
	char name[15];
	float grade;
	struct GRADE_NODE_S *next;
} GRADE_NODE;

typedef struct GROUP_NODE_S
{
	char name[15];
	float weight;
	GRADE_NODE *grades;
	struct GROUP_NODE_S *next;
} GROUP_NODE;

typedef struct GRADE_S
{
	char course[15], student[15], teacher[15];
	GROUP_NODE *grades;
} GRADE;

GRADE_NODE *new_grade_node(const char*,float);
GROUP_NODE *new_group_node(const char*,float);
GRADE *new_grade(const char*,const char*,const char *);

GRADE *pop_group(GRADE*);
GRADE *push_group(GRADE*,const char*,float);
GROUP_NODE *free_group_node(GROUP_NODE*);
GRADE *read_grades(FILE*);

GROUP_NODE *push(GROUP_NODE*,const char*,float);
GROUP_NODE *pop(GROUP_NODE*);

int generate_report(GRADE*,FILE*);
int print_group(GROUP_NODE*,FILE*);
int print_grade(GRADE_NODE*,FILE*);

float average(GRADE*);
float aver_group(GROUP_NODE*);
float aver_grades(GRADE_NODE*);

#endif

