17/2/97:
A) Problemas de análisis y diseño
El editor se manejará mediante menús emergentes, por medio del ratón, y proporcionará las siguientes operaciones: crear hoja, borrar hoja, hoja siguiente, hoja anterior, crear caja, enlazar cajas, introducir texto, editar texto, seleccionar, mover, cortar, copiar y pegar, abrir diagrama y guardar diagrama. Las operaciones de cortar, copiar y pegar funcionarán a través de un "buffer". Copiar pasa la parte seleccionada de la hoja al "buffer" sin borrarla, cortar la borra. Pegar pasa el contenido del "buffer" a la hoja activa. El contenido del "buffer" se pierde con cada nueva operación de cortar o copiar. Los diagramas tendrán tamaño fijo (no habrá "zoom"). Cuando se mueve una caja, el texto que contiene se moverá con ella, y los enlaces se alargarán adecuadamente.
Se pide:

B) Problemas de SMALLTALK
a) #(1 'abc' #Juan) class
b) 'parts' at: 5 put: $y
c) |x| x:=2.(String with: $a with: $b with: $c) at: x put: $d; at: x+1
d) 'abcdebcd' indexOf: $d
e) |a| a:=Array new: 3. a at: 1 put: #(2 'abcd'). a at: 2 put: 3/4. a at: 3
put: (a at: 1). a
C) Problemas de JAVA
interface X { void m1(); }
interface Y extends X { void m2(); }
interface Z extends X { void m3(); }
y las siguientes clases JAVA: class A { void m2() {/*...*/} }
class B extends A implements Z { void m3() {/*...*/} }
class C extends A implements Y,Z { void m1() {/*...*/} }
¿Es correcta la implementación? Si no lo es, ¿qué se podría hacer para corregirla sin modificar la interfaz y con el número mínimo de cambios? (1 punto).
class A {
public String str = "AString";
public void show() {
System.out.println("A.show: "+str);
}
}
class B extends A {
public String str = "BString";
public void show() {
super.show();
System.out.println("B.show: "+str);
}
public static void main(String[] args) {
A a = new A();
B b = new B();
A c = new B();
B d = new A();
a.show();
b.show();
c.show();
}
}
Si el programa tiene algún error, corregirlo. En cualquier caso, escribir el resultado de su ejecución (1 punto).
D) Problemas de C++
Se supondrá que hay memoria suficiente para todo (no preocuparse de los fallos de memoria).
Añadir un programa principal que genere el árbol binario de enteros:
10
/ \
5 15
/
12
Se programará de tal manera, que la impresión de ese árbol genere el siguiente resultado:
<5^10><12^15^
Escenario:
Entrada -----> T+=Entrada ---
| ^ |
| | |---> T/N --> Media
--> N++ ---------- ^
^ | |
| | |
v v |
Memoria: N T |
^ ^ |
| | |
v | |
--> N=0 ---------- |
| | |---> 0 ------
| v |
Reset -------> T=0 ----------
a) Array b) Error c) $c d) 4 e) ((2 'abcd') (3/4) (2 'abcd'))
factorial
"Calcula el factorial de self"
self>1 ifTrue: [^(self-1) factorial*self].
self<0 ifTrue: [^self error: 'factorial negativo'].
^1
A.show: AString A.show: AString B.show: BString A.show: AString B.show: BString
#include <stdlib.h>
#include <iostream.h>
template <class T> class BTree {
T elem;
BTree *left, *right;
public:
BTree (T first) {
elem = first;
left = right = NULL;
}
~BTree () {
if (left) delete left;
if (right) delete right;
}
void add(T next);
void print();
}
template <class T> void BTree<T>::add(T next) {
if (next<elem) {
if (left) left->add(next);
else left = new BTree (next);
}
if (next>elem) {
if (right) right->add(next);
else right = new BTree (next);
}
}
template <class T> void BTree<T>::print() {
if (left) {
cout << "<";
left->print();
cout << "^";
}
cout << elem;
if (right) {
cout << ">";
right->print();
cout << "^";
}
}
void main () {
BTree<short> ss(10);
ss.add(5);
ss.add(15);
ss.add(12);
ss.print();
}