instituto superior t ecnico algoritmos e estruturas de dados · c. est est d. test test e. st test...

13
Instituto Superior T ´ ecnico Algoritmos e Estruturas de Dados Ano Lectivo de 2005/2006 2 o Semestre 1 o Teste A - 8 de Abril de 2006 Dura¸ ao: 2h - O teste ´ e sem consulta. - Para cada quest˜ ao com escolha m´ ultipla deve escolher apenas uma das hip´ oteses apresentadas. - Nas quest˜ oes onde deve responder verdadeiro ou falso, (assinale V ou F, ou deixe em branco se preferir n˜ ao responder). - No final deve preencher a grelha das solu¸ oes (1 a agina) com o n´ umero da re- sposta escolhida para cada quest˜ ao com escolha m´ ultipla. - Para as quest˜ oes com escolha m´ ultipla, s´ o ser˜ ao avaliadas as respostas leg´ ıveis apresentadas na grelha. - Nas quest˜ oes de escolha m´ ultipla cada resposta errada ´ e cotada negativamente com um valor - 1 n-1 onde n ´ e o n´ umero de op¸ oes. - Certifique-se que a sua identifica¸ ao est´ a leg´ ıvel na primeira folha do enunciado. Grelha I. a) h i I. b) h i I. c) h i II. a) h i II. b) h i III. a) h i III. b) h i III. c) h i IV. a) h i IV. b) h i V. a) h XXX i V. b) h XXX i umero: Nome: 1/13 1

Upload: phamdiep

Post on 18-Jan-2019

214 views

Category:

Documents


0 download

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