Vamos usar como exemplo o CPF 232.315.171-17.
Os 2 últimos dígitos, nesse caso 17, são os "validadores" do CPF. Mas como fazemos para valida-los? Como chegar a esses dígitos?
Primeiro dígito:
Para o primeiro dígito (1) devemos usar os 9 primeiros números do CPF, multiplicando de 10 à 2, como ilustrado na tabela abaixo:
CPF
|
2
|
3
|
2
|
3
|
1
|
5
|
1
|
7
|
1
|
|
Multiplicadores
|
10
|
9
|
8
|
7
|
6
|
5
|
4
|
3
|
2
|
|
Resultado
|
20
|
27
|
16
|
21
|
6
|
25
|
4
|
21
|
2
|
Total: 142
|
O total deve ser dividido por 11 (142/11) e posteriormente 11 deve ser subtraído pelo resto da divisão.
142 / 11 = 12 e resto = 10
Regra: se o resto da divisão for menor que 2 o primeiro dígito será 0.
Como nosso resto não é menor que 2 subtraímos a quantidade de dígitos pelo resto: 11-10 = 1
E assim achamos o nosso primeiro dígito: 1
Segundo dígito:
Para o segundo dígito devemos usar os 10 primeiros dígitos, incluindo o que achamos fazendo a primeira fórmula, multiplicando de 11 à 2, como ilustra a tabela abaixo:
CPF
|
2
|
3
|
2
|
3
|
1
|
5
|
1
|
7
|
1
|
1
|
|
Multiplicadores
|
11
|
10
|
9
|
8
|
7
|
6
|
5
|
4
|
3
|
2
|
|
Resultado
|
22
|
30
|
18
|
24
|
7
|
30
|
5
|
28
|
3
|
2
|
Total: 169
|
O total deve ser dividido por 11 (169/11) e posteriormente 11 deve ser subtraído pelo resto da divisão.
169 / 11 = 15 e resto = 4
Regra: se o resto da divisão for menor que 2 o segundo dígito será 0.
Como nosso resto não é menor que 2 subtraímos a quantidade de dígitos pelo resto: 11-4 = 7
E assim achamos o nosso segundo dígito: 7
Validamos então nosso CPF, pois os dois dígitos que achamos são iguais aos do CPF: 232.315.171-17.
Regra: Além das regras citadas acima o CPF não pode também ter todos os números iguais como, por exemplo: 111.111.111-11.
Função em C para validar o CPF:
int validarCPF(char cpf[]) { int i, j, digito1 = 0, digito2 = 0; if(strlen(cpf) != 11) return 0; else if((strcmp(cpf,"00000000000") == 0) || (strcmp(cpf,"11111111111") == 0) || (strcmp(cpf,"22222222222") == 0) || (strcmp(cpf,"33333333333") == 0) || (strcmp(cpf,"44444444444") == 0) || (strcmp(cpf,"55555555555") == 0) || (strcmp(cpf,"66666666666") == 0) || (strcmp(cpf,"77777777777") == 0) || (strcmp(cpf,"88888888888") == 0) || (strcmp(cpf,"99999999999") == 0)) return 0; ///se o CPF tiver todos os números iguais ele é inválido. else { ///digito 1--------------------------------------------------- for(i = 0, j = 10; i < strlen(cpf)-2; i++, j--) ///multiplica os números de 10 a 2 e soma os resultados dentro de digito1 digito1 += (cpf[i]-48) * j; digito1 %= 11; if(digito1 < 2) digito1 = 0; else digito1 = 11 - digito1; if((cpf[9]-48) != digito1) return 0; ///se o digito 1 não for o mesmo que o da validação CPF é inválido else ///digito 2-------------------------------------------------- { for(i = 0, j = 11; i < strlen(cpf)-1; i++, j--) ///multiplica os números de 11 a 2 e soma os resultados dentro de digito2 digito2 += (cpf[i]-48) * j; digito2 %= 11; if(digito2 < 2) digito2 = 0; else digito2 = 11 - digito2; if((cpf[10]-48) != digito2) return 0; ///se o digito 2 não for o mesmo que o da validação CPF é inválido } } return 1; }
Há um loop para cada dígito para ser calculado seu valor.
Se um dos dígitos não conferir com o do CPF o programa já retorna 0, informando assim que o CPF é inválido. Caso contrário a função continua para o próximo loop que faz o calculo do segundo dígito. Se este não conferir com o ultimo dígito do CPF o programa retorna 0, senão é retornado o valor 1 indicando que o CPF é válido.
Veja também: Gerador de CPF.
Cara porq o Cpf tem [11]
ResponderExcluirn deveria ser [12] por causa do \0???
Esse vetor já tem 12 posições. A linguagem C começa a todo vetor a partir da posição 0. A maioria das linguagens são assim. Uma exceção seria o MATLAB que inicia em 1.
Excluir