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


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

typedef struct tipo_aluno ACADEMICO;

ACADEMICO *vetor_academicos; 

void ordena_por_codigo(ACADEMICO *vet, int n);
void mostra (ACADEMICO *vet, int n);
void mostra_aluno(struct tipo_aluno aluno);

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))
    {
        fread (&x, sizeof(ACADEMICO), 1, fp );
        conta_registros++;
    }

    rewind(fp);

    vetor_academicos = (ACADEMICO *)malloc(conta_registros*sizeof(ACADEMICO));    
    
    for(i=0;i<conta_registros;i++)
    {
        fread(&vetor_academicos[i],sizeof(ACADEMICO),1,fp);
    }
    fclose ( fp );

    mostra(vetor_academicos, conta_registros);

    system("pause");

    ordena_por_codigo(vetor_academicos, conta_registros);

    mostra(vetor_academicos, conta_registros);

    system("pause");
    
    for(i=0;i<conta_registros;i++)
    {
        vetor_academicos[i].media = (vetor_academicos[i].np1*0.7+
                                     vetor_academicos[i].nt1*0.3+
                                     vetor_academicos[i].np2*0.7+
                                     vetor_academicos[i].nt2*0.3)/2.0;
    }
    printf("Alunos em final:\n\n");
    for(i=0;i<conta_registros;i++)
    {
        if(vetor_academicos[i].media>=4.0&&vetor_academicos[i].media<7.0)
           printf("Cod: %d  %40s com nota %5.2f\n", 
                   vetor_academicos[i].codigo,
                   vetor_academicos[i].nome, 
                   vetor_academicos[i].media);
    }
    
    system("pause");
    free(vetor_academicos);

} 

void ordena_por_codigo(ACADEMICO *vet, int n)
{
int i,j;
ACADEMICO temp;

  for(i=0;i<n;i++)
   for(j=0;j<n-1;j++)
    {
      if(vet[j].codigo>vet[j+1].codigo)
         {
           temp.codigo=vet[j+1].codigo;
           strcpy(temp.nome, vet[j+1].nome);
           temp.nt1=vet[j+1].nt1;temp.np1=vet[j+1].np1; 
           temp.nt2=vet[j+1].nt2;temp.np2=vet[j+1].np2;                              
           temp.media=vet[j+1].media;
           
           vet[j+1].codigo=vet[j].codigo;
           strcpy(vet[j+1].nome, vet[j].nome);
           vet[j+1].nt1=vet[j].nt1;vet[j+1].np1=vet[j].np1;                              
           vet[j+1].nt2=vet[j].nt2;vet[j+1].np2=vet[j].np2;                              
           vet[j+1].media=vet[j].media;
           
           vet[j].codigo=temp.codigo;
           strcpy(vet[j].nome, temp.nome);
           vet[j].nt1=temp.nt1;vet[j].np1=temp.np1;                              
           vet[j].nt2=temp.nt2;vet[j].np2=temp.np2;                              
           vet[j].media=temp.media;
         }
}
     
}

void mostra (ACADEMICO *vet, int n)
{
     int i;
     for(i=0;i<n;i++)
       mostra_aluno(vet[i]);
} 
     
void mostra_aluno(struct tipo_aluno 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);
}


