#include <stdio.h>
#include <stdlib.h>
#include <string.h>


struct tipo_aluno
{
    int codigo;
    char nome[80];
	float np1, nt1, np2, nt2;
	float media;
};

struct tipo_lista_encadeada
{
struct tipo_aluno aluno;
struct tipo_lista_encadeada *prox;
} *Lista, *Ultimo; // Ponteiro para o Primeiro e 
                   // para o Ultimo Academico

typedef struct tipo_aluno ACADEMICO;

void imprime_nomes_alunos_em_final(struct tipo_lista_encadeada *Lista); 
void calcula_media(struct tipo_lista_encadeada *Lista);
void mostra (struct tipo_lista_encadeada *Lista);
void mostra_aluno(ACADEMICO aluno);
void limpa_lista(struct tipo_lista_encadeada *Lista);
int main()
{
FILE *fp;
int conta_registros, i;
ACADEMICO x;

    conta_registros = 0;
    fp = fopen("alunos.dat", "rb");
    if (fp==NULL)
    {
       printf("O arquivo nao pode ser aberto. \n");
       system("pause");
       exit(0);
    }
    while(!feof(fp))
    {
        struct tipo_lista_encadeada* novo;
        novo = (struct tipo_lista_encadeada *)malloc (1*sizeof(struct tipo_lista_encadeada));

        novo->prox = NULL;
        fread (&(novo->aluno), sizeof(ACADEMICO), 1, fp );     
        conta_registros++; 
        if ( Lista == NULL )
        {
           Lista  = novo;
           Ultimo = Lista;            
        }
        else
        {
           Ultimo->prox = novo;
           Ultimo = novo;
        }
    }
    fclose ( fp );

    mostra(Lista);

    system("pause");

    calcula_media(Lista);
    imprime_nomes_alunos_em_final(Lista); 

    system("pause");
    
    limpa_lista(Lista);
    
} 


void imprime_nomes_alunos_em_final(struct tipo_lista_encadeada *Lista)
{
 struct tipo_lista_encadeada *aux;
    
    aux = Lista;
    printf("Alunos em final:\n\n");
    
    while(aux!=NULL)
    {

        if(aux->aluno.media>=4.0&&aux->aluno.media<7.0)
           printf("Cod: %d  %40s com nota %5.2f\n", 
                   aux->aluno.codigo,
                   aux->aluno.nome, 
                   aux->aluno.media);
        aux= aux->prox;
    }
}
void calcula_media(struct tipo_lista_encadeada *Lista)
{
 struct tipo_lista_encadeada *aux;
 aux = Lista;
    while(aux!=NULL)
    {
        aux->aluno.media = (aux->aluno.np1*0.7+
                            aux->aluno.nt1*0.3+
                            aux->aluno.np2*0.7+
                            aux->aluno.nt2*0.3)/2.0;
        aux= aux->prox;
    }
}


void mostra (struct tipo_lista_encadeada *Lista)
{
     struct tipo_lista_encadeada *aux;
     aux = Lista;
     while(aux!=NULL)
     {     
       mostra_aluno(aux->aluno);
       aux = aux->prox;
     }
} 
     
void mostra_aluno(ACADEMICO aluno)
{
     int i, j;
     int n;
     printf("Codigo: %d\n\n",aluno.codigo);     
     printf("Nome do aluno %s \n",aluno.nome);
     printf("Nota da prova 1: %4.2f\n",aluno.np1);
     printf("Nota do trabalho 1: %4.2f\n",aluno.nt1);
     printf("Nota da prova 2: %4.2f\n",aluno.np2);
     printf("Nota do trabalho 2: %4.2f\n",aluno.nt2);  
     printf("Media: %4.2f\n",aluno.media);
}

void limpa_lista(struct tipo_lista_encadeada *Lista)
{
     struct tipo_lista_encadeada *aux;
     aux = Lista;
     while(aux!=NULL)
     {     
       aux = aux->prox;
       free(Lista);
       Lista = aux;
     }
} 

