Calcular digito verificador rut (Chile) en C++

Luego de un día y un poco mas de pensar, y gracias a la ayuda de mi compañero Pablo Gonzalez, puse entender que las variables de tipo char tiene otro ascci y al trabajar a numeros enteros, hay dos opciones para poder trabajarlas:

1. A su numero en char, almacena en un vector restarle -48.
2. Es ocupar la libreria stdlib, la función atoi();

Sin mas comentarios al respecto, menos mal que me salió, pero ahora viene las struct, asi que nos vamos a hacer una agendita en C++.
//Validación del rut
//Alumno: Jonathan Ramírez
//Fecha: 23 Octubre 2007
//UTFSM Informatica
#include <stdio.h>
#include <string.h>
int main()
{
//declaracion de variables
char rut[7];
char rutvalidado[7];
int total=0;
int a,b,c;
int contador=3;
int acumulador=0;
int resto=0;
int digito=0;
//fin declaracion de variables
printf("*** CALCULO DEL DIGITO VERIFICADOR RUT (CHILE) ***");
printf("\n\n");
printf("Ingrese el rut que ejecutar: ");
gets(rut);
total=strlen(rut);
if(total<=7) {
for(a=0;a<=7;a++) {
if(rut[0]==rut[a]) {
rutvalidado[0]='0';
rutvalidado[a+1]=rut[0];
}
else {
rutvalidado[a+1]=rut[a];
}
}
}
else
{
for(b=0;b<=7;b++) {
rutvalidado[b]=rut[b];
}
}
for(c=0;c<=7;c++) {
if(contador==2) {
acumulador=acumulador+((rutvalidado[c]-48)*contador);
contador=8;
}
else
{
acumulador=acumulador+((rutvalidado[c]-48)*contador);
}
contador=contador-1;
}
digito=(11-(acumulador%11));
if(digito>=10) {
if(digito==10) {
printf("\nEl digito verificador de su rut es: K"); }
else
{
printf("\nEl digito verificador de su rut es: 0");
}
}
else
{
printf("\nEl digito verificador de su rut es: %d", digito);
}
getchar();
getchar();
}

Tau.

pda: tal vez actualize el codigo, ocupando la función atoi(); y asi automatizar el programa.

18 comentarios hasta ahora

  1. libny on

    mmmm…
    no mencionaste mi aporte ¬¬!!

    gets(rut);

    ademas de la revicion mula
    que le hice a tu algoritmo

    oie …. emmm…si entiendes lo de struct…
    me evias algunas ideas ..
    ia.

  2. libny on

    ah…estamos en C recien

  3. Jony! on

    Nahh para darle mas emoción es C++

  4. Kouga on

    que hace el strlen?

  5. libny on

    jony…
    que pasa cuando ingreas letras
    ah…?

  6. Jony! on

    Las convierte a xD! numero wuajaja…!! en realidad no estoy seguro, pero para lo casi nada que sabiamos, no me sigan echando el programa hacia abajo po “colegas”.

    Tau.

  7. libny on

    el mio se cae…
    -cuando trato de verificar “111555542454″…se salta el ciclo
    que supuestmente lo verifica…deberia mostarme 5
    -cuando se escriben letras en la parte del menu…

    …asik plop!!!

  8. Kouga Light on

    jojojojo
    hola jony ;D!!!
    por fin pude terminar el ejercicio de validar el RUT ;DD!!!!
    jojojojo

    ehh..
    oye la tarea de oma es para el viernes??
    segun la hoja decia eso .-.U

  9. pIOLO on

    Hay desbordamiento de memoria si uno escribe un numero de 7 digitos ya que el arreglo solo tiene tamaño de 7 es decir que su último elemento tendrá índice 6. Si me explican la formula para obtener el digito del rut, les hago edl programita fácil y sencillo

  10. elba on

    sabes estoy practicando un ejercicio de nomina en lenguaje c++ y no me quiere acumular el sueldo. Esta en ciclo repetitivo que opinas

  11. achunchador on

    Puta la hueá
    No sé como llegué a este blog tan mula

  12. Cristina on

    Gracias quede donde empece

  13. Snoop Dogg on

    Nice trick, i think that’s the better way to do it.
    Bye niggas.

  14. pau on

    de donde salieron contador = 3,
    if (contador==2)…,
    contador=8;….
    ????

  15. pau on

    ya entendi lo de los contadores…pero tengo otra duda:
    en
    acumulador=acumulador+((rutvalidado[c]-48)*contador);
    porq es “-48″ ??????

  16. Jonathan on

    Es por el tema de tipo de string, etc.

  17. Alvaro on

    bool validar_rut(std::string rut)
    {
    std::string::iterator it;
    int i;
    int suma=0,mult=2;
    int resto;
    std::string rut_pass=”";
    std::string dv=”";
    char c;

    for(it=rut.begin();*it!=’-';it++)
    {
    if((*it!=’.')&&(*it!=’-'))
    {
    rut_pass.append(1,*it);
    }
    }

    dv.append(1,rut.at(rut.length()-1));

    for(i=rut_pass.length()-1;i>=0;i–)
    {
    c = (char)(rut_pass[i]);
    suma+=(atoi(&c)*mult);
    mult++;
    if(mult>7)
    mult=2;
    }

    resto=11-(suma%11);

    if(((dv[0]==’K')||(dv[0]==’k'))&&(resto==10))
    {
    return true;
    }
    else
    {
    if((dv[0]==’0′)&&(resto==11))
    {
    return true;
    }
    else
    {
    if(((int)(dv[0]))==resto)
    {
    return true;
    }
    }
    }

    return false;
    }


Replica