ISCTE, IGE, PROGRAMAÇÃO II


Ano lectivo de 1995/96 - Exame de 15 de Julho de 1996


Notas:

  1. A cotação completa de cada grupo/questão/alínea é indicada junto.
  2. O exame pode ser realizado com consulta.
  3. Todo o exame será resolvido no computador.
  4. Trabalhe sempre na disquete e guarde os ficheiros com frequência.
  5. As respostas a cada um dos 4 grupos do exame devem ser colocadas em quatro ficheiros separados de nomes grupo1.c, grupo2.c, grupo3.c e grupo4.c.
  6. Não se esqueça de identificar a disquete e, por meio de um cabeçalho (em comentário), cada um dos ficheiros.
  7. Nas respostas às perguntas teóricas pode e deve usar caracteres portugueses.

[5,0] Grupo I

Teoria

Listagem 1:

#define MULT1(a, b) a * b
#define MULT2(a, b) (a * b)
#define MULT3(a, b) ((a) * (b))

[2,0] 1. Considere as definições de macros na Listagem 1:
a) Qual das definições é a mais correcta?
b) O que imprime a chamada printf("%d\n", 8 / MULT1(1, 4))?
c) O que imprime a chamada printf("%d\n", MULT2(1+1, 2)) ?

[1.0] 2. Suponha que tem definidas a seguintes funções:

void f1(int *val)
{
    *val = 1;
}
void f2(int val)
{
    val = 2;
}

e suponha o seguinte fragmento do programa:

int a = 0, b = 0;
f1(&a);
f2(&b);
printf("%d, %d\n", a, b);

a) Corrija um (único) erro no fragmento de programa.
b) Diga o que imprime o fragmento de programa depois de corrigido.

[2,0] 3. O que imprime a chamada func(4)?

int func(int n)
{
    int res;
    if(n <= 0) 
        return 0; 
    printf("%d\n", res= n + func(n-1));
    return res;
}

[6,0] Grupo II

Programação - Listas

[0,5] 1. Defina os tipos (por exemplo, Lelemento e Lista) necessários para se concretizar uma lista simplesmente ligada, não genérica, em que cada elemento guarda um valor inteiro.

[0,5] 2. Escreva uma função (por exemplo, Lista *Lcria(void)) que crie uma nova lista vazia.

[3,0] 3. Escreva uma função (por exemplo, Lista *Linsere(Lista *l, int valor)) que insira um novo elemento, com o valor inteiro valor passado como argumento, na lista. A inserção deve ser feita de modo a que os valores na lista estejam sempre ordenados por ordem crescente.

[2,0] 4. Escreva um programa que vá inserindo numa lista valores inteiros pedidos ao utilizador (as inserções terminam com o primeiro valor negativo). No final, o programa deve percorrer a lista imprimindo todos os valores (de modo a se verificar se as inserções garantiram a ordenação da lista).


[6,0] Grupo III

Programação - Ficheiros binários

[6,0] Realize um programa que vá escrevendo num ficheiro binário numeros.bin valores inteiros lidos do teclado até ser introduzido o primeiro valor negativo. Depois da inserção, o programa deverá colocar os valores do ficheiro por ordem crescente (usando o algoritmo do exemplo 6P10, do livro "Programação com Linguagem C", João Gonçalves). A ordenação deve ser realizada directamente no ficheiro, e não lendo todos os valores para uma matriz!

Lembre-se que para ler ou escrever um registo de ou para a posição i do ficheiro se deve colocar o ponteiro de ficheiro na posição correcta usando fseek(ficheiro, tamanho_registos * i, SEEK_SET).


[3,0] Grupo IV

Programação - Recursividade, funções e ciclos

[0,5] 1. Escreva uma função recursiva double fact(int n) que calcule o factorial de n.

[2,0] 2. Sabendo que seno(x) = x - x^3/3! + x^5/5! + ... + (-1)^n x^(2n+1) / (2n+1)! ..., escreva uma função double seno(double x, double tol) que calcule, utilizando a expressão acima, o valor aproximado do seno de x. A soma deve ser parada quando o valor absoluto do termo (-1)^n x^(2n+1) / (2n+1)! for inferior ou igual a tol.

Nota: A expressão x^n significa "potência n de x", e pode ser calculada por intermédio da função double pow(double x, double n) (incluir math.h)

[0,5] 3. Faça um programa que teste a função acima, comparando os seus resultados com os da função sin() (da biblioteca padrão) - incluir math.h.

Nota: testar com valores não demasiado grandes de x e com tolerâncias tol da ordem de 1e-5.


Página concebida e mantida por Eng. Manuel Menezes de Sequeira (última actualização 2006/07/07)
Copyright © 1996-2001 ISCTE