Baixe o app para aproveitar ainda mais
Prévia do material em texto
Universidade Federal do Ceará – Campus Russas Linguagens de Programação Prof. Ms. Rafael Ivo Lista de Exercícios 5 – Subprogramas 1) Quais os motivos para se criar uma função? 2) Normalmente, qual a diferença entre um procedimento e uma função? 3) Diferencie argumento e parâmetro. 4) Quais as principais formas de passar um argumento para uma função? Explique cada uma delas. 5) Descreva as formas como apelidos podem ocorrer com argumentos passados por referência. 6) O que é ligação de um subprograma? 7) O que é registro de ativação? 8) Por que uma instância de registro de ativação de cada função presente em um programa não é previamente instanciada e armazenada na memória em tempo de compilação? 9) Explique a diferença do ponteiro de ligação dinâmica do ponteiro de retorno em um registro de ativação. 10) Explique a diferença do ponteiro de ligação estática e do ponteiro de ligaçao dinâmica em um registro de ativação. 11) Por que programas recursivos utilizam mais memória do que programas iterativos. 12) Analise o seguinte programa em uma linguagem similar a C: void swap(int[] list, int i, int j){ int temp = list[i]; list[i] = list[j]; list[j] = temp; } void main(){ int x[3] = {5,2,4}; swap(x,1,2); } Qual o valor da matriz x para cada uma dos seguintes mecanismos de passagem de parâmetros? a) O argumento x é passado por valor. b) O argumento x é passado por referência. c) O argumento x é passado por resultado-valor. 13) Considere o seguinte programa escrito na sintaxe estilo-C: void swap(int a, int b){ int temp = a; a = b; b = temp; } void main(){ int value = 2, list[5] = {1,3,5,7,9}; swap(value, list[0]); swap(list[0], list[1]); swap(value, list[value]); } Para cada um dos seguintes métodos de passagem de parâmetros, quais são todos os valores das variáveis value e list após cada uma das três chamadas de swap? a) Passagem por valor. b) Passagem por referência. c) Passagem por resultado-valor. 14) Considere o seguinte programa escrito na sintaxe estilo-C: void fun(int first, int second){ first += first; second += second; } void main(){ int list[2] = {1,3}; fun(list[0],list[1]); } Para cada um dos seguintes métodos de passagem de parâmetros, quais são todos os valores do vetor list após a execução? a) Passagem por valor. b) Passagem por referência. c) Passagem por resultado-valor. 15) Mostre a pilha de execução com todos os registros de ativação, incluindo as ligações estáticas e dinâmicas, quando a execução atinge a posição 1 no seguinte programa em Ada. 01. 02. 03. 04. 05. 06. 07. 08. 09. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. procedure Main is procedure A is procedure B is begin -- inicio de B ... ← ← ← ← ← ← ← ← ← ← ← ← posição 1 end; -- final de B procedure C is begin -- inicio de C ... B; ... end; -- final de C begin -- inicio de A ... C; ... end; -- final de A begin -- inicio de Main ... A; ... end; -- final de Main 16) Mostre a pilha de execução com todos os registros de ativação, incluindo as ligações estáticas e dinâmicas, quando a execução atinge a posição 1 no seguinte programa em Ada. 01. 02. 03. 04. 05. 06. 07. 08. 09. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. procedure Main is M : Float; L : Float; procedure A is X : Integer; procedure B(S : Float) is Y, Z : Float; begin -- inicio de B ... C(Z); ... end; -- final de B begin -- inicio de A ... B(X); ... end; -- final de A procedure C(P : Float) is begin -- inicio de C ... ← ← ← ← ← ← ← ← ← ← ← ← posição 1 end; -- final de C begin -- inicio de Main ... A; ... end; -- final de Main 17) Mostre a pilha de execução com todos os registros de ativação, incluindo as ligações estáticas e dinâmicas, quando a execução atinge a posição 1 no seguinte programa em Ada. 01. 02. 03. 04. 05. 06. 07. 08. 09. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. procedure Main is procedure A(Flag : Boolean) is procedure B is begin -- inicio de B ... A(false); end; -- final de B begin -- inicio de A if Flag then B; else C; ... end; -- final de A procedure C is procedure D is begin -- inicio de D ... ← ← ← ← ← ← ← ← ← ← ← ← posição 1 end; -- final de D begin -- inicio de C ... D; end; -- final de C begin -- inicio de Main ... A(true); ... end; -- final de Main 18) Seja o código abaixo escrito em uma linguagem como C. Mostre a pilha de execução com todos os registros de ativação cada vez que a execução atinge a linha 13. Cada registro de ativação deve possuir apenas o nome da função, as variáveis locais da função e a linha da próxima instrução a ser executada após o término da execução da função (para funcionar como endereço de retorno). 01. 02. 03. 04. 05. 06. 07. 08. 09. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. void ordena(int n, int v[]){ int i, temp; if(n > 1){ ordena(n-1,v); i = n; while(i > 0 && v[i-1] > v[i]){ temp = v[i]; v[i] = v[i-1]; v[i-1] = temp; i--; } } //ponto de analise } void main(){ int dados[] = {3,1,2}; ordena(3,dados); } Obs1: As variáveis são passadas usando o mecanismo de resultado-valor. Obs2: A expressão booleana da linha 6 e avaliada usando a avaliação de curto-circuito. 19) Considere o seguinte programa abaixo escrito na linguagem Ada. Suponha que o compilador implemente escopo estático. Mostre a pilha de execução do programa cada vez que uma instrução de escrita é chamada. O formato de cada registro de ativação está mostrado a direita do código. Obs: A instrução Put(x,y,z) escreve os valores de x, y e z visíveis. 01. procedure Main is 02. x, y, z: Integer; 03. procedure procB is 04. y: Integer; 05. begin -- início de procB 06. y = 0; 07. x = z + 1; 08. z = y + 2; 09. Put(x,y,z); 10. end; -- final de procB 11. procedure procC is 12. z: Integer; 13. procedure procD is 14. x : Integer; 15. begin -- início de procD 16. x = z + 1; 17. y = x + 1; 18 Put(x,y,z); 19. procB; 20. end; -- final de procD 21. begin -- início de procC 22. z = 5; 23 Put(x,y,z); 24. procD; 25. end; -- final de procC 26. begin -- início de main 27. x = 10; 28. y = 11; 29. z = 12; 30. procC; 31. end; -- final de main Pont. Ligação Estática Pont. Ligação Dinâmica Variável ... Variável Linha de retorno 20) O programa C/C++ a seguir resolve o problema das Torres de Hanói para três discos: 01. 02. 03. 04. 05. 06. 07. 08. 09. 10. 11. 12. 13. void moveTorre(int discos, char inicio, char final, char meio){ if(discos == 1) cout << "Move um disco de " << inicio << " para " << final << endl; else{ moveTorre(discos-1,inicio,meio,final); cout << "Move um disco de " << inicio << " para " << final << endl; moveTorre(discos-1,meio,final,inicio); } } void main(){ int nDiscos = 3; moveTorre(nDiscos,'A','B','C'); } Mostre o estado da pilha de execução com os registros de ativação a cada vez que uma instrução de escrita é chamada.
Compartilhar