instituto superior t ecnico algoritmos e estruturas de dados · c. est est d. test test e. st test...
TRANSCRIPT
Instituto Superior Tecnico
Algoritmos e Estruturas de Dados
Ano Lectivo de 2005/2006 2o Semestre
1o Teste A - 8 de Abril de 2006 Duracao: 2h
- O teste e sem consulta.- Para cada questao com escolha multipla deve escolher apenas uma das hipoteses
apresentadas.- Nas questoes onde deve responder verdadeiro ou falso, (assinale V ou F, ou deixe
em branco se preferir nao responder).- No final deve preencher a grelha das solucoes (1a pagina) com o numero da re-
sposta escolhida para cada questao com escolha multipla.- Para as questoes com escolha multipla, so serao avaliadas as respostas legıveis
apresentadas na grelha.- Nas questoes de escolha multipla cada resposta errada e cotada negativamente
com um valor − 1n−1 onde n e o numero de opcoes.
- Certifique-se que a sua identificacao esta legıvel na primeira folha do enunciado.
Grelha
I. a) 〈 〉
I. b) 〈 〉
I. c) 〈 〉
II. a) 〈 〉
II. b) 〈 〉
III. a) 〈 〉
III. b) 〈 〉
III. c) 〈 〉
IV. a) 〈 〉
IV. b) 〈 〉
V. a) 〈 XXX 〉
V. b) 〈 XXX 〉
Numero: Nome: 1/13
1
I. (2.0+1.5+1.5 = 5.0 val.)
a) Considere o seguinte programa em C.
#include <stdio.h> /* 1 */
#define MAX_LINE 1024 /* 2 */
void processFile(FILE *fp) { /* 4 */
char command[MAX_LINE + 1], line[MAX_LINE + 1], *p, *l; /* 5 */
/* 6 */
while (fgets(line, MAX_LINE + 1, fp)) { /* 7 */
p = command; l = line; /* 8 */
if (p != l) /* 9 */
printf("%s\n", command); /* 10 */
printf("%s\n", l); /* 11 */
else /* 12 */
printf("%s\n", command); /* 13 */
} /* 14 */
} /* 15 */
/* 16 */
int main(int argc, char *argv[]) { /* 17 */
FILE *fp; /* 18 */
char *m = "r"; /* 19 */
if (argc != 2) { /* 20 */
printf("Invalid number of arguments!\n"); /* 21 */
exit(-1); /* 22 */
} /* 23 */
/* 24 */
fp = fopen(argv[1], m); /* 25 */
m = processFile(fp); /* 26 */
return 0; /* 27 */
} /* 28 */
Quais das seguintes linhas darao erro quando este programa for compilado ?
a. 12 e 26
b. 8 e 12
c. 2, 5, 8 e 12
d. 5, 8 e 12
e. 8 e 19
f. 12 e 19
g. 12, 19 e 26
h. 2 e 5
Numero: Nome: 2/13
2
b) Qual das seguintes declaracoes pode ser usada para declarar uma tabela com 10posicoes de apontadores para string (cadeia de caracteres)?
a. string *arr[10];
b. char arr[10];
c. string arr[10*sizeof(string)];
d. char arr[11];
e. string arr[10];
f. char **arr;
g. char *arr[10];
Numero: Nome: 3/13
3
c) Considere o seguinte programa em C:
#include <stdio.h>
#include <stdlib.h>
#define MK 01
int c(unsigned int n) {
unsigned int j = MK;
int r = 0, m = -1;
for (r = 0; j; j <<= 1, r++)
if ((j & n) != 0)
m = r;
return m;
}
int main(int argc, char ** argv) {
int s = atoi(argv[1]);
printf("%d\n", c(s));
return 0;
}
Apos a sua execucao com o argumento 10 (1010 em binario), qual o output apresen-tado?
a. 10
b. 3
c. 5
d. 1
e. 12
f. 9
g. 0
h. 20
i. -1
Numero: Nome: 4/13
4
II. (1.5+1.5 = 3.0 val.)
a) Considere o seguinte programa em C.
#include <stdio.h>
int f(int x) {
return 3*x + 1;
}
int g(int x) {
return f(2*x) - f(x);
}
int main() {
printf("%d\n", f(g(2)));
return 0;
}
Indique qual e o valor escrito pela execucao deste programa.
a. 11
b. 4
c. 19
d. 21
e. 15
f. 32
g. 7
h. 13
Numero: Nome: 5/13
5
b) Considere a seguinte funcao em C:
int h(int a, int b) {
int *x;
int v[] = {0, 1, 2, 3, 4};
x = v;
x++;
(*x)++;
*x += a;
*x += b;
*(x + 2) = b;
printf("%d %d %d %d\n", v[0], v[1], v[2], v[3]);
return 2 * v[1] + v[0] + v[2] - v[3];
}
Qual o valor retornado por esta funcao quanto recebe os argumentos a = 2 e b = 5?
a. 0
b. 10
c. -2
d. 15
e. 5
f. 9
g. 4
h. 20
Numero: Nome: 6/13
6
III. (1.0+1.5+1.5 = 4.0 val.)
a) Indique qual o resultado impresso pelo seguinte programa em C.
#include <stdio.h>
char *fn(int i, char *s) {
while (i) {
s++;
i--;
}
return s;
}
int main(int argc, char** argv) {
int a = 2;
char c[] = "test";
printf("%s %s\n", fn(a,c), c);
return 0;
}
a. test st
b. st st
c. est est
d. test test
e. st test
f. est test
g. test est
h. st est
Numero: Nome: 7/13
7
b) Indique qual o valor escrito pelo seguinte programa em C:
#include <stdio.h>
int peaceful(int mn, int mx, int sizes[], int s) {
int n = 0, i;
for (i = mn; i <= mx ; i++) {
int j, ok = 1;
for (j = 0; j < s; j++) {
if (i >= 2 * sizes[j] && i <= 10 * sizes[j]) ok = 0;
if (sizes[j] >= 2 * i && sizes[j] <= 10 * i) ok = 0;
}
if (ok) n++;
}
return n;
}
int main() {
int vec[] = {5, 10};
printf("%d\n", peaceful(4, 14, vec, 2));
return 0;
}
a. 14
b. 4
c. 10
d. 0
e. 2
f. 8
g. 6
h. 1
Numero: Nome: 8/13
8
c) Indique qual o valor escrito pelo seguinte programa em C:
#include <stdio.h>
void compute(int vec[], int n, int *v1, int *v2) {
int i;
if (n < 2) {
*v1 = *v2 = -1;
return;
}
if (vec[0] > vec[1]) {
*v2 = 0;
*v1 = 1;
} else {
*v1 = 0;
*v2 = 1;
}
for (i = 2; i < n; i++) {
if (vec[i] > vec[*v1]) {
if (vec[i] > vec[*v2]) {
*v1 = *v2;
*v2 = i;
} else
*v1 = i;
}
}
}
int main() {
int v1, v2, v[] = {3, 5, 7, 0, 9, 15, 12, 13, 7};
compute(v, 9, &v1, &v2);
printf("%d %d\n", v1, v2);
return 0;
}
a. 0 0
b. -1 -1
c. 15 13
d. 13 15
e. 7 5
f. 5 3
g. 3 5
h. 7 6
i. 4 5
Numero: Nome: 9/13
9
IV. (2.0+2.0 = 4.0 val.)
a) Indique qual o resultado escrito pelo seguinte programa C:
#include <stdio.h>
#include <stdlib.h>
struct test {
struct test *next;
int val;
};
int main()
{
int i;
struct test *prim = malloc(sizeof(struct test));
struct test *p = prim;
for (i = 0; i < 8; i++) {
p->val = i;
p->next = malloc(sizeof(struct test));
p = p->next;
}
p->val = 8;
p->next = prim;
for (p = prim, i = 0; i < 20; ++i, p = p->next)
if (p->next->val > p->val)
printf("%d ", p->val);
printf("\n");
return 0;
}
a. 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8
b. 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1
c. 8 7 6 5 4 3 2 1 0 8 7 6 5 4 3 2 1 0
d. 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8
e. 8 7 6 5 4 3 2 1 8 7 6 5 4 3 2 1
f. 8
g. 0
Numero: Nome: 10/13
10
b) Indique qual o resultado escrito pelo seguinte programa C:
#include <stdio.h>
#define M 8
int trp(int *v, int a, int b)
{
int i = *(v+b);
*(v+b) = *(v+a);
return i;
}
int main() {
int v[] = {6, 3, 8, 5, 2, 4, 1, 7};
int *i;
int *j;
for (i = v, j = v + M - 1; i != j; ++i)
{
*i = trp(i,0,1);
printf("%d ", *i);
}
printf("\n");
return 0;
}
a. 6 3 8 5 2 4 1 7
b. 7 1 4 2 5 8 3 6
c. 6 3 8 5 2 4 1
d. 3 8 5 2 4 1 7
e. 1 4 2 5 8 3 6
f. 6 8 2 1
g. 3 5 4 7
Numero: Nome: 11/13
11
V. (2.0+2.0 = 4.0 val.)
a) Realize em C uma funcao int sum3(int v[], int dim) que aceita como argu-mentos uma tabela de inteiros e a respectiva dimensao. A funcao deve retornar 1 casoexistam dois inteiros na tabela que, somados, sejam iguais a um outro elemento dessatabela. Deve retornar 0 caso contrario. Por exemplo, para a entrada {1,-3,5,8,7} o valorretornado deve ser 1. Para a entrada {1,2,4,8,16} o valor retornado deve ser 0.
Na resolucao desta alınea devera ter em conta o seguinte:
• Devera incluir uma explicacao da funcionalidade da funcao proposta.
• Sera dada a cotacao total apenas as solucoes assimptoticamente mais eficientes.
Numero: Nome: 12/13
12
b) Realize em C uma funcao int goldbach(int n) que aceita um numero n (par,maior que 4) e retorna um numero primo que valida a conjectura de Golbach, para n.Este conjectura diz que qualquer numero par superior a 4 e a soma de dois numerosprimos. A sua funcao devera devolver o mais pequeno de dois numeros primos que,somados, dao n. Por exemplo, goldbach(60) devera devolver 7, porque 7+53 = 60. Sehouver varias solucoes, pode devolver qualquer uma delas.
• Devera incluir uma explicacao da funcionalidade da funcao proposta.
• Sera dada a cotacao total apenas as solucoes assimptoticamente mais eficientes.
Numero: Nome: 13/13
13