É utilizado
como exemplo o número: 123456789.
resto da divisão de 210 por 11 é 1 então a dezena do número verificador é 0.
2*0+3*9+4*8+5*7+6*6+7*5+8*4+9*3+10*2+11*1=255.
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.