Fundamentos de la programación y la
informática
Grados en ingeniería aeroespacial, turno de tarde
2024-2025
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:
El programa usará un procedimiento. Esto es, el procedimiento llamará a la función y escribirá en pantalla el valor calculado.
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.
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é.
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:
Pedirá al usuario que escriba un número (real o entero, según corresponda).
Leerá no un número, sino una cadena.
Intentará convertir la cadena en número. Si tiene éxito, invocará a la función que hace los cálculos y mostrará el resultado. En otro caso, mostrará un error describiendo lo sucedido.
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)
Un booleano, que si vale true significa todo bien, aquí va lo que me has pedido. Si vale false significa algo ha fallado, no puedo darte lo que querías.
Otro valor (o tal vez más de uno), donde esté la información que el programador quería. Por ejemplo un número real, o una cadena, o dos números reales, etc.
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á:
El parámetro de entrada pregunta
o
(question
, en inglés). Contendrá una cadena, con la
pregunta que le haremos al usuario
El parámetro de salida ok, que será un booleano indicando si todo ha ido bien y el usuario realmente escribió un real. (Recuerda que para que un parámetro sea de salida, debes pasarlo por referencia, no por copia)
El parámetro de salida valor (o value) , que será el real que ha introducido el usuario (si todo ha ido bien) o un valor indeterminado en otro caso.
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)
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.
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.
Muy importante: ejecuta ~mortuno/revisa practicas fpi
para comprobar que los nombres de los programas son los correctos.