Aprendiendo a programar programando

    cabecera

terepebernal.com

Funciones de fecha en Pseudocódigo con PSeInt


En este post podrás ver varios ejemplos de PSeInt, todas las funciones de fecha en pseudocódigo con PSeInt que he ido fabricando al escribir los post sobre Pseudocódigo y PSeInt de este blog. Son funciones relacionadas con fechas que pueden ser útiles y reutilizadas para futuros algoritmos, las he reunido aquí, para tenerlas más a mano. De surgir más las iré añadiendo en este post.

Ilustración calendarioAl seleccionar una función se muestra una descripción de lo que hace, un ejemplo y el código correspondiente.

Función dayWeekText

Esta función recibe el día de la semana (dW) como un número y lo devuelve (dWT) como texto. Si la función recibiera un número distinto de valores entre 1 y 7, devolvería un mensaje de error advirtiéndolo.

Ejemplo
Definir diaNumero Como Entero;
Definir diaTexto Como Cadena;
Escribir "Número (1 - 7): " Sin Saltar;
Leer diaNumero;

        diaTexto = dayWeekText(diaNumero);
Escribir "El día de la semana es: " + diaTexto;
Pseudocódigo
Funcion dWT <- dayWeekText(dW)
   // Declarar variables
   Definir dWT Como Cadena;

   Segun dW Hacer
       1:
          dWT="LUNES";
       2:
          dWT="MARTES";
       3:
          dWT="MIÉRCOLES";
       4:
          dWT="JUEVES";
       5:
          dWT="VIERNES";
       6:
          dWT="SÁBADO";
       7:
          dWT="DOMINGO";
       De Otro Modo:
          dWT="ERROR. EL DÍA DE LA SEMANA DEBERÍA ESTAR ENTRE LOS VALORES 1 Y 7.";
   Fin Segun
FinFuncion

Función monthText

Esta función recibe el mes (month) como un número y lo devuelve (mT) como texto. Si la función recibiera un valor distinto entre los valores 1 y 12, devolvería un mensaje de error advirtiéndolo.

Ejemplo
Definir mesNumero Como Entero;
Definir mesTexto Como Cadena;

Escribir "Número (1 - 12): " Sin Saltar;
Leer mesNumero;

mesTexto = monthText(mesNumero);
Escribir "El mes es: " + mesTexto;
Pseudocódigo
Funcion mT <- monthText(month)
   // Declara la variable mT, para contener el texto
   // del mes que corresponda y devolverlo
   Definir mT Como Cadena;
   // Dependiendo del número de mes, se le asigna a mT el texto correspondiente
   Segun month  Hacer
      1:
         mT = 'ENERO';
      2:
         mT = 'FEBRERO';
      3:
         mT = 'MARZO';
      4:
         mT = 'ABRIL';
      5:
         mT = 'MAYO';
      6:
         mT = 'JUNIO';
      7:
         mT = 'JULIO';
      8:
         mT = 'AGOSTO';
      9:
         mT = 'SEPTIEMBRE';
      10:
         mT = 'OCTUBRE';
      11:
         mT = 'NOVIEMBRE';
      12:
         mT = 'DICIEMBRE';
      De Otro Modo:
         mT = "ERROR. EL MES DEBERÍA ESTAR ENTRE LOS VALORES 1 Y 12.";
      FinSegun
FinFuncion

Función isLeapYear

Esta función recibe el año (year) y devuelve la variable (lY) de tipo booleano. Dependiendo de si el año es bisiesto o no, devolverá true o false. El año deberá estar entre los valores 1601 y 3000. Para ejecutarse correctamente necesitará la función yearOk.

Ejemplo
Definir anio Como Entero;
Definir OK, esBisiesto Como Logico;

Escribir "Año: " Sin Saltar;
Leer anio;

OK = yearOk(anio);
Si OK Entonces
   esBisiesto = isLeapYear(anio);

   Si esBisiesto Entonces
      Escribir "El año " + ConvertirATexto(anio) + " es bisiesto";
   SiNo
      Escribir "El año " + ConvertirATexto(anio) + " no es bisiesto";
   FinSi
SiNo
   Escribir "El año debe estar entre los valores 1601 y 3000.";
FinSi
Pseudocódigo
Funcion lY <- isLeapYear(year)
   Definir lY, OK Como Logico;

   OK = yearOk(anio);
   Si OK Entonces
      // Si el año es múltiplo de 4
      Si (year MOD 4==0) Entonces
         lY = Verdadero;
         // Si además es múltiplo de 100 y de 400
         Si ((year MOD 100!=0) O (year MOD 400==0)) Entonces
            lY = Verdadero;
         SiNo
            lY = Falso;
         FinSi
      SiNo
         lY = Falso;
      FinSi
   SiNo
      Escribir "ERROR. EL AÑO DEBE ESTAR ENTRE LOS VALORES 1601 Y 3000.";
   FinSi
FinFuncion

Función firstDayYear

Esta función recibe el año (year) y devuelve el día de la semana (dW), en formato número, en el que cae el primer día del año recibido en la variable year. El año deberá estar entre los valores 1601 y 3000, de lo contrario mostrará un mensaje de error advirtiéndolo. Para ejecutarse correctamente necesita las funciones yearOk e isLeapYear

Ejemplo
Definir anio Como Entero;
Definir diaSemana Como Entero;
Definir OK Como Logico;

Escribir "Año (1601 - 3000): " Sin Saltar;
Leer anio;

OK = yearOk(anio);

Si OK Entonces
   diaSemana = firstDayYear(anio);
   Escribir "El primer día del año " + ConvertirATexto(anio) Sin Saltar;
   Escribir " cae en " + dayWeekText(diaSemana);
SiNo
   Escribir "El año debe tener valores entre 1601 y 3000.";
FinSi
Pseudocódigo
Funcion dW <- firstDayYear(year)
   Definir dW,i Como Entero;
   Definir lY, OK Como Logico;

   OK = yearOk(year;)
   Si OK Entonces
      Si year==1601 Entonces
      // Si es 1601, el primer día del año es Lunes
         dW = 1;
      SiNo
      // Si el año es mayor que 1601
      // Buscar primer dia del año
         dW = 1;                          // Se comienza en lunes
         Para i=1602 Hasta year Hacer
         // Si el año anterior fue bisiesto el día de la semana
         // habrá que sumarle dos más, y sino uno.
            lY = isLeapYear(i-1);
            Si lY  Entonces
              dW = dW+2;
            SiNo
              dW = dW+1;
            FinSi
             // Si se llega a 8, es lunes
             Si dW==8  Entonces
               dW = 1;
             FinSi
             // Si se llega a 9, es martes
             Si dW==9  Entonces
               dW = 2;
             FinSi
         FinPara
   FinSi
FinFuncion

Función firstDayMonth

Esta función recibe el año (year) y mes (month) correspondientes y devuelve el día de la semana (dW), en formato número, en el que cae el primer día del mes y año recibidos en la variable month y year. El año deberá estar entre los valores 1601 y 3000, de lo contrario mostrará un mensaje de error advirtiéndolo. Para ejecutarse correctamente necesita las funciones isLeapYear y firstDayYear.

Ejemplo
Definir anio, mes Como Entero;
Definir diaSemana Como Entero;

Escribir "Año (1601 - 3000): " Sin Saltar;
Leer anio;
Escribir "Mes (1 - 12): " Sin Saltar;
Leer mes;

diaSemana = firstDayMonth(anio,mes);

Escribir "El primer día del mes " + monthText(mes) Sin Saltar;
Escribir " del año " + ConvertirATexto(anio) Sin Saltar;
Escribir " cae en " + dayWeekText(diaSemana);
Pseudocódigo

Funcion dW <- firstDayMonth(year,month)
   // Declarar variables
   Definir fDY,dW,i Como Entero;
   Definir lY Como Logico;

   lY = isLeapYear(year);                 // ¿Es un año bisiesto?
   fDY = firstDayYear(year);            // Primer día de la semana del año
   Para i=1 Hasta month Hacer
      // Si es enero, el primer día será el primer día del año
      Si i==1 Entonces
         dW = fDY;
      FinSi
      // Si es marzo, el primer día dependerá de si el año es bisiesto o no
      Si i==3 Entonces
         Si lY Entonces
            dW = dW+1;
         SiNo
            dW = dW;
         FinSi
      FinSi
      // Si es un mes precedido de otro de 31 días, se le sumarán 3 días
      Si (i==2) O (i==4) O (i==6) O (i==8) O (i==9) O (i==11) Entonces
         dW = dW+3;
      FinSi
      // Si es un mes precedido de otro de 30 días, se le sumarán 2 días
      Si (i==5) O (i==7) O (i==10) O (i==12) Entonces
          dW = dW+2;
      FinSi
      // Si llega a 8, es lunes
      Si dW==8 Entonces
         dW = 1;
      FinSi
      // Si llega a 9, es martes
      Si dW==9 Entonces
         dW = 2;
      FinSi
      // Si llega a 10, es miércoles
      Si dW==10 Entonces
         dW = 3;
      FinSi
   FinPara
FinFuncion

Función isDateOk

Esta función recibe una fecha (dateC), en formato texto , y devuelve la variable (OK), con un valor lógico dependiendo de si es una fecha correcta o no. Primero comprueba que tenga el formato (DD/MM/AAAA) o (DD-MM-AAAA), y después que la fecha sea válida. Igual que en las demás funciones, considera como valores buenos para el año que se encuentren entre 1601 y 3000. Para ejecutarse correctamente necesita las funciones separadorOK, isNumberDate, monthOK, yearOk y dayOk.

Ejemplo
Definir fecha Como Texto;
Definir fechaOK Como Logico;

Escribir 'INTRODUCE UNA FECHA (DD/MM/AAAA)....' Sin Saltar;
Leer fecha;

fechaOK = isDateOk(fecha);

Si fechaOK Entonces
   Escribir "La fecha " + fecha Sin Saltar;
   Escribir " es correcta.";
SiNo
   Escribir "La fecha no es correcta.";
FinSi
Pseudocódigo

Funcion OK <- isDateOk(dateC)
   // Declarar variables
   Definir OK Como Logico;
   Definir month, year, day Como Entero;

   lDate=Longitud(dateC);
   Si (lDate != 10) Entonces
      OK=Falso;	// La cadena no tiene 10 caracteres, luego es incorrecta
   SiNo
     // Comprobar si los caracteres de separación son los correctos
      OK=separadorOk(dateC);
      Si OK Entonces
         // Comprobar que los demás caracteres sean todos numéricos
         OK=isNumberDate(dateC);
         Si OK Entonces
            // Si todos son numéricos convertir a número para poder calcular
            day=ConvertirANumero(Subcadena(dateC,1,2));
            month=ConvertirANumero(Subcadena(dateC,4,5));
            year=ConvertirANumero(Subcadena(dateC,7,10));
            // Comprobar si el mes es correcto
            OK=monthOk(month);
            Si OK Entonces
               // Comprobar si el año es correcto
               OK=yearOK(year);
               Si OK Entonces
                  OK=dayOk(day,month,year);
               FinSi
            FinSi
         FinSi
      FinSi
   FinSi
FinFuncion

Función separadorOk

Esta función recibe una fecha (dateC), en formato texto , y devuelve la variable (OK), con un valor lógico dependiendo de si los caracteres separadores son los correctos o no. Es una función auxiliar de isDateOk.

Ejemplo
Definir fecha Como Texto;
Definir sepOK Como Logico;

Escribir 'INTRODUCE UNA FECHA (DD/MM/AAAA)....' Sin Saltar;
Leer fecha;

sepOK = separadorOk(fecha);

Si sepOK Entonces
   Escribir "Los separadores para la fecha son los correctos.";
SiNo
   Escribir "Los separadores para la fecha no son los correctos.";
FinSi
Pseudocódigo
Funcion OK <- separadorOk(dateC)
   Definir OK Como Logico;

   Si ((Subcadena(dateC,3,3)=='/') Y (Subcadena(dateC,6,6)=='/')) Entonces
      OK=Verdadero;
   SiNo
      Si ((Subcadena(dateC,3,3)=='-') Y (Subcadena(dateC,6,6)=='-')) Entonces
         OK=Verdadero;
      SiNo
         OK=Falso;
      FinSi
   FinSi
FinFuncion

Función isNumberDate

Esta función recibe una fecha (dateC), en formato texto , y devuelve la variable (OK), con un valor lógico dependiendo de si los caracteres del día, mes y año son numéricos. Es una función auxiliar de isDateOk y necesita para ejecutarse la función isNumber.

Ejemplo
Definir fecha Como Texto;
Definir sonNumeros Como Logico;

Escribir 'INTRODUCE UNA FECHA (DD/MM/AAAA)....' Sin Saltar;
Leer fecha;

sonNumeros= isNumberDate(fecha);

Si sonNumeros Entonces
   Escribir "Los caracteres del día, mes y año de la fecha son números.";
SiNo
   Escribir "Los caracteres del día, mes y año de la fecha no son números.";
FinSi
Pseudocódigo
Funcion OK <- isNumberDate(dateC)
   // Declarar variables
   Definir OK Como Logico;
   Definir i Como Entero;

   i=1;
   Mientras i<=10 Hacer
      Si (i==3) O (i==6) Entonces
         i=i+1;
      SiNo
         Si isNumber(Subcadena(dateC,i,i)) Entonces
            OK=Verdadero;
            i=i+1;
         SiNo
            OK=Falso;
            i=11;
         FinSi
      FinSi
   FinMientras
FinFuncion

Función isNumber

Esta función recibe un caracter (C), y devuelve la variable (OK), con un valor lógico dependiendo de si el caracter corresponde a un número entre 0 y 9. Es una función auxiliar de isNumberDate.

Ejemplo
Definir C Como Caracter;
Definir OK Como Logico;

Escribir 'INTRODUCE UN CARACTER NUMÉRICO (0 - 9)....' Sin Saltar;
Leer C;

OK = isNumber(C);

Si OK Entonces
   Escribir "El caracter es el número " Sin Saltar;
   Escribir C;
SiNo
   Escribir "El caracter introducido no es un número del 0 al 9.";
FinSi
Pseudocódigo
Funcion OK <- isNumber(C)
   //Declarar variables
   Definir i Como Entero;
   Definir OK Como Logico;
   Definir num Como Caracter;
   Dimension num[10];

   num[1]='0';
   num[2]='1';
   num[3]='2';
   num[4]='3';
   num[5]='4';
   num[6]='5';
   num[7]='6';
   num[8]='7';
   num[9]='8';
   num[10]='9';

   // Comprobar si es un número entre 0 y 9
   Para i=1 Hasta 10 Con Paso 1 Hacer
      Si (C==num[i]) Entonces
         OK = Verdadero;
         i = 10;         // Es un número, salir del bucle
      SiNo
         OK = Falso;         // No es un número
      FinSi
   Fin Para
FinFuncion

Función monthOk

Esta función recibe un mes (month), en formato numérico, y devuelve la variable (OK), con un valor lógico dependiendo de si el mes tiene un valor entre 1 y 12. Es una función auxiliar de isDateOk.

Ejemplo
Definir mes Como Entero;
Definir OK Como Logico;

Escribir 'INTRODUCE UN MES (1 - 12)....' Sin Saltar;
Leer mes;

OK = monthOk(mes);

Si OK Entonces
   Escribir "El mes introducido es " Sin Saltar;
   Escribir monthText(mes);
SiNo
   Escribir "El valor introducido no corresponde a un mes.";
FinSi
Pseudocódigo
Funcion OK <- monthOk(month)
   // Declarar variables
   Definir OK Como Logico;

   Si (month>=1 Y month<=12) Entonces
      OK=Verdadero;
   SiNo
      OK=Falso;
   FinSi
FinFuncion

Función yearOk

Esta función recibe un año (year) y devuelve la variable (OK), con un valor lógico dependiendo de si el año tiene un valor entre 1601 y 3000. Es una función auxiliar de isDateOk.

Ejemplo
Definir anio Como Entero;
Definir OK Como Logico;

Escribir 'INTRODUCE UN AÑO (1601 - 3000)....' Sin Saltar;
Leer anio;

OK = yearOk(anio);

Si OK Entonces
   Escribir "El año introducido es " Sin Saltar;
   Escribir anio;
SiNo
   Escribir "El año debe estar entre los valores 1601 y 3000.";
FinSi
Pseudocódigo
Funcion OK <- yearOk(year)
   // Declarar variables
   Definir OK Como Logico;

   Si (year>=1601 Y year<=3000) Entonces
      OK=Verdadero;
   SiNo
      OK=Falso;
   FinSi
FinFuncion

Función dayOk

Esta función recibe un día (day), un mes (month) y un año (year), y devuelve la variable (OK), con un valor lógico dependiendo de si la día es válido para ese mes y ese año. Es una función auxiliar de isDateOk y necesita para ejecutarse yearOk, monthOk e isLeapYear.

Ejemplo
Definir dia, mes, anio Como Entero;
Definir OK Como Logico;

Escribir 'INTRODUCE UN AÑO (1601 - 3000)....' Sin Saltar;
Leer anio;
Escribir 'INTRODUCE UN MES (1 - 12)....' Sin Saltar;
Leer mes;
Escribir 'INTRODUCE EL DÍA PARA EL MES Y EL AÑO....' Sin Saltar;
Leer dia;

OK = dayOk(dia,mes,anio);
Si OK Entonces
   Escribir "La fecha " Sin Saltar;
   Escribir ConvertirATexto(dia) + "/" Sin Saltar;
   Escribir ConvertirATexto(mes) + "/" Sin Saltar;
   Escribir ConvertirATexto(anio)Sin Saltar;
   Escribir " es válida.";
SiNo
   Escribir "La fecha introducida no es válida.";
FinSi
Pseudocódigo
Funcion OK <- dayOk(day,month,year)
   // Declarar variables
   Definir OK Como Logico;

   OK = yearOk(year);
   Si OK Entonces
      OK = monthOk(month);
      Si OK Entonces
         Si (day>=1 Y day<=31) Entonces
            Segun day Hacer
               31:
                  Si (month==1 O month==3 O month==5 O month==7 O month==8 O month==10 O month==12) Entonces
                     OK=Verdadero;
                  SiNo
                     OK=Falso;
                  FinSi
               30:
                  Si (month==2) Entonces
                     OK=Falso;
                  SiNo
                     OK=Verdadero;
                  FinSi
               29:
                  Si (month==1) O (month>=3 Y month<=12) O (month==2) Y (isLeapYear(year)) Entonces
                     OK=Verdadero;
                  SiNo
                     OK=Falso;
                  FinSi
                De Otro Modo:
                   OK=Verdadero;
            Fin Segun
         FinSi
      SiNo
         Escribir "ERROR. EL MES DEBE TENER UN VALOR ENTRE 1 Y 12.";
      FinSi
   SiNo
      Escribir "ERROR. EL AÑO DEBE TENER UN VALOR ENTRE 1601 Y 3000.";
   FinSi
FinFuncion

Puedes ver más sobre ejercicios básicos de Pseudocódigo y PSeInt en:

Si quieres estar al tanto de las novedades y publicaciones de esta página web

Suscríbete

    Deja un comentario

    Tu dirección de correo electrónico no será publicada.

    * (obligatorio)

    Derechos: Tienes derechos, entre otros, a acceder, rectificar, limitar y suprimir tus datos. Envíame un e-mail a contacto@terepebernal.com