You are on page 1of 5

MAC 122 - PDA

2. Semestre de 2.010 - prof. Marcilio – IME USP BMAC


Primeira Prova – 07 de Outubro de 2.010

Questão 1 2 3 4 5 Total
Valor 2.0 2.0 2.0 2.0 2.0 10,0
Nota

Nome:___________________________________________ NUSP:_____________

Questão 1 (2 pontos):

Considere os seguintes operadores aritméticos e lógicos do C e respectivas prioridades (1 é a menor


prioridade e 6 é a maior):

|| && == < > + - * /


1 2 3 4 4 5 5 6 6

Traduza as seguintes expressões para a notação pós fixa:

1) A > B || C < D

A B > C D < ||

2) A > B && C == D || E

A B > C D == && E ||

3) A * B && (C > D || E + F < G)

A B * C D > E F + G < || &&

4) A || B && C / (D + E) * F

A B C D E + / F * && ||
Questão 2 (2 pontos):

Considere o seu NUSP = ABCDEFG. Exemplos:


NUSP = 4356407 então A=4, B=3, C=5, D=6, E=4, F=0, G=7
NUSP = 987654 então A=0, B=9, C=8, D=7, E=6, F=5, G=4

Calcule o valor numérico das seguintes expressões em notação pós-fixa.


Lembre-se que nas expressões lógicas, o valor 0 é falso e o valor diferente de 0 é verdadeiro e que o
resultado falso é 0 e resultado verdadeiro é 1.

É o mesmo que foi calculado no EP1, com os novos operadores: >, <,|| e && e levando em conta a
equivalência entre os valores lógicos e numéricos. Supondo NUSP = 4356407.

1) A B < C *

A B < C *

3 5
4 4 0 0 0

2) A B C + D || &&

A B C + D || &&

5 6
3 3 8 8 1
4 4 4 4 4 4 1

3) A B C D && * + E F || +

A B C D && * + E F || +
6
5 5 1 0
3 3 3 3 3 4 4 1
4 4 4 4 4 4 7 7 7 7 8

4) A B + C * D E F G * + * &&

A B + C * D E F G * + * &&
7
0 0 0
4 4 4 4 4
3 5 6 6 6 6 6 6 24
4 4 7 7 35 35 35 35 35 35 35 35 1
Questão 3 (2 pontos):

Considere uma lista ligada, na qual os elementos têm a seguinte definição:

typedef struct elem * link;


struct elem {
int info;
link prox;
};

As funções abaixo devem contar quantos elementos da lista possuem o campo info igual a x.
Diga quais as que estão certas e quais estão erradas.
Escreva na linha que antecede cada uma a palavra: certa ou errada

a) Certa
int conta(link p,int x) {
link t = p; int k=0;
while (t != NULL) {
if (t->info == x) k++;
t = t->prox;
}
return k;
}

b) Errada – Não funciona para lista vazia e não considera o último elemento)
int conta(link p,int x) {
link t = p; int k=0;
while (t->prox != NULL) {
if (t->info == x) k++;
t = t->prox;
}
return k;
}

c) Certa
int conta(link p,int x) {
link t; int k;
for (t=p,k=0; t!=NULL; t=t->prox)
if(t->info == x) k++;
return k;
}

d) Errada - Não funciona para lista vazia e para no primeiro igual a x)


int conta(link p,int x) {
link t=p; int k=0;
while (t->info!=x) {
t=t->prox;
if (t->info==x) k++;
}
return k;
}
Questão 4 (2pontos):

O tipo conjunto de inteiros ConjInt é definido da seguinte forma:

#define MAX 1000


typedef struct cj * ConjInt;
struct cj {
int info[MAX+1];
};

O primeiro elemento do vetor info[0] contém a quantidade de elementos do conjunto e os demais


elementos info[1], info[2],... , contém os elementos do conjunto.

A função abaixo cria um novo conjunto vazio.

ConjInt vazio() {
ConjInt t=malloc(sizeof(struct cj));
t->info[0]=0;
return t;
}

a) Escreva uma função int Pertence(ConjInt C,int X) que devolve 0 se X não pertence a C e 1
se pertence.

int Pertence(ConjInt C,int X) {


int i,k;
k=C->info[0]; /* número de elementos de C */
for(i=1;i<=k;i++)
if(C->info[i]==X) return 1;
return 0;
}

b) Escreva uma função ConjInt Inter(ConjInt A, ConjInt B) que devolve o conjunto


intersecção de A e B. Use a função Pertence acima.

ConjInt Inter(ConjInt A, ConjInt B) {


int i,k,k1;
ConjInt C;
k=A->info[0];
C=Vazio();
for (i=1;i<=k;i++)
if(Pertence(B,A->info[i])) {
/* insere este elemento em C */
k1=++C->info[0];
C->info[k1]=A->info[i];
}
return C;
}
Questão 5 (2 pontos):

Considere a seguinte função:

int F(int X) {
int i,s=0;
for (i=1;i<=X;i++) s=s+i*i;
return s;
}

A função F(X) retorna a soma 12 + 22 + 32 + ... + X2

a) Qual o valor de F(3), F(2) e F(-2)

F(3) = 14
F(2) = 5
F(0) = 0

b) Faça uma função recursiva equivalente à função acima.

int f(int X) {
if (X<=0) return 0;
return X*X + f(X-1);
}