Página 1 de 1

Algorítmo Renavam

Enviado: 29 Jan 2013 19:04
por Softwhouse
Olá, alguém saberia informar qual o algorítmo para cálculo do renavam?

Algorítmo Renavam

Enviado: 30 Jan 2013 11:03
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 !

Algorítmo Renavam

Enviado: 30 Jan 2013 11:23
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.

Algorítmo Renavam

Enviado: 30 Jan 2013 13:14
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.

Algorítmo Renavam

Enviado: 30 Jan 2013 14:21
por Softwhouse
Boa tarde,

Agradeço a atenção dos colegas, já havia encontrado esses logorítmos na net, mas infelizemente nenhum está correto.

Algorítmo Renavam (Resolvido)

Enviado: 30 Jan 2013 18:14
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.))