    program notas
! Objetivo: calcular as medias finais 
! Programador: Francisco C. Lavarda
!
! Avisos:
! - Modificar os formats quando modificar a lista de campos de "dados".
! - Se for rodar pela primeira vez, selecionar "vez" como sendo igual a 1.
!
    implicit none
    integer i,na,ha,vez,verif
    real pmp,pmt
    real,allocatable :: dif_mf(:)
    integer :: num_rep = 0, num_apr = 0, num_rep_fal = 0, num_indef = 0
    parameter(na=48,ha=60,pmp=0.8,pmt=0.2)
    character frase*128,opcao*1
    type tabela
      character*10 nome
      character*7  ra
      real         t1
      real         t2
      real         t3
      real         t4
      real         mt
      real         p1
      real         p2
      real         p3
      real         mp
      real         mf
      integer      tf
      real         pf
      character*3  sitf
    end type tabela
    type (tabela) dados(na)
    allocate (dif_mf(na))
    open(unit=10,file='fc103.dat',status='old')
    open(unit=11,file='public.dat',status='unknown')
    open(unit=12,file='controle.dat',status='unknown')
    open(unit=13,file='tabela.dat',status='unknown')
    open(unit=14,file='fc103.bak',status='unknown')
    read(10,111) frase
    write(14,111) frase
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!    
! Faça vez=1 para ler da primeira vez ou qualquer outro valor para depois:!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    vez=2
    select case(vez)
    case(:0)    
      read(10,*) dados
      do i=1,na
        write(14,101) dados(i)
      end do
    case(1)
      do i=1,na
        read(10,*)dados(i)%nome,dados(i)%ra
        write(14,*)dados(i)%nome,dados(i)%ra        
        print *,dados(i)%nome,dados(i)%ra      
      enddo
    case(2:)    
      read(10,*) dados
      do i=1,na
        write(14,101) dados(i)
      end do
    end select
    rewind(10)
    close(14)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! Selecionar o campo em tres das linhas abaixo: !
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    print *,'Quer editar o campo atualmente escolhido? (s/n):'
    read *,opcao
    if(opcao=='s'.or.opcao=='S') then
      do i=1,na
        print *,                      't4'
        print *,dados(i)%nome,dados(i)%t4
        read *,               dados(i)%t4
      enddo
    endif
    rewind(10)
    verif=0    
    do i=1,na
      verif=verif+dados(i)%tf
      dados(i)%sitf='---'        
    enddo
    rewind(10)    
    do i=1,na
!      dados(i)%mt = (dados(i)%t1+dados(i)%t2+dados(i)%t3+dados(i)%t4)/4.0      
      dados(i)%mt = 0.0
      dados(i)%mp = (dados(i)%p1+dados(i)%p2+dados(i)%p3)/3.0
      dados(i)%mf = dados(i)%mp*pmp+dados(i)%mt*pmt
      dados(i)%pf = (1.0*dados(i)%tf/ha)*100
      if(verif>0)then
      if(dados(i)%mf>=4.95.and.dados(i)%pf<=30.0) then
        dados(i)%sitf='APR'
        num_apr=num_apr+1
      else if(dados(i)%pf>30.0) then
        dados(i)%sitf='rpf'
        num_rep_fal=num_rep_fal+1
!      else
!        dados(i)%sitf='rep'
!        num_rep=num_rep+1        
      else
        dados(i)%sitf='---'
        num_indef=num_indef+1
      end if
      endif ! verif
      if(dados(i)%mf<5.0.and.dados(i)%pf<=30.0) then
        dif_mf(i)=5.0-dados(i)%mf
      else
        dif_mf(i)=0.0
      end if
    end do
    write(10,106)
    write(11,104);write(12,104)
    write(11,105)
    write(12,106)
    write(13,110)
    write(13,109)
    do i=1,na
      write(10,101) dados(i)
      write(11,102) dados(i)%ra,dados(i)%t1,dados(i)%t2,dados(i)%t3,dados(i)%t4,dados(i)%mt,&
                    dados(i)%p1,dados(i)%p2,dados(i)%p3,dados(i)%mp,dados(i)%mf,&
                    dados(i)%tf,dados(i)%pf,dados(i)%sitf
      write(12,101) dados(i),dif_mf(i)
      write(13,108) dados(i)%nome
    end do
    write(11,103);write(12,103)
    write(12,107)num_apr,num_rep+num_rep_fal,num_rep_fal,num_rep,num_indef,&
                  num_apr+num_rep+num_rep_fal+num_indef
    stop
101 format(a10,1x,a7,1x,10(f4.1,1x),i2,1x,f4.1,1x,a3,1x,f4.1)
102 format(a7,1x,10(f4.1,1x),i2,1x,f4.1,1x,a3)
103 format(&
'****************************************************************************',/,&
'MT = media de trabalhos, MP = media de provas',/,'TF = total de faltas, PF = percentual de faltas',/,&
'Peso de MP = 0.8, Peso de MT = 0.2',/,&
'APR=aprovado, rep=reprovado, rpf=reprovado por faltas, ---=indefinido',/,&
'*********************************  AVISOS **********************************',/,&
'- Esta é uma planilha temporária: os campos das avaliações não são definitivos.',/,&
'- Ainda NÃO inseri as faltas.',/,&
'- Caso desconfie que a nota esta errada, fale comigo.',/,&
'  ')
104 format('             NOTAS DE FISICA COMPUTACIONAL I')
105 format('RA       T1   T2   T3   T4   MT   P1   P2   P3   MP   MF  TF   PF SITUACAO')
106 format('NOME       RA        T1   T2   T3   T4   MT   P1   P2   P3   MP   MF TF   PF SITUACAO')
107 format('Numero de alunos aprovados  = ',i3,/,&
           'Numero de alunos reprovados = ',i3,/,&
           '   Por faltas = ',i3,/,&
           '   Por nota   = ',i3,/,&
           'Numero de sit. indefinidas  = ',i3,/,&
           'Numero total de alunos      = ',i3)
108 format( a10       ,'  ____  ____  ____  ____  ____  ____  ____  ____  ____  ____  ____')
109 format(3(/,'__________  ____  ____  ____  ____  ____  ____  ____  ____  ____  ____  ____')) 
110 format('      ______________________________________________________________')
111 format(a128)
    end

