Examen intermedio: 21/11/2003
A) Problema de análisis y diseño
Se pide:
B) Problemas de SMALLTALK
3 + 2 / 3 * 3 - 3 <-> 0
String with: 'abcd' at: 2 with: 'mnopq' at: 4 + 1 <-> 'bq'
| x | x:=#(2 #(4 6) 8 'abcd'). x at: 2 at: 2 + 2
A) Problema de análisis y diseño
También se puede utilizar una clase Pago, aunque no es estrictamente necesario. Igualmente, se puede sustituir la clase TipoInstalacion por dos subclases de Instalacion, denominadas Pista y Equipamiento, dando lugar a otra contestación igualmente correcta. Por último, algunos métodos pueden definirse en otra clase, como el método modifica de la clase Cliente, que se puede definir en la clase Reserva.
Transiciones:
Libre -> Ocupada mediante Instalación.ocupa(…)
Libre -> Reservada a la hora de la reserva
Ocupada -> Libre mediante Instalación.desocupa(…)
Ocupada -> Reservada mediante Instalación.desocupa(…)
Reservada -> Libre a la hora en que caduca la reserva
Reservada -> Ocupada mediante Instalación.ocupa()
También se puede incluir un diagrama de estados en la clase Reserva que incluye el si está pendiente o si se está ocupando la instalación correspondiente, junto con el si se ha pagado o no. Pero esto no es estrictamente necenecesario, pues el mecanismo de pago podría ser el mismo para las ocupaciones de instalaciones con o sin reserva y entonces quedan solamente dos estados sin ningún ciclo entre ellos, por lo que se implementa directamente mediante la llamada a un método (Instalacion.ocupa).
B) Problemas de SMALLTALK
3 + 2 / 3 * (3 - 3) <-> 0
String with: ('abcd' at: 2) with: ('mnopq' at: 4 + 1) <-> 'bq'
| x | x:=#(2 #(4 6) 8 'abcd'). ((x at: 2) at: 2) + 2 <-> 8 ^^ ^ ^
#(1 'abc' #Juan) class <-> Array
Clase True: o bien: nand: aBool nand: aBlock ^ aBool not ^ aBlock value not Clase False: nand: aBool nand: aBlock ^ true ^ trueo en la clase Boolean así:
Clase Boolean: o bien: nand: aBool nand: aBlock ^(self&aBool)not ^(self and: aBlock)not
1 2 3.1 3.2 4.1 4.2 TOTAL ----------------------------- CALIFICACION: | | | | | | | | -----------------------------
Se pide:
#include <iostream.h> class A { public: char *name; static void print() { cout << name; } void f(); }; class B : public A { public: char *type; static void print() { cout << type << " "; A::print(); } void f() { cout << " II"; } }; void main() { B b; b.name = "Queen Mary"; b.type = "Boat"; A *ap = &b; ap->print(); ap->f(); }
D *aplica(C *cp, int n)que, a partir de un array de n o más elementos de la clase C, construye otro array formado por n elementos de la clase D, que son los valores que devuelve la función:
D f(C c)al ejecutarse consecutivamente sobre los n primeros elementos del array (1.5 puntos).
collect: aBlock "Devuelve una nueva colección cuyos elementos se obtienen aplicando el bloque a cada elemento de self" "Definido en la clase Collection" | nueva | nueva := self class new. self do: [:i| nueva add: (aBlock value: i)]. ^nuevaEl método anterior no funciona para objetos descendientes de ArrayedCollection, en los que no existe add:. Para ellos hay que redefinirlo así:
collect: aBlock "Devuelve una nueva colección cuyos elementos se obtienen aplicando el bloque a cada elemento de self" "Definido en la clase ArrayedCollection" | nueva | nueva := self class new: self size. 1 to: self size do: [:i| nueva at: i put: (aBlock value: (self at: i))]. ^nueva
fibonacci "Devuelve el término self de la serie de Fibonacci" "Definido en la clase Integer" self<3 ifTrue: [^1]. ^(self-1)fibonacci+(self-2)fibonacci #(1 2 3 4 5 6 7 8 9 10) collect: [:i|i fibonacci] (utiliza el método del ejercicio anterior)
#include <iostream.h> template<class C, class D> D *aplica(C *cp, int n) { if (n<=0 || cp==NULL) return NULL; D * dp = new D[n]; for (int i = 0; i < n; i++) dp[i] = f(cp[i]); return dp; }Esa es la solución pedida. Si tenemos la siguiente función f:
float f(int i) { return float(i)/2; }la plantilla anterior se podría invocar así:
void main() { int ia[5] = { 1, 4, 9, 16, 25 }; float *fa = aplica<int, float>(ia, 5); for (int i = 0; i < 5; i++) cout << fa[i] << " "; }