Ajuda explicativa num código

5 respostas
R
public class CPF {

   /** Realiza a validação do CPF.
    *
    * @param   strCPF número de CPF a ser validado
    * @return  true se o CPF é válido e false se não é vá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);
   }

   /*
   public static void main(String[] args) {
      System.out.println( CPF("[telefone removido]") );
   }
   */
}

Pessoal, eu to começando no Java (mas já mexo com C). Estava olhando esse código, e não entendi essas 3 linhas, alguém poderia me explicar o que está acontecendo nessas 3 linhas?
Não entendi pq tem esse value.Of (sei apenas que é um método estático que retorna uma representação em string de um tipo primitivo, mas também não sei o que isso quer dizer hehe)... e esse Integer, qual a diferença dele p/ int? quando saber qual usar, int ou Integer, char ou String? e esse intValue?
Bom espero que consigam me ajudar... to completamente perdido (acho que deu p/ perceber hehe)

digitoCPF = Integer.valueOf (strCpf.substring(nCount -1, nCount)).intValue();

String nDigVerific = strCpf.substring (strCpf.length()-2, strCpf.length()); Esse .substring veio de onde? E essas doideras (strCpf.length()-2, strCpf.length()), o que quer dizer?

static public boolean CPF (String strCpf ) Esse (String strCpf) é um parâmetro? de onde veio?[/b]

Ahhhh, outra coisa... estava vendo uns exercícios p/ fazer e tinha escrito "consulte a API p/ String", "consulte a API p/ array" o que é essa tal de API, onde baixar?

5 Respostas

P

digitoCPF = Integer.valueOf (strCpf.substring(nCount -1, nCount)).intValue();
o metodo subString(), serve para pegar deteminados caracteres em uma String.
ex:

String nome = "Filipe_phill";
System.out.println(nome.subString(0,5);

o codigo acima ira mostrar apenas Filipe.
o Integer vai pegar estes caracteres selecionado com o metodo subString() e converte-los em um inteiro e guardar na variavel digitoCPF, para fazer o calculo depois.

String nDigVerific = strCpf.substring (strCpf.length()-2, strCpf.length()); Esse .substring veio de onde? E essas doideras (strCpf.length()-2, strCpf.length()), o que quer dizer?
se considerarmos apenas os numeros, um CPF tem 11 numeros, certo?
O metodo length() conta quantos caracteres tem na String
no caso acima ele esta pegando os caracteres de 9 até 11 contidos na var strCPF.

static public boolean CPF (String strCpf ) Esse (String strCpf) é um parâmetro? de onde veio?[/b]
strCpf é um parametro sim, que o metodo esta recebendo quando é chamado

Ahhhh, outra coisa… estava vendo uns exercícios p/ fazer e tinha escrito “consulte a API p/ String”, “consulte a API p/ array” o que é essa tal de API, onde baixar?

API é onde esta a documentação de todas as classes java e seus metodos
vc pode acessa-la online no link:
http://java.sun.com/j2se/1.5.0/docs/api/

espero ter esclarecido alguma coisa, até mais.[/code]

R

Muito obrigado phill! Ajudou bastante =)
Mas ainda estou com algumas dúvidas

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

Nessa parte digitoCPF = Integer.valueOf (strCpf.substring(nCount -1, nCount)).intValue();, (strCpf.substring(nCount -1, nCount)), ele está pegando a string 0 e 1, e depois 1 e 2, 2 e 3 e assim por diante? se for isso, 2 valores, como ele multiplica digitoCPF pela expressão
d1 = d1 + ( 11 - nCount ) se digitoCPF são 2 valores? Acho que não entendi muito bem isso. E esse .intValue(), pq dele? E esse .valueOf, p/ que dele?

Outra dúvida... como eu mexo com C, uso char p/ string e int p/ inteiros, e não sei qual a diferença entre int e Integer, char e String e gostaria de saber quando usar um ou outro.

Ahh e também se eu nesse exeplo quisesse perguntar qual o cpf p/ verificar, eu colocaria dentro da main System.out.println("Digite o CPF a ser validado"); e como eu faria p/ guardar esse CPF digitado (no C eu usaria o scanf, e no JAVA, como é?) e depois usar o método da verificação p/ verificar?

ME AJUDEM!!!!!! Por favor!

P

A variavel digitoCPF esta recebendo apenas um numero, o metodo substring(), neste caso esta pegando apenas um numero por vez, para ele pegar 2 numeros teria que ser desta forma:

digitoCPF = Integer.valueOf (strCpf.substring(nCount -1, nCount + 1 )).intValue();
O metodo valueOf() retorna um objeto tipo Integer de acordo com o caracter que o substring() expecificou e por fim o metodo intValue retorna este caracter tipo int.

No java vc utiliza String para as tuas strings e int para valores inteiros assim como no C, Integer é a classe que contem o objeto tipo int.

para utilizar o prompt eu costumava usar a Classe ReadStream, é um .jar que vc salva na pasta \lib\ext do java, vc pode fazer assim:

public static void main(String[] argv){ ReadStream r = new ReadStream(); System.out.println("Digite o CPF"); String cpf = r.readString(); } }
e dependendo da necessidade vc pode chamar o readInt(), readDouble.
http://www.cs.williams.edu/JavaStructures/doc/structure/ReadStream.html
da uma olhada neste link;
se nao estou enganado existem um meio mais eficiente para ler atravez do prompt, mas eu contumo usar este, da uma procura que vc encontra o .jar na net pra download.

é isso e qualquer coisa posta ae…

flw

R

digitoCPF tá pegando só 1 número por vez?

digitoCPF = Integer.valueOf (strCpf.substring(nCount -1, nCount )).intValue(); eu entendi que ele estaria pegando nCount -1 e o valor de nCount, igual no exemplo que vc colocou

String nome = "Filipe_phill"; System.out.println(nome.subString(0,5));
onde de 0 a 5 apareceria Felipe.

no digito CPF não seria de nCount -1 até nCount???

Quais seriam esses primeiros números que esse código estaria pegando? (só p/ entender melhor)

E sobre aquele código que vc me falou:

public static void main(String[] argv){ ReadStream r = new ReadStream(); System.out.println("Digite o CPF"); String cpf = r.readString(); } }
Tá dando erro quando eu digito o CPF… veja:
[b]--------------------Configuration: <Default>--------------------
Digite o CPF:
[telefone removido]
Exception in thread “main” java.util.InputMismatchException: For input string: “[telefone removido]”
at java.util.Scanner.nextInt(Scanner.java:2046)
at java.util.Scanner.nextInt(Scanner.java:2000)
at CPF.main(CPF.java:75)

Process completed.[/b]

Valeu phill, tá me ajudando muito!

P
Exato, digitoCPF esta pegando apenas um caracter;
digitoCPF = Integer.valueOf (strCpf.substring(nCount -1, nCount  )).intValue();
O substring precisa saber o inicio e fim dos cacts que ele deve pegar, no exemplo acima vai de nCount - 1 ate nCount, certo? so que ele nao inclui o caracter correspondente a nCount. OK???
String nome = "Filipe_phill";
System.out.println(nome.subString(0,5));
na verdade se vc executar o codigo acima ele vai mostrar Filip, faz o teste. Para mostrar Filipe teria que ser 6 em vez de 5. Com relação ao ReadStream, eu executei o codigo aqui e funciou... executa meu codigo ae:
public class CPF {

	public static void main(String[] argv){
		ReadStream r = new ReadStream();
		System.out.println("Digite o CPF");
	    String cpf = r.readString();
	    System.out.println("CPF = " + cpf);
   }	
}
vc colocou o .jar na pasta ext do java??? na minha maqui este é o path: C:\j2sdk1.4.2_10\jre\lib\ext. se continuar o problema me passa teu email que te mando o ReadStream que tenho aqui, blz???

teh mais.

Criado 1 de dezembro de 2006
Ultima resposta 6 de dez. de 2006
Respostas 5
Participantes 2