Lenguajes de Programación I
Parcial 2023
Ejercicio 4
Programa | Salidas | |||||
S1 | S2 | S3 | ||||
1 2 3 4 5 6 7 8 9 | clase Clase { estatic ent n=0 ent x Clase s1 Clase s2 Clase() { x=++n }; }; | 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | clase garbage { func main() { Clase c1 = nuevo Clase() imprimir(c1,c1.x) Clase c2 c1 = nuevo Clase() imprimir(c1,c1.x) c1.s1 = nuevo Clase() imprimir(c1.s1,c1.s1.x) c1.s2 = nuevo Clase() imprimir(c1.s2,c1.s2.x) c1.s1.s1 = nuevo Clase() imprimir(c1.s1.s1,c1.s1.s1.x) c1.s1.s2 = nuevo Clase() imprimir(c1.s1.s2,c1.s1.s2.x) c1.s2 = c1.s1.s1 imprimir(c1.s2,c1.s2.x) c2 = c1.s2 imprimir(c2,c2.x) c1.s2 = c2 imprimir(c1.s2,c1.s2.x) c1.s1.s1 = c1.s2 imprimir(c1.s1.s1,c1.s1.s1.x) c2 = c1 imprimir(c2,c2.x) c1.s1 = c1 imprimir(c1.s1,c1.s1.x) } } | 1000,1 2000,2 3000,3 4000,4 5000,5 6000,6 5000,5 5000,5 5000,5 5000,5 2000,2 2000,2 | 1000,1 2000,2 3000,3 4000,4 5000,5 6000,6 1000,1 2000,2 2000,2 3000,3 3000,3 3000,3 | 1000,0 2000,1 3000,2 4000,3 5000,4 5000,4 5000,4 5000,4 5000,4 5000,4 5000,4 5000,4 |
Nota: seguir el esquema del ejemplo y realizar no menos de 3 gráficos
n
c1
c2
n
0, 1
c1
c2
12. Clase c1 = nuevo Clase()
x=1
s2
s1
1000
12
n
0, 1
c1
c2
imprimir(c1,c1.x)
x=1
s2
s1
1000
12
n
0, 1
c1
c2
imprimir(c1,c1.x) “1000, 1”
x=1
s2
s1
1000
12
n
0, 1, 2
c1
c2
14 Clase c2
15 c1 = nuevo Clase()
x=2
s2
s1
2000
15
“1000, 1”
x=1
s2
s1
1000
G
n
0, 1, 2
c1
c2
16 imprimir(c1,c1.x)
17 c1.s1 = nuevo Clase()
18 imprimir(c1.s1,c1.s1.x)
x=2
s2
s1
2000
15
“1000, 1”
“2000,2”
x=1
s2
s1
1000
G
n
0, 1, 2, 3
c1
c2
16 imprimir(c1,c1.x)
17 c1.s1 = nuevo Clase()
18 imprimir(c1.s1,c1.s1.x)
x=2
s2
s1
2000
15
“1000, 1”
“2000,2”
x=1
s2
s1
1000
G
x=3
s2
s1
3000
17
n
0, 1, 2, 3
c1
c2
16 imprimir(c1,c1.x)
17 c1.s1 = nuevo Clase()
18 imprimir(c1.s1,c1.s1.x)
x=2
s2
s1
2000
15
“1000, 1”
“2000,2”
“3000,3”
x=1
s2
s1
1000
G
x=3
s2
s1
3000
17
n
0, 1, 2, 3, 4
c1
c2
19 c1.s2 = nuevo Clase()
20 imprimir(c1.s2,c1.s2.x)
21 c1.s1.s1 = nuevo Clase()
22 imprimir(c1.s1.s1,c1.s1.s1.x)
x=2
s2
s1
2000
15
“1000, 1”
“2000,2”
“3000,3”
x=1
s2
s1
1000
G
x=3
s2
s1
3000
17
x=4
s2
s1
4000
19
n
0, 1, 2, 3, 4
c1
c2
19 c1.s2 = nuevo Clase()
20 imprimir(c1.s2,c1.s2.x)
21 c1.s1.s1 = nuevo Clase()
22 imprimir(c1.s1.s1,c1.s1.s1.x)
x=2
s2
s1
2000
15
“1000, 1”
“2000,2”
“3000,3”
“4000,4”
x=1
s2
s1
1000
G
x=3
s2
s1
3000
17
x=4
s2
s1
4000
19
n
0, 1, 2, 3, 4, 5
c1
c2
19 c1.s2 = nuevo Clase()
20 imprimir(c1.s2,c1.s2.x)
21 c1.s1.s1 = nuevo Clase()
22 imprimir(c1.s1.s1,c1.s1.s1.x)
x=2
s2
s1
2000
15
“1000, 1”
“2000,2”
“3000,3”
“4000,4”
x=1
s2
s1
1000
G
x=3
s2
s1
3000
17
x=5
s2
s1
x=4
s2
s1
4000
19
21
5000
n
0, 1, 2, 3, 4, 5
c1
c2
19 c1.s2 = nuevo Clase()
20 imprimir(c1.s2,c1.s2.x)
21 c1.s1.s1 = nuevo Clase()
22 imprimir(c1.s1.s1,c1.s1.s1.x)
x=2
s2
s1
2000
15
“1000, 1”
“2000,2”
“3000,3”
“4000,4”
“5000,5”
x=1
s2
s1
1000
G
x=3
s2
s1
3000
17
x=5
s2
s1
x=4
s2
s1
4000
19
21
5000
n
0, 1, 2, 3, 4, 5, 6
c1
c2
23 c1.s1.s2 = nuevo Clase()
24 imprimir(c1.s1.s2,c1.s1.s2.x)
x=2
s2
s1
2000
15
“1000, 1”
“2000,2”
“3000,3”
“4000,4”
“5000,5”
x=1
s2
s1
1000
G
x=3
s2
s1
3000
17
x=6
s2
s1
6000
23
x=5
s2
s1
x=4
s2
s1
4000
19
21
5000
n
0, 1, 2, 3, 4, 5, 6
c1
c2
23 c1.s1.s2 = nuevo Clase()
24 imprimir(c1.s1.s2,c1.s1.s2.x)
x=2
s2
s1
2000
15
“1000, 1”
“2000,2”
“3000,3”
“4000,4”
“5000,5”
“6000,6”
x=1
s2
s1
1000
G
x=3
s2
s1
3000
17
x=6
s2
s1
6000
23
x=5
s2
s1
x=4
s2
s1
4000
19
21
5000
n
0, 1, 2, 3, 4, 5, 6
c1
c2
25 c1.s2 = c1.s1.s1
26 imprimir(c1.s2,c1.s2.x)
x=2
s2
s1
2000
15
“1000, 1”
“2000,2”
“3000,3”
“4000,4”
“5000,5”
“6000,6”
x=1
s2
s1
1000
G
x=3
s2
s1
3000
17
x=6
s2
s1
6000
23
x=5
s2
s1
x=4
s2
s1
4000
21
5000
G
25
n
0, 1, 2, 3, 4, 5, 6
c1
c2
25 c1.s2 = c1.s1.s1
26 imprimir(c1.s2,c1.s2.x)
x=2
s2
s1
2000
15
“1000, 1”
“2000,2”
“3000,3”
“4000,4”
“5000,5”
“6000,6”
“5000,5”
x=1
s2
s1
1000
G
x=3
s2
s1
3000
17
x=6
s2
s1
6000
23
x=5
s2
s1
x=4
s2
s1
4000
21
5000
G
25
n
0, 1, 2, 3, 4, 5, 6
c1
c2
27 c2 = c1.s2
28 imprimir(c2,c2.x)
x=2
s2
s1
2000
15
“1000, 1”
“2000,2”
“3000,3”
“4000,4”
“5000,5”
“6000,6”
“5000,5”
x=1
s2
s1
1000
G
x=3
s2
s1
3000
17
x=6
s2
s1
6000
23
x=5
s2
s1
x=4
s2
s1
4000
21
5000
G
25
27
n
0, 1, 2, 3, 4, 5, 6
c1
c2
27 c2 = c1.s2
28 imprimir(c2,c2.x)
x=2
s2
s1
2000
15
“1000, 1”
“2000,2”
“3000,3”
“4000,4”
“5000,5”
“6000,6”
“5000,5”
“5000,5”
x=1
s2
s1
1000
G
x=3
s2
s1
3000
17
x=6
s2
s1
6000
23
x=5
s2
s1
x=4
s2
s1
4000
21
5000
G
25
27
n
0, 1, 2, 3, 4, 5, 6
c1
c2
29 c1.s2 = c2
30 imprimir(c1.s2,c1.s2.x)
x=2
s2
s1
2000
15
“1000, 1”
“2000,2”
“3000,3”
“4000,4”
“5000,5”
“6000,6”
“5000,5”
“5000,5”
x=1
s2
s1
1000
G
x=3
s2
s1
3000
17
x=6
s2
s1
6000
23
x=5
s2
s1
x=4
s2
s1
4000
21
5000
G
25 29
27
n
0, 1, 2, 3, 4, 5, 6
c1
c2
29 c1.s2 = c2
30 imprimir(c1.s2,c1.s2.x)
x=2
s2
s1
2000
15
“1000, 1”
“2000,2”
“3000,3”
“4000,4”
“5000,5”
“6000,6”
“5000,5”
“5000,5”
“5000,5”
x=1
s2
s1
1000
G
x=3
s2
s1
3000
17
x=6
s2
s1
6000
23
x=5
s2
s1
x=4
s2
s1
4000
21
5000
G
29
27
n
0, 1, 2, 3, 4, 5, 6
c1
c2
31 c1.s1.s1 = c1.s2
32 imprimir(c1.s1.s1,c1.s1.s1.x)
x=2
s2
s1
2000
15
“1000, 1”
“2000,2”
“3000,3”
“4000,4”
“5000,5”
“6000,6”
“5000,5”
“5000,5”
“5000,5”
x=1
s2
s1
1000
G
x=3
s2
s1
3000
17
x=6
s2
s1
6000
23
x=5
s2
s1
x=4
s2
s1
4000
21 31
5000
G
29
27
n
0, 1, 2, 3, 4, 5, 6
c1
c2
31 c1.s1.s1 = c1.s2
32 imprimir(c1.s1.s1,c1.s1.s1.x)
x=2
s2
s1
2000
15
“1000, 1”
“2000,2”
“3000,3”
“4000,4”
“5000,5”
“6000,6”
“5000,5”
“5000,5”
“5000,5”
“5000,5”
x=1
s2
s1
1000
G
x=3
s2
s1
3000
17
x=6
s2
s1
6000
23
x=5
s2
s1
x=4
s2
s1
4000
31
5000
G
29
27
n
0, 1, 2, 3, 4, 5, 6
c1
c2
33 c2 = c1
34 imprimir(c2,c2.x)
35 c1.s1 = c1
36 imprimir(c1.s1,c1.s1.x)
x=2
s2
s1
2000
15
“1000, 1”
“2000,2”
“3000,3”
“4000,4”
“5000,5”
“6000,6”
“5000,5”
“5000,5”
“5000,5”
“5000,5”
x=1
s2
s1
1000
G
x=3
s2
s1
3000
17
x=6
s2
s1
6000
23
x=5
s2
s1
x=4
s2
s1
4000
31
5000
G
29
33
n
0, 1, 2, 3, 4, 5, 6
c1
c2
33 c2 = c1
34 imprimir(c2,c2.x)
35 c1.s1 = c1
36 imprimir(c1.s1,c1.s1.x)
x=2
s2
s1
2000
15
“1000, 1”
“2000,2”
“3000,3”
“4000,4”
“5000,5”
“6000,6”
“5000,5”
“5000,5”
“5000,5”
“5000,5”
“2000,2”
x=1
s2
s1
1000
G
x=3
s2
s1
3000
17
x=6
s2
s1
6000
23
x=5
s2
s1
x=4
s2
s1
4000
31
5000
G
29
33
n
0, 1, 2, 3, 4, 5, 6
c1
c2
33 c2 = c1
34 imprimir(c2,c2.x)
35 c1.s1 = c1
36 imprimir(c1.s1,c1.s1.x)
x=2
s2
s1
2000
15
“1000, 1”
“2000,2”
“3000,3”
“4000,4”
“5000,5”
“6000,6”
“5000,5”
“5000,5”
“5000,5”
“5000,5”
“2000,2”
x=1
s2
s1
1000
G
x=3
s2
s1
3000
x=6
s2
s1
6000
23
x=5
s2
s1
x=4
s2
s1
4000
31
5000
G
29
33
35
n
0, 1, 2, 3, 4, 5, 6
c1
c2
33 c2 = c1
34 imprimir(c2,c2.x)
35 c1.s1 = c1
36 imprimir(c1.s1,c1.s1.x)
x=2
s2
s1
2000
15
“1000, 1”
“2000,2”
“3000,3”
“4000,4”
“5000,5”
“6000,6”
“5000,5”
“5000,5”
“5000,5”
“5000,5”
“2000,2”
x=1
s2
s1
1000
G
x=3
s2
s1
3000
x=6
s2
s1
6000
x=5
s2
s1
x=4
s2
s1
4000
5000
G
29
33
35
G
G
n
0, 1, 2, 3, 4, 5, 6
c1
c2
33 c2 = c1
34 imprimir(c2,c2.x)
35 c1.s1 = c1
36 imprimir(c1.s1,c1.s1.x)
x=2
s2
s1
2000
15
“1000, 1”
“2000,2”
“3000,3”
“4000,4”
“5000,5”
“6000,6”
“5000,5”
“5000,5”
“5000,5”
“5000,5”
“2000,2”
“2000,2”
x=1
s2
s1
1000
G
x=3
s2
s1
3000
x=6
s2
s1
6000
x=5
s2
s1
x=4
s2
s1
4000
5000
G
29
33
35
G
G
Salidas | ||
S1 | S2 | S3 |
1000,1 2000,2 3000,3 4000,4 5000,5 6000,6 5000,5 5000,5 5000,5 5000,5 2000,2 2000,2 | 1000,1 2000,2 3000,3 4000,4 5000,5 6000,6 1000,1 2000,2 2000,2 3000,3 3000,3 3000,3 | 1000,0 2000,1 3000,2 4000,3 5000,4 5000,4 5000,4 5000,4 5000,4 5000,4 5000,4 5000,4 |
b) Indicar cuál de las salidas posibles es válida. Justificar la respuesta para las válidas e inválidas.
Salidas | ||
S1 | S2 | S3 |
1000,1 2000,2 3000,3 4000,4 5000,5 6000,6 5000,5 5000,5 5000,5 5000,5 2000,2 2000,2 | 1000,1 2000,2 3000,3 4000,4 5000,5 6000,6 1000,1 2000,2 2000,2 3000,3 3000,3 3000,3 | 1000,0 2000,1 3000,2 4000,3 5000,4 5000,4 5000,4 5000,4 5000,4 5000,4 5000,4 5000,4 |
b) Indicar cuál de las salidas posibles es válida. Justificar la respuesta para las válidas e inválidas.
“1000, 1”
“2000,2”
“3000,3”
“4000,4”
“5000,5”
“6000,6”
“5000,5”
“5000,5”
“5000,5”
“5000,5”
“2000,2”
“2000,2”
Salidas | ||
S1 | S2 | S3 |
1000,1 2000,2 3000,3 4000,4 5000,5 6000,6 5000,5 5000,5 5000,5 5000,5 2000,2 2000,2 | 1000,1 2000,2 3000,3 4000,4 5000,5 6000,6 1000,1 2000,2 2000,2 3000,3 3000,3 3000,3 | 1000,0 2000,1 3000,2 4000,3 5000,4 5000,4 5000,4 5000,4 5000,4 5000,4 5000,4 5000,4 |
b) Indicar cuál de las salidas posibles es válida. Justificar la respuesta para las válidas e inválidas.
“1000, 1”
“2000,2”
“3000,3”
“4000,4”
“5000,5”
“6000,6”
“5000,5”
“5000,5”
“5000,5”
“5000,5”
“2000,2”
“2000,2”
S1 coincide con salida de la ejecución
Salidas | ||
S1 | S2 | S3 |
1000,1 2000,2 3000,3 4000,4 5000,5 6000,6 5000,5 5000,5 5000,5 5000,5 2000,2 2000,2 | 1000,1 2000,2 3000,3 4000,4 5000,5 6000,6 1000,1 2000,2 2000,2 3000,3 3000,3 3000,3 | 1000,0 2000,1 3000,2 4000,3 5000,4 5000,4 5000,4 5000,4 5000,4 5000,4 5000,4 5000,4 |
b) Indicar cuál de las salidas posibles es válida. Justificar la respuesta para las válidas e inválidas.
“1000, 1”
“2000,2”
“3000,3”
“4000,4”
“5000,5”
“6000,6”
“5000,5”
“5000,5”
“5000,5”
“5000,5”
“2000,2”
“2000,2”
S1 coincide con salida de la ejecución
S2 difiere en la séptima impresión, no se tuvo en cuenta la sentencia 25 c1.s2 = c1.s1.s1
Salidas | ||
S1 | S2 | S3 |
1000,1 2000,2 3000,3 4000,4 5000,5 6000,6 5000,5 5000,5 5000,5 5000,5 2000,2 2000,2 | 1000,1 2000,2 3000,3 4000,4 5000,5 6000,6 1000,1 2000,2 2000,2 3000,3 3000,3 3000,3 | 1000,0 2000,1 3000,2 4000,3 5000,4 5000,4 5000,4 5000,4 5000,4 5000,4 5000,4 5000,4 |
b) Indicar cuál de las salidas posibles es válida. Justificar la respuesta para las válidas e inválidas.
“1000, 1”
“2000,2”
“3000,3”
“4000,4”
“5000,5”
“6000,6”
“5000,5”
“5000,5”
“5000,5”
“5000,5”
“2000,2”
“2000,2”
S1 coincide con salida de la ejecución
S2 difiere en la séptima impresión, no se tuvo en cuenta la sentencia 25 c1.s2 = c1.s1.s1
S3 difiere en las últimas impresiones, no se tuvo en cuenta la sentencia 33 c2 = c1 en adelante
c) Indicar en cuáles instrucciones se ejecuta el garbage collector y cuáles bloques se recolectan (indicando el valor de x del bloque). Indicar los bloques que quedan como garbage al final.
x=1
s2
s1
1000
G
x=3
s2
s1
3000
x=6
s2
s1
6000
x=4
s2
s1
4000
G
G
G
15 c1 = nuevo Clase()
25 c1.s2 = c1.s1.s1
35 c1.s1 = c1
35 c1.s1 = c1
c) Indicar en cuáles instrucciones se ejecuta el garbage collector y cuáles bloques se recolectan (indicando el valor de x del bloque). Indicar los bloques que quedan como garbage al final.
x=1
s2
s1
1000
G
x=3
s2
s1
3000
x=6
s2
s1
6000
x=4
s2
s1
4000
G
G
G
15 c1 = nuevo Clase()
25 c1.s2 = c1.s1.s1
35 c1.s1 = c1
35 c1.s1 = c1
d) Si entre las líneas 14 y 15 se agrega una instrucción: "imprimir(c2,c2.x)" indicar cuál es la salida del programa.
n
0, 1, 2
c1
c2
14 Clase c2
imprimir(c2, c2.x)
15 c1 = nuevo Clase()
x=2
s2
s1
2000
15
“1000, 1”
x=1
s2
s1
1000
G
d) Si entre las líneas 14 y 15 se agrega una instrucción: "imprimir(c2,c2.x)" indicar cuál es la salida del programa.
n
0, 1, 2
c1
c2
14 Clase c2
imprimir(c2, c2.x)
15 c1 = nuevo Clase()
x=2
s2
s1
2000
15
“1000, 1”
x=1
s2
s1
1000
G
d) Si entre las líneas 14 y 15 se agrega una instrucción: "imprimir(c2,c2.x)" indicar cuál es la salida del programa.
Al no hacer un new de c2, este tiene valor basura y acceder al bloque apuntado por esta basura provoca resultados inesperados (o errores en ejecución como pasa en el ejemplo en java)