Introducción a los computadores Ejercicios de Subprogramas Ejercicios 1) Supongamos las siguientes declaraciones de un programa principal: VAR R x,y Z m C c Y sea un subalgoritmo con la siguiente cabecera: ALGORITMO Prueba(E Z a,b; ES R c,d; ES C e) Averigua cuáles de las siguientes llamadas a Prueba desde el programa principal son incorrectas y cuál es la razón: a) b) c) d) e) f) g) h) i) Prueba(m+3,10,x,y,c) Prueba(30,10,m,x,c) Prueba(m,19,x,y) Prueba(m,m*m,y,x,c) Prueba(35,m*10,x,c,y) Prueba(m,10,35.0,y,'E') Prueba(m,3.5,x,y,c) Prueba(30,10,x,x+y,c) Prueba(30,10,c,d,e) 2) Diseñar una función lógica que nos diga si un número es impar. 3) Diseña una función que devuelva un número combinatorio de forma modular. Después diséñala de forma más eficiente sacrificando la modularidad. 4) Dado que no es aconsejable utilizar la igualdad entre números reales por ser dependiente de la precisión, diseñar una función que devuelva el valor VERDADERO cuando sus dos argumentos reales son iguales para una tolerancia dada, y FALSO cuando no lo sean. Utilizar para ello la siguiente especificación: ALGORITMO R IgualesR (E R v1, v2, tolerancia) 5) Dado el algoritmo adjunto de este ejercicio, elimina las dos sentencias erróneas que tiene, una en el cuerpo principal y otra en A1, y muestra lo que saldría por pantalla al ejecutar dicho algoritmo si por teclado se le introducen los números 5, 3, 2, 2. ALGORITMO Ambitos VAR Z a,b,c,x,y ALGORITMO A1(ES Z x; E Z y) INICIO a = A2(y) x = x + y y = x * y Escribir(a,b,c,x,y) FIN A1 ALGORITMO Z A2(E Z x) INICIO DEVOLVER x * x FIN A2 23/10/2003 Lenguajes y Ciencias de la Computación 1º Ingeniería Técnica de Telecomunicación 1 Introducción a los computadores Ejercicios de Subprogramas ALGORITMO A3(ES Z b) VARIABLES Z a INICIO b = x + c a = A2(c) Escribir(a,b,c,x,y) FIN A3 INICIO Leer(a,b,c,x) A1(b,a) y = x A3(A2(a)) A3(c) FIN Ambitos 6) a) Dado el algoritmo adjunto, si ch=‘X’ y numero=5, ¿cuál sería el efecto de ejecutar cada una de las siguientes llamadas al procedimiento? Escr(ch,4*numero-12) Escr(ch,6) Escr(5,numero) Escr(‘/’,numero) Escr(‘.’,6) Escr(‘p’,-10) ALGORITMO Escr(E C ch; E Z long) INICIO MIENTRAS long>0 HACER Escribir(ch) long = long - 1 FINMIENTRAS FIN Escr b) Escribe llamadas a Escr para que produzcan las siguientes salidas: 1) 35 guiones sucesivos; 2) 6 veces tantos blancos como el valor de numero; y 3) el valor actual de ch 14 veces. 7) Dadas las declaraciones adjuntas de un determinado algoritmo, ¿ Cuáles de las siguientes llamadas a subalgoritmos en su cuerpo son válidas? a) SI Uno(a,b) ENTONCES ... b) Dos(a,b+3) c) si = Uno(c,5) d) si = Dos(c,5) e) Dos(a,Tres(a)) f) Dos(Tres(b),c) g) SI Tres(a) ENTONCES ... h) b = Tres(Dos(a,5)) i) Dos(4,c) VAR N a, b, c B si ALGORITMO B Uno(E N x, y) ... ALGORITMO Dos(ES N x;E N y) ... ALGORITMO N Tres(E N x) ... 8) Diseña un subprograma que tome como entrada los coeficientes de una ecuación de segundo grado y dé como salida las dos raíces reales de dicha ecuación. En un argumento de salida adicional indicará cuándo las raíces son complejas, en cuyo caso no se calcularán las raíces. Suponer predefinida la función ALGORITMO R Sqrt(R x), que devuelve la raíz cuadrada (SQuare RooT) de un número real x. 9) Escribe una función que tome 3 parámetros: dos de tipo natural y uno de tipo enumerado. La función deberá sumar, restar, multiplicar o dividir los valores de los dos primeros parámetros dependiendo del código indicado en el tercer parámetro, y devolver el resultado. 23/10/2003 Lenguajes y Ciencias de la Computación 1º Ingeniería Técnica de Telecomunicación 2 Introducción a los computadores Ejercicios de Subprogramas 10) Diseña un subprograma que, a partir de tres datos representando una fecha, por ejemplo, día, mes y año, compruebe si constituyen una fecha válida del siglo 20. Para ello, se tendrá en cuenta que los meses de Abril, Junio, Septiembre y Noviembre tienen 30 días; todos los demás meses, exceptuando Febrero, tienen 31 días. Febrero tiene 29 días si el año es bisiesto y 28 días si el año es no bisiesto. Por ejemplo: Día Mes Año Salida 23 11 1948 válido 31 11 1990 inválido 0 11 1990 inválido 1 13 1991 inválido 29 2 1991 inválido 25 12 1890 inválido Nota: identificar los subproblemas del problema a ser resuelto, y resolver cada uno de ellos mediante un subalgoritmo separado. 11) Diseña un subprograma que muestre el calendario para un mes en el siguiente formato: Lunes Martes Miércoles Jueves Viernes Sábado 2 9 16 23 30 3 10 17 24 4 11 18 25 6 13 20 27 7 14 21 28 5 12 19 26 Domingo 1 8 15 22 29 Los datos para el subprograma serán el número de días en el mes y el día de la semana en la que comienza ese mes. En el ejemplo mostrado en la figura, habría que pasarle los siguientes datos de entrada: Mostrar_Calendario (30, Domingo) 12) Diseña un programa que lea como datos de entrada una fecha dada por el mes y el año, y muestre el calendario para el mes en el formato del ejercicio 12. Este problema se divide en los siguientes subproblemas: 1. Leer los valores para mes y año, realizando una validación de dichos datos. 2. Averiguar el día de la semana en el que comienza dicho mes. 3. Averiguar cuántos días tiene dicho mes. 4. Mostrar el calendario. Nota: Tener en cuenta que: El subproblema 3 forma parte del ejercicio 10 de esta relación. El subproblema 4 es planteado en el ejercicio 11 de esta relación. dia_semana=(700 +(26*a –2) DIV 10 + dia + b + b DIV 4 + c DIV 4 – 2*c) MOD 7 donde a, b, c vienen dadas en la siguiente tabla: SI mes<=2 SI mes>= 3 a= mes + 10 a= mes – 2 b= (año –1 ) MOD 100 b = año MOD 100 c= (año –1) DIV 100 c= año DIV 100 23/10/2003 Lenguajes y Ciencias de la Computación 1º Ingeniería Técnica de Telecomunicación 3