1 of 40

Lenguajes de Programación I

Parcial 2023

Ejercicio 4

2 of 40

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

3 of 40

  1. Diagramar la ejecución del programa, mostrando la evolución de los nodos junto con la ejecución del garbage collector, indicando para cada puntero la instrucción que lo crea. Por ejemplo, el siguiente diagrama indica que la instrucción 12 crea un nodo en el heap y hace que c1 apunte a dicho nodo.

Nota: seguir el esquema del ejemplo y realizar no menos de 3 gráficos

4 of 40

n

c1

c2

5 of 40

n

0, 1

c1

c2

12. Clase c1 = nuevo Clase()

x=1

s2

s1

1000

12

6 of 40

n

0, 1

c1

c2

imprimir(c1,c1.x)

x=1

s2

s1

1000

12

7 of 40

n

0, 1

c1

c2

imprimir(c1,c1.x) “1000, 1”

x=1

s2

s1

1000

12

8 of 40

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

9 of 40

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

10 of 40

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

11 of 40

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

12 of 40

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

13 of 40

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

14 of 40

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

15 of 40

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

16 of 40

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

17 of 40

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

18 of 40

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

19 of 40

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

20 of 40

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

21 of 40

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

22 of 40

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

23 of 40

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

24 of 40

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

25 of 40

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

26 of 40

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

27 of 40

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

28 of 40

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

29 of 40

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

30 of 40

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

31 of 40

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.

32 of 40

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”

33 of 40

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

34 of 40

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

35 of 40

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

36 of 40

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

37 of 40

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

38 of 40

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.

39 of 40

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.

40 of 40

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)