Buscar

Paradigma de Programação Imperativa e Orientada a Objetos

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 4 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

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"); 
}

Outros materiais