• No se han encontrado resultados

Ejercicio 1 Qué responde Smalltalk cuando se le pide evaluar las siguientes expresiones?

N/A
N/A
Protected

Academic year: 2021

Share "Ejercicio 1 Qué responde Smalltalk cuando se le pide evaluar las siguientes expresiones?"

Copied!
8
0
0

Texto completo

(1)

Pr´ actica N

o

6 - Smalltalk

Para resolver esta pr´ actica, recomendamos usar el entorno “VisualWorks”, de distribuci´ on gratuita, que puede bajarse del sitio web de la materia bajo la secci´ on Links.

Ejercicios introductorios

Ejercicio 1

¿Qu´ e responde Smalltalk cuando se le pide evaluar las siguientes expresiones?

i. 1

ii. 1 class iii. (1+1)

iv. (1+1) class v. ’hola, mundo’

vi. ’hola, mundo’ class vii. #(7 6 5)

viii. #(7 6 5) class ix. #(7 6 5) at: 1

x. (#(7 ’perro’ 5.24 $a) at:1) class xi. (#(7 ’perro’ 5.24 $a) at:2) class xii. (#(7 ’perro’ 5.24 $a) at:3) class xiii. (#(7 ’perro’ 5.24 $a) at:4) class Ejercicio 2

¿Qu´ e responde Smalltalk cuando se le pide evaluar las siguientes expresiones? Al evaluar una expresi´ on, tener en cuenta el ambiente producido por las evaluaciones previas. Las variables en may´ usculas representan variables globales.

i. x := 2 ii. X := 2 iii. X := X+1

iv. Y := Y+1 v. Y

vi. Y := (2 3 4) vii. Y := #(2 3 4) viii. Y at :1

ix. Y := Y at :2 x. |n| n := 4 xi. n

xii. |n| n := n+1

xiii. |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 ´ el.

(2)

i. [X. Y]

ii. [X. Y] class iii. [X. Y] value

iv. Duplicar := [:n | 2*n]

v. Duplicar value vi. Duplicar value:5

vii. (’Objeto’ at:2) isVowel ifTrue: [2. 3] ifFalse: [3. 4]

viii. [X>0] whileTrue: [X := X - 1]

ix. X

x. 5 timesRepeat: [X := X + Y]

xi. X

xii. A := Array new. A := #(1 2 3 4 5 6 7) xiii. A do: [:n | X := X + n]. ^X

xiv. A select: [:i | i factorial < (i*i)]

xv. A reject: [:i | (i even) & (i>4)]

xvi. A collect: [:i | X + Y + i]

xvii. 2 to:5 do:[:i | A at:i put:2*i]

xviii. A

xix. [X<10] whileTrue: [X:=X+1. X==5 ifTrue: [^X]]

Dise˜ no de Clases y Manejo de Colecciones

Ejercicio 4

Implementar los siguientes m´ etodos:

i. to: do: usando el m´ etodo whileTrue:.

ii. do: para la clase Array usando whileFalse:.

iii. reject: usando select: y not.

Ejercicio 5

Considerar el m´ etodo de instancia verificar:aPartirDe:, implementado en la clase SequenceableCollection (superclase de las clases String y Array entre otras).

Tener en cuenta que s´ olo la clase String posee un m´ etodo de instancia asUpperCase cuyo efecto es cambiar las min´ usculas del objeto receptor por las may´ usculas correspondientes.

El m´ etodo at: se encuentra implementado en la clase Object, superclase de Collection, 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.

(3)

(posPatron > patron size) ifTrue: [^true].

(posCadena > self size) ifTrue: [^false].

].

^false.

i. ¿Cu´ al es el efecto del mensaje verificar:aPartirDe: cuando es enviado con par´ ame- tros adecuados a un objeto adecuado?

ii. ¿Cu´ al es el resultado de las siguientes evaluaciones?

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 modifica el m´ etodo verificar:aPartirDe: cambiando la quinta l´ınea por:

cadenaChar := self asUpperCase at: posCadena.

¿cu´ ales son los resultados de las evaluaciones del ´ıtem anterior?

Ejercicio 6

Agregar un m´ etodo a la clase Number que represente la estructura de control “for”. El m´ etodo debe poseer la siguiente interfaz:

valor inicial to: condici´ on step: incremento body: cuerpo

Donde valor inicial es una instancia cualquiera de Number, condici´ on es un bloque de c´ odigo de un argumento que devuelve true o false, incremento es un bloque de c´ odigo de un argumento que devuelve un valor, y cuerpo es un bloque de c´ odigo de un argumento.

La expresi´ on debe devolver nil.

Por ejemplo, la siguiente expresi´ on imprime 1234 y eval´ ua a nil:

1 to: [:i | i < 5] step: [:i | i + 1] body: [:i | Transcript show: i printString]

Ejercicio 7

Definir una clase Complex que implemente la clase de los n´ umeros complejos. Definir los siguientes m´ etodos:

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 n´ umeros complejos.

iv. abs, que devuelva el valor absoluto del objeto receptor.

v. + (infijo), que devuelva la suma compleja de sus dos argumentos.

vi. printOn: para mostrar complejos de modo adecuado. Sugerencia: ver c´ omo est´ a imple-

mentado el m´ etodo con el mismo nombre en la clase predefinida Fraction.

(4)

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 m´ etodos a y b definidos as´ı:

Class: Uno Methods: a b

^2. ^self a.

Class: Dos Methods: a b

^8. ^super b.

Class: Tres Methods: a b

^super b. ^super a.

Sean uno, dos y tres instancias de las clases Uno, Dos y Tres respectivamente. ¿Cu´ ales son los resultados de las siguientes evaluaciones?

i. uno a ii. uno b iii. dos a iv. dos b v. tres a vi. tres b Ejercicio 9

Se tienen definidas en Smalltalk las clases A, B y C. Todos los m´ etodos presentados son de instancia, con excepci´ on del m´ etodo new de la clase C, que es un m´ etodo de clase.

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´ e mensajes se imprimen en el Transcript, si dentro de una ventana de Workspace se

eval´ uan las siguientes expresiones?

(5)

i. b := B new.

b hacerAlgo.

ii. c := C new.

c 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 relaci´ on de herencia entre ellas cuatro. ¿C´ omo debe hacerse para conseguir que valga lo 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 m´ etodos de instancia para asignar y obtener los valores.

La clase A tiene 2 m´ etodos de instancia:

imprimir

self calcular.

calcular

^((self geta) + 1).

La clase B tiene 2 m´ etodos de instancia:

imprimir

|b|

b:=self calcular.

super imprimir.

calcular

^((self getb) * 2).

Dado el siguiente c´ odigo:

|a b|

a:= A new. b:= B new.

a seta:2.

b seta:3. b setb:4.

a imprimir.

b imprimir.

Describa brevemente la ejecuci´ on. ¿Qu´ e se devuelve? Describa el contenido de las variables

de instancia de cada objeto, al finalizar la ejecuci´ on.

(6)

Ejercicios de Parcial

Ejercicio 12

i. En Smalltalk, agregar a la clase Collection un m´ etodo con la siguiente interfaz:

collectCircular: unosBloques

donde unosBloques es una colecci´ on secuencial de bloques de c´ odigo (es decir, instancias de la clase BlockClosure) con un par´ ametro de entrada cada uno. A diferencia del m´ etodo collect:, este m´ etodo aplica a cada elemento de la colecci´ on receptora del mensaje un bloque de c´ odigo perteneciente a unosBloques. El orden de aplicaci´ on de los bloques debe ser circular, comenzando con el primero y aplicando uno por vez. La colecci´ on unosBloques no debe ser modificada por el m´ etodo.

Por ejemplo, la evaluaci´ on de la siguiente expresi´ on:

#(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. Tambi´ en est´ a disponible la clase Jugador, que posee un m´ etodo de instancia tomarCarta:, que recibe una carta y la agrega a la mano del jugador. Utilizando el m´ etodo collectCircular:, definido en el item anterior, se pide definir el siguiente m´ etodo en la clase Mazo:

repartir: unosJugadores

donde unosJugadores es una colecci´ on secuencial de objetos de tipo Jugador. El m´ etodo repartir debe repartir las cartas del mazo entre los jugadores lo m´ as equitativamente posible. Esto significa que si la cantidad de cartas es m´ ultiplo de la cantidad de jugadores, todos los jugadores terminar´ an con la misma cantidad de cartas, y en caso contrario un subconjunto de los jugadores se quedar´ a con una carta menos. Deben repartirse todas las cartas del mazo, y el mazo debe quedar vac´ıo luego de invocar a repartir:. El m´ etodo devuelve nil.

Ayudas:

La clase BlockClosure tiene definido el m´ etodo value:, que eval´ ua el bloque receptor pas´ andole un par´ ametro.

Ejemplo: [:n|n*2] value: 10 devuelve 20.

Las colecciones secuenciales (subclases de SequenceableCollection) tiene definido el m´ etodo at:, cuyo ´ unico par´ ametro es un ´ındice y devuelve el elemento cuyo ´ındice es el especificado.

Ejemplo: #(7 8 10 9) at: 3 devuelve 10.

Asumir que la clase Mazo posee el m´ etodo removeAll que elimina todos las cartas del mazo receptor.

Ejercicio 13

(7)

i. En Smalltalk, agregar a la clase Collection un m´ etodo con la siguiente interfaz:

inject: primerValor and: segundoValor into: operacion

donde operacion es un bloque de c´ odigo de tres argumentos que se eval´ ua una vez por cada elemento del receptor, con dicho elemento como tercer argumento. En la n-´ esima evaluaci´ on, el primer y segundo argumento de operacion corresponden al resultado de la evaluaci´ on n-1 y n-2 respectivamente. La primera evaluaci´ on comienza evaluando operacion, con primerValor como primer argumento, segundoValor como segundo argumento, y el primer elemento del receptor como tercer argumento. La segunda eva- luaci´ on toma el segundoValor como primer argumento y el resultado de la primera evaluaci´ on como segundo argumento. El m´ etodo debe devolver la ´ ultima evaluaci´ on de operacion. El orden de recorrido de los elementos es el dado por el do:.

Por ejemplo, la evaluaci´ on de la siguiente expresi´ on:

#(’c’ ’d’ ’e’) inject: ’a’ and: ’b’ into: [:a :b :c | a, b, c]

da como resultado: ’abcbabcde’ (el resultado es cada iteracion ser´ıa: 1)’abc’, 2)’babcd’

y 3)’abcbabcde’)

ii. Utilizando inject:and:into:, definido en el item anterior, se pide redefinir el m´ etodo usual de Collection:

inject: valor into: operacion

de forma tal que se comporte exactamente como la versi´ on original de inject:into:.

Ayudas:

La clase BlockClosure tiene definido el m´ etodo value:, que eval´ ua el bloque recep- tor pas´ andole un par´ ametro. Tambi´ en est´ an disponibles en la misma clase los m´ etodos value:value: y value:value:value: para bloques de dos y tres argumentos respecti- vamente.

Ejemplo: [:n|n*2] value: 10 devuelve 20.

Ejercicio 14

i. En Smalltalk, agregar a la clase Collection un m´ etodo con la siguiente interfaz:

selectAnd: unasCondiciones

donde unasCondiciones es una colecci´ on de bloques de c´ odigo (es decir, instancias de la clase BlockClosure) con un par´ ametro de entrada cada uno y que devuelven un valor booleano. A diferencia del m´ etodo select: b´ asico, este m´ etodo requiere que todas las condiciones sean verdaderas para incluir un elemento de la colecci´ on receptora en la colecci´ on resultado.

Por ejemplo, la evaluaci´ on de la siguiente expresi´ on:

#(1 5 2 4 7 3 6) selectAnd: (Array with: [:i | i odd] with: [:i | i >= 5] ) devuelve #(5 7)

ii. Se cuenta con la clase Red, subclase de Set, que contiene un conjunto de m´ aquinas (ins-

tancias de la clase Maquina). La clase Maquina tiene un m´ etodo de instancia recursos

que devuelve el conjunto de recursos disponibles en esa m´ aquina (por ejemplo: impre-

soras, scanners, etc.). Utilizando el m´ etodo selectAnd:, se pide agregar el siguiente

m´ etodo en la clase Red:

(8)

findRecursos: unasCondiciones

donde unasCondiciones es una colecci´ on de bloques con un par´ ametro de entrada y que devuelven un valor booleano. El m´ etodo findRecursos: debe devolver todos los recursos, sin importar a qu´ e m´ aquina estuvieran asociados, que cumplan con todas las condiciones recibidas como par´ ametros.

Ayudas:

La clase BlockClosure tiene definido el m´ etodo value:, que eval´ ua el bloque receptor pas´ andole un par´ ametro.

Ejemplo: [:n|n*2] value: 10 devuelve 20.

Las colecciones tienen un m´ etodo addAll: que recibe una colecci´ on y agrega todos los elementos de dicha colecci´ on a la colecci´ on receptora

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 colecci´ on que recibi´ o como par´ ametro.

Ejercicio 15

i. Agregar a la clase Collection un m´ etodo con la siguiente interfaz:

collectCond: unaCondicion ifTrue: bloque1 ifFalse: bloque2

donde unaCondicion, bloque1 y bloque2 son bloques con un par´ ametro de entrada cada uno. Este m´ etodo tiene un comportamiento parecido a collect:, pero en lugar de aplicar el mismo bloque de c´ odigo a cada elemento de la colecci´ on receptora del mensaje, aplica bloque1 a los elementos para los cuales vale unaCondicion, y bloque2 a aquellos para los que no vale.

Por ejemplo, la evaluaci´ on de la siguiente expresi´ on:

#(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 m´ etodo con la siguiente interfaz:

collect: bloque1 alt: bloque2

donde bloque1 y bloque2 son bloques con un par´ ametro de entrada cada uno. Es- te m´ etodo tiene un comportamiento parecido a collect:, pero aplica bloque1 a las posiciones con ´ındice impar, y bloque2 a las posiciones con ´ındice par.

Por ejemplo, la evaluaci´ on de la siguiente expresi´ on:

#(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.

Referencias

Documento similar

N° Muestra Paleon.. BLOQUE: ¡NOMBRE:..

1 BLOQUE : NOMBRE: N°- MILITAR ZS- fó N°GEOG.: á�Q.. EMPRESA : ESPECIALISTA: Lorecj

La categoría de los entrelazados no orientados es la categoría donde los objetos son números enteros no negativos, y un morfismo m → n entre los objetos m y n (m, n ∈ Z + ∪ {0})

Pero cuando vio a Mar sacar el fuego de bajo su ala, voló de vuelta a su tribu a contarles lo que había visto.... Justo antes de que el sol saliera, Tatkanna se despertó y comenzó

8 Satisfaction is balanced between what is needed (minimal satisfaction state) and what is expected (maximum satisfaction), with an inferior state of dis-satisfaction when

margin: Este par´ ametro, definido en [Driedger et al., 2014], nos permite obtener, adem´ as de las componentes arm´ onicas y percusivas, una componente residual para los sonidos que

Si N es distinto de cero, por el BDAT se reciben tantas A’s y B’s como indique N, para realizar la operación de la ecuación (1) colocando el resultado final en R. Se pide:. a)

De esta manera, ocupar, resistir y subvertir puede oponerse al afrojuvenicidio, que impregna, sobre todo, los barrios más vulnerables, co-construir afrojuvenicidio, la apuesta