Práctica 3: Procedimientos y Funciones Objetivo de la práctica El objetivo de esta práctica es adquirir experiencia en la descomposición de un problema en subproblemas más pequeños (diseño descendente), y en la utilización de procedimientos y funciones. Se propone el diseño, codificación en PASCAL y puesta a punto de los siguientes problemas: Ejercicios básicos 1) Crear un procedimiento que intercambie los valores de dos variables. Realizar un programa que llame a este procedimiento para que intercambie dos valores leídos desde teclado y los muestre por pantalla. 2) Diseñar una función que devuelva el máximo común divisor de los dos números naturales suministrados como parámetros, otra que devuelva el mínimo común múltiplo, y una tercera que devuelva si los números son primos entre sí. Para el cálculo del m.c.d. se utilizará el algoritmo de Euclides: mcd(a,b) = mcd(b, a mod b), y mcd(a, 0) = a. Para el resto se intentará aprovechar las funciones desarrolladas. Realizar un programa que, utilizando las funciones anteriores, lea dos números enteros del teclado y muestre su máximo común divisor, su mínimo común múltiplo, y si son primos entre sí, hasta que cualquiera de los dos números introducidos sea 0. Ejercicios principales 3) Diseñe una función que devuelva la suma de los dígitos del número natural suministrado como parámetro. Para probar la función, utilice el ejercicio 8 de la práctica 2. 4) La “prueba del 9” de un número natural consiste en obtener la suma módulo 9 de los dígitos del número; es decir, si al sumar un dígito se obtiene un valor mayor o igual que 9, se resta 9. Desarrolle una función que devuelva la “prueba del 9” del número suministrado, sin utilizar la operación mod 9, y un programa que compruebe si prueba_del_9(n) coincide con n mod 9 para todos los números de 0 a un valor dado maxN (por ejemplo 1000). 5) Diseñe una función comb(m,n) que calcule el número combinatorio sabiendo que: Escriba un programa que lea números naturales y muestre su combinatorio. ⎛m⎞ m! ⎜⎜ ⎟⎟ = ⎝ n ⎠ n! ( m − n)! Analice el algoritmo desarrollado y diseñe otras soluciones más eficientes y que permitan operar con números lo más grandes posible. Para ello, realizar transformaciones de la fórmula anterior (por ejemplo, comb(m,n) = comb(m,n-1) * (m-n+1) / n, u otras similares). Prácticas de Programación Pascal Ejercicios adicionales (opcionales, aunque muy recomendable su realización) 6) Diseñe la función redondeo(n, pot10) que devuelva el valor del número entero n redondeado a la cifra expresada por pot10. Ejemplos: redondeo(123, 10) = 120; redondeo(4581, 100)= 4600 7) Diseñe una función que calcule la raíz cuadrada de un número utilizando el método de Newton: si A es una aproximación a la raíz cuadrada de un número X, (A+X/A)/2 será una aproximación mejor. Escriba un programa PASCAL que resuelva ecuaciones de segundo grado utilizando la función raiz_cuadrada definida previamente. NO se puede usar SQRT. 8) Diseñe un procedimiento que transforme un número complejo representado en coordenadas cartesianas a coordenadas polares, y otro que realice la transformación inversa. Diseñe los procedimientos necesarios para leer y escribir números en coordenadas polares, así como los procedimientos para leer y escribir números en coordenadas cartesianas. Para ello hay que decidir previamente como representar en pantalla los números en coordenadas cartesianas y en polares. Por ejemplo, en cartesianas podría ser: c(parteReal, parteImaginaria), y en polares: p(angulo, radio). Para acabar, escriba un programa PASCAL que lea dos números complejos, en cualquier representación, los multiplique, y muestre el resultado en polares. 9) Se debe escribir un programa Pascal que imprima en la pantalla del computador el calendario de un mes de cualquier año a partir de 1900, o bien un año completo, o bien para una fecha determinada su día de la semana. El programa deberá presentar los meses en un formato similar al siguiente: Enero L M X 2007 J V S D -------------------------1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Las distintas opciones del programa se podrán escoger de un menú como el que sigue: 1. 2. 3. 4. MENU Calendario de un año Calendario de un mes ¿Qué día de la semana es ..? salir El programa debe diseñarse de modo que las entradas desde el teclado sean robustas. Esto es, si se introduce desde el teclado un dato incorrecto o inapropiado, el programa debe ser capaz de detectarlo y solicitar una nueva introducción. Nota: Es útil recordar que un año es bisiesto si es múltiplo de 4, aunque los múltiplos de 100 no son bisiestos y los de 400 si lo son. También puede ser útil saber que el 1 de enero de 1900 fue lunes. Depto. Informática e Ingeniería de Sistemas pag. 2 Prácticas de Programación Pascal 10) Desarrollar las siguientes funciones: numDig(n), que devuelve el número de dígitos significativos de n, pot(n), que devuelve la potencia de 10 correspondiente al dígito más significativo de n, y selDig(n,pot10), que devuelve el dígito de n correspondiente a la potencia de 10 suministrada en pot10. Ejemplos: numDig(123) = 3; pot(123) = 100; selDig(123, 10) = 2; selDig (81, 3)= 0 Para comprobar las funciones desarrolladas, escriba un programa PASCAL que obtenga interactivamente un número natural y muestre por pantalla sus dígitos (uno debajo del otro) con el formato anterior. Para obtener los dígitos de un número se utilizará la función selDig(num,pot10), que devuelve el dígito de num correspondiente a la potencia de 10 suministrada en pot10. 11) Desarrollar los procedimientos mostrar_0, mostrar_1,..., mostrar_9 que visualicen por pantalla, respectivamente, los números 0,1,...,9 en tamaño grande, tal y como se muestra a continuación: **** * * * * * * **** * * * * * **** * **** * **** **** * **** * **** * * * * **** * * **** * **** * **** **** * **** * * **** **** * * * * **** * * **** * * **** **** * * **** * **** Para comprobar los procedimientos desarrollados, escriba un programa PASCAL que obtenga interactivamente un número natural y muestre por pantalla sus dígitos (uno debajo del otro) con el formato anterior (sugerencia: utilice las funciones desarrolladas en el ejercicio anterior). 12) Como se puede observar fácilmente, cada línea de cualquiera de los dígitos visualizados en la práctica anterior consta de tres partes: izquierda, centro y derecha con 1, 2 y 1 caracteres, respectivamente. Utilizando esta idea, escriba un procedimiento mostrarLinea que, a partir de tres booleanos suministrados como parámetros, genere las 5 posibles combinaciones de asteriscos para una línea (vacía, llena, asterisco inicial, asterisco final y asterisco inicial y final), y modifique los procedimientos desarrollados en la práctica anterior de modo que utilicen este nuevo procedimiento. 13) Para visualizar los números con un tamaño mayor, manteniendo el mismo formato, basta con definir una constante escala y, en la visualización del número, repetir la escritura de cada carácter y de cada línea tantas veces como indique el valor de esta constante. Así, si escala=2 los números tendrán el aspecto siguiente: ******** ******** ** ** ** ** ** ** ** ** ** ** ** ** ******** ******** ** ** ** ** ** ** ** ** ** ** ******** ******** ** ** ******** ******** ** ** ******** ******** ******** ******** ** ** ******** ******** ** ** ******** ******** ** ** ** ** ** ** ** ** ******** ******** ** ** ** ** ******** ******** ** ** ******** ******** ** ** ******** ******** ******** ******** ******** ******** ******** ******** ******** ******** ** ** ** ** ** ** ** ** ** ** ** ** ******** ** ******** ******** ******** ** ******** ******** ** ** ** ** ** ** ** ** ** ** ** ** ******** ** ******** ******** ******** ** ******** ******** Se pide realizar las modificaciones oportunas a lo desarrollado en el ejercicio anterior de modo que se visualicen los dígitos al tamaño preestablecido por escala. 14) Modifique el programa desarrollado en el ejercicio anterior para que visualice los dígitos rotados 90 grados; es decir, de modo que el número natural introducido interactivamente se lea correctamente al girar el papel 90 grados. Para ello deberá tenerse en cuenta que sólo habrá que mostrar 4 líneas para cada dígito, y que cada línea está compuesta por 5 “tramos” de un carácter, por lo que mostrarLinea tendrá 5 parámetros de tipo booleano. Depto. Informática e Ingeniería de Sistemas pag. 3