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.
-
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
-
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.
-
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.
-
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 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.