Discussion:
Algoritmos de validación.
(demasiado antiguo para responder)
Loco
2004-04-06 11:17:01 UTC
Permalink
Buenas:

Estoy haciendo un programilla para clase sobre la gestión de las fichas
de los clientes de un banco. El programilla es para clase. De los
numerosos campos que contiene cada cliente, están el DNI y el número de
cuenta corriente. Según me comentó un compañero, para validar que el DNI
estaba escrito correctamente (xxxxxxx-LETRA) se podía utilizar un
algoritmo pequeño, de 5 líneas de nada, en el que se calculaba la letra
y si se correspondía con la que estaba escrita, lo validaba. Ahora la
cuestión es encontrar un algoritmo para validar el número de la cuenta
corriente, que por lo visto existe. Naturalmente no voy a meterlo en el
programa, porque cuando me lo vayan a corregir, no pretendo que el
seminario meta los números de sus cuentas corrientes en mi burdo
programilla, pero me ha picado el gusanillo y me gustaría encontrar ese
pequeño algoritmo, o si acaso las reglas que se siguen. He estado
buscando por ahí, pero se ve que no con mucho éxito, porque no he
encontrado nada de lo que buscaba.

Entonces pido una pista de alguien que sepa dónde encontrarlo o que me
lo diga directamente.

Muchas gracias.

L0C0.
ViKT0RY
2004-04-06 13:04:40 UTC
Permalink
En lugar de pedir tanto, moved un poco el culo :)

http://www.google.es/search?sourceid=navclient&hl=es&ie=UTF-8&oe=UTF-8&q=algoritmo+dni+c
ViKT0RY
2004-04-06 13:07:15 UTC
Permalink
Post by ViKT0RY
En lugar de pedir tanto, moved un poco el culo :)
http://www.google.es/search?sourceid=navclient&hl=es&ie=UTF-8&oe=UTF-8&q=algoritmo+dni+c
http://www.google.es/search?hl=es&ie=UTF-8&oe=UTF-8&q=algoritmo+cuenta+corriente+c&meta=
Loco
2004-04-08 12:24:29 UTC
Permalink
Post by ViKT0RY
En lugar de pedir tanto, moved un poco el culo :)
http://www.google.es/search?sourceid=navclient&hl=es&ie=UTF-8&oe=UTF-8&q=algoritmo+dni+c
A ver:

El algoritmo del DNI ya lo tengo, el que quiero es el de la cuenta
corriente de un banco, de esos de 20 dígitos. Y en google no me sale
nada en claro, ni en yahoo, ni en lycos ni en terra, ni con el copernico...

Pero gracias por mandarme esa dirección, hurgaré a ver lo que encuentro
de interesante...

L0C0.
Bartomeu
2004-04-08 21:49:02 UTC
Permalink
Estas son las rutinas que utilizo yo. Dada una entidad, una oficina y una
cuenta, te da los dos dígitos de control,

static int Peso[] = {1,2,4,8,5,10,9,7,3,6};

static int CalcularDigito(double Numero) // 10 d¡gitos de precisi¢n
{
char Digito[20];
int Control=0;
sprintf(Digito,"%010.0lf",Numero);
for (register int i=0; i<10; i++)
Control += ((Digito[i]-'0')*Peso[i]);
Control = 11-(Control%11);
if (Control==10) Control=1;
if (Control==11) Control=0;
return Control;
}

int CalcularDC(int Entidad, // 4 d¡gitos de precisi¢n
int Oficina, // 4 d¡gitos de precisi¢n
double Cuenta) // 10 d¡gitos de precisi¢n
{
return CalcularDigito(double(Entidad)*10000.0+double(Oficina))*10+
CalcularDigito(Cuenta);
}
Loco
2004-04-10 00:24:40 UTC
Permalink
Vaya, otra forma diferente de hacerlo.
Yo, gracias a la dirección que me dieron, y un par de enlaces más allá,
conseguí el proceso o algoritmo para lo de la cuenta bancaria:

de los 8 primeros números, el primero se multiplica por un número
específico, ya prefijado, el segundo por otro del mismo tipo... etc, y
la suma de todos ellos, se divide entre 11 y se obtiene el primero
dígito de control.

El segundo dígito de control de obtiene de la misma forma pero con otra
lista de núeros específicos.

1ª lista: (7,3,6,1,2,4,8,5)
2ª lista: (10,9,7,3,6,1,2,4,8,5)

Uséase, si tenemos el siguiente número de cuenta corriente
(12345678-xx-1234567890) los dígitos que faltan se sacan de esta manera:
(1*7)+(2*3)+(3*6)+(4*1)+(5*2)+(6*4)+(7*8)+(8*5)=165
primer dígito de control(0)=165%11 (en caso de que salga 10, se pone 1)
(1*10)+(2*9)+(3*7)+(4*3)+(5*6)+(6*1)+(7*2)+(8*4)+(9*8)+(0*5)=215
segundo dígito de control(6)=215%11 (en caso de que salga 10, se pone 1)

Esta explicación la pongo por si a alguien más le interesa.

L0C0.
Post by Bartomeu
Estas son las rutinas que utilizo yo. Dada una entidad, una oficina y una
cuenta, te da los dos dígitos de control,
static int Peso[] = {1,2,4,8,5,10,9,7,3,6};
static int CalcularDigito(double Numero) // 10 d¡gitos de precisi¢n
{
char Digito[20];
int Control=0;
sprintf(Digito,"%010.0lf",Numero);
for (register int i=0; i<10; i++)
Control += ((Digito[i]-'0')*Peso[i]);
Control = 11-(Control%11);
if (Control==10) Control=1;
if (Control==11) Control=0;
return Control;
}
int CalcularDC(int Entidad, // 4 d¡gitos de precisi¢n
int Oficina, // 4 d¡gitos de precisi¢n
double Cuenta) // 10 d¡gitos de precisi¢n
{
return CalcularDigito(double(Entidad)*10000.0+double(Oficina))*10+
CalcularDigito(Cuenta);
}
Bartomeu
2004-04-10 05:55:16 UTC
Permalink
Post by Loco
Vaya, otra forma diferente de hacerlo.
Yo, gracias a la dirección que me dieron, y un par de enlaces más
de los 8 primeros números, el primero se multiplica por un número
específico, ya prefijado, el segundo por otro del mismo tipo... etc,
y la suma de todos ellos, se divide entre 11 y se obtiene el primero
dígito de control.
El segundo dígito de control de obtiene de la misma forma pero con
otra lista de núeros específicos.
1ª lista: (7,3,6,1,2,4,8,5)
2ª lista: (10,9,7,3,6,1,2,4,8,5)
Date cuenta que la primera lista es igual que la segunda si la desplazas dos
posiciones. O dicho de otra manera, si a los primeros 8 números le añades
dos ceros al principio obtienes un número de diez cifras que puedes tratar
de la misma manera en los dos casos.
Post by Loco
Uséase, si tenemos el siguiente número de cuenta corriente
(12345678-xx-1234567890) los dígitos que faltan se sacan de esta
manera: (1*7)+(2*3)+(3*6)+(4*1)+(5*2)+(6*4)+(7*8)+(8*5)=165
primer dígito de control(0)=165%11 (en caso de que salga 10, se pone
1) (1*10)+(2*9)+(3*7)+(4*3)+(5*6)+(6*1)+(7*2)+(8*4)+(9*8)+(0*5)=215
segundo dígito de control(6)=215%11 (en caso de que salga 10, se pone 1)
Esta explicación la pongo por si a alguien más le interesa.
L0C0.
Post by Bartomeu
Estas son las rutinas que utilizo yo. Dada una entidad, una oficina
y una cuenta, te da los dos dígitos de control,
static int Peso[] = {1,2,4,8,5,10,9,7,3,6};
static int CalcularDigito(double Numero) // 10 d¡gitos de precisi¢n
{
char Digito[20];
int Control=0;
sprintf(Digito,"%010.0lf",Numero);
for (register int i=0; i<10; i++)
Control += ((Digito[i]-'0')*Peso[i]);
Control = 11-(Control%11);
if (Control==10) Control=1;
if (Control==11) Control=0;
return Control;
}
int CalcularDC(int Entidad, // 4 d¡gitos de precisi¢n
int Oficina, // 4 d¡gitos de precisi¢n
double Cuenta) // 10 d¡gitos de precisi¢n
{
return
CalcularDigito(double(Entidad)*10000.0+double(Oficina))*10+
CalcularDigito(Cuenta); }
Loading...