Algorítmo Renavam

Aqui é o lugar para bater papo e trocar idéias sobre os mais variados assuntos

Moderador: Moderadores

Softwhouse
Usuário Nível 3
Usuário Nível 3
Mensagens: 324
Registrado em: 07 Dez 2011 18:44
Localização: Porto Alegre/RS

Algorítmo Renavam

Mensagem por Softwhouse »

Olá, alguém saberia informar qual o algorítmo para cálculo do renavam?
Fernando
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Algorítmo Renavam

Mensagem por Pablo César »

Olá Softwhouse ! rs (eu rio porque não sei o nome da pessoa, rs)

Aqui encontrei um código que visto que você programa em Java, talvez você conseguisse migrar para a nossa linguagem xBase (seja em Harbour ou Clipper):
ValidadorRenavam.java

Código: Selecionar todos

public class ValidadorRenavam {

    public boolean validarRenavam(String renavam){
        if(!renavam.matches("[0-9]{9}")){
            return false;
        }
        int soma = 0;
        for (int i = 0; i < 8; i++) {
            soma += Integer.parseInt(renavam.substring(i,i+1))*(i+2);
        }
        soma = soma % 11;
        int ultimoDigito = (soma == 10 ? 0 : soma);
        int digitoInformado = Integer.valueOf(renavam.substring(renavam.length()-1, renavam.length()));
        if(ultimoDigito == digitoInformado){
            return true;
        }
        return false;
    }
}
GeradorRenavam.java

Código: Selecionar todos

import java.util.Random;

public class GeradorRenavam {

	public static void main(String[] args) throws Exception {
		int maximo = 0;
		try {
			maximo = Integer.valueOf(args[0]);
		} catch (Exception e) {
			throw new Exception("Especifique um valor de entrada válido");
		}
		for (int i = 0; i < maximo; i++) {
			String renavam = GeradorRenavam.geraNumeroRenavam();
			System.out.println(renavam);
		}
	}

	public static String geraNumeroRenavam() {
		Random r = new Random();
		String senha = "";
		for (int i = 0; i < 8; i++) {
			senha += Math.abs(r.nextInt(9));
		}
		int soma = 0;
		for (int i = 0; i < 8; i++) {
			soma += Integer.parseInt(senha.substring(i, i + 1)) * (i + 2);
		}
		soma = soma % 11;
		int ultimoDigito = (soma == 10 ? 0 : soma);
		return senha + ultimoDigito;
	}
}
Créditos deste Post para ViniGodoy: Link : http://www.guj.com.br/posts/list/149379.java
Espero ter ajudado. Se eu encontrar na liguagem xBase, eu postarei com toda certeza. Boa sorte !
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Algorítmo Renavam

Mensagem por Pablo César »

Ahhh desculpe o código não serve para verificar este ultimo código Renavam que começa a vigorar em 1º de abril de 2013 que possui 11 dígitos. Inclusive o código acima que postei não serve de grande coisa. Continuarei a pesquisa.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Algorítmo Renavam

Mensagem por Jairo Maia »

Olá,

Para o cálculo do Renavam com 9 digitos, você procede da seguinte forma:

Usa os primeiros 4 digitos para calcular o verificador, assim
cVerificador = ( 5 * 1o. ) + ( 4 * 2o. ) + ( 3 * 3o. ) + ( 2 * 4o. )

cVerificador = Int( cVerificador / 11 ) // divide por 11, mas usa o inteiro da divisão
cVerificador = ( cVerificador * 11 ) // volta a multiplicar por 11

cVerificador = If( cVerificador = 1 .Or. cVerificador >= 10 ), 0, cVerificador )

Em Harbour poderia ser algo assim:

Código: Selecionar todos

Function Main()

 Local cRenavam := "12.345.678-0"
 If ValidaRenavam( cRenavam )
  Alert( "Renavam Valido" )
 Else
  Alert( "Renavam Invalido" )
 Endi

Return Nil

Function ValidaRenavam( cRenavam )
 Local aCalcular := {}, cVerificador := 99, cRetorno := .f., cChr
 cRenavam := CharRem( ".,/-", cRenavam )  // CharRem é uma função da HbCt.Lib
 For i = 1 To 4  // pega os primeiros 4 digitos
  cChr := Subst( cRenavam, i, 1 )
  AaDd( aCalcular, cChr )
 Next

 For i = 1 To Len( aCalcular )

  Do Case

   Case i = 1
   cVerificador := 0
   cVerificador += ( 5 * Val( aCalcular[ i ] ) )

   Case i = 2
   cVerificador += ( 4 * Val( aCalcular[ i ] ) )

   Case i = 3
   cVerificador += ( 3 * Val( aCalcular[ i ] ) )

   Case i = 4
   cVerificador += ( 2 * Val( aCalcular[ i ] ) )

  EndCase

 Next

 cVerificador := Int( ( cVerificador / 11 ) ) * ( 11 )

 If cVerificador = 1 .Or. cVerificador >= 10
  cVerificador := 0
 Endi

 cRetorno := ( cVerificador == Val( Right( cRenavam, 1 ) ) )

Return cRetorno
Jà para os novos Renavam com 11 digitos, não sei se vai continuar valendo esse cálculo.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Softwhouse
Usuário Nível 3
Usuário Nível 3
Mensagens: 324
Registrado em: 07 Dez 2011 18:44
Localização: Porto Alegre/RS

Algorítmo Renavam

Mensagem por Softwhouse »

Boa tarde,

Agradeço a atenção dos colegas, já havia encontrado esses logorítmos na net, mas infelizemente nenhum está correto.
Fernando
Softwhouse
Usuário Nível 3
Usuário Nível 3
Mensagens: 324
Registrado em: 07 Dez 2011 18:44
Localização: Porto Alegre/RS

Algorítmo Renavam (Resolvido)

Mensagem por Softwhouse »

Código: Selecionar todos


Function ValidaRenavam(cRenavam)
Local i,nSomaTotal:=nDigito:=0
For i = 1 To 8
    nSomaTotal+= Val(SubStr(cRenavam,i,1)) * (i+1)
Next
nDigito:=nSomaTotal%11
Return(IIf(Val((SubStr(cRenavam,9,1)))==nDigito,.T.,.F.))

Fernando
Responder