Laboratorio 2: Smalltalk |
Salida: Transcript show:'hola'. Transcript cr. (Evaluate it) 5 printOn:Transcript. (Evaluate it) 3+5 (Display it) x = Prompter prompt:'mensaje' caption:'si o no' |
En el Class Browser:
-------------------------------------------------
Object subclass: #Cosa
instanceVariableNames: 'nombre '
classVariableNames: ''
poolDictionaries: ''
getNombre
^nombre
setNombre:name
nombre := name.
--------------------------------------------------
En el Workspace:
|x|
x:= Cosa new.
x setNombre:'BUBA'.
Transcript show: x getNombre.
Transcript cr.
Metodo con mas de una parametro:
Reina
genera:a y:b
uno := a.
dos := b.
Desde el workspace
r := Reina new.
r genera:8 y:7.
Invocando otros metodos de la misma clase (utilizar self)
Reina
imprime
genera
self imprime
}
Ejercicio 1: ¿ Se puede ahora modificar directamente la propiedad nombre sin utilizar el método
setNombre ? Ejercicio 2. Añadirle un metodo de inicialización a la clase Cosa. Ejercicio 3. Añadirle a Cosa una propiedad de clase patas y dos métodos de clase de get y set de acceso a la propiedad patas. Mostrar su utilización desde el Workspace: Cosa setPatas:3. Ejercicio 4. ¿ Podemos modificar la propiedad de instancia "nombre" desde el método de clase "setPatas" ? ¿ Por qué ? |
|x y|
x:= 'hola'.
x size.
x:= 25.
y := x+2
y:= Cosa new setNombre:'pepe'.
z:=y.
z setNombre:'lola'.
Transcript show: y getEdad.
y:= Cosa new setNombre:'pepe'.
z:= y copy.
z setNombre:'lola'.
Transcript show: y getEdad.
(1<2) ifTrue: [Transcript show:'MENOR']
ifFalse: [Transcript show:'MAYOR']
indice:=1.
[indice<=5] whileTrue: [
indice printOn: Transcript.
indice:= indice + 1]
5 timesRepeat:[Transcript show:'SI']
1 to: 10 do:[:i | i printOn:Transcript]
Object subclass: #Animal
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
habla
^'soy un animal'
---------
Animal subclass: #Perro
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
habla
^'soy un perro'
-----------------------------
|a g p tabla|
a := Animal new.
g := Gato new.
p := Perro new.
tabla := Array new:3.
tabla at:1 put: a.
tabla at:2 put:g.
tabla at:3 put: p.
1 to:3 do:[:i |
Transcript show: ((tabla at:i) habla).
Transcript cr.
]
Ejercicio 5: Sustituid el metodo habla de la clase Animal por un método abstracto.¿ Cambia
en algo ? Ejercicio 6. Crear una nueva clase Loro que extienda el método habla para refinarlo ("Soy un animal" "y ademas soy un loro"). Pista: Concatenar cadenas se consigue con la coma: 'hola' , 'adios' |
Referencia: http://www.wi2.uni-erlangen.de/sw/smalltalk/chap7.html
aBag := #( 1 2 3 3 3 3) asBag.
aBag size.
aBag occurrencesOf: 3.
aSet := #( 1 2 3 3 3 3 ) asSet.
aSet size.
aSet occurrencesOf: 3
|tabla|
tabla := Array new:3.
tabla at:1 put: 'uno'.
tabla at:2 put:'dos'.
tabla at:3 put:'tres'.
1 to:tabla size do:[ :c | Transcript show:(tabla at:c).
Transcript cr.].
(Evaluate it)
#(1 2 3 4) at:2
(Display it)
'epepepep' at:4
(Display it)
cars := OrderedCollection new.
cars add: 'Cadillac'
cars addFirst: 'Lexus'
cars addLast: 'Corvette'
Output: ('Lexus' 'Cadillac' 'Corvette')
(4 3 5 2 1) asSortedCollection: [:a :b | a >= b]
( 'one' 'two' 'three' )asSortedCollection: [ :x :y | x size >= y size]
aSet := #( 1 2 3 3 3 3 ) asSet.
|aDictionary|
aDictionary := Dictionary new.
aDictionary add: (Association key:'27511' value:'Cary, NC').
aDictionary at:'27511'
Recorrido de una colección: do
|tabla|
tabla := Array new:3.
tabla at:1 put: 'k'.
tabla at:2 put:'pk'.
tabla at:3 put:'tpk'.
tabla do: [:c| Transcript show:c].
Evaluación de bloque en una colección: select, reject
#(1 2 3 4 5 6 7) select: [:c | c odd]
#(1 2 3 4 5 6 7) reject: [:c | c odd]
'aeiprprpr' select: [:c| c isVowel]
'aeiprprpr' reject: [:c| c isVowel]
y:= (File find:'c:\*.*') collect: [:s | s fileName]
habla
Exception signal:'error'.
[my code]
on: Exception
do: [:ex| ex return]
[ y:= Perro new. y habla.
] on: Exception
do: [ex: | Transcript show: ex description]
Ejemplos:
y:= [Transcript show:'hola'].
y value
z:=[:x| Transcript show:x].
z value:'pepe'
Ejercicio 7. Problema del banco
Se trata de modelar el problema de un banco. El banco consta de una lista de
cuentas y una lista de clientes. De los clientes tenemos su DNI, nombre y apellidos,
dirección y telefono.
Sobre un banco podemos efectuar una revision de todas las cuentas del mismo.
En cada cuenta podemos ingresar dinero, sacar dinero, consultar saldo, cambiar
el cliente, y efectuar una revisión mensual. Todas las cuentas tienen
una comisión de 100 ptas que puede ser modificada. La revisión
mensual hace lo siguiente:
saldo = saldo + saldo* interes_de_la_cuenta -comision
Hay tres tipos de cuenta: CuentaCorriente (CC), CuentaVivienda (CV) y FondoInversion
(FI). La CuentaCorriente tiene un interes del 0.1, la CuentaVivienda de 0.2
y el FondoInversion de 0.3. De la CC no se puede sacar más dinero del
que hay, del FI se pueden sacar hasta 100.000 ptas de numeros rojos, y de la
CV no se puede sacar dinero. La revision mensual de la CV no paga comision bancaria.
La revision mensual del FI quita ademas el dinero siguiente si se esta en numeros
rojos: saldo_negativo * 0.2. Si se llega a 100.000 ptas de deuda la cuenta se
bloquea y no se puede sacar dinero de ella.
Hay que implementar el problema en Java, y crear una clase de Test que compruebe
la funcionalidad de las clases.
No es necesaria la creación de interfaz gráfica o textual.
Opcional: Incluir en el test un ejemplo de ordenación de cuentas por saldo o
titular.
Localizar los conceptos de:
Se valorará la limpieza y elegancia del codigo y APIs.