Problemas ao validar CPF usando array

11 respostas
Rudy

Aloha pessoa!!! Blz com todos?

Tô precisando de algumas dicas. Eu estive sondando na net e achei o calculo que era feito para validar numero de cpf.
Achei bem interesanto e acho que també é util saber isso, por isso resolvi tentar fazer essa verificação em java, mas estou tendo dificuldade.

Olhem o código que fiz até agora, não sei se estou no caminho certo.

public class ValidaCPF
   {
      private int [] cpf;
   
       public ValidaCPF()
      {
      //cria array para receber os digitos do cpf
         cpf = new int [11];
      }
   /*
   *metodo para vericar validade do cpf
   */
       public void validandoCPF()
      {
         int mult = 10;
         int soma = 0;
         int sub = 11;
         int i = 0;
      //multiplica os 9 primeiros digitos numa sequencia
      //decrescente iniciando por 10
         while( cpf[i] <= 9 ){
            soma = cpf[i] * mult + soma;
            i++;
            mult--;
         }
      
         int div;
         int ver;
         int ok;
      
         div = soma/11;
         ver = div*11;
         ok = soma - ver;
      //compara o resultado com o digito 10
         if(ok == 0 || ok == 1){
            cpf[10] = 0;
         }
         else{
            cpf[10] = 11-ok;
         }
      
         int multi = 11;
        //multiplica os 9 primeiros digitos numa sequencia
      //decrescente iniciando por 11
         while(cpf[i] <= 9){
            soma = cpf[i]*multi+soma;
            i++;
            multi--;
         }			
         soma = soma+ok;
         int div1;
         int ver1;
         int ok1;
         div1 = soma/11;
         ver1 = div1*11;
         ok1 = soma - ver;
      //compara o resultado com o digito 11
         if(ok1 == 0 || ok1 == 1){
            cpf[11] = 0;
         }
         else{
            cpf[11] = 11-ok1;
         }	
      }
   }

Olhando isso que fiz, imagino que preciso escrever um método para receber o indices do array que representarão o cpf, ñ sei como fazer isso.

E lá no final ñ sei como colocar um if para fazer a comparação dos resultados obtidos e retornal verdadeiro ou falso.
Sei que já existem varios códigos para validar cpf, poderia olhar eles, mas quero terminar esse que eu proprio comecei, por isso estou pedindo ajudo a vc’ e não copiando um algoritmo pronto.

Alguem pode me ajudar?

11 Respostas

F

Olá amigo, concordo com vc, existem alguns métodos melhores para validação da cpf, mas como vc, quer ver este funcionando ai vai!!!

//Classe que efetua a validação do cpf…

public class ValidaCPF

{

private int [] cpf;

//construtor que espera um array, com o cpf a ser validado

public ValidaCPF(int[] cpf )

{

//cria array para receber os digitos do cpf

this.cpf = cpf;

}

/*

*metodo para vericar validade do cpf

*/

public boolean validandoCPF()

{

int mult = 10;

int soma = 0;

int sub = 11;

int i = 0;

int v1;

int v2;
//multiplica os 9 primeiros digitos numa sequencia

//decrescente iniciando por 10

while( i < 9 ){

soma += (cpf[i] * mult);

i++;

mult;

}
int div;  
  int ver;  
  int ok;  
 
  div = soma%11;
//compara o resultado com o digito 10

if(div < 2){

v1 = 0;

}

else{

v1 = 11-div;

}
int multi = 11;  
  soma = 0;
  i=0;
 //multiplica os 9 primeiros digitos numa sequencia
//decrescente iniciando por 11

while(i < 10){

soma += cpf[i]*multi;

i++;

multi;

}

//soma = soma+ok;

int div1;
div1 = soma%11;
  
  //ver1 = div1*11;  
  //ok1 = soma - ver;
//compara o resultado com o digito 11

if(div1 < 2){

v2 = 0;

}

else{

v2 = 11-div1;

}

//efetua a validação se os digitos verificadores estão corretos

if(cpf[9]==v1 && cpf[10]== v2){

return true;

}

else

return false;

}

}

//Classe que chama a classe ValidaCPF, passando como parâmetro um array de int com o numero do cpf a ser validado…
public class ExecCPF {

public static void main(String[] args) {
	int[] p = new int[11];
	p[0] = 4;
	p[1] = 4;
	p[2] = 6;
	p[3] = 0;
	p[4] = 3;
	p[5] = 2;
	p[6] = 2;
	p[7] = 7;
	p[8] = 4;
	p[9] = 8;
	p[10] = 1;
	
	ValidaCPF c = new ValidaCPF( p );
	System.out.println(c.validandoCPF());
}

}

Rudy

Fabio_De_Carli cara eu entendi seu código ele compilo e tauz, mas na hora que eu instâncio um objeto e vou digitar os numeros do array, tupo digito 2 e diz que o tipo é incompativel que é esperado um inteiro, no caso 2 seria um inteiro neh?

F

Olá Rudy,

Cara, se vc quiser te mando um método que eu fiz para o calculo de cpf como tb de cnpj, se estiver interessado é só dar um toque, e se quiser com ja com a interface grafica eu mando …

Generosamente,

Frid

71C4700

Caro Frid, eu aceito sua oferta caso esteja ainda em pé !!
Poderia mandar a validação do cpf e cnpj ?

Agradeço desde já

F

Olá 71C4700,

Desculpe a demora, mas lá vai, lembrando que eu não usei vetores nesse programa, usei uma lógica simples e objetiva, e lá vai:

public void gerar_cpf(String cpf){

        char numero;
        int comp;
        int soma=0;
        int controle1=10;
        int controle2=11;
        if (cpf.length()< 9 ){
            JOptionPane.showMessageDialog(null,"Tamanho menor que 9 Digitos !!!");
            }
        else if (cpf.length()> 9 ){
            JOptionPane.showMessageDialog(null,"Tamanho maior que 9 Digitos !!!");
            }
        else {
            for (int i=0;i<9;i++){
                numero = cpf.charAt(i);
                String num_char = String.valueOf(numero);
                soma += Integer.parseInt(num_char) * controle1;
                controle1 --;
            }//fim do for
            comp = soma%11;
            if(comp < 2){verif1 = 0;}
            else verif1 = 11-comp;
            soma=0;
            cpf = cpf + verif1;
            for (int i=0;i<10;i++){
                numero = cpf.charAt(i);
                String num_char = String.valueOf(numero);
                soma += Integer.parseInt(num_char) * controle2;
                controle2--;
                }//fim do for
            comp = soma%11;
            if(comp < 2){verif2 = 0;}
            else verif2 = 11-comp;
            resultado = resultado + "-"+ verif1+verif2;
            lblresul.setText(resultado);            
            }//fim do else
       }//fim do metodo
    public void gerar_cnpj(String cnpj){

        char numero;
        int comp;
        int soma=0;
        int verif1;
        int verif2;
        int controle1=5;
        int controle2=6;
        int controle3=9;
        int controle4=9;
        if (cnpj.length()< 12 )
        {
            JOptionPane.showMessageDialog(null,"Tamanho menor que 12 Digitos !!!");
        }
        else if (cnpj.length()> 12 )
        {
            JOptionPane.showMessageDialog(null,"Tamanho maior que 12 Digitos !!!");
        }
        else {
        for (int i=0;i<12;i++)
           {
                numero = cnpj.charAt(i);
                String num_char = String.valueOf(numero);
                //JOptionPane.showMessageDialog(null,"I igual a "+ String.valueOf(i)+" e numero "+ numero);
        if (i < 4)
            {
                soma += Integer.parseInt(num_char) * controle1;
                controle1 --;
            }
        else
        {
            soma += Integer.parseInt(num_char) * controle3;
            controle3 --;
        }
      }//fim do for
        comp = soma%11; 
        if(comp < 2){verif1 = 0;}
        else verif1 = 11-comp;
        soma=0;
        cnpj = cnpj + verif1;
        for (int i=0;i<13;i++)
        {
            numero = cnpj.charAt(i);
            String num_char = String.valueOf(numero);
            if (i < 5)
            {
                soma += Integer.parseInt(num_char) * controle2;
                controle2 --;
            }
            else
            {
                soma += Integer.parseInt(num_char) * controle4;
                controle4 --;
            }
        }//fim do for
        comp = soma%11;
        if(comp < 2){verif2 = 0;}
        else verif2 = 11-comp;
        resultado = resultado + "-"+ verif1+verif2;
        lblresul.setText(resultado);   
      }//fim do else
    }//fim do metodo

Espero ter ajudado, é só chamar o método com o argumento dos digitos do cpf ou cnpj e pronto, e é retornado com os digitos verificadores válidos, qq dúvida pode postar …

Generosamente,

Frid

71C4700

Grande Frid, gostei de sua solução.
Eu estava procurando estes dias uma solução mais otimizada e rapida, então acabei lendo sobre regex.
Ai não consegui encontra como fazer isso utilizando este validador, que já vem pronto.
Por ele já vim pronto, tanto diminui o trabalho quanto otimizaria a validação.
Gostei mesmo de sua solução, mas ajude-me a continuar a procura por esta mesma solução utilizando regex.

Agradeço pelo compartinhamento de codigo.

F

Olá 71C4700,

Opa, qdo eu poder ajudar estamos aí, eu tb não gostei dos códigos que eu achava na net, então eu descobri como fazia o calculo, e coloquei no papel e fui montando em algoritmo, depois codifiquei, o tamanho com os dois métodos ficaram menor que alguns de apenas do cpf, mas então, poste mais ou menos o seu código com regex para tentarmos botar ele pra rodar, blz, abraço …

Generosamente,

Frid

claudneto
package modulo2;  

import java.util.Scanner;  
  
public class VerificarCPF {  
      
    public static void main (String[] args) {  
        Scanner sc = new Scanner(System.in);  
        System.out.println("Digite o CPF ([telefone removido]): ");  
        String cpf = sc.nextLine();  
        if (CPF(cpf)) {  
            System.out.println ("Dígito válido!");  
        }  
        else {  
            System.out.println ("Dígito inválido!");  
        }  
    }  
      
    static public boolean CPF (String strCpf )  
   {  
      int     d1, d2;  
      int     digito1, digito2, resto;  
      int     digitoCPF;  
      String  nDigResult;  
  
      d1 = d2 = 0;  
      digito1 = digito2 = resto = 0;  
  
      for (int nCount = 1; nCount < strCpf.length() - 1; nCount++)  
      {  
         digitoCPF = Integer.valueOf (strCpf.substring(nCount -1, nCount)).intValue();  
  
         //multiplique a ultima casa por 2 a seguinte por 3 a seguinte por 4 e assim por diante.  
         d1 = d1 + ( 11 - nCount ) * digitoCPF;  
  
         //para o segundo digito repita o procedimento incluindo o primeiro digito calculado no passo anterior.  
         d2 = d2 + ( 12 - nCount ) * digitoCPF;  
      };  
  
      //Primeiro resto da divisão por 11.  
      resto = (d1 % 11);  
  
      //Se o resultado for 0 ou 1 o digito é 0 caso contrário o digito é 11 menos o resultado anterior.  
      if (resto < 2)  
         digito1 = 0;  
      else  
         digito1 = 11 - resto;  
  
      d2 += 2 * digito1;  
  
      //Segundo resto da divisão por 11.  
      resto = (d2 % 11);  
  
      //Se o resultado for 0 ou 1 o digito é 0 caso contrário o digito é 11 menos o resultado anterior.  
      if (resto < 2)  
         digito2 = 0;  
      else  
         digito2 = 11 - resto;  
  
      //Digito verificador do CPF que está sendo validado.  
      String nDigVerific = strCpf.substring (strCpf.length()-2, strCpf.length());  
  
      //Concatenando o primeiro resto com o segundo.  
      nDigResult = String.valueOf(digito1) + String.valueOf(digito2);  
  
      //comparar o digito verificador do cpf com o primeiro resto + o segundo resto.  
      return nDigVerific.equals(nDigResult);  
   }  
  
}

Tá ai um código...mude ele se vc quiser...usando array...mas eu acho que desse jeito é mais fácil...

Obs.: Faça buscas antes de criar um novo tópico...na mesma página tinha um tópico sobre isso...

claudneto
package CPF;

import java.util.Scanner;

public class VerificadorCPF {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		VerificadorCPF vcpf = new VerificadorCPF();
		
		System.out.println("Digite o CPF: ");
		String cpf = sc.nextLine();
		if (vcpf.verificaCPF(cpf)) {
			System.out.println("CPF Válido!");
		}
		else {
			System.out.println("CPF Inválido!");
		}
	}
	
	public boolean verificaCPF (String cpf) {
		boolean verifica = false;
		int[] digitos = new int[11];
		int soma1 = 0, soma2 = 0;
		int resto = 0;
		int d1 = 0, d2 = 0;
		
		for (int i = 0; i < digitos.length - 1; i++) {
			digitos[i] = cpf.charAt(i);
		}
		
		soma1 = (digitos[0] * 9) + (digitos[1] * 8) + (digitos[2] * 7) + (digitos[3] * 6) + (digitos[4] * 5)
				+ (digitos[5] * 4) + (digitos[6] * 3) + (digitos[7] * 2);
		resto = soma1 % 11;
		
		if (resto < 2) {
			d1 = 0;
		}
		else {
			d1 = 11 - d1;
		}
		
		if (d1 == digitos[9]) {
			
			soma2 = (digitos[0] * 10) + (digitos[1] * 9) + (digitos[2] * 8) + (digitos[3] * 7) + (digitos[4] * 6)
					+ (digitos[5] * 5) + (digitos[6] * 4) + (digitos[7] * 3) + (digitos[8] * 2);
			
			resto = soma2 % 11;
						
			if (resto < 2) {
				d2 = 0;
			}
			else {
				d2 = 11 - d2;
			}
			
			if (d2 == digitos[10]) {
				verifica = true;
			}
		}
		return verifica;
	}
}

Tá com algum errinho besta no método verificaCPF...

É algum erro que eu estou cansado pra descobrir...mas tá ai...com Array...só tenta consertar ele e ele será todo seu...e funcionando!

Rudy

frid:
Olá Rudy,

Cara, se vc quiser te mando um método que eu fiz para o calculo de cpf como tb de cnpj, se estiver interessado é só dar um toque, e se quiser com ja com a interface grafica eu mando …

Generosamente,

Frid

Frid vlw pelo método achei interesante, já que sou novo nisso, nem sonha que podia receber o numero como String, Mas como disse quando postei minha duvida, quero fazer minha classe funcionar, eu andei pela net e vi que existem varios metodos que fazem esta validação…

Mas valeu peguei seu metodo, vai me servi como estudo…

F

Olá Rudy,

Opa, qdo eu poder ajudar pode ter certeza que eu ajudo, como vc mesmo disse, tem vários métodos aí na net, o meu pode ser melhorado e muito, eu fiz simples pq antes eu tinha feito em português estruturado, daí passei para o código sem buscar métodos mais avançados, mas como diz meu professor, não tente enfeitar muito o código, basta ser simples e objetivo seguindo os requisitos, rsrsrs, vlw, t+ …

Generosamente,

Frid

Criado 21 de setembro de 2008
Ultima resposta 29 de set. de 2008
Respostas 11
Participantes 5