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.
Al 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.
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;
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.
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;
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.
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
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
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
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.
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);
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.
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
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.
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
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.
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
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.
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
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.
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
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.
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
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.
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
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:
- Algoritmos en Pseudocódigo con PSeInt. Lo más básico
- Pseudocódigo Ejemplo. Hoja de calendario en PSeInt
- Algoritmo Día de la semana de una fecha con PSeInt. Reutilizando funciones
- Arreglos y parámetros por referencia en pseudocódigo con PSeInt
Si quieres estar al tanto de las novedades y publicaciones de esta página web
Suscríbete
A V I S O
Hola, si sueles venir por aquí sabrás que desde el 2 de marzo de 2020 no he parado de responder a peticiones de ayuda para ejercicios de algoritmos en PSeint. Tengo que parar de hacerlo, al menos de momento, terminó el confinamiento por el Covid-19 y no me da la vida; he vuelto a trabajar y tengo que recuperar lo no trabajado, y además tengo un proyecto entre manos que no quiero desatender.
Aquí tienes un montón de ejemplos que te pueden servir de ayuda para resolver tu ejercicio. Si pulsas CTRL+F (buscar) y añades las palabras adecuadas puedes moverte por la página y encontrar lo que buscas.
Aún me queda por responder algunos comentarios y lo haré. Pero a partir de hoy (14 de Junio de 2020) desactivo los comentarios temporalmente, porque no voy a poder atenderlos, y tampoco contestaré a peticiones de ayuda que me lleguen al correo electrónico o redes sociales y que consistan en realizar ejercicios, no me importará ponerte un enlace a algún ejercicio que ya esté hecho y que crea que es similar y pueda ayudarte, pero poco más.
Lo siento, yo también estoy aprendiendo e intento ganarme la vida con esto.
Escribir un algoritmo en pseudocodigo que acepte fechas escritas de modo usual y las visualice como tres números. Por ejemplo, la entrada: 15 febrero 2008 producirá la salida 15 2 2008.
¡Hola Isaac! Saludos
xfa, estoy aprendiendo PSeInt en el colegio, podrias ayudarme con un algoritmo para saber la edad exacta con mes, digamos 11 años 9 meses, gracias por tu ayuda
¡Hola Thiago! No se si es lo que quieres. He intentado que estuvieran todas las opciones posibles, pero igual me he dejado algo. El algoritmo solo muestra la edad con años y meses, no días. Tampoco he verificado que la fecha estuviera bien escrita y fuera una fecha correcta, para así poder mejorar aún más el algoritmo. Aunque si quisieras podrías hacerlo, si buscas en esta página en el menú de más arriba hay varias funciones que te lo permiten. Trabajar con fechas en PSeInt es laborioso al no tener funciones propias para fecha, pues hay que tener en cuenta muchas cosas: años bisiestos, días según meses, …. En fin, espero que al menos pueda servirte de guía. Saludos
A V I S O
Hola, si sueles venir por aquí sabrás que desde el 2 de marzo de 2020 no he parado de responder a peticiones de ayuda para ejercicios de algoritmos en PSeint. Tengo que parar de hacerlo, al menos de momento, terminó el confinamiento por el Covid-19 y no me da la vida; he vuelto a trabajar y tengo que recuperar lo no trabajado, y además tengo un proyecto entre manos que no quiero desatender.
Aquí tienes un montón de ejemplos que te pueden servir de ayuda para resolver tu ejercicio. Si pulsas CTRL+F (buscar) y añades las palabras adecuadas puedes moverte por la página y encontrar lo que buscas.
Aún me queda por responder algunos comentarios y lo haré. Pero a partir de hoy (14 de Junio de 2020) desactivo los comentarios temporalmente, porque no voy a poder atenderlos, y tampoco contestaré a peticiones de ayuda que me lleguen al correo electrónico o redes sociales y que consistan en realizar ejercicios, no me importará ponerte un enlace a algún ejercicio que ya esté hecho y que crea que es similar y pueda ayudarte, pero poco más.
Lo siento, yo también estoy aprendiendo e intento ganarme la vida con esto.