Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 5185/31 e 6888/1– Paradigma de Programação Imperativa e Orientada a Objetos Profa. Valéria 5ª Lista de Exercícios (1ª parte) Cap.9 e 14 (Sebesta)/Cap.8 (Scott): Sub-rotinas e abstração de controle 1. Suponha uma LP de escopo estático e que permite aninhamento de subprogramas. Quando da chamada de um subprograma, quem é responsável por calcular o seu link estático? O subprograma chamado ou o chamador? 2. Dentro da sequência de chamada de um subprograma, explique o que é prólogo e epílogo. 3. Quem é responsável por desalocar o RA do subprograma que terminou? O subprograma em finalização (o chamado) ou o chamador? 4. Qual a diferença entre um subprograma definido e um subprograma declarado? Qual a utilidade de se poder ter definição separada da declaração? 5. Considere o seguinte código (errado) em C: void foo() { int i; printf("%d", i++); } int main() { int j; for (j = 1; j <= 10; j++) foo(); getchar(); return 0; } A variável local i no subprograma foo nunca é inicializada e esse tipo de erro não é detectado pelo compilador. Em muitos sistemas, esse programa irá gerar uma lista de números em uma sequencia crescente, por exemplo, 0 1 2 3 4 5 6 7 8 9. Explique o motivo deste comportamento. 6. Suponha o código abaixo: procedure f (x, y, z) x := x + 1; y := z; z := z + 1; . . . i := 1; a[1] := 10; a[2] := 11; f (i, a[i], i); Quais seriam os valores de i, a[1] e a[2] após o retorno de f se for usada: a) passagem por valor; b) passagem por referência; c) passagem por valor-resultado. LUCAS Realce LUCAS Realce LUCAS Nota Permite abstração de subprogamas. LUCAS Nota Apenas muda a posicao do ponteiro do topo da pilha, por isto ira gerar uma lista de numeros em sequencia, logo a unica coisa que ira mudar é o ponteiro. LUCAS Nota a - 1, 10, 11nullb- 3, 2, 11nullc- 2, 1, 11 LUCAS Realce LUCAS Realce 2 7. Considere o pseudocódigo abaixo: x: integer procedure somaUm (y : integer) print x y := y + 1 ... procedure foo(y: integer) somaUm(y) print x ... principal x := 2 foo(x) print x ... Supondo que a LP implemente passagem de parâmetros por valor-resultado, quais valores serão impressos pelas três instruções print x? 8. Os trechos de código abaixo estão escritos em (a) C, (b) C++ e (c) Java, respectivamente. Embora todos estejam corretos, apenas na versão em C++ a função troca() funciona como esperado, isto é, após o seu retorno, os valores de i e j estão trocados. Explique por que o mesmo não acontece em C e em Java. a) void troca (int *a, int *b){ int *t = b; b = a; a = t; } int main(){ int x = 5; int y = 10; int *i = &x; //5 int *j = &y; //10 troca(i, j); } b) void troca (int &a, int &b){ int t = b; b = a; a = t; } int main(){ int i = 5; int j = 10; troca(i, j); } c) public class TestTroca { public static void troca(MeuObjeto a, MeuObjeto b) { MeuObjeto t = b; b = a; a = t; } public static void main(String[] args) { MeuObjeto i = new MeuObjeto(5); MeuObjeto j = new MeuObjeto(10); troca(i,j); } } LUCAS Nota Porque em java foi passado por valor.null LUCAS Nota 2, 3, 3 3 9. Considere o seguinte código Java: public static void somaUm(int a, Integer[] b) { System.out.println(++a); System.out.println(++b[0]); } public static void main(String[] args) { int i = 5; Integer[] j = {10}; somaUm(i,j); System.out.println(i); System.out.println(j[0]); } Quais valores serão impressos pelos println() do método somaUm() e quais valores serão impressos pelos println() do método main()? Explique. 10. Escreva o protótipo de uma função A em C que retorna um float e que recebe três parâmetros: o primeiro parâmetro é um ponteiro para uma função que recebe dois int’s como parâmetro e retorna um float; o segundo parâmetro é um int e o terceiro é um int. 11. Considere o pseudocódigo abaixo, onde o subprograma SUB2 é passado como parâmetro para o subprograma SUB4. Supondo que seja legal SUB3 chamar SUB4, defina qual será o ambiente de referenciamento de SUB2 e qual será o valor da variável x quando é utilizada (a) vinculação rasa e (b) vinculação profunda. procedure SUB1; var x : integer; procedure SUB2; begin write(‘x = ’, x); end; {de SUB2} procedure SUB3; var x : integer; begin x := 3; SUB4(SUB2); end; {de SUB3} procedure SUB4(SUBX); var x : integer; begin x := 4; SUBX; end; {de SUB4} begin {de SUB1} x := 1; SUB3; end; {de SUB1} 12. Escreva um subprograma sobrecarregado em C++ chamado imprime que recebe como parâmetro um valor de qualquer tipo primitivo e o imprime corretamente na saída padrão. 13. Escreva um subprograma genérico em C++ chamado imprime que recebe como parâmetro um valor de qualquer tipo primitivo e o imprime corretamente na saída padrão. 14. O que é polimorfismo paramétrico e polimorfismo de subtipo? Exemplifique os dois tipos de polimorfismo. LUCAS Nota somaUm( ) = 6 , 11nullmain ( ) = 5, 11nullpois vetores em java são passados por reverências. LUCAS Nota float A(float (*func)(int a,int b),int v, int k)nullnullsimular a orientação objeto.nullnullapenas alguns copilar permintem isto. LUCAS Nota void imprime (int A) {nullnullcout << A;null}nullvoid imprime (float A) {nullnullcout << A;null}nullnull LUCAS Realce LUCAS Realce LUCAS Realce LUCAS Realce LUCAS Realce LUCAS Realce LUCAS Realce LUCAS Realce 4 15. Execute o programa em C++ abaixo. Explique por que o subprograma genérico sort funciona bem para o vetor ints, mas não para o vetor strings. #include <iostream> template<class T> void sort (T A[], int A_size) { for (int i = 1; i < A_size; i++) { int j = i; T t = A[i]; for (; j > 0; j--) { if (t >= A[j-1]) break; A[j] = A[j-1]; } A[j] = t; } } int ints[20] = {19, 17, 15, 13, 11, 9, 7, 5, 3, 1, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0}; char *strings[16] = {"now", "is", "the", "time", "for", "all", "good", "folk", "to", "come", "to", "the", "aid", "of", "the", "party"}; int main () { for (int i = 0; i < 20; i++) printf("%d ", ints[i]); printf("\n"); sort (ints, 20); for (int i = 0; i < 20; i++) printf("%d ", ints[i]); printf("\n"); for (int i = 0; i < 16; i++) printf("%s ", strings[i]); printf("\n"); sort (strings, 16); for (int i = 0; i < 16; i++) printf("%s ", strings[i]); printf("\n"); }
Compartilhar