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:
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:
- Algoritmo Día de la semana de una fecha en JS
- De Pseudocódigo a C++. Algoritmo día de la semana de una fecha
Si quieres estar al tanto de las novedades y publicaciones de esta página web
SuscríbeteAlgoritmo 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:
- Algoritmos en Pseudocódigo con PSeInt. Lo más básico
- Pseudocódigo Ejemplo. Hoja de calendario en PSeInt
- Arreglos y parámetros por referencia en pseudocódigo con PSeInt
- Funciones de fecha en Pseudocódigo con PSeInt
También puedes ver este mismo algoritmo «traducido a JavaScript y C++» en:
- Algoritmo Día de la semana de una fecha en JS
- De Pseudocódigo a C++. Algoritmo día de la semana de una fecha
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.
Diseña un algoritmo que solicite una fecha (día, mes y año por separado) y muestre la fecha un día después de la que se digito.
¡Hola Josmar! Creo que funciona bien, saludos.
Escribir un Pseudocódigo que permita el ingreso del nombre del alumno, semestre, materia, aprovechamiento, examen y muestre los datos ingresados.
¡Hola Carolina! Saludos
Disculpa, el identificador firstDayMonth no me lo detecta como un arreglo o subproceso
¡Hola Zayn! el identificador firstDayMonth corresponde a una función utilizada anteriormente en otro algoritmo (hoja de calendario), si te fijas en el título de este post, al final pone «reutilizando funciones» y también lo comento al principio.
La función firstDayMonth la puedes ver aquí, esta función utiliza otras dos: isLeapYear (comprueba si el año es bisiesto) y firstDayYear (devuelve el día de la semana en el que cae el primer día del año). Puedes descargarte el algoritmo completo en el repositorio de Github.
Gracias por la visita. Un saludo
Hola, me lo podrías poner en lenguaje c++. No entiendo un par de cositas. Por favor, te lo agradecería mucho
Hola Mauricio, ¿qué es lo que no entiendes?, quizá pueda ayudarte.
Estoy preparando un artículo sobre este algoritmo en C++, lo tendré listo antes de que acabe la semana.
Un saludo y gracias por tu visita.
Aquí lo tienes Mauricio: De Pseudocódigo a C++. Algoritmo día de la semana de una fecha
Un saludo.
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.