Ajuda explicativa num código

[code]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(“04624193806”) );
}
*/
}[/code]

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?

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]

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

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

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!

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

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:
12345678912
Exception in thread “main” java.util.InputMismatchException: For input string: “12345678912”
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!

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:

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

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