PDA

Ver la Versión Completa : Algoritmo!!!


Ledian_Fdez
14-06-2007, 15:56:04
Holas amigos:

Alguien conoce de algun algorito o funcion en C++Builder, que me sirva para saber si un No. de Carnet de Identidad es valido, al menos sus primeros 6 digitos.

Salu2
Ledian.

ArdiIIa
14-06-2007, 16:16:53
Supongo que te refieres al NIF (http://www.clubdelphi.com/trucos/index.php?id=83&scroll=0&scrollb=0), el cual, supongo que no debería ser muy problemático traspasarlo a C++

Ledian_Fdez
14-06-2007, 22:53:45
Amigos mios:

El carnet de Identidad consta de 11 digitos, y yo lo que quiero es hacer una funcion que me permita substraer los primeros 6 digitos (estos corresponde con la fecha de nacimiento) y de ahí separarlos de 2 en 2, por ejemplo:

CI = 81042805227
8104028 = fecha de nacimiento
81 = año
04 = mes
28 = día

y quiciera validar si esa fecha es correcta

salu2
Ledian:confused:

AntonioG
15-06-2007, 23:28:02
Hola,

Que llevas hecho?

En que tienes almacenado ese carnet de identidad? (char *, AnsiString)

Saludos

Ledian_Fdez
18-06-2007, 20:09:41
El carnet de identidad lo guardo en una variable de tipo String.
Y hasta ahora lo que se me ocurre es ir tomando de 2 en dos lo 6 primeros caracteres, la complicacion de todo esto es como sabes si es una fecha valida. Digamos por ejemplo cuando un mes trae 30, 31, 28 o 29.

Salu2
Ledian:mad:

AntonioG
18-06-2007, 21:08:17
Hola,

Pues todos los meses son faciles de checar menos Febrero, por eso de los años bisiestos, los meses siempre tienen este numero de dias:
Enero 31
Febrero 28 o 29
Marzo 31
Abril 30
Mayo 31
Junio 30
Julio 31
Agosto 31
Septiembre 30
Octubre 31
Noviembre 30
Dicienmbro 31


De la formula es apara clauyclar cuando un año es bisiesto ahorita no al tengo, al rato la busoc bien, solo me acuerdo algo como que si un año es multiplo de 4 pero no de 400 es bisiesto )al rato lo busco bien=.
Para saber si es multiplo, pues usas el operador modulo )o residuo de division entera= :%

Se usa asi:
supongamos que el numeor lo guardas en n, en tonces i:
n%4==0 <---es multiplo de 4
n%4!=0 <---NO es multiplo de 4

Asi que para 400, pues queda asi:

n%400==0 <---es multiplo de 400
n%400!=0 <---NO es multiplo de 400

Saludos

roman
18-06-2007, 21:39:36
Prueba con esta función:


function EsFechaValida(S: String): Boolean;
var
Y, M, D: Word;
Fecha: TDateTime;

begin
Y := StrToIntDef(Copy(S, 1, 2), 0);
M := StrToIntDef(Copy(S, 3, 2), 0);
D := StrToIntDef(Copy(S, 5, 2), 0);

if Y*M*D > 0 then
Result := TryEncodeDate(Y + 1900, M, D, Fecha)
else
Result := false;
end;


Y por cierto, trata de dar títulos más descriptivos para tus mensajes.

// Saludos

AntonioG
18-06-2007, 22:17:50
Hola,

Basandome en lo que puso roman y en algo que viene en la ayuda de CBuilder, para CBuilder seria asi:

void __fastcall TForm1::Button1Click(TObject *Sender)

{
TDateTime dt;
AnsiString fecha;//<--aqui va la fecha

try
{
dt = EncodeDate((Word)StrToInt("19"+fecha.SubString(1,2)), (Word)StrToInt(fecha.SubString(3,2)), (Word)StrToInt(fecha.SubString(5,2)));
Label1->Caption = DateToStr(dt);
}
catch(...)
{
Application->MessageBox("Invalid day, month, or year.", "EncodeDate Example", MB_OK);
}
}

En fecha va primero el año, luego el mes y leugo el dia, pro eemplo:
fecha="810227";


Saludos
P.D. La linea
Label1->Caption = DateToStr(dt);
la puedes quitar.