;;;;;;;;;;;;;;;;;;;;;;;;;;;; PRACTICA-4.TXT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Abstracci\'on de datos: n\'umeros complejos en forma rectangular y polar Para facilitar el trabajo divide la pantalla en dos ventanas mediante CTRL-X 2 y, en una de ellas, crea un buffer para trabajar con el int\'erprete, mediante ESC-X run-scheme ENTER. Utiliza CTRL-X O para saltar de una a otra ventana, mientras haces los ejercicios. |----------------------------------------------------------------------------| |----------------------------------------------------------------------------| | NOTA: Recuerda que no es necesario teclear en el int\'erprete | | expresiones que ya aparezcan en este fichero. Para ello primero debes | | pasar a modo scheme, tecleando (con el cursor en este buffer) | | ESC-X scheme-mode ENTER. Luego, cada vez que quieras evaluar una expresi\'on | | que ya est\'a escrita en este fichero, no tendr\'as que teclearla de nuevo | | en el buffer del int\'erprete. Bastar\'a que coloques el cursor al | | principio de la expresi\'on y teclees CTRL-C CTRL-E. | | Observar\'as que en la ventana de scheme aparece el valor de la | | expresi\'on. | |----------------------------------------------------------------------------| |----------------------------------------------------------------------------| |----------------------------------------------------------------------------| |----------------------------------------------------------------------------| | NOTA: Recuerda tambi\'en que no es necesario escribir las expresiones | | pedidas en el int\'erprete. Puedes escribirlas en este buffer debajo | | de cada apartado y evaluar lo que escribes con CTRL-C CTRL-E, viendo la | | respuesta en el buffer de Scheme. As\'i, podr\'as corregir fallos | | f\'acilmente y adem\'as al final de la clase, si grabas este fichero, | | tendr\'as los ejercicios resueltos, sin necesidad de anotar en papel | | las soluciones. Al usar CTRL-C CTRL-E recuerda que la expresi\'on que | | deseas evaluar debe comenzar con par\'entesis y el primero de ellos debe | | ocupar la PRIMERA COLUMNA DE LA IZQUIERDA. | |----------------------------------------------------------------------------| |----------------------------------------------------------------------------| *************************************************************************** * EJERCICIO 0 * *************************************************************************** En este ejercicio manejaremos los distintos tipos de n\'umeros y algunos predicados que act\'uan sobre ellos, así como varios predicados de igualdad. (1) Eval\'ua las siguientes expresiones e intenta comprender los resultados devueltos por el int\'erprete: (+ 2 6) ;;;[01a] (+ 2.0 6) ;;;[01b] (+ 1.23232323232323232323232377777 0.0) ;;;[01c] (* 6e3 6e23) ;;;[01d] (* 6000 6e23) ;;;[01e] (2) Eval\'ua razonadamente las siguientes expresiones (or (exact? 2e3) (exact? 2000.0)) ;;;[02a] (inexact? 2e3) ;;;[02b] (inexact? 2000) ;;;[02c] (integer? 2e3) ;;;[02d] (real? 2e3) ;;;[02e] (integer? 10.3) ;;;[02f] (exact? (+ 2 3.0)) ;;;[02h] (inexact? (* 234566 2334567)) ;;;[02i] (3) Intenta comprender las diferencias entre los distintos predicados de igualdad que ofrece scheme. (eqv? 'a 'a) ;;;[03a] (eqv? 'a 'b) ;;;[03b] (eqv? 2 3) ;;;[03c] (eqv? 2 2.0) ;;;[03d] (define L (cons 1 ())) ;;;[03e] (eqv? L (cons 1 ())) ;;;[03f] (= 2 3) ;;;[03g] (= 2 'a) ;;;[03h] (equal? 2 'a) ;;;[03i] (equal? L (cons 1 '())) ;;;[03j] (and (equal? 2 2.0) (= 2 2.0)) ;;;[03k] *************************************************************************** * EJERCICIO 1 * *************************************************************************** En el resto de esta pr\'actica trabajaremos con los n\'umeros complejos como un tipo abstracto de dato. De momento, representaremos un n\'umero complejo, en forma rectangular, como un par punteado (x . y) (1) Realiza las definiciones (define realc (lambda (z) (car z))) (define imagc (lambda (z) (cdr z))) (define haz-complejo (lambda (x y) (cons x y))) (define es-cero? (lambda (z) (and (= 0 (car z)) (= 0 (cdr z))))) (2) Definir usando los procedimientos realc, imagc y haz-complejo (constructores y selectores), la suma y el producto de n\'umeros complejos. Usa los nombres c+ y c* respectivamente. Por ejemplo: (c+ '(1 . 2) '(2 . 4)) ==> (3 . 6) (c* '(1 . 2) '(1 . 0)) ==> (1 . 2) (c* '(1 . 2) '(0 . 1)) ==> (-2 . 1) (c* '(2 . 3) '(1 . 1)) ==> (-1 . 5) *************************************************************************** * EJERCICIO 2 * *************************************************************************** Define los siguientes procedimientos: - conjugado que calcule el conjugado de un n\'umero complejo. - moduloc, que calcule el m\'odulo de un n\'umero complejo. - argumento, que calcule el argumento de un n\'umero complejo. - cinv que calcule el inverso de un n\'umero complejo no nulo. Aqu\'i tienes algunos ejemplos: (conjugado '(1 . 2)) ==> (1 . -2) (conjugado '(7.23 . 0)) ==> (7.23 . 0) (conjugado '(0 . 0)) ==> (0 . 0) (moduloc '(3 . 4)) ==> 5.0 (moduloc '(0 . 3)) ==> 3.0 (argumento '(3 . 4)) ==> 0.927295218001612 (argumento '(3 . 0)) ==> 0.0 (argumento '(0 . 3)) ==> 1.5707963267949 (cinv '(3 . 0)) ==> (0.333333333333 . 0) (cinv '(3 . 4)) ==> (0.12 . -0.16) (cinv '(0 . 0)) ==> ERROR: cinv: argumento nulo Piensa si tu definici\'on es independiente de la representaci\'on escogida para los n\'umeros complejos (de momento, pares punteados). *************************************************************************** * EJERCICIO 3 * *************************************************************************** Define dos procedimientos c/ y c- que dividan y resten n\'umeros complejos (respectivamente). *************************************************************************** * EJERCICIO 4 * *************************************************************************** (1) Cambia la representaci\'on escogida definiendo (define realc (lambda (z) (car z))) (define imagc (lambda (z) (cadr z))) (define haz-complejo (lambda (x y) (list x y))) (define es-cero? (lambda (z) (and (= 0 (car z)) (= 0 (cadr z))))) (2) Tendremos ahora que volver a definir c+ c* c/ c- etc.? Eh? *************************************************************************** * EJERCICIO 5 * *************************************************************************** Supongamos que se desea representar cada n\'umero complejo en forma polar, mediante un par punteado formado por el m\'odulo y el argumento del n\'umero complejo. Redefinir realc, imagc, haz-complejo y es-cero? para que no sea necesario cambiar la definici\'on de c*, c+, c- , c/ etc. Prueba con los siguientes ejemplos: (c* '(2 . 3.1416) '(3 . 3.1416)) (c/ '(6 . 3.1416) '(2 . 3.1416))