Notas:
grupo2.c
e grupo3.c
. [6,0] Grupo I
Teoria
Listagem 1:
int i = 1, a = 3, b = 1, aux; #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define ORDENA(a, b, aux) ((a) > (b) ? ((aux)=(a),(a)=(b),(b)=(aux)) : (b))
[2,0] 1. Supondo as definições da Listagem 1, qual o valor
das seguintes expressões e que valor tomam as variáveis
envolvidas depois do cálculo?
a) MAX(i++, 0)
b) MAX(i = b, a)
c) ORDENA(a, b, aux)
[2.0] 2.
a) Qual a diferença entre os ciclos while
e do
while
?
b) Reescreva o seguinte fragmento de código de modo a usar o
ciclo while
:
int c; do { c = getchar(); if(c != EOF) putchar(c); } while(c != EOF);
c) Reescreva o fragmento anterior usando um ciclo for
.
d) Reescreva o seguinte fragmento de código de modo a usar o
ciclo do while
:
int n, valor = 13; printf("Adivinhe:"); scanf("%d", &n); while(n != valor) { if(n > valor) printf("Muito grande!\nAdivinhe:"); else if(n < valor) printf("Muito pequeno!\nAdivinhe:"); scanf("%d", &n); } printf("Acertou!\n");
[2,0] 3. O que imprime a chamada func("Ola
mundo!")
?
void func(char *cadeia) { if(*cadeia != '\0') { func(cadeia+1); putchar(*cadeia); } }
[8,0] Grupo II
Programação - Listas
Admita o seguinte troço de código:
#include <stdlib.h> #include <stdio.h> typedef struct elemento { int valor; struct elemento *proximo; } Lelemento; typedef struct { unsigned long numero; /* numero de elementos na lista. */ Lelemento *primeiro; } Lista; Lista *Lcria(void) { Lista *l; if((l = malloc(sizeof(*l))) == 0) return 0; l->numero = 0; l->primeiro = NULL; return l; }
[1,5] 1. Escreva uma função Lista *Linsere(Lista *l,
int valor)
que insira valor
na lista l
(num lugar arbitrário). Deve devolver a lista l
ou NULL
em caso de erro.
[5,5] 2. Escreva uma função Lista *Ltransfere(Lista
*lista1, unsigned long i1, Lista *lista2, unsigned long i2,
unsigned long quantos)
que transfira quantos
elementos da lista lista2
, a partir do elemento i2
(inclusivé), para a lista lista1
imediatamente
antes do elemento i1
(o primeiro elemento é o
elemento zero). Para transferir os elementos para o final da
lista lista1
especifica-se i1 =
lista1->numero
. Verifique se os valores i1
,
i2
e quantos
são compatíveis com o
tamanho de cada uma das listas! Deve devolver a lista lista1
ou NULL
em caso de erro.
[1,0] 3. Escreva um programa que:
a) Vá inserindo valores inteiros pedidos ao utilizador em duas
listas (as inserções em cada lista terminam com o primeiro
valor negativo).
b) Imprima os valores em cada uma das listas.
c) Transfira elementos duma lista para outra, perguntando ao
utilizador os locais de onde e para onde transferir e o número
de elementos a tranferir.
d) Imprima os valores em cada uma das listas, de modo a poder-se
verificar se a transferência foi correctamente efectuada.
[6,0] Grupo III
Programação - Recursividade, funções e ciclos
[1,0] 1. Escreva uma função recursiva double
potencia(double x, unsigned n)
que calcule a potência n
de x
.
[4,5] 2. Seja a sucessão x(k) definida
recursivamente como x(k) = x(k-1) + (v/[x(k-1)]^(n-1)-x(k-1))/n
e x(0)=1. É possível mostrar que o limite desta
sucessão é a raiz n de v, ou seja v^(1/n).
Escreva uma função double raiz(double v, unsigned n)
que calcule, duma forma iterativa, a raiz n
de v
usando a fórmula recursiva indicada. Faça uso da função
potência definida na questão 1. O cálculo da sucessão deve
parar quando o valor absoluto do termo (v/[x(k-1)]^(n-1)-x(k-1))/n
for inferior a uma tolerância (e.g. define TOL 1e-6
).
Nota: A expressão a^b significa "potência b de a".
[0,5] 3. Faça um programa que teste a função acima,
comparando os resultados de raiz()
, chamada na forma
raiz(v, n)
, com os da função pow()
(da biblioteca padrão - incluir math.h
), chamada na
forma pow(v, 1.0/n)
.
Página
concebida e mantida por Eng. Manuel Menezes de Sequeira (última actualização 2006/07/07) Copyright © 1996-2001 ISCTE |