Notas:
grupo1.c
, grupo2.c
, grupo3.c
e grupo4.c
. [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 |