;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PRACTICA-10.TXT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Vectores. Asignaci\'on y procedimientos "mutantes". 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 1 * ************************************************************************** Eval\'ua las siguientes expresiones, razonando el resultado: (define v1 (vector 1 45 67 8)) ;;;(a) (define v2 (make-vector 5 'hola)) ;;;(b) (vector-ref v1 0) ;;;(c) (vector-ref v1 2) ;;;(d) (vector-set! v2 4 'adios) ;;;(e) (vector-ref v2 4) Observa cual es el valor de x despu\'es de evaluar cada expresi\'on: (define x 100) ;;;(f) (set! x 200) ;;;(g) (set! x (+ x 3)) ;;;(h) (define lista-vect1 ;;;(i) (let ((v (make-vector 3 0))) (list v v))) (vector-set! (car lista-vect1) 1 45) ;;;(j) lista-vect1 ;;;(k) (define lista-vect2 ;;;(l) (list (make-vector 3 0) (make-vector 3 0))) (vector-set! (car lista-vect2) 1 45) ;;;(m) lista-vect2 ;;;(n) *********************************************************************** * EJERCICIO 2 * *********************************************************************** Escribe un procedimiento vector-pertenece? que tome como entrada un vector y un valor x, y devuelva #t si alguna delas componentes de v es igual a x y #f en caso contrario. (vector-pertenece? #(3 5 ju e ves) 'e) ==> #t (vector-pertenece? #(3 5 ju e ves) 'a) ==> #f (vector-pertenece? #() 7) ==> #f *************************************************************************** * EJERCICIO 3 * *************************************************************************** Define un procedimiento pega-vectores que tome como entrada dos vectores, v1 y v2, y devuelva como valor un vector de dimensi\'on igual a la suma de las dimensiones de v1 y v2 y cuyos elementos son los de v1 y, a continuaci\'on, los de v2. (pega-vectores #(2 4 6) #(hola 5 adios)) ==> #(2 4 6 hola 5 adios) (pega-vectores #(a b) #()) ==> #(a b) ********************************************************************** * EJERCICIO 4 * ********************************************************************** Eval\'ua las siguientes expresiones intentando comprender los resultados obtenidos: (let ((x 3)) ;[4a] (let ((y 2)) (let ((z (+ x y))) (set! x 5) (display z)))) (let ((x 3)) ;[4b] (let ((y 2)) (set! x 5) (let ((z (+ x y))) (display z)))) (let ((x (list 1 2 3))) ;[4c] (let ((y (list 4 5 6))) (let ((z (cons x y))) (set-cdr! x y) z))) ********************************************************************** * EJERCICIO 5 * ********************************************************************** Describe el comportamiento de los siguientes procedimientos: (define last-pair (lambda (x) (if (pair? (cdr x)) (last-pair (cdr x)) x))) (define misterio (lambda (x) (let ((box (last-pair x))) (set-cdr! box x) x))) ********************************************************************** * EJERCICIO 6 * ********************************************************************** Describe el comportamiento del siguiente procedimiento: (define efface (lambda (x ls) (cond ((null? ls) '()) ((equal? (car ls) x) (cdr ls)) (else (let ((z (efface x (cdr ls)))) (set-cdr! ls z) ls))))) *********************************************************************** * EJERCICIO 7 * *********************************************************************** Define un procedimiento cuenta-vector que reciba como entrada un predicado p y un vector v y devuelva como valor el n\'umero de elmentos de v que satisfacen p. (cuenta-vector number? #(1 (1 2 3) 'hola 78)) ==> 2 (cuenta-vector symbol? #(2 3 4)) ==> 0 *************************************************************************** * EJERCICIO 8 * *************************************************************************** Define un procedimiento filtra-vector que tome como entrada un predicado, p, y devuelva como valor un procedimiento que reciba como entrada un vector, v, y devuelva como valor un vector formado por los elementos de v que verifican p. ((filtra-vector even?) #(2 3 6 8 9)) ==> #(2 6 8) ((filtra-vector symbol?) #(a b 3 "hola" #t 6 fin)) ==> #(a b fin) ((filtra-vector symbol?) #(1 2 3)) ==> #()