Ciência da Computação
Disciplina: Paradigmas de Programação Professor: Bruno Ferreira
Atividade: Exercício de Revisão Capítulo 6
1) Defina o que são tipos ordinais, enumerações e subfaixas.
2) Quais são as vantagens dos tipos enumerações, definidos pelo usuário?
3) Defina o que são tipos de matrizes estáticas, fixas dinâmicas de pilhas, dinâmicas na pilha e dinâmicas.
4) Defina e dê exemplos de "ordem de linhas maior" e "ordem de colunas maior".
5) Dê um exemplo de cálculo de endereço de posições de matrizes unidimensionais e multidimensionais atribuindo endereços de memória hipotéticos para estruturas do tipo inteiro.
7) Quais as principais operações para ponteiros? Explique como elas funcionam. 6) Quais são os problemas comuns em Ponteiros? Explique quando eles ocorrem.
7) Quais são os métodos para evitar o problema de Ponteiros soltos? Explique de forma esquemática como elas funcionam.
8) Descreva as abordagens preguiçosa e ansiosa de reivindicação de lixo na memória. 9) O que é coersão de tipo?
10) O que é tipagem forte? Quais as vantagens e desvantagens?
Capítulo 7
1) Defina precedência de operador e associatividade de operador.
2) Defina operadores pré-fixado, in-ficado e pós-fixado. Mostre uma sentença aritmética para cada exemplo.
3) Defina efeito colateral.
4)Defina conversões de estreitamento e alargamento. Essas conversões podem trazer problemas? Quais?
5) O que é um operador sobrecarregado? Quais as vantagens e desvantagens quanto a seu uso?
6) O que são atribuições de modo misto? Defina também coerção e casting.
7) Cite um erro que pode acontecer em tempo de compilação e em tempo de execução nas sentenças.
8) O que são avaliações em curto-cirtuito?
9) Um expressão aritmética do tipo A + B+ C +D é associativa segundo os fundamentos matemáticos, ou seja, não importa a ordem que as parcelas serão somadas. Você vê alguma situação em que a associatividade pode causar problemas em uma adição de inteiros em um computador? Como isso seria resolvido?
Ciência da Computação
Disciplina: Paradigmas de Programação Professor: Bruno Ferreira
Atividade: Exercício de Revisão 10) Assuma as seguintes regras de associatividade e de precedência para expressões:
Precedência Mais alta ( )
*,/,not +,-,&,mod -(uniário) =,/=,<,<=,>,>= and
Mais baixa or, xor
Associatividade Esquerda para direita
Mostre a ordem de avaliação das seguintes expressões por meio do uso de parêntese em todas as subexpressões e colocando um expoente no parêntese direito para indicar a ordem. Por exemplo, para a expressão: a + b * c + d, a ordem de avaliação seria representada como: ((a + (b * c)1)2+ d)3. a) a * b - 1 + c b) a * (b - 1) / c mod d c) (a - b) / c & (d * e / a - 3) d) -a or c = d and e e) a > b xor c or d <= 17 f) -a + b
11) Mostre a ordem de avaliação das expressões do Problema 9, assumindo que não existem regras de precedência e todos os operadores são associativos da direita para a esquerda. 12) Considere que a função fun é definida como
int fun(int *k) { *k += 4;
return 3 * (*k) -1; }
Suponha que a função seja usada em um programa, como: voide main(){
int i=10, j=10, sum1, sum2; sum1 = (i/2) + fjun (&i); sum2 = fun(&j) + (j/2); }
Quais são os valores de sum1 e sum2
a) se os operandos na expressão forem avaliados da esquerda para a direita? a) se os operandos na expressão forem avaliados da direita para a esquerda?
13) Descreva o que ocorre em cada trecho que culmina com impressões no seguinte programa em C, justificando suas afirmações.
Ciência da Computação
Disciplina: Paradigmas de Programação Professor: Bruno Ferreira
Atividade: Exercício de Revisão main () { int a, b, c; b = c = 10; a = b++ + b++; printf("%d\n", a ); printf("%d\n", b ); a = ++c + ++c; printf("%d\n", a ); printf("%d\n", c ); b = 10; a = b++ + b; printf("%d\n", a ); printf("%d\n", b ); a = 10; b = 5; if (a>b || ++b>5) printf("%d\n", b); a = 1; b = 5; if (a>b || ++b>5) printf("%d\n", b); }
14) Diga qual o valor das variáveis a e n após cada linha do seguinte trecho de código C. Justifique suas respostas.
n = 3; a = - n ++; a = - n + 1; a = - n += 1; Capitulo 8
15) Explique as três questões de projeto que envolve o seletor de dois caminhos: – Qual é a forma e o tipo da expressão que controla a seleção? – Como são especificadas as cláusulas então e senão?
– Como o significado dos seletores aninhados deve ser especificado? 16) Explique as questões de projeto que envolve o seletor de múltiplos caminhos. 17) Faça uma comparação entre os laços controlados por contadores da linguagem C e Fortran. Use as questões de projeto para fazer essa análise.
18) O que são controles pós e pre-testes no laços controlados logicamente? 19) Explique qual a diferença entre os desvios incondicionais break e continue. 20) Modifique o seguinte trecho de código para que ele realize a semântica sugerida pela sua disposição textual.
Ciência da Computação
Disciplina: Paradigmas de Programação Professor: Bruno Ferreira
Atividade: Exercício de Revisão if ( x == 7 )
if ( y == 11) z = 13; else z = 17;
21) Analise o seguinte programa em C, identificando o que ele faz. Faça uma crítica ao estilo de programação utilizado.
main() { int i, j, k; k = 1; for (i = 0; i < 10; i++) { entra: j = 2 * i + 1; printf(“i: %d, j: %d\n”, i, j); } if (k) { k = 0; i = 7; goto entra; } }
22) O que são desvios incondicionais? Qual comando é responsável por esses desvios?
23) O comando goto é empregado para realizar desvios incondicionais no fluxo de controle de programas. Com o advento das técnicas de programação estruturada, este comando foi muito criticado e, por muitas vezes, se sugeriu que linguagens de programação não deveriam incluí-lo entre seus comandos. C é uma linguagem que adota os princípios da programação
estruturada. No entanto, C manteve o goto como um comando da linguagem. Qual a razão dessa decisão? Ele é necessário em alguma ocasião?
Capítulo 9
24) O que significa para um subprograma estar ativo?
25) O que é um perfil de parâmetro? O que é um protocolo de subprograma? 26) O que são parâmetros formais? O que são parâmetro reais?
27) Quais são os três modos semânticos de passagens de parâmetros?
28) Quais são os modos, os modelos conceituais de transferência, as vantagens e as
desvantagens dos seguintes métodos de passagem de parâmetros: por valor, por resultado, por valor-resultado e por referência?
29) Considere o programa escrito na sintaxe de C: void swap(int a, int b){
Ciência da Computação
Disciplina: Paradigmas de Programação Professor: Bruno Ferreira
Atividade: Exercício de Revisão 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 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 a swap?
a) Passadas por valor b)Passadas por referência c) Passadas por valor-entrada
30) Considere o programa escrito em sintaxe 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 métodos de passagem de parâmetros, quais são todos os valores da matriz list após a execução?
a) Passadas por valor b)Passadas por referência c) Passadas por valor-entrada
31) Considerando que sub2 é chamado em sub4 (sub2 é passado como parâmetro). Informe o ambiente de referenciamento e o que imprime sub2. Faça isso para as seguintes vinculações: a) Rasa b) Profunda c) Ad hoc function sub1( ) { var x; function sub2( ) {
alert(x); //função de impressão };
Ciência da Computação
Disciplina: Paradigmas de Programação Professor: Bruno Ferreira
Atividade: Exercício de Revisão var x; x = 3; sub4(sub2); }; function sub4(subx) { var x; x = 4; subx(); }; x = 1; sub3(); }