Linguagens de Programação - Atividade 09

Nesta atividade, vamos tratar de escopo.

Questão 01

Considere o seguinte esqueleto de programa:

procedure Main is
    X : Integer;
    procedure Sub3; -- Essa é uma declaração de Sub3
                   -- Ela permite que Sub3 a chame 
    procedure Sub1 is
        X : Integer; 
        procedure Sub2 is
            begin -- de Sub2 
            ...
            end; -- de Sub2
        begin -- de Sub1 
        ...
        end; -- de Sub1
    procedure Sub3 is 
        begin -- de Sub3 
        ...
        end; -- de Sub3
    begin -- de Main 
    ...
    end; -- de Main                                                   
                        

Assuma que a execução desse programa é na seguinte ordem de unidades:

Main chama Sub1

Sub1 chama Sub2

Sub2 chama Sub3

  1. Assumindo escopo estático, a seguir, qual declaração de X é a correta para uma referência a X?
    • Sub1
    • Sub2
    • Sub3
  2. Repita a parte 1, mas assuma escopo dinâmico.

Questão 02

Assuma que o seguinte programa foi compilado e executado usando regras de escopo estático. Que valor de X é impresso no procedimento Sub1? Sob re- gras de escopo dinâmico, qual o valor de X impresso no procedimento Sub1?

procedure Main is 
    X : Integer; 
    procedure Sub1 is
        begin -- de Sub1 
            Put(X);
        end; -- de Sub1
    procedure Sub2 is 
        X : Integer; 
        begin -- de Sub2 
            X := 10;
            Sub1
        end; -- de Sub2 
    begin -- de Main 
        X := 5;
        Sub2
    end; -- de Main                                            
                        

Questão 03

Considere o programa:

procedure Main 
    is X, Y, Z : Integer; 
    procedure Sub1 is
        A, Y, Z : Integer; 
        procedure Sub2 is
            A, B, Z : Integer;
            begin -- de Sub2 
                ...
            end; -- de Sub2 
        begin -- de Sub1 
        ...
        end; -- de Sub1
    procedure Sub3 is 
        A, X, W : Integer; 
        begin -- de Sub3 
        ...
        end; -- de Sub3
    begin -- de Main 
    ...
    end; -- de Main                              
                        

Liste todas as variáveis, com as unidades de programa onde elas estão declaradas, visíveis nos c orpos de Sub1, Sub2 e Sub3, assumindo que o escopo estático esteja sendo usado.

Questão 04

Considere o programa:

procedure Main is 
    X, Y, Z : Integer; 
    procedure Sub1 is
        A, Y, Z : Integer; 
        begin -- de Sub1 
        ...
        end; -- de Sub1
    procedure Sub2 is 
    A, X, W : Integer; 
        procedure Sub3 is
            A, B, Z : Integer; 
            begin -- de Sub3 
            ...
            end; -- de Sub3
        begin -- de Sub2 
        ...
        end; -- de Sub2
    begin -- de Main 
    ...
    end; -- de Main                                  
                        

Liste todas as variáveis, com as unidades de programa onde elas estão declaradas, visíveis nos corpos de Sub1, Sub2 e Sub3, assumindo que o escopo estático está sendo usado.

Questão 05

Considere o programa:

void fun(void) {
    int a, b, c; /* definição 1 */
    ...
    while (...) {
        int b, c, d; /* definição 2 */ 
        ... <-------------- 1
        while (...) {
            int c, d, e; /* definição 3 */ 
            ... <------------- 2
        }
    ... <-------------- 3 
    }
    ... <---------------- 4 
}                      
                        

Para cada um dos quatro pontos marcados nessa função, liste cada variável visí- vel, com o número da sentença de definição que a define.

Questão 06

Considere o seguinte esqueleto de programa:

void fun1(void); /* protótipo */ 
void fun2(void); /* protótipo */ 
void fun3(void); /* protótipo */ 
void main() {
    int a, b, c;
    ... 
}
void fun1(void) { 
    int b, c, d; 
    ...
}
void fun2(void) {
    int c, d, e;
    ... 
}
void fun3(void) { 
    int d, e, f; 
    ...
}                  
                        

Dada as seguintes sequências de chamadas e assumindo que o escopo dinâmico é usado, que variáveis são visíveis durante a execução da última função chamada? Inclua com cada variável visível o nome da função na qual ela foi definida.

  1. main chamafun1;fun1 chama fun2;fun2 chama fun3.
  2. main chama fun1;fun1 chama fun3.
  3. main chama fun2;fun2 chama fun3;fun3 chama fun1.
  4. main chama fun3;fun3 chama fun1.
  5. main chama fun1;fun1 chama fun3;fun3 chama fun2.
  6. main chama fun3;fun3 chama fun2;fun2 chama fun1.