Programação Imperativa — Teste, 27 de Maio de 2026
1. Strings (3 valores)
Defina uma função int parentesis_ok ( char exp[]) que, dada uma string onde está armazenada uma expressão aritmética com parêntesis, testa se os parêntesis estão
corretos. Por exemplo, se a expressão for "31 + ((2 - 13) - x) + 114" a função deve retornar verdadeiro (1), enquanto que para a expressão "31 + (2 - (13 + 4))) + ((2 - x) + 114" deve retornar falso (0).
int parentesis_ok2(char exp[]) {
int balance = 0;
for (int i = 0; i < strlen(exp); i++) {
if (exp[i] == '(')
balance++;
if (exp[i] == ')') {
balance--;
if (balance < 0)
return 0;
}
}
return (balance == 0) ? 1 : 0;
}2. Arrays (3 valores)
Assuma que existe uma função int random( int N) que devolve um número aleatório entre 0 e N-1 . Defina uma função void sorteia( int a[], int N) que, dado N > 0 ,
preenche o array a , de tamanho N , com todos os números de 0 a N-1 , colocados em
posições aleatórias. No final, cada um desses números deve aparecer exatamente uma
vez no array. Por exemplo, se N == 5 , o array poderá ficar com os valores {3, 0, 4, 1, 2} ou {1, 4, 2, 0, 3} , mas não poderá ficar com {1, 1, 2, 3, 4}. Tente minimizar o número de invocações à função random.
void sorteia(int a[], int N) {
int i;
for (i = 0; i < N; i++)
a[i] = i;
for (i = N - 1; i > 0; i--) {
int j = myRandom(i + 1);
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}3. Ordenação de arrays (1 + 2 = 3 valores)
1.
Defina a função int minInd ( int v[], int N) que, dado um array v com N elementos ( N>0 ) calcula um índice do array onde está armazenado o menor elemento do array v.
int minInd(int v[], int N) {
int i, m = 0;
for (i = 1; i < N; i++)
if (v[i] < v[m])
m = i;
return m;
}2.
Defina a função void minSort ( int v[], int N) que ordena um array de N inteiros por sucessivas chamadas à função minInd .
void minSort(int v[], int N) {
int i, m;
for (i = 0; i < N - 1; i++) {
m = minInd(v + i, N - i);
int temp = v[i];
v[i] = v[m + i];
v[m + i] = temp;
}
}4. Listas ligadas (3 valores)
Defina uma função int quantosMaiores ( LInt l) que, dada uma lista não vazia ,
calcula quantas vezes ocorre na lista o maior elemento.
typedef struct no {
int valor;
struct no *prox;
} *LInt;int quantosMaiores(LInt l) {
int i = 1, maior = l->valor;
for (l = l->prox; l != NULL; l = l->prox) {
if (l->valor > maior) {
maior = l->valor;
i = 1;
} else if (l->valor == maior)
i++;
}
return i;
}5. Ordenação de listas (3 + 2 = 5)
1.
Defina a função LInt retiraMaior ( LInt*l) que retira da lista *lo nodo onde se encontra o maior elemento da lista. A função retorna o endereço do nodo removido.
LInt retiraMaior(LInt *l) {
if (*l == NULL)
return NULL;
LInt *curr = l;
int maior = (*curr)->valor;
while (*curr != NULL) {
if ((*curr)->valor > maior)
maior = (*curr)->valor;
curr = &((*curr)->prox);
}
curr = l;
while ((*curr)->valor != maior) {
curr = &((*curr)->prox);
}
LInt r = *curr;
*curr = (*curr)->prox;
return r;
}2.
Defina a função LInt maxSort ( LInt l) que ordena uma lista por sucessivas chamadas à função retiraMaior.
LInt maxSort(LInt l) {
LInt r, m;
r = NULL;
while (l != NULL) {
m = retiraMaior(&l);
m->prox = r;
r = m;
}
return r;
}6. Árvores binárias (3 valores)
Relembre a função void mirror (ABin a) que inverte uma árvore binária. Uma árvore diz-se simétrica se for igual à sua inversa. Defina a função int simetrica (ABin a) que testa se uma árvore é simétrica.
typedef struct nodo {
int valor;
struct nodo *esq, *dir;
} * ABin; void mirror(ABin a) {
ABin t;
if (a != NULL) {
mirror(a->esq);
mirror(a->dir);
t = a->esq;
a->esq = a->dir;
a->dir = t;
}
}int iguais(ABin a, ABin b) {
if (a == NULL && b == NULL)
return 1;
if (a == NULL || b == NULL)
return 0;
return (a->valor == b->valor && iguais(a->esq, b->esq) &&
iguais(a->dir, b->dir));
}
int iguaisM(ABin a, ABin b) {
if (a == NULL && b == NULL)
return 1;
if (a == NULL || b == NULL)
return 0;
return (a->valor == b->valor && iguais(a->esq, b->dir) &&
iguais(a->dir, a->esq));
}
int simetrico(ABin a) { return iguaisM(a, a); }