Вы находитесь на странице: 1из 5

Thiago Prado

Sexta-feira, 06 de agosto de 2004


Algoritmo do CPF
Vamos entender um pouo omo funiona o algoritmo do CPF! "a primeira parte
estudaremos o funionamento do #lulo do CPF para $alidar os d%gitos $erifiadores &ue
fa'em a diferenia()o de um CPF para outro!
*ogo a+aixo segue um ,digo &ue fa' a $alida()o do CPF, mas mesmo &ue $o- &ueria
desen$ol$er o seu pr,prio ,digo, em .a$asript ou outra linguagem, a+aixo segue uma
+re$e explia()o!
/sse algoritmo &ue 0 respons#$el pela $alida()o do CPF foi feito de aordo om a regras
do 1inist0rio da Fa'enda!
Conhecendo o clculo do algoritmo do CPF
2 CPF 0 omposto por on'e algarismos, onde os dois 3ltimos s)o hamados de d%gitos
$erifiadores, ou se.a, os dois 3ltimos d%gitos s)o riados a partir dos no$e primeiros! 2
#lulo 0 feito em duas etapas utili'ando o m,dulo de di$is)o 44!
Para exemplifiar melhor, iremos alular os d%gitos $erifiadores de um CPF imagin#rio,
por exemplo, 222!555!666-66!
Fazendo o clculo do primeiro dgito verificador
2 primeiro d%gito 0 alulado om a distri+ui()o dos d%gitos oloando-se os $alores 40, 7,
8, 9, 6, :, 4, 5, 2 onforme a representa()o a+aixo;
"3meros do CPF 2 2 2 5 5 5 6 6 6
Valores definidos
para o alulo
40 7 8 9 6 : 4 5 2
"a se&<-nia multipliaremos os $alores de ada oluna, onfira;
"3meros do CPF 2 2 2 5 5 5 6 6 6
Valores definidos
para o alulo
40 7 8 9 6 : 4 5 2
Total 20 48 46 24 48 4: 24 48 42
/m seguida efetuaremos o somat,rio dos resultados =20>48>!!!>48>42?, o resultado o+tido
=462? ser# di$ido por 44! Considere omo &uoiente apenas o $alor inteiro, o resto da
di$is)o ser# respons#$el pelo #lulo do primeiro d%gito $erifiador!
Vamos aompanhar; 462 di$idido por 44 o+temos 44 de &uoiente e 8 de resto da di$is)o!
Caso o resto da di$is)o se.a menor &ue 2, o nosso primeiro d%gito $erifiador se torna 0
='ero?, aso ontr#rio su+trai-se o $alor o+tido de 44, &ue 0 nosso aso, sendo assim nosso
d%gito $erifiador 0 44-8, ou se.a, 5 =tr-s?, .# temos parte do CPF, onfira; 222!555!666-56!
Fazendo o clculo do segundo dgito verificador
Para o #lulo do segundo d%gito ser# usado o primeiro d%gito $erifiador .# alulado!
1ontaremos uma ta+ela semelhante @ anterior, s, &ue desta $e' usaremos na segunda linha
os $alores 44, 40, 7, 8, 9, 6, :, 4, 5, 2, .# &ue estamos inorporando mais um algarismo para
esse #lulo! Ve.a;
"3meros do CPF 2 2 2 5 5 5 6 6 6 5
Valores definidos
para o alulo
44 40 7 8 9 6 : 4 5 2
"a pr,xima etapa faremos omo na situa()o do #lulo do primeiro d%gito $erifiador!
1ultipliaremos os $alores de ada oluna e efetuaremos o somat,rio dos resultados
o+tidos; 22>20>48>24>24>48>50>24>48>4A204!
"3meros do CPF 2 2 2 5 5 5 6 6 6 5
Valores definidos
para o alulo
44 40 7 8 9 6 : 4 5 2
Total 22 20 48 24 24 48 50 24 48 6
Agora pegamos esse $alor e di$idimos por 44! Considere no$amente apenas o $alor inteiro
do &uoiente, e om o resto da di$is)o, no nosso aso 5, usaremos para o #lulo do
segundo d%gito $erifiador, assim omo na primeira parte!
Caso o $alor do resto da di$is)o se.a menor &ue 2, esse $alor passa automatiamente a ser
'ero, &ue 0 o nosso aso, aso ontr#rio 0 neess#rio su+trair o $alor o+tido de 44 para se
o+ter o d%gito $erifiador!
"este aso hegamos ao final dos #lulos e deso+rimos &ue os d%gitos $erifiadores do
nosso CPF hipot0tio s)o os n3meros 5 e 8, portanto o CPF fiaria assim; 222!555!666-58!
Exemplo pratico da validao do CPF
Agora &ue .# onheemos omo funiona o algoritmo do CPF, $amos partir para a
programa()o do nosso ,digo!
2 nosso ,digo 0 omposto por uma fun()o &ue $ai retornar um $alor true ou false para
&ue o formul#rio se.a en$iado ou n)o! A+aixo do ,digo tem uma desri()o para um
melhor aompanhamento e no fim da mat0ria um linB para o exemplo desen$ol$ido a&ui!
Exemplo:
1 Csript languageADEa$asriptDF
function $alidaCPF=? G
! pf A doument!$alidaao!pfHI!$alueJ
" erro A neK StringJ
# if =pf!length C 44? erro >A DSao neessarios 44 digitos para $erifiaao do
CPFL DJ
$ $ar non"um+ers A MNIMJ
% if =non"um+ers!test=pf?? erro >A DA $erifiaao de CPF suporta apenas
numerosL DJ
& if =pf AA D00000000000D OO pf AA D44444444444D OO pf AA D22222222222D OO
pf AA D55555555555D OO pf AA D44444444444D OO pf AA D:::::::::::D OO pf AA
D66666666666D OO pf AA D99999999999D OO pf AA D88888888888D OO pf AA
D77777777777D?G
' erro >A D"umero de CPF in$alidoLD
1( P
11 $ar a A QRJ
1 $ar + A neK "um+erJ
1! $ar A 44J
1" for =iA0J iC44J i>>?G
1# aQiR A pf!harAt=i?J
1$ if =i C 7? + >A =aQiR S --?J
1% P
1& if ==x A + T 44? C 2? G aQ7R A 0 P else G aQ7R A 44-x P
1' + A 0J
( A 44J
1 for =UA0J UC40J U>>? + >A =aQUR S --?J
if ==x A + T 44? C 2? G aQ40R A 0J P else G aQ40R A 44-xJ P
! if ==pf!harAt=7? LA aQ7R? OO =pf!harAt=40? LA aQ40R??G
" erro >ADIigito $erifiador om pro+lemaLDJ
# P
$ if =erro!length F 0?G
% alert=erro?J
& return falseJ
' P
!( return trueJ
!1 P
! CMsriptF
*inha 5 V Ielara()o da $ari#$el pf respons#$el por reuperar o $alor da text +ox &ue tem
o numero do CPF!
*inha 4 V Ielara()o da $ari#$el erro omo no$a String respons#$el por sal$ar os erros
&ue aonte(am na $alida()o!
*inha : V Verifia()o se o tamanho da $ari#$el pf 0 menor &ue 44 arateres! Se retornar
true, a $ari#$el erro 0 aresida de um texto referente ao erro!
*inha 6 V Ielara()o da $ari#$el non"um+ers respons#$el por onter o $alor para a
heagem utili'ando Wegular /xpression!
*inha 9 V Verifia()o se a $ari#$el CPF ont0m arateres &ue n)o s)o n3meros! Se
retornar true, a $ari#$el erro 0 aresida de um texto referente ao erro!
*inha 8 V Verifia()o se a $ari#$el CPF0 igual a 44 arateres repetidos &ue $)o de 0 a 7!
Se retornar true, a $ari#$el erro 0 aresida de um texto referente ao erro!
*inha 44 - Ielara()o da $ari#$el a omo uma matri' usando literal notation!
*inha 42 - Ielara()o da $ari#$el + omo no$o n3mero!
*inha 45 - Ielara()o da $ari#$el omo o $alor igual a 44!
*inha 44 V *oop &ue $ai ser exeutado 44 $e'es!
*inha 4: V A matri' a indexada do $alor da $ari#$el do loop ree+e o aratere da $ari#$el
CPF indexado do $alor da $ari#$el do loop!
*inha 46 V Verifia()o se o $alor de i 0 menor &ue 7! Se retornar true a $ari#$el +, 0
aresida do $alor da matri' a indexada do $alor da $ari#$el do loop multipliada pelo
$alor deresido da $ari#$el !
*inha 48 V Verifia()o se a $ari#$el x =&ue tem o $alor do resto da di$is)o de + por 44? 0
menor &ue 2! Se retornar true, a matri' a indexada de 7 ree+e o $alor de 0! Se retornar
false a matri' a indexada de 7 ree+e o $alor de 44 menos o $alor de x!
*inha 47 e 20 V As $ari#$eis + e s)o reiniiadas!
*inha 24 V *oop &ue $ai ser exeutado 40 $e'es! A $ari#$el + 0 aresida do $alor da
matri' a indexada do $alor da $ari#$el do loop multipliada pelo $alor da $ari#$el
deresido!
*inha 22 V Verifia()o se a $ari#$el x =&ue tem o $alor do resto da di$is)o de + por 44? 0
menor &ue 2! Se retornar true a matri' a indexada de 40 ree+e o $alor de 0! Se retornar
false a matri' a indexada de 40 ree+e o $alor de 44 menos o $alor de x!
*inha 25 V Verifia()o se a $ari#$el pf indexada de 7 0 diferente da matri' a indexada de
7 e se a $ari#$el CPF indexada de 40 0 diferente da matri' a indexada de 40! Se retornar
true a $ari#$el erro 0 aresida de um texto referente ao erro!
*inha 26 V Verifia()o se o tamanho da $ari#$el erro 0 maior &ue 0, se retornar true uma
aixa de alerta 0 mostrada ao usu#rio om o=s? erro=s? da $alida()o! 2 formul#rio retorna
falso e n)o 0 en$iado!
*inha 50 V A fun()o retorna true, om isso o formul#rio 0 en$iado om suesso!
Como a fun()o $alidaCPF pronta $amos partir para a parte XT1* para riar o formul#rio
&ue suportara o aixa de texto para digitar o numero do CPF! 2 e$ento onSu+mit do
formul#rio 0 usado para retornar um $alor para $erifiar se o mesmo $ai ser en$iado ou
nao!
Exemplo:
1 Cform ationAD$alidaCPF!htmD nameAD$alidaaoD onSu+mitADreturn $alidaCPF=?DF
Cinput tUpeADtextD nameADpfHID idADpfHID maxlengthAD44D $alueADDF
! Cinput nameADSu+mitD tUpeADsu+mitD $alueADen$iarDF
" CMformF
# Iigite o numero do CPF sem utili'ar os arateres D!D ou D-D!
Com essa explia()o $o- poder# montar sua pr,pria rotina ou utili'ar a &ue riamos,
a+aixo segue o linB para o exemplo riado a&ui!
Confira o exemplo do ,digo; $alidaCPF!htm