1 of 13

Lenguajes de Programación I

Ej. 3 – Recuperatorio 2024

2 of 13

Código

x = 1

y = 2

z = 3

func h() {

imprimir x

imprimir y

imprimir z

}

func f() {

MOD1 x = 4

MOD2 y = 5

MOD3 z = 6

func g() {

MOD4 x = 7

MOD5 y = 8

MOD6 z = 9

h()

}

g()

h()

}

f()

h()

Se tiene el siguiente programa en el cual si las variables no se declaran con modificador son globales, si tienen el modificador “local” se acceden por la secuencia de invocación y si tienen el modificador “my” son utilizadas por la función que las declara

  1. Proponer modificadores para MOD1, MOD2, MOD3, MOD4, MOD5 Y MOD6 para los siguientes casos en donde el programa imprime:
    • 789 789 789
    • 789 456 123
    • 123 123 123
    • 456 456 123
    • 189 159 129
    • 159 156 126
  2. Construir la tabla de símbolos para cada uno de los casos del inciso a)
  3. Para los casos i) a iv) del inciso a) proponer un programa equivalente en un lenguaje con el alcance como Python o Pascal sin modificar las líneas de las asignaciones a variables / únicamente utilizando modificadores de alcance y re-ubicando o duplicando la función h en el código.

3 of 13

Código

x = 1

y = 2

z = 3

func h() {

imprimir x

imprimir y

imprimir z

}

func f() {

MOD1 x = 4

MOD2 y = 5

MOD3 z = 6

func g() {

MOD4 x = 7

MOD5 y = 8

MOD6 z = 9

h()

}

g()

h()

}

f()

h()

  1. Proponer modificadores para MOD1, MOD2, MOD3, MOD4, MOD5 Y MOD6 para los siguientes casos en donde el programa imprime:

i) 789 789 789

ii) 789 456 123

iii) 123 123 123

iv) 456 456 123

v) 189 159 129

vi) 159 156 126

i) ¿Cómo hacer para que el programa imprima 789 789 789?

MOD1, MOD2, MOD3, MOD4, MOD5 Y MOD6 tienen que modificar las variables globales

h() debe poder acceder a las mismas variables siempre

main

f

g

h

h

h

VAR

MODO

AMBITO

VALOR

x

global

main

1

y

global

main

2

z

global

main

3

4

5

6

7

8

9

4 of 13

Código

x = 1

y = 2

z = 3

func h() {

imprimir x

imprimir y

imprimir z

}

func f() {

MOD1 x = 4

MOD2 y = 5

MOD3 z = 6

func g() {

MOD4 x = 7

MOD5 y = 8

MOD6 z = 9

h()

}

g()

h()

}

f()

h()

i) 789 789 789

ii) 789 456 123

iii) 123 123 123

iv) 456 456 123

v) 189 159 129

vi) 159 156 126

i) ¿Cómo hacer para que el programa imprima 789 456 123?

MOD1, MOD2, MOD3, MOD4, MOD5 Y MOD6 tienen que modificar las variables locales de cada ámbito

h() debe poder acceder a las variables de g(), f() y main()

main

f

g

h

h

h

VAR

MODO

AMBITO

VALOR

x

global

main

1

y

global

main

2

z

global

main

3

x

local

f

4

y

local

f

5

z

local

f

6

x

local

g

7

y

local

g

8

z

local

g

9

5 of 13

Código

x = 1

y = 2

z = 3

func h() {

imprimir x

imprimir y

imprimir z

}

func f() {

MOD1 x = 4

MOD2 y = 5

MOD3 z = 6

func g() {

MOD4 x = 7

MOD5 y = 8

MOD6 z = 9

h()

}

g()

h()

}

f()

h()

i) 789 789 789

ii) 789 456 123

iii) 123 123 123

iv) 456 456 123

v) 189 159 129

vi) 159 156 126

i) ¿Cómo hacer para que el programa imprima 123 123 123?

MOD1, MOD2, MOD3, MOD4, MOD5 Y MOD6 no tienen que modificar las variables globales (deben modificar variables my inaccesibles)

h() debe poder acceder a las variables globales originales

main

f

g

h

h

h

VAR

MODO

AMBITO

VALOR

x

global

main

1

y

global

main

2

z

global

main

3

x

my

f

4

y

my

f

5

z

my

f

6

x

my

g

7

y

my

g

8

z

my

g

9

6 of 13

Código

x = 1

y = 2

z = 3

func h() {

imprimir x

imprimir y

imprimir z

}

func f() {

MOD1 x = 4

MOD2 y = 5

MOD3 z = 6

func g() {

MOD4 x = 7

MOD5 y = 8

MOD6 z = 9

h()

}

g()

h()

}

f()

h()

i) 789 789 789

ii) 789 456 123

iii) 123 123 123

iv) 456 456 123

v) 189 159 129

vi) 159 156 126

i) ¿Cómo hacer para que el programa imprima 456 456 123?

MOD1, MOD2, MOD3 deben permitir modificar variables locales, MOD4, MOD5 Y MOD6 deben modificar variables inaccesibles

h() debe poder acceder a las variables de f y globales originales

main

f

g

h

h

h

VAR

MODO

AMBITO

VALOR

x

global

main

1

y

global

main

2

z

global

main

3

x

local

f

4

y

local

f

5

z

local

f

6

x

my

g

7

y

my

g

8

z

my

g

9

7 of 13

Código

x = 1

y = 2

z = 3

func h() {

imprimir x

imprimir y

imprimir z

}

func f() {

MOD1 x = 4

MOD2 y = 5

MOD3 z = 6

func g() {

MOD4 x = 7

MOD5 y = 8

MOD6 z = 9

h()

}

g()

h()

}

f()

h()

i) 789 789 789

ii) 789 456 123

iii) 123 123 123

iv) 456 456 123

v) 189 159 129

vi) 159 156 126

i) ¿Cómo hacer para que el programa imprima 189 159 129?

MOD1, MOD4 my

MOD2, MOD5 local

MOD3, MOD6: global

h() debe acceder a “x” global original, “y” local de cada ámbito y “z” global

main

f

g

h

h

h

VAR

MODO

AMBITO

VALOR

x

global

main

1

y

global

main

2

z

global

main

3

x

my

f

4

y

local

f

5

x

my

g

7

y

local

g

8

6

9

8 of 13

Código

x = 1

y = 2

z = 3

func h() {

imprimir x

imprimir y

imprimir z

}

func f() {

MOD1 x = 4

MOD2 y = 5

MOD3 z = 6

func g() {

MOD4 x = 7

MOD5 y = 8

MOD6 z = 9

h()

}

g()

h()

}

f()

h()

i) 789 789 789

ii) 789 456 123

iii) 123 123 123

iv) 456 456 123

v) 189 159 129

vi) 159 156 126

i) ¿Cómo hacer para que el programa imprima 159 156 126?

MOD1, MOD4 my

MOD2 local, MOD5 my

MOD3, MOD6: global

h() debe acceder a “x” global original, “y” de f y global original y a “z” global y de f

main

f

g

h

h

h

VAR

MODO

AMBITO

VALOR

x

global

main

1

y

global

main

2

z

global

main

3

x

my

f

4

y

local

f

5

x

my

g

7

y

my

g

8

6

9

9 of 13

Código

x = 1

y = 2

z = 3

func h() {

imprimir x

imprimir y

imprimir z

}

func f() {

MOD1 x = 4

MOD2 y = 5

MOD3 z = 6

func g() {

MOD4 x = 7

MOD5 y = 8

MOD6 z = 9

h()

}

g()

h()

}

f()

h()

i) 789 789 789

ii) 789 456 123

iii) 123 123 123

iv) 456 456 123

i) ¿Cómo hacer para que el programa imprima 789 789 789?

  • Tener una h anidada dentro de main
  • En Python poner global x,y,z en f y g

h() debe acceder a “x” global original, “y” de f y global original y a “z” global y de f

Main

x, y, z

f

g

h

10 of 13

Código

x = 1

y = 2

z = 3

func h() {

imprimir x

imprimir y

imprimir z

}

func f() {

MOD1 x = 4

MOD2 y = 5

MOD3 z = 6

func g() {

MOD4 x = 7

MOD5 y = 8

MOD6 z = 9

h()

}

g()

h()

}

f()

h()

i) 789 789 789

ii) 789 456 123

iii) 123 123 123

iv) 456 456 123

i) ¿Cómo hacer para que el programa imprima 789 456 123?

  • Tener una h en cada función
  • En Python no poner nada en x,y,z en f y g

h() debe acceder a “x” global original, “y” de f y global original y a “z” global y de f

Main

x, y, z

f

x, y, z

g

x, y, z

h

h

h

11 of 13

Código

x = 1

y = 2

z = 3

func h() {

imprimir x

imprimir y

imprimir z

}

func f() {

MOD1 x = 4

MOD2 y = 5

MOD3 z = 6

func g() {

MOD4 x = 7

MOD5 y = 8

MOD6 z = 9

h()

}

g()

h()

}

f()

h()

i) 789 789 789

ii) 789 456 123

iii) 123 123 123

iv) 456 456 123

i) ¿Cómo hacer para que el programa imprima 123 123 123?

  • Tener una h anidada dentro de main
  • En Python no poner nada en x,y,z en f y g

h() debe acceder a “x” global original, “y” de f y global original y a “z” global y de f

Main

x, y, z

f

x, y, z

g

x, y, z

h

12 of 13

Código

x = 1

y = 2

z = 3

func h() {

imprimir x

imprimir y

imprimir z

}

func f() {

MOD1 x = 4

MOD2 y = 5

MOD3 z = 6

func g() {

MOD4 x = 7

MOD5 y = 8

MOD6 z = 9

h()

}

g()

h()

}

f()

h()

i) 789 789 789

ii) 789 456 123

iii) 123 123 123

iv) 456 456 123

i) ¿Cómo hacer para que el programa imprima 456 456 123?

  • Tener una h anidada dentro de main y otra dentro de f
  • En Python no poner nada en x,y,z en f ni en g

h() debe acceder a “x” global original, “y” de f y global original y a “z” global y de f

Main

x, y, z

f

x, y, z

g

x, y, z

h

h

13 of 13

Errores frecuentes

  • Confundir acceso a variables locales con my y viceversa
  • Agregar cambios de valores de variables globales como una nueva variable
  • Hacer pila de registros de activación con variables estáticas, cadenas, etc.
  • No eliminar las entradas de funciones que terminan
  • En las versiones de Python y Pascal agregar variables accesibles según el orden de invocaciones