viernes, 29 de julio de 2022

Introducción. Herramientas.

PSeint. Primer script

Parto de que inicias esta entrada sabiendo cómo crear un script en PSeInt; si no es así, te recomiendo que leas este documento: Crear un script en PSeInt

Una vez que sabemos realizar estos sencillos pasos, antes de nada, tenemos que saber identificar el principio y el fin de un script.


En PSeInt, todo script se inicia con Proceso y finaliza con FinProceso, así que, simplificando, podemos decir que un script es el código escrito entre ambas instrucciones.

Un script es una secuencia (simple o compleja) de tres pasos: Entrada -> Procesamiento -> Salida (Input->Process->Output), para resumir E->P->S.

Aunque la forma más sencilla, con la que se inician la mayoría de los cursos de programación, es con el conocido "Hola Mundo", pero dudo mucho que ese ejemplo se pueda considerar un script en términos de E->P->S. Por ello prefiero hacerlo construyendo, desde el principio, algo que sí podemos considerar un script, aunque suponga introducir importantes conceptos que aun no voy a tratar en detalle.

Prefiero empezar construyendo algo que sí se pueda considerar un script, como esta minicalculadora de sumar. Para se más preciso, voy a crear dos script y a explicar las diferencias entre ambos, pero primero vamos a describir los pasos que conlleva un proyecto de software. Aunque aun estemos en las fases iniciales del aprendizaje de la lógica de programación, es conveniente tener las ideas claras respecto a lo que supone programar, si bien parece conveniente simplificar las formas en que se pueden expresar esas fases. 

 


Concretamente emplearé este esquema este sencillo esquema que, a pesar de su sencillez, aun nos queda grande. Lo hago para señalar (y esto es ahora lo que me importa) que, frente a lo común y frecuente, representado en el gráfico por la línea roja que une Requerimientos con Código (expresión que resumen "proceso de elaboración del código"), un proyecto de creación de software requiere pensar antes de actuar, por lo que es necesario, cuanto menos... 

  • Explicar con claridad los requerimientos: qué queremos conseguir y, por lo que nos toca como programadores, entenderlos correctamente.
  • Analizar la secuencia de pasos a dar y expresarla de forma coherente, esto es: especificarla, primero en lenguaje natural y posteriormente, al menos mediante pseudocódigo.
  • Si el caso lo requiere, también es necesario realizar el diseño de la arquitectura del proyecto, representando de forma adecuada las relaciones entre los componentes. En nuestro caso, este componente del esquema no es operativo por ahora.
  • Finalmente, y sólo tras el proceso anterior, trasladar a lenguaje de programación el proceso previo, esto es: escribir el código.
Requerimientos: Construir un programa que realice la suma de dos números y devuelva el resultado de dicha operación.

Especificaciones:
  1. Escribir el sumando 1.
  2. Escribir el sumando 2.
  3. Sumar los sumandos 1 y 2.
  4. Informar del resultado.
Dado que estamos trabajando con pseudocódigo, la segunda fase de la especificación coincide, en nuestro caso, con la codificación, aunque al tratarse (como no puede ser de otro modo) de un lenguaje de "programación", requiere el uso de los elementos propios de la lógica de programación.

Código:


Entre el inicio y el final del script nos encontramos con 5 aparentemente sencillas líneas de código, pero que contienen, en realidad, la esencia de la lógica de programación:

  • Datos: los valores numéricos 23 y 34
  • Variables: sum1, sum2 y suma
  • Operadores: de asignación (<-) y aritméticos (suma (+))
  • Instrucciones: definición de las variables y declaración de su tipo, asignación de valores a las variables y escritura del resultado.
De todos estos contenidos hablaremos más detalladamente en otro momento.

Además, en ellas se distinguen con claridad las tres fases de un script:
En este script, el proceso de entrada Input) es muy simple, ya que se limita a asignar un valor numérico a dos variables (lin. 3 y 4), pero normalmente se requieren (en las especificaciones debe constar) mayor interactividad con el usuario. Modifiquemos entonces los requerimientos y las especificaciones:

Requerimientos: Construir un programa que solicite dos sumandos al usuario, realice la suma de los dos números y devuelva el resultado de la operación.

Especificaciones:
  1. Informar al usuario de la solicitud del primer sumando.
  2. Solicitar al usuario el sumando 1.
  3. Informar al usuario de la solicitud del segundo sumando.
  4. Solicitar al usuario el sumando 2.
  5. Sumar los sumandos 1 y 2 y asignarlos a la variable de resultado
  6. Informar del resultado.
Código:

Ahora, la fase Entrada más extensa (lin. 3 a 6) e incorpora una nueva instrucción (Leer), que es la que dota de interactividad y flexibilidad al script, ya que podemos emplearlo para realizar cualquier suma de dos sumandos sin necesidad de modificar el código.

El proceso que conlleva este script queda representado en el siguiente diagrama de flujo:

Hablaremos de la simbología empleada en un flujograma en una entrada específica. Por ahora es suficiente con comprender qué representa.

miércoles, 27 de julio de 2022

Introducción. Herramientas.

PSeInt 

Se trata de una herramienta para el aprendizaje de la lógica de programación basada en pseudocódigo y en el uso de diagramas de flujo; esto permite que centremos nuestra atención en los conceptos fundamentales de la algoritmia computacional en lugar de en el aprendizaje de la sintaxis del lenguaje de programación. Desde esta perspectiva, PSeInt nos sirve para introducirnos en los conceptos que deseemos trabajar antes de hacerlo desde Python, cuando este procedimiento de trabajo resulte útil.

PSeInt tiene una ventaja añadida que lo hace preferible a otras herramientas similares: está desarrollado en España y en español, por lo que el pseudocódigo y la documentación no requiere el conocimiento de otro idioma, lo que reduce la curva de aprendizaje y facilita su uso en el autoaprendizaje.

Desconozco que exista un manual descargable, pero el propio programa cuenta con información detallada de su funcionamiento, por lo que esa carencia no suponen mayor problema. 

Tampoco la instalación, que es sumamente sencilla: sólo tienes que acceder a esta página, seleccionar tu sistema operativo y dejarte guiar por el instalador. 

De todas formas a continuación te dejo un vídeo que indica los pasos a seguir, por si te surge alguna duda. En el siguiente video de esta misma serie se explica cómo configurar PSeInt y la idea es seguir este curso como guía básica te dejo enlace al mismo para que la referencia sea compartida.


En el vídeo que sigue a éste (se trata de una serie) se explica cómo configurar PSeInt. Podría interesarte seguir este curso como guía básica. Te dejo enlace.

La interface de PSeInt es muy sencilla e intuitiva, aunque manejarse en ella con soltura requiere cierta práctica, como es lógico. La imagen siguiente te muestra parte de esta interface, incluyendo el diagrama de flujo resultante del código del script.

viernes, 8 de julio de 2022

Recursos. Evaluación

Calculadora de edad

El cálculo de la edad de un niño o niña es una tarea que tenemos que hacer con mucha frecuencia, ya que es una de las variables fundamentales en todas las pruebas de evaluación. No es que este cálculo tenga especial complicación, es cosa más bien de sistemática, pero lleva cierto tiempo hacerlo, algo que precisamente no nos sobra.


Construiré este pequeño docap sobre Calc. Su nombre: Calculadora de edad.


El núcleo principal de todo el código (te dejo enlace a documento .txt) es la función CalculadoraEdad que tiene dos parámetros (variables String) y devuelve una cadena de texto (también String, claro): Function CalculadoraEdad (fNac As String, fAct As String) As String. Lo digo porque, como ya sabes, el script desde el que llamemos a esta variable debe tener también dos variables de tipo texto (String) para que todo funcione (teóricamente) bien.

En mi caso he creado un script (Sub Main, en este caso utilizo el script vacío que crea por defecto OOo Basic cada vez que creamos un módulo) que cuenta con dos variables (sFNac y sFAct) cuyos valores paso a la función, y una tercera que me sirve para asignar el contenido que devuelve la función (EdadResultado) mediante la siguiente línea de código: EdadResultado = CalculadoraEdad(sFNac, sFAct).

Este script es algo más complicado de lo que aquí te estoy contando, ya que hace mucho más que recibir el valor que devuelve la función: después escribe el resultado en la hoja de cálculo. Pero lo fundamental, y lo que en última instancia tú tienes que tener en cuenta si quieres emplear la función en otro docap, es lo dicho en el párrafo anterior.

De hecho, además del script Main también he creado otros dos:
  • CopiarEdad, basado en Grabar macro, que sirve para que traslades el resultado principal al documento que desees.
  • BorrarCeldas, que sirve para lo que se supone: dejar la hoja vacía del contendio que escribe el script Main.
Todo esto es para que el conjunto funcione como un docap completo (como calculadora de edad), pero lo que me interesa es explicarte con más detalle qué hace la función y qué devuelve.

El docap.

La apariencia de nuestra calculadora es bien sencilla: Una hoja de cálculo con tres botones de comando:


Cada uno de esos botones tiene la función que se espera según el título:
  • Inicio lanza el script Main.
  • Copiar copia el contenido del resultado (en formato aa:mm:dd) para que lo puedas pegar en cualquier documento (script CopiarEdad, basado en Dispatcher).
  • Y Borrar vacía de contenido las celdas que escribe Main (script  BorrarCeldas)
El resultado que obtienes tras pulsar Main y cubrir los datos que te va pidiendo es el siguiente:


La función.

Una vez que la función recibe ambos parámetros, los transforma en valores numéricos y los trata mediante funciones de fecha. después se realizan los cálculos oportunos para determinar la edad (de la misma forma que hacemos manualmente) y termina devolviendo una cadena de texto con la expresión aa:mm:dd que se asigna a la propia función (obligatorio para que "funcione" la función): CalculadoraEdad = EdadAno & ":" & EdadMes & ":" & EdadDia.

Fíjate que el pasar los parámetros como texto se debe a que los solicitamos mediante InputBox. Podríamos convertirlos a tipo Date y pasarlo como tales, pero me resulta más cómodo y directo hacerlo como texto.

Por este motivo, después en la función debo convertirlos a tipo Date para aplicar las funciones de fecha, como muestro en esta línea de código que sirve de ejemplo: NacAno = Year(CDate(fNac)). En ella se emplean dos funciones OOo Basic:
  • CDate(), que convierte la variable String fNac a tipo fecha
  • Year(), que devuelve el valor año de la misma variable.
Este proceso se repite un total de seis veces, las necesarias para desglosar los días, meses y años de las dos fechas.

La segunda fase consiste en realizar los cálculo y, tal y como sucede en el cálculo manual, debemos tener en cuenta si el minuendo es inferior al sustraendo, ya que en este caso debemos introducir factores de corrección. Esto es lo que realizo mediante dos condicionales, el primero para la resta de los días y el segundo para los meses. Como ejemplo:

If NacDia > ActDia Then
    ActDia = ActDia + 30
    ActMes = ActMes - 1
End If

Una vez resueltas estas cuestiones, se procede a realizar las restas correspondiente: en caso que se cumplan las condiciones antes señaladas, los condicionales anteriores recalculan los valores.

Antes de asignar el resultado a la función, convierto los resultados a String, empleando condicionales para que siempre se generen dos dígitos por segmento. Como ejemplo:

If ActDia - NacDia < 10 Then
    EdadDia = "0" & CStr(ActDia - NacDia)
Else
    EdadDia = CStr(ActDia - NacDia)
End If

De este modo resulta más sencillo trabajar con el resultados para segmentar sus componentes y poder trabajar con ellos por separado. Este proceso lo realiza el script con el que trabaja la función. Finalmente asigno el resultado a la función:

CalculadoraEdad = EdadAno & ":" & EdadMes & ":" & EdadDia

Documentos.