Lista de Exercícios - Unidade 1
Lista de Exercícios - Unidade 1
Lista de Exercícios - Unidade 1
Gerais
1. Explique a diferença entre um TAD e uma ED. Exemplifique.
4. Estruturas de dados, tais como filas e pilhas, são utilizadas em diversas aplicações
para automação industrial por meio de linguagens de programação textuais. O texto
estruturado (ST) é uma das opções de linguagem de programação definidas pela
norma IEC 61131-3. O trecho de código a seguir foi implementado nesse contexto.
CENTRO DE TECNOLOGIA
DEPARTAMENTO DE ENGENHARIA DE COMPUTAÇÃO E AUTOMAÇÃO
É correto afirmar que a estrutura de dados e a funcionalidade desse código tratam-se de:
a) uma fila que processa primeiro os eventos mais antigos.
b) uma pilha que processa primeiro os eventos mais antigos.
c) uma pilha que processa primeiro os eventos mais recentes.
d) uma pilha que processa os eventos na ordem escolhida pelo operador.
e) uma fila que processa os eventos de acordo com seu respectivo grau de prioridade.
CENTRO DE TECNOLOGIA
DEPARTAMENTO DE ENGENHARIA DE COMPUTAÇÃO E AUTOMAÇÃO
Listas
1. Na linguagem GoLang, use a interface IList definida abaixo e programe as seguintes
estruturas de dados: ArrayList, LinkedList, DoublyLinkedList. (replit)
type IList interface {
Add(value int)
AddOnIndex(value int, index int) error
RemoveOnIndex(index int) error
Get(index int) (int, error)
Set(value int, index int) error
Size() int
}
3. Cite uma vantagem e uma desvantagem do array list em relação à lista ligada.
4. Cite uma vantagem e uma desvantagem da lista duplamente ligada em relação à lista
ligada.
CENTRO DE TECNOLOGIA
DEPARTAMENTO DE ENGENHARIA DE COMPUTAÇÃO E AUTOMAÇÃO
5. Escreva uma função in-place para inverter a ordem de um ArrayList.
8. Por que não faz sentido adicionarmos uma cauda (tail) em LinkedLists?
CENTRO DE TECNOLOGIA
DEPARTAMENTO DE ENGENHARIA DE COMPUTAÇÃO E AUTOMAÇÃO
Pilhas
1. Na linguagem GoLang, use a interface IStack definida abaixo e programe as seguintes
estruturas de dados: ArrayStack, LinkedListStack. (replit)
type IStack interface {
Push(value int)
Pop() (int, error)
Peek() (int, error)
IsEmpty() bool
Size() int
}
3. Escreva uma função que detecta se uma certa combinação de parênteses está
balanceada. Dica 1: usar uma pilha. Dica 2: pensar nos casos de sucesso e casos de
falha antes da implementação
4. Uma pilha é uma estrutura de dados que armazena uma coleção de itens de dados
relacionados e que garante o seguinte funcionamento: o último elemento a ser inserido
é o primeiro a ser removido. É comum na literatura utilizar os nomes push e pop para
as operações de inserção e remoção de um elemento em uma pilha respectivamente. O
seguinte trecho de código em linguagem C define uma estrutura de dados pilha
utilizando um vetor de inteiros, bem como algumas funções para sua manipulação.
CENTRO DE TECNOLOGIA
DEPARTAMENTO DE ENGENHARIA DE COMPUTAÇÃO E AUTOMAÇÃO
#include <stdlib.h>
#include <stdio.h>
typedef struct {
int elementos[100];
int topo;
}pilha;
pilha * cria_pilha() {
pilha * p =malloc(sizeof(pilha));
p->topo = -1;
return pilha;
}
void push(pilha *p, int elemento) {
if (p->topo >= 99)
return;
p->elementos[++p->topo] = elemento;
}
int pop(pilha *p) {
int a = p->elementos[p->topo];
p->topo--;
return a;
}
O programa a seguir utiliza uma pilha.
int main() {
pilha * p = cria_pilha();
push(p, 2);
push(p, 3);
push(p, 4);
pop(p);
push(p, 2);
int a = pop(p) + pop(p);
push(p, a);
a += pop(p);
printf("%d", a);
return 0;
}
a) I, apenas.
b) III, apenas.
CENTRO DE TECNOLOGIA
DEPARTAMENTO DE ENGENHARIA DE COMPUTAÇÃO E AUTOMAÇÃO
c) I e II, apenas.
d) II e III apenas.
e) I, II e III.
CENTRO DE TECNOLOGIA
DEPARTAMENTO DE ENGENHARIA DE COMPUTAÇÃO E AUTOMAÇÃO
Filas
1. Mencione algumas aplicações de Filas.
4. Escreva uma função que retorne a quantidade de elementos inseridos em uma Fila
implementada com vetor. Escreva a função Size( ) considerando que o struct
ArrayQueue não contém a variável size, como apresentado na tabela a seguir.
Lembre-se que os índices de front e rear inicialmente assumem o valor -1, e que o
ArrayQueue tem um caráter circular.
// versao recursiva
func bin_search(val int, list []int, start int, end int) int
// ou versao iterativa
func bin_search(val int, list []int) int
// versao recursiva
func rev_bin_search(val int, list []int, start int, end int) int
// ou versao iterativa
func rev_bin_search(val int, list []int) int
5. Suponha que você queira criar uma nova implementação do TAD List que sempre se
mantém ordenada: OrderedList. Uma forma de fazer isso seria anulando a função
que permite adicionar em uma posição arbitrária, AddOnIndex, e ajustar a
implementação de Add(value int) para que ela sempre adicionasse value na posição
correta da lista. Proveja a implementação das funções de OrderedList, apresentadas na
tabela a seguir.
6. Qual estratégia você usou para encontrar a posição correta a ser adicionada o novo
valor? Justifique sua escolha.
8. A linguagem Python não permite alguns tipos de otimização como, por exemplo, a
recursão em cauda e, devido à sua natureza dinâmica, é impossível realizar esse tipo de
otimização em tempo de compilação tal como em linguagens funcionais como Haskell
ou ML.
Disponível em: http://www.python-history.blogspot.com/2009/04/origins-of-pythons-functional-features.html
Acesso: em 15 jun. 2019 (adaptado).
1. #include <stdio.h>
2. #define TAM 10
3. int funcaol(int vetor[], int v){
4. int i;
5. for (i = 0; i < TAM; i++){
6. if (vetor[i] == v)
7. return i;
8. }
9. return -1;
10. }
11.int funcao2(int vetor[], int v, int i, int f){
CENTRO DE TECNOLOGIA
DEPARTAMENTO DE ENGENHARIA DE COMPUTAÇÃO E AUTOMAÇÃO
12. int m = (i + f) / 2;
13. if (v == vetor[m])
14. return m;
15. if (i >= f)
16. return -1;
17. if (v > vetor[m])
18. return funcao2(vetor, v, m+l, f);
19. else
20. return funcao2(vetor, v, i, m-1);
21.}
22.int main(){
23. int vetor[TAM] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
24. printf(“%d - %d”, funcao1(vetor, 15), funcao2(vetor, 15,
0, TAM-1));
25. return 0;
26.}