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

  2.  
  3. 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:

  4. resto da divisão de 210 por 11 é 1 então a dezena do número verificador é 0.
  5. 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:

  6. 2*0+3*9+4*8+5*7+6*6+7*5+8*4+9*3+10*2+11*1=255.
  7. 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:

  8. resto da divisão de 255 por 11 é 2 então a unidade do número verificador é 11-2=9.
Programa em Java para cálculo dos digitos verificadores:


class cpfsimples{
  public static void main(String args[]){
    if(args.length!=1){
      System.out.println("Forneca o numero do CPF na linha de comando");
      System.exit(0);
    }
    int cpf= Integer.parseInt(args[0]);
    System.out.println("calculo dos digitos verificadores do cpf:"+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;

    System.out.print(dezena);
    System.out.println(unidade);
  }
}



Este programa utiliza o seguinte "encantamento" :
....main(String args[]){ ....  int cpf=Integer.parseInt(args[0]); ....
Este trecho será entendido mais a frente na disciplina. Por enquanto é importante entender apenas que o resultado é atribuir um valor à variável cpf . Este valor é especifcado na linha de comando da execução do programa. O programa tem que ser executado especificando o número do CPF junto à linha de comando. Exemplo:
C>javac cpfsimples.java
C>java cpfsimples 123456789
Isto irá fazer com que o programa cpfsimples seja executado iniciando (inicializando) a variável cpf com o valor cento e vinte e três milhões, quatrocentos e cinquenta e seis mil, setecentos e oitenta e nove.
 

O programa acima utiliza uma expressão condicional de java. Uma expressão condicional é da forma:
<expressão booleana> ? <expressão1> : <expressão2>
quando o fluxo de controle atinge uma expressão condicional a <expressão booleana> é avaliada se ela for verdadeira o valor da expressão condicional é  a <expressão1> caso contrário a expressão booleana é falsa e neste caso o valor da expressão condicional é a <expressão2>;
Observe que as seqüências abaixo são equivalentes:
 
if(restoAux<2)
  dezena=0;
else
  dezena=11-restoAux;
dezena=restoAux<2 ? 0 : 11-restoAux;

Podemos eliminar algumas variáveis e neste caso o programa ficaria:



class cpfsemds{
  public static void main(String args[]){
    if(args.length!=1){
      System.out.println("Forneca o numero do CPF na linha de comando");
      System.exit(0);
    }
    int cpf= Integer.parseInt(args[0]);
    System.out.println("calculo dos digitos verificadores do cpf:"+cpf);

    int somaprod1, somaprod2;
    int dezena, unidade;
 
 

    somaprod1=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;

    dezena=somaprod1%11<2 ? 0 : 11-somaprod1%11;

    somaprod2=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;

    unidade=somaprod2%11<2 ? 0 : 11-somaprod2%11;

    System.out.print(dezena);
    System.out.println(unidade);
  }
}



Compare os dois programas. Veja que é possível escrever este programa utilizando apenas a variável cpf, mas neste caso ficaria um programa pouco legível.