Problemas ao validar CPF usando array

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?

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());
}

}

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?

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

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

Agradeço desde já

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

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.

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

[code]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 (00000000000): ");  
    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);  

}

}[/code]

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…

[code]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;
}

}[/code]

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!

[quote=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[/quote]

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…

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