Prácticas con procedimientos

Fundamentos de la programación y la informática
Grados en ingeniería aeroespacial, turno de tarde

Escuela de Ingeniería de Fuenlabrada
Universidad Rey Juan Carlos

2024-2025


Práctica 5.1. Variables y procedimientos

Haz una copia de tu práctica

~/fpi/practica03/funcion.pas

en el fichero

~/fpi/practica05/procedimiento.pas

Modifíca este último según la siguiente especificación:

  1. El programa usará un procedimiento. Esto es, el procedimiento llamará a la función y escribirá en pantalla el valor calculado.

  2. El cuerpo principal ya no tendrá constantes con los valores de entrada, sino que se limitará a llamar a un procedimiento. El procedimiento solicitará al usuario que escriba los valores numéricos desde la consola (pantalla y teclado), llamará a la función y escribirá el resultado. Si a pesar de pedir al usuario un tipo de datos (por ejemplo real), el usuario introduce otro tipo (por ejemplo una cadena) el programa generará un error de ejecución. Este problema lo corregiremos más adelante.

Práctica 5.2. Variables y procedimientos, mal hecho

Copia el programa ~/fpi/practica05/procedimiento.pas en ~/fpi/practica05/procedimiento_mal.pas. Edita este último fichero según la siguiente especificación. Ten cuidado de no modificar el fichero original.

Esta práctica es peculiar, ahora vas a estropear el ejercicio anterior. Haz que siga compilando sin errores y devolviendo los mismos valores que antes, pero con un mal diseño: usa las funciones o procedimientos de forma incorrecta. Haz alguna otra cosa mal: usa mal las constantes, pon identificadres inadecuados... cualquier aspecto que hayamos tratado en la asignatura. Deja muy claro en el código fuente, qué está mal y explica brevemente por qué.

Práctica 5.3. Filtrado de datos de entrada

Escribe un programa llamado ~/fpi/practica05/filtrado.pas. En principio será muy similar al que hiciste en el ejercicio 5.1: tendrá un procedimiento que pedirá datos al usuario y llamará a una función para calcular un valor matemático sencillo. El valor a devolver tiene que depender de uno y solo un parámetro. Esto es, el programa leerá un solo valor. (Usa una fórmula distinta a la del ejercicio anterior). El programa:

Práctica 5.4. Procedimiento de filtrado de entrada

Este ejercicio hará algo similar a lo del ejercicio anterior, pero con mejor diseño. En prácticas anteriores, habías hecho subprogramas (funciones o procedimientos) sencillos que funcionaban siempre. Subprogramas que nunca tienen problemas. Por ejemplo una función que sume dos reales, siempre podrá devolver un valor. No hay motivo para que no haya funcionado

Pero en programación es normal que haya subprogramas que no sean capaces de devolver lo pedido. Por ejemplo, un subprograma al que le pidamos que devuelva un número entero escrito por el usuario, pero no pueda porque el usuario haya tecleado un número real o incluso una cadena. O una función a la que le pidamos que nos devuelva un número real con la raiz cuadrada de un número, y no pueda porque lo que le pasamos sea un número negativo.

Así que este tipo de subprogramas, devolverán típicamente dos (o más cosas)

En caso de que el booleano sea cierto, este último valor tendrá sentido y podrá usarse. Pero si el booleano es falso, el segundo valor no tiene nada, no debe tenerse en cuenta. Observa que esta estructura es más o menos la misma que usa el procedimiento val. La única diferencia es que val no indica el éxito/error con un booleano, sino con un entero.

Ahora escribirás un subprograma con esta estructura. Escribe un programa llamado ~/fpi/practica05/filtrado02.pas que tenga un procedimiento llamado intenta_leer_real (o try_read_real si prefieres escribir el programa en inglés). Este procedimiento tendrá:

De esta forma, si necesitamos que el usuario escriba una masa y una aceleración, invocariamos llamadas como esta:

intenta_leer_real('Introduce la masa', ok1, masa)
intenta_leer_real('Introduce la aceleración', ok2, aceleracion)

Si tanto ok1 como ok2 valen TRUE, el programa calculará la fuerza correspondiente. En otro caso, mostrará un error.

Tu programa hará esto mismo, pero busca un ejemplo distinto al de calcular la fuerza a partir de la masa y la aceleración. Usa si quieres algún ejemplo de alguna de tus prácticas anteriores (si es que tenían dos o más parámetros, no solamente uno)

Práctica 5.5. Más procedimientos

Escribe un programa llamado ~/fpi/practica05/procedimiento2.pas que sea idéntico al programa procedimiento.pas de la práctica 5.1, pero conviertiendo la función que hacía el cálculo principal en un procedimiento. Esto es, será un subprograma que no devolverá un valor (usando result) sino que será un subprograma (un procedimiento) que tendrá un parámetro de salida (un parámetro pasado por referencia). Observa que el parámetro o parámetros de entrada no cambiarán. Este procedimiento no podrá tener efectos laterales.

Observa que en un programa real no tendría sentido usar un procedimiento para este propósito porque se trata de parámetros que ocupan poca memoria. El objetivo de esta práctica es que sepas realizar esto cuando uses datos voluminosos, o cuando necesites más de un parámetro de salida.

Práctica 5.6. Variables globales

Ahora harás, de nuevo, algo peculiar: estropear tu práctica. Harás, por una vez, lo que nunca deberías hacer. El propósito es que reconozas y evites esta forma de trabajar.

Escribe un programa llamado ~/fpi/practica05/filtrado_mal.pas cuyo comportamiento sea idéntico al programa filtrado02.pas de la práctica 5.4, pero usando variables globales.

Cada vez que en una línea declares o uses una variable global, es IMPRESCINDIBLE que añadas, en esa línea, en la anterior o la posterior, el comentario //Variable global, suspenso seguro.

Revisión de los nombres de los ficheros

Muy importante: ejecuta ~mortuno/revisa practicas fpi para comprobar que los nombres de los programas son los correctos.