ATIVIDADE 2 – ADSIS – ESTRUTURA DE DADOS I – 52_2024
QUESTÃO 1
Os ponteiros são elementos fundamentais na linguagem C, conferindo-lhe uma notável flexibilidade e poder. Eles funcionam como variáveis especiais que armazenam endereços de memória de outras variáveis, permitindo acessá-las diretamente. Quando dizemos que um ponteiro “aponta” para uma variável, significa que ele detém o endereço dessa variável na memória. Essa capacidade de apontar para diferentes tipos de variáveis, como inteiros, ponto flutuante, duplos, entre outros, confere aos ponteiros uma versatilidade excepcional.
Fonte: Elaborado pelo professor, 2024.
Dado o contexto, qual a função do operador de referência (&) em estruturas de dados utilizando ponteiros em linguagem C?
Alternativas
Alternativa 1 – Retorna o endereço de memória da variável.
Alternativa 2 – Aloca dinamicamente memória para a variável.
Alternativa 3 – Libera a memória alocada dinamicamente pelo ponteiro.
Alternativa 4 – Retorna o valor contido na posição de memória apontada pelo ponteiro.
Alternativa 5 – Desreferencia o ponteiro, acessando o valor armazenado na posição de memória apontada.
QUESTÃO 2
Pilhas são estruturas de dados lineares nas quais uma regra específica para inserção e remoção de dados deve ser respeitada. A regra é a seguinte: o primeiro elemento a entrar, terá a menor prioridade no momento de sair.
Em suma, o primeiro que entra, é o último que sai.
OLIVEIRA, Pietro Martins de; PEREIRA, Rogério de Leon. Estruturas de Dados I. Maringá: Unicesumar, 2019.
Dessa forma, analise o trecho de código abaixo, no qual apenas a função de inserção na pilha foi programada:
Linha | Código |
01
02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 |
#include <stdio.h>
#define tamanho 10 struct tpilha { int dados[tamanho]; int topo; }; struct tpilha pilha; void push(){ printf(“\nDigite o valor a ser empilhado: “); scanf(“%d”, &pilha.dados[pilha.topo]); pilha.topo++; } |
Com base no exposto, avalie as afirmações que se seguem:
I – Pode-se dizer que, ao inserir um novo elemento nessa pilha, o topo é incrementado em uma unidade.
II – A função push(), da forma como está implementada, poderia gerar erros semânticos caso a pilha esteja lotada, com mais de 10 elementos inseridos na pilha.
III – Da forma como foi implementada a struct tpilha, está faltando, obrigatoriamente, o campo “int ini;”.
De acordo com as afirmações acima, é possível dizer que está(ão) correta(s) a(s) afirmativa(s):
Alternativas
Alternativa 1 – I, apenas.
Alternativa 2 – I e II, apenas.
Alternativa 3 – I e III, apenas.
Alternativa 4 – II e III, apenas.
Alternativa 5 – I, II e III.
QUESTÃO 3
Matrizes são estruturas de dados com mais de uma dimensão que desempenham um papel fundamental em cálculos matemáticos e são amplamente utilizadas na programação para manipular e/ou armazenar conjuntos de dados.
Fonte: Elaborado pelo professor, 2024.
Qual das seguintes afirmações é verdadeira sobre a estrutura de dados em matrizes?
Alternativas
Alternativa 1 – Uma matriz pode ter dimensões variáveis durante a execução do programa.
Alternativa 2 – Acessar um elemento específico em uma matriz tem complexidade de tempo O(n^2).
Alternativa 3 – Uma matriz é uma estrutura de dados que pode conter apenas números inteiros positivos.
Alternativa 4 – Uma matriz é uma estrutura de dados unidimensional que organiza elementos em linhas e colunas.
Alternativa 5 – As operações de adição e subtração de matrizes sempre resultam em outra matriz do mesmo tamanho.
QUESTÃO 4
Os conceitos de variáveis homogêneas e heterogêneas, vetores, matrizes e registros, listas, filas, etc, são os elementos básicos necessários para um processo lógico e estruturado de formação do conhecimento, também para construir estruturas de dados mais avançadas.
Fonte: Elaborado pelo professor, 2024.
Dado o contexto, qual a estrutura de dados é a mais adequada para armazenar informações de alunos, contendo nome, idade, sexo, curso e média final?
Alternativas
Alternativa 1 – Fila
Alternativa 2 – Pilha
Alternativa 3 – Registro
Alternativa 4 – Árvore binária
Alternativa 5 – Lista encadeada
QUESTÃO 5
A alocação dinâmica na memória é um processo essencial em muitas linguagens de programação modernas. Imagine que você está organizando uma festa surpresa para um amigo, e você não sabe exatamente quantas pessoas vão comparecer. Você poderia reservar um espaço em um restaurante que tem capacidade para um número específico de convidados. No entanto, se mais pessoas aparecerem do que o esperado, você pode ficar sem espaço e alguns convidados terão que ficar de fora. Agora, considere a mesma situação, mas desta vez você reserva um salão de festas flexível, onde você pode adicionar mais mesas e cadeiras conforme necessário. Desta forma, você está permitindo que o espaço se adapte ao número de convidados que aparecem. Da mesma forma, a alocação dinâmica, possibilita uma utilização eficiente da memória, evitando desperdício e permitindo que os programas sejam mais flexíveis e adaptáveis.
Fonte: Elaborado pelo professor, 2024.
Com base no contexto apresentado, leia as afirmações a seguir e assinale a afirmativa correta.
Alternativas
Alternativa 1 – Facilitar a depuração de erros de memória durante a execução do programa.
Alternativa 2 – Permitir que os programas reservem espaço de memória conforme necessário durante a execução.
Alternativa 3 – Garantir que a memória do sistema seja totalmente utilizada desde o início da execução do programa.
Alternativa 4 – Restringir o acesso aos dados na memória, tornando o programa mais seguro contra violações de segurança.
Alternativa 5 – Limitar o tamanho máximo dos dados que um programa pode manipular, prevenindo possíveis sobrecargas de memória.
QUESTÃO 6
Ponteiros desempenham um papel crucial quando uma variável precisa ser acessada em diferentes partes de um programa. Nesse contexto, é comum encontrar diversos ponteiros distribuídos por várias seções do código, cada um apontando para a variável que contém os dados necessários. Uma vantagem significativa dessa abordagem é que, se esses dados forem alterados, não há preocupação, pois todos os ponteiros no programa estão direcionados para o endereço onde os dados atualizados residem. Essa flexibilidade oferecida pelos ponteiros é fundamental para garantir a eficiência e a consistência na manipulação de dados em diferentes partes do código.
Considerando o uso de ponteiros em estruturas de dados, analise o seguinte código em C:
#include <stdio.h>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int *ptr = arr;
printf(“%d\n”, *ptr + 2);
printf(“%d\n”, *(ptr + 2));
printf(“%d\n”, ptr[2]);
printf(“%d\n”, *ptr++);
printf(“%d\n”, (*ptr)++);
return 0;
}
Fonte: Elaborado pelo professor, 2024.
Dado o contexto e analisando o código, qual será a saída impressa ao executar este código?
Alternativas
Alternativa 1 – 3, 3, 3, 1, 2
Alternativa 2 – 3, 3, 3, 1, 3
Alternativa 3 – 3, 5, 3, 1, 2
Alternativa 4 – 3, 5, 3, 2, 2
Alternativa 5 – 3, 5, 3, 2, 3
QUESTÃO 7
No trecho de código a seguir, foi iniciado o desenvolvimento de uma fila estática que é implementada com auxílio de uma struct contendo um campo “dados” (vetor), um campo “ini” que deverá armazenar o índice do primeiro elemento da fila e um campo “fim” que deverá armazenar o índice do último elemento da fila.
OLIVEIRA, Pietro Martins de; PEREIRA, Rogério de Leon. Estruturas de Dados I. Maringá: Unicesumar, 2019.
Observe:
Linha | Código |
01
02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 |
#define tamanho 5
struct tfila { int dados[tamanho]; int ini; int fim; }; struct tfila fila; void remove() { int i; for (i = 0; i < tamanho; i++) { fila.dados[i] = fila.dados[i+1]; } fila.dados[fila.fim] = 0; fila.fim–; } |
Com base em seus conhecimentos sobre filas estáticas, tomando como referência o código-fonte acima, avalie:
I – A função definida entre as linhas 11 e 18 é do tipo void, por isso não retorna valor algum.
II – A função remove() realiza o deslocamento dos dados da fila em uma posição da direção do fim à direção do início da fila.
III – Podemos considerar que o início da fila será, nesse caso, a posição 0 do vetor de dados da struct tfila.
De acordo com as afirmações acima, é possível dizer que está(ão) correta(s) a(s) afirmativa(s):
Alternativas
Alternativa 1 – I, apenas.
Alternativa 2 – I e II, apenas.
Alternativa 3 – I e III, apenas.
Alternativa 4 – II e III, apenas.
Alternativa 5 – I, II e III.
QUESTÃO 8
Estruturas de dados complexas são feitas a partir de estruturas mais simples. Variáveis únicas, vetores, matrizes, registros, todas elas fazem parte das composições necessárias para se elaborar estruturas mais específicas e mais úteis na solução de determinadas situações problema. Em linguagem C, temos sintaxes bem definidas para a declaração dessas estruturas e suas respectivas e implementações em soluções algorítmicas.
OLIVEIRA, Pietro Martins de; PEREIRA, Rogério de Leon. Estruturas de Dados I. Maringá: Unicesumar, 2019.
A respeito de estruturas de dados homogêneas e heterogêneas, analise as afirmações que se seguem.
I – Podemos dizer que vetores são arranjos estruturais lineares e unidimensionais.
II – Os registros (structs) permitem que criemos novos tipos de dados compostos a partir de outros tipos de dados.
III – Pode-se dizer que matrizes são estruturas de dados multidimensionais, podendo ser combinadas com structs.
De acordo com as afirmações acima, é possível dizer que está(ão) correta(s) a(s) afirmativa(s):
Alternativas
Alternativa 1 – I, apenas.
Alternativa 2 – I e II, apenas.
Alternativa 3 – I e III, apenas.
Alternativa 4 – II e III, apenas.
Alternativa 5 – I, II e III.
QUESTÃO 9
Uma das grandes vantagens de se utilizar ponteiros, é que podemos manipular a memória de um computador com maior controle. Todavia, esse também é um fardo, pois pode tornar o código-fonte complexo, além de trazer maior responsabilidade a programadores(as) que, eventualmente, podem não estar preparados(as) para tal complexidade. Sabendo que você é um(a) programador(a) aplicado, tenha em mente que todo e qualquer código-fonte pode ser compreendido, desde que você tenha a disposição para pesquisar o significado de cada instrução, cada operação, dentro do respectivo código-fonte.
OLIVEIRA, Pietro Martins de; PEREIRA, Rogério de Leon. Estruturas de Dados I. Maringá: Unicesumar, 2019.
Assim sendo, vejamos o código-fonte que se segue:
Linha | Código |
01
02 03 04 05 06 07 08 09 10 11 |
int main() {
int xi = 0; int *ptr_xi = ξ char xc = ‘A’; char *ptr_xc = &xc; ptr_xi = (int *) ptr_xc; return(0); } |
Tomando por base o código-fonte acima, bem como sua capacidade de realizar pesquisas para compreender os códigos que manipula, avalie as afirmações a seguir:
I – Na linha e código 06 o programa está atribuindo o endereço de uma variável caractere a um ponteiro de números reais.
II – Imediatamente após a execução da linha de código 03, podemos dizer que o conteúdo da variável para a qual ptr_xi aponta é igual a zero.
III – A operação da linha 08 é ilegal e irá gerar um erro de compilação.
De acordo com as afirmações acima, é possível dizer que está(ão) correta(s) a(s) afirmativa(s):
Alternativas
Alternativa 1 – I, apenas.
Alternativa 2 – II, apenas.
Alternativa 3 – III, apenas.
Alternativa 4 – I e II, apenas.
Alternativa 5 – II e III, apenas.
QUESTÃO 10
Listas, pilhas e filas são estruturas de dados, que nos permitem organizar e interagir com nossos dados e organizá-los de diferentes formas. Em C++ existem bibliotecas que nos permitem implementar esses tipos de estruturas, o que torna nosso trabalho mais simples do que se tivéssemos de criá-las manualmente.
GOULART, Gabriel. Listas, pilhas e filas em C++. Portal GSTI. Disponível em: https://www.portalgsti.com.br/2018/04/listas-pilhas-e-filas-em-c.html acesso em: 09/02/2022.
A partir dessas informações, avalie as asserções a seguir e a relação proposta entre elas:
- Pilha é uma coleção de elementos, que segue a ordem LIFO. O que significa que o elemento que é inserido mais recentemente será removido primeiro. Uma pilha tem uma restrição de que a inserção e exclusão do elemento só pode ser feita a partir de apenas uma extremidade da pilha e chamamos essa posição de topo.
PORQUE
- Fila é uma estrutura de dados que segue o princípio FIFO. Sendo que o elemento adicionado primeiro na fila será o que será removido primeiro. Os elementos são sempre adicionados na parte de trás e removidos da frente.
A respeito dessas asserções, assinale a opção correta.
Alternativas
Alternativa 1 – As asserções I e II são proposições verdadeiras e a II é uma justificativa correta da I.
Alternativa 2 – As asserções I e II são proposições verdadeiras, mas a II não é uma justificativa correta da I.
Alternativa 3 – A asserção I é uma proposição verdadeira e a II é uma proposição falsa.
Alternativa 4 – A asserção I é uma proposição falsa e a II é uma proposição verdadeira.
Alternativa 5 – As asserções I e II são proposições falsas.