Monografias.com > Computación > Programación
Descargar Imprimir Comentar Ver trabajos relacionados

FUNCIONES PARA VALIDAR FECHAS




Enviado por gustavo_yanes



    Indice
    1. Se
    busca un experto

    2. Introducción
    3. Definiciones
    Basicas

    4. Descripción de las
    funciones

    5. Conclusión

    1. Se busca un experto

    Las funciones que
    más adelante se explican fueron desarrolladas por
    mí durante la primera mitad de los años ochenta,
    cuando me desempeñaba como instructor de BASIC. Para
    entonces, la validación de fechas requería de una
    subrutina que contenía una serie de comparaciones
    lógicas con abundantes IF, OR, XOR y hasta tablas cargadas
    en una DATA. Con el uso de las funciones
    eliminé la subrutina y reduje el uso de las funciones
    lógicas a unos cuatro (04) IF, solamente.
    Para la época mencionada no era fácil dar a conocer
    los resultados de una investigación; sobre todo para alguien que,
    como yo, no tenía otro deseo diferente al de apoyar a sus
    alumnos y a sus colegas instructores.
    Por razones laborales, a principios del
    año 87 dejé la programación y el oficio de instructor de
    lenguajes de computación; actividad que retomé en
    el año 2000, cuando dos jóvenes me solicitaron
    asesoría para elaborar sus trabajos de grado, donde se
    incluía el diseño
    de programas en
    VISUAL BASIC;
    desconocido por mí, que no había pasado del TURBO y
    el QUICK. Con tanto adelanto, pensé que alguien
    podía haber diseñado un objeto para validar fechas
    introducidas por el usuario; sin embargo, quedé
    sorprendido al ver que aún no existe.
    Como quiera que no poseo la más mínima idea de
    cómo se elaboran los objetos insertables, se me ocurre dar
    a conocer las funciones que he diseñado, con la finalidad
    de que alguna otra persona elabore
    un VALIDADOR DE FECHAS que, además, incluya límites
    hasta meses y días, por cuanto sólo llegué a
    limitar los años.
    Si usted puede hacerlo, agradezco me lo haga saber, así
    como el envío del objeto resultante, para mi uso personal.
    Atentamente,
    Gustavo Yanes
    Nota: La monografía
    fue escrita hace unos veinte años; la sometí a una
    ligera revisión antes de enviarla sólo para
    correcciones de forma. Por esta razón, los ejemplos son
    los originales elaborados para cursos de
    GWBASIC. Se anexó un ejemplo en VISUAL BASIC,
    para demostrar el funcionamiento.

    2. Introducción

    La confiabilidad de los datos que se
    procesan por computador es
    factor importante para garantizar, a su vez, la confiabilidad de
    la informacion resultante.
    Muchos son los casos donde la confiabilidad depende, en gran
    parte, del programa
    utilizado para la recepcion de los datos a procesar;
    tal como sucede con las fechas.
    Una fecha confiable es aquella que se encuentra dentro de un
    rango dado de validez. El programador debe, entonces, procurar
    que quien introduzca los datos se encuentre limitado a un
    número finito de posibilidades para cometer errores; es
    decir: sólo podrá introducir una fecha errada si
    está dentro del rango de validez dado.
    El rango de esta validez de las fechas determinado por:
    A.- Los días, meses y años deben ser números
    enteros positivos.
    B.- El día no puede ser mayor a 31 para los meses 1, 3, 5,
    7, 8, 10, 12.
    C.- El día no puede ser mayor a 30 para los meses 4, 6, 9,
    11.
    D.- Si el mes es 2, el día no puede ser mayor a 29, si el
    año es bisiesto; ni puede ser mayor a 28, si el año
    no es bisiesto.
    E.- El mes no puede ser mayor a 12.
    F.- El año no puede ser menor a un año dado ni
    mayor a otro año dado. En todo caso la primera
    condición es necesaria; el límite inferior del
    rango de validez para los años será  1583 por
    cuanto a finales del año 1582 se inició el
    calendario actual. Si se trata, por ejemplo, de nacimientos, el
    año no será mayor que el año en curso ni
    inferior a 1583. Ahora bien, si se trata de nacimientos ocurridos
    en este siglo, el año no puede ser menor que 1901.
    La comprobacion de la validez de las fechas ha sido resuelta de
    muchas maneras. Comúnmente se validan por separado las
    condiciones A, E y F citadas anteriormente, además de que
    el día no sea mayor a 31; luego se validan las condiciones
    B, C y D.
    Validar las condiciones B y C, no representan problema, ya que
    once de los doce meses poseen rangos fijos de validez para los
    días, cuyos limites superiores pueden ser asignados a una
    tabla para realizar comprobaciones.
    El problema principal radica en validar las entradas para el mes
    2, ya que su limite superior varía entre 28 y 29 en
    función
    de que el año no sea, o sea bisiesto respectivamente. Lo
    que suele resolverse haciendo un estudio especial en caso de que
    el mes introducido sea 2: se determina si el año es o no
    bisiesto para asignar el límite superior correspondiente a
    los días y realizar la posterior comprobación.
    La función
    ELAINE que describo, calcula el limite superior correspon-diente
    al mes introducido, incluyendo febrero para los años
    bisiestos o no. Esta función se utiliza para validar las
    condiciones B, C y D. Sustituye, en una sola línea de
    programa, la
    tabla y todas las funciones lógicas y operaciones
    necesarias para determinar el límite máximo
    correspondiente a febrero.
    La función REINA se utiliza para validar, en particular,
    las condiciones A, E, F y que el día introducido no sea
    mayor que el límite superior calculado medíante la
    función ELAINE. Es decir: con ella se validan todas las
    condiciones A……..F, con un menor número de lí
    neas de programa y funciones lógicas.
    Finalmente, se incluye la función SENAY, como caso
    curioso, para deter-minar si se ha introducido una fecha
    correspondiente a los nueve días que fueron eliminados del
    calendario en la época del Papa Gregorio.
    La operatividad de las funciones arriba mencionadas Ha sido
    comprobada en GWBASIC, BASICA y TURBO BASIC. Para su
    utilización en otros lenguajes deberá asegurarse
    que contemplen las funciones: SIGNO, VALOR
    ABSOLUTO, DIVISION ENTERA y MODULO, de no ser así,
    deberán hacerse los ajustes nece-sarios utilizando
    expresiones equivalentes. En cualquier caso, las entradas
    serán números enteros, ya que el comportamiento
    para reales no enteros no se garantiza, así como para
    fechas anteriores al 09.10.1582.

    3. Definiciones Basicas

    Division
    Entera
    Es el cociente entero de la división de dos
    números. Por ejemplo: 45 = 0; 300200 = 1;
    ( ) 83 = 2; 5025 = 2.
    En estos casos los residuos son 4; 100; 2 y 0 repectivamente.
    Multiplo
    Un número X es múltiplo de Y si su división
    entera de X entre Y da como resto 0.
    Se dice, entonces, que X es de la forma nY, ( X = nY ) con
    n=1,2,3,4,……
    Año Secular
    Todo año que marca el final de
    un siglo. Son seculares, por ejemplo, los años: 1600,
    1800, 2000, 2500… Todo año secular es múltiplo de
    100.
    Año Bisiesto
    Año de 366 días. En los años bisiestos,
    febrero posee 29 días en vez de 28. Son bisiestos todos
    los años múltiplos de 4, salvo los seculares que no
    son múltiplos de 400.
    Modulo
    Es el residuo de la división entera efectuada ( MOD) entre
    dos números; de las divisiones anteriores tendremos: 4 MOD
    5 = 4; 300 MOD 200 = 100; 8 MOD 3 = 2 y 50 MOD 25 = 0.
    Nótese que si X es múltiplo de Y se
    tendrá  que X MOD Y = 0.
    Signo
    La función signo( SGN ) aplicada a un número o
    expresión matemática
    da como resultado un número entero perteneciente al
    conjunto {-1,0,1}
    y está  definida por:
    SGN(A) = -1 si A < 0
    SGN(A) = 0 si A = 0
    SGN(A) = 1 si A > 0

    VALOR ABSOLUTO
    El valor absoluto
    de un número se determina (ABS) medíante la
    función definida así :
    ABS(X) = X si X > 0
    ABS(X) = 0 si X = 0
    ABS(X) = -X si X < 0
    (El valor absoluto siempre es un número positivo ó
    cero.)

    4. Descripción de las funciones

    Por razones de longitud, las funciones podrán
    aparecer escritas en más de una línea; pero,
    deberá  interpretarse que las mismas se
    escribirán en los programas en una
    sóla línea.

    Función
    elaine

    Objetivo:
    Calcular el límite superior para los días del mes
    introducido, incluyendo febrero.
    Sean M = mes y A = año. La función ELAINE se define
    por:
    ELAINE(M,A) = (30+(M+M8) MOD 2) – ((SGN(M-2)+1) MOD 2) *
    ((SGN(A MOD 4)+1)+((SGN(A MOD 100)+ SGN(A MOD 400)) MOD 2))
    Obsérvese que ELAINE es una función compuesta
    formada, a su vez, por otras funciones compuestas; para demostrar
    como trabaja, la dividiremos en funcio-nes más simples y
    construiremos tablas para calcular los valores
    correspondientes:
    Sean:
    B= M+M8; C= B MOD 2; D= 30 + C (I)
    E= M-2; F= SGN(E); G= F+1; H= G MOD 2 (II)
    I= A MOD 4; J= SGN(I); K= J + 1 (III)
    L= A MOD 100; X= SGN(L) (IV)
    N= A MOD 400; O= SGN(N) (V)
    P= X+O; Q= P MOD 2 (VI)
    Trabajando con I y II se tiene:
    I II
    M M8 B C D E F G H
    1 0 1 1 31 -1 -1 0 0
    2 0 2 0 30 0 0 1 1
    3 0 3 1 31 1 1 2 0
    4 0 4 0 30 2 1 2 0
    5 0 5 1 31 3 1 2 0
    6 0 6 0 30 4 1 2 0
    7 0 7 1 31 5 1 2 0
    8 1 9 1 31 6 1 2 0
    9 1 10 0 30 7 1 2 0
    10 1 11 1 31 8 1 2 0
    11 1 12 0 30 9 1 2 0
    12 1 13 1 31 10 1 2 0

    Obsérvese en I que la función compuesta D
    tiene como salida los límites
    superiores de los meses, excepto febrero que tiene como
    límite superior 30. En II podremos observar que la salida
    es 1 para febrero y 0 para el resto de los meses.
    Si atendemos a la función ELAINE podemos observar que la
    misma es una diferencia de funciones donde el minuendo es D y el
    sustraendo es un producto, uno
    de cuyos factores es H. El factor a que hemos hecho referencia
    tendrá  valor 0 (cero) para cualquier mes diferente
    de febrero y 1 para este último, por lo que el sustraendo
    será  0 para los meses diferentes de febrero y un
    valor diferente de cero para el mes citado; veamos ahora como el
    sustraendo toma el valor 2 para febrero en año no
    bisisesto y 1 para febrero en año bisiesto (III al
    VI).
    Las funciones III, IV y V se utilizan para determinar si el
    año introducido es múltiplo de 4, de 100 y de 400
    respectivamente. Los años serán representados por
    sus equivalentes en las clases módulo 4, módulo 100
    y módulo 400.
    Para el estudio de las funciones III representaremos al
    año por las formas 4n; 4n+1; 4n+2; 4n+3. Entonces:
    A I J K
    4n 0 0 1
    4n+1 1 1 2
    4n+2 2 1 2
    4n+3 3 1 2

    Véase que K toma el valor 2 para los años
    que no son múltiplos de 4, los cuales no son bisiestos, y
    el valor 1 para los múltiplos de 4, que serán
    bisiestos (a excepción de los seculares no divisibles por
    400).
    Para las funciones IV, haremos:
    A L X
    100n 0 0
    100n+1 1 1
    100n+2 2 1
    . . .
    . . .
    100n+99 99 1
    Es decir: X vale 0 para los años seculares y 1 para los no
    seculares.
    Con las funciones V hacemos:
    A N O
    400n 0 0
    400n+1 1 1
    400n+2 2 1
    . . .
    . . .
    . . .
    400n+399 399 1
    Es decir: O vale cero para los años seculares divisibles
    entre 400, y 1 para el resto.
    Combinando las salidas de IV y V tenemos:
    X O P Q Nótese que X=1 y O=0
    0 0 0 0 es imposible ya que no puede ser A múlti-
    0 1 1 1 plo de 400 y no serlo de 100.
    1 1 2 0
    La función ELAINE puede expresarse asi:
    ELAINE = D – H*(K+Q)
    Donde :
    D Toma como valores los
    límites máximos en días para cada mes, salvo
    febrero en cuyo caso vale 30.
    H Vale 1 para el mes 2 y 0 para el resto de los meses. Con lo que
    el producto
    tendrá un valor diferente de 0 sólo para
    febrero.
    K Vale 1 para los años divisibles por 4, y 2 para el resto
    de los años.
    Q Vale 1 para los años seculares no divisibles por 400, y
    0 para el resto de los años.

    Las posibles combinaciones de K+Q serán:
    K Q K+Q
    1 1 2 Obsérvese que K=2 y Q=1 no es posible,
    1 0 1 pues el año sería múltiplo de 100
    sin
    2 0 2 serlo de 4.

    Luego, K+Q vale 1 para los años múltiplos
    de 4 salvo los seculares no múltiplos de 400; y toma el
    valor 2, tanto para estos últimos, como para el resto de
    los años.
    En otras palabras, K+Q vale 1 para los años bisiestos y 2
    para los no bisiestos.
    Como H vale 1 para el mes 2 y 0 para el resto tendremos: H*(K+Q)
    vale 1 para febrero en años bisiestos, 2 para febrero en
    años no bisiestos y 0 para cualquier otro mes
    independientemente del año.
    Finalmente se tendrá  que ELAINE = D-H*(K+Q)
    valdrá :
    29 para febrero en años bisiestos.
    28 para febrero en años no bisiestos.
    D para cualquier otro mes.

    Funcion reina
    Objetivo:
    Producir una salida que sirva para determinar si una fecha
    introducida se encuentra dentro su rango de validez, es decir: si
    cumple las condiciones A…F.
    Por razones de longitud, la función será 
    presentada en tres líneas, pero se escribirá en una
    sola línea de programa. Sean D=días; M=mes;
    A=año; ELAINE, el resultado de aplicar la función
    mencionada; Amin, el límite inferior para los años
    y Amax es el límite superior.
    REINA(D,ELAINE,M,A,Amin,Amax)=(ABS(SGN(SGN(D)+SGN(ELAINE+1-D)-2))+1)
    *
    (ABS(SGN((SGN(M)+SGN(13-M)-2))*2)+1)*(((ABS(SGN(SGN(A-Amin+1)+SGN(Amax-A+1)-2)))
    *4)+1)
    Observemos que la función está compuesta por el
    producto de tres factores donde el primero proporciona  la
    salida para validar el día, el segundo la correspondiente
    para el mes y el tercero para el año.
    La función posee una variante en caso de que no se desee
    limitar los años superiormente; en este caso se elimina la
    variable Amax de la definición. El tercer factor se
    escribe
    (((ABS(SGN(SGN(A-Amin+1)-1)))*4)+1)
    Analicemos el primer factor, haciendo:
    B=SGN(D); C=SGN(ELAINE-D+1); E=B+C; F=E-2; G=SGN(F);
    H=ABS(G); I=H+1.

    Luego los cálculos para el día (D)
    introducido serán:
    -1 Si D es un número negativo.
    SGN(D)= 0 Si D es 0.
    1 Si D es un número positivo.
    -1 Si D supera en más de 1 días el límite
    superior (ELAINE) calculado.
    SGN(ELAINE+1-D) =
    0 Si D supera en 1 día el límite superior (ELAINE)
    calculado.
    1 Si D es menor o igual al límite superior (ELAINE)
    calculado.
    Los valores de
    B y C estarán comprendidos en el conjunto
    {-1,0,1} de tal
    manera que cuando B adquiera los valores -1
    ó 0, C adquirirá  el valor 1.
    Análoga-mente, cuando C adquiera los valores -1 ó
    0, B adquirirá  el valor 1. El día
    será  válido únicamente cuando tanto B
    como C adquieran el valor 1 y no lo será  en
    cualquier otro caso.
    Hagamos la tabla:
    B C E F G H I
    -1 1 0 -2 -1 1 2
    0 1 1 -1 -1 1 2
    1 1 2 0 0 0 1
    1 0 1 -1 -1 1 2
    1 -1 0 -2 -1 1 2

    Como el día es válido sólo cuando B
    y C toman el valor 1, simultáneamente, tendremos que el
    primer factor toma el valor 1 cuando el día es
    válido y 2 cuando no lo es.
    Consideremos el segundo factor:
    (ABS(SGN((SGN(M)+SGN(13-M)-2))*2)+1)
    Hagamos: A=SGN(M); B=SGN(13-M); C=A+B; D=C-2; E=SGN(D);
    F=E*2; G=ABS(F); H=G+1
    Luego, los cálculos para el mes introducido
    serán:
    -1 Si el M es un número negativo.
    SGN(M)= 0 Si M es cero.
    1 Si M es un número positivo.
    -1 Si M es mayor que 13.
    SGN(13-M)= 0 Si M es 13.
    1 Si M es menor o igual a 12

    Los valores de A y B estarán comprendidos en el
    conjunto { -1,0,1}
    de tal manera que cuando A adquiera los valores -1 ó
    0, B adquirirá  el valor 1. Análoga-mente,
    cuando B adquiera los valores -1 ó 0, A
    adquirirá  el valor 1. El mes será 
    vá-lido únicamente cuando tanto A como B adquieran
    el valor 1 y no lo será  en cual-quier otro caso.
    Hagamos la tabla:
    A B C D E F G H
    -1 1 0 -2 -1 -2 2 3
    0 1 1 -1 -1 -2 2 3
    1 1 2 0 0 0 0 1
    1 0 1 -1 -1 -2 2 3
    1 -1 0 -2 -1 -2 2 3

    Como el mes es válido sólo cuando A y B
    toman el valor 1 simultáneamente, tendremos que el segundo
    factor toma el valor 1 cuando el mes es válido y 3 cuando
    no lo es.
    Consideremos el tercer factor:
    (((ABS(SGN(SGN(A-Amin+1)+SGN(Amax-A+1)-2)))*4)+1)
    Haciendo:
    B=SGN(A-Amin+1); C=SGN(Amax-A+1); E=B+C; F=E-2; G=SGN(F);
    H=ABS(G); I=H*4; J=I+1.
    Y su variante
    (((ABS(SGN(SGN(A-Amin+1)-1)))*4)+1); con: F=C-1
    Haciendo los cálculos previos para el año A
    tenemos:
    -1 Si A es menor que Amin en más de dos años.
    SGN(A-Amin+1)= 0 Si A es un año menor que Amin.
    1 Si A es mayor o igual a Amin.
    -1 Si A excede a Amax en más de un año.
    SGN(Amax-A+1)= 0 Si A excede a Amax en un año.
    1 Si A es menor o igual a Amax.

    Los valores de B y C estarán comprendidos en el
    conjunto { -1,0,1}
    de tal manera que cuando B adquiera los valores -1 ó
    0, C adquirirá el valor 1. Análogamente, cuando C
    adquiera los valores -1 ó 0, B tomará  el
    valor 1. El año será  válido
    únicamente cuando tanto B como C adquieran el valor 1 y no
    lo será  en cualquier otro caso. Si trabajamos con la
    variante tendremos que el año será 
    válido siempre que B sea 1.
    Hagamos las tablas:
    (Forma general)
    B C E F G H I J
    -1 1 0 -2 -1 1 4 5
    0 1 1 -1 -1 1 4 5
    1 1 2 0 0 0 0 1
    1 0 1 -1 -1 1 4 5
    1 -1 0 2 -1 1 4 5
    (Variante)
    B F G H I J
    -1 -2 -1 1 4 5
    0 -1 -1 1 4 5
    1 0 0 0 0 1

    Como el año es válido sólo cuando B
    y C toman el valor 1 simultánea-mente ( o B=1 en el caso
    de la variante), tendremos que el tercer factor toma el valor 1
    cuando el año es válido y 5 cuando no lo es.
    Construyamos ahora una tabla para el producto de los tres
    factores expresando la función REINA así
    REINA(I,H,J)=I*H*J (H, I, J, son las salidas)
    I H J REINA VÁLIDA FALLAN
    1 1 1 1 SI NINGUNO
    1 3 1 3 NO MES
    1 1 5 5 NO AÑO
    1 3 5 15 NO MES Y AÑO
    2 1 1 2 NO DÍA
    2 3 1 6 NO DÍA Y MES
    2 1 5 10 NO DÍA Y AÑO
    2 3 5 30 NO DÍA, MES Y AÑO

    Como puede observarse, la fecha es válida, si y
    sólo si REINA=1. Con esto basta para validar la entrada.
    Ahora bien: ¿Para quë sirven los otros valores de la
    función REINA ?: ellos sirven para desplegar los mensajes,
    utilizando la función MOD.
    De la tabla anterior se infiere que:
    Si falla REINA MOD 2 REINA MOD 3 REINA MOD 5
    Sólo el día 0 2 2
    Sólo el mes 1 0 3
    Sólo el año 1 2 0
    Día y mes 0 0 1
    Días y año 0 1 0
    Mes y año 1 0 0
    Día, mes y año 0 0 0

    Todos los mensajes correspondientes se pueden desplegar
    con las siguien-tes tres instrucciones:
    Si REINA MOD 2 = 0 desplegar el mensaje "ERROR EN EL
    DÍA"
    Si REINA MOD 3 = 0 desplegar el mensaje "ERROR EN EL MES"
    Si REINA MOD 5 = 0 deplegar el mensaje "ERROR EN EL
    AÑO"
    A continuación se presenta un ejemplo de rutina para
    validar fechas. En ella no se considera un año
    máximo y, como año mínimo, se ha considerado
    1990.
    10 CLS
    20 DEF FNELAINE(X,Y) =(30+(X+X8) MOD 2)-((SGN(X-2)+1)MOD 2)*
    ((SGN(Y MOD 4)+1)+((SGN( Y MOD 100)+SGN(Y MOD 400)) MOD 2))
    30 DEF FNREINA(O,P,Q,R,T)= (ABS(SGN(SGN(O)+SGN(P+1-D)-2))+1)*
    (ABS(SGN((SGN(Q)+SGN(13-Q)-2))*2)+1)*(((ABS(SGN(R-T+1)-1)))
    *4)+1)
    40 LOCATE 8,10:INPUT "DÍA ",D
    50 LOCATE 10,10:INPUT "MES ",M
    60 LOCATE 12,10:INPUT "AÑO ",A
    70 ELAINE=FNELAINE(M,A)
    80 REINA=FNREINA(D,ELAINE,M,A,1990)
    90 LOCATE 18,10
    100 IF REINA MOD 2= 0 THEN PRINT "ERROR EN EL DÍA -";
    110 IF REINA MOD 3= 0 THEN PRINT "ERROR EN EL MES -";
    120 IF REINA MOD 5= 0 THEN PRINT "ERROR EN EL AÑO "
    130 END

    Funcion Senay
    OBJETIVO: Detectar fechas inexistentes en el calen-dario
    Gregoriano, si el límite mínimo para los
    años es menor a 1583.
    Si por alguna razón el límite inferior para los
    años es menor que 1583, la función SENAY
    resultará  útil para detectar aquellas fechas
    que coincidan con algunas de las que fueron eliminadas del
    calendario de 1582.
    Es de hacer notar que para 1582 el calendario civil utilizado por
    el mundo occidental era el Juliano ( impuesto por
    Julio César) compuesto por años de 365 días
    y cada cuatro años uno de 366 días. Sin embargo
    persistía un error con respecto al calendario solar que
    acumuló unos nueve días de retraso desde la
    época de Julio César hasta el año 1582. El
    Papa Gregorio eliminó la causa del error disponiendo que
    los años seculares serían bisiestos sólo si
    son divisibles entre 400 y eliminó el error acumulado
    haciendo que al día 5 de octubre de 1582 le siguiera
    inmedíatamente el día 15 de octubre. Es decir: el
    período 6-10 al 14-10-1582 no existió.
    Con la función SENAY se detecta si se ha introducido una
    fecha del período inexistente.
    SENAY(D,M,A)=6*(1-(SGN(ABS(SGN(5-D)+SGN(15-D))+
    ABS(M-10)+ABS(A-1582))))
    Para demostrar como funciona hagamos:
    P=SGN(5-D)
    Q=SGN(15-D)
    R=ABS(P+Q)
    S=ABS(M-10)
    T=ABS(A-1582)
    Luego:
    P Q P+Q R
    D<5 1 1 2 2
    D=5 0 1 1 1
    D>5 y D<15 -1 1 0 0
    D=15 -1 0 -1 1
    D>15 -1 -1 -2 2

    Obsérvese que:
    R=0 solamente cuando el día está comprendido entre
    6 y 14. En cualquier otro caso será R>0.
    S=0 solamente cuando el mes es 10. En Los otros casos será
    S>0.
    T=0 solamente cuando el año es 1582. En cualquier otro
    caso será  T>0.
    Luego: SGN(R+S+T)=0 cuando la fecha coincide con alguna de las
    elimi-nadas del calendario. De resto, será  siempre
    1.
    Y en consecuencia 6 * (1-SGN(R+S+T)) = 6 siempre que la fecha
    intro-ducida coincida con alguna de las eliminadas del
    calendario. De lo contrario la expresión anterior
    tendrá el valor 0.
    Si a la función REINA se le suma la función SENAY,
    su valor se incre-mentará  en el de esta
    última; por lo tanto, si la fecha introducida coincide con
    alguna de las eliminadas del calendario, REINA
    tomará  el valor 7 y, en cualquier otro caso,
    conservará el valor originalmente calculado. Esto nos
    permite introducir una nueva condición y mensaje:
    Si REINA MOD 7 = 0 desplegar el mensaje
    "ERROR LA FECHA NUNCA EXISTIO".
    Nuestro programa de ejemplo, considerando como límites
    mínimo y máximo a los años 1500 y 1995,
    quedaría así :
    10 CLS
    20 DEF FNELAINE(X,Y)=(30+(X+X8) MOD 2)- ((SGN(X-2)+1)MOD 2)*
    ((SGN(Y MOD 4)+1)+((SGN(Y MOD 100)+SGN(Y MOD 400)) MOD 2))
    30 DEF FNSENAY(D,M,A)=6*(1-(SGN(ABS(SGN(5-D)+SGN(15-D))
    +ABS(M-10)+ABS(A-1582))))
    35 DEF FNREINA(O,P,Q,R,S,T)=(ABS(SGN(SGN(O)+SGN(P+1-D)-2))+1)
    (ABS(SGN((SGN(Q)+SGN(13-Q)-2))*2)+1)*(((ABS(SGN(SGN(R-T+1)
    +SGN(S-R+1)-2)))*4)+1)
    40 LOCATE 8,10:INPUT "DÍA ",D
    50 LOCATE 10,10:INPUT "MES ",M
    60 LOCATE 12,10:INPUT "AÑO ",A
    70 ELAINE =FNELAINE(M,A)
    75 SENAY =FNSENAY(D,M,A)
    80 REINA =FNREINA(D,ELAINE,M,A,1995,1500) +SENAY
    100 IF REINA MOD 2= 0 THEN PRINT "ERROR EN EL DÍA -";
    110 IF REINA MOD 3= 0 THEN PRINT "ERROR EN EL MES -";
    120 IF REINA MOD 5= 0 THEN PRINT "ERROR EN EL AÑO "
    125 IF REINA MOD 7= 0 THEN PRINT "ERROR LA FECHA NUNCA
    EXISTIO"
    130 END

    5.
    Conclusión

    Las funciones descritas facilitan la validación
    de fechas, en aquellos lenguajes de
    programación carentes de funciones internas que
    realicen tal actividad.
    Las dos primeras (ELAINE y REINA), son básicas en
    cualquier programa que solicite entrada de fechas. Los
    años límite pueden ser cargados a través de
    un archivo de
    configuración que sería leído al arrancar el
    programa, facilitando así la actualización de los
    mismos en el momento requerido sin tener que alterar el programa
    fuente; a la vez que evitaría la inoperatividad de los
    programas ejecutables (.EXE), como el consecuente desagrado de
    los usuarios.
    Espero haber realizado un aporte, sobre todo, a los programadores
    y estudíantes del lenguaje
    BASIC; por cuanto el mismo carece de este tipo de fun-ciones
    internas y, además, por ser el lenguaje
    utilizado en la mayoría de los centros educativos como
    lenguaje
    introductorio, para el aprendizaje de
    la computación.

    Demostración
    en visual basi

    Si tienes VISUAL BASIC,
    prepara una forma como la anterior y copia el programa que se
    encuentra más abajo. Verás que Visual cambia el
    formato cuando la fecha está errada; pero acepta el error.
    Si se introduce uno de los días perdidos en 1582, Visual
    ni se entera.
    Agrega un botón para salir
    Dim díasmaximo, dmax, díaperdido As Integer
    Dim titulo As String
    Function elaine(mes As Integer, año As Integer)
    elaine = (30 + (mes + mes 8) Mod 2) – ((Sgn(mes – 2) + 1) Mod
    2) * ((Sgn(año Mod 4) + 1) + ((Sgn(año Mod 100) +
    Sgn(año
    Mod 400)) Mod 2))
    End Function
    Function Reina(día As Integer, limax As Integer, mes As
    Integer, año As Integer, amin As Integer, amax As
    Integer)
    Reina = (Abs(Sgn(Sgn(día) + Sgn(limax + 1 – día) –
    2)) + 1) * (Abs(Sgn((Sgn(mes) + Sgn(13 – mes) – 2)) * 2) + 1) *
    (((Abs(Sgn(Sgn(año – amin + 1) + Sgn(amax – año +
    1) – 2))) * 4) + 1)
    End Function
    Function Senay(día As Integer, mes As Integer, año
    As Integer)
    Senay = 6 * (1 – (Sgn(Abs(Sgn(5 – día) + Sgn(15 –
    día)) + Abs(mes – 10) + Abs(año – 1582))))
    End Function
    Private Sub Command1_Click()
    mifecha = Text1.Text & " " & Text2.Text & " " &
    Text3.Text
    Text4.Text = Format(mifecha, "dddd d mm yyyy")
    díasmáximo = elaine(Text2.Text, Text3.Text)
    dmax = díasmáximo
    fechabuena = Reina(Text1.Text, dmax, Text2.Text, Text3.Text,
    1582, 9000)
    díaperdido = Senay(Text1.Text, Text2.Text, Text3.Text)
    fechabuena = fechabuena + díaperdido
    titulo = "MENSAJE PROGRAMADO "
    If fechabuena = 1 Then msg = "Fecha válida":
    Label3.Caption = "Fecha válida"
    If fechabuena Mod 2 = 0 Then msg = "Error en el día"
    If fechabuena Mod 3 = 0 Then msg = msg & vbCr & "Error en
    el mes"
    If fechabuena Mod 5 = 0 Then msg = msg & vbCr & "Error en
    el año"
    MsgBox msg, vbInformation, titulo
    Label3.Caption = "Vuelve a cambiar"
    End Sub
    Private Sub Command2_Click()
    Unload Me
    End Sub

     

     

     

     

    Autor:

    Gustavo Yanes Yanes

    Nota al lector: es posible que esta página no contenga todos los componentes del trabajo original (pies de página, avanzadas formulas matemáticas, esquemas o tablas complejas, etc.). Recuerde que para ver el trabajo en su versión original completa, puede descargarlo desde el menú superior.

    Todos los documentos disponibles en este sitio expresan los puntos de vista de sus respectivos autores y no de Monografias.com. El objetivo de Monografias.com es poner el conocimiento a disposición de toda su comunidad. Queda bajo la responsabilidad de cada lector el eventual uso que se le de a esta información. Asimismo, es obligatoria la cita del autor del contenido y de Monografias.com como fuentes de información.

    Categorias
    Newsletter