Algoritmo de Validação de CPF


Novo blog em breve...fique por dentro ->

olá pessoal, nesse meu 50º post vou está mostrando um algoritmo que muita gente que está iniciando na programação tem curiosidade de saber como funciona. Vocês vão perceber que é bem simples e depende da criatividade de cada um para desenvolver o melhor algoritmo em qualquer linguagem. Vamos ao algoritmo >>

>> Passos do Algoritmo <<

Para cada indivíduo, a sua inscrição no cadastro de Pessoas Físicas(CPF) é composto por um número de 9 algarismos e outro número de 2 algarismos, vamos considerar esses algarismos como sendo “d1” e “d2”, em que os d1 e d2 são denominados dígitos verificadores. Os dígitos verificadores são calculados, a partir da esquerda, da seguinte
maneira:

  • Os 9 primeiros algarismos são multiplicados pela sequência 10, 9, 8, 7, 6, 5, 4, 3, 2 (o primeiro por 10, o segundo por 9, e assim por diante);
  • Em seguida, calcula-se o resto “r1” da divisão da soma dos resultados das multiplicações por 11, e se o resto for zero ou 1, d1 é zero, caso contrário d1 = (11-r1);
  • O dígito d2 é calculado pela mesma regra, na qual os números a serem serem multiplicados pela sequência dada são contatos a partir do segundo algarismo, sendo d1 o último algarismo, isto é, d2 é zero se o resto “r2” da  divisão por 11 da somas das multiplicações for zero ou 1, caso contrário, d2 = (11-r2);

Para facilitar o entendimento desenvolvi um algoritmo em java.

Primeiramente criei a Classe Valida >>


public class Valida {

   //ATRIBUTOS
   private String cpf;
   private int d1,d2;

   //MÉTODOS
   void setCpf(String cpf){

      this.cpf = cpf;

   }

   void setD1(int d1){

      this.d1 = d1;

   }

   void setD2(int d2){

      this.d2 = d2;

   }

   int getD1(){

      return this.d1;

   }

   int getD2(){

     return this.d2;

   }

   String getCpf(){

     return this.cpf;

   }

   //FAZ O CÁLCULO DO 1º DÍGITO VERIFICADOR
   int dV1(String cpf){

   //declaração do vetor para desmembrar a string
   int v[] = new int[11];
   int soma = 0, sequencia = 10, resto;

   //desmembrando a string e transformando cada caractere em inteiro
   for (int i=0; i<9; i++){

      //transformação dos caracteres em inteiro
      v[i] = Integer.parseInt(cpf.substring(i,i+1));

      //faz o cálculo com a sequência de 10 até 2
      soma = soma + (v[i] * sequencia);

      //decrementa a sequência
      sequencia--;

   }

   //pega o resto da divisão da soma das multiplicações com 11
   resto = soma % 11;

   //caso resto igual a 0 ou a 1 então retorna 0
   if (resto == 0 || resto == 1){

       return 0;

   }else{ //caso contrário retorna 11 menus o resto

       return (11 - resto);

   }

  }

  /** FAZ O CÁLCULO DO 2º DÍGITO VERIFICADOR
  * A ÚNICA DIFERENÇA É QUE A MULTIPLICAÇÃO DA
  * SEQUÊNCIA É FEITA A PARTIR DO SEGUNDO ALGARISMO
  * DO CPF ATÉ O 1º DÍGITO VERIFICADOR
  */
  int dV2(String cpf){

  int v[] = new int[11];
  int soma = 0, sequencia = 10, resto;

  for (int i=1; i<10; i++){

     v[i] = Integer.parseInt(cpf.substring(i,i+1));

     soma = soma + (v[i] * sequencia);

     sequencia--;

  }

  resto = soma % 11;

  if (resto == 0 || resto == 1){

     return 0;

  }else{

     return (11 - resto);

  }

 }

}

Classe Principal >>


  import java.util.*;
  import javax.swing.*;
  /**
  *
  * @author leowgweb
  */
  public class CpfValida {

  public static void main(String[] args) {

  String cpf;

  //instanciando a classe
  Valida v = new Valida();

  /*
  * caso ocorra alguma exceção(Se o usuário digitar
  * caracteres em vez de números)
  */
  try{

     cpf = JOptionPane.showInputDialog(null, "Entre com o seu CPF","Verificação"
     ,JOptionPane.INFORMATION_MESSAGE);

     //caso a quantidade de caracteres exeda ou seja inferior a 11
     if (cpf.length() != 11){

        JOptionPane.showMessageDialog(null, "A quantidade de algarismos "
        + "não está correta!","ERRO",JOptionPane.WARNING_MESSAGE);

     //caso esteje tudo ok
     }else{

        //seta os dígitos verificadores do cpf digitado
        v.setD1(Integer.parseInt(cpf.substring(9,10)));
        v.setD2(Integer.parseInt(cpf.substring(10,11)));

        //faz a verificação dos dígitos verificadores
        if ((v.getD1() == v.dV1(cpf)) && (v.getD2() == v.dV2(cpf))){

            JOptionPane.showMessageDialog(null, "CPF VÁLIDO");

        }else{

            JOptionPane.showMessageDialog(null, "CPF INVÁLIDO","Verifica",
            JOptionPane.WARNING_MESSAGE);

        }

    }

  //caso exista alguma exceção então da um erro
  }catch(Exception e){

     JOptionPane.showMessageDialog(null, "Erro: Digite apenas Números! "
     ,"ERRO",JOptionPane.ERROR_MESSAGE);

  }

 }
}

Quero ser avisado quando o novo blog for lançado

Anúncios
  1. No trackbacks yet.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

Anúncios
%d blogueiros gostam disto: