4.1 Dígito Verificador Módulo 11

Fortran no Raspberry Pi

Programa dv11chk.f90 compilado no Geany no Raspberry Pi
Programa dv11chk.f90 compilado no Geany no Raspberry Pi
Programa para validar o dígito verificador (DV ou DAC) módulo 11, conforme especificado pela Febraban

Este programa pode ser utilizado para validar o NIF (Número de Identificação Fiscal) de Portugal.

! @file    dv11chk.f90
! @author  Reficio
! @version 1.0
! 
! @section DESCRIPTION
!
! Função para validar o dígito verificador (DV ou DAC) módulo 11.
!
! O DAC (Dígito de Auto-Conferência) módulo 11 de um número é calculado
! multiplicando cada algarismo do número pela seqüência de pesos
! 2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4.... posicionados da direita para a
! esquerda. A soma dos resultados dessa multiplicação é dividida por 11,
! obtém-se o resto da divisão, este resto deve ser subtraído de 11,
! o resultado da subtração é o DAC. Observação: Quando o resto da divisão
! for igual a 0 ou 1, atribuí-se ao DAC o digito “0”, e quando for 10,
! atribuí-se ao DAC o digito “1”. (Padrão FEBRABAN)
!
! Este programa pode ser utilizado para validar o NIF (Número de
! Identificação Fiscal) de Portugal. (https://www.nif.pt)
!
! @param  Número com o DV na última posição.
! @return .TRUE. se o dígito verificador estiver correto;
!         .FALSE. se o dígito verificador estiver incorreto.
!
! @see: https://www.bb.com.br/docs/pub/emp/mpe/dwn/PadraoCodigoBarras.pdf
!
FUNCTION dv11chk(numero) RESULT(correto)
    ! Função para validar o dígito verificador (DV ou DAC) módulo 11.
    ! Recebe como argumento o número a ser verificado e retorna verdadeiro
    ! ou falso conforme o dígito verificador esteja correto ou não.
    IMPLICIT NONE
    CHARACTER (LEN=*), INTENT(IN) :: numero
    LOGICAL :: correto
    INTEGER :: i, digito, digpos, peso, soma, dvcalc
    CHARACTER :: dv             ! Dígito verificador recebido
    digpos = LEN(numero)        ! Posição do dígito verificador
    dv = numero(digpos:digpos)  ! Dígito verificador
    peso = 2                    ! Multiplicador
    soma = 0                    ! Somatório do dígito * peso
    digpos = digpos - 1         ! Posição do último dígito antes do DV
    DO i = digpos, 1, -1        ! Cálculo do dígito verificador
       digito = ICHAR(numero(i:i)) - ICHAR('0')
       IF (peso > 9) THEN
          peso = 2
       END IF
       soma = soma + (digito * peso)
       peso = peso + 1
    END DO
    dvcalc = 11 - MOD(soma, 11)
    IF (dvcalc >= 10) THEN
       dvcalc = 0
    END IF
    IF ( dvcalc == (ICHAR(dv) - ICHAR('0'))) THEN
       correto = .TRUE.
    ELSE
       correto = .FALSE.
    END IF 
    RETURN
END FUNCTION dv11chk
PROGRAM dv11
    ! Programa para validar o dígito verificador módulo 11.
    ! Lê os dados do arquivo em disco 'dv11chk.dat'
    ! e chama a função 'dv11chk' para verificar se o dígito
    ! verificador do número (último dígito) está correto.
    IMPLICIT NONE
    LOGICAL :: dv11chk
    INTEGER :: ios
    CHARACTER*80 :: numero
    OPEN(1, FILE='dv11chk.dat')
    DO
        READ(1,*, IOSTAT=ios) numero
        IF (ios .NE. 0) THEN
           EXIT
        END IF
        IF (dv11chk(TRIM(numero))) THEN
           PRINT *, TRIM(numero), ' O Dígito verificador está correto!'
        ELSE
           PRINT *, TRIM(numero), ' O Dígito verificador está errado!'
        END IF 
    END DO
    CLOSE(1)
    STOP
END PROGRAM dv11

Makefile:

dv11chk: dv11chk.f90
	gfortran dv11chk.f90 -o dv11chk
clean:
	rm dv11chk

Arquivo ‘dv11chk.dat’ (massa de teste):

505208113
508570654
505781034
504550632
505674840
509414125
502687827
502334967
507355075
501974610
508442915
502833424
505583887
507442423
507086082
509387152
509372708
507200110
504214381
504018876
506183157
502683899
504276514
504902156
508572894
504822713
505441632
507826981
504598015
012300678960
82200002150482009741232201540982901086059400
0123456788
   0123456789 

Nota: Só o penúltimo registro está com o dígito verificador errado.

Execução:

 505208113 O Dígito verificador está correto!
 508570654 O Dígito verificador está correto!
 505781034 O Dígito verificador está correto!
 504550632 O Dígito verificador está correto!
 505674840 O Dígito verificador está correto!
 509414125 O Dígito verificador está correto!
 502687827 O Dígito verificador está correto!
 502334967 O Dígito verificador está correto!
 507355075 O Dígito verificador está correto!
 501974610 O Dígito verificador está correto!
 508442915 O Dígito verificador está correto!
 502833424 O Dígito verificador está correto!
 505583887 O Dígito verificador está correto!
 507442423 O Dígito verificador está correto!
 507086082 O Dígito verificador está correto!
 509387152 O Dígito verificador está correto!
 509372708 O Dígito verificador está correto!
 507200110 O Dígito verificador está correto!
 504214381 O Dígito verificador está correto!
 504018876 O Dígito verificador está correto!
 506183157 O Dígito verificador está correto!
 502683899 O Dígito verificador está correto!
 504276514 O Dígito verificador está correto!
 504902156 O Dígito verificador está correto!
 508572894 O Dígito verificador está correto!
 504822713 O Dígito verificador está correto!
 505441632 O Dígito verificador está correto!
 507826981 O Dígito verificador está correto!
 504598015 O Dígito verificador está correto!
 012300678960 O Dígito verificador está correto!
 82200002150482009741232201540982901086059400 O Dígito verificador está correto!
 0123456788 O Dígito verificador está errado!
 0123456789 O Dígito verificador está correto!