Aprendiendo a programar programando

    cabecera

terepebernal.com

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

Comparte si quieres

TwitterFacebookLinkedInWhatsApp

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

Comparte si quieres

TwitterFacebookLinkedInWhatsApp

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.

El que aprende y aprende y no practica lo que sabe, es como el que ara y ara y no siembra.- (Platón)

Si quieres apoyar el blog, puedes hacerlo a través de Ko-fi

  • Josmar Dario dice:

    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.

    • terepebernal dice:

      ¡Hola Josmar! Creo que funciona bien, saludos.

      Algoritmo diaDespues
      	Definir dia, mes, anio Como Entero
      	
      	Escribir "Día: " Sin Saltar
      	Leer dia
      	Escribir "Mes: " Sin Saltar
      	Leer mes
      	Escribir "Anio: " Sin Saltar
      	Leer anio
      	
      	// Comprobar que los valores introducidos son correctos
      	Si !(anio>=1601 Y anio<=3000) Entonces
      		Escribir "Los valores del año tienen que estar entre 1601 y 3000"
      	SiNo
      		Si !(mes>=1 Y mes<=12) Entonces
      			Escribir "Los valores del mes tienen que estar entre 1 y 12"
      		SiNo
      			Si !(dia>=1 Y dia<=31) Entonces
      				Escribir "Los valores del día tienen que estar entre 1 y 31"
      			SiNo
      				Segun mes Hacer
      					// Si el mes tienes 31 días
      					1,3,5,7,8,10,12:
      						diaSiguiente(dia,mes,anio,31)
      					// Si el mes tiene 30 días
      					4,6,9,11:
      						Si dia==31 Entonces
      							Escribir "Este mes no tiene 31 días. Fecha incorrecta"
      						SiNo
      							diaSiguiente(dia,mes,anio,30)
      						FinSi
      					// Si el mes tiene 28 o 29 días
      					2:
      						// Dependiendo de si es bisiesto o no
      						Si isLeapYear(anio) Entonces
      							Si dia>29 Entonces
      								Escribir "Este mes no tiene tantos días. Fecha incorrecta"
      							SiNo
      								diaSiguiente(dia,mes,anio,29)
      							FinSi
      						SiNo
      							Si dia>28 Entonces
      								Escribir "Este mes no tiene tantos días. Fecha incorrecta"
      							SiNo
      								diaSiguiente(dia,mes,anio,28)
      							FinSi
      						FinSi
      					De Otro Modo:
      						Escribir "Se ha producido un error...."
      				FinSegun
      			FinSi
      		FinSi
      	FinSi
      FinAlgoritmo
      
      Funcion diaSiguiente(d,m,a,uD)
      	// Muestra el día siguiente
      	Definir diaS, mesS, anioS Como Entero
      	
      	Si d==UD Entonces
      		diaS <- 1
      		Si m<12 Entonces
      			mesS <- m+1
      			anioS <- a
      		SiNo
      			mesS <- 1
      			anioS <- a + 1
      		FinSi
      	SiNo
      		diaS <- d+1
      		mesS <- m
      		anioS <- a
      	FinSi
      	Escribir "Día siguiente = ", diaS, "/", mesS, "/", anioS
      FinFuncion
      
      // Recibe el año (year) y devuelve (lY) si es bisiesto o no
      Funcion lY <- isLeapYear(year)
      	Definir lY Como Logico;
      	// 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
      FinFuncion
  • carolina dice:

    Escribir un Pseudocódigo que permita el ingreso del nombre del alumno, semestre, materia, aprovechamiento, examen y muestre los datos ingresados.

    • terepebernal dice:

      ¡Hola Carolina! Saludos

      Algoritmo ingresoDatos
      	Definir nombre, semestre, materia Como Cadena
      	Definir aprovechamiento, examen Como Cadena
      	
      	Escribir "Nombre: " Sin Saltar
      	Leer nombre
      	Escribir "Semestre: " Sin Saltar
      	Leer semestre
      	Escribir "Materia: " Sin Saltar
      	Leer materia
      	Escribir "Aprovechamiento: " Sin Saltar
      	Leer aprovechamiento
      	Escribir "Examen: " Sin Saltar
      	Leer examen
      	Escribir ""
      	Escribir "Nombre: " , nombre
      	Escribir semestre, " semestre - ", materia
      	Escribir "Aprovechamiento: ", aprovechamiento
      	Escribir "Examen: ", examen
      FinAlgoritmo
  • Zayn dice:

    Disculpa, el identificador firstDayMonth no me lo detecta como un arreglo o subproceso

    • terepebernal dice:

      ¡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

  • Mauricio dice:

    Hola, me lo podrías poner en lenguaje c++. No entiendo un par de cositas. Por favor, te lo agradecería mucho

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.

El que aprende y aprende y no practica lo que sabe, es como el que ara y ara y no siembra.- (Platón)

Si quieres apoyar el blog, puedes hacerlo a través de Ko-fi