Aprendiendo a programar programando

    cabecera

terepebernal.com

Algoritmo día de la semana de una fecha con PSeInt. Reutilizando funciones.

En este ejercicio se muestra un algoritmo que pide por teclado una fecha, comprueba que la fecha está bien escrita y que es una fecha válida, y además muestra por pantalla el día de la semana en que cae la fecha pedida por teclado, todo ello reutilizando funciones ya creadas para un algoritmo anterior, que puedes ver en Pseudocódigo Ejemplo. Hoja de calendario en PSeInt.

El resultado de este algoritmo para el 15/05/2035, se muestra en la siguiente imagen:

Resultado Algoritmo Dia Semana de Fecha

Al igual que en el algoritmo del calendario, el rango de años válido para este algoritmo será de 1601 al 3000. Si aún no tienes instalada esta aplicación, puedes descargar PSeInt en su página oficial. Y si aún no sabes bien cómo usar PSeInt, puedes verlo en Algoritmos en Pseudocódigo con PSeInt. Lo más básico.

Este mismo algoritmo lo puedes ver «traducido a JavaScript y C++» en:

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

Suscríbete

Algoritmo diaSemanaFecha

El algoritmo diaSemanaFecha es el programa principal. En él se pide al usuario una fecha por teclado, mostrando el formato en el que debe ser introducida, (DD/MM/AAAA). También permitirá que se introduzca «-«, como caracter separador.

Se comprueba que es una fecha válida a través de la función isDateOk, que se muestra en el punto siguiente. Si la fecha no es correcta, se muestra un mensaje para que lo intente de nuevo, y si sí lo es se convierten los caracteres en números y se guardan en las variables correspondientes (day , month y year) para poder hacer los cálculos necesarios.

A continuación se halla el primer día del mes de la fecha reutilizando la función firstDayMonth, que a su vez, utiliza las funciones isLeapYear y firstDayYear, todas ellas del algoritmo calendario. Una vez que se tiene el primer día del mes, se calcula el día de la semana en el que cae la fecha introducida por teclado, y se muestra por pantalla, utilizando la función dayWeekText, que también se muestra en el punto siguiente.

// Mostrará por pantalla el día de la semana en el que
// cae la fecha que se pedirá al usuario por teclado.
// El valor del año estará entre 1601 y 3000.
Algoritmo diaSemanaFecha
   // Declaración de variables
   Definir dateC Como Cadena;
   Definir year,month,day,fDM,D,dW Como Entero;
   Definir S,OK Como Logico;
   Definir seguir Como Caracter;
   S <- Verdadero;
   Mientras S Hacer
      // Pedir por teclado la fecha indicando el formato
      Escribir 'INTRODUCE UNA FECHA (DD/MM/AAAA)....' Sin Saltar;
      Leer dateC;
      // Comprobar que la fecha es válida
      OK=isDateOk(dateC);
      Si OK Entonces
         // Si la fecha es correcta
         day=ConvertirANumero(Subcadena(dateC,1,2));
         month=ConvertirANumero(Subcadena(dateC,4,5));
         year=ConvertirANumero(Subcadena(dateC,7,10));
         fDM=firstDayMonth(year,month);          // Primer día del mes
         D=(day-1)%7;
         dW=fDM+D;                 // Día de la semana en que cae la fecha
         Si (dW>7) Entonces
            dW=dW-7;
         FinSi
         Escribir "";
         Escribir "";
         Escribir "LA FECHA " + dateC + " CAE EN " + dayWeekText(dW);
         Escribir "";
         Escribir "";
      SiNo
         // Si la fecha no es correcta
         Escribir 'FECHA INCORRECTA. INTÉNTALO DE NUEVO.';
      FinSi
      Escribir 'Pulsar la tecla S para continuar ...' Sin Saltar;
      Leer seguir;
      Si ((seguir=='S') O (seguir=='s')) Entonces
         S <- Verdadero;
      SiNo
         S <- Falso;
      FinSi
   FinMientras
FinAlgoritmo

Funciones isDateOk y dayWeekText

La función isDateOk recibe como parámetro dateC, donde se ha guardado la fecha que el usuario ha escrito por teclado, a continuación comprueba que la fecha tiene el formato correcto, a través de la función longitud (predeterminada de PSeInt) y de las funciones separadorOk e isNumberDate. También comprueba que sea una fecha válida mediante las funciones yearOk, monthOk y dayOk. Y por último, devuelve el resultado con la variable OK. Todas las funciones mencionadas de las que se sirve isDateOk podrás verlas un poco más abajo.

// Comprueba que la fecha tiene el formato correcto
// y que es una fecha válida
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

La función dayWeekText es muy sencilla, simplemente recibe el día de la semana resultante en forma numérica en el parámetro dW, y devuelve dicho día en forma de texto con la variable dWT, para mostrarlo por pantalla.

// Devuelve el día de la semana en texto
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="PARECE QUE HAY ALGÚN ERROR";
   Fin Segun
FinFuncion

Funciones separadorOk, isNumberDate e isNumber

Las dos primeras funciones de este punto, separadorOk e isNumberDate, son llamadas por la función vista en el punto anterior, isDateOK, que comprueba que la fecha es válida.

La primera, separadorOK, comprueba que los caracteres separadores de la fecha son los correctos, para ello utiliza Subcadena, función predeterminada de PSeInt, y estructuras condicionales simples. Su pseudocódigo se muestra a continuación.

// Comprueba que los caracteres separadores son los correctos
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

La segunda, isNumberDate comprueba si el resto de caracteres de la fecha son numéricos, utilizando también Subcadena y la función isNumber, que comprueba si un caracter es numérico, usando un arreglo y un bucle para. El pseudocódigo de ambas funciones se muestra a continuación.

// Comprueba que los caracteres del día, mes y año sean numéricos
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
// Comprueba si un caracter es un número
Funcion iN <- isNumber(C)
   //Declarar variables
   Definir i Como Entero;
   Definir iN 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
         iN=Verdadero;
         i=10;         // Es un número, salir del bucle
      SiNo
         iN=Falso;         // No es un número
      FinSi
   Fin Para
FinFuncion

Funciones monthOk, yearOk y dayOk

Estas tres funciones son llamadas también desde isDateOk, y comprueban que sean correctos el mes, el año y el día.

La primera, monthOk recibe como parámetro el mes de la fecha, month, comprueba que esté entre los valores 1 y 12, y devuelve el resultado mediante la variable lógica OK.

// Comprueba si el mes de la fecha es válido
Funcion OK <- monthOk(month)
   // Declarar variables
   Definir OK Como Logico;

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

La segunda, yearOk, recibe como parámetro el mes de la fecha, month y también el año, year, comprueba que esté entre los valores 1601 y 3000, y devuelve el resultado mediante la variable lógica OK.

// Comprueba si el día de la fecha es válido
Funcion OK <- yearOk(year)
   // Declarar variables
   Definir OK Como Logico;

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

Y la última, dayOk, recibe como parámetros el día, el mes y el año (day, month y year), comprueba que el día esté entre los valores 1 y 31, y mediante una estructura de selección múltiple, comprueba que día y mes sean compatibles. Por último devuelve el resultado mediante la variable lógica OK.

// Comprueba si el día de la fecha es válido
Funcion OK <- dayOk(day,month,year)
   // Declarar variables
   Definir OK Como Logico;

   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
   SiNo
      OK=Falso;
   FinSi
FinFuncion

Si quieres descargarte el código completo de este algoritmo, puedes hacerlo en GitHub.

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

También puedes ver este mismo algoritmo «traducido a JavaScript y C++» en:

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

Suscríbete

Deja una respuesta

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