Algoritmo do CPF.pdf

  • Published on
    25-Nov-2015

  • View
    54

  • Download
    26

Transcript

Thiago PradoSexta-feira, 06 de agosto de 2004Algoritmo do CPFVamos entender um pouco como funciona o algoritmo do CPF. Na primeira parte estudaremos o funcionamento do clculo do CPF para validar os dgitos verificadores que fazem a diferenciao de um CPF para outro.Logo abaixo segue um cdigo que faz a validao do CPF, mas mesmo que voc queria desenvolver o seu prprio cdigo, em javascript ou outra linguagem, abaixo segue uma breve explicao.Esse algoritmo que responsvel pela validao do CPF foi feito de acordo com a regras do Ministrio da Fazenda.Conhecendo o clculo do algoritmo do CPFO CPF composto por onze algarismos, onde os dois ltimos so chamados de dgitos verificadores, ou seja, os dois ltimos dgitos so criados a partir dos nove primeiros. O clculo feito em duas etapas utilizando o mdulo de diviso 11.Para exemplificar melhor, iremos calcular os dgitos verificadores de um CPF imaginrio, por exemplo, 222.333.666-XX.Fazendo o clculo do primeiro dgito verificadorO primeiro dgito calculado com a distribuio dos dgitos colocando-se os valores 10, 9, 8, 7, 6, 5, 4, 3, 2 conforme a representao abaixo:Nmeros do CPF 2 2 2 3 3 3 6 6 6Valores definidospara o calculo 10 9 8 7 6 5 4 3 2Na seqncia multiplicaremos os valores de cada coluna, confira:Nmeros do CPF 2 2 2 3 3 3 6 6 6Valores definidospara o calculo 10 9 8 7 6 5 4 3 2Total 20 18 16 21 18 15 24 18 12Em seguida efetuaremos o somatrio dos resultados (20+18+...+18+12), o resultado obtido (162) ser divido por 11. Considere como quociente apenas o valor inteiro, o resto da diviso ser responsvel pelo clculo do primeiro dgito verificador.Vamos acompanhar: 162 dividido por 11 obtemos 14 de quociente e 8 de resto da diviso. Caso o resto da diviso seja menor que 2, o nosso primeiro dgito verificador se torna 0 (zero), caso contrrio subtrai-se o valor obtido de 11, que nosso caso, sendo assim nosso dgito verificador 11-8, ou seja, 3 (trs), j temos parte do CPF, confira: 222.333.666-3X.Fazendo o clculo do segundo dgito verificadorPara o clculo do segundo dgito ser usado o primeiro dgito verificador j calculado. Montaremos uma tabela semelhante anterior, s que desta vez usaremos na segunda linha os valores 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, j que estamos incorporando mais um algarismo para esse clculo. Veja:Nmeros do CPF 2 2 2 3 3 3 6 6 6 3Valores definidospara o calculo 11 10 9 8 7 6 5 4 3 2Na prxima etapa faremos como na situao do clculo do primeiro dgito verificador. Multiplicaremos os valores de cada coluna e efetuaremos o somatrio dos resultados obtidos: 22+20+18+24+21+18+30+24+18+4=201.Nmeros do CPF 2 2 2 3 3 3 6 6 6 3Valores definidospara o calculo 11 10 9 8 7 6 5 4 3 2Total 22 20 18 24 21 18 30 24 18 6Agora pegamos esse valor e dividimos por 11. Considere novamente apenas o valor inteiro do quociente, e com o resto da diviso, no nosso caso 3, usaremos para o clculo do segundo dgito verificador, assim como na primeira parte.Caso o valor do resto da diviso seja menor que 2, esse valor passa automaticamente a ser zero, que o nosso caso, caso contrrio necessrio subtrair o valor obtido de 11 para se obter o dgito verificador.Neste caso chegamos ao final dos clculos e descobrimos que os dgitos verificadores do nosso CPF hipottico so os nmeros 3 e 8, portanto o CPF ficaria assim: 222.333.666-38.Exemplo pratico da validao do CPFAgora que j conhecemos como funciona o algoritmo do CPF, vamos partir para a programao do nosso cdigo.O nosso cdigo composto por uma funo que vai retornar um valor true ou false para que o formulrio seja enviado ou no. Abaixo do cdigo tem uma descrio para um melhor acompanhamento e no fim da matria um link para o exemplo desenvolvido aqui.Exemplo:1 2 function validaCPF() {3 cpf = document.validacao.cpfID.value;4 erro = new String;5 if (cpf.length < 11) erro += "Sao necessarios 11 digitos para verificacao do CPF! "; 6 var nonNumbers = /\D/;7 if (nonNumbers.test(cpf)) erro += "A verificacao de CPF suporta apenas numeros! "; 8 if (cpf == "00000000000" || cpf == "11111111111" || cpf == "22222222222" || cpf == "33333333333" || cpf == "44444444444" || cpf == "55555555555" || cpf == "66666666666" || cpf == "77777777777" || cpf == "88888888888" || cpf == "99999999999"){9 erro += "Numero de CPF invalido!"10 }11 var a = [];12 var b = new Number;13 var c = 11;14 for (i=0; iretornar true, a varivel erro acrescida de um texto referente ao erro.Linha 8 Verificao se a varivel CPF igual a 11 caracteres repetidos que vo de 0 a 9. Se retornar true, a varivel erro acrescida de um texto referente ao erro.Linha 11 - Declarao da varivel a como uma matriz usando literal notation.Linha 12 - Declarao da varivel b como novo nmero.Linha 13 - Declarao da varivel c como o valor igual a 11.Linha 14 Loop que vai ser executado 11 vezes.Linha 15 A matriz a indexada do valor da varivel do loop recebe o caractere da varivel CPF indexado do valor da varivel do loop.Linha 16 Verificao se o valor de i menor que 9. Se retornar true a varivel b, acrescida do valor da matriz a indexada do valor da varivel do loop multiplicada pelo valor decrescido da varivel c.Linha 18 Verificao se a varivel x (que tem o valor do resto da diviso de b por 11) menor que 2. Se retornar true, a matriz a indexada de 9 recebe o valor de 0. Se retornar false a matriz a indexada de 9 recebe o valor de 11 menos o valor de x.Linha 19 e 20 As variveis b e c so reiniciadas.Linha 21 Loop que vai ser executado 10 vezes. A varivel b acrescida do valor da matriz a indexada do valor da varivel do loop multiplicada pelo valor da varivel c decrescido.Linha 22 Verificao se a varivel x (que tem o valor do resto da diviso de b por 11) menor que 2. Se retornar true a matriz a indexada de 10 recebe o valor de 0. Se retornar false a matriz a indexada de 10 recebe o valor de 11 menos o valor de x.Linha 23 Verificao se a varivel cpf indexada de 9 diferente da matriz a indexada de 9 e se a varivel CPF indexada de 10 diferente da matriz a indexada de 10. Se retornar true a varivel erro acrescida de um texto referente ao erro.Linha 26 Verificao se o tamanho da varivel erro maior que 0, se retornar true uma caixa de alerta mostrada ao usurio com o(s) erro(s) da validao. O formulrio retorna falso e no enviado.Linha 30 A funo retorna true, com isso o formulrio enviado com sucesso.Como a funo validaCPF pronta vamos partir para a parte HTML para criar o formulrio que suportara o caixa de texto para digitar o numero do CPF. O evento onSubmit do formulrio usado para retornar um valor para verificar se o mesmo vai ser enviado ou nao.Exemplo:1 2 3 4 5 Digite o numero do CPF sem utilizar os caracteres "." ou "-".Com essa explicao voc poder montar sua prpria rotina ou utilizar a que criamos, abaixo segue o link para o exemplo criado aqui.Confira o exemplo do cdigo: validaCPF.htm