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

#define tam 15

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




char menu ();
void inicia_lista ();
void cadastra ();
void mostra ();
void mostra_aluno (struct tipo_aluno aluno);
void salva ();
void carrega ();    
    
    
int main()
{
    char escolha;
    inicia_lista();
      for ( ;; )
         {escolha = menu();
          switch (escolha)
          {case 'm':
          case 'M': { mostra(); } break;
          case 'c':
          case 'C': { cadastra(); } break;
          case 's':
          case 'S': { salva(); } break;
          case 'a':
          case 'A': { carrega(); } break;
          case 'e':
          case 'E': { exit (0 ); } break;
          default : { printf ( "Opcao invalida. \n" ); }
         }
    printf ( "\n \n \n" );
}  
}
  
char menu()
{
char opcao;

 printf ("\n \n \n");
 printf ( " (C)adastrar. \n" );
 printf ( " C(A)arregar. \n" );
 printf ( " (S)alvar. \n" );
 printf ( " (E)xit \n" );
 
 fflush(stdin);
 scanf ( "%c", &opcao );
 return opcao;
}

void inicia_lista()
{
int t;
for (t = 0; t < tam; t++)
 {
 strcpy(lista[t].nome , "");
 }
}


void cadastra ()
{
int i;
 printf ("\n \n \n");
 for (i = 0; i < tam; i++ )
 {
    printf ( "Nome: \n" );fflush (stdin);
    gets ( lista[i].nome );
    printf ( "Codigo: \n" );fflush (stdin);
    scanf("%d", &lista[i].codigo );
    printf("Digite a nota da prova 1\n");fflush (stdin);
    scanf("%f", &lista[i].np1);  
 
    printf("Digite a nota do trabalho 1\n");fflush (stdin);
    scanf("%f", &lista[i].nt1);
     
    printf("Digite a nota da prova 2\n");fflush (stdin);
    scanf("%f", &lista[i].np2);
      
    printf("Digite a nota do trabalho 2\n");fflush (stdin);
    scanf("%f", &lista[i].nt2);

  }
}

void salva ()
{
FILE *fp;
int i, result;
  printf ("\n \n \n");
  fp = fopen ("alunos.dat", "wb");
  if ( fp == NULL )
  {
     printf ( "O arquivo nao pode ser aberto. \n" );
     return;
  }
  for (i = 0; i < tam; i++ )
  {
      if ( !(strcmp(lista[i].nome, "")==0) )
      {
       result = fwrite ( &lista[i], sizeof ( struct tipo_aluno), 1, fp );
       if ( result != 1 )
       {
          printf ( "Erro de escrita no arquivo. \n" );
       }
      }
  }
  fclose (fp);
}

void carrega ()
{
FILE *fp;
int i, resp;
    printf ("\n \n \n");
    fp = fopen ( "alunos.dat", "rb" );
    if ( fp == NULL )
    {
       printf ( "O arquivo nao pode ser aberto. \n" );
       return;
    }
    inicia_lista ();
    for (i = 0; i < tam; i++ )
    {
        resp = fread ( &lista[i], sizeof (struct tipo_aluno), 1, fp );
        if ( resp != 1 )
        {
         if ( feof (fp) )
         {
            break;
         }
        printf ( " Erro de leitura no arquivo. \n" );
        }

    }
    fclose ( fp );
    
} 
 
void mostra ()
{
     int i;
     for(i=0;i<tam;i++)
       mostra_aluno(lista[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);
  
}



     
     
     
    
    
  
    
    
    

