Fundamentos de la programación y la informática
Grados en ingeniería aeroespacial, turno de tarde, 2023-2024
Escuela de Ingeniería de Fuenlabrada
Universidad Rey Juan Carlos
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 solicitará al usuario que escriba los valores numéricos desde la consola (pantalla y teclado). Si a pesar de ello el usuario introduce no un número sino otro tipo de datos, 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/iva.pas
que haga lo mismo que el ejercicio 3.1, pero usando procedimientos, sin usar ninguna función. Procura que los efectos laterales de los procedimientos sean los mínimos imprescindibles. Puedes usar variables y sentencias if-then-else, si quieres. En otras palabras: convierte todas las funciones en procedimientos. Observa que en un programa real esto no tendría sentido porque se trata de parámetros que ocupan poca memoria. El propósito es que sepas realizar esto para cuando uses datos voluminosos.
Para cada procedimiento que escribas indica, en un comentario, si usas un procedimiento porque es lo más adecuado para ese caso o si sería mejor una función pero usas un procedimiento forzado, por imposición de la especificación (porque este enunciado te lo pide así). Puedes escribir por ejemplo un comentario con procedimiento adecuado o procedimiento forzado.