Instituto Superior T´
ecnico
Introdu¸
c˜
ao aos Algoritmos e Estruturas de Dados
Ano Lectivo de 2004/2005
2
oSemestre
1
oTeste A - 30 de Abril de 2005
Dura¸c˜
ao: 2h
- O teste ´e sem consulta.
- Para cada quest˜ao com escolha m´ultipla deve escolher apenas uma das hip´oteses apresentadas.
- No final deve preencher a grelha das solu¸c˜oes (1a p´agina) com o n´umero da res-posta 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 −n−11 onde n ´e o n´umero de op¸c˜oes.
- Certifique-se que a sua identifica¸c˜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 XXX i IV. b) h XXX i V. a) h XXX i V. b) h XXX i
I. (1.5+1.5+2.0 = 5.0 val.)
a) Considere o seguinte programa em C.
1 #include <stdio.h> 2 3 #define M 15 4 5 int main() { 6 7 int i = 0; 8 real j; 9 10 while (i++ < M) 11 { 12 if (i % 2 != 0) 13 printf("%3d - I ", i); 14 else 15 printf("%3d - P ", i); 16 } 17 printf("\n"); 18 19 for(j = M, j > 0; --j) 20 { 21 if (i % 3 != 0) 22 printf("%3d - NM3 ", j); 23 else 24 printf("%3d - M3 ", j); 25 } 26 printf("\n"); 27 28 return 0; 29 }
Quais das seguintes linhas dar˜ao erro quando este programa for compilado ? a. 7 e 25
b. 12 e 21 c. 3 e 8 d. 8 e 19
b) Qual das seguintes declara¸c˜oes pode ser usada para declarar uma tabela com 10 posi¸c˜oes de apontadores para n´umeros de v´ırgula flutuante?
a. float arr[*10]; b. float arr[5 + 5]; c. float *arr[10]; d. float *arr[sizeof(float)]; e. float [10] arr; f. double arr[10];
c) Considere o seguinte programa em C: 1 int main() 2 { 3 int i; 4 int j; 5 int *p; 6 int *q; 7 int v[10]; 8 9 i = 0; 10 p = &i; 11 *j = p; 12 q = v + 1; 13 ++p; 14 j = *q; 15 q = v[&q]; 16 17 return 0; 18 }
Quais das seguintes linhas dar˜ao erro quando este programa for compilado ? a. 10, 11 e 12 b. 11 e 15 c. 8 e 11 d. 8 e 13 e. 15 e 16 f. 10 e 11
II. (1.5+1.5 = 3.0 val.)
a) Considere o seguinte programa em C: #include <stdio.h>
void ppp(int v[], int t) {
int i;
for (i = 0; i < t; ++i) v[i] = t - i;
}
void sss(int v[], int t) { int i; for (i = 0; i < t; ++i) v[i] = v[t - i - 1]; } int main() { int x[10]; ppp(x,10); sss(x,10); printf("%d %d %d\n", x[0], x[2], x[4]); return 0; }
Quais os valores escritos pelo programa? a. 0 2 4 b. 3 2 1 c. 4 3 2 d. 2 4 6 e. 1 3 5 f. 0 0 0 g. 4 2 0
b) Considere o seguinte programa em C: #include <stdio.h> int abcd(int *v) { int *p = v; int c = 0; while (*p != 0) { if (*p % 2 != 0) ++c; ++p; } return c; } int main() { int x[] = {10, 21, 34, 56, 87, 0}; int y[] = {5, 28, 23, 12, 14, 18, 22, 0}; printf("%d\n", abcd(x) + abcd(y));
return 0; }
Qual o valor escrito pelo programa? a. 5 b. 12 c. 14 d. 0 e. 10 f. 4 g. 1
III. (1.5+1.5+1.0 = 4.0 val.)
a) Considere o seguinte programa em C: #include <stdio.h>
int ccc1(char *s, char t) { int c = 0; while (*s != ’\0’) { if (*s == t) ++c; ++s; } return c; }
int ccc2(char *s, char *v) { int c = 0; while (*s != ’\0’) { c += ccc1(v, *s); ++s; } return c; } int main() {
printf("%d\n", ccc2("cebolas", "ceroulas")); return 0;
}
Qual o valor escrito pelo programa? a. 8 b. 7 c. 15 d. 6 e. 10 f. 1 g. 0
b) Considere o seguinte programa em C: #include <stdio.h>
int c;
void tpu(float f[], int i, int t) { ++c; if (i >= t) return; else { i++; tpu(f,i+1,t); } } int main() { float v[] = {1, 2, 3, 4, 5, 6, 7, 8, 9 ,10}; c = 0; tpu(v,0,10); printf("%d\n", c); return 0; }
Quantas vezes ´e chamada a fun¸c˜ao tpu? a. 4 b. 5 c. 6 d. 10 e. 9 f. 8 g. 7
c) Indique qual o valor escrito pelo seguinte programa em C: #include <stdio.h> #include <stdlib.h> struct tt { int x; struct tt *p; }; typedef struct tt *ll; typedef struct tt ss; int main() { int i; ll p = (ll )malloc(sizeof(ss)); ll t = (ll )malloc(sizeof(ss)); ll q = (ll )malloc(sizeof(ss)); ll n; p->p = t; t->p = q; q->p = p; n = p; for (i = 0; i < 25; ++i) { n->x = i; n = n->p; } printf("%d\n", t->x); free(p); free(t); free(q); return 0; } a. 9 b. 22 c. 100 d. 72 e. 15 f. 1 g. 28
IV. (2.0+2.0 = 4.0 val.)
a) Implemente a fun¸c˜ao int pares(int *v, int t) em C que, dado um vector de
inteiros e um inteiro com o seu tamanho, retorna a quantidade de n´umeros pares no vector.
b) Implemente a fun¸c˜ao int iguais(float *v, float *f, int tv, int tf) em C que, dado dois vectores de floats, v e f, e os seus tamanhos, tv e tf, retorna retorna o n´umero de valores em v que tamb´em est˜ao em f. Assuma que cada vector n˜ao contem n´umeros repetidos.
V. (2.0+2.0 = 4.0 val.)
a) Implemente a fun¸c˜ao recursiva int soma(int *v, int t) em C que, dado um
b) Implemente a fun¸c˜ao
void junta(float *a, float *b, float *c, int ta, int tb)
em C que recebe 3 vectores de floats, a, b e c e dois inteiros, ta e tb, e insere no vector c os elementos de a e b por ordem crescente.
Assuma que:
• os vectores a e b contˆem, respectivamente, ta e tb valores; • os vectores a e b j´a est˜ao ordenados por ordem crescente; • o vector c tem espa¸co suficiente para conter ta+tb valores. A solu¸c˜ao apresentada dever´a ser o mais eficiente poss´ıvel.