Práctica 6 (pre 2010, Paradigmas)

De Cuba-Wiki
Saltar a: navegación, buscar
Back.png Volver a la página de la materia

Ejercicio 01[editar]

¿Que 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
  • i. 1
  • ii. SmallInteger
  • iii. 2
  • iv. SmallInteger
  • v. 'hola, mundo'
  • vi. ByteString
  • vii. #(7 6 5)
  • viii. Array
  • ix. 7
  • x. SmallInteger
  • xi. ByteString
  • xii. Float
  • xiii. Character

Ejercicio 02[editar]

¿Que responde Smalltalk cuando se le pide evaluar las siguientes expresiones? Al evaluar una expresion, tener en cuenta el ambiente producido por las evaluaciones previas. Las variables en mayusculas representan variables globales.

  • i. z := 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)
  • xiv. |n m| n := 4. m := 1. ^(n+m+X+Y). 4
  • i. 2
  • ii. 2
  • iii. 3
  • iv. Error
  • v. nil
  • vi. Error
  • vii. #(2 3 4)
  • viii. 2
  • ix. 3
  • x. 4
  • xi. Variable no declarada
  • xii. Error
  • xiii. 11
  • xiv. Error

Ejercicio 03[editar]

Idem ejercicio anterior, suponiendo que se ha salvado la imagen producida por el.

  • 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]]
  • i. [X. Y]
  • ii. BlockClosure
  • iii. 3
  • iv. Duplicar := [:n | 2*n]
  • v. Error
  • vi. 10
  • vii. 4
  • viii. nil
  • ix. 0
  • x. nil
  • xi. 15
  • xii. #(1 2 3 4 5 6 7)
  • xiii. 43
  • xiv. #(2 3)
  • xv. #(1 2 3 4 5 7)
  • xvi. #(47 48 49 50 51 52 53)
  • xvii. ?
  • xviii. ?
  • xix. nil

Ejercicio 04[editar]

Implementar los siguientes metodos:

  • i. to: do: usando el m´etodo whileTrue:.
  • ii. do: para la clase Array usando whileFalse:.
  • iii. reject: usando select: y not.


ToDo:=[ :i :f :b | |c| c:=i. [c<f] whileTrue: [b value: c. c:=c+1] ]
Do:=[ :a :b | |c| c:= 1. [c>a size] whileFalse: [b value: (a at: c). c:=c+1] ]
Reject:=[ :a :b | a select: [:e | (b value: e) not ] ]

Ejercicio 05[editar]

Ejercicio 06[editar]

Ejercicio 07[editar]

Ejercicio 08[editar]

Ejercicio 09[editar]

Ejercicio 10[editar]

Ejercicio 11[editar]

Ejercicio 12[editar]

Ejercicio 13[editar]

Item i[editar]

En Smalltalk, agregar a la clase Collection un m´etodo con la siguiente interfaz: collectCircular: unosBloques, donde unosBloques es una coleccion secuencial de bloques de codigo (es decir, instancias de la clase BlockClosure) con un parametro de entrada cada uno. A diferencia del metodo collect:, este metodo aplica a cada elemento de la coleccion receptora del mensaje un bloque de codigo perteneciente a unosBloques. El orden de aplicacion de los bloques debe ser circular, comenzando con el primero y aplicando uno por vez. La coleccion unosBloques no debe ser modificada por el metodo.

Por ejemplo, la evaluacion de la siguiente expresion: #(1 2 4 3) collectCircular: (Array with: ([:i | i * 2]) with: ([:i | i + 1]) with: ([:i | ‘hola’])) da como resultado: #(2 3 ‘hola’ 6).

Respuesta:

Ejecutar el browser con F5 sobre el launcher, ir a la clase Collection, y agregar el metodo collectCircular con la siguiente definicion.

collectCircular: unosBloques
  "Collect circular sobre una lista de bloques recibida como parametro"

	| count cantBloques |
	count := 1.
	cantBloques := unosBloques size.
	^self collect: 
		[:elem |
			|currentBlock|
			currentBlock := unosBloques at: count.
			(count = cantBloques) ifTrue: [count := 1.] ifFalse: [count := count + 1.].
			currentBlock value: elem.
		]


Item ii[editar]

Se cuenta con la clase Mazo, subclase de OrderedCollection, que contiene una secuencia de cartas. Tambien esta disponible la clase Jugador, que posee un metodo de instancia tomarCarta:, que recibe una carta y la agrega a la mano del jugador. Utilizando el metodo collectCircular:, definido en el item anterior, se pide definir el siguiente metodo en la clase Mazo:

repartir: unosJugadores

donde unosJugadores es una coleccion secuencial de objetos de tipo Jugador. El metodo repartir debe repartir las cartas del mazo entre los jugadores lo mas equitativamente posible. Esto significa que si la cantidad de cartas es multiplo de la cantidad de jugadores, todos los jugadores terminaran con la misma cantidad de cartas, y en caso contrario un subconjunto de los jugadores se quedara con una carta menos. Deben repartirse todas las cartas del mazo, y el mazo debe quedar vacıo luego de invocar a repartir:. El metodo devuelve nil.


Respuesta:

Clase Mazo:

 initialize
 	cartas := Set new.
 	^self
 recibirCartas: unasCartas
 	cartas addAll: unasCartas.
 	^self.
 repartirCartas: unosJugadores
 	| listaDeBloques |
 	listaDeBloques := unosJugadores collect: [:j | [:c | j recibirCarta: c]].
 	cartas collectCircular: listaDeBloques.
 	self removeAll.
 	^self.

Clase Jugador:

 initialize
 	cartas := Set new.
 	^self
 cartas
 	^cartas.
 recibirCarta: unaCarta
 	cartas add: unaCarta.
 	^self.

Ejercicio 14[editar]

Ejercicio 15[editar]

i. En Smalltalk, agregar a la clase Collection un metodo con la siguiente interfaz:

 inject: primerValor and: segundoValor into: operacion

donde operacion es un bloque de codigo de tres argumentos que se evalua una vez por cada elemento del receptor, con dicho elemento como tercer argumento. En la n-esima evaluacion, el primer y segundo argumento de operacion corresponden al resultado de la evaluacion n-1 y n-2 respectivamente. La primera evaluacion comienza evaluando operacion, con primerValor como primer argumento, segundoValor como segundo argumento, y el primer elemento del receptor como tercer argumento. La segunda evaluacion toma el segundoValor como primer argumento y el resultado de la primera evaluacion como segundo argumento. El metodo debe devolver la ultima evaluacion de operacion. El orden de recorrido de los elementos es el dado por el do. Por ejemplo, la evaluacion de la siguiente expresion:

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

da como resultado: 'abcbabcde' (el resultado es cada iteracion seria: 1)'abc', 2)'babcd' y 3)'abcbabcde').

Respuesta:

 inject: primerValor and: segundoValor into: operacion
 	
 	| val1 val2 val3 res |
 	val1 := primerValor.
 	val2 := segundoValor.
 	self
 		do:
 			[:e | 
 			val3 := e.
 			res := operacion value: val1 value: val2 value: val3.
 			val1 := val2.
 			val2 := res].
 	^res

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

 inject: valor into: operacion

de forma tal que se comporte exactamente como la version original.

Respuesta:

 inject2: casoBase into: operacion
 	^self inject: casoBase and: casoBase into: [ :val1 :val2 :val3 | operacion value: val2 value: val3].

Ejercicio 16[editar]

i. En Smalltalk, agregar a la clase Collection un metodo con la siguiente interfaz:

 selectAnd: unasCondiciones

donde unasCondiciones es una coleccion de bloques de codigo (es decir, instancias de la clase BlockClosure) con un parametro de entrada cada uno y que devuelven un valor booleano. A diferencia del metodo select: basico, este metodo requiere que todas las condiciones sean verdaderas para incluir un elemento de la coleccion receptora en la coleccion resultado. Por ejemplo, la evaluacion de la siguiente expresion:

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

devuelve #(5 7).

Respuesta:

 selectAnd: unasCondiciones
 	^self select: [:e | unasCondiciones allSatisfy: [:c | c value: e]].

ii. Se cuenta con la clase Red, subclase de Set, que contiene un conjunto de maquinas (instancias de la clase Maquina). La clase Maquina tiene un metodo de instancia recursos que devuelve el conjunto de recursos disponibles en esa maquina (por ejemplo: impresoras, scanners, etc.). Utilizando el metodo selectAnd:, se pide agregar el siguiente metodo en la clase Red:

 findRecursos: unasCondiciones

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

Ejercicio 17[editar]

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 parametro de entrada cada uno. Este metodo tiene un comportamiento parecido a collect:, pero en lugar de aplicar el mismo bloque de codigo a cada elemento de la coleccion 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 evaluacion de la siguiente expresion:

 #(1 2 4 3) collectCond: [:i | i even] ifTrue: [:i | i+1] ifFalse: [:i | i*3]

devuelve #(3 3 5 9), porque suma 1 a los elementos pares y triplica los impares.

Respuesta:

 collectCond: unaCondicion ifTrue: bloque1 ifFalse: bloque2
 	
 	^self
 		collect:
 			[:e | 
 			(unaCondicion value: e)
 				ifTrue: [bloque1 value: e]
 				ifFalse: [bloque2 value: e]]

ii. Utilizando collectCond:ifTrue:ifFalse:, agregar a la clase SequenceableCollection un metodo con la siguiente interfaz:

 collect: bloque1 alt: bloque2

donde bloque1 y bloque2 son bloques con un par´ametro de entrada cada uno. Este metodo tiene un comportamiento parecido a collect:, pero aplica bloque1 a las posiciones con indice impar, y bloque2 a las posiciones con indice par. Por ejemplo, la evaluacion de la siguiente expresion:

 #(1 2 4 3) collect: [:i | i+1] alt: [:i | i*3]

devuelve #(2 6 5 9), porque a los elementos con indice impar les suma 1 y a los de indice par los triplica.

Respuesta:

 collect: bloque1 alt: bloque2
 	
 	| posicion |
 	posicion := 0.
 	^self
 		collectCond:
 			[:e | 
 			posicion := posicion + 1.
 			(posicion \\ 2) ~= 0]
 		ifTrue: bloque1
 		ifFalse: bloque2