Sintaxis y semántica del lenguaje Práctica Nº 8 Esta práctica deberá resolverse en la semana del 01/06/11. 1- Resolver las pilas de ejecución siguiendo las reglas de alcance estático y dinámico. a) Program Main; var i,j:integer; Procedure B; begin i:= i - 4; end {B}; Function y (j:integer):integer; begin y:= j + i; end {y}; Procedure C (var a:integer; b:integer); var z:integer; begin z:= y ( b ); a:= a – 2; B; end {C}; Procedure A (var x:integer; k:integer); var i,j:integer; Procedure B; begin i:= i + 7; end; begin i:=19; j:= x + 5; k:= k + 3; C (x ,k ); writeln( i ,j ,x , k ); end {A}; begin i:=30; j:=15; A(i , j); writeln(i , j); end. {Main} b) Suponiendo que s se pasa por nombre y suponiendo que s se pasa por referencia. ¿Da lo mismo en todos los casos? Program Main; var i, j, z:integer; a:array[1..4] of integer; Procedure Dos (s:integer); Procedure Tres; begin i:= i + 1; j:= j + 4; end; begin Tres; s:= s + 2; writeln(s); end {Dos}; Procedure Uno (var j:integer); var i:integer; begin i:=1; Dos(a[i]); j:= j + 2; end {Uno}; begin for i:=1 to 4 do a[i]:=i; i:=2; j:=15; z:=7; Uno(z); for i:=1 to 4 do writeln (a[i]); end {Main}. c) Program Main; var i,j,z:integer; a:array[1..4] of integer; Procedure Uno (a:integer; var b:integer); begin a:= a + 15; b:= b + 1; z:= z + 3; a[i]:= a[i] + 8; writeln(a,b); end {Uno}; Procedure Dos (var i:integer; nombre v:integer; k:integer); var z:integer; begin z:= 5; i:= i + 1; v:= v + 7; if a[i] = 0 then Uno(v , i); end {Dos}; begin i:=1; j:=1; for z:=1 to 4 do a[z]:=0; z:=9; Dos( j, a[i] , z ); writeln(z); for z:=1 to 4 do writeln (a[z]); end {Main}. 2- Resolver las pilas de ejecución del siguiente programa recursivo (Cadenas de Plutonio) Program A; Procedure Cadenas(n:integer; cad:string); begin if n=0 then writeln(cad) else if n=1 then begin writeln(cad + ’Plo’); writeln(cad + ‘Plu’); end else begin Cadenas(n-1,cad + ‘Plo’); Cadenas(n-2,cad + ‘PluPlo’); end; end; begin Cadenas(3,’’); end. 3- Procedure A var x : array [1..5] of integer; i: integer; Procedure B( p: integer); begin p:= p + 1; i:= i + 1; p:= p + 1; end; begin for i:=1 to 5 do x[i]:=0; i:= 1; B(x[i]); end. a) Hacer la pila de ejecución para todos los tipos de pasajes de parámetros. b) Agregar la definición de i en B (var i:integer dentro del proc B) 4- Procedure A; var x,y; Procedure B (a, b : integer); begin a:=10; b:=5; end; begin x:=2; y:=4; B(x,x); end; Analice qué sucede si a y b están pasados por referencia, por valor-resultado, por valor y por resultado. 5-a) Procedure A var x Procedure B var x ...... end ....... end. Acá quiero utilizar la variable x de A b) Procedure A var x Procedure B var y Acá quiero utilizar la var y de C ..... end Procedure C var y ..... end begin C ........ end. 6- Explique y ejemplifique en Pascal cómo simula el pasaje por valor-resultado. 7- Dado un lenguaje XX que sólo provee uno de los tipos de pasaje de parámetros estudiados, escriba un programa (con sintaxis Pascal) que me permita saber (al ejecutarlo) cuál es el tipo de pasaje provisto. 8- Procedure Main; Procedure A; var y; .... end; Procedure B( routine X); var u,v,y; Procedure C; * y:=........... end; begin X; B( C ); end; begin B(A); end. a) Haga la pila con el alcance estático haciendo las activaciones correspondientes. b) Cuando se produce la asignación * ¿qué variable y se modifica?