Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
cpdmg

Sintaxe Java - Digito Verificador do Código Rastreio dos Correios

Recommended Posts

public class DvVerificador { 
	public static void main(String[] args) { 
		System.out.println(geraEtiquetaComDigitoVerificador("15653850")); 
} 
// Exemplo e-ticket 15653829 (dv=7) 

public static String geraEtiquetaComDigitoVerificador(String numeroEtiqueta) { 

	Integer[] multiplicadores = {8, 6, 4, 2, 3, 5, 9, 7}; 
	Integer soma = 0; 
	String dv; 

if (numeroEtiqueta.length() != 8) { 
	numeroEtiqueta = "Error"; 
	} else { 
	for (int i = 0; i < 8; i++) { 
		soma += new Integer(numeroEtiqueta.substring(i, (i + 1))) * multiplicadores[i]; 
	} 
	Integer resto = soma % 11; 
	
	if (resto == 0) { 
		dv = "5"; 
	} else if (resto == 1) { 
		dv = "0"; 
	} else { 
		dv = new Integer(11 - resto).toString(); 
	} 
	numeroEtiqueta += dv; 
	} 
	return numeroEtiqueta; 
	} 
}

Duvida 01: Quando eu tenho o seguinte comando

Integer[] multiplicadores = {8, 6, 4, 2, 3, 5, 9, 7};

ele está criando uma matriz, e respeitando a ordem: 
primeiro numero = 8
segundo numero = 6 e assim sucessivamente???

 

Duvida 02: Quando eu tenho o seguinte comando

for (int i = 0; i < 8; i++)

seria um loop, onde i começa com 0, não pode ser maior ou igual a 8, e i++ significa que ele auto incrementa?
 

Duvida 03: Quando eu tenho o seguinte comando

for (int i = 0; i < 8; i++) { soma += new Integer(numeroEtiqueta.substring(i, (i + 1))) * multiplicadores; }

ele começando o i = 0 no substring não vai dar erro?

algoritimo.jpg

Compartilhar este post


Link para o post
Compartilhar em outros sites

1) Sim.. os itens na matrix estarão na ordem que eles foram atribuidos

multiplicadores[0] = 8, multiplicadores[1] = 6 e por ai vai

 

2) Sim , O loop começa com i=0 e vai incrementando o valor de i ate ele ser menor que 8 (ou seja, ate o 7 ele entra no loop, com 8 ele sai).. Isso é feito para percorrer multiplicadores , lembre sempre que o primeiro indice da matrix é sempre 0, se tem 8 elementos, o ultimo indice é 7

 

3)  Não por que uma string em java tambem é uma matriz (ou array de caracteres), então a posição nessa matriz de caracteres tambem é zero, então ele ta pegando uma substrig que pega o primeiro digito da string ate a posição seguinte , no caso 0 + 1 , vezes o multiplicado... 

 

no caso do exemplo, no primeiro laço a substring para i =0 é , 

da posição 0 ate a posição 1 e multipicar por 8 = ou seja 15 x 8

ou seja 15653850

para i = 1

ele vai pegar string da posição 1 ate a posição (1+1) =2 (fica '56')  e Multiplica por 6... e por ai vai... 

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • @bngomes , muito obrigado pelos esclarecimentos, trabalho com SQL e as estruturas são um pouco diferente

     

    estou tentando simular esse algorítimo para compreender como é calculado o digito verificador, fiz duas simulações usando o raciocínio que entendi, gostaria que me corrijam se estiver errado.

     

    Onde:

    Resto = Soma / 11

    dv = 11-resto

    algoritimo 2 .jpg

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Seu resto ta errado na planilha 2.. voce pegou 1670 e dividiu por 11.. isso não resto.. esse é o valor da divisão..  o resto de 1670 é 9 no caso do planilha 2 o dv seria 2

     

    tem um erro que eu percebi no exemplo que eu te dei.. ele pega a posição de um numero so

     

    São sempre a 8 digitos então a formula é simples.. 1 digito x 8, segundo digito x 6 , e etc

     

    logo para o numero do exemplo

     

    1 x 8 = 8

    5 x 6 =30

    6 x 4 = 24

    5 x 2 = 10

    3 x 3 = 9

    8 x 5 = 40

    2 x 9 = 18

    9 x 7  = 63

     

    Total = 202

    Resto da Divisão = 4

    Digito =  11 - 4 = 7

     

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • @bngomes  minha maior confusão era essa então, eu estava achando que o resultado da divisão era o resto

     

    quando tenho substring(i, (i + 1)) não significa que ele pegará duas posições no substring??? onde a primeira posição é i e a segunda posição é i+1?

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Que eu saiba é assim mesmo a sintaxe é substring(pos inicial,posição final)

     

    da documentação do Java:

     

    substring

    public String substring(int beginIndex, int endIndex)

    Returns a new string that is a substring of this string. The substring begins at the specified beginIndex and extends to the character at index endIndex - 1. Thus the length of the substring is endIndex-beginIndex.

    Examples:

    "hamburger".substring(4, 8) returns "urge" "smiles".substring(1, 5) returns "mile"

    Parameters:

    beginIndex - the beginning index, inclusive.

    endIndex - the ending index, exclusive.

    Returns:

    the specified substring.

    Throws:

    IndexOutOfBoundsException - if the beginIndex is negative, or endIndex is larger than the length of this String object, or beginIndex is larger than endIndex.

     

     

     

     

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • @bngomes muito obrigado mesmo... consegui montar um script que me atende em sql

     

     

    declare @soma int, @contador int, @digito int, @valor varchar(8), @resto int
    
    set @soma  = 0
    set @contador = 1
    set @valor = 97476052
    
    set @soma = @soma + (substring(@valor,@contador,@contador) * 8) /*n1*/
    set @soma = @soma + (substring(@valor,@contador+1,@contador) * 6) /*n2*/
    set @soma = @soma + (substring(@valor,@contador+2,@contador) * 4) /*n3*/
    set @soma = @soma + (substring(@valor,@contador+3,@contador) * 2) /*n4*/
    set @soma = @soma + (substring(@valor,@contador+4,@contador) * 3) /*n5*/
    set @soma = @soma + (substring(@valor,@contador+5,@contador) * 5) /*n6*/
    set @soma = @soma + (substring(@valor,@contador+6,@contador) * 9) /*n7*/
    set @soma = @soma + (substring(@valor,@contador+7,@contador) * 7) /*n8*/
    
    set @resto = @soma%11
    set @digito = case when @resto = 0 then  5 when @resto = 1 then  0 else 11 - @resto end
    select @digito digito

     

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

    Direitos autorais

    Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

    ×