COBOL - Verifica o dígito verificador do CPF - www.cadcobol.com.br


Volta ao Menu Principal


Desenvolvido por DORNELLES Carlos Alberto - Analista de Sistemas - Brasília DF. - cad_cobol@hotmail.com

Pesos: 11100908070605040302
         1         2         3         4         5         6         7         8
12345678901234567890123456789012345678901234567890123456789012345678901234567890

      *-----------------------------------------------------------------
       IDENTIFICATION DIVISION.                                         
      *-----------------------------------------------------------------
       PROGRAM-ID.       CADVECPF.                                      
       AUTHOR.           DORNELLES CARLOS ALBERTO.                      
      *-----------------------------------------------------------------
      *  PROGRAMA      : CADVECPF                                       
      *  OBJETIVO      : Verifica o digito do CPF           
      *  ANALISTA      : CARLOS ALBERTO DORNELLES                       
      *  DESENVOLVEDOR : CARLOS ALBERTO DORNELLES                       
      *  LINGUAGEM     : COBOL                                          
      *  MODO OPERACAO : BATCH                                          
      *  COMO USAR     : LKS-RETORNO ....: 0 = o codigo esta correto            
      *                                    1 = o codigo esta errado
      *                  LKS-NUMERO .....: numero informado                    
      *-----------------------------------------------------------------
      *  VERSAO DD.MM.AAAA  HISTORICO        AUTOR                             
      *  ------ ----------  ---------------  ---------------------------                           
      *    001  17.11.2011  PROGRAMA INICIAL DORNELLES CARLOS ALBERTO                           
      *-----------------------------------------------------------------
                                                                        
      *-----------------------------------------------------------------
       ENVIRONMENT DIVISION.                                            
      *-----------------------------------------------------------------
       CONFIGURATION SECTION.                                           
       SPECIAL-NAMES.    DECIMAL-POINT IS COMMA.                        
       INPUT-OUTPUT SECTION.                                            
       FILE-CONTROL.                                                    
                                                                        
      *-----------------------------------------------------------------
       DATA DIVISION.                                                   
      *-----------------------------------------------------------------
       FILE SECTION.                                                    
                                                                        
      *-----------------------------------------------------------------
       WORKING-STORAGE SECTION.                                         
      *-----------------------------------------------------------------
                                                                        
       01  WS-AUXILIARES. 
           O5 WSS-IND-D                  PIC 9(002)  VALUE ZEROES.                                              
           05 WSS-IND-N                  PIC 9(002)  VALUE ZEROES.      
           05 WSS-IND-O                  PIC 9(002)  VALUE ZEROES.      
           05 WSS-IND-P                  PIC 9(002)  VALUE ZEROES.      
           05 WSS-SOMA                   PIC 9(008)  VALUE ZEROES.      
           05 WSS-NUMERO                 PIC 9(011)  VALUE ZEROES.      
           05 WSS-NUMERO-R               REDEFINES   WSS-NUMERO.          
              10  WSS-NUMERO-T           PIC 9(001)  OCCURS 11 TIMES.   
           05 WSS-PESOS                  PIC X(020)  VALUE SPACES.      
           05 WSS-PESOS-R                REDEFINES   WSS-PESOS.           
              10  WSS-PESOS-T            PIC 9(002)  OCCURS 10 TIMES.   
           05 WSS-QUOCI                  PIC 9(008)  VALUE ZEROES.      
           05 WSS-RESTO                  PIC 9(008)  VALUE ZEROES.      
           05 WSS-MENSAGEM               PIC X(078)  VALUE SPACES.      
           05 WSS-PESOS-CPF              PIC X(028)  VALUE              
                                         '11100908070605040302'.
                                                                        
      *-----------------------------------------------------------------
       LINKAGE SECTION.                                                 
      *-----------------------------------------------------------------
                                                                        
       01  LKS-PARAMETRO.                                               
      * A variavel COMPRIMENTO somente sera usada para programas on-line                                               
           05 COMPRIMENTO                PIC S9(04) COMP.               
      *
           05 LKS-RETORNO                PIC 9(001).                    
           05 LKS-NUMERO                 PIC 9(011).                    
                                                                        
      *-----------------------------------------------------------------
      * LKS-RETORNO      = 0 - Codigo verificado esta correto           
      *                  = 1 - Codigo verificado esta com erro          
      * LKS-NUMERO       = Numero informado ao programa                 
      *-----------------------------------------------------------------
                                                                        
      *-----------------------------------------------------------------
       PROCEDURE DIVISION USING LKS-PARAMETRO.                          
      *-----------------------------------------------------------------
                                                                        
           PERFORM P1000-INICIAL
           PERFORM P2000-PRINCIPAL
           PERFORM P9500-FINAL
           GOBACK.                                                      
                                                                        
      *-----------------------------------------------------------------
       P1000-INICIAL.                                                   
      *-----------------------------------------------------------------
                                                                        
           MOVE LKS-NUMERO  TO WSS-NUMERO                     
           MOVE WSS-PESOS-CPF TO WSS-PESOS. 
                                                             
       P1000-FIM.                                                       
           EXIT.                                                        
                                                                        
      *-----------------------------------------------------------------
       P2000-PRINCIPAL.                                                 
      *-----------------------------------------------------------------

           MOVE 01            TO WSS-IND-N                              
           MOVE 02            TO WSS-IND-P                              
           MOVE 09            TO WSS-IND-O  
           MOVE 10            TO WSS-IND-D                            
           MOVE ZEROES        TO WSS-SOMA                               
           PERFORM P7000-CALC-DIGITO THRU P7000-FIM                   
                                                                        
           MOVE 01            TO WSS-IND-N                              
           MOVE 01            TO WSS-IND-P                              
           MOVE 10            TO WSS-IND-O                              
           MOVE 11            TO WSS-IND-D                            
           MOVE ZEROES        TO WSS-SOMA                               
           PERFORM P7000-CALC-DIGITO THRU P7000-FIM.                  
                                                                        
       P2000-FIM.                                                       
           EXIT.                                                        
                                                                        
      *-----------------------------------------------------------------
       P7000-CALC-DIGITO.                                             
      *-----------------------------------------------------------------
                                                                        
           PERFORM UNTIL WSS-IND-N GREATER WSS-IND-O                    
                   COMPUTE WSS-SOMA = WSS-SOMA +                        
                                     (WSS-NUMERO-T (WSS-IND-N) *        
                                      WSS-PESOS-T  (WSS-IND-P))         
                   ADD 1 TO WSS-IND-N                                   
                            WSS-IND-P                                   
           END-PERFORM                                                  
           DIVIDE WSS-SOMA BY 11 GIVING WSS-QUOCI REMAINDER WSS-RESTO   
           IF WSS-RESTO EQUAL 0 OR 1                                    
              MOVE ZEROES TO WSS-NUMERO-T (WSS-IND-D)                          
           ELSE                                                         
              SUBTRACT WSS-RESTO FROM 11 GIVING WSS-NUMERO-T (WSS-IND-D)       
           END-IF.                                                      
                                                                        
       P7000-FIM.                                                       
           EXIT.                                                        
                                                                        
      *-----------------------------------------------------------------
       P9500-FINAL.                                                     
      *-----------------------------------------------------------------
                                                                        
           IF LKS-NUMERO EQUAL WSS-NUMERO
              MOVE 0 TO LKS-RETORNO                                 
           ELSE                                                     
              MOVE 1 TO LKS-RETORNO                                 
           END-IF.
                                                                        
       P9500-FIM.                                                       
           EXIT.                                                        


Como Calcular O Dígito Verificador Do CPF

Um CPF só é valido se estiver cadastrado na base da Receita Federal.
O CPF é composto de 11 algarismos, sendo os dois últimos dígitos verificadores.
Através dos dígitos verificadores podemos saber se ele tem o formato correto sem precisar consultar a Receita Federal.

Veja aqui como é feito a geração dos dígitos verificadores do CPF.

Cálculo do primeiro dígito verificador

De posse dos 9 algarismos do CPF, multiplique:

o primeiro algarismo por 10
o segundo  algarismo por 9
o terceiro algarismo por 8
o quarto   algarismo por 7
o quinto   algarismo por 6
o sexto    algarismo por 5
o sétimo   algarismo por 4
o oitavo   algarismo por 3
o nono     algarismo por 2
  • Some todos os resultados e divida o total por 11.
  • Subtraia o resto encontrado de 11, ou seja 11 - RESTO.
  • Se o resultado for maior que 9, o primeiro dígito verificador é 0 (zero).
  • Caso contrário, o primeiro dígito verificador é o resultado da subtração.

Cálculo do segundo dígito verificador

Para obter o segundo dígito verificador, faça o mesmo procedimento que o primeiro dígito verificador.
Desta vez considerando o primeiro dígito verificador já calculado.

De posse dos 10 algarismos do CPF (os 9 mais o primeiro dígito verificador), multiplique:

o primeiro algarismo por 11
o segundo  algarismo por 10
o terceiro algarismo por 9
o quarto   algarismo por 8
o quinto algarismo por 7
o sexto  algarismo por 6
o sétimo algarismo por 5
o oitavo algarismo por 4
o nono   algarismo por 3
o décimo algarismo por 2
  • Some todos os resultados e divida o total por 11.
  • Subtraia o resto encontrado de 11, ou seja 11 - RESTO.
  • Se o resultado for maior que 9, o segundo dígito verificador é 0 (zero).
  • Caso contrário, o segundo dígito verificador é o resultado da subtração.

Exemplo prático

Considerando o CPF 123.456.789

Calculando o primeiro dígito verificador - multiplicando

o primeiro algarismo por 10 (1 x 10 = 10)
o segundo  algarismo por  9 (2 x 9 = 18)
o terceiro algarismo por  8 (3 x 8 = 24)
o quarto algarismo por 7 (4 x 7 = 28)
o quinto algarismo por 6 (5 x 6 = 30)
o sexto  algarismo por 5 (6 x 5 = 30)
o sétimo algarismo por 4 (7 x 4 = 28)
o oitavo algarismo por 3 (8 x 3 = 24)
o nono   algarismo por 2 (9 x 2 = 18)
  • Somando todos os resultados (10 + 18 + 24 + 28 + 30 + 30 + 28 + 24 + 18 = 210)
  • Dividindo o total por 11 (210 / 11)
  • O resto desta divisão é 1
  • Subtraindo o resto encontrado de 11 (11 - 1 = 10).
  • O resultado é maior que 9, então o primeiro dígito verificador é 0 (zero).

Calculando o segundo dígito verificador - multiplicando

o primeiro algarismo por 11 (1 x 11 = 11)
o segundo  algarismo por 10 (2 x 10 = 10)
o terceiro algarismo por 9 (3 x 9 = 27)
o quarto   algarismo por 8 (4 x 8 = 32)
o quinto algarismo por 7 (5 x 7 = 35)
o sexto  algarismo por 6 (6 x 6 = 36)
o sétimo algarismo por 5 (7 x 5 = 35)
o oitavo algarismo por 4 (8 x 4 = 32)
o nono   algarismo por 3 (9 x 3 = 27)
o décimo algarismo por 2 (0 x 2 = 0)
  • Somando todos os resultados (11 + 20 + 27 + 32 + 35 + 36 + 35 + 32 + 27 + 0 = 255)
  • Dividindo o total por 11 (255 / 11)
  • O resto desta divisão é 2
  • Subtraindo o resto encontrado de 11 (11 - 2 = 9).

Resultado final: 123.456.789-09