Está en la página 1de 9

Paradigmas de Lenguajes de Programacin o 2do Cuatrimestre de 2006

Prctica No 6 - Programacin Orientada a Objetos a o


Para resolver esta prctica, recomendamos usar el entorno VisualWorks, de distribucin a o gratuita, que puede bajarse del sitio web de la materia bajo la seccin Links. o

Ejercicios introductorios
Ejercicio 1 Qu responde Smalltalk cuando se le pide evaluar las siguientes expresiones? e i. ii. iii. iv. v. vi. vii. viii. ix. x. xi. xii. xiii. 1 1 class (1+1) (1+1) class hola, mundo hola, mundo class #(7 6 5) #(7 6 5) class #(7 6 5) at: 1 (#(7 perro 5.24 $a) (#(7 perro 5.24 $a) (#(7 perro 5.24 $a) (#(7 perro 5.24 $a)

at:1) at:2) at:3) at:4)

class class class class

Ejercicio 2 Qu responde Smalltalk cuando se le pide evaluar las siguientes expresiones? Al evaluar una e expresin, tener en cuenta el ambiente producido por las evaluaciones previas. Las variables o en maysculas representan variables globales. u i. ii. iii. iv. v. vi. vii. viii. ix. x. xi. xii. xiii. x := 2 X := 2 X := X+1 Y := Y+1 Y Y := (2 3 4) Y := #(2 3 4) Y at :1 Y := Y at :2 |n| n := 4 n |n| n := n+1 |n m| n := 4. m := 1. ^(n+m+X+Y)

Ejercicio 3 Idem que el ejercicio anterior, suponiendo que se ha salvado la imagen producida por l. e

Pgina 1 de 9 a

Paradigmas de Lenguajes de Programacin o 2do Cuatrimestre de 2006

i. ii. iii. iv. v. vi. vii. viii. ix. x. xi. xii. xiii. xiv. xv. xvi. xvii. xviii. xix.

[X. Y] [X. Y] class [X. Y] value Duplicar := [:n | 2*n] Duplicar value Duplicar value:5 (Objeto at:2) isVowel ifTrue: [2. 3] ifFalse: [3. 4] [X>0] whileTrue: [X := X - 1] X 5 timesRepeat: [X := X + Y] X A := Array new. A := #(1 2 3 4 5 6 7) A do: [:n | X := X + n]. ^X A select: [:i | i factorial < (i*i)] A reject: [:i | (i even) & (i>4)] A collect: [:i | X + Y + i] 2 to:5 do:[:i | A at:i put:2*i] A [X<10] whileTrue: [X:=X+1. X==5 ifTrue: [^X]]

Dise o de Clases y Manejo de Colecciones n


Ejercicio 4 Implementar los siguientes mtodos: e i. to: do: usando el mtodo whileTrue:. e ii. do: para la clase Array usando whileFalse:. iii. reject: usando select: y not. Ejercicio 5 Considerar el mtodo de instancia verificar:aPartirDe:, implementado en la clase e SequenceableCollection (superclase de las clases String y Array entre otras). Tener en cuenta que slo la clase String posee un mtodo de instancia asUpperCase cuyo o e efecto es cambiar las minsculas del objeto receptor por las maysculas correspondientes. u u El mtodo at: se encuentra implementado en la clase Object, superclase de Collection, e que es a su vez superclase de SequenceableCollection. verificar: patron aPartirDe: unIndice |posCadena posPatron cadenaChar patronChar| posCadena := unIndice. posPatron := 1. [ cadenaChar := self at: posCadena. patronChar := patron at: posPatron. cadenaChar = patronChar ] whileTrue: [ posCadena := posCadena + 1. posPatron := posPatron + 1.
Pgina 2 de 9 a

Paradigmas de Lenguajes de Programacin o 2do Cuatrimestre de 2006

(posPatron > patron size) ifTrue: [^true]. (posCadena > self size) ifTrue: [^false]. ]. ^false. i. Cul es el efecto del mensaje verificar:aPartirDe: cuando es enviado con parmea a tros adecuados a un objeto adecuado? ii. Cul es el resultado de las siguientes evaluaciones? a i. Or. Objetos verificar: Obj aPartirDe: 5 ii. Or. Objetos verificar: #($O $b $j) aPartirDe: 5 iii. Or. Objetos verificar: Obj aPartirDe: 4 iv. Or. Objetos verificar: O aPartirDe: 5 v. #($O $b $j $t) verificar: bj aPartirDe: 3 vi. #($O $b $j $t) verificar: #($b $j) aPartirDe: 2 iii. Si se modica el mtodo verificar:aPartirDe: cambiando la quinta l e nea por: cadenaChar := self asUpperCase at: posCadena. cules son los resultados de las evaluaciones del a tem anterior? Ejercicio 6 Agregar un mtodo a la clase Number que represente la estructura de control for. El mtodo e e debe poseer la siguiente interfaz: valor inicial to: condicin step: incremento body: cuerpo o Donde valor inicial es una instancia cualquiera de Number, condicin es un bloque de o cdigo de un argumento que devuelve true o false, incremento es un bloque de cdigo de o o un argumento que devuelve un valor, y cuerpo es un bloque de cdigo de un argumento. o La expresin debe devolver nil. o Por ejemplo, la siguiente expresin imprime 1234 y evala a nil: o u 1 to: [:i | i < 5] step: [:i | i + 1] body: [:i | Transcript show: i printString] Ejercicio 7 Denir una clase Complex que implemente la clase de los nmeros complejos. Denir los u siguientes mtodos: e i. Re e Im, que devuelvan la parte real e imaginaria, respectivamente, del objeto receptor. ii. re:im:, tal que el mensaje re:a im:b inicialice el objeto receptor con parte real a y parte imaginaria b. iii. sum:, tal que el efecto de c sum:d sea actualizar c con c+d, donde + es la suma de nmeros complejos. u iv. abs, que devuelva el valor absoluto del objeto receptor. v. + (injo), que devuelva la suma compleja de sus dos argumentos. vi. printOn: para mostrar complejos de modo adecuado. Sugerencia: ver cmo est impleo a mentado el mtodo con el mismo nombre en la clase predenida Fraction. e

Pgina 3 de 9 a

Paradigmas de Lenguajes de Programacin o 2do Cuatrimestre de 2006

Herencia
Ejercicio 8 Sean las clases Uno, Dos y Tres, tales que Tres es subclase de Dos, y Dos es subclase de Uno. Las tres clases tienen mtodos a y b denidos as e : Class: Class: Class: Uno Dos Tres Methods: Methods: Methods: a ^2. a ^8. a ^super b. b ^self a. b ^super b. b ^super a.

Sean uno, dos y tres instancias de las clases Uno, Dos y Tres respectivamente. Cules a son los resultados de las siguientes evaluaciones? i. ii. iii. iv. v. vi. uno a uno b dos a dos b tres a tres b

Ejercicio 9 Se tienen denidas en Smalltalk las clases A, B y C. Todos los mtodos presentados son de e instancia, con excepcin del mtodo new de la clase C, que es un mtodo de clase. o e e Object subclass: #A print Transcript show: Soy la clase A. hacerAlgo self print. A subclass: #B print Transcript show: Soy la clase B. B subclass: #C print Transcript show: Soy la clase C. hacerAlgo super print. new ^super new. Qu mensajes se imprimen en el Transcript, si dentro de una ventana de Workspace se e evalan las siguientes expresiones? u

Pgina 4 de 9 a

Paradigmas de Lenguajes de Programacin o 2do Cuatrimestre de 2006

i. ii.

b b c c

:= B new. hacerAlgo. := C new. hacerAlgo.

Ejercicio 10 Se tienen las clases A, B, C, D donde A es superclase de B y C, y C es superclase de D, y no hay otra relacin de herencia entre ellas cuatro. Cmo debe hacerse para conseguir que valga lo o o siguiente? i. x esA debe devolver true para cada instancia x de A o de sus subclases, y false para cada x que no sea instancia de A ni de sus subclases. ii. x esBoC debe devolver true para cada instancia x de B o de C, o de las subclases de ambas, pero false para cada x que no sea instancia de B ni de C ni de subclases de ellas. iii. x esSoloC debe devolver true para cada instancia x de C y false para cada instancia de cualquier otra clase, inclusive subclases de C. Ejercicio 11 Se tienen 2 clases: A y B tal que B es subclase de A. Cada una tiene una variable de instancia, a y b respectivamente, con mtodos de instancia para asignar y obtener los valores. e La clase A tiene 2 mtodos de instancia: e imprimir self calcular. calcular ^((self geta) + 1). La clase B tiene 2 mtodos de instancia: e imprimir |b| b:=self calcular. super imprimir. calcular ^((self getb) * 2). Dado el siguiente cdigo: o |a b| a:= A new. b:= B new. a seta:2. b seta:3. b setb:4. a imprimir. b imprimir. Describa brevemente la ejecucin. Qu se devuelve? Describa el contenido de las variables o e de instancia de cada objeto, al nalizar la ejecucin. o

Pgina 5 de 9 a

Paradigmas de Lenguajes de Programacin o 2do Cuatrimestre de 2006

Ejercicios de Parcial
Ejercicio 12 Se cuenta con la clase Figura, que tiene los siguientes mtodos: e perimetro ^((self lados) sumarTodos). lados ^self subclassResponsibility. donde sumarTodos es un mtodo de la clase Collection, que suma todos los elementos e de la coleccin receptora. El mtodo lados debe devolver un Bag (subclase de Collection) o e con las longitudes de los lados de la gura. Figura tiene dos subclases: Cuadrado y Circulo. Cuadrado tiene una variable de instancia lado, que representa la longitud del lado del cuadrado modelado; Circulo tiene una variable de instancia radio, que representa el radio del c rculo modelado. Se pide que las clases Cuadrado y Circulo tengan denidos su mtodo perimetro. Implee mentar los mtodos que sean necesarios para ello, respetando el modelo (incompleto) recin e e presentado. Observaciones: el per metro de un c rculo se obtiene calculando: 2 radio, y el del cuadrado: 4 lado. Consideramos que un c rculo no tiene lados. Aproximar por 3,14. Ejercicio 13 i. En Smalltalk, agregar a la clase Collection un mtodo con la siguiente interfaz: e collectCircular: unosBloques donde unosBloques es una coleccin secuencial de bloques de cdigo (es decir, instancias o o de la clase BlockClosure) con un parmetro de entrada cada uno. A diferencia del a mtodo collect:, este mtodo aplica a cada elemento de la coleccin receptora del e e o mensaje un bloque de cdigo perteneciente a unosBloques. El orden de aplicacin de o o los bloques debe ser circular, comenzando con el primero y aplicando uno por vez. La coleccin unosBloques no debe ser modicada por el mtodo. o e Por ejemplo, la evaluacin de la siguiente expresin: o o #(1 2 4 3) collectCircular: (Array with: ([:i | i * 2]) with: ([:i | i + 1]) with: ([:i | hola])) da como resultado: #(2 3 hola 6) ii. Se cuenta con la clase Mazo, subclase de OrderedCollection, que contiene una secuencia de cartas. Tambin est disponible la clase Jugador, que posee un mtodo de instancia e a e tomarCarta:, que recibe una carta y la agrega a la mano del jugador. Utilizando el mtodo collectCircular:, denido en el item anterior, se pide denir el siguiente e mtodo en la clase Mazo: e repartir: unosJugadores donde unosJugadores es una coleccin secuencial de objetos de tipo Jugador. El mtodo o e repartir debe repartir las cartas del mazo entre los jugadores lo ms equitativamente a posible. Esto signica que si la cantidad de cartas es mltiplo de la cantidad de jugadores, u todos los jugadores terminarn con la misma cantidad de cartas, y en caso contrario un a
Pgina 6 de 9 a

Paradigmas de Lenguajes de Programacin o 2do Cuatrimestre de 2006

subconjunto de los jugadores se quedar con una carta menos. Deben repartirse todas a las cartas del mazo, y el mazo debe quedar vac luego de invocar a repartir:. El o mtodo devuelve nil. e Ayudas: La clase BlockClosure tiene denido el mtodo value:, que evala el bloque receptor e u pasndole un parmetro. a a Ejemplo: [:n|n*2] value: 10 devuelve 20. Las colecciones secuenciales (subclases de SequenceableCollection) tiene denido el mtodo at:, cuyo unico parmetro es un e a ndice y devuelve el elemento cuyo ndice es el especicado. Ejemplo: #(7 8 10 9) at: 3 devuelve 10. Asumir que la clase Mazo posee el mtodo removeAll que elimina todos las cartas del e mazo receptor. Ejercicio 14 En Smalltalk, se ha denido la clase Mail de la siguiente manera: Object subclass:#Mail instanceVariableNames: encabezado cuerpo armarMensaje ^encabezado, procesar: cuerpo procesar: unCuerpo ^unCuerpo Adems de la clase Mail, existen otras dos clases: MailFirmado y MailCifrado. MailFirmado a tiene un mtodo de instancia firmar: unMensaje con: unaFirma, que se encarga de re mar el mensaje completo (encabezado y cuerpo). MailCifrado tiene un mtodo de instancia e cifrar: unCuerpo con: unaClave, que se encarga de encriptar el cuerpo de un mensaje. Se pide completar MailFirmado y MailCifrado, agregando los mtodos y variables de e instancia que se consideren necesarios de formar tal que armarMensaje funcione de la forma esperada. Se debe evitar repetir cdigo en la implementacin propuesta. Indicar la relacin o o o de herencia entre las clases involucradas. Ejercicio 15 i. En Smalltalk, agregar a la clase Collection un mtodo con la siguiente interfaz: e inject: primerValor and: segundoValor into: operacion donde operacion es un bloque de cdigo de tres argumentos que se evala una vez por o u cada elemento del receptor, con dicho elemento como tercer argumento. En la n-sima e evaluacin, el primer y segundo argumento de operacion corresponden al resultado o de la evaluacin n-1 y n-2 respectivamente. La primera evaluacin comienza evaluando o o operacion, con primerValor como primer argumento, segundoValor como segundo argumento, y el primer elemento del receptor como tercer argumento. La segunda evaluacin toma el segundoValor como primer argumento y el resultado de la primera o
Pgina 7 de 9 a

Paradigmas de Lenguajes de Programacin o 2do Cuatrimestre de 2006

evaluacin como segundo argumento. El mtodo debe devolver la ultima evaluacin de o e o operacion. El orden de recorrido de los elementos es el dado por el do:. Por ejemplo, la evaluacin de la siguiente expresin: o o #(c d e) inject: a and: b into: [:a :b :c | a, b, c] da como resultado: abcbabcde (el resultado es cada iteracion ser 1)abc, 2)babcd a: y 3)abcbabcde) ii. Utilizando inject:and:into:, denido en el item anterior, se pide redenir el mtodo e usual de Collection: inject: valor into: operacion de forma tal que se comporte exactamente como la versin original de inject:into:. o Ayudas: La clase BlockClosure tiene denido el mtodo value:, que evala el bloque recepe u tor pasndole un parmetro. Tambin estn disponibles en la misma clase los mtodos a a e a e value:value: y value:value:value: para bloques de dos y tres argumentos respectivamente. Ejemplo: [:n|n*2] value: 10 devuelve 20. Ejercicio 16 i. En Smalltalk, agregar a la clase Collection un mtodo con la siguiente interfaz: e selectAnd: unasCondiciones donde unasCondiciones es una coleccin de bloques de cdigo (es decir, instancias de o o la clase BlockClosure) con un parmetro de entrada cada uno y que devuelven un valor a booleano. A diferencia del mtodo select: bsico, este mtodo requiere que todas las e a e condiciones sean verdaderas para incluir un elemento de la coleccin receptora en la o coleccin resultado. o Por ejemplo, la evaluacin de la siguiente expresin: o o #(1 5 2 4 7 3 6) selectAnd: (Array with: [:i devuelve #(5 7) | i odd] with: [:i | i >= 5] )

ii. Se cuenta con la clase Red, subclase de Set, que contiene un conjunto de mquinas (insa tancias de la clase Maquina). La clase Maquina tiene un mtodo de instancia recursos e que devuelve el conjunto de recursos disponibles en esa mquina (por ejemplo: imprea soras, scanners, etc.). Utilizando el mtodo selectAnd:, se pide agregar el siguiente e mtodo en la clase Red: e findRecursos: unasCondiciones donde unasCondiciones es una coleccin de bloques con un parmetro de entrada y o a que devuelven un valor booleano. El mtodo findRecursos: debe devolver todos los e recursos, sin importar a qu mquina estuvieran asociados, que cumplan con todas las e a condiciones recibidas como parmetros. a Ayudas: La clase BlockClosure tiene denido el mtodo value:, que evala el bloque receptor e u pasndole un parmetro. a a Ejemplo: [:n|n*2] value: 10 devuelve 20.
Pgina 8 de 9 a

Paradigmas de Lenguajes de Programacin o 2do Cuatrimestre de 2006

Las colecciones tienen un mtodo addAll: que recibe una coleccin y agrega todos los e o elementos de dicha coleccin a la coleccin receptora o o Ejemplo: (Set with: 7 with: 8 with: 10) addAll: #(4 5); yourself devuelve a Set(4 5 7 8 10). Tener en cuenta que addAll: devuelve como resultado la coleccin o que recibi como parmetro. o a Ejercicio 17 i. Agregar a la clase Collection un mtodo con la siguiente interfaz: e collectCond: unaCondicion ifTrue: bloque1 ifFalse: bloque2 donde unaCondicion, bloque1 y bloque2 son bloques con un parmetro de entrada a cada uno. Este mtodo tiene un comportamiento parecido a collect:, pero en lugar de e aplicar el mismo bloque de cdigo a cada elemento de la coleccin receptora del mensaje, o o aplica bloque1 a los elementos para los cuales vale unaCondicion, y bloque2 a aquellos para los que no vale. Por ejemplo, la evaluacin de la siguiente expresin: o o #(1 2 4 3) collectCond: [:i | i even] ifTrue: [:i | i+1] ifFalse: [:i | i*3] da como resultado #(3 3 5 9), porque a los elementos pares les suma 1 y a los impares los triplica. ii. Utilizando collectCond:ifTrue:ifFalse:, agregar a la clase SequenceableCollection un mtodo con la siguiente interfaz: e collect: bloque1 alt: bloque2 donde bloque1 y bloque2 son bloques con un parmetro de entrada cada uno. Esa te mtodo tiene un comportamiento parecido a collect:, pero aplica bloque1 a las e posiciones con ndice impar, y bloque2 a las posiciones con ndice par. Por ejemplo, la evaluacin de la siguiente expresin: o o #(1 2 4 3) collect: [:i | i+1] alt: [:i | i*3] devuelve #(2 6 5 9), porque a los elementos con ndice impar les suma 1 y a los de ndice par los triplica.

Pgina 9 de 9 a