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 3ª Lista de Exercícios Cap.7 e 8 (Sebesta)/Cap.6 (Scott): Fluxo de controle 1. Qual o valor das expressões posfixas abaixo? a) 5 3 + 6 * 2 1 + / b) 1 2 + 3 4 - + 5 6 + 7 8 - - * 2. Qual a tradução correta para a forma posfixa das expressões infixas abaixo? a) ( a * b ) + ( c * d ) b) ( a * b + ( c + d ) ) * ( e + f ) 3. Traduza a expressão abaixo para (a) notação prefixada e (b) notação posfixada. Será preciso usar um símbolo especial para o “menos” (–) unário? [− b + sqrt(b * b − 4 * a * c)]/(2 * a) 4. Escreva um pseudocódigo que use o operador ternário do C para imprimir, dentre dois números lidos, o maior deles. 5. Escreva um código C que lê um número inteiro e imprima se o número é par ou impar usando apenas o operador ternário como modificador do fluxo de controle. 6. O que é um efeito colateral no contexto de LPs? 7. Dê um exemplo que explicite a diferença entre uma LP que implementa as variáveis por valor e uma que implementa as variáveis por referência. 8. Linguagens que implementam variáveis por referência também tendem a implementar um “coletor de lixo automático”. Isso é só uma coincidência? Explique. 9. Dado o código C abaixo, mostre em que situação o programa imprime a mensagem “falso”. #include <stdio.h> int main(){ int a, b; scanf("%d%d", &a, &b); if (a = b) printf("verdadeiro"); else printf("falso"); return 0; } 10. Indique qual dos dois pseudocódigos “assembly” abaixo implementa uma avaliação curto-circuito. a) r1 := A r2 := B r1 := r1 = r2 r2 := A r3 := B r2 := r2 > r3 r3 := C r4 := A r3 := r3 > r4 r2 := r2 & r3 r1 := r1 | r2 if r1 = 0 goto L2 L1: clausula_then goto L3 L2: clausula_else L3: ... b) r1 := A r2 := B if r1 = r2 goto L1 r1 := A r2 := B if r1 <= r2 goto L2 r1 := C r2 := A if r1 <= r2 goto L2 L1: clausula_then goto L3 L2: clausula_else L3: ... 2 11. Escreva a expressão booleana corresponde aos códigos do exercício anterior. 12. Para expressão booleana abaixo, escreva dois pseudocódigos “assembly” para a avaliação da expressão: um passível de ser gerado por um compilador C e outro passível de ser gerado por um compilador Pascal. (A = B) OR (A > C) OR ((A > B) AND (C > B)) 13. Considere o código C abaixo: int fun(int *i) { *i += 5; return 4; } void main(){ int x = 3; x = x + fun(&x); } Qual seria o valor de x depois do comando de atribuição em main, assumindo que: a) Os operandos são avaliados da esquerda para a direita; b) Os operandos são avaliados da direita para a esquerda. 14. Por que algumas linguagens determinam a ordem de avaliação dos operandos enquanto outras deixam a escolha da ordem de avaliação por conta do compilador? Cite um argumento a favor da ordem fixa e um a favor da ordem flexível (o compilador decide). 15. Os pseudocódigos “assembly” têm por objetivo explicitar a semântica dos comandos de fluxo de controle. Para cada um dos pseudocódigos abaixo, escreva o pseudocódigo em alto nível (ou o código usando a LP de sua preferência) correspondente. a) r1 := 1 goto L2 L1: lista_instruções r1 += 1 L2: if r1 <= 10 goto L1 L3: ... b) r1 := a L1: lista_instruções if r1 <= 5 goto L1 L2: ... c) r1 := a L1: if r1 <= 5 goto L2 lista_instruções goto L1 L2: ... d) r1 := A r2 := B if r1 <= r2 goto L2 r1 := C r2 := A if r1 <= r2 goto L1 lista_instruções_1 goto L2 L1: lista_instruções_2 L2: ... e) r1 := i if r1 < 1 goto L5 if r1 > 6 goto L5 r1 += 1 r2 := L1[r1] goto *r2 L1: &L2 &L3 &L3 &L5 &L4 &L4 L2: lista_instruções_1 goto L5 L3: lista_instruções_2 goto L5 L4: lista_instruções_3 L5: ... f) r1 := i if r1 = 3 goto L2 if r1 = 5 goto L3 if r1 != 1 goto L4 L1: lista_instruções_1 L2: lista_instruções_2 L3: lista_instruções_3 L4: ... 3 16. Todo comando case pode ser simulado por meio de ifs encadeados. Sendo assim, por que muitas LPs incluem algum tipo de case? 17. Para os comandos for abaixo, escritos em Pascal (a) e em C (b), quantas vezes cada laço irá executar? Caso os valores sejam diferentes, explique por que. a) inicio :=1; fim := 10; for i:=inicio to fim do begin readln(a[i]); inc(inicio); dec(fim) end; b) inicio = 1; fim = 10; for (i = inicio; i <= fim; i++){ scanf(“%c”, a[i]); inicio++; fim--; } 18. O que significa dizer que um laço é pós-teste? E pré-teste? 19. Dê um exemplo usando a LP de sua preferência em que se use recursão em substituição a iteração.
Compartilhar