Práctica 3

advertisement
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
Descargar