PROJETO VALIDAÇÃO DE CPF – EM C E JAVA

Transcrição

PROJETO VALIDAÇÃO DE CPF – EM C E JAVA
PROJETO VALIDAÇÃO DE CPF – EM C E JAVA
ENUNCIADO(Código-fonte no final)
Considere o seguinte exemplo de CPF hipotético: 493.558.218-91.
No final de todo CPF existem 2 dígitos verificadores, neste caso 9 e 1.
Abaixo será apresentado como se calculam os mesmos.
Calculando o PRIMEIRO Dígito verificador:
Deve-se distribuir os 9 primeiros dígitos com os pesos:
10, 9, 8, 7, 6, 5, 4, 3, 2 da esquerda para direita.
4 9 3. 5 5 8. 2 1 8 – 91
Multiplicar cada dígito pelo seu respectivo peso e somar tudo.
Ex:
(10 x 4) = 40
+ (9 x 9) = 81
+ (3 x 8 ) = 24
+ (7 x 5) = 35
+ (6 x 5) = 30
+ (5 x 8 ) = 40
+ (4 x 2) = 8
+ (3 x 1) = 3
+ (2 x 8 ) = 16
Totalizando: 277
Agora deve-se calcular o resto da divisão por 11
Ex: 277 % 11 = 2
E retirar 11 deste resto.
11 – 2 = 9
Ex: d1 = 11 – (soma1%11);
caso o resultado apresente 10 ou 11, o dígito verificador será considerado zero
Ex: if((d1 == 10) || (d1 == 11))
d1 = 0;
Caso contrário, o resultado será o PRIMEIRO dígito verificador do cpf. Neste caso, foi 9.
—
Calculando o SEGUNDO Dígito verificador:
Deve-se distribuir os 10 primeiros digitos com os pesos
11, 10, 9, 8, 7, 6, 5, 4, 3 , 2 da esquerda para direita.
4 9 3. 5 5 8. 2 1 8 – 9 1
Observe que agora o primeiro dígito verificador entra no cálculo.
Multiplicar cada dígito pelo seu respectivo peso e somar tudo.
Ex:
(11 x 4) = 44
+ (10 x 9) = 90
+ (9 x 3) = 27
+ (8 x 5) = 40
+ (7 x 5) = 35
+ (6 x 8 ) = 48
+ (5 x 2) = 10
+ (4 x 1) = 4
+ (3 x 8 ) = 24
+ (2 x 9) = 18
Totalizando: 340
Agora deve-se calcular o resto da divisão por 11
Ex: 340 % 11 = 10
E retirar 11 deste resto.
11 – 10 = 1
Ex: d2 = 11 – (soma2%11);
caso o resultado apresente 10 ou 11, o dígito verificador será considerado zero
Ex: if((d2 == 10) || (d2 == 11))
d2 = 0;
Caso contrário, o resultado será o SEGUNDO dígito verificador do cpf.
Neste caso, foi 1.
Caso o cálculo do PRIMEIRO dígito seja exatamente igual ao dígito da posição 10 digitado pelo usuário E o cálculo do
SEGUNDO dígito seja exatamente igual ao dígito da posição 11 digitado pelo usuário, então o CPF é válido.
if((d1 == novo[9])&&(d2 == novo[10]))
System.out.println(“válido”);
else
System.out.println(“inválido”);
Mais detalhes de como funciona o algoritmo de geração de cpf: link
Caso queira testar vários tipos de cpf no programa, visite este site gerador de CPFs: http://www.geradorcpf.com/
ANEXO A – Código em C
/*
Nome: verifica_cpf.c
Autor: Guilherme Bezerra Fernandes
Data: 26/11/11
Descrição: Programa que valida cpf
*/
valida(char c[]);
main()
{
char v[11];
//Entrada de cpf em char
printf("CPF: ");
scanf("%s", &v);
if (valida(v))
printf("Cpf Valido");
else
printf("Cpf Invalido");
getch();
}
int valida(char cpf[11])
{
int novo[11]={}; //vetor convertido
int soma1=0, soma2=0;
char temp[1]; //temporária
int d1,d2=0; //dígito 1 e 2
int i = 0; //valor convertido de char para int
int j = 10; //contador
int k = 11; //contador
int c=0;
//conversão de todo o vetor char para int
for(c=0;c<=10;c++){
temp[0] = cpf[c];
i = atoi(temp);
novo[c] = i;
}
//armazenando valores de soma do digito 1
for(c=0;c<=8;c++){
soma1 = soma1 + (novo[c] * j);
j--;
}
//armazenando valores de soma do digito 2
for(c = 0; c <= 9; c++){
soma2 = soma2 + (novo[c] * k);
k--;
}
//busca do digito 1
d1 = 11 - (soma1%11);
if((d1 == 10) || (d1 == 11))
d1 = 0;
//busca do digito 2
d2 = 11 - (soma2%11);
if((d2 == 10) || (d2 == 11))
d2 = 0;
if((d1 == novo[9])&&(d2 == novo[10])){
return 1;
}else
return 0;
}
ANEXO B – Código em Java
/*
Nome: valida_cpf.java
Autor: Guilherme Bezerra Fernandes
Data: 30/11/11
Descrição: Programa que valida cpf em Java
*/
Import java.util.Scanner;
public classCpf
{
public static voidmain(String[] args)
{
System.out.println("CPF: ");
Scanner ent = newScanner(System.in);
if(Cpf.valida(ent.nextLine()))
System.out.println("Cpf Válido");
else
System.out.println("Cpf Inválido");
}
static boolean valida(String cpf)
{
intnovo[] = new int[11];
intsoma1=0, soma2=0;
intc,j=10,k=11;
intd1,d2=0; //dígito 1 e 2
//conversão de todo o vetor char para int
for(c=0;c<=10;c++){
novo[c] = Integer.parseInt(cpf.substring(c,c+1));
}
//armazenando valores de soma do digito 1
for(c=0;c<=8;c++){
soma1 = soma1 + (novo[c] * j);
j--;
}
//armazenando valores de soma do digito 2
for(c = 0; c <= 9; c++){
soma2 = soma2 + (novo[c] * k);
k--;
}
//busca do digito 1
d1 = 11 - (soma1%11);
if((d1 == 10) || (d1 == 11))
d1 = 0;
//busca do digito 2
d2 = 11 - (soma2%11);
if((d2 == 10) || (d2 == 11))
d2 = 0;
if((d1 == novo[9])&&(d2 == novo[10])){
return true;
}else
return false;
}
}