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
Replica
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.
ah…estamos en C recien
Nahh para darle mas emoción es C++
que hace el strlen?
jony…
que pasa cuando ingreas letras
ah…?
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.
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!!!
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
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
http://www.registrocivil.cl/Manuales/Validacion_de_Run.pdf
sabes estoy practicando un ejercicio de nomina en lenguaje c++ y no me quiere acumular el sueldo. Esta en ciclo repetitivo que opinas
Puta la hueá
No sé como llegué a este blog tan mula
Gracias quede donde empece
Nice trick, i think that’s the better way to do it.
Bye niggas.
de donde salieron contador = 3,
if (contador==2)…,
contador=8;….
????
ya entendi lo de los contadores…pero tengo otra duda:
en
acumulador=acumulador+((rutvalidado[c]-48)*contador);
porq es “-48″ ??????
Es por el tema de tipo de string, etc.
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;
}