Universidade Federal de Minas Gerais
Instituto de Ciências Exatas
Departamento de Ciência da Computação

Algoritmos e Estruturas de Dados I

Regras para o cálculo dos dígitos verificadores do CPF

É utilizado como exemplo o número: 123456789.
 
 

  1. Calcule a soma dos produtos dos nove digitos utilizando peso dois para unidade, peso 3 para dezena, peso 4 para centena e assim sucessivamente. Exemplo:
    9*2+8*3+7*4+6*5+5*6+4*7+3*8+2*9+1*10 = 210


 

  1. A dezena do número verificador é 0 caso o resto da divisão por 11 da soma dos produtos seja 0 ou 1; caso contrario a dezena corresponde  a subtrair de 11 o resto da divisão por 11 da soma dos produtos. Exemplo:


resto da divisão de 210 por 11 é 1 então a dezena do número verificador é 0.

  1. Calcule a soma dos produtos dos dez digitos, onde o digito menos significativo passa a ser a dezena dos digitos verificadores, utilizando os seguintes pesos: 2, 3, 4, 5, 6, 7, 8, 9, 10, 11; Exemplo:


2*0+3*9+4*8+5*7+6*6+7*5+8*4+9*3+10*2+11*1=255.

  1. A unidade do número verificador é 0 caso o resto da divisão da soma dos produtos seja 0 ou 1; caso contrário a unidade corresponde a 11 menos o resto da divisão por 11 da soma dos produtos. Exemplo:


resto da divisão de 255 por 11 é 2 então a unidade do número verificador é 11-2=9.

 

Programa para cálculo dos dígitos verificadores:

 

#include <stdio.h>

main(){

  printf("Forneca o numero do CPF:");

  int cpf;

  scanf("%d",&cpf);

  printf("calculo dos digitos verificadores do cpf:%d",cpf);

  int d0, d1, d2, d3, d4, d5, d6, d7, d8;

  int somaprod1, somaprod2;

  int dezena, unidade;

  int restoAux;

  d0=cpf%10;         d1=cpf/10%10;       d2=cpf/100%10;

  d3=cpf/1000%10;    d4=cpf/10000%10;    d5=cpf/100000%10;

  d6=cpf/1000000%10; d7=cpf/10000000%10; d8=cpf/100000000%10;

  somaprod1=d0*2+d1*3+d2*4+d3*5+d4*6+d5*7+d6*8+d7*9+d8*10;

 

  restoAux=somaprod1%11;

  dezena=(restoAux<2) ? (0) : (11-restoAux);

  somaprod2=dezena*2+

  d0*3+d1*4+d2*5+d3*6+d4*7+d5*8+d6*9+d7*10+d8*11;

  restoAux=somaprod2%11;

  unidade=restoAux<2 ? 0 : 11-restoAux;

  printf("-%d",dezena);

  printf("%d\n", unidade);

}

Observe a aparência do programa quando diminuimos o uso de variáveis. Na versão abaixo temos somente 3 variáveis:

#include <stdio.h>

main(){

  printf("Forneca o numero do CPF:");

  int cpf, dezena, unidade;

  scanf("%d",&cpf);

  printf("calculo dos digitos verificadores do cpf:%d",cpf);

  dezena=(cpf%10*2+cpf/10%10*3+cpf/100%10*4+

          cpf/1000%10*5+cpf/10000%10*6+cpf/100000%10*7+

          cpf/1000000%10*8+cpf/10000000%10*9+cpf/100000000%10*10)%11<2

          ? 0

          : 11-(cpf%10*2+cpf/10%10*3+cpf/100%10*4+

            cpf/1000%10*5+cpf/10000%10*6+cpf/100000%10*7+

            cpf/1000000%10*8+cpf/10000000%10*9+cpf/100000000%10*10)%11;

  unidade=(dezena*2+

           cpf%10*3+cpf/10%10*4+cpf/100%10*5+

           cpf/1000%10*6+cpf/10000%10*7+cpf/100000%10*8+

           cpf/1000000%10*9+cpf/10000000%10*10+cpf/100000000%10*11)%11<2

           ? 0

           : 11-(dezena*2+

             cpf%10*3+cpf/10%10*4+cpf/100%10*5+

             cpf/1000%10*6+cpf/10000%10*7+cpf/100000%10*8+

             cpf/1000000%10*9+cpf/10000000%10*10+cpf/100000000%10*11)%11;

  printf("-%d",dezena);

  printf("%d", unidade);
  system("PAUSE");
  return 0;
}

 

 

O programa abaixo trata a leitura dos caracteres/dígitos do CPF sem a “agregação” da conversão “%d” da função scanf

 

int main(int argc, char *argv[]) {
  printf("Forneca os 9 digitos do CPF:");

  int cpf;
  char d0, d1, d2, d3, d4, d5, d6, d7, d8;
  scanf("%c%c%c%c%c%c%c%c%c",
         &d8,&d7,&d6,&d5,&d4,&d3,&d2,&d1,&d0);

  int somaprod1, somaprod2;
  int dezena, unidade;
  int restoAux;

  d0=d0-'0'; d1=d1-'0'; d2=d2-'0';
  d3=d3-'0'; d4=d4-'0'; d5=d5-'0';
  d6=d6-'0'; d7=d7-'0'; d8=d8-'0';

  somaprod1=d0*2+d1*3+d2*4+d3*5+d4*6+d5*7+d6*8+d7*9+d8*10;
  restoAux=somaprod1%11;
  dezena=(restoAux<2) ? (0) : (11-restoAux);

  somaprod2=dezena*2+
      d0*3+d1*4+d2*5+d3*6+d4*7+d5*8+d6*9+d7*10+d8*11;
  restoAux=somaprod2%11;
  unidade=restoAux<2 ? 0 : 11-restoAux;

  cpf=d0+d1*10+d2*100+d3*1000+d4*10000+d5*100000+
      d6*1000000+d7*10000000+d8*100000000;

  printf("calculo dos digitos verificadores do cpf:%d",cpf);
  printf("-%d",dezena);
  printf("%d\n", unidade);
  system("PAUSE");
  return 0;
}

Exercícios

 

Escreva um programa que leia os 9+2 digitos de um CPF e imprime se este CPF lido é ou não válido em termos dos dígitos verificadores. Assim se for lido 12345678909 a resposta deverá ser: 12345678909 é um CPF válido; Se for lido 12345678912 a resposta deverá ser: 12345678912 é um CPF inválido.

 

Escreva diferentes programas para diferentes classes de identificadores numéricos que podem, por exemplo ser encontrados a partir de http://en.wikipedia.org/wiki/Check_digit

 

portanto, além do CPF e CNPJ, considere o UPC, ISBN-10, ISBN-13, inscrições estaduais, CNH, dentre outros.