Instituto de Comptución - Curso de Programación 1 - Práctico 8 Page 1 of 6 Instituto de Computación Curso de Programación 1 - Práctico 8 1. Identifique los parámetros de entrada (de valor) y de salida (variables) en el siguiente encabezado de procedimiento : PROCEDURE Cheque (x, y, z : integer; VAR a, b, c : integer); 2. Explique la diferencia entre un parámetro formal y un parámetro verdadero. 3. Examine el siguiente código: PROGRAM ... ... PROCEDURE Inicio (tiempo, espacio: real; VAR dia: real; signo: char); ... BEGIN ... Inicio (3.5, 6.0, hora, `Z'); ... END. Identifique los parámetros formales y los parámetros verdaderos. 4. Escribir un procedimiento con solo tres parámetros enteros: a, b y c. El efecto del procedimiento debe ser "girar" los valores de los parámetros hacia la derecha de manera que, después de la ejecución, el valor que originalmente estaba en a quede en b, el que estaba en b quede en c y el que estaba en c quede en a. Probar el procedimiento con un programa que tome a, b y c de la entrada estándar. Ejemplos de entrada: 4 1 7 -12 6 2 Ejemplos de salida: 7 4 1 2 -12 6 5. Considere el siguiente programa : PROGRAM alcance (input, output); VAR tum, num, temp : Integer; http://www.fing.edu.uy/inco/cursos/prog1/pm/uploads/Materiales/Practico8.html 28/10/2005 Instituto de Comptución - Curso de Programación 1 - Práctico 8 Page 2 of 6 PROCEDURE Prog (a, b : integer; VAR c : integer); VAR reloj : Integer; BEGIN reloj := a * b; reloj := reloj + 1; c := reloj + a; WriteLn (a, b, c, reloj) END; (*Programa principal*) BEGIN tum := 1; num := 2; Prog (tum, num, temp); WriteLn (temp); tum := 0; num := 1; Prog (tum, num, temp); WriteLn (temp) END. a. Identifique las variables globales del programa principal. b. Identifique la variable local declarada en el procedimiento Prog. c. Identifique los parámetros formales del procedimiento Prog. Determine los parámetros de entrada (de valor) y de salida (variables). d. Determine los parámetros de valor verdaderos en la primera invocación del procedimiento. e. Determine los parámetros de valor verdaderos en la segunda invocación del procedimiento. f. Determine la salida estándar del programa. ¿Cuántas líneas se escribirán ? 6. Dado el siguiente procedimiento PROCEDURE Prueba (x: Real; y: Integer; VAR z: Real); y las siguientes variables VAR tiempo : Real; tiempo_i : Integer; Determine cuales de las siguientes invocaciones son correctas. Justifique. Prueba( Prueba( Prueba( Prueba( Prueba( Prueba( Prueba( 1, 2.0, tiempo ); tiempo_i, 3, tiempo ); tiempo_i, 3, 2.0 ); 1, 3, tiempo_i ); 5 * tiempo_i, round( 7.3 ), tiempo ); (* tiempo_i ya fue inicializada tiempo, 3, tiempo ); Prueba( 5, 33.8, tiempo ), 92, tiempo ) 7. Considere el siguiente problema. Un piso rectangular que mide 12 metros por 15 metros está cubierto parcialmente por tapetes circulares. El radio de un tapete es de un metro. El radio del otro es de dos metros. El resto del ejercicio plantea cómo hallar el área de la parte del piso que está descubierta. http://www.fing.edu.uy/inco/cursos/prog1/pm/uploads/Materiales/Practico8.html 28/10/2005 Instituto de Comptución - Curso de Programación 1 - Práctico 8 Page 3 of 6 a. Escriba una función que dado el radio de un círculo (un real), devuelva el área correspondiente. b. Escriba una función que calcule el área de un rectángulo de longitud y anchura dadas. c. Escriba un programa completo en Pascal que incluya las funciones desarrolladas en las partes anteriores. El programa deberá incluir invocaciones de las funciones para calcular el área de cada círculo, y una invocación para determinar el área del piso rectangular. Después, el programa principal deberá determinar el área descubierta del piso y exhibir ese resultado. 8. Implemente un procedimiento para calcular las raíces de un polinomio de 2do grado. Este tendrá 6 parámetros: 3 para los coeficientes del polinomio (enteros), 2 para las raíces (reales) y uno para la cantidad de raíces halladas (entero). Determine qué parámetros deben ser de valor y qué parámetros deben ser variables. 9. Implemente un procedimiento que dado un arreglo de enteros devuelva el valor mas grande y el índice en que éste ocurre. El largo del arreglo es dado por una constante N global a la función. 10. Para cada uno de los siguientes problemas, indique si la forma mas apropiada de expresar la solución es con una función o un procedimiento, justificando brevemente. a. Dado un número primo, determinar el número primo inmediato más grande. b. Dado un entero positivo N diferente de cero, determinar el número de factores únicos de N y los dos (o menos) factores únicos más grandes. c. Dado un carácter del conjunto de caracteres ASCII, determinar su posición ordinal en el conjunto de caracteres EBCDIC. d. Dado un número de años N y una cantidad que se va a obtener, C, determinar la tasa mínima de interés anual necesaria para alcanzar C en N años si el interés es compuesto anual, y la tasa de interés anual necesaria para alcanzar C en N años si el interés es compuesto mensual. 11. Escriba una función llamada conv que convierta un arreglo de caracteres, cada uno de los cuales contiene un dígito decimal, al entero equivalente. Por ejemplo, si el parámetro de entrada es [ `1', `2', `3' ], entonces el entero resultante será 123. El largo del arreglo es dado por una constante N global a la función. 12. Escriba una función llamado magnitud que tenga cuatro parámetros de entrada (de valor) llamados x1, y1, x2 y y2, y retorne la distancia absoluta entre los puntos (x1,y1) y (x2,y2). Todas las variables son de tipo real. http://www.fing.edu.uy/inco/cursos/prog1/pm/uploads/Materiales/Practico8.html 28/10/2005 Instituto de Comptución - Curso de Programación 1 - Práctico 8 Page 4 of 6 13. Escriba una función en Pascal para determinar el área de una figura de cuatro lados, dadas las coordenadas de los vértices de la figura. Utilice la función de área de triángulos siguiente. FUNCTION CalcArea( a, b, c: Real ) : Real; (*Calcula el area de un triangulo de lados a, b, c*) VAR s : Real (* Mitad del perimetro del triangulo*) perimetro : Real; (* Perimetro del triangulo*) BEGIN perimetro := a + b + c; s := perimetro / 2; (* Calculo del area mediante la formula de Heron *) CalcArea := sqrt (s * (s-a) * (s-b) * (s-c)) END; 14. Reescriba el programa del Ejercicio 10 del Práctico 7, implementando y utilizando esta función: FUNCTION EsPrimo( valor: Integer ) : Boolean; solo si "valor" es primo *) (* Devuelve TRUE si y 15. Escriba una función booleana llamada "Multiplo" que tenga dos argumentos enteros m y n. "Multiplo" debe producir el valor True si m es un múltiplo entero de n, o si n es un múltiplo entero de m. Escriba un programa para probar esta función. El programa deberá leer una pareja de enteros positivos de cada línea de datos de entrada, invocar a "Multiplo", y exhibir el resultado de esta función. La secuencia de enteros finaliza cuando el usuario ingresa el valor -1. Ejemplo de entrada/salida: 4 7 Falso 4 8 Verdadero 16 8 Verdadero -1 16. Implemente una función que dados 2 arrays de caracteres, determine si el primero es prefijo del segundo. Luego reescriba el Ejercicio 7 del Práctico 7 utilizando esta función. En caso de que la cadena más corta pertenezca a la más larga, despliegue en la salida estándar la posición en que comienza la coincidencia. Tomando el primer ejemplo dado en el Ej. 7, la salida sería: El texto 'tor' se encuentra dentro del texto 'totora' ( posición de comienzo: 3 ). En caso de que no haya coincidencia, el mensaje deberá ser el mismo que en el Ej. 7 del Pr. 7. http://www.fing.edu.uy/inco/cursos/prog1/pm/uploads/Materiales/Practico8.html 28/10/2005 Instituto de Comptución - Curso de Programación 1 - Práctico 8 Page 5 of 6 17. Una matriz simétrica a es un arreglo cuadrado bidimensional con la propiedad de que a[i,j] = a[j,i]. Una matriz así se puede almacenar en forma compacta ( en el arreglo ac) ya que basta con almacenar una sola vez los elementos duplicados del arreglo. En primer término, diseñe un método para almacenar un arreglo de éstos sin repetir los elementos duplicados. Después escriba una función OBTSIM ( ac, i, j ) que de el valor de a[i,j] y un procedimiento ALMASIM( ac, i, j, val ) que almacene val en la posición que corresponda del arreglo compacto ac. Sugerencia: basta con almacenar n elementos de la columna n; pensar en un arreglo unidimensional que contiene los elementos de la columna uno, después de la columna dos, y así sucesivamente. 18. La función de Ackermann se define de la siguiente manera, donde m, n y el resultado son todos valores enteros: A(m,n) = n + 1 si m = 0 = A( m - 1, 1 ) si m <> 0 y n = 0 = A( m - 1, A( m, n - 1 )) si m ni n son 0 Escriba una función en Pascal que calcule el valor de la función de Ackermann, dados los parámetros m y n. Tenga en cuenta que valores altos de m y n producen tiempos de ejecución largos. 19. Escriba una función que produzca el factor primo más pequeño de su argumento entero positivo. Escríbir un programa principal que use esta función para exhibir los factores primos de los enteros que aparecen en los datos de entrada. La secuencia de enteros termina en 0. Exhibir los resultados para cada dato en una línea, precedidos por el entero mismo y un signo de igual. Separar los factores primos mediante asteriscos. Ejemplo de entrada: 39 42 1517 0 Ejemplo de salida: 39 = 3 * 13 42 = 2 * 3 * 7 1517 = 37 * 41 20. Implemente una función recursiva que dado un arreglo de enteros de tamaño N, retorne el máximo elemento del mismo. 21. Escriba un procedimiento que reciba un valor entero, y que lo exhiba en el mínimo espacio posible, utilizando solo proposiciones write con un parámetro de tipo caracter. Esto se puede hacer si se trata la exhibición como un problema http://www.fing.edu.uy/inco/cursos/prog1/pm/uploads/Materiales/Practico8.html 28/10/2005 Instituto de Comptución - Curso de Programación 1 - Práctico 8 Page 6 of 6 recursivo. Suponiendo que el entero a exhibir es N, el problema se resolverá de este modo: Si N es negativo, poner '-' y luego imprimir la representación de -N, que va a ser un entero positivo. Si N es mayor o igual a 10, llamar recursivamente este procedimiento con N DIV 10. Exhibir N MOD 10 Escriba un programa principal para probar el procedimiento, tomando el valor entero de la entrada estándar. In.Co. - Curso de Programación 1 http://www.fing.edu.uy/inco/cursos/prog1/pm/uploads/Materiales/Practico8.html 28/10/2005