Fiz um código pra validar CPF, depois vi que existem outros métodos para validação, queria ver onde posso melhorar o código, onde errei, um feedback na verdade.
package javaapplication1;
import java.util.Scanner;
import static java.lang.Math.toIntExact;
public class JavaApplication1 {
public static void main(String args[]) {
int[] vcpf = new int[11];
long cpf;
long num=10000000000L;
long resto;
int j;
int i;
int dig1=0;
int dig2=0;
Scanner read = new Scanner(System.in);
cpf=read.nextLong();
//guarda cpf digitado em um vetor
for (j=0;j<11;j++){
resto= (cpf % num);
i= toIntExact(cpf / num);
num=num/10;
cpf=resto;
vcpf[j]=i;
}
//soma primeiro digito
i=10;
for (j=0;j<9;j++){
dig1=dig1+(vcpf[j]*i);
i=i-1;
}
//soma segundo digito
i=11;
for (j=0;j<10;j++){
dig2=dig2+(vcpf[j]*i);
i=i-1;
}
//calcula digito verificador 1 e 2
dig1= dig1*10 %11;
dig2= dig2*10 %11;
//caso resultado seja 10 mudar para 0
if (dig1==10) dig1=0;
if (dig2==10) dig2=0;
//verifica se o digito verificador 1 e 2 obtidos são iguais aos digitos verificadores do cpf digitado
if (dig1==vcpf[9] && (dig2==vcpf[10]))System.out.println("CPF Válido");
else System.out.println("CPF inválido");
}
}
Para saber o que necessita, você deve estudar engenharia de software e qualidade de software.
Depende de muitos fatores e quem vai determinar isto é como dito, a Engenharia de Software.
Software funcionando não significa que o programa é adequado, ai entra a qualidade de software (subárea da engenharia de software).
Não tenho como falar muito sobre estes temas pois estou estudando estas duas disciplinas no momento e é pancadaria, mas são de importância inestimável para os projetos:
Fiz uma codificação apenas para fins de comparação, no caso a métrica de linhas, entretanto, menor quantidade de linhas não implica em um código mais eficiente, ai já é outra métrica e são muitas, mas para não falar alguma besteira sem querer quanto a métricas encerro por aqui.
Vide o código a seguir:
public static void main(String[] args) {
int res = validarCPF(JOptionPane.showInputDialog("Informe o CPF"), true);
JOptionPane.showMessageDialog(null, "CPF " + (res == 1 ? "válido" : res == 0 ? "inválido" : "Formato errado"));
}
//para iniciar a validação marque como true
private static int validarCPF(String cpf, boolean inicio) {
if (cpf.matches("\\d{11}")) {
boolean excecao = IntStream.range(0, 9).boxed().filter(num -> (((11111111111L*num) + "").equals(cpf))).findFirst().orElse(-1) != -1;
int soma = 0, peso = inicio ? 10 : 11;
//somando os digitos por um peso decrescente
for (int i = 0; i < (inicio ? 9 : 10); i++) {
soma += Integer.parseInt(cpf.charAt(i) + "") * peso--;
}
//calculando o resto
peso = soma * 10 % 11 == 10 ? 0 : soma * 10 % 11;
//se inicio = true a validação ocorre no index 9 do array, se não no index 11
return excecao || !(peso + "").equals(cpf.charAt(inicio ? 9 : 10) + "") ? 0 : inicio ? validarCPF(cpf, false) : 1;
} else {
return 3;
}
}
Fonte das instruções do funcionamento da validação do CPF:
Achei legal a verificação do digito pelo seu valor inteiro - 48.
for (int i = 0; i < 10; i++) {
System.out.println("(int) char ["+i+"] - 48 = "+((int)(i+"").charAt(0) - 48));
}
Você pode informar no editor qual parte de sua mensagem é codificação clicando em </>, quando estiver escrevendo uma mensagem.
Seleciona o trecho do código e clica no icone </>
Também seria interessante ter informado que a fonte do código foi um link postado por blayd2015 logo acima: http://www.devmedia.com.br/validando-o-cpf-em-uma-aplicacao-java/22097