Desenvolvimento (No Code) Flashcards

1
Q
  1. (Instituto Cidades - 2012 - TCM-GO - Auditor de Controle Externo - Informática) São exemplos de algoritmos de ordenação, exceto:

a) Bubble Sort
b) Select Sort
c) Shell Sort
d) Busca Sequencial;
e) Quick Sort;

A

Conforme vimos em aula, a Busca Sequencial não é um algoritmo de ordenação! Na verdade, ele é um método de pesquisa sobre estruturas de dados.

  1. BubbleSort(Troca)(Bolhas subindo cada vez menos): Repetidamente troca elementos adjacentes se estiverem na ordem errada.
  2. InsertionSort(Inserção)(Baralho): Insere cada elemento na posição correta dentro da parte ordenada da lista.
  3. SelectionSort(Seleção): Seleciona o menor (ou maior) elemento e o coloca na posição correta.
  4. QuickSort(Troca): Ordena dividindo a lista em sublistas ao redor de um pivô.
  5. MergeSort(Intercalação): Divide a lista em sublistas, ordena recursivamente e mescla as sublistas.
  6. HeapSort(Seleção): Constrói um heap (árvore binária) e extrai repetidamente o maior elemento para ordenar a lista.
  7. ShellSort(Inserção): Ordena elementos comparando e movendo incrementos de distância decrescentes.

Gabarito: D

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q
  1. (FUMARC - 2012 - TJ-MG - Técnico Judiciário - Analista de Sistemas – I) Quicksort divide um conjunto de itens em conjuntos menores, que são ordenados de forma independe, e depois os resultados são combinados para produzir a solução de ordenação do conjunto maior.
A

Conforme vimos em aula, está perfeito! Sendo um algoritmo do tipo Dividir Para Conquistar, ele reparte o conjunto de dados em conjuntos menores, que são ordenados independentemente e depois combinados em uma solução maior.

  1. BubbleSort(Troca)(Bolhas subindo cada vez menos): Repetidamente troca elementos adjacentes se estiverem na ordem errada.
  2. InsertionSort(Inserção)(Baralho): Insere cada elemento na posição correta dentro da parte ordenada da lista.
  3. SelectionSort(Seleção): Seleciona o menor (ou maior) elemento e o coloca na posição correta.
  4. QuickSort(Troca): Ordena dividindo a lista em sublistas ao redor de um pivô.
  5. MergeSort(Intercalação): Divide a lista em sublistas, ordena recursivamente e mescla as sublistas.
  6. HeapSort(Seleção): Constrói um heap (árvore binária) e extrai repetidamente o maior elemento para ordenar a lista.
  7. ShellSort(Inserção): Ordena elementos comparando e movendo incrementos de distância decrescentes.

Gabarito: C

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q
  1. (CESPE - 2012 - MPE-PI - Analista Ministerial - Informática - Cargo 6) O heapsort é um algoritmo de ordenação em que a quantidade de elementos armazenada fora do arranjo de entrada é constante durante toda a sua execução.
A

Inicialmente, insere-se os elementos da lista em um heap.

Em seguida, fazemos sucessivas remoções do
menor elemento do heap, colocando os elementos removidos do heap de volta na lista – a lista estará então em ordem crescente.

O heapsort é um algoritmo de ordenação em que a sua estrutura auxiliar de armazenamento fora do arranjo de entrada é constante durante toda a sua execução.

Essa questão é polêmica. O arranjo tem tamanho constante, mas a quantidade de elementos é variável.

Diferente de outros algoritmos de ordenação que tem uma estrutura auxiliar de tamanho variável (assim como seus elementos), o Heap Sort tem uma estrutura auxiliar de tamanho fixo (porém a quantidade de elementos é variável).

Como é dito por Neil Dale: “A heapsort is just as efficient in terms of space; only one array is used to store the data. The heap sort requires only constante extra space”. No entanto, a questão foi dada como correta!

  1. BubbleSort(Troca)(Bolhas subindo cada vez menos): Repetidamente troca elementos adjacentes se estiverem na ordem errada.
  2. InsertionSort(Inserção)(Baralho): Insere cada elemento na posição correta dentro da parte ordenada da lista.
  3. SelectionSort(Seleção): Seleciona o menor (ou maior) elemento e o coloca na posição correta.
  4. QuickSort(Troca): Ordena dividindo a lista em sublistas ao redor de um pivô.
  5. MergeSort(Intercalação): Divide a lista em sublistas, ordena recursivamente e mescla as sublistas.
  6. HeapSort(Seleção): Constrói um heap (árvore binária) e extrai repetidamente o maior elemento para ordenar a lista.
  7. ShellSort(Inserção): Ordena elementos comparando e movendo incrementos de distância decrescentes.

Gabarito: C

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q
  1. (CESPE - 2010 - ABIN - Oficial Técnico de Inteligência - Área de Suporte a Rede de Dados) A eficácia do método de ordenação rápida (quicksort) depende da escolha do pivô mais adequado ao conjunto de dados que se deseja ordenar. A situação ótima ocorre quando o pivô escolhido é igual ao valor máximo
    ou ao valor mínimo do conjunto de dados.
A

Alguns autores consideram a divisão em três subconjuntos, sendo o terceiro contendo valores iguais ao pivô.

O Melhor Caso ocorre quando o conjunto é dividido em subconjuntos de mesmo tamanho;

o Pior Caso ocorre quando o pivô corresponde a um dos extremos (menor ou maior valor). Alguns o consideram um algoritmo frágil e não-estável, com baixa tolerância a erros.

Conforme vimos em aula, a questão se refere ao pior caso!

Gabarito: E

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q
  1. (CESPE - 2010 - ABIN - Oficial Técnico de Inteligência - Área de Suporte a Rede de Dados)

A estabilidade de um método de ordenação é importante quando o conjunto de dados já está parcialmente ordenado.

A

Na imagem acima, foi colocado um sinal de aspas simples e duplas apenas para diferenciá-los, mas trata-se do mesmo número.

Um algoritmo estável ordena todo o restante e não perde tempo trocando as posições de elementos que possuam chaves idênticas.

Já um algoritmo instável ordena todos os elementos, inclusive aqueles que possuem chaves idênticas (sob algum outro critério).

Conforme vimos em aula, a estabilidade é irrelevante com dados parcialmente ordenados ou não!

A estabilidade é importante quando se deseja ordenar um conjunto de dados por mais de um critério (Ex: primeiro pelas chaves e segundo por índices). Se esse não for o caso (e a questão não disse que era!), a estabilidade “não fede nem cheira”. O fato de os dados estarem parcialmente ordenados não fará diferença em termos de ordenação – ambos serão ordenados da mesma maneira.

Gabarito: E

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q
  1. (CESPE - 2010 - Banco da Amazônia - Técnico Científico - Tecnologia da Informação - Administração de Dados)

A classificação interna por inserção é um método que realiza a ordenação de um vetor por meio da inserção de cada elemento em sua posição correta dentro de um subvetor classificado.

A

Conforme vimos em aula, trata-se do InsertionSort!

  1. BubbleSort(Troca)(Bolhas subindo cada vez menos): Repetidamente troca elementos adjacentes se estiverem na ordem errada.
  2. InsertionSort(Inserção)(Baralho): Insere cada elemento na posição correta dentro da parte ordenada da lista.
  3. SelectionSort(Seleção): Seleciona o menor (ou maior) elemento e o coloca na posição correta.
  4. QuickSort(Troca): Ordena dividindo a lista em sublistas ao redor de um pivô.
  5. MergeSort(Intercalação): Divide a lista em sublistas, ordena recursivamente e mescla as sublistas.
  6. HeapSort(Seleção): Constrói um heap (árvore binária) e extrai repetidamente o maior elemento para ordenar a lista.
  7. ShellSort(Inserção): Ordena elementos comparando e movendo incrementos de distância decrescentes.

Gabarito: C

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q
  1. (FCC - 2009 - TRT - 15ª Região - Analista Judiciário - Tecnologia da Informação) São algoritmos de classificação por trocas apenas os métodos:

a) SelectionSort e InsertionSort.

b) MergeSort e BubbleSort.

c) QuickSort e SelectionSort.

d) BubbleSort e QuickSort.

e) InsertionSort e MergeSort.

A
  1. BubbleSort(Troca)(Bolhas subindo cada vez menos): Repetidamente troca elementos adjacentes se estiverem na ordem errada.
  2. InsertionSort(Inserção)(Baralho): Insere cada elemento na posição correta dentro da parte ordenada da lista.
  3. SelectionSort(Seleção): Seleciona o menor (ou maior) elemento e o coloca na posição correta.
  4. QuickSort(Troca): Ordena dividindo a lista em sublistas ao redor de um pivô.
  5. MergeSort(Intercalação): Divide a lista em sublistas, ordena recursivamente e mescla as sublistas.
  6. HeapSort(Seleção): Constrói um heap (árvore binária) e extrai repetidamente o maior elemento para ordenar a lista.
  7. ShellSort(Inserção): Ordena elementos comparando e movendo incrementos de distância decrescentes.

Gabarito: D

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q
  1. (CESGRANRIO - 2011 - PETROBRÁS – Analista de Sistemas – I)

O tempo de pior caso do algoritmo QuickSort é de ordem menor que o tempo médio do algoritmo Bubblesort.

A

Tempo: O(n) < O(n log n) < O(n²)

Métodos Estáveis: BIM - Bub, Ins e Mer

São iguais: O(n²).

Gabarito: E

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q
  1. (CESGRANRIO - 2011 - PETROBRÁS – Analista de Sistemas – II)

O tempo médio do QuickSort é O(nlog2n), pois ele usa como estrutura básica uma árvore de prioridades.

A

Tempo: O(n) < O(n log n) < O(n²)

Métodos Estáveis: BIM - Bub, Ins e Mer

Conforme vimos em aula, de fato, ele tem tempo médio O(n log n), mas ele usa como estrutura básica uma lista ou um vetor!

Gabarito: E

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q
  1. (CESGRANRIO - 2011 - PETROBRÁS – Analista de Sistemas – III)

O tempo médio do QuickSort é de ordem
igual ao tempo médio do MergeSort.

A

Tempo: O(n) < O(n log n) < O(n²)

Métodos Estáveis: BIM - Bub, Ins e Mer

Conforme vimos em aula, ambos têm tempo O(n log n).

Gabarito: C

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q
  1. (CESGRANRIO - 2012 - CMB – Analista de Sistemas – III)

Em uma reunião de análise de desempenho de um sistema WEB, um programador apontou corretamente que a complexidade de tempo do algoritmo bubblesort, no pior caso, é:

a) O(1)
b) O(log n)
c) O(n)
d) O(n log n)
e) O(n2)

A

Tempo: O(n) < O(n log n) < O(n²)

Métodos Estáveis: BIM - Bub, Ins e Mer

Conforme vimos em aula, trata-se de O(n²)!

Gabarito: E

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q
  1. (CESPE - 2010 – INMETRO – Analista de Sistemas) Se f é uma função de complexidade para um algoritmo F, então O(f) é considerada a complexidade assintótica ou o comportamento assintótico do algoritmo F.

Assinale a opção que apresenta somente algoritmos que possuem complexidade assintótica quando f(n) = O(n log n).

a) HeapSort e BubbleSort
b) QuickSort e InsertionSort
c) MergeSort e BubbleSort
d) InsertionSort
e) HeapSort, QuickSort e MergeSort

A

Tempo: O(n) < O(n log n) < O(n²)

Métodos Estáveis: BIM - Bub, Ins e Mer

Conforme vimos em aula, trata-se da última opção. Vejam que ele não utilizou, nessa questão, o Pior Caso.

Gabarito: E

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q
  1. (FGV - 2013 – MPE/MS – Analista de Sistemas) Assinale a alternativa que indica o algoritmo de ordenação capaz de funcionar em tempo O(n) para alguns conjuntos de entrada.

a) Selectionsort (seleção)
b) Insertionsort (inserção)
c) Merge sort
d) Quicksort
e) Heapsort

A

Tempo: O(n) < O(n log n) < O(n²)

Métodos Estáveis: BIM - Bub, Ins e Mer

Conforme vimos em aula, trata-se da segunda opção.

Gabarito: B

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q
  1. (CESGRANRIO - 2010 – BACEN – Analista de Sistemas)

Uma fábrica de software foi contratada para desenvolver um produto de análise de riscos. Em determinada funcionalidade desse software, é necessário realizar a ordenação de um conjunto formado por muitos números inteiros.

Que algoritmo de ordenação oferece melhor complexidade de tempo (Big O notation) no pior caso?

a) Merge sort
b) Insertion sort
c) Bubble sort
d) Quick sort
e) Selection sort

A

Tempo: O(n) < O(n log n) < O(n²)

Métodos Estáveis: BIM - Bub, Ins e Mer

Conforme vimos em aula, trata-se da primeira opção!

Gabarito: A

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q
  1. (CESPE - 2011 – FUB – Analista de Sistemas) Os métodos de ordenação podem ser classificados como estáveis ou não estáveis. O método é estável se preserva a ordem relativa de dois valores idênticos.

Alguns métodos eficientes como shellsort ou quicksort não são estáveis, enquanto alguns métodos pouco eficientes, como o método da bolha, são estáveis.

A

Tempo: O(n) < O(n log n) < O(n²)

Métodos Estáveis: BIM - Bub, Ins e Mer

Métodos Instáveis: SelectionSort, QuickSort,
HeapSort e ShellSort.

Portanto, item perfeito!

Gabarito: C

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q
  1. (CESPE - 2012 – BASA – Analista de Sistemas) O método de classificação Shellsort iguala-se ao método Quicksort em termos de complexidade temporal, porém é mais eficiente para quantidades pequenas a moderadas de dados.
A

Tempo: O(n) < O(n log n) < O(n²)

Métodos Estáveis: BIM - Bub, Ins e Mer

Não há correlação direta entre complexidade de custo e complexidade temporal, logo eu não posso usar a função de um para calcular o outro.

Gabarito: E

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q
  1. (CESPE - 2012 – BASA – Analista de Sistemas) O método de classificação Quicksort é estável e executado em tempo linearmente dependente da quantidade de dados que estão sendo classificados.
A

Tempo: O(n) < O(n log n) < O(n²)

Métodos Estáveis: BIM - Bub, Ins e Mer

QuickSort é instável e não possui complexidade temporal linear!

Gabarito: E

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q
  1. (CESPE - 2012 – BASA – Analista de Sistemas)

No método de ordenamento denominado shellsort, as comparações e as trocas são feitas conforme determinada distância entre dois elementos, de modo que, uma distância igual a 6 seria a comparação entre o primeiro elemento e o sétimo, ou entre o segundo elemento e o oitavo, e assim sucessivamente, repetindo-se esse processo até que as últimas
comparações e trocas tenham sido efetuadas e a distância tenha diminuído até chegar a 1.

A

É o algoritmo mais eficiente dentre os de ordem quadrática. Nesse método, as comparações e as trocas são feitas conforme determinada distância (gap) entre dois elementos, de modo que, se gap = 6, há comparação entre o 1º e 7º elementos ou entre o 2º e 8º elementos e assim sucessivamente, repetindo até que as últimas
comparações e trocas tenham sido efetuadas e o gap tenha chegado a 1.

Conforme vimos em aula, a questão descreveu perfeitamente o mecanismo de ordenação do Shellsort.

Gabarito: C

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q
  1. (FGV - 2008 – PETROBRÁS – Analista de Sistemas) Sobre o algoritmo de ordenação heapsort, assinale a afirmação correta.

a) Utiliza ordenação por árvore de decisão, ao invés de ordenação por comparação.

b) A estrutura de dados que utiliza, chamada heap, pode ser interpretada como uma árvore binária.

c) Seu desempenho de pior caso é pior do que o do algoritmo quicksort.

d) Seu desempenho de pior caso é o mesmo da ordenação por inserção.

e) Seu desempenho de pior caso é menor do que o da ordenação por intercalação.

A

Tempo: O(n) < O(n log n) < O(n²)

Métodos Estáveis: BIM - Bub, Ins e Mer

(a) Utiliza ordenação por seleção;

(b) Perfeito;

(c) Não, é melhor que o QuickSort;

(d) Não, é melhor que o InsertionSort;

(e) Não, é idêntico ao MergeSort.

Gabarito: B

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q
  1. (CESGRANRIO – 2009 – BASA – Analista de Sistemas)

Com relação aos algoritmos quicksort e mergesort, o tempo de execução para o:

a) pior caso do quicksort é (n lg n).
b) pior caso do mergesort é (n2).
c) pior caso do mergesort é (n lg n).
d) caso médio do mergesort é O(lg n).
e) caso médio do quicksort é O(n2).

A

Tempo: O(n) < O(n log n) < O(n²)

Métodos Estáveis: BIM - Bub, Ins e Mer

Conforme vimos em aula, trata-se da terceira opção. Gabarito: C

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
21
Q
  1. (CESPE – 2009 – UNIPAMPA – Analista de Sistemas)

O algoritmo quicksort, que divide uma instrução em quatro blocos diferentes de busca, é um exemplo de estrutura de ordenação de dados.

A

Conforme vimos em aula, são dois blocos diferentes de busca.

Gabarito: E

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
22
Q
  1. (CESPE - 2013 – CPRM – Analista de Sistemas)

No algoritmo de ordenação denominado quicksort, escolhe-se um ponto de referência, denominado pivô, e separam-se os elementos em dois grupos: à esquerda, ficam os elementos menores que o pivô, e à direita ficam os maiores. Repete-se esse processo para os grupos de elementos formados (esquerda e direita) até que todos os elementos estejam ordenados.

A

Esse algoritmo divide um conjunto de itens em conjuntos menores, que são ordenados de forma independente, e depois os resultados são combinados para produzir a solução de ordenação do conjunto maior.

Trata-se, portanto, de um algoritmo do tipo Divisão-e-Conquista, i.e., repartindo os dados em subgrupos, dependendo de um elemento chamado pivô.

Neste método, a lista é dividida em parte esquerda e parte direita, sendo que os elementos da parte esquerda são todos menores que os elementos da parte direita. Essa fase do processo é chamada de
partição.

Em seguida, as duas partes são ordenadas recursivamente (usando o próprio QuickSort). A lista está, portanto, ordenada corretamente!

Conforme vimos em aula, é exatamente assim!

Gabarito: C

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
23
Q
  1. (CESPE - 2013 – MPU – Analista de Sistemas)

Entre os algoritmos de ordenação e pesquisa bubble sort, quicksort e heapsort, o quicksort é considerado o mais eficiente, pois se caracteriza como um algoritmo de dividir-para-conquistar, utilizando operações de particionamento.

A

Conforme vimos em aula, o HeapSort é o mais eficiente no pior caso!

Gabarito: E

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
24
Q
  1. (CESPE - 2013 – TRT/9 – Analista de Sistemas)

No método Quicksort, o pivô é responsável pelo número de partições em que o vetor é dividido. Como o pivô não pode ser um elemento que esteja repetido no vetor, o Quicksort não funciona quando há elementos repetidos.

A

O pivô não é responsável pelo número de partições em que o vetor é dividido. Ademais, ele pode sim ser um elemento que esteja repetido no vetor!

Gabarito: E

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
25
25. (FCC - 2011 - TRT - 14ª Região (RO e AC) - Analista Judiciário - Tecnologia da Informação) NÃO se trata de um método de ordenação (algoritmo): a) inserção direta. b) seleção direta. c) inserção por meio de incrementos decrescentes. d) direta em cadeias. e) particionamento.
(a) Trata-se do InsertionSort; (b) Trata-se do SelectionSort; (c) Trata-se do ShellSort; (d) Trata-se de um método de busca; (e) Trata-se do QuickSort. Portanto, é a quarta opção! Gabarito: D
26
26. (FCC - 2016 - TRT - 23ª REGIÃO (MT) - Analista Judiciário - Tecnologia da Informação) Utilizando um algoritmo de ordenação, percorre-se a lista dada da esquerda para a direita, comparando pares de elementos consecutivos, trocando de lugar os que estão fora da ordem. Em cada troca, o maior elemento é deslocado uma posição para a direita. Trata-se de um algoritmo de ordenação: a) Select Sort. b) Insert Sort. c) Bubble Sort. d) Shell Sort. e) Quick Sort.
O algoritmo realiza trocas de dois em dois, percorrendo todos os elementos. Como vimos, esse algoritmo é o Bubble Sort. Gabarito: C
27
1. (VUNESP – 2012 – TJ/SP - Analista Judiciário - Tecnologia da Informação) Considerando o conceito de Complexidade de Algoritmos, representado por O(função), assinale a alternativa que apresenta, de forma crescente, as complexidades de algoritmos. a) O(2n); O(n3); O(n2); O(log2 n); O(n.log2 n). b) O(n2); O(n3); O(2n); O(log2 n); O(n.log2 n). c) O(n3); O(n2); O(2n); O(n.log2 n); O(log2 n). d) O(log2 n); O(n.log2 n); O(n2); O(n3); O(2n). e) O(n.log2 n); O(log2 n); O(2n); O(n3); O(n2).
Em ordem crescrente de complexidade: O(log2 n) O(n.log2 n) O(n2) O(n3) O(2n) Gabarito: D
28
1. (CESPE - 2013 – TRT/MS – Analista de Sistemas) Considerando que se deseje efetuar uma pesquisa de um valor sobre a chave primária de uma tabela de um banco de dados com uma chave primária com um tipo de campo que receba um valor inteiro e que se possa fazer essa pesquisa utilizando-se a busca sequencial ou a busca binária, assinale a opção correta. a) O método de busca binária requer, no máximo, ln(n) comparações para determinar o elemento pesquisado, em que n é o número de registros. b) O método de busca binária será sempre mais rápido que o método de busca sequencial, independentemente de a tabela estar ordenada com base no elemento pesquisado. c) O método de busca sequencial requererá, no máximo, n² comparações para determinar o elemento pesquisado, em que n será o número de registros. d) O método de busca binária sempre efetuará menos comparações que o método de pesquisa sequencial. e) O método de busca sequencial efetuará menos comparações para encontrar o elemento pesquisado quando a tabela estiver ordenada em comparação à situação quando a tabela estiver desordenada.
Busca Sequencial: - **Método**: Percorre linearmente cada elemento da lista até encontrar o item desejado ou concluir que ele não está presente. - **Eficiência**: \( O(n) \) no pior caso, onde \( n \) é o número de elementos na lista. - **Aplicação**: Útil para listas não ordenadas ou quando não se tem conhecimento prévio sobre a organização dos dados. - **Complexidade**: Simples de implementar e adequado para pequenas quantidades de dados. Busca Binária: - **Método**: Divide repetidamente uma lista ordenada pela metade, descartando a metade onde o item não pode estar até encontrar o item desejado. - **Eficiência**: \( O(\log n) \) no caso médio e no melhor caso, onde \( n \) é o número de elementos na lista. No pior caso, é \( O(n) \) se a lista não estiver ordenada. - **Aplicação**: Eficiente para grandes conjuntos de dados ordenados, minimizando o número de comparações necessárias. - **Complexidade**: Requer que a lista esteja ordenada antes da busca, mas oferece uma busca muito mais rápida em comparação com a busca sequencial. Considerações Finais: - A **busca sequencial** é direta, mas pode ser ineficiente para grandes conjuntos de dados. - A **busca binária** é mais eficiente, mas requer que a lista esteja ordenada e é mais complexa de implementar. - A escolha entre os métodos depende da natureza dos dados (ordenados ou não) e dos requisitos de desempenho do sistema. Gabarito: A
29
3. (CESPE - 2013 – TCE/RO – Analista de Sistemas) Considere uma tabela de um banco de dados com chave primária e tipo de campo que receba um valor inteiro. Ao se efetuar uma pesquisa de um valor sobre a chave primária dessa tabela, o método de busca binária requer, no máximo, lg(n) comparações para localizar o elemento pesquisado, em que n é o número de registros.
A Busca Binária é um algoritmo de busca em vetores que segue o paradigma de divisão-e-conquista. Parte-se do pressuposto de que o vetor está ordenado e realiza sucessivas divisões do espaço de busca, comparando o elemento chave com o elemento do meio do vetor. Possui complexidade da ordem de O(log2 n), em que N é o tamanho do vetor de busca. Conforme vimos em aula, de fato a complexidade da Busca Binária é O(log2 n). Gabarito: C
30
4. (FCC – 2016 - TRT - 14ª Região (RO e AC) - Analista Judiciário - Tecnologia da Informação) Dada uma coleção de n elementos ordenados por ordem crescente, pretende-se saber se um determinado elemento x existe nessa coleção. Supondo que essa coleção está implementada como sendo um vetor a[0...n-1] de n elementos inteiros, utilizando-se um algoritmo de pesquisa binária, o número de vezes que a comparação x==a[i] será executada, no pior caso, é calculada por: a) n/2. b) n−1. c) √n. d) log2(n). e) n−=2.
A Busca Binária é um algoritmo de busca em vetores que segue o paradigma de divisão-e-conquista. Parte-se do pressuposto de que o vetor está ordenado e realiza sucessivas divisões do espaço de busca, comparando o elemento chave com o elemento do meio do vetor. Possui complexidade da ordem de O(log2 n), em que N é o tamanho do vetor de busca. Gabarito: D
31
(UFRPE – 2022 – UFRPE) Sobre algoritmos e estrutura de dados, assinale a afirmativa correta. a) Listas encadeadas ou ligadas são estruturas de dados estáticas, o que significa que o número de nós não pode ser modificado durante a execução do programa. b) Pilhas são estruturas de dados do tipo FIFO (first-in first-out), em que o primeiro elemento a ser inserido será o primeiro a ser retirado. c) Árvores são estruturas de dados do tipo FIFO (first-in first-out), em que o primeiro elemento a ser inserido será o primeiro a ser retirado. d) Filas podem ser implementadas em listas encadeadas ou em vetores. e) Pilhas só podem ser implementadas em listas encadeadas.
Para começar, as listas encadeadas são estruturas de dados dinâmicas, não estáticas, permitindo que o número de nós seja modificado durante a execução do programa, contrariando a primeira afirmação. Portanto, a afirmação sobre listas encadeadas serem estáticas é incorreta. Além disso, a caracterização das pilhas como estruturas do tipo FIFO (first-in first-out) Também está equivocada, pois na realidade elas operam segundo o princípio LIFO, em que o último elemento inserido é o primeiro a ser retirado. Quanto às árvores, a afirmação de que operam sob o princípio FIFO é igualmente falsa, pois as árvores são estruturas hierárquicas e não sequenciais, não se enquadrando nessa descrição de operação. Já a afirmação de que pilhas só podem ser implementadas em listas encadeadas também não é verdadeira, visto que pilhas podem ser implementadas tanto em listas encadeadas quanto em vetores, oferecendo flexibilidade na escolha da implementação. A única afirmação correta é a que menciona que filas podem ser implementadas em listas encadeadas ou em vetores. Esta é uma descrição acurada das possibilidades de implementação de filas, uma vez que ambas as estruturas permitem o funcionamento adequado do modelo FIFO, no qual o primeiro elemento inserido é oprimeiro a ser retirado. Assim, nosso gabarito é a alternativa D. (Gabarito: Letra D).
32
(CESPE/CEBRASPE – 2019 – MPC-PA) Assinale a opção que apresenta a denominação da estrutura de dados constituída por um conjunto de elementos individualizados, em que cada um dos elementos — com exceção dos elementos inicial e final — referencia sempre outros dois, um que o antecede e outro que o sucede. a) lista circular b) grafo c) lista duplamente encadeada d) árvore e) pilha
Vamos analisar item a item: a) lista circular Uma lista em que cada elemento referencia o outro, porém com uma diferença: o último elemento referencia o primeiro também. A questão deixa claro que quer uma estrutrua de dados em que os elementos inicial e final não estejam ligados. Falso. b) Grafo Estrutura de dados com um conjunto de vértices ligados entre si por arestas. Falso. c) lista duplamente encadeada Uma lista em que cada elemento referencia o outro em ambas as direções: um elemento referencia o anterior e o próximo, exceto os elementos inicial e final. É isso aí. Verdadeiro. d) Árvore Estrutura de dados em que um nó possui 1 ou mais filhos, mas cada filho possui somente um pai. Falso. e) pilha Estrutura de dados usando a regra LIFO, last-in first-out, ou seja, o último a entrar é o primeiro a sair. Falso. (Gabarito: Letra C).
33
(CESPE/CEBRASPE – 2017 – TRT-7) Considere uma estrutura de dados em que cada elemento armazenado apresenta ligações de apontamento com seu sucessor e com o seu predecessor, o que possibilita que ela seja percorrida em qualquer sentido. Trata-se de a) uma fila. b) um grafo. c) uma lista duplamente encadeada. d)uma pilha.
Vamos analisar item a item: a) uma fila. Estrutura de dados que segue a lógica FIFO (first-in, first-out), ou “primeiro a entrar é o primeiro a sair”. Os elementos são inseridos no fim da fila e removidos no início. Falso. b)um grafo. Grafo é uma estrutura de dados com um conjunto de vértices e arestas que os ligam. Falso. c) uma lista duplamente encadeada. É uma estrutura de dados que armazena uma sequência de elementos que possuem ligações de apontamento, ou ponteiros, entre si, em ambas as direções. Isso permite percorrer a lista em qualquer sentido. Verdadeiro. d) uma pilha. Estrutura de dados que segue a lógica LIFO, ou last-in first-out, que significa “o último a entrar é o primeiro a sair”. Falso. (Gabarito: Letra C).
34
(CESPE/CEBRASPE – 2017 – TRE-TO) A estrutura de dados que consiste no armazenamento de cada elemento em um endereço calculado a partir da aplicação de uma função sobre a chave de busca denomina-se a) lista. b) tabela hashing. c) deque. d) fila. e) árvore binária balanceada.
Vamos analisar item a item: a) lista. Estrutura de dados que armazena uma sequência de elementos, cada um apontando para o seu sucessor na lista. Falso. b) tabela hashing. Estrutura de dados que permite armazenar e recuperar os elementos diretamente ou quase diretamente, por meio de uma chave de busca. Cada elemento é armazenado em um endereço que é calculado por uma função de hash, que é aplicada sobre a chave de busca. A função de hash gera um índice, que é um endereço do elemento na tabela. Dessa forma, o acesso é direto, ou próximo do direto, sem precisar percorrer toda a tabela. Verdadeiro. c) deque. Estrutura de dados para inserir e remover tanto no início quanto no fim da estrutura. Falso. d) fila. Estrutura de dados que segue a lógica FIFO (first-in, first-out), ou “primeiro a entrar é o primeiro a sair”. Os elementos são inseridos no fim da fila e removidos no início. Falso. e) árvore binária balanceada. É uma estrutura de dados em formato de árvore. Cada nó possui, no máximo, dois filhos, e os níveis da árvore estão balanceados, o que garante eficiência nas operações de inserção, remoção e busca. (Gabarito: Letra B)
35
(CESPE/CEBRASPE – 2017 – TRF-1) Acerca de estrutura de dados, julgue o próximo item. A fila é uma lista de elementos em que os itens são sempre inseridos em uma das extremidades e excluídos da outra.
Fila é uma estrutura de dados que segue a lógica FIFO (first-in first-out) armazena elementos de forma sequencial, permitindo a inserção de novos elementos no final da estrutura e a remoção de elementos do início. Então, está certo. (Gabarito: Certo)
36
(CESPE - 2012 - Banco da Amazônia - Técnico Científico - Administração de Dados) O tipo de dados árvore representa organizações hierárquicas entre dados.
Comentários: Perfeito, observem que alguns autores tratam Tipos de Dados como sinônimo de Estruturas de Dados. Gabarito: C
37
(CETAP - 2010 - AL-RR - Analista de Sistemas - A) Uma árvore binária é aquela que tem como conteúdo somente valores binários.
Não! Uma árvore binária é aquela que tem, no máximo, grau 2! Gabarito: E
38
(CESPE/CEBRASPE – 2017 – TRF-1) Acerca dos conceitos de árvores e grafos, julgue o item que se segue. A soma dos graus de todos os vértices de um grafo é sempre par.
Um vértice é um nó do grafo. Já o grau de um vértice é o número de arestas do vértice. Cada aresta conta dois graus para a soma total, sendo um grau para cada vértice que ela conecta. Por isso, a soma será sempre par. Gabarito: Correto.
39
(CESPE/CEBRASPE – 2020 – TJ-PA) De acordo com a figura anterior, o procedimento CONSULTA (x) 1 while esquerda [x] ≠ NIL 2 do x <- esquerda [x] 3 return x realiza, na árvore, a consulta de a) search. b) minimum. c) maximum. d) successor. e) predecessor.
Trata-se de uma árvore binária. Nessa estrutura, os nós filhos da esquerda sempre possuem um valor menor do que os da direita. Os menores valores da árvore estarão à esquerda. Dito isso, o algoritmo percorre os nós da esquerda sempre. Ou seja, vai chegar no número 2. Significa que está procurando o menor valor da árvore. Ou seja, resposta é minimum. (Gabarito: Letra B)
40
1. (CESPE/CEBRASPE – 2020 – Ministério da Economia) A respeito de dados, informação, conhecimento e inteligência, julgue o próximo item. Embora com características particulares, dados não estruturados podem ser classificados em sua totalidade, assim como os dados estruturados.
Dados não estruturados não possuem uma estrutura pré-definida e, portanto, é computacionalmente muito difícil que sejam classificados ou processados por meio de métodos automatizados. Já os dados estruturados possuem uma estrutura pré-definida, tornando mais fácil de serem classificados ou processados por métodos automatizados. Ou seja, os dois não são a mesma coisa para serem classificados em sua totalidade. Gabarito: Errado
41
2. (FGV – 2015 – DPE/MT – Analista de Sistemas) No desenvolvimento de sistemas, a escolha de estruturas de dados em memória é especialmente relevante. Dentre outras classificações, é possível agrupar essas estruturas em lineares e não lineares, conforme a quantidade de sucessores e antecessores que os elementos da estrutura possam ter. Assinale a opção que apresenta, respectivamente, estruturas de dados lineares e não lineares. a) Tabela de dispersão e fila. b) Estrutura de seleção e pilha. c) Pilha e estrutura de seleção. d) Pilha e árvore binária de busca. e) Fila e pilha.
Além dessa classificação, existe outra também importante: Estruturas Lineares e Estruturas Não-Lineares. As Estruturas Lineares são aquelas em que cada elemento pode ter um único predecessor (exceto o primeiro elemento) e um único sucessor (exceto o último elemento). Como exemplo, podemos citar Listas, Pilhas, Filas, Arranjos, entre outros. Já as Estruturas Não-Lineares são aquelas em que cada elemento pode ter mais de um predecessor e/ou mais de um sucessor. Como exemplo, podemos citar Árvores, Grafos e Tabelas de Dispersão. Essa é uma classificação muito importante e muito simples de entender. Pessoal, vocês perceberão que esse assunto é cobrado de maneira superficial na maioria das questões, mas algumas são nível doutorado! Conforme vimos em aula, trata-se de pilha e árvore respectivamente. Gabarito: Letra D
42
3. (CESPE – 2010 – DETRAN/ES – Analista de Sistemas) Um tipo abstrato de dados apresenta uma parte destinada à implementação e outra à especificação. Na primeira, são descritas, em forma sintática e semântica, as operações que podem ser realizadas; na segunda, os objetos e as operações são representados por meio de representação, operação e inicialização.
A Especificação Sintática define o nome do tipo, suas operações e o tipo dos argumentos das operações, definindo a assinatura do TAD. A Especificação Semântica descreve propriedades e efeitos das operações de forma independente de uma implementação específica. E a Especificação de Restrições estabelece as condições que devem ser satisfeitas antes e depois da aplicação das operações. Conforme vimos em aula, temos duas partes: Especificação e Implementação. Sendo que a especificação se divide em Especificação Sintática e Semântica e Implementação se divide em Representação e Algoritmos. Logo, a questão está invertida: na segunda, são descritas, em forma sintática e semântica, as operações que podem ser realizadas; na primeira, os objetos e as operações são representados por meio de representação, operação e inicialização. Gabarito: Errado
43
4. (CESPE – 2010 – TRT/RN – Analista de Sistemas) O tipo abstrato de dados consiste em um modelo matemático (v,o), em que v é um conjunto de valores e o é um conjunto de operações que podem ser realizadas sobre valores.
Por fim, vamos falar sobre Tipos Abstratos de Dados (TAD). Podemos defini-lo como um modelo matemático (v,o), em que v é um conjunto de valores e o é um conjunto de operações que podem ser realizadas sobre valores. Eu sei, essa definição é horrível de entender! Para compreender esse conceito, basta lembrar de abstração, i.e., apresentar interfaces e esconder detalhes. Conforme vimos em aula, a questão está conforme nós descrevemos em nossa aula. Essa é a definição formal de Tipos Abstratos de Dados. Gabarito: Correto
44
5. (CESPE – 2010 – BASA – Analista de Sistemas) A escolha de estruturas internas de dados utilizados por um programa pode ser organizada a partir de TADs que definem classes de objetos com características distintas.
Em outras palavras, o nível semântico trata do comportamento de um tipo abstrato de dados; e o nível sintático trata da apresentação de um tipo abstrato de dados. Podemos dizer, então, que o TAD encapsula uma estrutura de dados com características semelhantes – podendo ser formado por outros TADs –, e esconde a efetiva implementação dessa estrutura de quem a manipula. Conforme vimos em aula, definem classes de objetos com características semelhantes. Gabarito: Errado
45
6. (CESPE – 2010 – BASA – Analista de Sistemas) A descrição dos parâmetros das operações e os efeitos da ativação das operações representam, respectivamente, os níveis sintático e semântico em que ocorre a especificação dos TADs.
A Especificação Sintática define o nome do tipo, suas operações e o tipo dos argumentos das operações, definindo a assinatura do TAD. A Especificação Semântica descreve propriedades e efeitos das operações de forma independente de uma implementação específica. E a Especificação de Restrições estabelece as condições que devem ser satisfeitas antes e depois da aplicação das operações. Conforme vimos em aula, realmente se trata respectivamente do nível sintático e semântico. Gabarito: Correto
46
7. (FCC – 2010 – TRE/AM – Analista de Sistemas) Em relação aos tipos abstratos de dados - TAD, é correto afirmar: a) O TAD não encapsula a estrutura de dados para permitir que os usuários possam ter acesso a todas as operações sobre esses dados. b) Na transferência de dados de uma pilha para outra, não é necessário saber como a pilha é efetivamente implementada. c) Alterações na implementação de um TAD implicam em alterações em seu uso. d) Um programador pode alterar os dados armazenados, mesmo que não tenha conhecimento de sua implementação. e) TAD é um tipo de dados que esconde a sua implementação de quem o manipula.
Em outras palavras, o nível semântico trata do comportamento de um tipo abstrato de dados; e o nível sintático trata da apresentação de um tipo abstrato de dados. Podemos dizer, então, que o TAD encapsula uma estrutura de dados com características semelhantes – podendo ser formado por outros TADs –, e esconde a efetiva implementação dessa estrutura de quem a manipula. (a) Errado, ele encapsula a estrutura de dados; (b) Correto, não é necessário saber a implementação, porém a FCC marcou o gabarito como errado; (c) Errado, a implementação pode mudar livremente; (d) Errado, sem conhecimento da implementação, ele não poderá alterar dados armazenados; (e) Correto, esse item também está correto (Lembrem-se: Na FCC, muitas vezes tempos que marcar a mais correta ou a menos errada – infelizmente!). Gabarito: Letra E
47
8. (FCC – 2009 – TRE/PI – Analista de Sistemas) Em relação a tipos abstratos de dados, é correto afirmar que: a) o TAD não encapsula a estrutura de dados para permitir que os usuários possam ter acesso a todas as operações disponibilizadas sobre esses dados. b) algumas pilhas admitem serem declaradas como tipos abstratos de dados. c) filas não permitem declaração como tipos abstratos de dados. d) os tipos abstratos de dados podem ser formados pela união de tipos de dados primitivos, mas não por outros tipos abstratos de dados. e) são tipos de dados que escondem a sua implementação de quem o manipula; de maneira geral as operações sobre estes dados são executadas sem que se saiba como isso é feito.
Em outras palavras, o nível semântico trata do comportamento de um tipo abstrato de dados; e o nível sintático trata da apresentação de um tipo abstrato de dados. Podemos dizer, então, que o TAD encapsula uma estrutura de dados com características semelhantes – podendo ser formado por outros TADs –, e esconde a efetiva implementação dessa estrutura de quem a manipula. (a) Errado. Pelo contrário, ele encapsula a estrutura de dados de modo que o usuário não tem acesso a implementação das operações; (b) Correto. Todas elas admitem, porém a FCC marcou o gabarito como errado; (c) Errado. Elas permitem a declaração como tipos abstratos de dados; (d) Errado. Um TAD pode ser formado por outros TADs; (e) Correto. Escondem a implementação de quem os manipula. Gabarito: Letra E
48
1. (IBFC – 2022 – DETRAN-AM) Relacione as duas colunas quanto aos respectivos tipos de Estruturas de Dados: (A) Vetores (B) Registros (C) Matrizes (1) Homogêneas (2) Heterogêneas a) A2 - B1 - C2 b) A1 - B1 - C2 c) A2 - B2 - C1 d) A1 - B2 - C1
Por definição, temos que: * Estruturas de dados homogêneas: seus elementos possuem o mesmo tipo de dado básico. * Estrutura de dados heterogênea: seus elementos possuem tipos de dados distintos. Via de regra, um vetor e uma matriz possuem sempre o mesmo tipo de dados: um vetor de inteiro, um vetor de string, um vetor de booleanos, e assim por diante. Portanto, são homogêneos. Já um registro é um agrupamento de várias variáveis, cada uma podendo ter um tipo de dados diferente. Portanto, é heterogêneo. Assim, A1 – B2 – C1. Gabarito: Letra D
49
2. (IADES – 2022 – ADASA) Com base nas definições referentes à estrutura de dados digitais, à vetorização e à digitalização, assinale a alternativa correta. a) A estrutura vetorial é composta por uma grade homogênea de linhas e colunas. b) A digitalização é o processo de mudança de documentos cartográficos do formato vetorial para o formato raster. c) A digitalização é o processo de transformação de documentos cartográficos do formato vetorial para o formato digital. d) A vetorização é o processo de conversão de um arquivo vetorial para o formato raster. e) A estrutura matricial é representada por uma matriz com “n” linhas e “m” colunas, na qual cada célula apresenta um valor “z” que pode indicar, por exemplo, uma cor ou um tom de cinza a ele atribuída.
Vamos analisar item a item: a) A estrutura vetorial é composta por uma grade homogênea de linhas e colunas. A estrutura vetorial é linear e homogênea. O correto seria dizer que a estrutura matricial é composta por uma grade homogênea de linhas e colunas, e não vetorial. Falso. b) A digitalização é o processo de mudança de documentos cartográficos do formato vetorial para o formato raster. A digitalização vai transformar documentos analógicos em formato digital. Falso. c) A digitalização é o processo de transformação de documentos cartográficos do formato vetorial para o formato digital. A digitalização vai transformar documentos analógicos em formato digital. Falso. d) A vetorização é o processo de conversão de um arquivo vetorial para o formato raster. A vetorização converte um arquivo raster em arquivo vetorial. Falso. e) A estrutura matricial é representada por uma matriz com “n” linhas e “m” colunas, na qual cada célula apresenta um valor “z” que pode indicar, por exemplo, uma cor ou um tom de cinza a ele atribuída. Esta é uma boa definição de matriz. Correto! Gabarito: Letra E
50
3. (UFPRE – 2022 – UFPRE) A estrutura de dados "vetor" (array) é um arranjo unidimensional que pode acomodar múltiplos dados. Sobre essas estruturas de dados, assinale a alternativa incorreta. a) Os dados de um vetor são mapeados numa área contígua da memória. b) Os dados de um vetor são do mesmo tipo. c) Cada um dos dados de um vetor pode ser acessado informando-se o identificador do vetor e o inteiro que indica a ordem do dado na sequência. d) Os dados de um vetor são armazenados na memória ordenadamente, em modo crescente. e) Pode-se atribuir um dado a um elemento de qualquer posição do vetor, independentemente do que foi atribuído aos demais elementos.
A questão quer a alternativa falsa. Vamos analisar item a item: a) Os dados de um vetor são mapeados numa área contígua da memória. É isso mesmo, os vetores ficam numa área sequencial ou contígua da memória. Verdadeiro. b) Os dados de um vetor são do mesmo tipo. De fato, o vetor é homogêneo, ou seja, todos os seus elementos têm o mesmo tipo básico. Verdadeiro. c) Cada um dos dados de um vetor pode ser acessado informando-se o identificador do vetor e o inteiro que indica a ordem do dado na sequência. Isso mesmo, os dados do vetor podem ser acessados considerando um valor inteiro. Por exemplo, iniciando se no 0, vetor[0] acessa o elemento na primeira posição, enquanto vetor[3] acessa o elemento na quarta posição. Verdadeiro. d) Os dados de um vetor são armazenados na memória ordenadamente, em modo crescente. Não é regra que os dados em si do vetor estejam armazenados de modo crescente. Eles podem estar, mas não é regra. Falso. e) Pode-se atribuir um dado a um elemento de qualquer posição do vetor, independentemente do que foi atribuído aos demais elementos. Sim, um dado pode ser atribuído a qualquer posição, e os valores das demais posições são irrelevantes. Verdadeiro. Gabarito: Letra D
51
4. (FUNDATEC – 2022 – Prefeitura de Restinga Sêca - RS) Assinale a estrutura de dados linear e estática, caracterizada por uma sequência de elementos de um mesmo tipo de dado e que são armazenados em posições consecutivas de memória. a) Matriz. b) Lista ligada. c) Registro. d) Árvore binária. e) Vetor.
Vamos de item a item: a) Matriz. Matriz é uma estrutura de dados bidimensional, e não linear. Falso. b) Lista ligada. Uma lista ligada não tem, necessariamente, os seus elementos em posições consecutivas de memória. Falso. c) Registro. Um registro não necessariamente tem os elementos do mesmo tipo. Falso. d) Árvore binária. Uma árvore binária é uma estrutura hierárquica, e não linear. Falso. e) Vetor. A definição do enunciado é uma ótima definição de vetor. Verdadeiro. Gabarito: Letra E
52
6. (FCC – 2019 – SANASA Campinas) Um Analista de TI necessitou usar uma estrutura de dados simples que utilizasse pouca carga de memória de armazenamento. Tal estrutura é vista como um arranjo cuja capacidade pode variar dinamicamente, isto é, se o espaço reservado for totalmente ocupado e algum espaço adicional for necessário, este será alocado automaticamente não havendo a necessidade de se preocupar com a capacidade de armazenamento ou sua ocupação. Contudo, para que se possa utilizar essa coleção de dados de forma adequada, algumas informações necessárias devem ser mantidas internamente, tais como a quantidade total de elementos e a última posição ocupada na coleção, conforme exemplificado na figura abaixo. Trata-se da estrutura linear unidimensional a) string. b) hashing. c) árvore. d) matriz. e) vetor.
Vamos analisar item a item: a) string. Para ser uma string, deveria armazenar caracteres, o que não é informado no enunciado. Falso. b) hashing. Para ser hashing, deveria ser mencionado um algoritmo de hashing, o que não é informado. Falso. c) árvore. Para ser uma árvore, deveriam ser mencionadas estruturas como nós e filhos, o que não é o caso. Falso. d) matriz. Para ser uma matriz, a estrutura deveria ter linhas e colunas. Mas ela é uma estrutura unidirecional. Falso. e) vetor. As informações ditas no enunciado se referem a um vetor. Verdadeiro. Gabarito: Letra E
53
8. (FCC – 2012 – TJ-RJ) O algoritmo conhecido como busca binária é um algoritmo de desempenho ótimo para encontrar a posição de um item em a) uma árvore B. b) uma lista ligada ordenada. c) uma árvore de busca binária. d) um heap binário. e) um vetor ordenado.
O algoritmo de busca binária realiza buscas em uma estrutura linear e ordenada, que permita acesso direto aos seus elementos por meio de um índice numérico, e dividindo a estrutura ao meio e buscando em suas metades. Por isso, vamos analisar item a item: a) uma árvore B. Uma árvore é uma estrutura hierarquizada, e não linear. Falso. b) uma lista ligada ordenada. Uma lista ligada não permite o acesso direto aos seus elementos por meio de um índice numérico. Falso. c) uma árvore de busca binária. Uma árvore é uma estrutura hierarquizada, e não linear. Falso. d) um heap binário. Um heap binário não está necessariamente com os dados ordenados. Falso. e) um vetor ordenado. Essa é a resposta correta, pois o vetor está ordenado, e permite acesso direto aos elementos por um índice numérico. Correto! Gabarito: Letra E
54
9. (FCC - 2009 - TJ-PA - Analista Judiciário - Tecnologia da Informação) Considere uma estrutura de dados do tipo vetor. Com respeito a tal estrutura, é correto que seus componentes são, caracteristicamente, a) heterogêneos e com acesso FIFO. b) heterogêneos e com acesso LIFO. c) heterogêneos e com acesso indexado-sequencial. d) homogêneos e acesso não indexado. e) homogêneos e de acesso aleatório por intermédio de índices.
Vetores possuem componentes homogêneos, i.e., todos os dados são de apenas um único tipo básico de dados. Ademais, seu acesso é aleatório por meio de índices! Bem, seria mais correto dizer que seu acesso é direto. Gabarito: E
55
10. (CETAP - 2010 - AL-RR - Analista de Sistemas) Matrizes são estruturas de dados de n-dimensões. Por simplicidade, chamaremos de matrizes as matrizes bidimensionais numéricas (que armazenam números inteiros). Sendo assim, marque a alternativa INCORRETA. a) Uma matriz de m linhas e n colunas contêm (m * n) dados. b) Uma matriz pode ser representada utilizando listas ligadas. c) A soma dos elementos de uma matriz pode ser calculada fazendo dois laços aninhados, um sobre as linhas e o outro sobre as colunas. d) A soma de duas matrizes de m linhas e n colunas resulta em uma matriz de 2*m linhas e 2*n colunas. e) O produto de duas matrizes de n linhas e n colunas resulta em uma matriz de n linhas e n colunas.
(a) Perfeito, são M x N colunas; (b) Perfeito, podem ser utilizadas listas ligadas; (c) Perfeito, um laço para as linhas e outro para as colunas; (d) Não, a soma de uma Matriz 3x5 com outra Matriz 3x5 resulta em uma Matriz 3x5; (e) Perfeito, uma Matriz 2x2 multiplicada por outra Matriz 2x2 resulta em uma Matriz 2x2. Gabarito: Letra D
56
11. (CESPE - 2010 - Banco da Amazônia - Técnico Científico - Tecnologia da Informação - Arquitetura de Tecnologia) Os dados armazenados em uma estrutura do tipo matriz não podem ser acessados de maneira aleatória. Portanto, usa-se normalmente uma matriz quando o volume de inserção e remoção de dados é maior que o volume de leitura dos elementos armazenados.
Podem, sim, ser acessados de maneira aleatória ou direta, por meio de seus índices. Ademais, usa-se normalmente uma matriz quando o volume de leitura de elementos armazenados é maior que o volume de inserção e remoção de dados. Ora, é possível fazer acesso direto, logo é eficiente mesmo com alto volume de leitura. Gabarito: Errado
57
12. (CESPE - 2008 - TRT - 5ª Região (BA) - Técnico Judiciário - Tecnologia da Informação) Entre alguns tipos de estrutura de dados, podem ser citados os vetores, as pilhas e as filas.
Questão extremamente simples – realmente são exemplos de estruturas de dados. Gabarito: Correto
58
13. (CESPE - 2011 - EBC - Analista - Engenharia de Software) Vetores são utilizados quando estruturas indexadas necessitam de mais que um índice para identificar um de seus elementos.
Não! Se são necessários mais de um índice, utilizam-se Matrizes! Vetores necessitam apenas de um índice. Gabarito: Errado
59
14. (CESPE - 2010 - TRE-BA - Analista Judiciário - Análise de Sistemas) Vetores podem ser considerados como listas de informações armazenadas em posição contígua na memória.
Perfeito! Vetores podem ser considerados como listas de informações? Sim! As informações (dados) são armazenadas em posição contígua na memória? Sim, em geral são armazenados de forma contígua. Gabarito: Correto
60
15. (CESPE - 2010 - TRE-BA - Analista Judiciário - Análise de Sistemas) Uma posição específica de um vetor pode ser acessada diretamente por meio de seu índice.
Perfeito! Observem que vetores são diferentes de listas, nesse sentido. Eu posso acessar qualquer elemento diretamente por meio de seu índice. Gabarito: Correto
61
1. (UFV – 2022 – UFV-MG) Considere as afirmativas a seguir sobre estrutura de dados: I. Uma estrutura de dados heterogênea envolve a utilização de mais de um tipo básico de dado. II. Uma lista encadeada pode ser definida como uma sequência de células em que cada célula contém um elemento e o endereço da célula seguinte. III. Uma pilha é uma estrutura de dados baseada no princípio “First In First Out” (FIFO). IV. Filas e pilhas são estruturas de dados lineares; o organograma de uma empresa pode ser representado por uma estrutura de árvore. Está CORRETO o que se afirma, apenas, em: a) I e II. b) I e III. c) I, II e IV. d) II, III e IV.
Vamos analisar item a item: I. Uma estrutura de dados heterogênea envolve a utilização de mais de um tipo básico de dado. Isso mesmo. Significa que cada elemento da estrutura de dados pode ter mais de um tipo básico de dado. Por exemplo, um inteiro, uma string, um booleano, etc. Verdadeiro. II. Uma lista encadeada pode ser definida como uma sequência de células em que cada célula contém um elemento e o endereço da célula seguinte. Essa é a definição de lista encadeada simples. Certo. III. Uma pilha é uma estrutura de dados baseada no princípio “First In First Out” (FIFO). Na verdade, a pilha segue a estrutura de dados com a regra LIFO (last-in first-out), ou seja, o último a entrar é o primeiro a sair. Falso. IV. Filas e pilhas são estruturas de dados lineares; o organograma de uma empresa pode ser representado por uma estrutura de árvore. Filas e pilhas são estruturas lineares de fato, e uma árvore é uma estrutura hierárquica, e, por isso, um organograma de uma empresa pode ser representado por ela. Verdadeiro. Corretas: I, II e IV. Gabarito: Letra C
62
2. (Quadrix – 2022 – PRODAM-AM) Assinale a alternativa que apresenta o nome do tipo de estrutura em que cada elemento armazena um ou vários dados e um ponteiro para o próximo elemento, que permite o encadeamento e mantém a estrutura linear, sendo que, nesse tipo de estrutura, são abordadas as seguintes operações: inserir no início da lista; inserir no fim; consultar toda a lista; remover um elemento qualquer dela; e esvaziá-la. a) lista simplesmente encadeada e não ordenada b) lista simplesmente encadeada e ordenada c) lista duplamente encadeada e não ordenada d) lista duplamente encadeada e não ordenada e) lista triplamente encadeada
O enunciado fala em ponteiro para o próximo elemento, e não cita ponteiro para o elemento anterior. Portanto, dá para inferir que se trata de uma lista simplesmente encadeada. O enunciado também não fala em ordenação. Portanto, seria uma lista simplesmente encadeada e não ordenada. Gabarito: Letra A
63
3. (FUNDATEC – 2022 – IF-RS) Que tipo de estrutura de dados está representada na Figura 1 abaixo? a) Árvore binária. b) Fila. c) Pilha. d) Lista ligada. e) Vetor.
Note que cada elemento possui um ponteiro para o próximo, exceto o último, que aponta para “null”. Trata-se de uma lista ligada. Como a questão não fala sobre regras de inserção e remoção (LIFO ou FIFO), não pode ser fila ou pilha. Como é uma estrutura sequencial, não pode ser árvore, que é uma estrutura hierárquica. Para ser um vetor, deveria ter seus elementos em posições de memória sequenciais, e não utilizando ponteiros. Portanto, é uma lista ligada. Gabarito: Letra D
64
4. (IBADE – 2022 – SES-MG) Uma estrutura de dados onde existe uma coleção ordenada de entidades sendo a metodologia de busca com base no deslocamento relativo ao primeiro (cabeça) da coleção, chama-se: a) árvore. b) lista. c) pilha. d) fila. e) árvore binária.
Vamos analisar item a item: a) árvore. Em uma árvore, o deslocamento é feito a partir do nó raiz, e não da cabeça. Falso. b) lista. Em uma lista, temos a referência ao primeiro elemento, que é chamado de cabeça. Depois, cada elemento tem um apontamento para o próximo. Dessa forma, para buscar, temos que, de fato, ir da cabeça e seguir aos seguintes. Verdadeiro. c) pilha. Em uma pilha, temos o topo da pilha. Neste caso, temos apenas 3 operações: top, para ver qual elemento está no topo da pilha; pop, para remover o elemento do topo da pilha; e push, para incluir um elemento na pilha. Não há operação para deslocar sobre ela. Falso. d) fila. Em uma fila, temos duas extremidades, e duas operações: uma para inserir um elemento ao final, e outra pra retirar do início. Não é o caso de haver uma “cabeça” inicial para percorrer as demais. Falso. e) árvore binária. Em uma árvore binária, percorre-se do nó raiz, e não da cabeça. Falso. Gabarito: Letra B
65
6. CESPE/CEBRASPE – 2019 – MPC-PA) Assinale a opção que apresenta a denominação da estrutura de dados constituída por um conjunto de elementos individualizados, em que cada um dos elementos — com exceção dos elementos inicial e final — referencia sempre outros dois, um que o antecede e outro que o sucede. a) lista circular b) grafo c) lista duplamente encadeada d) árvore e) pilha
Vamos analisar item a item: a) lista circular Uma lista em que cada elemento referencia o outro, porém com uma diferença: o último elemento referencia o primeiro também. A questão deixa claro que quer uma estrutrua de dados em que os elementos inicial e final não estejam ligados. Falso. b) Grafo Estrutura de dados com um conjunto de vértices ligados entre si por arestas. Falso. c) lista duplamente encadeada Uma lista em que cada elemento referencia o outro em ambas as direções: um elemento referencia o anterior e o próximo, exceto os elementos inicial e final. É isso aí. Verdadeiro. d) Árvore Estrutura de dados em que um nó possui 1 ou mais filhos, mas cada filho possui somente um pai. Falso. e) pilha Estrutura de dados usando a regra LIFO, last-in first-out, ou seja, o último a entrar é o primeiro a sair. Falso. Gabarito: Letra C
66
7. (CESPE/CEBRASPE – 2017 – TRT-7) Considere uma estrutura de dados em que cada elemento armazenado apresenta ligações de apontamento com seu sucessor e com o seu predecessor, o que possibilita que ela seja percorrida em qualquer sentido. Trata-se de a) uma fila. b) um grafo. c) uma lista duplamente encadeada. d) uma pilha.
Vamos analisar item a item: a) uma fila. Estrutura de dados que segue a lógica FIFO (first-in, first-out), ou “primeiro a entrar é o primeiro a sair”. Os elementos são inseridos no fim da fila e removidos no início. Falso. b) um grafo. Grafo é uma estrutura de dados com um conjunto de vértices e arestas que os ligam. Falso. c) uma lista duplamente encadeada. É uma estrutura de dados que armazena uma sequência de elementos que possuem ligações de apontamento, ou ponteiros, entre si, em ambas as direções. Isso permite percorrer a lista em qualquer sentido. Verdadeiro. d) uma pilha. Estrutura de dados que segue a lógica LIFO, ou last-in first-out, que significa “o último a entrar é o primeiro a sair”. Falso. Gabarito: Letra C
67
8. (CESPE/CEBRASPE – 2018 – BNB) Uma lista encadeada é basicamente uma estrutura de dados em lista em que cada nó possui três campos: um para os dados, um para o endereço do nó anterior, e outro para o endereço do nó posterior.
Este é o conceito de lista duplamente encadeada, e não da lista encadeada. No caso, uma lista encadeada possui um endereço apenas para o nó posterior, e não para o anterior. Gabarito: Errado
68
10. (CESPE/CEBRASPE – 2018 – BNB) Uma lista encadeada é basicamente uma estrutura de dados em lista em que cada nó possui três campos: um para os dados, um para o endereço do nó anterior, e outro para o endereço do nó posterior.
Este é o conceito de lista duplamente encadeada, e não da lista encadeada. No caso, uma lista encadeada possui um endereço apenas para o nó posterior, e não para o anterior. Gabarito: Errado
69
11. (FCC – 2013 – DPE-SP) Em uma ___I____ , para cada novo elemento inserido na estrutura, alocamos um espaço de memória para armazená-lo. Desta forma, o espaço total de memória gasto pela estrutura é proporcional ao número de elementos nela armazenados. No entanto, não podemos garantir que os elementos armazenados na lista ocuparão um espaço de ___II____ contíguo, portanto, não temos acesso direto aos elementos da lista. Para que seja possível percorrer todos os elementos da ____III____ , devemos explicitamente guardar o encadeamento dos elementos, o que é feito armazenando-se, junto com a informação de cada elemento, um ______IV______ para o próximo elemento da ____V____ . As lacunas de I a V, são preenchidas, corretas e respectivamente, por: a) estrutura de pilha - tamanho - memória - array - pilha b) lista encadeada - memória - lista - ponteiro - lista c) estrutura de filas (FIFO) - disco - sequência - buffer - memória alocada d) arquitetura de memória primária - tamanho - fila - contador sequencial - conexão e) arquitetura TCP/IP - tamanho fixo - conexão - número de roteamento - tabela MTU
Podemos perceber que o enunciado está falando de listas encadeadas, já que, para cada novo elemento, alocamos um espaço na memória para armazená-lo, e não necessariamente estes espaços são contíguos, de modo que são ligados entre si por ponteiros ou referências. Portanto, é letra B. A letra a) fala de pilha, portanto está errada já no primeiro item. A letra c) fala de filas, e, portanto, também está errada. Os demais itens d) e e) não têm nada a ver com o assunto. Gabarito: Letra B
70
12. (FCC – FAURGS – SES-RS) Qual é a afirmativa correta sobre estruturas de dados? a) Uma pilha armazena os dados em uma estrutura de dados do tipo árvore binária. b) Listas encadeadas são estruturas que encadeiam os elementos através de um ponteiro no qual todos os elementos, exceto o último, apontam para o seguinte. c) Em uma pilha, o primeiro elemento a ser inserido será o primeiro a ser retirado, ou seja, adicionam-se itens no fim e removem-se do início. d) Uma fila armazena os dados em uma estrutura de dados do tipo grafo. e) Em uma fila, o primeiro elemento a ser inserido será o último a ser retirado, ou seja, adicionam-se e removem- se itens no início.
Vamos analisar item a item: a) Uma pilha armazena os dados em uma estrutura de dados do tipo árvore binária. Não. Uma pilha armazena dados em uma estrutura de dados do tipo lista, seguindo a regra LIFO (last-in first-out), ou seja, o último a entrar é o primeiro a sair. Falso. b) Listas encadeadas são estruturas que encadeiam os elementos através de um ponteiro no qual todos os elementos, exceto o último, apontam para o seguinte. Definição correta de listas encadeadas simples. Verdadeiro. c) Em uma pilha, o primeiro elemento a ser inserido será o primeiro a ser retirado, ou seja, adicionam-se itens no fim e removem-se do início. Na verdade, uma pilha armazena dados em uma estrutura de dados do tipo lista, seguindo a regra LIFO (last-in firstout), ou seja, o último a entrar é o primeiro a sair. Falso. d) Uma fila armazena os dados em uma estrutura de dados do tipo grafo. Não. Uma fila armazena dados em uma estrutura de dados do tipo lista, seguindo a regra FIFO (first-in last-out), ou seja, o primeiro a entrar é o primeiro a sair. Falso. e) Em uma fila, o primeiro elemento a ser inserido será o último a ser retirado, ou seja, adicionam-se e removem- se itens no início. Não. A regra da fila é a FIFO (first-in last-out), ou seja, o primeiro a entrar é o primeiro a sair. Falso. Gabarito: Letra B
71
14. (CESPE - 2012 - Banco da Amazônia - Técnico Científico - Administração de Dados) O tempo de busca de um elemento em uma lista duplamente encadeada é igual à metade do tempo da busca de um elemento em uma lista simplesmente encadeada.
Não! Apesar de permitir que se percorra a lista em ambas as direções, em média ambas possuem o mesmo tempo de busca de um elemento. Gabarito: Errado
72
15. (CESPE - 2012 - Banco da Amazônia - Técnico Científico - Administração de Dados) Em algumas implementações, uma lista vazia pode ter um único nó, chamado de sentinela, nó cabeça ou header. Entre suas possíveis funções, inclui-se simplificar a implementação de algumas operações realizadas sobre a lista, como inserir novos dados, recuperar o tamanho da lista, entre outras.
Perfeito! Ele simplifica a implementação de algumas operações porque se guarda o endereço do primeiro e do último elemento de uma estrutura de dados de modo que o programador não precisa conhecer a estrutura de implementação da lista para realizar suas operações. Gabarito: Correto
73
16. (CESPE - 2012 - Banco da Amazônia - Técnico Científico - Administração de Dados) Estruturas ligadas como listas encadeadas superam a limitação das matrizes que não podem alterar seu tamanho inicial.
Perfeito! Listas Encadeadas admitem alocação dinâmica, em contraste com as matrizes. Gabarito: Correto
74
17. (CESPE - 2012 - Banco da Amazônia - Técnico Científico - Administração de Dados) As listas duplamente encadeadas diferenciam-se das listas simplesmente encadeadas pelo fato de, na primeira, os nós da lista formarem um anel com o último elemento ligado ao primeiro da lista.
Não, a diferença é que Listas Duplamente Encadeadas possuem dois ponteiros, que apontam para o nó sucessor e para o nó predecessor e Listas Simplesmente Encadeadas possuem apenas um ponteiro, que aponta para o nó sucessor. Gabarito: Errado
75
18. (FCC - 2012 - TRE-SP - Analista Judiciário - Análise de Sistemas - E) Numa lista singularmente encadeada, para acessar o último nodo é necessário partir do primeiro e ir seguindo os campos de ligação até chegar ao final da lista.
Perfeito! Se é uma lista singularmente encadeada, é necessário percorrer cada elemento um-a-um até chegar ao final da lista. Gabarito: Correto
76
19. (CESPE - 2011 - EBC - Analista - Engenharia de Software) Uma lista é uma coleção de elementos do mesmo tipo dispostos linearmente, que podem ou não seguir determinada organização. As listas podem ser dos seguintes tipos: de encadeamento simples, duplamente encadeadas e ordenadas.
Uma lista é, por natureza, heterogênea, i.e., seus elementos são compostos por tipos de dados primitivos diferentes. A questão afirmou que a lista é uma coleção de elementos do mesmo tipo. E ela está certa, veja só o peguinha da questão: Eu crio um tipo composto por dois tipos de dados diferentes: tipoEstrategia = {curso: caractere; duracao: inteiro}. Observe que o tipo tipoEstrategia é composto por tipos de dados primitivos diferentes (caractere e inteiro). Agora eu crio uma lista ListaEstrategia: tipoEstrategia. Veja que todos os elementos dessa lista terão o mesmo tipo (tipoEstrategia). Em outras palavras: a Lista Heterogênea é composta por elementos do mesmo tipo que, em geral, são compostos por mais de um tipo primitivo. Além disso, as listas podem ser simplesmente encadeadas, duplamente encadeadas e ordenadas. E ainda podem ser circulares. Observem que alguns autores consideram Listas Ordenadas como um tipo de lista! Como, professor? Ela é uma lista em que seus elementos são ordenados (crescente ou decrescente). Gabarito: Correto
77
20. (CESPE - 2009 - ANAC - Técnico Administrativo - Informática) Em uma lista circular duplamente encadeada, cada nó aponta para dois outros nós da lista, um anterior e um posterior.
Perfeito! Há dois ponteiros: uma para o nó anterior e um para o nó posterior. Gabarito: Correto
78
21. (CESPE - 2008 - TRT - 5ª Região (BA) - Técnico Judiciário - Tecnologia da Informação) A principal característica de uma lista encadeada é o fato de o último elemento da lista apontar para o elemento imediatamente anterior.
Não, o último elemento da lista não aponta para nenhum outro nó em uma lista não-circular. Gabarito: Errado
79
22. (CESPE - 2009 - TCE-AC - Analista de Controle Externo - Processamentos de Dados) Uma lista encadeada é uma coleção de nodos que, juntos, formam uma ordem linear. Se é possível os nodos se deslocarem em ambas as direções na lista, diz-se que se trata de uma lista simplesmente encadeada.
Se é possível os nodos se deslocarem em ambas as direções na lista, diz-se que se trata de uma lista duplamente encadeada. Gabarito: Errado
80
23. (CESPE - 2008 – HEMOBRÁS – Técnico de Informática) Uma estrutura do tipo lista, em que é desejável percorrer o seu conteúdo nas duas direções indiferentemente, é denominado lista duplamente encadeada.
Perfeito, é exatamente isso! Gabarito: Correto
81
24. (CESPE - 2010 – TRE/MT – Analista de Sistemas – C) Uma lista duplamente encadeada é uma lista em que o seu último elemento referencia o primeiro.
Não, isso se trata de uma Lista Circular! Gabarito: Errado
82
25. (CESPE - 2006 – SGA/AC – Analista de Sistemas) O principal problema da alocação por lista encadeada é a fragmentação.
Não! Em geral, a alocação por lista encadeada elimina a fragmentação. Gabarito: Errado
83
26. (CESPE - 2008 – MCT – Analista de Sistemas) O armazenamento de arquivos em disco pode ser feito por meio de uma lista encadeada, em que os blocos de disco são ligados por ponteiros. A utilização de lista encadeada elimina completamente o problema de fragmentação interna.
Não, ela elimina a fragmentação externa! Gabarito: Errado
84
27. (CESPE - 2009 – FINEP – Analista de Sistemas) Uma lista encadeada é uma representação de objetos na memória do computador que consiste de uma sequência de células em que: a) cada célula contém apenas o endereço da célula seguinte. b) cada célula contém um objeto e o tipo de dados da célula seguinte. c) o último elemento da sequência aponta para o próximo objeto que normalmente possui o endereço físico como not null. d) cada célula contém um objeto de algum tipo e o endereço da célula seguinte. e) a primeira célula contém o endereço da última célula.
Cada célula contém um objeto de algum tipo e o endereço da célula seguinte! Gabarito: Letra D
85
28. (CESPE - 2010 – BASA – Analista de Sistemas) Em uma lista encadeada, o tempo de acesso a qualquer um de seus elementos é constante e independente do tamanho da estrutura de dados.
Claro que não! Em uma busca sequencial, o tempo de acesso é proporcional ao tamanho da estrutura de dados, i.e., quanto mais ao final da lista, maior o tempo de acesso! Por que, professor? Porque a lista é acessada sequencialmente (ou seja, é preciso percorrer elemento por elemento) e, não, diretamente (ou seja, pode-se acessar de modo direto). Um vetor tem acesso direto, portanto seu tempo de acesso é igual independentemente do tamanho da estrutura. Gabarito: Errado
86
29. (CESPE - 2010 – INMETRO – Analista de Sistemas – C) Considere que Roberto tenha feito uso de uma lista encadeada simples para programar o armazenamento e o posterior acesso aos dados acerca dos equipamentos instalados em sua empresa. Considere, ainda, que, após realizar uma consulta acerca do equipamento X, Roberto precisou acessar outro equipamento Y que se encontrava, nessa lista, em posição anterior ao equipamento X. Nessa situação, pela forma como os ponteiros são implementados em uma lista encadeada simples, o algoritmo usado por Roberto realizou a consulta ao equipamento Y sem reiniciar a pesquisa do começo da lista.
Não! Infelizmente, ele teve que reiniciar a pesquisa a partir do primeiro elemento da lista, na medida em que ele não pode voltar. Por que, professor? Porque se trata de uma lista encadeada simples e, não, dupla. Portanto, a lista só é percorrida em uma única direção. Gabarito: Errado
87
30. (FCC - 2003 – TRE/AM – Analista de Sistemas) Os dados contidos em uma lista encadeada estão: a) ordenados seqüencialmente. b) sem ordem lógica ou física alguma. c) em ordem física e não, necessariamente, em ordem lógica. d) em ordem lógica e, necessariamente, em ordem física. e) em ordem lógica e não, necessariamente, em ordem física.
A Ordem Física é sua disposição na memória do computador e a Ordem Lógica é como ela pode ser lida e entendida. Ora, a ordem em que ela se encontra na memória pouco importa, visto que cada sistema operacional e cada sistema de arquivos tem sua maneira. Portanto, trata-se da ordem lógica e, não, necessariamente física. Gabarito: Letra E
88
31. (FCC - 2010 – DPE/SP – Analista de Sistemas) Uma estrutura de dados que possui três campos: dois ponteiros e campo de informação denomina-se: a) lista encadeada dupla. b) Lista encadeada simples. c) pilha. d) fila. e) vetor.
Trata-se da Lista Encadeada Dupla: dois ponteiros (Ant e Prox) e um campo de informação. Gabarito: Letra A
89
32. (CESPE - 2010 – TRE/MT – Analista de Sistemas) O algoritmo para inclusão de elementos em uma pilha é usado sem nenhuma alteração para incluir elementos em uma lista.
Galera... uma pilha pode ser implementada por meio de uma lista! Ademais, o algoritmo para inclusão de elementos de ambas necessita do primeiro elemento (ou topo). Portanto, questão correta! Gabarito: Correto
90
1. (FGV – 2022 – PC-AM) Assinale as operações características de uma estrutura de dados do tipo pilha (stack). a) IMPORT, EXPORT. b) INPUT, OUPUT. c) INSERT, REMOVE. d) PUSH, POP. e) READ, READLN.
Push e pop são duas operações de uma pilha: ● Push: inserir um elemento no topo da pilha; ●Pop: remover o último elemento inserido na pilha. Quanto aos demais itens: ● IMPORT, EXPORT: operações de arquivos. ● INPUT, OUPUT: entrada e saída de dados. Não tem a ver com pilhas. ● INSERT, REMOVE: inserir e remover. Embora na pilha tenhamos inserção e remoção, estas operações, com este nome, estão associadas a listas. ● READ, READLN: operações para a entrada de dados. Gabarito: Letra D
91
2. (FGV – 2022 – TJDFT) Júlio está desenvolvendo uma aplicação e precisa implementar um mecanismo de desfazer/refazer de um editor de texto utilizando o algoritmo LIFO (Last In, First Out). Para implementar o algoritmo LIFO, Júlio deve usar a estrutura de dados: a) fila; b) pilha; c) árvore; d) nó folha; e) tabela hash.
Vamos analisar item a item: a) fila; A fila segue a regra FIFO (first-in first-out), ou seja, o primeiro a entrar é o primeiro a sair. Falso. b) pilha; A pilha segue a regra LIFO (last-in first-out), ou seja, o último a entrar é o primeiro a sair. A operação de inserir um valor é o push, e a operação de remover o último inserido é o pop. Verdadeiro. c) árvore; Árvores não seguem necessariamente regras de inserção, além de não serem estruturas sequenciais. Falso. d) nó folha; Nó folha é o nó de uma árvore que não possui filhos. Não tem nada a ver com o enunciado. Falso. e) tabela hash. Tabelas hash não seguem regra LIFO. Falso. Gabarito: Letra B
92
3. (CESPE/CEBRASPE – 2022 – DPE-RO) Em um sistema operacional, a estrutura de dados utilizada para organizar chamadas de funções recursivas por meio da inserção ou remoção de elementos via operações como push e pop é denominada a) lista estática. b) fila. c) hash. d) pilha. e) lista dinâmica.
Push e pop são duas operações de uma pilha: ● Push: inserir um elemento no topo da pilha; ● Pop: remover o último elemento inserido na pilha. A pilha leva em consideração o padrão LIFO, ou seja, last-in first-out, ou seja, o último a entrar é o primeiro a sair. Por isso, suas duas operações são push e pop. Quanto aos demais itens: ● lista estática: uma lista em que o número de elementos é fixo e pré-alocado. ● fila: segue o padrão FIFO, ou seja, first-in first-out, ou seja, o primeiro a entrar é o primeiro a sair. ● Hash: uma estrutura de dados para inserção, busca e remoção de forma rápida. ● lista dinâmica: uma lista em que o número de elementos é alterado dinamicamente enquanto o programa executa. Gabarito: Letra D
93
4. (UFV – 2022 – UFV-MG) Considere as afirmativas a seguir sobre estrutura de dados: I. Uma estrutura de dados heterogênea envolve a utilização de mais de um tipo básico de dado. II. Uma lista encadeada pode ser definida como uma sequência de células em que cada célula contém um elemento e o endereço da célula seguinte. III. Uma pilha é uma estrutura de dados baseada no princípio “First In First Out” (FIFO). IV. Filas e pilhas são estruturas de dados lineares; o organograma de uma empresa pode ser representado por uma estrutura de árvore. Está CORRETO o que se afirma, apenas, em: a) I e II. b) I e III. c) I, II e IV. d) II, III e IV.
Vamos analisar item a item: I. Uma estrutura de dados heterogênea envolve a utilização de mais de um tipo básico de dado. Isso mesmo. Significa que cada elemento da estrutura de dados pode ter mais de um tipo básico de dado. Por exemplo, um inteiro, uma string, um booleano, etc. Verdadeiro. II. Uma lista encadeada pode ser definida como uma sequência de células em que cada célula contém um elemento e o endereço da célula seguinte. Essa é a definição de lista encadeada simples. Certo. III. Uma pilha é uma estrutura de dados baseada no princípio “First In First Out” (FIFO). Na verdade, a pilha segue a estrutura de dados com a regra LIFO (last-in first-out), ou seja, o último a entrar é o primeiro a sair. Falso. IV. Filas e pilhas são estruturas de dados lineares; o organograma de uma empresa pode ser representado por uma estrutura de árvore. Filas e pilhas são estruturas lineares de fato, e uma árvore é uma estrutura hierárquica, e, por isso, um organograma de uma empresa pode ser representado por ela. Verdadeiro. Corretas: I, II e IV. Gabarito: Letra C
94
5. (IBFC – 2022 – DPE-MT) Assinale a alternativa que apresenta a relação entre as duas estruturas de dados da coluna da esquerda com as respectivas características técnicas da coluna da direita. Assinale a alternativa correta. a) 1BC - 2AD b) 1AD - 2BC c) 1BD - 2AC d) 1AC - 2BD
Uma pilha sege a regra LIFO (last-in first-out), ou seja, o elemento inserido por último é o primeiro elemento a sair da lista. Portanto, 1-B. A pilha, também precisa de apenas um ponteiro, que aponta para o topo da pilha. Portanto, 1-BC. Já a fila segue a regra FIFO (first-in first-out), ou seja, o elemento inserido primeiro é o primeiro a sair da lista. Portanto, 2-A. A fila também precisa de dois ponteiros para ser acessada, já que suas operações envolvem adicionar sempre os elementos no final, e remover do início. Portanto, 2-AD. Gabarito: Letra A
95
6. (FUNDATEC – 2022 – IPE Saúde) Uma sequência de valores é armazenada em uma estrutura de dados, onde novos elementos são inseridos no final da lista e removidos também do final da mesma. Dessa forma, qualquer elemento só pode ser removido quando todos os elementos inseridos após ele também forem removidos. Essa descrição caracteriza uma estrutura de dados conhecida como: a) Lista duplamente encadeada. b) Lista simplesmente encadeada. c) Fila. d) Pilha. e) Árvore binária.
Precisamos considerar dois pontos importantes: ● Os elementos são apenas inseridos ao final da lista. ● Os elementos também são removidos apenas no fim da lista. ● Os elementos só podem ser removidos se todos os inseridos após ele tiverem sido removidos. Ou seja, o último a ser inserido é o primeiro a ser removido, ou seja, regra LIFO. A estrutura de dado que segue a regra LIFO é a pilha. Na pilha, temos a operação push, que é inserir um elemento no fim da lista; e a operação pop, que é remover o elemento do fim da lista. E temos a regra LIFO. Analisemos as demais estruturas de dados: ● Lista duplamente encadeada: cada nó tem uma referência ao nó anterior e ao próximo, exceto o primeiro e o último. A inserção e remoção é livre. ● Lista simplesmente encadeada: cada nó tem uma referência ao próximo nó, exceto o último. A inserção e remoção é livre. ● Fila: segue o padrão FIFO (first-in first-out), ou seja, o primeiro a entrar é o primeiro a sair. Além disso, no caso da fila, os elementos são sempre adicionados no fim, e removidos do início da lista. ● Árvore binária: uma árvore binária possui nós com no máximo dois filhos. Não seguem as regras do enunciado. Gabarito: Letra D
96
7. (FGV – 2021 – FUNSAÚDE-CE) As operações POP e PUSH aplicáveis às estruturas de dados são conhecidas como a) árvores binárias. b) bitmaps. c) hashtables. d) listas encadeadas. e) pilhas.
Quando se fala em operações pop e push, só podemos estar falando de pilhas. As pilhas segrem a regra LIFO (last-in first-out), ou seja, o último a entrar é o primeiro a sair. Isso faz com que tenha duas operações: ● PUSH: inclui um elemento na pilha. ● POP: retira o último elemento incluído da pilha. Gabarito: Letra E
97
9. (CESPE/CEBRASPE – 2018 – ABIN) Julgue o item subsequente, relativo à lógica de programação. Pilha é uma estrutura de dados em que o último elemento a ser inserido será o primeiro a ser retirado.
A pilha é uma estrutura de dados que usa o princípio LIFO (Last In, First Out), que significa justamente "último a entrar, primeiro a sair". Gabarito: Certo
98
10. (FGV – 2018 – AL-RO) Considere uma pilha de latas de sardinhas na prateleira de um supermercado. Assinale a estrutura de dados que mais se assemelha ao modo como essas latas são manuseadas. a) Array. b) Binary tree. c) Hashing. d) Linked list. e) Stack.
Essa é praticamente uma questão de inglês... Precisamos saber o que cada uma dessas estruturas significa: a) Array Significa vetor. É uma sequência de elementos de um determinado tipo, em posições sequenciais de memória. Falso. b) Binary tree. Árvore binária. É uma árvore em que cada nó pode ter, no máximo, 3 filhos. Falso. c) Hashing. Técnica para mapear conjuntos de dados em um conjunto de índices de um array, permitindo rápida busca dos dados. Falso. d) Linked list. Lista encadeada. Uma estrutura de dados em que cada elemento possui uma referência ao próximo elemento da lista. Falso. e) Stack. Também conhecida como pilha. Veja só que o enunciado fala justamente sobre pilha de sardinhas! É uma estrutura em que vale a regra LIFO (last-in first-out), ou seja, o último a entrar é o primeiro a sair. Verdadeiro. Gabarito: Letra E
99
12. (CESPE - 2011 - FUB - Analista de Tecnologia da Informação - Específicos) As pilhas são listas encadeadas cujos elementos são retirados e acrescentados sempre ao final, enquanto as filas são listas encadeadas cujos elementos são retirados e acrescentados sempre no início.
Bem... o que é o final de uma Pilha? Pois é, não se sabe! O que existe é o Topo da Pilha, de onde sempre são retirados e acrescentados elementos. Em Filas, elementos são retirados do início e acrescentados no final. Gabarito: Errado
100
13. (CESPE - 2013 - INPI - Analista de Planejamento - Desenvolvimento e Manutenção de Sistemas) Na estrutura de dados do tipo lista, todo elemento novo que é introduzido na pilha torna-se o elemento do topo.
Que questão confusa! Vamos comigo: vocês sabem muito bem que filas e pilhas são considerados espécies de listas. A questão inicialmente fala de uma lista, mas depois ela menciona uma pilha – podemos inferir, então, que se trata de uma lista do tipo pilha. Em uma pilha, todo elemento novo que é introduzido tornase o elemento do topo, logo... questão correta! Bem, esse foi o Gabarito Preliminar, mas a banca mudou de opinião e, no Gabarito Definitivo, permaneceu como errada. E a justificativa dela foi: “A ausência de especificação do tipo de lista no item torna correta ainformação nele apresentada, razão pela qual se opta pela alteração de seu gabarito”. Vejam que bizarro: se torna correta a informação apresentada, o gabarito definitivo deveria ser C e, não, E. Além disso, a questão informa em sua segunda parte que se trata de uma pilha. Logo, não há que se falar em “ausência de especificação do tipo de lista”. Enfim, questão péssima, horrível e mal redigida :( Gabarito: Errado
101
14. (CESPE - 2012 - TJ-RO - Analista Judiciário - Analista de Sistemas Suporte – E) Visitas a sítios armazenadas em um navegador na ordem last-in-first-out é um exemplo de lista.
Não! Last-In-First-Out (LIFO) é um exemplo de Pilha! Cuidado, pilhas podem ser implementadas como listas, mas esse não é o foco da questão. Gabarito: Errado
102
15. (ESAF - 2013 - DNIT - Analista Administrativo - Tecnologia da Informação) Assinale a opção correta relativa às operações básicas suportadas por pilhas. a) Push: insere um novo elemento no final da pilha. b) Pop: adiciona elementos ao topo da pilha. c) Pull: insere um novo elemento no interior da pilha. d) Top: transfere o último elemento para o topo da pilha. e) Top: acessa o elemento posicionado no topo da pilha.
(a) Não, é no topo; (b) Não, remove do topo; (c) Não, não existe; (d) Não, simplesmente acessa e consulta o elemento do topo; (e) Perfeito! Gabarito: E Gabarito: Letra
103
16. (FCC - 2012 – TST - Analista de Sistemas – C) As pilhas e as filas são estruturas de dados essenciais para os sistemas computacionais. É correto afirmar que a pilha é conhecida como lista FIFO - First In First Out.
Não! Pilha é LIFO e Fila é FIFO. Gabarito: Errado
104
17. (FCC - 2012 – TRE/CE - Analista de Sistemas) Sobre pilhas é correto afirmar: a) Uma lista LIFO (Last-In/First-Out) é uma estrutura estática, ou seja, é uma coleção que não pode aumentar e diminuir durante sua existência. b) Os elementos na pilha são sempre removidos na mesma ordem em que foram inseridos. c) Uma pilha suporta apenas duas operações básicas, tradicionalmente denominadas push (insere um novo elemento no topo da pilha) e pop (remove um elemento do topo da pilha). d) Cada vez que um novo elemento deve ser inserido na pilha, ele é colocado no seu topo e, em qualquer momento, apenas aquele posicionado no topo da pilha pode ser removido. e) Sendo P uma pilha e x um elemento qualquer, a operação Push(P,x) diminui o tamanho da pilha P, removendo o elemento x do seu topo.
(a) Não, é uma estrutura dinâmica; (b) Não, é na ordem inversa (último a entrar é o primeiro a sair); (c) Não, há também Top ou Check, que acessar e consulta o elemento do topo; (e) Push é a operação de inserção de novos elementos na pilha, portanto aumenta seu tamanho adicionando o elemento x no topo. E a letra D? Vamos lá! Sabemos que uma pilha é um tipo de lista - o que muda é apenas a perspectiva. Como assim? Eu vejo um monte de elementos em sequência. Ora, se eu coloco uma regra em que o primeiro elemento a entrar é o primeiro a sair, chamamos essa lista de fila; se eu coloco uma regra em que o primeiro elemento a entrar é o último a sair, chamamos essa lista de pilha. Ok! Dito isso, o algoritmo é exatamente o mesmo, eu vou simplesmente mudar a perspectiva e a minha visão sobre a estrutura. Bacana? Gabarito: Letra D
105
18. (CESPE - 2011 - EBC - Analista - Engenharia de Software) As pilhas, também conhecidas como listas LIFO ou PEPS, são listas lineares em que todas as operações de inserção e remoção de elementos são feitas por um único extremo da lista, denominado topo.
Não! LIFO é similar a UEPS (Último a Entrar, Primeiro a Sair). PEPS refere-se a Primeiro a Entrar, Primeiro aSair, ou seja, FIFO. Gabarito: Errado
106
19. (VUNESP - 2011 - TJM-SP - Analista de Sistemas - Judiciário) Lista do tipo LIFO (Last in, First Out) e lista do tipo FIFO (Firstin,First Out) são, respectivamente, características das estruturas de dados denominadas: a) Fila e Pilha. b) Pilha e Fila. c) Grafo e Árvore. d) Árvore e Grafo. e) Árvore Binária e Árvore Ternária.
E aí, já está automático para responder? Tem que ser automática: Pilha (LIFO) e Fila (FIFO). Gabarito: Letra B
107
20. (CESPE - 2010 - Banco da Amazônia - Técnico Científico - Tecnologia da Informação - Arquitetura de Tecnologia) A definição da estrutura pilha permite a inserção e a eliminação de itens, de modo que uma pilha é um objeto dinâmico, cujo tamanho pode variar constantemente.
Essa questão é polêmica, porque é inevitável pensar em Pilhas Sequenciais (implementadas por vetores estáticos)! No entanto, é comum que as bancas tratem por padrão Pilha como Pilha Encadeada (implementadas por listas dinâmicas). Dessa forma, a questão está perfeita! Gabarito: Correto
108
21. (CESPE - 2010 - Banco da Amazônia - Técnico Científico - Tecnologia da Informação - Administração de Dados) Na representação física de uma pilha sequencial, é necessário uso de uma variável ponteiro externa que indique a extremidade da lista linear onde ocorrem as operações de inserção e retirada de nós.
As Pilhas oferecem três operações básicas: push, que insere um novo elemento no topo da pilha; pop, que remove um elemento do topo da pilha; e top (também conhecida como check), que acessa e consulta o elemento do topo da pilha. Pilhas podem ser implementadas por meio de Vetores (Pilha Sequencial - Alocação Estática de Memória) ou Listas (Pilha Encadeada - Alocação Dinâmica de Memória). Conforme vimos em aula, a questão trata de uma Pilha Sequencial (i.e., implementada por meio de Vetores). Dessa forma, não é necessário o uso de ponteiros – esse seria o caso de uma Pilha Encadeada. Eu posso realmente dizer que é suficiente, mas não posso afirmar que é necessária a utilização de um ponteiro externo. Eu até poderia dizer que é necessário o uso de um indicador, mas ele também não necessariamente será um ponteiro. Logo, discordo do gabarito! Gabarito: Correto
109
22. (CESPE - 2009 - ANAC - Técnico Administrativo - Informática) As operações de inserir e retirar sempre afetam a base de uma pilha.
Não, sempre afetam o topo da pilha! Gabarito: Errado
110
23. (FCC - 2009 - TRT - 16ª REGIÃO (MA) - Técnico Judiciário - Tecnologia da Informação) Pilha é uma estrutura de dados: a) cujo acesso aos seus elementos segue tanto a lógica LIFO quanto a FIFO. b) cujo acesso aos seus elementos ocorre de forma aleatória. c) que pode ser implementada somente por meio de vetores. d) que pode ser implementada somente por meio de listas. e) cujo acesso aos seus elementos segue a lógica LIFO, apenas.
(a) Não, somente LIFO; (b) Não, somente pelo Topo; (c) Não, pode ser por listas; (d) Não, pode ser por vetores; (e) Perfeito, é exatamente isso. Gabarito: E
111
24. (CESPE - 2004 – STJ – Analista de Sistemas) Em geral, em uma pilha só se admite ter acesso ao elemento localizado em seu topo. Isso se adapta perfeitamente à característica das seqüências em que só o primeiro componente é diretamente acessível.
Perfeito, é exatamente isso – muda-se apenas a perspectiva! Gabarito: Correto
112
26. (CESPE - 2010 – TRE/MT - Analista de Sistemas – A) O tipo nó é inadequado para implementar estruturas de dados do tipo pilha.
Não! Uma pilha pode ser implementada por meio de um vetor ou de uma lista. Nesse último caso, temos tipos nós! Gabarito: Errado
113
27. (FGV – 2015 – DPE/MT – Analista de Sistemas) Assinale a opção que apresenta a estrutura de dados na qual o primeiro elemento inserido é o último a ser removido. a) Árvore b) Fila c) Pilha d) Grafo e) Tabela de dispersão
Também conhecida como Lista LIFO (Last In First Out), basta lembrar de uma pilha de pratos esperando para serem lavados, i.e., o último a entrar é o primeiro a sair. A ordem em que os pratos são retirados da pilha é o oposto da ordem em que eles são colocados sobre a pilha e, como consequência, apenas o prato do topo da pilha está acessível. Conforme vimos em aula, trata-se da Pilha. Gabarito: C
114
28. (FCC – 2012 – MPE/AP – Técnico Ministerial - Informática) Nas estruturas de dados, a) devido às características das operações da fila, o primeiro elemento a ser inserido será o último a ser retirado. Estruturas desse tipo são conhecidas como LIFO. b) as pilhas são utilizadas para controlar o acesso de arquivos que concorrem a uma única impressora. c) a fila é uma lista linear na qual as operações de inserção e retirada ocorrem apenas no início da lista. d) a pilha é uma lista linear na qual as operações de inserção e retirada são efetuadas apenas no seu topo. e) devido às características das operações da pilha, o último elemento a ser inserido será o último a ser retirado. Estruturas desse tipo são conhecidas como FIFO.
(a) as filas não são LIFO, mas sim FIFO, ou seja, o primeiro elemento da fila será, na verdade, o primeiro a ser retirado. Só pensarmos numa fila de banco, se alguém chega por último e é atendido primeiro, ficaria bem bravo, e vocês?? :D Item errado; (b) os trabalhos que chegam a uma impressora devem ser do tipo FIFO, ou seja, o primeiro trabalho enviado deve ser o primeiro a ser impresso. Item errado; (c) na fila os elementos são incluídos numa das extremidades e retirados da outra. Item errado; (d) na pilha as operações de inclusão na pilha quanto de retirada acontecem numa mesma extremidade. A extremidade escolhida é o topo da pilha. Item certo; (e) na verdade essas características são das filas. Item errado. Gabarito: Letra D
115
1. (IBFC – 2022 – AFEAM) Assinale, das alternativas abaixo, a única que identifica respectivamente uma Estrutura de Dados do tipo FIFO (First In, First Out) e uma outra com a Estrutura de dados do tipo LIFO (Last In, First Out): a) lista – vetor b) pilha – fila c) vetor – lista d) fila - pilha
Uma estrutura que segue a regra de dados FIFO (first-in first-out), ou seja, o primeiro a entrar é o primeiro a sair, é a fila. Já a estrutura que segue a regra de dados LIFO (last-in first-out), ou seja, o último a entrar é o primeiro a sair, é uma pilha. Gabarito: Letra D
116
2. (IF-TO – 2022 – IF-TO) Em estrutura de dados os conceitos de FILAS e PILHAS são usados para implementar diversos recursos computacionais que vão desde compiladores e interpretadores a mecanismos usados nas linguagens de programação para auxiliar os desenvolvedores no dia a dia. Sobre essas estruturas, quais das definições abaixo são corretas? a) Nas FILAS é usado o princípio do primeiro a entrar é o último a sair, já as PILHAS obedecem a regra do primeiro a entrar é o último a sair. b) Nas FILAS é usado o princípio do primeiro a entrar é o primeiro a sair, já as PILHAS obedecem a regra do primeiro a entrar é o primeiro a sair. c) Nas FILAS é usado o princípio do segundo a entrar é o primeiro a sair, já as PILHAS obedecem a regra do último a entrar é o último a sair. d) Nas FILAS é usado o princípio do primeiro a entrar é o primeiro a sair, já as PILHAS obedecem a regra do primeiro a entrar é o último a sair. e) Nas FILAS é usado o princípio do primeiro a entrar é o segundo a sair, já as PILHAS obedecem a regra do segundo a entrar é o terceiro a sair.
As filas seguem o padrão FIFO (first-in first-out), ou seja, o primeiro a entrar é o primeiro a sair. Já as pilhas seguem o padrão LIFO (last-in first-out), ou seja, o último a entrar é o primeiro a sair. Gabarito: Letra D
117
3. (UFRPE – 2022 – UFRPE) Sobre algoritmos e estrutura de dados, assinale a afirmativa correta. a) Listas encadeadas ou ligadas são estruturas de dados estáticas, o que significa que o número de nós não pode ser modificado durante a execução do programa. b) Pilhas são estruturas de dados do tipo FIFO (first-in first-out), em que o primeiro elemento a ser inserido será o primeiro a ser retirado. c) Árvores são estruturas de dados do tipo FIFO (first-in first-out), em que o primeiro elemento a ser inserido será o primeiro a ser retirado. d) Filas podem ser implementadas em listas encadeadas ou em vetores. e) Pilhas só podem ser implementadas em listas encadeadas.
Vamos analisar item a item: a) Listas encadeadas ou ligadas são estruturas de dados estáticas, o que significa que o número de nós não pode ser modificado durante a execução do programa. Não são estáticas, mas, sim, dinâmicas: havendo memória livre, podem ser expandidas ou reduzidas conforme a necessidade. Falso. b) Pilhas são estruturas de dados do tipo FIFO (first-in first-out), em que o primeiro elemento a ser inserido será o primeiro a ser retirado. Não, pilhas são LIFO (last-in first-out), ou seja, o último a entrar é o primeiro a sair. Falso. c) Árvores são estruturas de dados do tipo FIFO (first-in first-out), em que o primeiro elemento a ser inserido será o primeiro a ser retirado. Árvores são estruturas hierárquicas, e não sequenciais, portanto, não podem seguir a regra FIFO. Falso. d) Filas podem ser implementadas em listas encadeadas ou em vetores. De fato, filas podem ser implementadas usando listas encadeadas ou vetores. O importante é que siga a regra FIFO (first-in first-out), ou seja, o primeiro a entrar é o primeiro a sair. Verdadeiro. e) Pilhas só podem ser implementadas em listas encadeadas. Não, é possível implementar pilhas com vetores também. Falso. Gabarito: Letra D
118
4. (CESPE/CEBRASPE – 2021 – SEED-PR) Em determinada estrutura de dados, os valores seguem a regra segundo a qual o último a entrar é o primeiro a sair. Essa estrutura é do tipo a) pilha. b) fila. c) lista encadeada. d) lista duplamente encadeada. e) matriz.
A estrutura de dados que segue a regra "último a entrar, primeiro a sair" é chamada de pilha. Uma pilha é uma estrutura de dados que armazena elementos em uma ordem específica, seguindo o método LIFO (Last In First Out). Isso significa que o último elemento a ser inserido na pilha será o primeiro a ser removido. Imagine uma pilha de pratos: o último prato a ser colocado na pilha será o primeiro a ser retirado. Gabarito: Letra A
119
5. (CESPE/CEBRASPE – 2021 – SEED-PR) Na estrutura de dados denominada FILA, a) o último elemento a ser inserido será o primeiro a ser retirado. b) o primeiro elemento a ser inserido será o primeiro a ser retirado: adiciona-se item no fim e remove-se item do início. c) os elementos de um mesmo tipo de dado estão organizados de maneira sequencial e ordenada. d) os elementos não estão necessariamente armazenados sequencialmente na memória por ordem descrente de valores. e) os elementos são formados de índices em duas dimensões: linhas e colunas.
Vamos analisar item a item: a) o último elemento a ser inserido será o primeiro a ser retirado. Na fila, o padrão é o FIFO, ou seja, primeiro a ser inserido é o primeiro a ser retirado. Falso. b) o primeiro elemento a ser inserido será o primeiro a ser retirado: adiciona-se item no fim e remove-se item do início. Isso, devido ao padrão FIFO, é o correto. Verdadeiro. c) os elementos de um mesmo tipo de dado estão organizados de maneira sequencial e ordenada. Os elementos podem até ser organiszados de maneira sequencial e ordenada, se assim for desejado, mas não é um requisito de uma fila. Falso. d) os elementos não estão necessariamente armazenados sequencialmente na memória por ordem descrente de valores. De fato, os elementos não necessariamente estão armazenados sequencialmente na memória por ordem decrescente de valores. Este item, para mim, deveria estar certo, mas a banca considerou como errado. Penso que, nestes casos, o melhor é considerar o “mais certo”, e, sem dúvidas, a letra B é a definição certíssima de fila! e) os elementos são formados de índices em duas dimensões: linhas e colunas. Isso seria uma matriz, e não uma fila. Falso. Gabarito: Letra B
120
6. (CESPE/CEBRASPE – 2017 – TRT-7) A lógica FIFO (first-in first-out) é utilizada na estrutura de dados do tipo a) pointer ou ponteiros. b) queue ou filas. c) stack ou pilhas. d) array ou matrizes.
O FIFO, que significa first-in first-out, ou “primeiro a entrar, primeiro a sair”, é usado na estrutura de dados de queue, ou filas. Nela, os elementos são colocados no fim da fila, e removidos no início. O primeiro elemento que é inserido é o primeiro a ser removido. Quanto aos demais itens, vamos analisar: * Pointer ou ponteiros: variáveis que armazenam endereços de memória de outras variáveis. * Stack ou pilhas: estrutura de dados que segue a lógica LIFO, ou last-in first-out, que significa “o último a entrar é o primeiro a sair”. * Array ou matrizes: estruturas de dados que permitem armazenar e acessar vários valores de uma vez, sem seguir lógica FIFO ou LIFO. Gabarito: Letra B
121
7. (CESPE/CEBRASPE – 2017 – TRF-1) Acerca de estrutura de dados, julgue o próximo item. A fila é uma lista de elementos em que os itens são sempre inseridos em uma das extremidades e excluídos da outra.
Fila é uma estrutura de dados que segue a lógica FIFO (first-in first-out) armazena elementos de forma sequencial, permitindo a inserção de novos elementos no final da estrutura e a remoção de elementos do início. Então, está certo. Gabarito: Certo
122
8. (CESPE/CEBRASPE – 2018 – TCE-MG) Uma estrutura de dados em que o primeiro elemento inserido seja o primeiro elemento a ser retirado é denominada a) pilha. b) matriz. c) árvore binária. d) fila. e) lista.
A lógica em questão refere-se ao padrão FIFO, que é first-in first-out, ou seja, primeiro a entrar é o primeiro a sair. Vamos analisar item a item: a) pilha. Uma pilha segue o padrão LIFO, que é last-in first-out, ou seja, último a entrar é o primeiro a sair. Falso. b) matriz. É uma estrutura de dados com um conjunto de elementos de um determinado tipo e que estão organizados em linhas e colunas. Não há uma regra especial quanto à inserção ou remoção dos elementos. Falso. c) árvore binária. Estrutura de dados do tipo árvore, mas com uma restrição: cada nó pode ter apenas dois filhos. Falso. d) fila. Isso mesmo, uma fila segue justamente o padrão FIFO. Verdadeiro. e) lista. Numa lista, é possível inserir ou remover de qualquer posição. Falso. Gabarito: Letra D
123
9. (FCC – 2019 – TRF-4) O Round-Robin é um tipo de escalonamento preemptivo mais simples e consiste em repartir uniformemente o tempo da CPU entre todos os processos prontos para a execução. Os processos são organizados em uma estrutura de dados, alocando-se a cada um uma fatia de tempo da CPU, igual a um número de quanta. Caso um processo não termine dentro de sua fatia de tempo, retorna para o fim da estrutura e uma nova fatia de tempo é alocada para o processo que está no começo da estrutura e que dela sai para receber o tempo de CPU. A estrutura de dados utilizada nesse tipo de escalonamento é: a) pilha. b) árvore B. c) fila circular. d) fila simples. e) árvore binária.
No Round-Robin, os processos são organizados em uma estrutura de dados. Fatias de tempo da CPU são locadas para cada um desses processos. No caso de um processo não terminar dentro da sua fatia de tempo, ele retorna ao fim da estrutura, e uma nova fatia de tempo é alocada para ele. Essa nova fatia está no começo da estrutura. Assim, a estrutura de dados precisa ser uma fila, já que permite que os processos sejam inseridos no final e removidos no início. Além disso, precisa ser circular, já que o processo sai do fim da fila e volta para o início. Sobre as demais estruturas de dados: * pilha: não serve, pois a inserção e a remoção dos elementos é sempre no final. * árvore B: não é uma estrutura de dados linear. * fila simples: não serve, pois o final não é ligado ao início. * árvore binária: també, não é uma estrutura de dados linear. Gabarito: Letra C
124
10. (FCC – 2013 – MPE-MA) Ana precisa utilizar uma estrutura de dados para gerenciar trabalhos de impressão em uma impressora compartilhada por vários computadores em uma rede. As regras dessa estrutura devem permitir que os trabalhos sejam impressos na ordem em que forem enviados, ou seja, o primeiro a enviar um pedido de impressão deve ser o primeiro a ter sua solicitação atendida. Não deve ser permitido inserir pedidos de impressão no meio dos pedidos já realizados. A estrutura de dados mais adequada para Ana utilizar é a) pilha. b) lista encadeada ordenada. c) árvore binária. d) tabela hash. e) fila.
A estrutura de dados utilizada deve seguir a regra FIFO (first-in first-out), ou seja, o primeiro a entrar é o primeiro a sair também. Sair significa ter a solicitação atendida. Portanto, vamos analisar item a item: a) pilha. A pilha segue o padrão LIFO (last-in first-out), ou seja, o último a entrar é o primeiro a sair. Não serve. Falso. b) lista encadeada ordenada. Uma lista encadeada não é o mais adequado, por não seguir padrões de inserção. Falso. c) árvore binária. Árvore binária também não tem um padrão de inserção e remoção desejado, e também serve para dados estruturados hierarquicamente, o que não é o caso. Falso. d) tabela hash. Tabelas hash servem para facilitar operações de inserção, remoção e busca. Não é o caso, não é necessário realizar busca. Falso. e) fila. A fila é justamente a descrição do necessário: segue a regra FIFO, portanto, o primeiro a entrar é o primeiro a sair. Certo! Gabarito: Letra E
125
11. (FCC – 2013 – TRE-SP) No que se refere a estruturas de dados é INCORRETO afirmar: a) Numa fila dupla, os elementos podem ser inseridos e removidos de qualquer um dos extremos da fila. b) Em qualquer situação é possível usar uma única fila dupla para representar duas filas simples. c) A implementação de uma fila dupla normalmente é mais eficiente com uma lista duplamente encadeada que com uma encadeada simples. d) Pela definição de fila, se os elementos são inseridos por um extremo da lista linear, eles só podem ser removidos pelo outro. e) Numa lista singularmente encadeada, para acessar o último nodo é necessário partir do primeiro e ir seguindo os campos de ligação até chegar ao final da lista.
O enunciado pede a incorreta. Vamos analisar item a item: a) Numa fila dupla, os elementos podem ser inseridos e removidos de qualquer um dos extremos da fila. Isso mesmo. Como uma fila é dupla, ou seja, vai em ambas as direções, os elementos podem ser inseridos ou removidos de qualquer lado. Verdadeiro. b) Em qualquer situação é possível usar uma única fila dupla para representar duas filas simples. Uma única fila dupla não pode representar duas filas simples. Isso porque uma fila precisa seguir o padrão FIFO (first in first-out), ou seja, o primeiro a entrar é o primeiro a sair. Na prática, você tem um lado onde você insere elementos, e o outro lado de onde você remove. Uma fila dupla não pode representar duas filas simples porque, nela, você insere ou remove de qualquer lado. Seria necessário poder inserir de um lado e remover de outro, exclusivamente, e em quatro pontos. Errado. c) A implementação de uma fila dupla normalmente é mais eficiente com uma lista duplamente encadeada que com uma encadeada simples. Está correto. Se já usa uma lista duplamente encadeada, em que cada nó faz referência ao próximo e ao anterior, fica mais fácil implementar uma fila dupla. Certo! d) Pela definição de fila, se os elementos são inseridos por um extremo da lista linear, eles só podem ser removidos pelo outro. É isso, como já disse anteriormente. Correto. e) Numa lista singularmente encadeada, para acessar o último nodo é necessário partir do primeiro e ir seguindo os campos de ligação até chegar ao final da lista. Isso. Numa lista singularmente encadeada, cada nó só possui referência ao próximo da lista, e você só sabe qual é o endereço do primeiro. Então, é preciso percorrer todos. Certo. Gabarito: Letra B
126
12. (CESPE - 2010 - Banco da Amazônia - Técnico Científico - Tecnologia da Informação - Análise de Sistemas) Em um programa existe a necessidade de guardar todas as alterações feitas em determinado dado para que seja possível desfazer alterações feitas ao longo de toda a sua existência. Nessa situação, a estrutura de dados mais adequada para o armazenamento de todas as alterações citadas seria uma fila.
Não! Pensem comigo: eu faço uma atividade, depois outra, depois mais uma e, por fim, mais outra. Se eu desejo desfazer a última atividade realizada para retornar a um estado anterior, eu preciso de uma pilha. Dessa forma, resgata-se o último estado válido e, não, o primeiro. Gabarito: Errado
127
13. (CESPE - 2012 – TST – Analista de Sistemas – A) As pilhas e as filas são estruturas de dados essenciais para os sistemas computacionais. É correto afirmar que a fila é conhecida como lista LIFO - Last In First Out.
Não, Fila é FIFO! Gabarito: Errado
128
14. (CESPE - 2012 - TRE-RJ - Técnico Judiciário - Programação de Sistemas) As filas são estruturas com base no princípio LIFO (last in, first out), no qual os dados que forem inseridos primeiro na fila serão os últimos a serem removidos. Existem duas funções que se aplicam a todas as filas: PUSH, que insere um dado no topo da fila, e POP, que remove o item no topo da fila.
Não, isso é uma Pilha (LIFO). Gabarito: Errado
129
15. (FCC - 2012 - MPE-AP – Analista de Sistemas - A) Nas estruturas de dados, devido às características das operações da fila, o primeiro elemento a ser inserido será o último a ser retirado. Estruturas desse tipo são conhecidas como LIFO.
Não, será o primeiro a ser retirado – são do tipo FIFO! Gabarito: Errado
130
16. (FCC - 2012 - MPE-AP – Analista de Sistemas - C) Nas estruturas de dados, a fila é uma lista linear na qual as operações de inserção e retirada ocorrem apenas no início da lista.
Não, isso é a definição de Pilha! Gabarito: Errado
131
17. (FCC - 2012 - TRE-SP - Analista Judiciário - Análise de Sistemas – D) Pela definição de fila, se os elementos são inseridos por um extremo da lista linear, eles só podem ser removidos pelo outro.
Exato! Essa é a definição de fila: insere-se por um extremo e remove-se por outro. Gabarito: Correto
132
18. (FCC - 2011 - TRT - 19ª Região (AL) - Analista Judiciário - Tecnologia da Informação) FIFO refere-se a estruturas de dados do tipo: a) fila. b) árvore binária. c) pilha. d) matriz quadrada. e) cubo.
Trata-se da Fila! Gabarito: Letra A
133
19. (ESAF - 2010 - CVM - Analista de Sistemas - prova 2) Uma fila é um tipo de lista linear em que: a) as inserções são realizadas em um extremo e as remoções no outro extremo. b) as inserções e remoções são realizadas em um mesmo extremo. c) podem ser realizadas apenas inserções. d) a inserção de um elemento requer a remoção de outro elemento. e) a ordem de saída não corresponde à ordem de entrada dos elementos.
As inserções são realizadas em um extremo e as remoções são realizadas no outro extremo, por isso é FIFO! Gabarito: Letra A
134
20. (CESPE - 2010 - DETRAN-ES - Analista de Sistemas) No armazenamento de dados pelo método FIFO (first in - first out), a estrutura de dados é representada por uma fila, em cuja posição final ocorrem inserções e, na inicial, retiradas.
Perfeito! Basta lembrar de uma fila: o primeiro a entrar é o primeiro a sair. Gabarito: Correto
135
21. (CESPE - 2008 - TRT - 5ª Região (BA) - Técnico Judiciário - Tecnologia da Informação) Entre alguns tipos de estrutura de dados, podem ser citados os vetores, as pilhas e as filas.
Perfeito, são todos exemplos de estruturas de dados! Gabarito: Correto
136
22. (CESPE - 2004 – SES/PA – Analista de Sistemas) Uma estrutura mais geral que as pilhas e filas é o deque, em que as inserções, retiradas e acessos são permitidos em ambas as extremidades.
Perfeito, deques permitem todas essas operações! A estrutura de dados deque (abreviação de double-ended queue ou “fila de duas pontas”) é uma variação da fila que aceita inserção e remoção de elementos tanto do início quanto do final da fila. Gabarito: Correto
137
23. (CESPE - 2009 – TCE/AC – Analista de Sistemas – D) Um deque (double ended queue) requer inserção e remoção no topo de uma lista e permite a implementação de filas com algum tipo de prioridade. A implementação de um deque, geralmente é realizada com a utilização de uma lista simplesmente encadeada.
Não, pode ser do início ou fim da lista! De fato, permite a implementação de filas com algum tipo de prioridade, mas geralmente é realizada com a utilização de filas duplamente encadeadas. Gabarito: Errado
138
24. (FCC - 2007 – TRT/23 – Analista de Sistemas) Uma estrutura de dados com vocação de FIFO de duplo fim e que admite a rápida inserção e remoção em ambos os extremos é: a) uma pilha. b) uma splay tree. c) um deque. d) uma lista linear. e) uma árvore AVL.
Trata-se de um Deque – fila duplamente encadeada! Gabarito: Letra C
139
25. (CESPE - 2004 – PBV/RR - Analista de Sistemas) As filas com prioridade são listas lineares nas quais os elementos são pares da forma (qi, pi), em que q é o elemento do tipo base e p é uma prioridade. Elas possuem uma política de fila do tipo FIFO (first in first out) entre os elementos de mesma prioridade.
Perfeito! É assim que funciona a prioridade em conjunto com filas. A fila de prioridade nada mais é que uma fila comum que permite que elementos sejam adicionados associados com uma prioridade. Cada elemento na fila deve possuir um dado adicional que representa sua prioridade de atendimento. Gabarito: Correto
140
28. (FCC - 2016 – TRT - 23ª REGIÃO (MT) - Técnico Judiciário - Tecnologia da Informação) Estruturas de dados básicas, como as pilhas e filas, são usadas em uma gama variada de aplicações. As filas, por exemplo, suportam alguns métodos essenciais, como o: a) enqueue(x), que insere o elemento x no fim da fila, sobrepondo o último elemento. b) dequeue(), que remove e retorna o elemento do começo da fila; um erro ocorrerá se a fila estiver vazia. c) push(x), que insere o elemento x no topo da fila, sem sobrepor nenhum elemento. d) pop(), que remove o elemento do início da fila e o retorna, ou seja, devolve o último elemento inserido. e) top(), que retorna o elemento do fim da fila sem removê-lo; um erro ocorrerá se a fila estiver vazia.
Queue = fila! Stack = pilha! Sendo assim, o que seria “enqueue”? Para quem tem idade (assim como eu!! ) deve se lembrar do famoso Winamp (ah, minha época de ouvir mp3!). Quanto clicávamos no botão direito de uma música, sempre tinha a opção “enqueue in Winamp”, ou seja, incluir na fila de reprodução. Enqueue, portanto, inclui na fila, enquanto dequeue remove! Gabarito: Letra B
141
29. (FCC - 2017 – TRE/BA - Analista de Sistemas) A estrutura que, além de ser similar à fila, é apropriada para ampliar as características desta, permitindo inserir e retirar elementos tanto do início quanto do fim da fila, é o(a): a) árvore. b) lista duplamente encadeada. c) deque. d) fila circular. e) pilha
Trata-se de um Deque (Double Ended Queue). Deque é uma estrutura de dados similar à fila e que permite que elementos possam ser adicionados ou removidos da frente (cabeça) ou de trás (cauda). Qual a diferença entre uma lista duplamente encadeada e um deque? Um deque gerencia elementos como um vetor, fornece acesso aleatório e tem quase a mesma interface que um vetor. Uma lista duplamente encadeada se difere de um deque por não fornecer acesso aleatório aos elementos, i.e., para acessar o quinto elemento, você deve necessariamente navegar pelos quatro primeiros elementos – logo a lista é mais lenta nesse sentido. Existem outras diferenças, mas essa é a diferença fundamental entre essas duas estruturas. Bacana? Gabarito: Letra C
142
Observe as árvores (I) e (II) representadas abaixo. Considerando que o conjunto de elementos de ambas as árvores é finito e que cada elemento pode ter no máximo duas subárvores, as árvores são: A disjuntas e a varredura de ambas as árvores equivale à de Árvores B; B equivalentes e a operação de varredura da árvore (I) em pós-ordem resulta na mesma ordenação da varredura da árvore (II) em in-ordem; C distintas e a operação de varredura da árvore (I) em in-ordem equivale à varredura da árvore (II) em pré-ordem; D desordenadas e a operação de varredura da árvore (II) em pré-ordem gera um conjunto em notação pós-fixa de (II) invertido; E ordenadas e a operação de varredura da árvore (I) em in-ordem resulta em uma ordenação por seleção direta.
Operação de varredura in-ordem da arvore I: B - A - C. Operação de varredura pre-ordem da arvore II: B - A - C. Resposta correta letra (C)
143
Árvores binárias em estruturas de dados é utilizada para armazenar e organizar dados de maneira eficiente. Para a árvore binária da figura, qual a ordem correta de visitação dos nós em um percurso em em-ordem? A 40, 90, 26, 13, 75, 43, 80, 1, 17, 5, 55, 34. B 34, 80, 40, 43, 13, 26, 90, 75, 55, 5, 1, 17. C 40, 80, 26, 90, 13, 43, 75, 34, 55, 1, 5, 17. D 90, 26, 13, 75, 43, 40, 80, 17, 5, 1, 55, 34.
Gabarito: C
144
A Figura a seguir exibe uma árvore binária. Suponha que uma função percorra essa árvore em ordem simétrica e exiba os valores de seus nós no console. Qual será o sexto valor a ser exibido por essa função? A 20 B 30 C 60 D 70 E 80
Ordem simétrica: ponto embaixo, nesse caso, da direita pra esquerda. Ordem simétrica pode ser nos dois sentidos. Gabarito: C
145
Observe a figura a seguir. Para a árvore binária apresentada, qual a ordem correta de visitação dos nós em um percurso em pós-ordem(pós-fixo)? A 40, 80, 26, 90, 13, 43, 75, 34, 55, 1, 5, 17. B 40, 90, 26, 13, 75, 43, 80, 1, 17, 5, 55, 34. C 34, 80, 40, 43, 13, 26, 90, 75, 55, 5, 1, 17. D 90, 26, 13, 75, 43, 40, 80, 17, 5, 1, 55, 34.
Pós-fixo: Ponto à direita, contagem a partir da esquerda. Gabarito: B
146
3. (FGV – 2022 – SEMSA Manaus) Numa estrutura de dados do tipo Árvore B, onde cada nó não raiz pode conter entre d e 2.d chaves, a complexidade do algoritmo de busca é da ordem a) log de N na base 2. b) log de N na base d. c) N vezes log de N na base 2. d) N. e) N2.
O limite superior da profundidade da árvore é d ≤ 1 + log[m/2]((N+1)/2), sendo que: ● m = a ordem da árvore, ou seja, o número máximo de chaves numa página não folha. Neste caso, m = 2d. ●N = a quantidade de registros. Portanto: d ≤ 1 + log[m/2]((N+1)/2) d ≤ 1 + log[2d/2]((N+1)/2) d ≤ 1 + log[d]((N+1)/2) Isso é da ordem de log de N na base d, ou O(logdN). Gabarito: Letra B
147
4. (UFPRE – 2022 – UFPRE) Acerca de estruturas de dados, assinale a alternativa correta. a) A estrutura denominada Pilha é considerada do tipo FIFO (first in, first out); o primeiro elemento inserido será o primeiro elemento a ser removido. b) A estrutura denominada Fila é considerada do tipo FILO (first in, last out); o primeiro elemento a ser inserido será o último elemento a ser removido. c) A estrutura denominada lista simplesmente encadeada não ordenada armazena um ou vários dados em cada elemento, e tem um ponteiro apontado para o último elemento que permite o encadeamento e a estrutura linear. d) A estrutura denominada árvore é um conjunto finito de elementos, onde cada elemento é denominado nó, e o primeiro nó é conhecido como raiz da árvore. e) A estrutura denominada árvore AVL é uma árvore binária não balanceada, em que cada nó representa uma diferença de altura entre as subárvores direita e esquerda de 1, 2 ou 3 nós.
Vamos analisar item a item: a) A estrutura denominada Pilha é considerada do tipo FIFO (first in, first out); o primeiro elemento inserido será o primeiro elemento a ser removido. Na verdade, uma pilha é LIFO (last-in first-out), ou seja, o último a entrar é o primeiro a sair. Falso. b) A estrutura denominada Fila é considerada do tipo FILO (first in, last out); o primeiro elemento a ser inserido será o último elemento a ser removido. Na verdade, a fila é FIFO (first-in first-out), ou seja, o primeiro a entrar é o primeiro a sair. Falso. c) A estrutura denominada lista simplesmente encadeada não ordenada armazena um ou vários dados em cada elemento, e tem um ponteiro apontado para o último elemento que permite o encadeamento e a estrutura linear. O ponteiro está apontado para o primeiro elemento, e não para o último. Falso. d) A estrutura denominada árvore é um conjunto finito de elementos, onde cada elemento é denominado nó, e o primeiro nó é conhecido como raiz da árvore. Alternativa sem erro sobre árvore. Verdadeiro. e) A estrutura denominada árvore AVL é uma árvore binária não balanceada, em que cada nó representa uma diferença de altura entre as subárvores direita e esquerda de 1, 2 ou 3 nós. A árvore AVL é uma árvore binária balanceada, e a diferença entre as subárvores da direita e da esquerda é de no máximo 1 nó. Falso. Gabarito: Letra D
148
De acordo com a figura anterior, o procedimento CONSULTA (x) 1 while esquerda [x] ≠ NIL 2 do x 🡨 esquerda [x] 3 return x realiza, na árvore, a consulta de a) search. b) minimum. c) maximum. d) successor. e) predecessor.
Trata-se de uma árvore binária. Nessa estrutura, os nós filhos da esquerda sempre possuem um valor menor do que os da direita. Os menores valores da árvore estarão à esquerda. Dito isso, o algoritmo percorre os nós da esquerda sempre. Ou seja, vai chegar no número 2. Significa que está procurando o menor valor da árvore. Ou seja, resposta é minimum. Gabarito: Letra B
149
7. (CESPE/CEBRASPE – 2022 – Petrobrás) Uma árvore de decisão representa um determinado número de caminhos possíveis de decisão e os resultados de cada um deles, apresentando muitos pontos positivos, ou seja, são fáceis de entender e interpretar. Elas têm processo de previsão completamente transparente e lidam facilmente com diversos atributos numéricos, assim como atributos categóricos, podendo até mesmo classificar dados sem atributos definidos. De acordo com os aspectos construtivos de uma árvore de decisão, julgue o item a seguir. A entropia de uma árvore de decisão aborda o aspecto da quantidade de informações que está associada às respostas que podem ser obtidas às perguntas formuladas, representando o grau de incerteza associado aos dados.
A entropia é uma medida de mistura ou impureza de um conjunto de dados. No caso de uma construção de uma árvore de decisão, mede o grau de incerteza dos dados em cada nó da árvore. Gabarito: Correto
150
8. (CESPE/CEBRASPE – 2022 – Petrobrás) Uma árvore de decisão representa um determinado número de caminhos possíveis de decisão e os resultados de cada um deles, apresentando muitos pontos positivos, ou seja, são fáceis de entender e interpretar. Elas têm processo de previsão completamente transparente e lidam facilmente com diversos atributos numéricos, assim como atributos categóricos, podendo até mesmo classificar dados sem atributos definidos. De acordo com os aspectos construtivos de uma árvore de decisão, julgue o item a seguir. Se o processo adotado para a construção de árvores de decisão for determinístico, uma forma de obtenção de árvores aleatórias, que compõem as florestas aleatórias, pode ser realizada por meio do bootstrap dos dados, em que cada árvore é treinada com base no resultado de bootstrap_sample (inputs).
As florestas aleatórias correspondem a uma técnica de aprendizado de máquina em que se um conjunto de árvores de decisão com base em um conjunto de dados. É por meio do processo bootstrap que essas árvores são treinadas usando amostras aleatórias dos dados, com reposição. Dessa forma, cada árvore da floresta é treinada em um conjunto de dados diferente, incrementando a variabilidade das árvores e a robustez da floresta aleatória. Feito o treinamento, as árvores são então utilizadas para previsões ou classificações. Gabarito: Correto
151
9. (FGV – 2022 – MPE-GO) Árvores B são muito usadas na implementação de índices em bancos de dados. Uma árvore desse tipo é dita balanceada quando a) a complexidade do algoritmo de busca é logarítmica. b) as chaves são armazenadas em ordem de classificação, crescente ou decrescente. c) é possível localizar registros referenciados por um intervalo de chaves. d) o número de ponteiros em cada nó intermediário é constante. e) toda página folha tem o mesmo número de páginas intermediárias até a raiz.
Uma árvore B é uma estrutura de dados que mantém dados ordenados e permite operações eficientes de busca, inserção e deleção. Cada nó pode ter múltiplos filhos e armazena várias chaves, mantendo todas as folhas no mesmo nível para garantir equilíbrio. É amplamente usada em bancos de dados e sistemas de arquivos devido à sua eficiência em operações de I/O. Vamos analisar item a item: a) a complexidade do algoritmo de busca é logarítmica. A complexidade de busca da Árvore B é logarítmica, mas não é uma condição para que ela seja balanceada. Falso. b) as chaves são armazenadas em ordem de classificação, crescente ou decrescente. Também não é o motivo pela qual ela seria balanceada. Falso. c) é possível localizar registros referenciados por um intervalo de chaves. Até é possível, mas não é o que torna ela balanceada. Falso. d) o número de ponteiros em cada nó intermediário é constante. Não é o que a torna balaceada. Falso. e) toda página folha tem o mesmo número de páginas intermediárias até a raiz. Isso. Se cada página folha tiver o mesmo número de páginas intermediárias até a raiz, teremos uma árvore com altura fixa, e, portanto, balaceada. Verdadeiro. Gabarito: Letra E
152
12. (FGV – 2018 – Banestes) Sobre as características de índices estruturados na forma de Btrees e Hash tables, analise as afirmativas a seguir. I. Hash tables aplicam-se somente em buscas que referenciam a chave por inteiro (operador =). II. B-trees favorecem consultas que buscam chaves num determinado intervalo (operadores >= e <=). III. B-trees são usualmente mais lentas para buscas pela chave (operador =). IV. Hash tables favorecem buscas, com o operador ‘LIKE’ do SQL, que não contenham caracteres curingas na primeira posição. V. B-trees não se aplicam em buscas que se referem a uma substring à esquerda da chave. Está correto o que se afirma em: a) nenhuma; b) somente I, II e III; c) somente I, IV e V; d) somente II, III, IV; e) I, II, III, IV e V.
Vamos analisar item a item: I. Hash tables aplicam-se somente em buscas que referenciam a chave por inteiro (operador =). De fato, as hash tables precisam referenciar a chave inteiramente para que se possa encontrar os valores. Certo. II. B-trees favorecem consultas que buscam chaves num determinado intervalo (operadores >= e <=). Como, na árvore B, os valores menores estão nos filhos da esquerda, enquanto os valores maiores estão nos filhos da direita, então, torna-se mais fácil a busca por intervalo. Certo. III. B-trees são usualmente mais lentas para buscas pela chave (operador =). São mais lentas do que hash tables, porque, no caso das hash tables, se eu sei a chave exatamente, então o acesso é direto, ou próximo do direto. Já em B-trees, seria O(log n). Certo. IV. Hash tables favorecem buscas, com o operador ‘LIKE’ do SQL, que não contenham caracteres curingas na primeira posição. Em hash tables, o operador like não é favorecido. O operador like busca pelo valor parcial da chave, mas, nas hash tables, a busca é facilitada apenas quando temos o valor inteiro da chave. Errado. V. B-trees não se aplicam em buscas que se referem a uma substring à esquerda da chave. Pelo contrário, quando temos subtrings, as B-trees podem ser aplicadas e são mais eficientes do que hash tables. Errado. Gabarito: Letra B
153
13. (FCC – 2017 – TRE-SP) Considere, hipoteticamente, que um Técnico do TRE-SP tem, em seu computador, a seguinte organização de um diretório Principal: Dados Dentro de Dados: Técnicos Práticos Dentro de Técnicos: Árvores Hash Recursão Filas Pilhas Dentro de Práticos: Programas AFazer Prontos Dentro de Prontos: Eleições Urnas Dentro de Programas: Corretos ComErro Dentro de ComErro: Urgentes Pendentes Antigos A estrutura de dados a) fila é a mais adequada para representar este diretório. b) pilha é a mais adequada para representar este diretório. c) árvore binária, ao armazenar este diretório, terá Dados na raiz e nós com grau 2, 3, 5 e folhas. d) árvore, que consegue armazenar este diretório, é de ordem 5. e) hashing, ao armazenar este diretório, não terá colisões na tabela de dispersão
Pela descrição, a estrutura de dados seria a seguinte: Isso é uma estrutura de árvore. Portanto, excluímos as alternativas a), b) e e). Sobram as alternativas c) e d). A alternativa c) fala de árvore binária. Não se trata de uma árvore binária, pois, em uma árvore binária, cada nó possui apenas dois filhos, o que não é o caso dessa estrutura. Resta a alternativa d). De fato, é uma árvore, e, de fato, a sua ordem é 5. A ordem de uma árvore corresponde à quantidade máxima de níveis que ela possui. Note que ela possui 5 níveis. Gabarito: Letra D
154
14. (FCC – 2019 – TRF-4) Determinada estrutura de dados foi projetada para minimizar o número de acessos à memória secundária. Como o número de acessos à memória secundária depende diretamente da altura da estrutura, esta foi concebida para ter uma altura inferior às estruturas hierarquizadas similares, para um dado número de registros. Para manter o número de registros armazenados e, ao mesmo tempo, diminuir a altura, uma solução é aumentar o grau de ramificação da estrutura (o número máximo de filhos que um nó pode ter). Assim, esta estrutura possui um grau de ramificação geralmente muito maior que 2. Além disso, a cada nó são associados mais de um registro de dados: se o grau de ramificação de um nó for g, este pode armazenar até g-1 registros. Esta estrutura de dados é utilizada em banco de dados e sistema de arquivos, sendo denominada a) árvore digital ou trie. b) árvore B. c) lista linear duplamente encadeada circular. d) árvore rubro-negra. e) árvore binária de busca não balanceada.
A questão se refere à Árvore B. É uma modificação da árvore binária de busca balanceada que armazena os dados de forma organizada, permitindo a eles acesso rápido, reduzindo a quantidade de vezes em que é necessário acessar a memória secundária. Este número de acessos à memória secundária depende diretamente da altura da estrutura, então ela foi criada para ter uma altura menor do que a de outras estruturas hierarquizadas semelhantes. Quanto às demais estruturas de dados, sabemos que: ● digital ou trie: estrutura de dados para armazenar uma coleção de strings de forma organizada, para ser usado de forma eficiente em um dicionário. ● lista linear duplamente encadeada circular: uma lista em que cada nó tem ligação com o anterior e o próximo. Além disso, o primeiro nó tem ligação com o último, e vice-versa. ● árvore rubro-negra: uma variante de uma árvore de busca balanceada. Os nós da árvore podem ser coloridos de vermelho ou preto. Há algumas regras: a. os nós vermelhos sempre têm dois filhos pretos b. a raíz e as folhas devem ser nós pretos. ● árvore binária de busca não balanceada: os elementos são dispostos na árvore de modo que as operações são realizadas em tempo linear. É o contrário da Árvore B, que é balanceada. Gabarito: Letra B
155
16. (FGV – 2022 – SEFAZ-AM) A estrutura de dados usada em índices multiníveis dinâmicos em banco de dados relacionais, que garantem que tais estruturas sempre estejam balanceadas e que o espaço desperdiçado pela exclusão de itens de dados, se houver, nunca se torne excessivo, é denominada a) fila. b) hash. c) bitmap. d) árvore B. e) árvore binária.
Vamos analisar item a item: a) fila Fila é uma estrutura de dados linear que seja a regra FIFO, first-in first-out, ou seja, primeiro a entrar é o primeiro a sair. Não envolve balanceamento e não tem multiníveis. Falso. b) hash. Estrutura de dados que usa uma função hash para transformar entradas variáveis em saídas fixas de um vetor. Não tem multiníveis dinâmicos ou balanceamento. Falso. c) bitmap. Armazena bits em um vetor. Não envolve balanceamento. Falso. d) árvore B. São um tipo de árvore binária de busca balanceada. As árvores B são justamente as estruturas usadas para implementar os índices multiníveis dinâmicos em bancos de dados relacionais. Verdadeiro. e) árvore binária. Uma árvore binária não necessariamente é balanceada, portanto não é a resposta correta. Falso. Gabarito: Letra D ex 18 pag 108
156
18. (CESPE - 2012 - Banco da Amazônia - Técnico Científico - Administração de Dados) As operações de busca em uma árvore binária não a alteram, enquanto operações de inserção e remoção de nós provocam mudanças sistemáticas na árvore.
Perfeito! Operações de Busca não alteram nenhuma estrutura de dados. Já Operações de Inserção e Remoção podem provocar diversas mudanças estruturais. Gabarito: Correto
157
19. (CETAP - 2010 - AL-RR - Analista de Sistemas - A) Uma árvore binária é aquela que tem como conteúdo somente valores binários.
Não! Uma árvore binária é aquela que tem, no máximo, grau 2! Gabarito: Errado
158
20. (CESPE - 2012 - Banco da Amazônia - Técnico Científico - Administração de Dados) O tipo de dados árvore representa organizações hierárquicas entre dados.
Perfeito, observem que alguns autores tratam Tipos de Dados como sinônimo de Estruturas de Dados. Gabarito: Correto
159
21. (CETAP - 2010 - AL-RR - Analista de Sistemas - B) Uma árvore é composta por duas raízes, sendo uma principal e a outra secundária.
Não, uma árvore possui somente um nó raíz! Gabarito: Errado
160
22. (CESPE - 2010 - DETRAN-ES - Analista de Sistemas) Denomina-se árvore binária a que possui apenas dois nós.
Não, árvore binária é aquela em que cada nó tem, no máximo, dois filhos! Gabarito: Errado
161
23. (FUNCAB - 2010 - SEJUS-RO - Analista de Sistemas - II) Árvores são estruturas de dados estáticas com sua raiz representada no nível um.
Não! Árvores são estruturas dinâmicas e sua raiz, em geral, é representada no nível 0 (mas depende de autor para autor). Gabarito: Errado
162
26. (FGV – 2015 – DPE/MT – Analista de Sistemas) No desenvolvimento de sistemas, a escolha de estruturas de dados em memória é especialmente relevante. Dentre outras classificações, é possível agrupar essas estruturas em lineares e não lineares, conforme a quantidade de sucessores e antecessores que os elementos da estrutura possam ter. Assinale a opção que apresenta, respectivamente, estruturas de dados lineares e não lineares. a) Tabela de dispersão e fila. b) Estrutura de seleção e pilha. c) Pilha e estrutura de seleção. d) Pilha e árvore binária de busca. e) Fila e pilha.
As Estruturas Lineares são aquelas em que cada elemento pode ter um único predecessor (exceto o primeiro elemento) e um único sucessor (exceto o último elemento). Como exemplo, podemos citar Listas, Pilhas, Filas, Arranjos, entre outros. Já as Estruturas Não-Lineares são aquelas em que cada elemento pode ter mais de um predecessor e/ou mais de um sucessor. Como exemplo, podemos citar Árvores, Grafos e Tabelas de Dispersão. Conforme vimos em aula, trata-se de pilha e árvore respectivamente. Gabarito: Letra D
163
27. (CESPE - 2010 – TRE/MT – Analista de Sistemas – B) As listas, pilhas, filas e árvores são estruturas de dados que têm como principal característica a sequencialidade dos seus elementos.
Não! Árvores ntêm como principal característica a sequencialidade dos seus elementos. Gabarito: Errado
164
28. (FCC - 2012 - MPE-AP - Analista Ministerial - Tecnologia da Informação – A) A árvore é uma estrutura linear que permite representar uma relação de hierarquia. Ela possui um nó raiz e subárvores não vazias.
Árvore é uma estrutura linear? Não, hierárquica! Gabarito: Errado
165
29. (CESPE - 2010 – TRE/MT - Analista de Sistemas – E) O uso de recursividade é totalmente inadequado na implementação de operações para manipular elementos de uma estrutura de dados do tipo árvore.
Pelo contrário, é fundamental para implementação de operações. Gabarito: Errado
166
30. (FCC - 2011 - TRT - 19ª Região (AL) - Técnico Judiciário - Tecnologia da Informação) Em uma árvore binária, todos os nós têm grau: a) 2. b) 0, 1 ou 2. c) divisível por 2. d) maior ou igual a 2. e) 0 ou 1.
Olha a pegadinha! Todos os nós têm grau 0 (Folha), 1 (Único filho) ou 2 (Dois filhos). Gabarito: Letra B
167
31. (CESPE - 2011 – STM – Analista de Sistemas) Enquanto uma lista encadeada somente pode ser percorrida de um único modo, uma árvore binária pode ser percorrida de muitas maneiras diferentes.
Galera, pense em uma árvore bem simples com um pai (raiz) e dois filhos. O Modo Pré-fixado vai ler primeiro a raíz, depois a sub-árvore da esquerda e depois a sub-árvore da direita. O Modo In-fixado vai ler primeiro a sub-árvore da esquerda, depois a raiz e depois a sub-árvore da direita. O Modo Pós-fixado vai ler primeiro a sub-árvore da esquerda, depois a sub-árvore da direita e depois a raiz. Vamos agora ver uma árvore de exemplo: X / \ Y Z - Percorrimento Pré-fixado: X Y Z - Percorrimento In-fixado: Y X Z - Percorrimento Pós-fixado: Y Z X Logo, uma árvore pode ser percorrida de modo pré-fixado, in-fixado e pós-fixado. Gabarito: Correto
168
32. (FCC - 2016 - Prefeitura de Teresina - PI - Analista Tecnológico - Analista de Suporte Técnico) Considerando a estrutura de dados denominada árvore, a) a sua altura é definida como a profundidade média de todos os seus vértices. b) um vértice com um ou dois filhos é denominado folha. c) cada nó tem no mínimo dois filhos em uma árvore binária. d) as folhas de uma árvore binária completa podem ter profundidades distintas entre si. e) a profundidade de um vértice em uma árvore é definida como o comprimento da raiz da árvore até esse vértice.
(a) Errado! Altura é definida pela folha mais profunda; (b) Errado! Folhas não possuem filhos, do contrário não seriam folhas; (c) Errado! Os nós de uma árvore binaria podem ter NO MÁXIMO dois filhos, e não no mínimo; (d) Errado! Uma árvore binária completa é aquele em que todos os nós internos possuem seus dois filhos (máximo). Desse modo, todas as folhas devem ter a mesma profundidade; (e) Certo! Gabarito: Letra E
169
35. (CESGRANRIO – 2006 – DECEA - Analista de Sistemas) Suponha a seguinte árvore AVL. A inserção do elemento 30 nessa árvore: a) aumenta a profundidade da árvore após uma rotação. b) provoca uma rotação à direita. c) deixa os nós 02 e 07 no mesmo nível. d) altera a raiz da árvore (nó 41). e) torna o nó 33 pai do nó 27.
Localização da Inserção: 41: 30 é menor que 41, então vai para a subárvore esquerda. 27: 30 é maior que 27, então vai para a subárvore direita. 38: 30 é menor que 38, então vai para a subárvore esquerda. 33: 30 é menor que 33, então será inserido como filho esquerdo de 33. 41 / \ 27 81 / \ / \ 07 38 67 84 / \ / \ 02 1133 / \ 30 Necessidade de Rotação Como a diferença de altura é maior que 1, uma rotação é necessária para balancear a árvore. Neste caso, temos um desbalanceamento do tipo Esquerda-Esquerda, então precisamos de uma rotação simples à direita na subárvore com raiz em 38. 41 / \ 27 81 / \ / \ 07 33 67 84 / \ / \ 02 11 30 38 Verificação das Alternativas: a) Aumenta a profundidade da árvore após uma rotação. A profundidade da árvore não aumenta. Continua a mesma. b) Provoca uma rotação à direita. Correto. Fizemos uma rotação à direita no ramo 38-33. c) Deixa os nós 02 e 07 no mesmo nível. Não faz sentido, pois a inserção de 30 não afeta os níveis dos nós 02 e 07. d) Altera a raiz da árvore (nó 41). Não altera a raiz da árvore. O nó 41 continua sendo a raiz. e) Torna o nó 33 pai do nó 27. Não faz sentido, pois 33 não se torna pai de 27. Gabarito: B
170
36. (CESPE – 2012 – TJ/RO - Analista de Sistemas) Assinale a opção em que é apresentado exemplo de estrutura de informação do tipo abstrata, balanceada, não linear e com relacionamento hierárquico. a) lista duplamente encadeada b) árvore binária c) pilha d) árvore AVL e) deque
Tipo abstrato? Todos são! Não Linear? Árvore Binária e Árvore AVL! Com relacionamento hierárquico? Árvore Binária e Árvore AVL! Balanceada? Somente a Árvore AVL. Gabarito: Letra D
171
37. (FCC – 2008 – TRT/18 - Analista de Sistemas) Árvore AVL balanceada em altura significa que, para cada nó da árvore, a diferença entre as alturas das suas sub-árvores (direita e esquerda) sempre será: a) menor ou igual a 2. b) igual a 0 ou -1. c) maior que 1. d) igual a 1. e) igual a -1, 0 ou 1.
Em uma árvore AVL a diferença entre as alturas não pode ser maior que 1. Uma outra forma de escrever isso é dizer que o módulo da diferença entre as alturas não pode ser maior do 1. E outra forma de escrever isso é dizer que um nó só poder ter uma diferença de altura de suas subárvores de 1, 0 ou -1. Gabarito: Letra E
172
39. (CESGRANRIO – 2011 – PETROBRÁS - Analista de Sistemas) Uma árvore AVL é uma árvore binária de busca autobalanceada que respeita algumas propriedades fundamentais. Como todas as árvores, ela tem uma propriedade chamada altura, que é igual ao valor da altura de sua raiz. Sabendo que a altura de uma folha é igual a um e que a altura de um nó pai é igual ao máximo das alturas de seus filhos mais um, qual estrutura NÃO pode representar uma árvore AVL? a) Uma árvore vazia b) Uma árvore com dois nós c) Uma árvore com três nós e altura igual a dois d) Uma árvore com três nós e altura igual a três e) Uma árvore com seis nós e altura igual a três
(a) Errado, uma árvore vazia é uma Árvore AVL; (b) Errado, é impossível uma árvore com dois nós não ser uma Árvore AVL; (c) Errado, uma árvore com três nós e altura igual a dois é perfeitamente balanceada; (d) Correto, uma árvore com três nós e altura igual a três não pode estar balanceada (vide imagem abaixo); (e) Errado, uma árvore com seis nós e altura igual a três também está balanceada. Gabarito: D.
173
40. (CESGRANRIO – 2011 – PETROBRÁS - Analista de Sistemas) Após a inserção de um nó, é necessário verificar cada um dos nós ancestrais desse nó inserido, relativamente à consistência com as regras estruturais de uma árvore AVL. PORQUE O fator de balanceamento de cada nó, em uma árvore AVL, deve pertencer ao conjunto formado por {-2, -1, 0, +1, +2}. Analisando-se as afirmações acima, conclui-se que: a) as duas afirmações são verdadeiras, e a segunda justifica a primeira. b) as duas afirmações são verdadeiras, e a segunda não justifica a primeira. c) a primeira afirmação é verdadeira, e a segunda é falsa. d) a primeira afirmação é falsa, e a segunda é verdadeira. e) as duas afirmações são falsas.
Galera, a primeira frase está perfeita! Após inserir um novo nó, você tem que verificar os nós ancestrais para se certificar de que a Árvore AVL continua balanceada. No entanto, o fator de balanceamento de cada nó deve pertencer ao conjunto formado por {-1, 0, 1}. Lembrem-se: o módulo da diferença jamais pode ser maior do que 1, portanto a primeira está verdadeira e a segunda falsa. Gabarito: Letra C
174
41. (CESGRANRIO – 2010 – EPE - Analista de Sistemas) Um programador decidiu utilizar, em determinado sistema de análise estatística, uma árvore AVL como estrutura de dados. Considerando-se n a quantidade de elementos dessa árvore, o melhor algoritmo de pesquisa, com base em comparações, possui complexidade de tempo, no pior caso, igual a: a) O(1) b) O(log n). c) Ω(n) d) Ω(n log n) e) Ω(n²)
Questão tranquila! Trata-se do O(log n). Gabarito: Letra B
175
42. (CESGRANRIO – 2012 – PETROBRÁS - Analista de Sistemas) Todos os N nomes de uma lista de assinantes de uma companhia telefônica foram inseridos, em ordem alfabética, em três estruturas de dados: uma árvore binária de busca, uma árvore AVL e uma árvore B. As alturas resultantes das três árvores são, respectivamente, a) O(Log(N)), O(Log(N)), O(1) b) O(Log(N)), O(N), O(Log(N)) c) O(N), O(Log(N)), O(1) d) O(N), O(Log(N)), O(Log(N)) e) O(N), O(N), O(Log(N))
Questão tranquila! Trata-se do O(n), O(log n) e O(log n) respectivamente. Gabarito: Letra D
176
43. (IBFC – 2014 – TRE/AM - Analista de Sistemas) Quanto ao Algoritmo e estrutura de dados no caso de árvore AVL (ou árvore balanceada pela altura), analise as afirmativas abaixo, dê valores Verdadeiro (V) ou Falso (F) e assinale a alternativa que apresenta a sequência correta de cima para baixo: ( ) Uma árvore AVL é dita balanceada quando, para cada nó da árvore, a diferença entre as alturas das suas sub-árvores (direita e esquerda) não é maior do que um. 20 ( ) Caso a árvore não esteja balanceada é necessário seu balanceamento através da rotação simples ou rotação dupla. Assinale a alternativa correta: a) F-F b) F-V c) V-F d) V-V
A primeira alternativa está impecável, assim como a segunda. Vimos exaustivamente em aula! Gabarito: Letra D
177
45. (FGV – 2009 – MEC - Analista de Sistemas) Acerca das estruturas de dados Árvores, analise as afirmativas a seguir. I. A árvore AVL é uma árvore binária com uma condição de balanço, porém não completamente balanceada. II. Árvores admitem tratamento computacional eficiente quando comparadas às estruturas mais genéricas como os grafos. III. Em uma Árvore Binária de Busca, todas as chaves da subárvore esquerda são maiores que a chave da raiz. Assinale: a) se somente a afirmativa I estiver correta. b) se somente as afirmativas I e II estiverem corretas. c) se somente as afirmativas I e III estiverem corretas. d) se somente as afirmativas II e III estiverem corretas. e) se todas as afirmativas estiverem corretas.
(I) Correto, ela é não é completamente balanceada; (II) Correto, isso é verdade! (III) Errado, são menores que a chave da raiz. Gabarito: Letra B
178
47. (CESPE – 2010 – PETROBRÁS - Analista de Sistemas) As árvores usadas como estruturas de pesquisa têm características especiais que garantem sua utilidade e propriedades como facilidade de acesso aos elementos procurados em cada instante. A esse respeito, considere as afirmações abaixo. I - A árvore representada na figura (I) acima não é uma árvore AVL, pois as folhas não estão no mesmo nível. II - A sequência 20, 30, 35, 34, 32, 33 representa um percurso sintaticamente correto de busca do elemento 33 em uma árvore binária de busca. III - A árvore representada na figura (II) acima é uma árvore binária, apesar da raiz não ter filhos. É (São) correta(s) APENAS a(s) afirmativa(s): a) I. b) II. c) III. d) I e II. e) II e III.
(I) Errado. Trata-se, sim, de uma Árvore AVL; (II) Correto. Temos a sequência 20, 30, 35, 34, 32, 33 e estamos procurando o 33. 33>20, logo descemos à direita; 33>30, logo descemos à direita de novo; 33<35, logo descemos à esquerda; 33<34, logo descemos à esquerda de novo; 33>32, logo descemos à direita. Pronto, encontramos o 33; (III) Correto. Trata-se de um Árvore Binária sem filhos. Gabarito: Letra E
179
2. (CESPE/CEBRASPE – 2018 – PF) Considerando a terminologia e os conceitos básicos de grafos, julgue o item a seguir, relativo ao grafo precedente. No grafo em apreço, existem três ciclos com comprimento quatro: AJBA, BKLB e CDMC.
Se observar, os ciclos que ligam os pontos AJBA, BKLB e CDMC possuem 3 arestas cada. Significa que o comprimento deles é “três”, e não “quatro”. Gabarito: Errado
180
3. (CESPE/CEBRASPE – 2018 – PF) Considerando a terminologia e os conceitos básicos de grafos, julgue o item a seguir, relativo ao grafo precedente. O grafo em questão tem diâmetro igual a quatro.
O diâmetro de um grafo corresponde à maior distância mínima entre um par de vértices. Para calculá-lo, é necessário achar os menores caminhos entre cada par de vértices. O maior desses caminhos será o diâmetro. No caso, você pode notar que, neste grafo, os vértices que estão mais distantes entre si são os vértices A ou J, para os vértices D ou M. E existem caminhos mínimos entre eles, por exemplo: * ABLCD: tamanho 4 * JBLCD: tamanho 4 * ABLCM: tamanho 4 * JBLCM: tamanho 4 Existem caminhos maiores, se eu quiser fazer, por exemplo: * ABKLCD: tamanho 5 * JBKLCD: tamanho 5 * ABKLCDM: tamanho 6 * JBKLCDM: tamanho 6 Porém o diâmetro leva em consideração a maior distância mínima entre os vértices. E as distâncias mínimas são de tamanho 4 – a maior que conseguimos encontrar. Portanto, o diâmetro do grafo é 4. Gabarito: Certo
181
4. (CESPE/CEBRASPE – 2018 – PF) Considerando a terminologia e os conceitos básicos de grafos, julgue o item a seguir, relativo ao grafo precedente. Os vértices A, B, C, D, J, K, L, M têm graus iguais, respectivamente, a 2, 4, 3, 2, 2, 2, 3, 2.
O grau de um vértice é a quantidade de arestas que estão ligadas a ele. Portanto: * A tem 2 arestas, grau 2. * B tem 4 arestas, grau 4. * C tem 3 arestas, grau 3. * D tem 2 arestas, grau 2. * J tem 2 arestas, grau 2. * K tem 2 arestas, grau 2. * L tem 3 arestas, grau 3. * M tem 2 arestas grau 2. Gabarito: Certo
182
5. (CESPE/CEBRASPE – 2018 – IFF) Considerando o grafo precedente, assinale a opção correta. a) Os nós 1 e 4 são adjacentes. b) O nó 5 é adjacente a si mesmo. c) Os arcos a1 e a2 são arcos irmãos. d) Os nós 2 e 3 têm grau 3. e) O grafo não pode ser classificado como conexo.
Vamos analisar item a item: a) Os nós 1 e 4 são adjacentes. Os nós 1 e 4 não são adjacentes. Para isso, eles deveriam estar sendo ligados por um arco diretamente, o que não é o caso. Falso. b) O nó 5 é adjacente a si mesmo. Para que ele fosse adjacente a si mesmo, era necessário ter um arco realizando uma auto-ligação. Não é o caso. Falso. c) Os arcos a1 e a2 são arcos irmãos. Nesta situação, em que há múltiplos arcos ligando um mesmo par de nós, temos um multigrafo, e não arcos irmãos. Falso. d) Os nós 2 e 3 têm grau 3. Um grau de um nó corresponde a quantidade de arcos fazendo ligação nele. Portanto, o nó 2 possui grau 4, e o nó 3 grau 3. Falso. e) O grafo não pode ser classificado como conexo. Um grafo conexo possui pelo menos um caminho entre todos os pares de nós. Neste grafo, não dá para chegar no nó 5. Então o grafo não é conexo. Verdadeiro. Gabarito: Certo
183
6. (CESPE/CEBRASPE – 2017 – TRE-TO) A estrutura de dados formada por conjuntos de pontos (nós ou vértices) em um conjunto de linhas (arestas e arcos) que conectam vários pontos é denominada a) lista encadeada. b) fila circular. c) grafo. d) árvore. e) pilha.
Vamos de item a item: a) lista encadeada. Sequência de elementos que apontam para o seu sucessor. Falso. b) fila circular. Estrutura que se comporta como uma fila, mas que permite a inserção de elementos no final, e a remoção de elementos no início, de forma circular. Falso. c) grafo. Grafo é uma estrutura de dados com um conjunto de vértices ou nós e arestas ou arcos que os ligam. Verdadeiro. d) árvore. Estrutura em que cada nó possui um determinado número de filhos. Falso. e) pilha. Estrutura de dados que segue a lógica LIFO, ou last-in first-out, que significa “o último a entrar é o primeiro a sair”. Falso. Gabarito: Letra C
184
7. (CESPE/CEBRASPE – 2019 – TJ-AM) A respeito de lógica, estrutura e linguagem de programação, julgue o item seguinte. Na estrutura do tipo grafo, cada elemento indica o próximo elemento, seja aquele que o antecede ou aquele que é seu sucessor, e cada elemento está associado a somente um antecessor e a vários sucessores.
Em um grafo, cada vértice pode estar ligado a vários outros vértices por meio de arestas. Porém, os vértices em si não possuem relação de antecessor e sucessor. As arestas podem ou não ter direção – tornando o grafo direcionado ou não. Dessa forma, dizer que o elemento está associado somente a um antecessor e vários sucessores não é correta. Gabarito: Errado
185
11. (FCC – 2018 – DPE-AM) Considerando que em um grafo há 17 arestas e 13 nós, o cálculo da complexidade ciclomática resulta em a) 6 b) 4 c) 7 d) 20 e) 18
Para responder a esta questão, deve-se usar a fórmula da complexidade ciclomática: CC = QuantidadeArestas - QuantidadeNós + 2 Ou seja, CC = 17 – 13 + 2 = 6. Gabarito: Letra A
186
12. (FGV – 2019 – DPE-RJ) Para que um sistema seja testado adequadamente, é preciso realizar uma quantidade mínima de testes. Para apoiar essa definição, foi criada a Complexidade Ciclomática de McCabe, com fundamentação na teoria dos grafos. Essa técnica define uma métrica de software que fornece uma medida quantitativa da complexidade lógica de um programa, apresentando um limite superior para a quantidade de casos de testes de software que devem ser conduzidos. A Complexidade Ciclomática pode ser calculada tanto pelo número de regiões quanto pelo número de arestas e nós. Com base no grafo de fluxo acima, correspondente a um trecho de código a ser testado, a quantidade mínima de testesque devem ser realizados para garantir que cada caminho do código tenha sido percorrido em ao menos um teste é: a) 11 (onze); b) 6 (seis); c) 5 (cinco); d) 4 (quatro); e) 3 (três).
Para responder a esta questão, deve-se usar a fórmula da complexidade ciclomática: CC = QuantidadeArestas - QuantidadeNós + 2 Os nós são cada um dos círculos no grafo, enquanto as arestas são cada uma das ligações entre os nós. Portanto, observando o grafo, percebemos que há 5 nós e 7 arestas. Ou seja, CC = 7 – 5 + 2 = 4. Gabarito: Letra D
187
13. (CESPE - 2010 – TJ/ES – Analista de Suporte) Considerando-se a implementação de um grafo denso, direcionado e ponderado, se o número de vértices ao quadrado tem valor próximo ao número de arcos, o uso de uma matriz de adjacência simétrica apresenta vantagens em relação ao uso de uma lista de adjacência.
Grafo denso, direcionado e ponderado: Isso implica que o grafo tem muitas arestas, direção nas arestas e pesos associados a elas. Número de vértices ao quadrado próximo ao número de arcos: Reforça que o grafo é denso, mas é uma informação redundante. Matriz de Adjacência simétrica: Incorreto para grafos direcionados. Simetria só ocorre em grafos não direcionados. Conclusão: A questão está errada porque a matriz de adjacência de um grafo direcionado não é simétrica. Gabarito: E (Errado).
188
14. (FCC - 2013 – MPE/SE – Analista do Ministério Público) Considere: I. Estrutura de dados que possui uma sequência de células, na qual cada célula contém um objeto de algum tipo e o endereço da célula seguinte. II. Podem ser orientados, regulares, completos e bipartidos e possuir ordem, adjacência e grau. III. Possuem o método de varredura esquerda-raiz-direita (e-r-d). Os itens de I a III descrevem, respectivamente, a) árvores binárias, listas ligadas e arrays. b) arrays, árvores binárias e listas ligadas. c) grafos, árvores binárias e arrays. d) listas ligadas, grafos e árvores binárias. e) grafos, listas ligadas e árvores binárias.
(a) Trata-se das Listas Ligadas, visto que falou de sequência, objeto e endereço da célula seguinte; (b) Trata-se dos Grafos, visto que falou dos tipos regular, bipartido, completo e orientado; (c) Trata-se das Árvores Binárias, visto que falou de método de varredura e raiz. Gabarito: Letra D
189
15. (CESPE - 2013 – TCE/ES – Analista de Sistemas) Considerando o grafo ilustrado acima, assinale a opção em que é apresentada a descrição em vértices (V) e arestas (A). a) V = {1, 2, 3, 4, 5, 6 } A = {(2, 4), (2, 3), (2, 5), (3, 6), (1, 5)} b) V = { 2, 4, 1, 3, 6, 5 } A = {(4, 2), (1, 3), (5, 2), (6, 3), (5, 3)} c) V = {1, 2, 3, 4, 5, 6 } A = {(4, 2), (3, 4), (5, 2), (6, 3), (5, 3)} d) V = {1, 2, 3, 4, 5, 6 } A = {(4, 2), (3, 1), (5, 1), (6, 2), (5, 3)} e) V = { 2, 4, 1, 3, 6, 5 } A = {(4, 2), (3, 1), (5, 2), (6, 3), (5, 3)}
Galera, os vértices não precisam estar ordenados, logo todos os itens estão corretos. No entanto, as arestas precisam corresponder ao grafo. Vamos por eliminação: (a) A aresta (2,3) não existe; (b) Quase tudo certo, mas a ordem (1,3) está errada – seria (3,1); (c) A aresta (3,4) não existe; (d) A aresta (5,1) não existe; (e) Tudo perfeito! Gabarito: Letra E
190
16. (CESPE - 2012 – TJ/RO – Analista de Suporte – ITEM B) Grafo corresponde a uma estrutura abstrata de dados que representa um relacionamento entre pares de objetos e que pode armazenar dados em suas arestas e vértices, ou em ambos.
Conforme vimos em aula, a definição está perfeita! Gabarito: Correto
191
17. (CESPE - 2012 – PEFOCE – Perito Criminal) Considere que um grafo G seja constituído por um conjunto (N) e por uma relação binária (A), tal que G = (N, A), em que os elementos de N são denominados nós (ou vértices) e os elementos de A são denominados arcos (ou arestas). Em face dessas informações e do grafo abaixo, é correto afirmar que esses conjuntos são N = {1,2,3,4} e A = {(1,2),(2,1),(2,4),(2,3)}.
Conforme vimos em aula, a questão está perfeita! Temos quatro nós: N = {1,2,3,4}; e quatro arestas: A = {(1,2),(2,1),(2,4),(2,3)} – observem que a ordenação do grafo ordenado está perfeita. Gabarito: Correto
192
18. (CESPE - 2012 – BASA – Analista de Sistemas) É misto o grafo com arestas não dirigidas que representam ruas de dois sentidos e com arestas dirigidas que correspondem a trechos de um único sentido, modelado para representar o mapa de uma cidade cujos vértices sejam os cruzamentos ou finais de ruas e cujas arestas sejam os trechos de ruas sem cruzamentos.
Grafo simples: Não contém laços. Grafo vazio: Contém apenas vértices, sem arcos. Grafo misto: Possui arestas dirigidas e não-dirigidas. Grafo trivial: Possui apenas um vértice. Grafo denso: Tem muitos arcos em relação ao número de vértices. Grafo esparso: Tem poucos arcos. Correção: A definição de grafo misto está correta conforme a fonte mencionada. Gabarito: Correto.
193
19. (CESPE - 2012 – BASA – Analista de Sistemas) Para modelar a rede que conecta todos os computadores em uma sala de escritório com a menor metragem possível de cabos, é adequado utilizar um grafo G cujos vértices representem os possíveis pares (u, v) de computadores e cujas arestas representem o comprimento dos cabos necessários para ligar os computadores u e v, determinando-se o caminho mínimo, que contenha todos os vértices de G, a partir de um dado vértice v.
Galera, leiam devagar a questão! Vejam essa parte: “(...) cujos vértices representem os possíveis pares (u,v)”. Vocês, é claro, se lembram do conceito de vértices e arestas. Ora, vértice representa um par de computadores? Não, vértices são os computadores! Quem representa pares são as arestas! Gabarito: Errado
194
20. (CESPE - 2012 – BASA – Analista de Sistemas) Um grafo completo contém pelo menos um subgrafo ponderado.
A questão não faz sentido, pois os conceitos de completude e ponderação são independentes. Um grafo completo pode ser ponderado ou não. Um grafo completo contém subgrafos, mas isso não implica que esses subgrafos sejam ponderados. Gabarito: Errado.
195
21. (CESPE - 2012 – BASA – Analista de Sistemas) Um grafo não direcionado é dito conectado quando há pelo menos um caminho entre dois vértices quaisquer do grafo.
Correto com uma pequena imprecisão. Um grafo é conectado se houver um caminho entre todos os pares de vértices. A definição ideal seria que um grafo é conectado quando há pelo menos um caminho entre cada par de vértices. Conclusão: A questão está basicamente correta, mas a definição pode ser aprimorada para ser mais precisa. Gabarito: Correto.
196
22. (CESPE - 2012 – TJ/AC – Analista de Sistemas) Define-se um grafo como fortemente conexo se todos os nós puderem ser atingidos a partir de qualquer outro nó.
Se o grafo for direcionado/orientado, um grafo é dito fortemente conexo se existir um caminho de A → B e de B → A, para cada par (A,B) de vértices de um grafo. Em outras palavras, o grafo é fortemente conexo se cada par de vértices participa de um circuito. Isto significa que cada vértice pode ser alcançável partindo-se de qualquer outro vértice do grafo. Conforme vimos em aula, um grafo é fortemente conexo se todos os nós puderem ser atingidos a partir de qualquer outro nó. Como vimos na descrição, cada vértice pode ser alcançável partindo-se de qualquer outro vértice do grafo. Gabarito: Correto
197
23. (CESPE - 2013 – CRPM – Analista de Sistemas) Considere que o grafo não orientado representado na figura abaixo possua as seguintes características: G1 = (V1, A1) V1 = {A, B, C, D} A1 = {(A, C), (A, D), (B, C), (B, D), (A,B)}. Nesse caso, é correto afirmar que o grafo G1 possui quatro vértices, nomeados de A, B, C e D, e cinco arcos, que conectam pares de vértices, conforme especificado em A1.
A questão está quase perfeita, mas ela possui um deslize: não existe a aresta (A,B) – seria (C,D). Gabarito: Errado
198
24. (CESPE - 2012 – BASA – Analista de Sistemas) A implementação de um grafo do tipo ponderado e direcionado na forma de uma matriz de adjacência utiliza menor quantidade de memória que a implementação desse mesmo grafo na forma de uma lista encadeada.
Pensem comigo! Para um grafo com uma Matriz de Adjacência esparsa (não densa), uma representação de Lista de Adjacências do grafo ocupa menos espaço, porque ele não usa nenhum espaço para representar as arestas que não estão presentes. Lembram-se da lista? Nós só representamos os nós adjacentes, em contraste com a Matriz de Adjacência. No entanto, quanto mais denso, isso pode mudar. Conforme vimos em aula, para grafos esparsos (não densos), a Lista de Adjacência (que é uma lista encadeada) ocupa menos espaço em memória, na medida em que não necessita representar vértices não adjacentes – diferente da Matriz de Adjacência. Gabarito: Errado
199
25. (CESGRANRIO - 2014 – BASA – Analista de Sistemas) O grafo acima pode ser representado pela seguinte matriz:
Vamos ver se vocês se lembram! O vértice A11 tem ser 0, porque não há uma aresta do Nó 1 para o Nó 1. O vértice A12 tem ser 1, porque há uma aresta do Nó 1 para o Nó 2. O vértice A13 tem ser 0, porque não há uma aresta do Nó 1 para o Nó 3. O vértice A14 tem ser 1, porque há uma aresta do Nó 1 para o Nó 4. O vértice A15 tem ser 0, porque não há uma aresta do Nó 1 para o Nó 5. Logo, a primeira linha deve ser: 0, 1, 0, 1, 0. Eliminamos todos os itens, exceto os dois primeiros. Vamos pegar um vértice específico agora para descobrir qual está certo. Observem o vértice A23 e percebam que ele deve ser 1, porque existe uma aresta do Nó 2 para o Nó 3. Descobrimos a resposta! Gabarito: Letra A
200
26. (CESPE - 2012 – TJ/SE – Analista de Sistemas) Um grafo é formado por um par de conjuntos de vértices e arestas, não podendo o conjunto de vértices ser particionado em subconjuntos.
Podem, sim. O nome disso é: Grafo Bipartido! Um grafo é dito ser bipartido quando seu conjunto de vértices V puder ser particionado em dois subconjuntos V1 e V2. Portanto não há óbice quanto ao particionamento de um conjunto de vértices em subconjuntos. Gabarito: Errado
201
27. (CESPE - 2012 – TRT/AM – Analista de Sistemas) Um grafo é uma estrutura de dados consistida em um conjunto de nós (ou vértices) e um conjunto de arcos (ou arestas). O grafo em que os arcos possuem um número ou peso associados a eles, é chamado de grafo: a) predecessor. b) adjacente. c) incidente. d) ponderado. e) orientado.
Um grafo pode ser dirigido – também chamado direcionado, orientado ou dígrafo –, se as arestas tiverem uma direção (imagem da esquerda), ou não dirigido, se as arestas não tiverem direção (imagem central). Se as arestas tiverem associado um peso ou custo, o grafo passa a ser chamado ponderado, valorado ou pesado (imagem da direita). Conforme vimos em aula, um grafo com arcos numerados ou com peso são chamados Grafos Ponderados ou Grafos Valorados ou Grafos Pesados. Gabarito: Letra D
202
1. (CESPE - 2010 - Banco da Amazônia - Técnico Científico - Tecnologia da Informação - Administração de Dados) A pesquisa sequencial é aplicável em estruturas não ordenadas.
Perfeito! Para fazer uma pesquisa sequencial, não é necessário que os dados estejam ordenados – diferentemente da pesquisa binária. Gabarito: C
203
2. (CESPE - 2012 - Banco da Amazônia - Técnico Científico - Administração de Dados) As colisões ocorrem na utilização de tabela hash porque várias chaves podem resultar na mesma posição.
Perfeito! É raro, mas acontece... Gabarito: C
204
3. (CESPE - 2010 - Banco da Amazônia - Técnico Científico - Tecnologia da Informação - Administração de Dados) Ocorre o hashing quando não há o armazenamento de cada entrada de uma tabela em um específico endereço calculado a partir da aplicação de uma função chave da entrada.
Pelo contrário, ocorre o hashing quando há o armazenamento de cada entrada de uma tabela em um específico endereço calculado a partir da aplicação de uma função chave da entrada. Gabarito: E
205
4. (FCC - 2008 - METRÔ-SP - Analista Treinee - Análise de Sistemas) O objetivo de fazer uma busca rápida a partir de uma chave de pesquisa simples e obter o valor desejado é alcançado pela estrutura de dados especial denominada: a) array. b) lista. c) vetor. d) árvore binária. e) tabela de hashing.
Trata-se da Tabela de Hashing! Gabarito: E
206
5. (CESPE - 2012 - Banco da Amazônia - Técnico Científico - Administração de Dados) A busca que utiliza uma tabela hash realiza comparação das chaves para encontrar a posição do elemento que está sendo buscado.
Não, eles utilizam a chave para gerar resultados que, esses sim, são comparados. Gabarito: E
207
6. (CESPE - 2010 - DETRAN-ES - Analista de Sistemas) No método de hashing, por meio de acesso sequencial, são utilizados tabelas e mapas para recuperar informações de endereço de arquivos de forma rápida e eficiente.
Não, Método de Hashing não faz Acesso Sequencial. Gabarito: E
208
7. (FCC - 2015 - DPE-SP - Programador) Um Programador da Defensoria Pública do Estado de São Paulo foi solicitado a propor uma solução para o problema: Há uma quantidade grande de dados classificáveis por chave e estes dados devem ser divididos em subconjuntos com base em alguma característica das chaves. Um método eficiente deve ser capaz de localizar em qual subconjunto deve-se colocar cada chave e depois estes subconjuntos bem menores devem ser gerenciados por algum método simples de busca para que se localize uma chave rapidamente. O Programador propôs como solução, corretamente, a implementação de: a) Deques. b) Tabela e função hash. c) Pilhas. d) Fila duplamente encadeada. e) Árvore Binária de Busca.
Como se fala em subdivisão em conjuntos com base nas chaves, podemos afirmar que se trata-se da Tabela de Hashing! As árvores de busca binária não dividem os elementos em subconjuntos, somente ordena a estrutura não-linear de forma a facilitar uma busca binária. Gabarito: B
209
01. (INQC/CPTRANS/2024) Observe o seguinte algoritmo: Algoritmo Maior Var num1, num2, maior: inteiro: Inicio Leia (num1, num2); Se (num1>num2) então maior ← num1; senão maior ← num2; fimse; escreva (maior); Fim A ferramenta utilizada para construção desse algoritmo é: a) diagrama de Nassi-Shneiderman b) diagrama hierárquico de fluxo c) pseudocódigo d) fluxograma
Veja que não temos uma estrutura padrão de linguagem - estamos usando uma linguagem estruturada apenas para descrever um algoritmo. Isso caracteriza o uso de pseudolinguagem. Gabarito: Letra C
210
02. (CEBRASPE/CAU BR/2024) Julgue o item a seguir, relativo a algoritmos de linguagem de programação. O pseudocódigo consiste em um texto estruturado com comandos escritos em linguagem humana, no qual se apoia a criação dos algoritmos computacionais.
Perfeito. O objetivo da pseudolinguagem, ou pseudocódigo, é estruturar algoritmos de programação através de uma linguagem natural, humana, para que qualquer um possa entender a “lógica” por detrás do programa. Gabarito: Correto
211
03. (CEBRASPE/CAU BR/2024) Com relação à lógica de programação, julgue o próximo item. A estrutura de controle IF, que pode ser classificada como do tipo iteração, determina o caminho que o algoritmo deve seguir, de acordo com determinada condição.
Temos 3 estruturas de controle num código: * Estruturas sequenciais * Estruturas de seleção * Estruturas de iteração (ou repetição) O IF, ou Se, é uma estrutura de seleção, que elenca uma série de blocos de código, e um deles será selecionado para execução conforme determinada condição pré-definida. Gabarito: Errado
212
04. (IGEDUC/CM V Santo Antão/2024) Julgue o item a seguir. O pseudocódigo é considerado uma linguagem de programação formal e executável, seguindo uma sintaxe e semântica específicas, semelhante a linguagens como Java e Python. Sua principal aplicação é na implementação direta de algoritmos em ambientes de desenvolvimento integrados, sem a necessidade de conversão para outra linguagem de programação.
Cuidado! O pseudocódigo não conta com uma estrutura definida e, portanto, não é uma linguagem executável. Diferentemente de linguagens como Java e Python. Gabarito: Errado
213
05. (CEBRASPE/TST/2024) programa principal inteiro i, contagem = 10, limite = 10; para (i = 0; i > limite; i = i + 1) faça contagem = contagem – 1; fim para imprime(contagem); fim programa Com base no algoritmo precedente, escrito em pseudocódigo, assinale a opção que corresponde ao tipo de estrutura em que se realiza o decréscimo da variável contagem. a) estrutura de controle b) estrutura de repetição c) estrutura condicional d) atributo e) função
O bloco de código apresenta uma estrutura Para, que é uma das formas de implementarmos uma estrutura de repetição (iteração), principalmente nos casos em que sabemos a quantidade de laços (iterações, repetições) que queremos realizar. Gabarito: Letra B
214
06. (CEBRASPE/TST/2024) Uma das vantagens do uso de funções predefinidas é a) o reaproveitamento de código. b) a passagem de parâmetros. c) o recebimento do retorno das funções. d) o grau de abstração do sistema. e) a facilidade de implementação das funções.
Funções pré-definidas fazem parte das funções nominadas, que permitem seu reuso através de uma chamada posterior, utilizando o nome da função - que pode ser nativa à linguagem, ou criada pelo desenvolvedor. Com isso em mente, vamos às alternativas. a) Certo. De fato, uma das maiores vantagens trazidas pelas funções predefinidas é a capacidade de reaproveitar o bloco de código ao longo do programa. b) Errado. Passagem de parâmetros é um processo feito em qualquer tipo de função, não é inerente às funções predefinidas. c) Errado. Toda função retorna determinado valor. d) Errado. A abstração do sistema envolve o foco em partes mais importantes do código - o que não está ligado, necessariamente, às funções predefinidas. e) Errado. Não é porque uma função foi definida previamente que ela será de fácil implementação. Existem funções predefinidas complexas, como as de ordem superior. Portanto, a alternativa correta é a letra A. Gabarito: Letra A
215
07. (IBFC/TRF 5/2024) Sobre Estruturas de Seleção / Condição, analise as afirmativas e dê valores Verdadeiro (V) ou Falso (F). ( ) A instrução else é obrigatória em todas as estruturas de condição. ( ) A instrução else em uma estrutura de condição é executada quando a condição no if é avaliada como falsa. ( ) Estruturas de condição não são necessárias em programação, pois é possível realizar todas as operações sem avaliar condições. Assinale a alternativa que apresenta a sequência correta de cima para baixo. a) F - F - F b) F - V - F c) V - F - V d) V - V - V
Vamos analisar cada item. ( ) A instrução else é obrigatória em todas as estruturas de condição. Falso. O else, ou Senão é uma forma de adicionarmos um caso residual - e nem sempre ele é obrigatório, até mesmo no uso de estruturas If (Se) ( ) A instrução else em uma estrutura de condição é executada quando a condição no if é avaliada como falsa. Verdadeiro. Numa estrutura if...else, ou Se...senão, a execução do bloco Else só é implementada quando a condição verificada no bloco if for falsa. ( ) Estruturas de condição não são necessárias em programação, pois é possível realizar todas as operações sem avaliar condições. Falso. Não temos outra forma de implementar as funcionalidades das estruturas condicionais sem o uso delas - e as condições são partes estruturantes e essenciais de um código. Portanto, ficamos com F-V-F. Gabarito: Letra B
216
08. (CEBRASPE/FINEP/2024) Assinale a opção que corresponde ao comando de salto incondicional utilizado em programação estruturada. a) goto b) struct c) if d) else e) for
Na execução de um código, dada determinada situação, pode ser interessante (ou obrigatório) que linhas de código sejam puladas para a correta execução de um programa - como, por exemplo, se determinado bloco Se for executado, podemos pular instruções que introduziriam alternativas à execução desse bloco. A instrução que realiza esse “salto” é a goto (vá para). Gabarito: Letra A
217
11. (COCP IFMT/IFMT/2023) Segundo Manzano & Oliveira (2016), um laço incondicional, entre outras coisas, é um tipo de laço que é iterativo, porém não é interativo e tem seu funcionamento controlado por uma variável denominada contador. Com essa descrição, o autor se refere ao laço do tipo: a) para/fim_para b) repita/até_que c) enquanto/fim_enquanto d) laço/fim_laço e) execute/enquanto_for
As características que ajudam a identificar qual estrutura de repetição está sendo utilizado é: * É incondicional, isso é, não analisa uma condição para ser executado * Seu funcionamento é controlado por um contador Isso nos denota o uso da estrutura repetitiva Para, que utiliza um contador para verificar quantas iterações serão feitas. Porém, como ele não analisa o resultado da iteração, somente o contador, ele não é um loop interativo. Gabarito: Letra A
218
12. (CEBRASPE/CNMP/2023) Julgue o item subsecutivo, que se referem a conceitos de programação e banco de dados. As estruturas condicionais são utilizadas para testar variáveis lógicas.
Perfeito. Quando usamos uma estrutura condicional, por exemplo o Se...então..senão, estamos fazendo uma verificação lógica - isso é, se o valor da sintaxe passada como parâmetro for verdadeiro, executaremos o bloco Se, se for falso, executaremos o Senão. Gabarito: Correto
219
13. (FUNDATEC/CIGA SC/2023) Na linguagem Java, existe uma estrutura de controle de fluxo de execução que permite executar um bloco de código pelo menos uma vez e depois repeti-lo enquanto uma condição é verdadeira. Que estrutura é essa? a) do-while b) while c) for d) if-else e) repeat-until
A estrutura que é executada ao menos uma vez, independentemente de ter sua condição de implementação verificada (se é verdadeira ou falsa), é o Faça...enquanto - ou Do...while. Um adendo: a explicação também poderia ser respondida com o Repita...até, mas o Java não aceita nenhum comando desse gênero. Gabarito: Letra A
220
15. (FUNDATEC/IFFAR/2023) Sobre a utilização de estruturas de repetição em algoritmos, assinale a alternativa que apresenta estrutura que executa um conjunto de instruções pelo menos uma vez antes de verificar a validade da condição estabelecida. a) repita...até_que b) faça...enquanto c) caso... seja... faça... senão... fim_caso d) enquanto... faça... fim_enquanto e) para... de... até... faça... fim_para
A estrutura de repetição que sempre executará um bloco de código antes de verificar a condição, fazendo essa verificação após a execução, é o Repita...Até. Cuidado - o Faça...enquanto tem uma estrutura muito similar, também irá executar o bloco ao menos uma vez, mas faz a verificação antes da executá-lo. Gabarito: Letra A
221
16. (CONSULPLAN/IF PA/2023) As estruturas de controle de fluxo são elementos fundamentais da lógica de programação. Assinale, a seguir, um exemplo de estrutura de controle de fluxo em lógica de programação. a) Loop. b) Classe. c) Variável. d) Constante.
Ferramentas de controle de fluxo são aquelas que interrompem o fluxo “normal” de leitura do código, o fluxo contínuo e sequencial. Uma das formas de controlarmos o fluxo é através das estruturas de repetição, ou loops. Com eles, um determinado bloco de código é executado n vezes, enquanto a condição for verdadeira ou conforme um contador. Gabarito: Letra A
222
17. (CONSUPLAN/IF PA/2023) Qual das seguintes instruções de pseudocódigo seria utilizada para fazer o programa repetir um conjunto de ações até que uma determinada condição seja satisfeita? a) SE...ENTÃO b) PARA...ATÉ c) CASO...SEJA d) ENQUANTO...FAÇA
Uma estrutura, para repetir inúmeras vezes, deve se encaixar no conceito das estruturas de repetição. Dentre as alternativas, temos duas delas - o PARA...ATÉ, e o ENQUANTO...FAÇA. A estrutura que faz uma sequência de repetições até que determinada condição seja implementada é o ENQUANTO... FAÇA. O PARA...ATÉ usará um contador para ter uma quantidade definida de repetições. Gabarito: Letra D
223
18. (FUNDATEC/IFC/2023) Em relação a algoritmos, analise as assertivas abaixo: I. Um algoritmo representa uma sequência de regras. II. Essas regras devem ser executadas em uma ordem preestabelecida. III. Cada algoritmo possui um conjunto finito de regras. IV. Essas regras devem possuir um significado e ser formalizadas segundo alguma convenção. Quais estão corretas? a) Apenas I e II. b) Apenas I e III. c) Apenas II e IV. d) Apenas II, III e IV. e) I, II, III e IV.
Vamos analisar cada item. I. Certo. O algoritmo é uma sequência de regras que visa executar determinado programa. II. Certo. A ordem corresponde ao fluxo de execução do código - usualmente sequencial. III. Certo. Os algoritmos possuem regras para definir sua correta interpretação. IV. Certo. Mesmo em pseudocódigo, temos algumas regras e padronizações que devem ser feitas e mantidas, imagine escrever cada função, cada loop de um jeito diferente num mesmo código, isso geraria uma confusão total. Portanto, todos os itens estão corretos. Gabarito: Letra E
224
19. (FUNCER/Pref. São Tomé/2023) Dentro da lógica de programação é uma estrutura que permite executar mais de uma vez o mesmo comando ou conjunto de comandos, de acordo com uma condição ou com um contador. A estrutura de repetição básica abaixo está se referindo: a) do while. b) for. c) while. d) if.
A estrutura apresentada inicia, em A, com uma verificação se determinado item possui o valor TRUE (verdadeiro) ou FALSE (falso). Se o valor for TRUE, executamos o bloco B e, em seguida, verificamos novamente se seu valor é verdadeiro ou falso. Se o valor for FALSE, seguimos na execução normal do código. Essa estrutura é chamada de WHILE, ou Enquanto. Gabarito: Letra C
225
20. (CETAP/SEMAS PA/2023) Em que situação a recursividade é apropriada como solução para um problema de programação? a) Quando o problema pode ser dividido em subproblemas independentes e semelhantes ao problema inicial. b) Quando o problema é simples, ilógico e linear. c) Quando o problema requer a utilização de laços de repetição. d) Quando o problema é de natureza elétrica, o que demanda maior capacidade de processamento. e) Quando o problema requer uma solução iterativa, ou seja, uma sequência de soluções que admitem certa margem de erro, mas que vão melhorando conforme novas iterações são executadas.
Vamos analisar cada alternativa. a) Certo. A recursividade é a aplicação da “especialização do problema”, já que dividimos uma função, que objetiva “resolver um problema”, em subproblemas independentes a cada recursão. b) Errado. A recursividade exige uma lógica mais complexa, lógica e não-linear. c) Errado. Quando o problema requer laços de repetição, são usados os laços (estruturas de repetição). d) Errado. Problema elétrico? Isso é problema para a engenharia elétrica, não para programação haha e) Errado. Assim como na letra B, se a o problema requer iterações, usa-se uma estrutura que permita iterações - as estruturas de repetição. Portanto, correta a alternativa A. Gabarito: Letra A
226
21. (CEBRASPE/EMPREL/2023) calc = 5 % 2 imprime(calc) Assinale a opção que apresenta o resultado da execução do pseudocódigo precedente. a) 1 b) 2 c) 10 d) 20 e) 25
A sintaxe 5%2 indica que estamos fazendo um módulo de 5 por 2, e seu retorno será o resto da divisão. Portanto, o valor impresso será equivalente ao resto da divisão de 5 por 2, que é igual a 1. Gabarito: Letra A
227
23. (CEBRASPE/Pref. Fortaleza/2023) No que concerne a conceitos de algoritmos e blocos de comandos, julgue o item seguinte. As funções são um bloco de código ou comandos constituindo um conjunto específico de instruções repetíveis, que recebem uma ou mais entradas e produzem alguma saída.
Perfeito! As funções trazem blocos de código, pequenos programas, que podem ser reutilizados em diversos pontos do código. Além disso, para ser caracterizada como uma função, a operação deve produzir alguma saída (retorno). Gabarito: Correto
228
24. (CEBRASPE/Pref. Fortaleza/2023) Com relação a estruturas de controle, seleção, repetição e desvio, julgue o item a seguir. Um loop que sempre se repetirá em um determinado número de vezes é representado pelo código SE ENTÃO SENÃO FIM SE.
O SE ENTÃO SENÃO é uma estrutura condicional, de seleção, e não um loop. Os loops englobam o PARA, ENQUANTO, FAÇA ENQUANTO, REPITA ATÉ, e outros. Portanto, incorreta a afirmativa. Gabarito: Errado
229
25. (CEBRASPE/Pref. Fortaleza/2023) No que concerne a conceitos de algoritmos e blocos de comandos, julgue o item seguinte. Algoritmo é uma lista de instruções que conduzem ações especificadas, passo a passo, em rotinas embasadas em hardware ou software.
Um algoritmo é, exatamente, uma lista de instruções que passará determinado valor de entrada por diversas ações e passos, que podem envolver rotinas embasadas em hardware (linguagens de baixo nível) ou em software (linguagens de alto nível). Então, correta a definição. Gabarito: Correto
230
26. (CEBRASPE/Pref. Fortaleza/2023) Com relação a estruturas de controle, seleção, repetição e desvio, julgue o item a seguir. Ao final da execução do algoritmo a seguir, o valor 0 será apresentado. constante A = 50 enquanto (A > 0) A -= 5; fim enquanto escreva (A);
Essa questão tem algumas camadas de conhecimento sendo exploradas. Para começar, podemos afirmar errado pois a variável A é do tipo constante, ou seja, não poderá ser alterada. Porém, vamos ignorar esse fato por enquanto e vamos analisar a estrutura do Enquanto. Temos uma condição A > 0, ou seja, enquanto A for maior que 0, iremos executar um bloco de código. O bloco de código é a operação A -= 5, que é uma operação de atribuição: cada vez que ela for chamada, retiraremos 5 unidades do valor de A. Portanto, iríamos reduzir o valor de 5 em 5 - teríamos 50, 45, 40... 0. Veja que, apesar da condição ser A > 0, quando tivermos o valor de A = 5, a condição ainda será verdadeira e executaremos a operação A -= 5, resultando em A = 0. Nesse momento, como A possui o valor 0, a condição não será mais estabelecida e não executaremos mais o código - mas o valor do A que seria impresso realmente seria 0. Note a importância da ordem de leitura do código. Porém, novamente, como estamos tratando de uma constante, não podemos alterar seu valor de forma externa - então o valor da operação escreva (A) (que é similar ao imprimir(A), que estamos fazendo até agora) será 50. Gabarito: Errado
231
30. (CEBRASPE/Pref. Fortaleza/2023) A respeito de recursividade, julgue o próximo item. Uma grande vantagem da utilização da recursividade é o baixo consumo de memória.
Muito pelo contrário - essa é uma desvantagem da recursividade, já que ela tem um alto consumo de memória. Iremos executar várias iterações dentro de uma só função, o que irá necessitar uma alocação maior de memória. Gabarito: Errado
232
33. (IDCAP/CREA BR/2023) É uma maneira de resolver problemas decompondo-os repetidamente em subproblemas do mesmo tipo. Um exemplo clássico de uso desse tipo de algoritmo para resolver problemas é a Torre de Hanoi. O trecho acima diz respeito a(o): a) Algoritmo de programação dinâmica. b) Algoritmo recursivo. c) Algoritmo backtracking. d) Algoritmo de força bruta. e) Algoritmo de divisão e conquista.
Quando decompomos um problema dentro de pequenos problemas menores, estamos fazendo o que é chamado de recursividade. Determinada função, por exemplo, passa a chamar a si diversas vezes, até que seja atingido um bloco base - que interrompe a necessidade da recursão. Gabarito: Letra B
233
35. (FGV/TCE SP/2023) Marta está definindo um algoritmo para descrever um menu de funções do sistema, apresentando as opções baseadas em números, seguido da leitura da opção, com a saída ocorrendo após a digitação do número zero. Para gerenciar o fluxo de execução, que envolve a exibição do menu e leitura da opção, repetindo-se até que seja digitada a opção zero, Marta deve utilizar a estrutura de controle: a) enquanto - faça; b) se - então; c) repita - até; d) para - faça; e) se - então - senão.
O fluxo de execução de um código é a ordem com que o interpretador lê esse código e executa operações. Estamos seguindo um fluxo de execução de bloco de código → verificação de condição, até que determinada condição seja verificada como verdadeira. Essa estrutura se caracteriza como uma repetição do tipo Repita...Até. Gabarito: Letra C
234
39. (CEBRASPE/PETROBRAS/2022) Julgue o item subsequente, a respeito de algoritmos para ordenação e pesquisa e de programação recursiva. Uma função é dita recursiva quando, dentro dela, é feita uma ou mais chamada a ela mesma.
Veja que essa é uma cobrança recorrente - tanto do ponto de vista teórico, que corresponde a quebra do programa em subprogramas, quanto do ponto de vista prático, que corresponde a uma função chamando a si uma ou mais vezes. Portanto, correta a afirmativa. Gabarito: Correto
235
40. (SELECON/AMAZUL/2022) Na construção de algoritmos estruturados são utilizadas estruturas de controle, como a conhecida por REPITA ... ATÉ ... FIM REPITA. Neste contexto, NÃO é uma afirmativa válida para essa estrutura de controle: a) A condição de teste da estrutura é inserida no INÍCIO da estrutura de controle. b) A condição de teste da estrutura é inserida no FIM da estrutura de controle. c) A saída do loop ocorre quando o teste da condição de controle retoma valor VERDADEIRO. d) A execução do programa permanece no loop se o teste da condição de controle retoma valor FALSO.
Vamos analisar cada alternativa. a) Errado. A condição no bloco REPITA...ATÉ é implementada no fim da estrutura de controle, não no início. b) Certo. Vide letra A. c) Certo. A saída do ENQUANTO é feita quando o valor for VERDADEIRO. d) Certo. Se o valor da condição for FALSO, permaneceremos no loop até que esse valor seja VERDADEIRO. Sendo assim, a alternativa incorreta é a letra A. Gabarito: Letra A
236
42. (IFTO/IFTO/2022) Qual das definições abaixo melhor descreve o que é um algoritmo? a) Uma linguagem de programação usada para desenvolvimento de aplicativos web. b) Um protocolo usado na camada de rede para estabelecer uma comunicação entre dois dispositivos. c) Tecnologia usada para enviar e receber dados do servidor sem precisar recarregar a página inteira. d) Mecanismo para adicionar estilo a um documento web. e) Uma sequência de passos que devem serem executados para alcançar um determinado objetivo.
Vamos analisar cada alternativa. a) Errado. A alternativa descreve uma linguagem web, como o HTML e JavaScript. b) Errado. Os protocolos são padrões para troca de informações entre diferentes computadores numa rede. c) Errado. A alternativa descreve o funcionamento de APIs assíncronas. d) Errado. Esses mecanismos são expressos em um arquivo chamado CSS. e) Certo. A alternativa traz corretamente a definição de algoritmos. Gabarito: Letra E
237
44. (FGV/SEMSA Manaus/2022) Considere a função fat especificada abaixo em pseudocódigo, que recebe um número inteiro positivo e calcula o fatorial do mesmo de forma recursiva, devolvendo um número inteiro. function fat (n as integer) as integer if n > 1 then ... else return 1 endif; Para que a função fat funcione corretamente, o trecho “. . . “ deve ser substituído por a) return fat(n + 1) b) return fat(n) c) return fat(n-1) d) return n * fat(n) e) return n * fat(n-1)
A questão traz um programa com um bloco de código faltante. O objetivo é que seja calculado o fatorial do algoritmo de forma recursiva - isso nos indica que devemos chamar a própria função fat dentro do código. Como não queremos uma recursão infinita, devemos ajeitar o parâmetro da função chamada para que ela chegue a obedecer a condição do bloco base (no else) - que será cumprida quando o valor de n ≤ 1. Portanto, a cada iteração devemos fazer fat(n-1). Assim, se n for igual a 4, por exemplo, iremos reduzi-lo uma unidade a cada laço, até chegarmos a n = 1. Além disso, o fatorial é composto pela multiplicação de um número pelos seus predecessores - então, por exemplo, o fatorial de 3 (3!) será igual a 3 x 2 x 1. Sendo assim, precisamos passar o parâmetro atual para o cálculo - ficando, portanto, com n * fat(n-1) na recursão. Vamos rodar n = 3, para ver se a recursão funciona: * LAÇO 1 - 3 * fat(2) * LAÇO 2 - 2 * fat(1) * LAÇO 3 - fat(1) = 1 Subimos preenchendo os valores. * LAÇO 2 - 2*1 = 2 * LAÇO 1 - 3*2 = 6 Assim, podemos afirmar que o algoritmo age de forma correta. Gabarito: Letra E
238
45. (QUADRIX/CRF GO/2022) Acerca de programação, julgue o item. Durante a execução de um programa, uma variável pode armazenar vários valores a cada instante, ou seja, ela pode armazenar até dez registros ao mesmo tempo.
“A cada instante” é uma constatação um pouco forte - mas, de fato, podemos frequentemente mudar o valor de uma variável, afinal, ela é variável. É o que acontece numa recursão, por exemplo. Porém, a variável irá armazenar apenas o valor atual, não múltiplos valores ao mesmo tempo - a não ser que seja uma variável de estrutura de dados. Mesmo assim, não teremos os limites de dez registros ao mesmo tempo. Portanto, podemos concluir que a afirmativa está incorreta. Gabarito: Errado
239
46. (DIRENS/EEAR/2022) Relacione as colunas quanto às Estruturas de Controle do PHP. Em seguida, assinale a alternativa com a sequência correta. 1 – Executa um conjunto de instruções; baseado em um contador. 2 – Avalia a condição e, se for verdadeira, continua executando. 3 – Realiza uma avaliação, desvio condicional. ( ) IF ( ) FOR ( ) WHILE a) 2 - 1 - 3 b) 1 - 2 - 3 c) 3 - 2 - 1 d) 3 - 1 - 2
Vamos identificar cada item. 1 – Executa um conjunto de instruções; baseado em um contador. Trata-se do FOR (ou PARA, em português). 2 – Avalia a condição e, se for verdadeira, continua executando. Descreve a estrutura do WHILE (ENQUANTO). 3 – Realiza uma avaliação, desvio condicional. Traz a definição da condicional IF (SE...ENTÃO) Portanto, temos 3 - 1 - 2. Gabarito: Letra D
240
47. (IDECAN/UNILAB/2022) Observe o algoritmo a seguir: 1. escreva("Digite um numero....: ") 2. leia(n) 3. para i de 1 ate 18 faca 4. se vet[i] = n entao 5. p := i 6. fimse 7. fimpara Na linha 5, qual a função da variável p? a) Recebe o número digitado pelo usuário. b) Recebe a posição no vetor vet do número encontrado. c) Recebe o valor do número encontrado na posição i do vetor vet. d) Recebe a soma dos números do vetor vet.
Na linha 5, temos o valor de i sendo atribuído à variável p. O i é a posição do vetor que estamos navegando - portanto, podemos afirmar que i recebe a posição no vetor vet do respectivo valor de i. Gabarito: Letra B
241
48. (FUNDATEC/SBC/2022) Sobre os testes de condições em linguagem de programação, é correto afirmar que: a) Um teste de condição pode ser realizado através da instrução while. b) A componente else do if é obrigatório. c) if-else a condição é avaliada e, caso seja verdadeira, é executada a instrução associada ao else. d) if-else permite a existência de instruções que não são executadas em um programa. e) if-else não pode ser executado de forma encadeada.
Vamos avaliar cada item. a) Errado. O WHILE é uma instrução de repetição, não de condição. b) Errado. O ELSE (equivalente ao Senão) é opcional. c) Errado. Se a condição for verdadeira, executamos o bloco do IF. d) Certo. O IF-ELSE é uma instrução de seleção, ou seja, de inúmeros blocos, somente um será executado. e) Errado. Podemos ter IF-ELSE encadeados. Portanto, a alternativa correta é a letra D. Gabarito: Letra D
242
49. (CEBRASPE/BANRISUL/2022) Julgue o próximo item, a respeito de lógica de programação. Os laços usados em estruturas de repetição e teste podem ser feitos por meio de comandos como enquanto e repita.
Perfeito! Os laços são as repetições, feitas na estrutura de repetição. Comandos como Enquanto, Repita...até, Faça...até e Para são formas de implementarmos essas estruturas. Gabarito: Correto
243
50. (CEBRASPE/BANRISUL/2022) Julgue o próximo item, a respeito de lógica de programação. As estruturas se e senão são estruturas de repetição utilizadas nas situações em que, caso determinada condição seja alcançada, um comando é realizado, caso contrário, outro comando é executado.
Se e Senão são estruturas de seleção, condicionais, e não estruturas de repetição. De resto, a explicação está correta - se a condição for verdadeira, executaremos um bloco, caso contrário, executaremos o outro bloco. Gabarito: Errado
244
51. (IBFC/AFEAM/2022) Dada a forma geral a seguir, existente em várias linguagens de programação, assinale a alternativa que apresenta corretamente a que tipo de estrutura se refere. switch (expressão) { case expressão_constante1:sentença1; . . . case constanten: sentença_n; [default: sentençan + 1] } a) Controle múltiplo b) Repetição múltipla c) Desvio múltiplo d) Seleção múltipla
O SWITCH...CASE é uma forma em inglês de implementarmos a estrutura condicional ESCOLHA...CASO. Essa é uma estrutura de seleção múltipla, que permite a escolha de nenhum, um ou múltiplos casos, onde cada um comportará um bloco de código distinto. Gabarito: Letra D
245
52. (IBFC/DPE MT/2022) Assinale a alternativas que esteja tecnicamente correta quanto ao pseudocódigo, em inglês, que representa uma estrutura de repetição. a) Switch b) Return c) While d) Function
Das estruturas apresentadas, a única que apresenta uma estrutura de repetição é o WHILE. A estrutura SWITCH é uma estrutura de seleção múltipla, RETURN é um comando para atribuir retorno a uma função, e FUNCTION é função, em inglês. Gabarito: Letra C
246
53. (QUADRIX/SEE DF/2022) Acerca dos aspectos das linguagens de programação e das estruturas de dados e da programação orientada a objetos (POO), julgue o item a seguir. Na lógica de programação, o operador lógico “e” possui a função de disjunção, enquanto o operador “não” possui a função de negação.
Cuidado! O “e” lógico, em programação, tem valor de conjunção, isso é, só será verdadeiro se todos os seus elementos também forem. Já o “não”, de fato, é uma negação lógica. Gabarito: Errado
247
55. (IDECAN/SEFAZ RR/2022) Quando criamos um programa de computador, utilizamos a seguinte sequência de operações na grande maioria das vezes: entrada de dados, processamento e saída. Selecione a estrutura de seleção que nunca testa uma ou mais variáveis de acordo com uma condição. a) if b) else if / elif c) else d) while e) for
Quando estamos rodando uma condicional, temos o bloco do SE..ENTÃO, que irá analisar uma condição e executar determinar bloco de código se essa condição for verdadeira. Em seguida, podemos ter o bloco SENÃO (else), que, em casos de seleção binária, nunca irá fazer uma avaliação do valor da condição - somente será executada como um “caso residual”. Gabarito: Letra C
248
56. (IDECAN/SEFAZ RR/2022) Carlos trabalha como desenvolvedor de software e recebe a demanda de criar um trecho de código usando um loop de repetição que somente pode ser usado quando se sabe a quantidade de vezes que o loop vai acontecer. Selecione o loop de repetição que Carlos deve utilizar. a) if b) for c) while d) switch e) do - while
O loop escolhido quando se sabe a quantidade de repetições que teremos é o loop Para - o FOR. Nele, teremos um contador, onde definiremos o valor inicial, final e a forma de incremento (ou decremento), com isso conseguimos definir a quantidade de repetições que teremos. Gabarito: Letra B
249
60. (QUADRIX/PRODAM/2022) A respeito das estruturas de repetição, assinale a alternativa que apresenta a estrutura que se consiste em um laço de repetição determinado, ou seja, utilizado quando é conhecida antecipadamente — antes de iniciado o laço — a quantidade de vezes em que os comandos devem ser executados. a) DO WHILE b) WHILE c) FOR d) IF e) CASE
A estrutura que analisa a quantidade de vezes que determinada estrutura de repetição irá ser repetida antes da execução do código, baseado em um contador, é o PARA, ou FOR, em inglês. Gabarito: Letra C
250
61. (CEBRASPE/CAU BR/2024) Julgue o item a seguir, relativo a algoritmos de linguagem de programação. Os dados de um algoritmo devem ser definidos por tipos para que seus conteúdos possam ser submetidos a operações corretas, inerentes a cada tipo de dado.
A definição do tipo de dado de uma variável é essencial, já que cria restrições a o que pode ou não ser alocado nessa variável. Essa definição pode ser explícita ou implícita, a depender da tipagem da linguagem. Nesse sentido, correta a afirmativa. Gabarito: Correto
251
62. (IGEDUC/CM V Santo Antão/2024) Julgue o item a seguir. Na programação, os operadores lógicos são utilizados principalmente para operações matemáticas complexas, como cálculos de derivadas e integrais. Esses operadores, incluindo adição, subtração, multiplicação e divisão, são fundamentais na construção de algoritmos para aplicações matemáticas avançadas.
Muito cuidado! Operadores lógicos são os operadores E, OU e NÃO, responsáveis por fazer comparações lógicas. Operadores matemáticos, como a soma e subtração, são responsáveis por inserir aplicações matemáticas. A afirmativa define operadores matemáticas, e não lógicos, e, por esse motivo, está incorreta. Gabarito: Errado
252
63. (IGEDUC/CM V Santo Antão/2024) Julgue o item a seguir. Na programação, o uso de variáveis e constantes é fundamental para o armazenamento e manipulação de dados. Variáveis podem ter seus valores alterados, enquanto constantes mantêm valores fixos durante a execução do programa. Dentre os tipos de dados comuns em programação estão inteiros (int), decimais (float, double), caracteres (char), strings e valores booleanos (boolean).
Perfeito! Dentro da programação, temos dois locais para alocação de valores na memória - as variáveis, que podem ter os valores alterados durante a execução dos códigos, e as constantes, que devem ter seus valores inalterados. E, de fato, os tipos de dado repassados pela questão estão corretos. Gabarito: Correto
253
64. (CEBRASPE/INPI/2024) Acerca de estrutura de dados e algoritmos, julgue o item a seguir. A passagem de um vetor por valor é mais eficiente que a passagem por parâmetro, considerando aspectos de tempo de processamento e espaço em memória, estando ambas as situações sob as mesmas condições de recursos.
Passar um vetor por valor implica em criar uma cópia do vetor original, o que pode ser muito ineficiente em termos de tempo de processamento e espaço de memória, especialmente se o vetor for grande. Isso ocorre porque cada elemento do vetor precisa ser copiado individualmente, o que pode levar a um aumento significativo no uso da memória e no tempo de processamento. Por outro lado, passar um vetor por referência (ou seja, como um parâmetro) é geralmente mais eficiente, pois apenas a referência ao vetor original é passada. Isso significa que não é necessário criar uma cópia do vetor, economizando assim tempo de processamento e espaço de memória. Portanto, em geral, a passagem de um vetor por referência é preferível à passagem por valor, especialmente quando se trabalha com vetores grandes. No entanto, é importante notar que passar um vetor por referência significa que qualquer alteração feita ao vetor dentro da função afetará o vetor original. Se isso não for desejado, então uma cópia do vetor deve ser feita de qualquer maneira. Gabarito: Errado
254
65. (CESGRANRIO/UNEMAT/2024) Em linguagens de programação, o escopo sintático refere- se a) à área do código onde uma variável pode ser referenciada. b) à hierarquia de operadores utilizados para realizar operações em expressões. c) às regras que determinam a forma correta das estruturas de controle de fluxo. d) ao conjunto de palavras-chave reservadas da linguagem. e) ao número máximo de parâmetros permitido em uma função, exclusivamente.
O escopo sintático em linguagens de programação engloba a área onde variáveis podem ser referenciadas. Isso significa que o escopo sintático determina as partes do código onde uma variável é acessível. As principais limitações de escopo são o escopo global e local. Por exemplo, se uma variável é definida dentro de uma função, seu escopo é geralmente limitado a essa função. Isso significa que a variável pode ser referenciada (ou seja, lida ou modificada) apenas dentro dessa função. Se tentarmos referenciar a variável fora da função, o programa provavelmente gerará um erro, pois a variável está fora do seu escopo sintático. Gabarito: Letra A
255
67. (FUNDATEC/IFC/2023) A _________ ocorre quando se armazena um valor em uma variável; quando deseja-se um desvio no fluxo de nosso código baseado em uma condição booleana, usa-se o comando _________; para realizar uma repetição de instrução, pode-se usar a instrução _________; a fim de não repetir códigos, tem a possibilidade de fazer uso de _________; por fim, para interromper um laço de repetição de forma abrupta, usa-se __________. Assinale a alternativa que preenche, correta e respectivamente, as lacunas do trecho acima. a) composição – if – do-while – funções – break b) atribuição – test – repetir – funções – parar c) atribuição – if – do-while – funções – break d) persistência – test – for – métodos – stop e) persistência – if – for – métodos – stop
Vamos preencher as lacunas: * Quando armazenamos um valor em uma variável, estamos fazendo uma ATRIBUIÇÃO. * O comando de desvio no fluxo, que fará uma seleção, é o IF. * A estrutura de repetição pode ser o Para, Enquanto, ou outros - porém, nas alternativas, a única que traz uma estrutura correta é o FAÇA...ENQUANTO, ou DO-WHILE. * Para interromper um laço usamos uma ferramenta chamada de QUEBRA, ou BREAK - que trará uma interrupção forçada do laço, mesmo que determinada condição ainda seja verdadeira. Portanto, ficamos com os preenchimentos ATRIBUIÇÃO, IF, DO-WHILE, BREAK. Gabarito: Letra C
256
69. (VUNESP/EPC/S2023) Considere que, ao se chamar uma função: a) foram passados os valores de variáveis para ela; b) o valor de cada variável na função chamadora é copiado nas variáveis fictícias correspondentes da função chamada; c) as alterações feitas nas variáveis fictícias na função chamada não têm efeito nos valores das variáveis reais na função chamadora. Esse método é conhecido como chamada a) cruzada. b) exclusiva. c) reversa. d) por valor. e) por referência.
Temos duas formas de atribuição - atribuições por valor, e por referência. Isso já nos permite eliminar as três primeiras alternativas. Quando passamos um valor de uma variável por valor, estamos fazendo uma cópia desse valor original, desassociando a referência com o destino. Dessa forma, podemos alterar a variável de origem do valor sem termos impactos na nova variável. E é exatamente essa abordagem a trazida pela questão. Se tivéssemos uma variável por referência, teríamos apenas um ponteiro referenciando o dado original, e qualquer alteração nesse dado original traria alterações para a variável que o referencia. Gabarito: Letra D
257
71. (VUNESP/DPE SP/2023) Os parâmetros que são passados para uma função de um programa são denominados parâmetros reais, enquanto que os parâmetros recebidos por uma função são denominados parâmetros formais. Neste contexto, em uma chamada de função por valor, os valores dos parâmetros reais a) são copiados para os parâmetros formais da função, e as alterações nestes efetuadas dentro da função refletem-se em alterações nos parâmetros reais. b) são copiados para os parâmetros formais da função, e as alterações nestes efetuadas dentro da função não implicam em alterações nos parâmetros reais. c) não são copiados para os parâmetros formais da função, e as alterações efetuadas nestes dentro da função, refletem-se em alterações nos parâmetros reais. d) não são copiados para os parâmetros formais da função, e as alterações efetuadas nestes dentro da função, não implicam em alterações nos parâmetros reais. e) não são copiados para os parâmetros formais da função, e esta não pode realizar alterações em seus parâmetros formais.
Nas chamada de função por valor, os parâmetros são copiados para a função, e, graças a isso, eventuais alterações não impactam os valores originais, ou parâmetros reais. Nesse sentido, a alternativa que traz a explicação correta é a letra B. Gabarito: Letra B
258
72. (CENTEC/SEDUC CE/2023) Uma variável é um espaço na memória do computador destinado a um dado que é alterado durante a execução do algoritmo. Para funcionar corretamente, as variáveis precisam ser definidas por nomes e tipos. Analise o código abaixo e assinale a resposta CORRETA, respectivamente do tipo primitivo da variável e o resultado, linha 09. 01 Programa { 02 funcao inicio() { 03 real resultado 04 05 resultado = 5.0 + 4.0 * 2.0 06 escreva(resultado) 07 08 resultado = (5.0 + 4.0) * 2.0 09 escreva(resultado) 10 11 resultado = 1.0 + 2.0 / 3.0 * 4.0 12 escreva(resultado) 13 } 14 } a) Real e 18.0 b) Cadeia e 22.0 c) Real e 40.0 d) Inteiro e 20.0 e) Real e 22.0
Na linha 9, estamos escrevendo o resultado da função passada logo acima, na linha 8. Vamos resolvê-la: * resultado = (5.0 * 4.0) * 2.0 * resultado = 9.0 * 2.0 * resultado = 18.0 Então, o resultado será 18.0 e o número do tipo real - detalhe que, apesar do resultar ser um número inteiro (18), a presença de uma casa decimal nos traz o tipo real. Gabarito: Letra A
259
80. (SUGEP UFRPE/UFRPE/2022) A estrutura de dados “vetor” (array) é um arranjo unidimensional que pode acomodar múltiplos dados. Sobre essas estruturas de dados, assinale a alternativa incorreta. a) Os dados de um vetor são mapeados numa área contígua da memória. b) Os dados de um vetor são do mesmo tipo. c) Cada um dos dados de um vetor pode ser acessado informando-se o identificador do vetor e o inteiro que indica a ordem do dado na sequência. d) Os dados de um vetor são armazenados na memória ordenadamente, em modo crescente. e) Pode-se atribuir um dado a um elemento de qualquer posição do vetor, independentemente do que foi atribuído aos demais elementos.
Vamos analisar cada item. a) Correto. No armazenamento em memória, os vetores (ou arrays) são armazenados de forma contígua, ou seja, contínua, um ao lado do outro. b) Correto. Os vetores são estruturas homogêneas, portanto só aceita um mesmo tipo de dado. c) Correto. A forma de acessar elementos num vetor é feita através de um índice - sua posição relativa no conjunto de dados. d) Errado. Eles são armazenados de forma ordenada, o que quer dizer que as posições são crescentes, mas não seus valores. e) Correto. Como trabalhamos com índices, podemos acessar qualquer posição, diferentemente de estruturas como filas e pilhas. Sendo assim, a alternativa incorreta é a letra D. Gabarito: Letra D
260
Tendo como referência a linguagem de rogramação Java, julgue o item que se segue. A linha String nome = request.getParameter(“nome”); pode ser alterada para String nome = request.getAttribute(“nome”); sem perda de funcionalidade no código.
A afirmação de que a linha ```java String nome = request.getParameter("nome"); ``` pode ser alterada para ```java String nome = request.getAttribute("nome"); ``` sem perda de funcionalidade é **incorreta**. Diferenças: 1. **`request.getParameter("nome")`:** - Obtém valores de parâmetros da requisição HTTP, como os enviados por formulários. - Retorna uma `String` que representa o valor do parâmetro. 2. **`request.getAttribute("nome")`:** - Obtém atributos definidos no escopo da requisição, geralmente configurados no lado do servidor. - Não se refere a dados enviados pelo cliente, mas a informações passadas entre componentes da aplicação. Considerações: - **Contexto de Uso:** - Use `getParameter()` para dados de entrada do usuário. - Use `getAttribute()` para acessar dados definidos no servidor. - **Consequências:** - Substituir `getParameter()` por `getAttribute()` pode resultar em `null`, causando falhas se não houver um atributo correspondente definido. Conclusão: Não se deve trocar `request.getParameter()` por `request.getAttribute()` sem considerar o contexto, pois isso pode levar a resultados inesperados.
261
2. (CESPE - DP DF - 2022) No Java 8, o uso do método map() permite aplicar uma função a todos os elementos de um stream.
Stream map (Function mapper) retorna um stream que consiste nos resultados da aplicação da função dada aos elementos desse stream. Stream map (Mapeador de funções) é uma operação intermediária. As operações intermediárias são invocadas em uma instância do Stream e, depois que terminam seu processamento, fornecem uma instância do Stream como saída. Gabarito: Correto
262
3. (CESPE - DP DF– 2022) Quando a mensageria é utilizada com linguagem Java, as requisições são processadas exclusivamente de forma síncrona.
A afirmação de que, quando a mensageria é utilizada com linguagem Java, as requisições são processadas **exclusivamente** de forma síncrona é **incorreta**. Explicação: 1. **Mensageria**: Refere-se a sistemas que permitem a comunicação entre diferentes componentes de uma aplicação através do envio de mensagens. Isso é comum em arquiteturas distribuídas. 2. **Síncrono vs. Assíncrono**: - **Síncrono**: O remetente aguarda uma resposta do destinatário antes de continuar a execução. - **Assíncrono**: O remetente envia a mensagem e não aguarda uma resposta imediata, permitindo que continue sua execução. 3. **Mensageria em Java**: - Em sistemas de mensageria, como Java Message Service (JMS), é possível implementar tanto a comunicação síncrona quanto a assíncrona. - Com JMS, você pode usar `Queue` (fila) para comunicação assíncrona, onde o remetente não espera uma resposta imediata, e `Topic` para publicar e assinar mensagens, também permitindo o processamento assíncrono. Conclusão: Portanto, a mensageria em Java **não se limita** ao processamento síncrono; ela pode ser configurada para operar de maneira assíncrona, dependendo das necessidades da aplicação. Gabarito: Errado
263
4. (CESPE – SEED PR –2021) Java é uma linguagem construída a partir de um legado das linguagens C e C++. No entanto, ela apresenta características únicas que a diferem das demais, como: I. o applet, que é um tipo especial de programa Java projetado para ser transmitido pela Internet e executado por um navegador web compatível com Java. II. a saída de seu compilador não gera um código executável e, sim, um bytecode. III. o fato de um programa Java ser executado somente pela Java virtual machine (JVM). Assinale a opção correta. a) Apenas o item I está certo. b) Apenas o item II está certo. c) Apenas os itens I e III estão certos. d) Apenas os itens II e III estão certos. e) Todos os itens estão certos.
Pessoal, perfeita a assertiva I: applet é um tipo especial de programa Java projetado para ser transmitido pela Internet e executado por um navegador web compatível com Java. A assertiva II também está de acordo com o que vimos! O compilador transforma o arquivo .java em código de máquina e em um arquivo .class, também chamado bytecode. Por fim, a assertiva III também está correta, exatamente como dissemos anteriormente: O bytecode é um código intermediário, que é posteriormente interpretado e executado por uma Java Virtual Machine (JVM). O código fonte é entendido pelo sistema operacional, mas varia em cada um deles. Quando você usa o bytecode, através do .class você consegue rodar facilmente em qualquer sistema operacional, sem ter que usar o código-fonte. Gabarito: Letra E
264
5. (CESPE – PGDDF – 2021) Julgue o item subsecutivo, a respeito de lógica e de estrutura de programação. função avaliar( a, b ) início ma <-a; se (ma < b) então ma <- b; me <-a; se (me > b) então me <- b; resultado <- ( ma % me ); se (resultado = 0) então retorne me senão avaliar(me, ma) fim escreva avaliar (120,30); O resultado do pseudocódigo precedente será 120.
O item está **incorreto**. Vamos analisar o pseudocódigo apresentado para entender o que ele realmente faz. Análise do Pseudocódigo 1. **Inicialização**: - `ma` recebe o valor de `a` (120). - `me` recebe o valor de `b` (30). 2. **Primeiro `se`**: - `se (ma < b) então ma <- b;` - Isso não é verdade, pois 120 não é menor que 30, então `ma` permanece 120. 3. **Segundo `se`**: - `se (me > b) então me <- b;` - Isso não é verdade, pois 30 não é maior que 30, então `me` permanece 30. 4. **Cálculo do resultado**: - `resultado <- (ma % me);` - Aqui, `resultado` será `120 % 30`, que é `0`. 5. **Verificação do resultado**: - `se (resultado = 0) então retorne me` - Como `resultado` é `0`, a função retorna o valor de `me`, que é `30`. Conclusão Portanto, a chamada `escreva avaliar(120, 30);` resulta em **30**, não 120. O resultado final é que o pseudocódigo retorna 30, tornando a afirmação do item **falsa**. Gabarito: Errado
265
6. (CESPE – TJ-RJ – 2021) Considere o trecho de código a seguir, de um programa escrito na linguagem Java. Com relação aos trechos de código precedentes, é correto afirmar que a) o parâmetro this, na linha 7 da classe CarroEsportivo, é uma palavra reservada usada para mostrar que está sendo feita referência ao atributo privado marca da classe Carro. b) o comando this, na linha 7 da classe CarroEsportivo, é uma palavra reservada que faz referência ao atributo público marca da classe Carro. c) a instrução super, na linha 6 da classe CarroEsportivo, é usada para importar o pacote atributos privados da classe Carro, a fim de se tornarem públicos para a classe CarroEsportivo. d) a instrução super, na linha 6 da classe CarroEsportivo, permite à classe CarroEsportivo acessar os atributos privados da classe Carro. e) a instrução super, na linha 6 da classe CarroEsportivo, pode permitir à classe CarroEsportivo acessar atributos públicos da classe Carro.
Vejamos cada uma das alternativas a partir da análise do código apresentado. A letra A está errada, pois diz que o parâmetro this, na linha 7 da classe CarroEsportivo, é uma palavra reservada usada para mostrar que está sendo feita referência ao atributo privado marca da classe Carro, sendo que o parâmetro this faz referência ao atributo privado marca da classe CarroEsportivo. A letra B também está errada porque o comando this, na linha 7, faz referência a marca da classe CarroEsportivo. Já a alternativa C está errada pois não é possível importar o pacote atributos privados da classe Carro, a fim de se tornarem públicos dado que eles estão com o modificador private. A alternativa D também está errada, assim como a anterior, pois não é possível acessar atributos privados, mesmo que seja uma classe filha. Por fim, a alternativa e é o nosso gabarito! De fato, a instrução super chama membros da classe-pai. Ou seja, é uma variável de referência usada para referenciar o objeto da classe pai. Gabarito: Letra E
266
7. (CESPE – PGDF – 2021) Com relação a servidores de aplicação e seus serviços e a teoria de becapes, julgue o item a seguir. Apenas uma única instância do Tomcat pode existir em uma única JVM (Java virtual machine); no entanto, é possível ter múltiplas instâncias em uma mesma máquina virtual, desde que em processos Java separados, em execução em portas separadas.
A afirmação é **parcialmente correta**. Aqui está a análise: 1. **Uma única instância do Tomcat por JVM**: É verdade que em uma única JVM pode haver apenas uma instância do Tomcat em execução. Isso significa que todos os aplicativos implantados dentro dessa instância compartilham a mesma memória e recursos. 2. **Múltiplas instâncias em processos separados**: A parte que diz que é possível ter múltiplas instâncias em uma mesma máquina virtual, desde que em processos Java separados e em execução em portas separadas, é imprecisa. Na verdade, para ter várias instâncias do Tomcat, cada uma precisa ser executada em uma JVM separada (não apenas em processos separados). Cada instância do Tomcat deve ser iniciada em uma JVM diferente, geralmente em portas diferentes. Portanto, a afirmação original pode levar a confusões. Se fosse reformulada para esclarecer que cada instância deve estar em uma JVM separada, seria mais precisa. **Gabarito: Errado.**
267
8. (CESPE -– Ministério da Economia – 2020) Em Java 8, o método de limite de fluxo tem como objetivo eliminar elementos com base em um critério.
Na verdade, o método limit é utilizado para limitar a quantidade de elementos em um fluxo. Gabarito: Errado
268
9. (CESPE – Ministério da Economia – 2020) Uma expressão lambda é usada principalmente para definir a implementação procedural de uma interface associativa.
Uma expressão lambda é usada principalmente para definir a implementação procedural de uma interface funcional. Gabarito: Errado
269
10. (CESPE – Pref. Barra dos Coqueiros – 2020) A máquina virtual do Java (JVM) utiliza uma tecnologia especificamente para aumentar o desempenho da aplicação, identificando códigos que serão muito executados, normalmente dentro de loops. Essa tecnologia é chamada de a) hotspot. b) bytecode. c) compilação estática. d) JRE (Java Runtime Environment). e) JDK (Java Development Kit).
A opção correta é: **a) hotspot.** Justificativa: A **HotSpot** é a tecnologia utilizada pela JVM (Java Virtual Machine) para melhorar o desempenho da execução de aplicações Java. Ela identifica partes do código que são executadas com frequência, como loops, e aplica técnicas de otimização, como a compilação JIT (Just-In-Time), transformando o bytecode em código de máquina nativo, o que acelera a execução da aplicação. Gabarito: A
270
14. (CESPE – STM – 2018) Os membros de uma classe definidos como PUBLIC não podem ser acessados ou usados por nenhuma outra classe.
A afirmativa está **incorreta**. No contexto da linguagem Java, **membros** de uma classe (atributos e métodos) que são definidos como `public` podem ser **acessados e usados por qualquer outra classe**, tanto dentro do mesmo pacote quanto em pacotes diferentes. O modificador de acesso `public` garante que os membros da classe sejam visíveis em todas as outras classes, independentemente de onde elas estejam. Portanto, membros `public` podem ser acessados por outras classes, o que torna a afirmação errada. Gabarito: **Errado**.
271
15. (CESPE – CGM-Joao Pessoa– 2018) A JME oferece um ambiente robusto e flexível para aplicativos executados em dispositivos móveis e integrados cuja capacidade de memória, de vídeo e de processamento são limitados, tais como set-top boxes e reprodutores de discos blu-ray.
A afirmativa está **correta**. A **Java ME (Micro Edition)** é uma plataforma da tecnologia Java que oferece um ambiente robusto e flexível para o desenvolvimento de aplicativos voltados para dispositivos com recursos limitados, como **memória, vídeo e processamento**, incluindo dispositivos móveis, integrados, set-top boxes e reprodutores de discos Blu-ray. A Java ME foi projetada para rodar em dispositivos com capacidades mais restritas em comparação com os que utilizam Java SE (Standard Edition). Gabarito: **Certo**.
272
16. (CESPE – TER-TO– 2017) Na orientação a objetos, a alteração do comportamento dos métodos herdados das superclasses para um comportamento mais específico nas subclasses, de forma a se criar um novo método na classe filha que contém a mesma assinatura e o mesmo tipo de retorno, relaciona-se a a) sobrecarga. b) overloading. c) portabilidade. d) abstração. e) sobrescrita.
A opção correta é **e) sobrescrita**. A **sobrescrita de métodos (overriding)** ocorre quando uma subclasse redefine um método herdado de sua superclasse, mantendo a mesma assinatura (nome do método, parâmetros) e o mesmo tipo de retorno. Isso permite que a subclasse forneça um comportamento específico para o método que é diferente do comportamento definido na superclasse. Essa técnica é uma das formas de polimorfismo na orientação a objetos, onde o método da subclasse será invocado em vez do método da superclasse, quando a instância for de um objeto da subclasse. Gabarito: **e) sobrescrita**.
273
17. (CESPE – TCE-PA – 2016) O fato de as expressões lambda terem sido excluídas do Java 8 possibilitou que a linguagem Java ficasse mais flexível e que a implementação de seu código se tornasse mais precisa.
A afirmativa está incorreta. As expressões lambda foram, na verdade, introduzidas no Java 8, e sua inclusão tornou a linguagem mais flexível e permitiu escrever código de maneira mais concisa e funcional. A introdução de lambdas facilitou a manipulação de coleções e a implementação de interfaces funcionais, tornando o código mais expressivo. Gabarito: Errado
274
18. (CESPE – FUNPRESP-JUD – 2016) Para lidar com um conjunto de objetos em JSon, é necessário utilizar um array que permita realizar, em uma única operação, a carga de todos os objetos.
Não é necessário utilizar um array. Gabarito: Errado
275
19. (CESPE – TRE-PI – 2016) A linguagem Java foi, originalmente, desenvolvida para a) permitir a comunicação entre aparelhos domésticos e computadores. b) traduzir fórmulas matemáticas utilizando-se cartões perfurados. c) processar valores inteiros, em um ambiente negócios, em computadores de grande porte. d) trabalhar com inteligência artificial por meio de uma abordagem puramente lógica. e) demonstrar a viabilidade da implementação da álgebra relacional de dados.
A história de Java começou a ser escrita quando James Gosling, Patrick Naughton e Mike Sheridan se uniram a dois fundadores da Sun, Andy Bechtolsheim e Bill Joy, para pensar sobre a nova onda do mundo digital. Eles não demoraram muito para concluir que seria a convergência de computadores aos dispositivos e eletrodomésticos utilizados no dia a dia, tudo interconectado e remotamente controlado. Uma questão sobre “curiosidades”, temos como gabarito a letra A, já que, Java foi, originalmente, desenvolvida para permitir a comunicação entre computadores aos dispositivos e eletrodomésticos. Gabarito: Letra A
276
20. (CESPE – TER-GO – 2015) Em um grupo do tipo Array, podem-se armazenar dados de diferentes tipos.
Errado pessoal! Um Array é um objeto contêiner que contém um número fixo de valores de um único tipo. O comprimento de um array é estabelecido quando o array é criado. Após a criação, seu comprimento é fixo. Gabarito: Errado
277
21. (CESPE – TJDFT – 2015) Na tecnologia JSP (Java Server Pages), cada documento é convertido pelo contêiner JSP em um servlet, o que ajuda a separar a apresentação do conteúdo.
Perfeito, pessoal! O JSP é uma ferramenta baseada em Java para criação de páginas dinâmicas para uso na web. Com isso, cada parte do documento é convertida, através de um Contêiner, como um TomCat por exemplo, em um Servlet. Gabarito: Correto
278
22. (CESPE – SERPRO – 2013) A tecnologia JSE (Java Small Editon) utilizada pela plataforma iOS permite o desenvolvimento de aplicações para todos os seus dispositivos, como estações gráficas, iPad, iPod, entre outros.
Java Micro Edition (Java ME): trata-se do padrão aplicado a dispositivos compactos ou móveis, como smartphones, tablets, controles remotos, etc. Permite o desenvolvimento de softwares embarcados, i.e., aplicações que rodam em um dispositivo de propósito específico, desempenhando alguma tarefa útil. Em geral, possuem limitações de recursos como memória ou processamento. Conforme vimos em aula, a questão está cheia de erros! Primeiro, JSE é a sigla de Java Standard Edition. Segundo, a tecnologia proposta no item é o JME! Gabarito: Errado
279
23. (CESPE – MPOG – 2013) O JME foi criado para trabalhar com ambientes de programação multiprocessados em ambientes distribuídos.
Java Micro Edition (Java ME): trata-se do padrão aplicado a dispositivos compactos ou móveis, como smartphones, tablets, controles remotos, etc. Permite o desenvolvimento de softwares embarcados, i.e., aplicações que rodam em um dispositivo de propósito específico, desempenhando alguma tarefa útil. Em geral, possuem limitações de recursos como memória ou processamento. Java Enterprise Edition (Java EE): trata-se do padrão para desenvolvimento de sistemas corporativos, voltada para aplicações multicamadas, baseadas em componentes executados em servidores de aplicações – ele inclui o Java SE. Contém bibliotecas para acesso a base de dados, RPC, CORBA, entre outras. As aplicações podem ou não estar na internet. Conforme vimos em aula, Java ME possui diversas limitações de recursos. Na verdade, é o Java EE que é ideal para ambientes distribuídos. Gabarito: Errado
280
24. (CESPE – ANTT – 2013) JSE, JME, JEE e JCE são edições da tecnologia Java voltadas para o desenvolvimento de aplicações para desktop/servidores, dispositivos móveis, ambientes corporativos e ambientes em nuvem, respectivamente.
A afirmação está incorreta. As edições da tecnologia Java são voltadas para diferentes tipos de ambientes, mas a descrição na questão contém erros. Veja a correção para cada uma das edições mencionadas: - **JSE (Java Standard Edition)**: Voltada para o desenvolvimento de aplicações para desktop e servidores, provendo a base para a linguagem Java e suas bibliotecas fundamentais. - **JME (Java Micro Edition)**: Voltada para o desenvolvimento de aplicações em dispositivos móveis e embarcados, com recursos limitados. - **JEE (Java Enterprise Edition)**: Focada no desenvolvimento de aplicações empresariais de grande porte, geralmente distribuídas, em ambientes corporativos, como sistemas web e transacionais. - **JCE (Java Cryptography Extension)**: Não é uma edição voltada para ambientes em nuvem, mas sim uma extensão da plataforma Java que fornece bibliotecas para criptografia, assinaturas digitais e outros recursos de segurança. Portanto, a afirmação falha ao descrever corretamente o JCE e ao associar cada edição ao ambiente mencionado. Gabarito: Errado
281
25. (CESPE – TRT 10ª Região – 2013) O uso de System.out.println() possibilita a exibição de textos; para a exibição de valores de variáveis, é necessário utilizar showAttributes().
Errado! O System.out.println() pode perfeitamente ser utilizada para exibir variáveis. Gabarito: Errado
282
26. (CESPE – TRT 10ª Região – 2013) No código abaixo, caso a variável salário assuma o valor igual a 5000, o valor b da variável avaliação será atribuído corretamente. if (salario > 10000) { avaliacao=”a”; else avaliacao=”b”; }
Como o valor apresentado (5.000) é menor que 10.000, a assertiva está correta! Gabarito: Correto
283
27. (CESPE – TRT 10ª Região – 2013) A execução do código abaixo informará a classe do objeto que foi atribuído à variável de nome var4. String nome = var4.getname();
Errado, na verdade, getname retorna o nome do objeto. O código apresentado pelo item declara e inicializa uma variável nome, do tipo String. O valor que essa variável receberá é o que for retornado pelo método getname, invocado sobre o objeto var4. Apenas com as informações trazidas, é impossível saber qual a classe à qual o objeto var4 pertence. Gabarito: Errado
284
28. (CESPE – MPU – 2013) O tratamento de exceção em Java consiste no bloco try-catch-finally. O bloco finally sempre executa ao término do bloco try.
Aqui está um resumo sobre os blocos **try**, **catch** e **finally** em Java: - **try**: O bloco `try` contém o código que pode lançar exceções. É usado para "tentar" executar um conjunto de instruções que podem gerar erros em tempo de execução. - **catch**: O bloco `catch` é usado para capturar e tratar as exceções que foram lançadas no bloco `try`. Ele especifica o tipo de exceção que pode ser tratada e define o que deve ser feito se essa exceção ocorrer. - **finally**: O bloco `finally` é opcional e contém código que será executado **sempre**, independentemente de uma exceção ter sido lançada ou não. Ele é geralmente usado para liberar recursos, como fechar arquivos ou conexões de banco de dados. Exemplo: ```java try { // Código que pode lançar uma exceção } catch (ExceptionType e) { // Tratamento da exceção } finally { // Código que sempre será executado } ``` A afirmação está **parcialmente correta**, mas precisa de uma ressalva. O bloco `finally` em Java **geralmente** sempre é executado ao final do bloco `try`, **independentemente** de uma exceção ter sido lançada ou não, exceto em alguns casos específicos, como quando o programa é encerrado abruptamente (por exemplo, com um `System.exit()`), ou se ocorrer uma falha no ambiente da JVM. Portanto, a parte correta da afirmação é que o `finally` tende a ser sempre executado, mas há situações excepcionais em que ele pode não ser executado. Gabarito: Errado
285
29. (CESPE – MPU – 2013) Se a thread executando um código try ou catch for interrompida ou abortada, o bloco finally poderá não ser executado, apesar de a aplicação como um todo continuar.
Aqui está um resumo sobre os blocos **try**, **catch** e **finally** em Java: - **try**: O bloco `try` contém o código que pode lançar exceções. É usado para "tentar" executar um conjunto de instruções que podem gerar erros em tempo de execução. - **catch**: O bloco `catch` é usado para capturar e tratar as exceções que foram lançadas no bloco `try`. Ele especifica o tipo de exceção que pode ser tratada e define o que deve ser feito se essa exceção ocorrer. - **finally**: O bloco `finally` é opcional e contém código que será executado **sempre**, independentemente de uma exceção ter sido lançada ou não. Ele é geralmente usado para liberar recursos, como fechar arquivos ou conexões de banco de dados. Exemplo: ```java try { // Código que pode lançar uma exceção } catch (ExceptionType e) { // Tratamento da exceção } finally { // Código que sempre será executado } ``` A instrução try permite que você defina um bloco de código para ser testado quanto a erros enquanto está sendo executado. A instrução catch permite definir um bloco de código a ser executado, caso ocorra um erro no bloco try. Por fim, a instrução finally permite que você execute código, depois do try...catch, independentemente do resultado. Mas há casos em que o finally não é executado. Questão correta! Gabarito: Correto
286
30. (CESPE – TRE-MA – 2009) Para definição e manipulação de uma exceção em Java, devem constar no programa, obrigatoriamente, os termos: a) try e catch. b) try e finally. c) finally e catch. d) finally e retry. e) try e retry.
Pessoal, o correto é Try e catch. Gabarito: Letra A
287
31. (CESPE – SERPRO – 2008) A linguagem Java, orientada a objetos, tem como característica ser compilada em um código executado em máquina virtual.
A afirmação está **correta**. A linguagem Java é orientada a objetos e tem como uma de suas principais características a compilação do código-fonte em **bytecode**. Esse bytecode não é executado diretamente pelo sistema operacional ou processador, mas sim pela **Máquina Virtual Java (JVM)**. Isso permite que o mesmo código Java seja executado em diferentes plataformas, desde que haja uma JVM adequada, garantindo a portabilidade do código (o famoso conceito de "escreva uma vez, execute em qualquer lugar"). Gabarito: Correto
288
32. (CESPE – TRT - 5ª Região – 2008) A instrução import Java.awt.* indica que o programa irá utilizar componentes gráficos.
A afirmação está **correta**. A instrução `import java.awt.*;` em Java indica que o programa utilizará classes do pacote **AWT (Abstract Window Toolkit)**, que contém componentes gráficos e ferramentas para construção de interfaces gráficas de usuário (GUI), como janelas, botões, e outros elementos gráficos. Portanto, a instrução permite o uso de componentes gráficos, como o próprio texto afirma. Gabarito: Correto
289
33. (CESPE – TRT - 5ª Região – 2008) Em Java, os métodos public de uma classe são utilizados pelos clientes da classe para manipular dados armazenados em objetos dessa classe.
Pessoal, esses Modificadores de Acesso determinam quão acessíveis são esses elementos. Vamos vê-los agora em mais detalhes:: essa instrução indica que a classe, método ou atributo assim declaradas podem ser acessadas em qualquer lugar e a qualquer momento da execução do programa – é o modificador menos restritivo. Perfeito, são públicos para toda e qualquer classe. Gabarito: Correto
290
1. (FGV – CGU – 2022) Observe o trecho de código a seguir. 1 import java.io.*; 2 3 interface Segunda { public void segunda();} 4 interface Terca { public void terca();} 5 interface Quarta extends Segunda, Terca { public void quarta();} 6 7 class Quinta implements Segunda { 8 public void segunda(){System.out.println("Segunda");} 9 } 10 11 class Sexta extends Quinta implements Quarta { 12 public void segunda(){System.out.println("Segunda!");} 13 public void terca(){System.out.println("Segunda!!");} 14 public void quarta(){System.out.println("Segunda!!!");} 15 } 16 17 public class teste 18 { 19 public static void main( String[] args ) 20 { 21 Quinta dia = (Quinta) new Sexta(); 22 dia.segunda(); 23 } 24 } A saída produzida pela execução do código é: a) Erro de compilação na linha 5 b) Segunda c) Segunda! d) Segunda!! e) Segunda!!!
A resposta correta é a **letra C) Segunda!** Aqui está a explicação: 1. A classe `Sexta` estende `Quinta` e implementa a interface `Quarta`, que por sua vez estende as interfaces `Segunda` e `Terca`. Isso significa que `Sexta` deve implementar os métodos das três interfaces, o que ela faz. 2. Na linha 21, o código cria uma instância da classe `Sexta`, mas o objeto é referenciado como `Quinta`, ou seja, ele é tratado como um objeto da superclasse `Quinta` (polimorfismo). 3. Ao chamar `dia.segunda()` na linha 22, o método `segunda()` da **classe `Sexta`** é executado, porque em Java, mesmo que a referência seja de uma classe pai (`Quinta`), a versão do método da classe filha (`Sexta`) será chamada devido ao **polimorfismo**. 4. A versão de `segunda()` em `Sexta` imprime `"Segunda!"`. Portanto, a saída do programa será **"Segunda!"**. Gabarito: C
291
2. (FGV – TJDFT – 2022) Observe as classes abaixo descritas na linguagem de programação Java. public class DocumentoProcesso extends Object { private String docNumero; private int classificacao; public DocumentoProcesso (String docNumero, int classificacao){ if (classificacao < 1) throw new IllegalArgumentException ( "A classificação do documento deve ser no mínimo 1."); this.docNumero = docNumero; this.classificacao = classificacao; } public String getDocNumero() { return docNumero; } public int getClassificacao() { return classificacao; } public void setDocNumero(String docNumero) { this.docNumero = docNumero; } public void setClassificacao(int classificacao) { this.classificacao = classificacao; } public int promove() { return classificacao + 1; } } public class Oficio extends DocumentoProcesso { private int precedencia; public Oficio (String docNumero, int classificacao, int precedencia) {super(docNumero,classificacao); this.precedencia = precedencia; } public int getPrecedencia() { return precedencia; } public void setPrecedencia(int precedencia) { this.precedencia = precedencia; } @Override public int promove() { return precedencia + 1; } } Com base nos conceitos de orientação a objetos, é correto afirmar que: a) os atributos private de DocumentoProcesso são acessíveis por Oficio; b) a anotação @Override indica que o método promove() é abstrato e polimórfico; c) a classe Oficio representa uma herança múltipla das classes DocumentoProcesso e Object; d) a classe Oficio é composta pela classe DocumentoProcesso, permitindo que uma instância da classe Oficio faça referências a instâncias da classe DocumentoProcesso; e) os métodos getDocNumero() e setDocNumero() da classe DocumentoProcesso encapsulam o atributo docNumero e asseguram que os objetos da classe mantenham estados consistentes.
A questão trata de conceitos de orientação a objetos, como encapsulamento, herança e polimorfismo, no contexto da linguagem Java. Vamos analisar cada uma das opções: **a) os atributos private de DocumentoProcesso são acessíveis por Oficio;** Essa afirmação está incorreta. Em Java, os atributos marcados como `private` em uma classe não são diretamente acessíveis por suas subclasses. No caso, `Oficio` não pode acessar diretamente os atributos `private` de `DocumentoProcesso`. **b) a anotação @Override indica que o método promove() é abstrato e polimórfico;** Essa afirmação também está incorreta. A anotação `@Override` não indica que um método é abstrato. Ela indica que um método da classe filha está sobrescrevendo um método da classe pai. No caso, o método `promove()` na classe `Oficio` está sobrescrevendo o método `promove()` da classe `DocumentoProcesso`, mas nenhum deles é abstrato. **c) a classe Oficio representa uma herança múltipla das classes DocumentoProcesso e Object;** Essa afirmação está incorreta. Java não suporta herança múltipla de classes, ou seja, uma classe não pode herdar diretamente de mais de uma classe. A classe `Oficio` herda apenas de `DocumentoProcesso`, e `DocumentoProcesso` herda implicitamente de `Object`, pois todas as classes em Java herdam de `Object`. **d) a classe Oficio é composta pela classe DocumentoProcesso, permitindo que uma instância da classe Oficio faça referências a instâncias da classe DocumentoProcesso;** Essa afirmação está incorreta. A relação entre `Oficio` e `DocumentoProcesso` é de herança (a classe `Oficio` herda de `DocumentoProcesso`), e não de composição. Composição envolve uma classe conter instâncias de outra classe como atributos, o que não é o caso aqui. **e) os métodos getDocNumero() e setDocNumero() da classe DocumentoProcesso encapsulam o atributo docNumero e asseguram que os objetos da classe mantenham estados consistentes;** Essa afirmação está correta. Os métodos `getDocNumero()` e `setDocNumero()` fornecem acesso ao atributo `docNumero` da classe `DocumentoProcesso`, e esse mecanismo é uma forma de **encapsulamento**. O encapsulamento permite proteger os atributos e garantir que eles sejam acessados e modificados de maneira controlada, o que ajuda a manter a consistência do estado do objeto. Portanto, a resposta correta é **letra e**. Gabarito: E
292
3. (FGV – PGE-AM – 2022) Considere o trecho de programa Java abaixo. É correto afirmar que a) o código mostra um exemplo de sobrescrita de métodos, pois há vários métodos com o mesmo nome, porém, com parâmetros diferentes. b) ocorrerá um erro no último método reajuste, pois este não pode ser estático. c) uma chamada correta ao método reajuste, em condições ideais, é double sal = 1000.5; double c = Calcular.reajuste(sal); d) ocorrerá um erro na classe Calcular, pois não é permitido criar vários métodos com o mesmo nome, como ocorre com o método reajuste. e) uma chamada correta ao método reajuste, em condições ideais, é float sal = (float) 1000.5; double c = Calcular.reajuste(sal);
Vamos analisar o código da classe **Calcular** e as afirmações: ```java public class Calcular { public double reajuste(double salario, double percentual) { return salario + salario * percentual / 100; } public double reajuste(double salario) { return salario * 1.30; } public static double reajuste(float salario) { return salario * 0.20; } } ``` Agora, analisemos cada opção: **a) o código mostra um exemplo de sobrescrita de métodos, pois há vários métodos com o mesmo nome, porém, com parâmetros diferentes.** Essa afirmação está incorreta. O que ocorre aqui é **sobrecarga de métodos** (overloading), não sobrescrita (overriding). A sobrecarga ocorre quando há métodos com o mesmo nome, mas com assinaturas diferentes (diferentes tipos ou quantidades de parâmetros). Sobrescrita ocorre quando uma classe filha redefine um método da classe pai. **b) ocorrerá um erro no último método reajuste, pois este não pode ser estático.** Essa afirmação está incorreta. O método estático é permitido e não causará erro. Métodos estáticos podem coexistir com métodos não estáticos, desde que suas assinaturas sejam diferentes, o que é o caso aqui (o método estático recebe um `float`, enquanto os outros recebem `double`). **c) uma chamada correta ao método reajuste, em condições ideais, é:** ```java double sal = 1000.5; double c = Calcular.reajuste(sal); ``` Essa afirmação está incorreta. O método `reajuste` que recebe `double` e tem apenas um parâmetro não é estático. Portanto, para chamá-lo, seria necessário criar uma instância da classe `Calcular`, como: ```java Calcular calc = new Calcular(); double c = calc.reajuste(sal); ``` **d) ocorrerá um erro na classe Calcular, pois não é permitido criar vários métodos com o mesmo nome, como ocorre com o método reajuste.** Essa afirmação está incorreta. Em Java, é perfeitamente permitido ter vários métodos com o mesmo nome, desde que suas assinaturas sejam diferentes (sobrecarga de métodos). **e) uma chamada correta ao método reajuste, em condições ideais, é:** ```java float sal = (float) 1000.5; double c = Calcular.reajuste(sal); ``` Essa afirmação está **correta**. O método `reajuste` que recebe `float` é estático, então pode ser chamado diretamente pela classe `Calcular`, sem precisar de uma instância. Portanto, a resposta correta é **letra e**. Gabarito: E
293
4. (FGV – DPE-RJ – 2019) Considere as seguintes afirmativas sobre class constructor na linguagem Java. I. Deve receber o mesmo nome da classe a ele associada. II. Não deve ser especificado um tipo de retorno na sua declaração. III. É útil para a definição de valores iniciais para os atributos da classe. IV. É sempre declarado como public. É correto somente o que se afirma em: a) I e II; b) II e III; c) III e IV; d) I, II e III; e) I, III e IV.
Um **class constructor** em Java é um método especial usado para inicializar objetos de uma classe. Ele tem o mesmo nome da classe, não possui tipo de retorno (nem mesmo `void`) e é executado automaticamente quando um objeto é criado com o operador `new`. O construtor é utilizado principalmente para definir valores iniciais dos atributos da classe e garantir a correta criação do objeto. ------------------- Vamos analisar cada uma das afirmativas sobre **construtores (class constructor)** em Java: **I. Deve receber o mesmo nome da classe a ele associada.** Essa afirmativa é **correta**. Em Java, o construtor deve ter exatamente o mesmo nome da classe. Caso contrário, o compilador não o reconhecerá como um construtor. **II. Não deve ser especificado um tipo de retorno na sua declaração.** Essa afirmativa é **correta**. Construtores em Java não têm tipo de retorno, nem mesmo `void`. Se for especificado algum tipo de retorno, ele será tratado como um método regular, e não como um construtor. **III. É útil para a definição de valores iniciais para os atributos da classe.** Essa afirmativa é **correta**. O principal propósito de um construtor é inicializar os atributos de uma classe quando um objeto é criado. **IV. É sempre declarado como public.** Essa afirmativa é **incorreta**. Construtores podem ter qualquer modificador de acesso, como `public`, `protected`, `private`, ou mesmo o modificador padrão (sem especificar), dependendo do controle que se deseja sobre a criação de objetos. Construtores privados, por exemplo, são comuns em padrões de projeto como o **Singleton**. Agora, analisando as opções: - **a) I e II;** Correta, mas incompleta, já que a afirmativa III também é correta. - **b) II e III;** Correta, mas incompleta, já que a afirmativa I também é correta. - **c) III e IV;** Incorreta, pois a afirmativa IV está errada. - **d) I, II e III;** **Correta**, pois as três afirmativas são verdadeiras. - **e) I, III e IV;** Incorreta, pois a afirmativa IV está errada. Portanto, a resposta correta é **letra d**. Gabarito: D
294
6. (FGV – MPE – AL – 2018) No Java, a classe Error e Exception derivam da classe a) ClassNotFoundException. b) IOException. c) MainException. d) RuntimeException. e) Throwable.
Em Java, tanto a classe **`Error`** quanto a classe **`Exception`** derivam da classe **`Throwable`**. A classe `Throwable` é a superclasse de todas as classes que podem ser usadas com a palavra-chave **`throw`** ou capturadas por um **`try-catch`**. Ela tem duas subclasses principais: - **`Error`**: Representa erros graves no ambiente de execução que normalmente não podem ser recuperados, como `OutOfMemoryError`. - **`Exception`**: Representa exceções que podem ser tratadas durante a execução normal do programa. Portanto, a resposta correta é: **e) Throwable.**
295
7. (FGV – MPE-AL – 2018) Sobre as variáveis e os métodos declarados como private, em Java, analise as afirmativas a seguir. I. Ficam acessíveis somente aos membros da própria classe. II. Ficam acessíveis somente às classes definidas no mesmo package. III. Ficam acessíveis somente para suas classes derivadas. Está correto o que se afirma em a) I, apenas. b) II, apenas. c) III, apenas. d) I e II, apenas. e) II e III, apenas.
Em Java, variáveis e métodos declarados como **`private`**: - São acessíveis apenas pela própria classe. - Não podem ser acessados por classes no mesmo pacote ou por subclasses. Portanto, a única afirmativa correta é a I. **Resposta:** a) I, apenas. Gabarito: A
296
8. (FGV – BANESTES – 2018) Considere a compilação de um ou mais programas por meio da linha de comando, num ambiente Java. Nesse caso, o comando que está corretamente formado para esse fim é: a) compile teste.java –type java b) java teste.java c) javac *.java d) jvm Teste1.java teste2.java e) parse java teste.java
Para compilar um ou mais arquivos Java na linha de comando, o comando correto utiliza o compilador Java, que é o **`javac`**. - O comando **`javac`** é usado para compilar arquivos `.java`, gerando arquivos `.class` que podem ser executados pela JVM. - No caso de compilar todos os arquivos `.java` no diretório, você pode usar o comando **`javac *.java`**. Agora, vamos analisar as opções: - **a) compile teste.java –type java** Incorreto. Não existe o comando `compile` em Java. - **b) java teste.java** Incorreto. O comando `java` é usado para **executar** programas já compilados (arquivos `.class`), não para compilá-los. - **c) javac *.java** **Correto**. Esse comando compila todos os arquivos `.java` no diretório atual. - **d) jvm Teste1.java teste2.java** Incorreto. Não existe o comando `jvm` para compilar ou executar programas Java. - **e) parse java teste.java** Incorreto. O comando `parse` não é um comando Java. Resposta correta: **c) javac *.java** Gabarito: C
297
9. (FGV – ALE-RO – 2018) Analise a definição de um array em Java. int[ ][ ] multi = new int[ 5 ][ 10 ]; Assinale o código que exibe corretamente um elemento de cada linha desse array. a) for (int i = 0; i < 5; i++) { System.out.println(multi[i][0]); }; b) for (int i = 0; i < 10; i++) { System.out.println(multi[i,1]); }; c) for (int i = 0; i <= 5; i++) { System.out.println(multi[i,0]); }; d) for (int i = 0; i <= multi.length; i++) { System.out.println(multi[1,i]); }; e) for (int i = 1; i < multi[0].length; i++) { System.out.println(multi[i,1]); };
Vamos analisar o código e as opções fornecidas para exibir corretamente um elemento de cada linha do array bidimensional **`multi`** definido como: ```java int[][] multi = new int[5][10]; ``` Esse array possui 5 linhas e 10 colunas. Para exibir um elemento de cada linha, o índice da coluna deve ser um valor válido (de 0 a 9), e o índice da linha deve ser de 0 a 4. Agora, vamos analisar as opções: **a) `for (int i = 0; i < 5; i++) { System.out.println(multi[i][0]); };`** - **Correta.** Este código percorre as 5 linhas do array e imprime o primeiro elemento de cada linha (`multi[i][0]`). **b) `for (int i = 0; i < 10; i++) { System.out.println(multi[i,1]); };`** - **Incorreta.** A sintaxe de acesso ao array está errada. Deve ser `multi[i][1]` em vez de `multi[i,1]`. **c) `for (int i = 0; i <= 5; i++) { System.out.println(multi[i,0]); };`** - **Incorreta.** O índice `i` vai de 0 a 5, mas o último índice válido para as linhas é 4. Isso causará um **ArrayIndexOutOfBoundsException**. **d) `for (int i = 0; i <= multi.length; i++) { System.out.println(multi[1,i]); };`** - **Incorreta.** O índice `i` também vai de 0 a 5, o que causará uma exceção, além de estar usando a sintaxe errada (`multi[1,i]` deve ser `multi[1][i]`). **e) `for (int i = 1; i < multi[0].length; i++) { System.out.println(multi[i,1]); };`** - **Incorreta.** A sintaxe de acesso ao array está errada (`multi[i,1]` deve ser `multi[i][1]`) e `i` começa em 1, o que não acessará a primeira linha. Resumo da Resposta: A única opção correta que exibe um elemento de cada linha do array **`multi`** é: **a) `for (int i = 0; i < 5; i++) { System.out.println(multi[i][0]); };`** Gabarito: A
298
10. (FGV – ALE-RO – 2018) No contexto da linguagem Java, assinale o modificador (modifier) que se refere ao nível de acesso. a) abstract b) final c) protected d) static e) volatile
No contexto da linguagem Java, o modificador que se refere ao nível de acesso é **`protected`**. Esse modificador permite que membros (atributos e métodos) de uma classe sejam acessados por: - A própria classe. - Subclasses (mesmo que estejam em pacotes diferentes). - Outras classes no mesmo pacote. Vamos revisar brevemente as opções: - **a) abstract**: Indica que uma classe ou método é abstrato, ou seja, não pode ser instanciado e deve ser implementado em subclasses. - **b) final**: Indica que uma classe não pode ser estendida, um método não pode ser sobrescrito, ou uma variável não pode ser alterada após a inicialização. - **c) protected**: **Correto**. Refere-se ao nível de acesso dos membros da classe. - **d) static**: Indica que um membro pertence à classe em si, e não a instâncias específicas da classe. - **e) volatile**: É usado para indicar que uma variável pode ser alterada de forma inesperada, principalmente em ambientes multithreading, mas não se refere ao nível de acesso. Resposta correta: **c) protected.**
299
11. (FGV – ALE-RO – 2018) Sobre construtores (constructors), no contexto da linguagem Java, analise as afirmativas a seguir. I. Os construtores devem ser declarados como private. II. Uma interface não pode ter um construtor. III. Uma classe abstrata pode ter um construtor. Está correto o que se afirma em a) I, somente. b) II, somente. c) III, somente. d) I e II, somente. e) II e III, somente.
Vamos analisar cada uma das afirmativas sobre construtores em Java: **I. Os construtores devem ser declarados como private.** - **Incorreta.** Construtores podem ter qualquer modificador de acesso (como `public`, `protected`, `private`, ou padrão), dependendo do controle que se deseja sobre a criação de objetos. Um construtor `private` é usado, por exemplo, em padrões de projeto como o Singleton, mas não é uma obrigação. **II. Uma interface não pode ter um construtor.** - **Correta.** Interfaces não podem ter construtores, pois não podem ser instanciadas diretamente. Uma interface pode declarar métodos, mas não pode criar objetos. **III. Uma classe abstrata pode ter um construtor.** - **Correta.** Classes abstratas podem ter construtores, que podem ser usados por subclasses para inicializar os atributos herdados. Conclusão: - A afirmativa II e a afirmativa III estão corretas. Resposta correta: **e) II e III, somente.** Gabarito: E
300
12. (FGV – MPE AL – 2018) O package “java.util.regex” do Java permite a manipulação de expressões regulares. As três classes mais importantes desse pacote são denominadas: a) RegExp, Parser e Lexicon. b) RegExPattern, RegExVerifier e RegExCompiler. c) Pattern, Matcher e PatternSyntaxException. d) Collector, Retriever e SyntaxParser. e) Parser, Inspector e Evaluator.
O pacote **`java.util.regex`** em Java oferece classes para manipulação de expressões regulares, e as três classes mais importantes desse pacote são: - **`Pattern`**: Representa uma expressão regular compilada. - **`Matcher`**: Realiza a correspondência de padrões em uma sequência de caracteres. - **`PatternSyntaxException`**: Indica um erro de sintaxe em uma expressão regular. Portanto, a resposta correta é: **c) Pattern, Matcher e PatternSyntaxException.** Gabarito: C
301
13. (FGV – MPE – AL – 2018) Servidores de aplicação baseados em Java Platform Enterprise Edition possuem vários tipos de API. Assinale a opção que indica a API utilizada para fornecer acesso ao servidor de nomes e diretórios. a) JNDI. b) RMI. c) JMS. d) JTS. e) JDBC.
A API utilizada para fornecer acesso ao servidor de nomes e diretórios em servidores de aplicação baseados em Java Platform Enterprise Edition é a **JNDI** (Java Naming and Directory Interface). Aqui está um breve resumo das opções: - **a) JNDI**: **Correta.** Fornece uma interface para localizar e acessar recursos e serviços em um servidor de nomes e diretórios. - **b) RMI**: (Remote Method Invocation) permite que um objeto Java invoque métodos em objetos em outra máquina. - **c) JMS**: (Java Message Service) fornece uma interface para comunicação assíncrona entre componentes de aplicativos. - **d) JTS**: (Java Transaction Service) fornece suporte para transações distribuídas. - **e) JDBC**: (Java Database Connectivity) permite a conexão e a execução de consultas em bancos de dados relacionais. Resposta correta: **a) JNDI.** Gabarito: A
302
14. (FGV – IBGE – 2017) Os servidores de aplicação fornecem a infraestrutura básica necessária para o desenvolvimento e a distribuição de aplicações. Em relação aos servidores de aplicação da plataforma Java EE, analise as afirmativas a seguir: I. GlassFish e Apache Geronimo são servidores de aplicação open source compatível com a especificação J2EE. II. O Apache Tomcat não dispõe de um container EJB. III. JBoss é programado em Java, portanto, pode ser usado em qualquer sistema operacional que suporte essa linguagem de programação. Está correto o que se afirma em: a) somente I; b) somente II; c) somente III; d) somente I e II; e) I, II e III.
Vamos analisar as afirmativas sobre os servidores de aplicação da plataforma Java EE: **I. GlassFish e Apache Geronimo são servidores de aplicação open source compatível com a especificação J2EE.** - **Correta.** Tanto o GlassFish quanto o Apache Geronimo são servidores de aplicação de código aberto que implementam a especificação J2EE (Java 2 Platform, Enterprise Edition). **II. O Apache Tomcat não dispõe de um container EJB.** - **Correta.** O Apache Tomcat é um servidor de servlet que implementa as especificações de servlets e JSP, mas não suporta EJB (Enterprise JavaBeans) nativamente. **III. JBoss é programado em Java, portanto, pode ser usado em qualquer sistema operacional que suporte essa linguagem de programação.** - **Correta.** O JBoss (atualmente conhecido como WildFly) é um servidor de aplicação que é escrito em Java e, portanto, pode ser executado em qualquer sistema operacional que tenha uma JVM (Java Virtual Machine) instalada. Conclusão: Todas as afirmativas estão corretas. Resposta correta: **e) I, II e III.** Gabarito: E
303
15. (FGV – IBGE – 2017) Em Java, certo método da classe A deve poder ser invocado independentemente da criação prévia de uma instância de A. O modificador obrigatório na declaração desse método é: a) abstract; b) static; c) public; d) protected; e) final.
Para que um método possa ser invocado independentemente da criação de uma instância da classe, ele deve ser declarado como **`static`**. Métodos estáticos pertencem à classe em si, e não a instâncias específicas da classe. Assim, eles podem ser chamados sem que uma instância da classe seja criada. Vamos revisar as opções: - **a) abstract**: Indica que o método não tem uma implementação na classe, mas deve ser implementado em subclasses. Não é relevante para a invocação sem instância. - **b) static**: **Correta.** Permite que o método seja chamado sem uma instância da classe. - **c) public**: Indica que o método pode ser acessado de qualquer lugar, mas não garante que ele possa ser chamado sem uma instância. - **d) protected**: Permite que o método seja acessado apenas por subclasses e classes no mesmo pacote, mas não permite a chamada sem instância. - **e) final**: Indica que o método não pode ser sobrescrito em subclasses, mas não está relacionado com a criação de instâncias. Resposta correta: **b) static.** Gabarito: B
304
1. (FCC – PGE-AM - 2022) Considere o trecho de programa Java abaixo. A assinatura correta do método que deve ser colocada na lacuna I é a) public int[] verificar(int vet[]) b) private int[] verificar(int vet[]) c) public static int verificar(int vet[]) d) public int verificar(int vet) e) public static int[] verificar(int vet[])
A forma correta para a assinatura do método é conforme a sintaxe: [Palavras-Chave] TipoRetorno NomeMetodo ([Lista de Parâmetros]). Assim, temos um método public, daí eliminamos a letra B. É definido como static porque os métodos static tem um relacionamento com uma classe como um todo, enquanto os métodos que não são static são associados a uma instância de classe específica (objeto) e podem manipular as variáveis de instância do objeto. Portanto eliminamos as alternativas a, b e d. O retorno é um vetor de inteiros, portanto int[], daí eliminamos as alternativas c e d. Ficamos então com a alternativa E que é o nosso gabarito: public static int[] verificar(int vet[]) Gabarito: Letra E
305
2. (FCC – PGE-AM – 2022) Considere st um objeto do tipo PreparedStatement e conn um objeto do tipo Connection, ambos em condições ideais para a execução do método salvar, de uma classe Java. Nas condições apresentadas, para que o método salvar grave as informações do cliente no banco de dados aberto, a lacuna I deve ser corretamente preenchida com a instrução a) INSERT INTO cliente VALUES(cpf,nome,endereco,bairro,cidade,telefone,renda) b) INSERT INTO cliente VALUES(?,?,?,?,?,?,?) c) INSERT INTO cliente (nome,cpf,endereco,bairro,cidade,telefone, renda) VALUES(?,?,?,?,?,?,?) d) INSERT INTO cliente VALUES([cpf],[nome],[endereço],[bairro],[cidade],[telefone],[renda]) e) INSERT TO cliente (cpf,nome,endereco,bairro,cidade,telefone, renda) VALUES(?,?,?,?,?,?,?)
Um PreparedStatement é um objeto que representa uma instrução SQL pré-compilada. Uma instrução SQL é pré-compilada e armazenada em um objeto PreparedStatement. Esse objeto pode ser usado para executar com eficiência essa instrução várias vezes. Às vezes, é mais conveniente usar um objeto PreparedStatement para enviar instruções SQL ao banco de dados. Esse tipo especial de instrução é derivado da classe mais geral, Statement, que você já conhece. Se você deseja executar um objeto Statement muitas vezes, geralmente reduz o tempo de execução para usar um objeto PreparedStatement. A principal característica de um objeto PreparedStatement é que, diferentemente de um objeto Statement, ele recebe uma instrução SQL quando é criado. A vantagem disso é que, na maioria dos casos, essa instrução SQL é enviada imediatamente ao DBMS, onde é compilada. Como resultado, o objeto PreparedStatement contém não apenas uma instrução SQL, mas uma instrução SQL que foi pré-compilada. Isso significa que quando o PreparedStatement é executado, o DBMS pode apenas executar a instrução SQL PreparedStatement sem ter que compilá-lo primeiro. A ideia é preparar as querys do SQL para armazenamento no banco de dados. O tutorial da Oracle diz que nós devemos usar a interrogação para inserir na tabela cliente (?,?,?,?,?,?,?). Portanto o gabarito é a letra B. Gabarito: Letra B
306
3. (FCC – PGE-AM – 2022) No método doPost de uma servlet Java, deseja-se receber um parâmetro de um campo de nome renda contido em um formulário HTML, converter o valor recebido deste campo para número real e armazená-lo em uma variável chamada renda. A instrução correta para realizar esta tarefa é a) long renda = Long.parseLong(request.getParameter("renda")); b) double renda = parseDouble(request.getParameter("renda")); c) double renda = request.getParameter("renda").toDouble(); d) double renda = Double.parseDouble(request.getParameter("renda")); e) number renda = parseNumber(request.getParameter("renda"));
A opção correta para receber e converter um parâmetro "renda" de um formulário HTML em um número real no método `doPost` de uma servlet Java é: **d) `double renda = Double.parseDouble(request.getParameter("renda"));`** Análise das opções: - **a)** Incorreta: Converte para `long`, não para número real. - **b)** Incorreta: Falta o prefixo da classe `Double`. - **c)** Incorreta: `toDouble()` não é um método válido em Java. - **d)** Correta: Converte a string recebida em um número real (double). - **e)** Incorreta: `number` não é um tipo em Java; `parseNumber` não é um método padrão. **Conclusão:** A opção **d** é a única correta. Gabarito: D
307
4. (FCC – AFAP – 2019) Considere o método Java abaixo. Caso o driver JDBC não esteja disponível na aplicação e não exista o banco de dados trf3, as exceções que deverão ser tratadas nas lacunas I e II são, correta e respectivamente, a) NullPointerExceptionException e DatabaseException. b) DriverNotFoundException e MySQLException. c) JDBCDriverException e DatabaseException. d) ClassNotFoundException e SQLException. e) JDBCDriverException e DatabaseSQLException.
Pessoal, caso o driver JDBC não esteja disponível na aplicação, irá acusar um erro chamado ClassNotFoundException. Os comandos não irão conseguir encontrar a classe informada, pois não há o driver disponível. Por fim, como não existe o BD, o JDBC informa que é um erro chamado SQLException, ele acusa algum erro no banco de dados, como a questão nos informou que ele não existe não precisamos ficar procurando esse erro na aplicação. Gabarito: Letra D
308
5. (FCC – AFAP – 2019) Para criar array um Analista de Informática digitou os comandos abaixo no método main de uma classe Java em condições ideais. I. int[] a = {1,3}; II. int b[] = new int[2]; b[0]=1; b[1]=3; III. int[] c = new int[2]; c.add(1); c.add(2); IV. int[][] d = {{1,3},{4,5}}; V. int e[][] = {{1,3},{4,5}}; Ao tentar compilar e executar a classe, foi exibida a mensagem “Exception in thread "main" java.lang.RuntimeException: Uncompilable source code”. Essa mensagem foi exibida porque o item a) IV está incorreto, pois não especifica o tamanho da array. b) V está incorreto, pois deve haver apenas um par de colchetes após o nome da array. c) I está incorreto, pois não é permitido declarar um array e já incluir os valores nele. d) II está incorreto, pois os colchetes devem ficar antes do nome da variável b. e) III está incorreto, pois não existe o método add neste contexto.
Pessoal, a resposta correta é a letra E. Não existe o método add para array no Java, mas sim no ArrayList. Ademais, a letra a erra porque não é necessário especificar o tamanho. O erro da letra B está em dizer que deve haver apenas um par de colchetes. E a letra C está errada pois é possível sim declarar e incluir valores no array. Por fim, os colchetes podem ficar antes ou depois da variável. Gabarito: Letra E
309
6. (FCC – AFAP – 2019) Considere a classe Java abaixo, que usa um método de ordenação por inserção para rearranjar os valores em um vetor em ordem crescente. public class Organiza{ public static void main(String[] args) { int k[] = {88, 44, 42, 7, 72, 5}; int n = k.length; ordena(n, k); } static void ordena(int n, int v[]) { for (int j = 1; j < n; ++j) { int x = v[j]; int i; for (..I..){ v[i + 1] = v[i]; } ..II.. ; } } } Para que a ordenação por inserção ocorra corretamente, as lacunas I e II devem ser corretamente preenchidas com a) i=j-1; i >=0 && v[i]>x; − −i e v[i-1]=x b) i=j-1; i >=0; i++ e v[i+1]=x c) i=j-1; i >=0 && v[i]>x; − −i e v[i+1]=x d) i=j-1; i >=0 && v[i]>x; ++i e v[i]=x e) i=j-1; i >=0 || v[i]>x; − −i e v[i+1]=x
Para implementar corretamente o algoritmo de ordenação por inserção no método `ordena`, precisamos preencher as lacunas **I** e **II**. Vamos analisar o funcionamento do algoritmo e as opções dadas. Algoritmo de Ordenação por Inserção No algoritmo de ordenação por inserção: 1. O loop externo percorre o vetor a partir do segundo elemento (`j = 1`). 2. A variável `x` armazena o valor a ser inserido na posição correta. 3. O loop interno deve deslocar os elementos maiores que `x` para a direita, para criar espaço para `x`. 4. Após o deslocamento, `x` deve ser colocado na posição correta. Lacuna I Para a lacuna **I**, precisamos inicializar `i` para o índice do elemento anterior ao que estamos tentando inserir (`j - 1`). O loop interno deve continuar enquanto `i` for maior ou igual a zero e enquanto o valor em `v[i]` for maior que `x`. Lacuna II Na lacuna **II**, precisamos inserir `x` na posição correta, que será `v[i + 1]`, após o deslocamento dos elementos. Análise das opções Agora, vamos analisar cada uma das opções: - **a)** `i=j-1; i >=0 && v[i]>x; − −i e v[i-1]=x` - **Incorreta.** O deslocamento está errado, e a inserção não está na posição correta. - **b)** `i=j-1; i >=0; i++ e v[i+1]=x` - **Incorreta.** O loop não é definido corretamente, e o deslocamento não funcionará. - **c)** `i=j-1; i >=0 && v[i]>x; − −i e v[i+1]=x` - **Correta.** O loop interno é configurado corretamente, e `x` é inserido na posição `v[i+1]`. - **d)** `i=j-1; i >=0 && v[i]>x; ++i e v[i]=x` - **Incorreta.** A inserção de `x` não está na posição correta. - **e)** `i=j-1; i >=0 || v[i]>x; − −i e v[i+1]=x` - **Incorreta.** O uso de `||` é inadequado aqui e causaria comportamento inesperado. Conclusão As lacunas **I** e **II** devem ser preenchidas como segue: - **Lacuna I:** `i=j-1; i >=0 && v[i]>x; --i` - **Lacuna II:** `v[i + 1] = x` Portanto, a resposta correta é: **c) i=j-1; i >=0 && v[i]>x; − −i e v[i+1]=x** Gabarito: C
310
7. (FCC - TRF 3ª Região /2019) No interior do método main da classe principal de uma aplicação Java SE um método foi chamado usando as instruções abaixo. double[] dados; double [] d={1, 20, 7, 8}; dados = Aluno.cadastraDados(d); O método cadastraDados na classe Aluno deve ter a declaração a) public static double[] cadastraDados(double[] d) b) public static double[] cadastraDados(double d) c) public double[] cadastraDados(double[] d) d) public final double[] cadastraDados(double d[]) e) public static double cadastraDados(double[] d)
Para responder a questão devemos ter em mente que é necessário fazer o método cadastraDados passar algo por parâmetro. Para isso, devemos utilizar a alternativa A: public static double[] cadastraDados(double[] d) Gabarito: Letra A
311
8. (FCC – SANASA – 2019) Na orientação a objetos uma classe abstrata é construída para ser um modelo para classes derivadas e na sua construção há algumas restrições. Assim, considere a classe abstrata abaixo, criada na Linguagem Java. public abstract class Calcula { private static final double VALOR=10; public abstract double soma(double n1, double n2); public abstract void exibeResultado( ); protected abstract double soma(double n1, double n2, double n3); private abstract int multiplica(double n1, int n2); private double multiplica(double n1, double n2){return n1*n2;} public Calcula( ) { } } A instrução que NÃO é permitida nessa classe é a) private abstract int multiplica(double n1, int n2); b) public abstract void exibeResultado( ); c) public Calcula( ) { } d) private static final double VALOR=10; e) private double multiplica(double n1, double n2){return n1*n2;}
Pessoal, analisando as alternativas, podemos observar na letra A a criação de um método "private abstract". Porém, em Java, não é permitido declarar um método como "private abstract"! daí já sabemos que a alternativa errada (gabarito da questão) é a letra A. Já, a letra B está correta, veja é a declaração de um método abstrato sem implementação. As demais alternativas também estão plenamente corretas. Gabarito: Letra A.
312
9. (FCC – TJ TRF3 – 2019) Em uma aplicação Java, um vetor n foi criado por meio da instrução double n=new double[3]; e alimentado com 3 valores reais. Para exibir o conteúdo da segunda posição (índice) deste vetor utiliza-se a instrução a) JOptionPane.showMessageDialog(null, n[2]); b) System.out.println(n[1]); c) JOptionPane.ShowMessageDialog(n[2]); d) System.Out.Println(null, n[1]); e) JOptionPane.showWindows(0, n[2]);
O comando para imprimir a segunda posição de um vetor de três posições deverá pegar a posição n[1] já que, em Java, o vetor inicia na posição 0. Portanto ficamos apenas com as alternativas b e d. A letra d apresenta um erro porque System.out.Println não possui o parâmetro null como é apresentado na questão. Portanto nosso gabarito é a letra B. Gabarito: Letra B
313
10. (FCC – AFAP – 2019) Considere a classe Java a seguir em condições ideais. import java.sql.*; public class ClienteDados { public int conectar(){ Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection ("jdbc:mysql://localhost:3306/banco", "root", ""); Statement st = con.createStatement(); return 1; } } No método conectar podem ser lançadas duas exceções que o Analista de Informática deseja que sejam tratadas não no interior do método, mas sim por quem o chamar. Para que isso seja permitido, deve-se inserir o comando a) try na linha abaixo da declaração do método e catch (DataBaseException, SQLQueryException) abaixo do comando return 1. b) throws ClassNotFoundException, SQLException na linha de declaração do método. c) Exception ClassNotFoundException, SQLException na linha de declaração do método. d) try na linha abaixo da declaração do método e catch (ClassNotFoundException, SQLException) abaixo do comando return 1. e) throws DataBaseException, SQLQueryException na linha de declaração do método.
Para permitir que exceções sejam tratadas fora do método `conectar` na classe `ClienteDados`, o método deve declarar as exceções que pode lançar. No caso apresentado, as exceções relevantes são `ClassNotFoundException` e `SQLException`. Análise das opções a) **`try` na linha abaixo da declaração do método e `catch (DataBaseException, SQLQueryException)` abaixo do comando `return 1`.** - **Incorreta**: Usar `try` e `catch` dentro do método não atende ao requisito de lançar as exceções para serem tratadas fora dele. b) **`throws ClassNotFoundException, SQLException` na linha de declaração do método.** - **Correta**: Essa é a forma correta de indicar que o método pode lançar essas exceções, permitindo que quem chamar o método trate essas exceções. c) **`Exception ClassNotFoundException, SQLException` na linha de declaração do método.** - **Incorreta**: Essa sintaxe é inválida em Java. Não se pode declarar exceções desta forma. d) **`try` na linha abaixo da declaração do método e `catch (ClassNotFoundException, SQLException)` abaixo do comando `return 1`.** - **Incorreta**: Novamente, usar `try` e `catch` dentro do método não atende ao requisito de lançar as exceções. e) **`throws DataBaseException, SQLQueryException` na linha de declaração do método.** - **Incorreta**: `DataBaseException` e `SQLQueryException` não são exceções padrão da biblioteca Java. As exceções corretas são `ClassNotFoundException` e `SQLException`. Conclusão A opção correta para permitir que as exceções sejam tratadas fora do método `conectar` é: **b) `throws ClassNotFoundException, SQLException` na linha de declaração do método.** Gabarito: B
314
11. (FCC / TRF3 – 2019) Uma classe Colaborador de uma aplicação Java tem o método abaixo. public void setNome(String nome) { this.nome = nome; } Para instanciar um objeto dessa classe e armazenar o nome "Pedro" no atributo nome utiliza-se a) Colaborador.setNome("Pedro"); b) Colaborador c -> new Colaborador(); c->Nome="Pedro"; c) Colaborador c = new Colaborador(c.setNome("Pedro")); d) Colaborador c = new Colaborador(); c.setNome("Pedro"); e) Colaborador c = new Colaborador().setNome("Pedro");
A alternativa correta para instanciar um objeto da classe `Colaborador` e armazenar o nome "Pedro" no atributo `nome` é: **d)** `Colaborador c = new Colaborador(); c.setNome("Pedro");` Resumo das alternativas: - **a)** Incorreto — Método de instância não pode ser chamado diretamente na classe. - **b)** Incorreto — Sintaxe errada e acesso direto a atributo privado. - **c)** Incorreto — `setNome` não retorna um objeto. - **e)** Incorreto — `setNome` não retorna a instância. A única alternativa correta é a **d**. Gabarito: D
315
12. (FCC / SABESP – 2018) As interfaces são usadas nas aplicações Java quando se deseja permitir que diversas classes implementem determinados métodos, mesmo que de formas diferentes. Em uma interface Java a) os métodos não podem ter os modificadores protected ou private. b) não pode haver assinaturas de métodos cujo tipo de retorno seja void. c) pode haver múltiplos construtores, desde que recebam parâmetros diferentes. d) não pode haver dois ou mais métodos com o mesmo nome, mesmo que recebam parâmetros diferentes. e) todo método deverá ser implementado por uma das subclasses da aplicação pelo menos uma vez
A alternativa correta sobre as interfaces em Java é: **a)** os métodos não podem ter os modificadores protected ou private. Justificativas para as outras alternativas: - **b)** Incorreto — Em uma interface, pode haver métodos com retorno do tipo `void`. - **c)** Incorreto — Interfaces não têm construtores, pois não podem ser instanciadas. - **d)** Incorreto — Em uma interface, pode haver métodos com o mesmo nome, desde que tenham parâmetros diferentes (sobrecarga). - **e)** Incorreto — Um método em uma interface deve ser implementado pelas classes que a implementam, mas não necessariamente por todas as subclasses; se uma subclasse não implementar o método, ela deve ser declarada como abstrata. Portanto, a alternativa **a** é a única correta. Gabarito: A
316
13. (FCC – TRF 3ª Região – 2014) Herança e interfaces são conceitos da orientação a objetos que possibilitam a obtenção de polimorfismo. Em Java, uma interface pode a) herdar de mais de uma interface. b) ser instanciada diretamente por meio da instrução new. c) possuir apenas assinaturas de métodos públicos e protegidos. d) possuir métodos abstratos e estáticos. e) conter declarações de constantes e de variáveis não inicializadas.
A alternativa correta sobre o que uma interface pode fazer em Java é: **a)** herdar de mais de uma interface. Justificativas para as outras alternativas: - **b)** Incorreto — Interfaces não podem ser instanciadas diretamente. Elas precisam ser implementadas por classes. - **c)** Incorreto — Uma interface pode possuir apenas assinaturas de métodos públicos, pois todos os métodos em uma interface são implicitamente públicos (não podem ser protegidos ou privados). - **d)** Incorreto — Interfaces podem ter apenas métodos abstratos (a partir do Java 8, métodos default e estáticos são permitidos, mas a afirmação não é completamente correta). - **e)** Incorreto — Interfaces podem conter declarações de constantes (variáveis `static final`), mas não podem ter variáveis não inicializadas. Portanto, a alternativa **a** é a única correta. Gabarito: A
317
14. (FCC – TRE-RN – 2011) Em relação ao Java Standard Edition, é INCORRETO afirmar: a) Possui gerenciamento de memória embutido, por meio do coletor de lixo. b) Ambiente indicado para o desenvolvimento de aplicativos para dispositivos móveis ou portáteis. c) Permite o desenvolvimento de aplicações desktop de linha de comando e interfaces gráficas Swing. d) Portabilidade dos programas compilados para diversos sistemas operacionais, sem necessidade de recompilação. e) Usa conceitos tais como orientação a objetos e multithreading.
A alternativa **INCORRETA** sobre o Java Standard Edition (Java SE) é: **b)** Ambiente indicado para o desenvolvimento de aplicativos para dispositivos móveis ou portáteis. Justificativas para as outras alternativas: - **a)** Correto — Java SE possui gerenciamento de memória embutido por meio do coletor de lixo. - **c)** Correto — Permite o desenvolvimento de aplicações desktop, tanto de linha de comando quanto com interfaces gráficas usando Swing. - **d)** Correto — A portabilidade dos programas compilados é uma das principais características do Java, permitindo que sejam executados em diversos sistemas operacionais sem necessidade de recompilação. - **e)** Correto — Java utiliza conceitos de orientação a objetos e multithreading. Assim, a alternativa **b** é a única que não se aplica ao Java SE, pois ele não é especificamente voltado para o desenvolvimento de aplicativos móveis, que é mais associado ao Java Micro Edition (Java ME). Gabarito: B
318
15. (FCC – TRT 22ª Região – 2010) A plataforma Java disponibiliza um interpretador que traduz, em tempo de execução, o bytecode para instruções nativas do processador, permitindo, dessa forma, que uma mesma aplicação seja executada em qualquer plataforma computacional que possua essa implementação. Trata-se de: a) Java Virtual Machine. b) Java API. c) JavaBeans. d) J2SE. e) JavaFX.
O bytecode é um código intermediário, que é posteriormente interpretado e executado por uma Java Virtual Machine (JVM). Gabarito: Letra A
319
16. (FCC – Sergipe Gás– 2010) É tida como uma das principais linguagens de programação orientada a objeto; tem como característica a compilação para um bytecode e execução por uma máquina virtual. Trata-se da linguagem: a) Algol. b) Delphi. c) C++. d) Java. e) PHP.
Java é também uma linguagem portável e multiplataforma! O Compilador é capaz de gerar um código intermediário (bytecode), que permite que o mesmo programa possa ser executado em qualquer máquina ou sistema operacional que possua uma JVM. Ademais, busca que todos os aspectos da linguagem sejam independentes de plataforma (Ex: ela especifica o tamanho e comportamento de cada tipo de dado). Conforme vimos em aula, trata-se da linguagem Java. Gabarito: Letra D
320
17. (FCC – TCE-SP – 2010) Os aplicativos Java “rodam” em diferentes ambientes. A tradução dos códigos Java (bytecode), para instruções específicas de cada sistema e dispositivo, é uma função do programa: a) Java Community Process (JCP). b) Java Virtual Module (JVM). c) Java Virtual Machine (JVM). d) Java Comunication Process (JCP). e) Java Enterprise Machine (JEM).
O bytecode é um código intermediário, que é posteriormente interpretado e executado por uma Java Virtual Machine (JVM). Gabarito: Letra C
321
1. (UFMA – UFMA – 2019) Duas características importantes e relacionadas entre si, presentes em Java por ser uma linguagem orientada a objetos, são a herança e o polimorfismo. Considere as afirmativas I e II a seguir e depois marque a alternativa correta. I. Herança múltipla é um recurso existente em Java para permitir que uma classe possa herdar atributos e métodos de mais de uma classe. II. Polimorfismo em Java é a capacidade de duas ou mais classes derivadas de uma mesma superclasse possuírem a mesma assinatura de um método, porém com comportamento diferente. a) Apenas a afirmativa II está correta. b) Ambas as afirmativas I e II estão corretas. c) Ambas as afirmativas I e II estão erradas. d) Apenas a afirmativa I está correta. e) A correção ou não das afirmativas I e II depende de qual versão de Java se está levando em consideração.
Pessoal, é necessário saber os conceitos de herança e polimorfismo. Primeiramente, devemos ter em mente que não existe Herança múltipla em Java. Daí a assertiva I está incorreta. Vejamos o que diz a assertiva II: Polimorfismo em Java é a capacidade de duas ou mais classes derivadas de uma mesma superclasse possuírem a mesma assinatura de um método, porém com comportamento diferente. Está perfeita a definição. Gabarito: Letra A
322
2. (FUNDEP – Prefeitura de Lagoa Santa– 2019) Qual é a forma correta de se criar uma classe que não poderá ser instanciada, mas ainda poderá ser reutilizada? a) public abstract class NomeDaClasse b public abstract NomeDaClasse c) public class NomeDaClasse d) public class private NomeDaClasse
Pessoal, para criar uma classe que não poderá ser instanciada, mas ainda poderá ser reutilizada devemos utilizar public abstract class NomeDaClasse. Porque a classe abstrata é sempre uma superclasse que não possui instâncias. Gabarito: Letra A
323
3. (UFRN – UFRN – 2019) Na programação orientada a objetos, o polimorfismo é a habilidade de objetos de classes diferentes responderem à mesma mensagem de maneiras diferentes. Um tipo de polimorfismo é a) polimorfismo de sobrecarga. b) polimorfismo de instanciação. c) polimorfismo de abstração. d) polimorfismo de classificação.
A resposta correta é a **letra a) polimorfismo de sobrecarga**. O polimorfismo na programação orientada a objetos pode ser classificado em dois tipos principais: **polimorfismo de sobrecarga** (ou ad-hoc) e **polimorfismo de subtipo** (ou de inclusão). No caso da sobrecarga, o polimorfismo ocorre quando diferentes funções ou métodos com o mesmo nome podem ser chamados com diferentes tipos ou números de parâmetros, respondendo de maneira distinta conforme a assinatura. Gabarito: Letra A
324
4. (IADES – Hemocentro – DF– 2017) Considerando que Luta e Jogo são classes, e que Esporte, Individual e Coletivo são interfaces, com relação aos conceitos de classes e interfaces da linguagem Java, assinale a alternativa correta. a) interface Futebol implements Esporte, Jogo{}. b) interface Futebol extends Esporte,Coletivo{} c) interface Futebol implements Esporte{} d) class Judo extends Esporte, Individual{} e) interface Karate extends Luta{}
A alternativa correta é a **letra b) interface Futebol extends Esporte, Coletivo{}**. No Java, uma interface pode **estender** (extends) outras interfaces, mas não pode implementar (implements) outra interface. A palavra-chave **extends** é utilizada para herdar de interfaces, enquanto **implements** é usada por classes que implementam interfaces. Além disso, uma classe não pode estender (extends) uma interface, como apresentado na letra "d". Gabarito: Letra B
325
5. (ESAF – Receita Federal – 2012) Em programação Java, o comando while: a) executa um bloco exclusivamente de comandos de atribuição. b) executa um bloco de comandos enquanto sua condição for verdadeira. c) executa um bloco de comandos até que sua condição seja verdadeira. d) equivale ao comando what-if. e) é idêntico ao comando do while.
(a) Na verdade, podem ter outros comandos – não é só atribuição; (b) Perfeito, enquanto for verdadeira, continua a iteração; (c) Não, enquanto ela for verdadeira; (d) Não, esse comando não existe; (e) Não, esse comando entra no bloco e só depois avalia a condição. Gabarito: Letra B
326
1. (CESGRANRIO – Banco do Brasil – 2023) Um programador foi instruído pelo seu gerente a implementar, em Java, uma classe MemoriaCalculoVenda que implementasse a interface MemoriaCalculo, já criada pela organização e que representa as exigências da organização para classes que implementam memórias de cálculo. Nesse cenário, com que fragmento de código o programador deve começar, de forma correta, a implementação da classe? a) class MemoriaCalculoVenda extends MemoriaCalculo b) class MemoriaCalculoVenda implements MemoriaCalculo c) class MemoriaCalculoVenda imports MemoriaCalculo d) class MemoriaCalculoVenda inherits MemoriaCalculo e) class MemoriaCalculoVenda uses MemoriaCalculo
A resposta correta é a **letra b) class MemoriaCalculoVenda implements MemoriaCalculo**. No Java, uma classe usa a palavra-chave **implements** para declarar que está implementando uma interface. Nesse caso, como a interface **MemoriaCalculo** já foi criada pela organização e a classe **MemoriaCalculoVenda** deve implementar essa interface, a sintaxe correta é utilizar **implements** para indicar essa relação entre a classe e a interface. A palavra **extends** seria usada apenas no caso de herança entre classes, não entre uma classe e uma interface. Gabarito: B
327
23. (CESGRANRIO - BASA - 2018) A linguagem de programação Java suporta a) passagem de parâmetros de tipos primitivos por referência b) sobrecarga de operadores c) herança múltipla d) polimorfismo e) ponteiros
A resposta correta é a **letra d) polimorfismo**. A linguagem Java **suporta polimorfismo**, que é a capacidade de uma classe utilizar métodos de uma superclasse ou interface de maneira que comportamentos diferentes possam ser implementados, dependendo do tipo real do objeto. Analisando as outras alternativas: - **a) passagem de parâmetros de tipos primitivos por referência**: Java utiliza **passagem por valor** para tipos primitivos, não por referência. - **b) sobrecarga de operadores**: Java **não suporta sobrecarga de operadores** (diferente de linguagens como C++). - **c) herança múltipla**: Java **não permite herança múltipla** de classes, mas permite herança múltipla através de **interfaces**. - **e) ponteiros**: Java **não utiliza ponteiros** diretamente, ao contrário de linguagens como C/C++. Portanto, a característica correta que Java suporta é **polimorfismo**. Gabarito: D
328
1. (CEBRASPE / CAU BR- 2024) Com respeito à linguagem de programação PHP, julgue o item a seguir. Para se declarar variáveis em PHP, é utilizado cifrão ($) seguido pelo nome da variável; os nomes das variáveis são case-sensitive.
O item está **correto**. Em PHP, as variáveis são declaradas com o símbolo **$** seguido pelo nome da variável, como em `$minhaVariavel`. Além disso, os nomes das variáveis são **case-sensitive**, ou seja, `$variavel` e `$Variavel` são tratados como variáveis diferentes. Gabarito: Correto
329
2. (CEBRASPE / CAU BR- 2024) Com respeito à linguagem de programação PHP, julgue o item a seguir. A função echo é capaz de mostrar somente uma string, enquanto a função print pode mostrar uma ou várias strings.
O item está **errado**. No PHP, tanto a função **echo** quanto a função **print** podem ser usadas para exibir uma ou mais strings. A diferença é que **echo** pode exibir múltiplas strings separadas por vírgulas (por exemplo, `echo "string1", "string2";`), enquanto **print** só pode exibir uma única string por vez. Além disso, **echo** não retorna valor, enquanto **print** retorna o valor `1`, permitindo que seja usado em expressões. Gabarito: Errado
330
3. (CEBRASPE / TJ TST- 2024) Com base no código precedente, desenvolvido em PHP, assinale a opção que corresponde ao resultado a ser apresentado ao final da execução desse código. a) 4 b) 8 c) 3 4 5 d) 6 8 10 e) 9 16 25
A resposta correta é a **letra e) 9 16 25**. Analisemos o código passo a passo: 1. **Função anônima**: A variável `$x` é atribuída a uma função anônima que recebe um parâmetro `$a` e retorna o quadrado de `$a` (`$a ** 2`). 2. **Criação do array**: A função `range(3, 5)` cria um array contendo os valores `[3, 4, 5]`. 3. **Aplicação de `array_map`**: A função `array_map` aplica a função `$x` a cada elemento do array `[3, 4, 5]`, resultando em `[9, 16, 25]` (ou seja, o quadrado de cada elemento). 4. **Impressão dos resultados**: A função `implode(' ', $y)` junta os elementos do array resultante (`[9, 16, 25]`) em uma string separada por espaços, que é então impressa. Portanto, o resultado final impresso será **"9 16 25"**. Gabarito: E
331
4. (CEBRASPE / FINEP- 2024) No desenvolvimento de um sítio dinâmico em PHP com páginas diferentes, cada uma com seu próprio conteúdo exclusivo, para manter o código organizado e reutilizável, deve-se separar o código de cada página em arquivos individuais. Nesse contexto, assinale a opção em que é indicada a função que deve ser usada para incluir o conteúdo de um arquivo externo em um script PHP de modo a inserir o código de cada página. a) readExternal( ) b) import( ) c) readFile( ) d) include( ) e) loadFile( )
A resposta correta é a **letra d) include( )**. Em PHP, a função **`include()`** é usada para incluir o conteúdo de um arquivo externo em um script. Se o arquivo especificado não puder ser encontrado, um aviso será gerado, mas a execução do script continuará. Além disso, existe a função **`require()`**, que é semelhante, mas gera um erro fatal e interrompe a execução do script se o arquivo não for encontrado. As outras opções listadas (**`readExternal()`, `import()`, `readFile()`, `loadFile()`**) não são funções válidas em PHP para incluir arquivos. Gabarito: D
332
5. (CEBRASPE / MPE RO- 2023) connect_error) { die("erro " . $conn->connect_error); } $sql = "INSERT INTO tabela_nomes (nome) VALUES ('$nomeCompleto')"; if ($conn->select($sql) === TRUE) { echo "Nome gravado com sucesso."; } else { echo "Erro ao gravar o nome: " . $conn-> error; } $conn->quit(); ?> Tendo como base o código fonte precedente, assinale a opção correta. a) A função select($sql) executa uma consulta ao banco de dados. b) Ao receber o nomeCompleto, a execução do código não é capaz de inserir os dados informados no banco de dados. c) A função quit() permite encerrar a conexão com o banco de dados. d) A string de conexão com o banco de dados conecta a um banco de dados PostgreSQL. e) $conn representa os parâmetros de conexão com o banco de dados.
Pessoal, vamos analisar cada item. a) Incorreta. A função select($sql) não é uma função padrão do objeto $conn no PHP. Para executar uma consulta SQL, normalmente se usa $conn->query($sql) no caso de MySQLi. b) Incorreta. O código é capaz de inserir os dados informados no banco de dados. No entanto, não é recomendável concatenar diretamente variáveis em uma consulta SQL devido a preocupações de segurança (como injeção de SQL). É preferível usar prepared statements. c) Incorreta. A função correta para encerrar a conexão com o banco de dados no MySQLi é $conn->close(), não quit(). d) Incorreta. A string de conexão indica um banco de dados MySQL, não PostgreSQL. e) Correta. $conn representa o objeto de conexão com o banco de dados, não os parâmetros de conexão. Gabarito: Letra E
333
6. (CEBRASPE / PGE RJ- 2022) Julgue o item que se segue, relacionado a desenvolvimento de sistemas. Em PHP 7.0, o acesso indireto de variáveis e métodos é avaliado estritamente da esquerda para a direita.
**Resumo sobre o acesso indireto de variáveis e métodos em PHP:** - Em PHP, o acesso indireto a variáveis e métodos é feito usando o operador **`$`** seguido do nome da variável ou método. - A avaliação ocorre da **esquerda para a direita**. - Isso significa que, ao acessar variáveis e métodos de objetos ou arrays, PHP processa a expressão começando pela parte mais à esquerda e movendo-se para a direita. **Conclusão:** A afirmação de que, em PHP 7.0, o acesso indireto de variáveis e métodos é avaliado estritamente da esquerda para a direita é **correta**. Gabarito: Correto
334
7. (CEBRASPE / DP DF- 2022) Acerca do framework Zend, de JPA, do desenvolvimento para dispositivos móveis e de PHP, julgue o item seguinte. Para implementar callbacks em PHP, podem ser utilizadas as funções variáveis que são suportadas pelo PHP.
O item está **correto**. Em PHP, **callbacks** podem ser implementados utilizando **funções variáveis**, que são suportadas pela linguagem. Isso significa que você pode passar o nome de uma função como uma variável, e essa função pode ser chamada posteriormente em outro contexto. Exemplo de uso de callback com funções variáveis: ```php function minhaFuncao($callback) { // Chama a função passada como callback $callback(); } function funcaoCallback() { echo "Esta é uma função de callback!"; } // Passa o nome da função como string minhaFuncao('funcaoCallback'); ``` Neste exemplo, a função `funcaoCallback` é passada como um callback para `minhaFuncao`, que a invoca. Essa capacidade de usar funções variáveis para callbacks é uma característica útil do PHP, permitindo implementar comportamentos flexíveis e reutilizáveis. Portanto, a afirmação de que "para implementar callbacks em PHP, podem ser utilizadas as funções variáveis que são suportadas pelo PHP" é **correta**. Gabarito: Correto
335
8. (CEBRASPE / MCom- 2022) Com base no trecho de código precedente, desenvolvido em PHP 7, julgue o item seguinte. Os operadores ?? farão retornar o primeiro valor definido entre $_GET['user'], _POST['user'] e 'Maria', ou seja, caso os dois primeiros operandos não existam ou sejam nulos, $nome receberá o valor Maria.
O item está **correto**. No trecho de código apresentado, o operador de coalescência nula (`??`) é utilizado para atribuir um valor à variável `$nome`. O comportamento do operador é o seguinte: - Ele verifica cada operando da esquerda para a direita. - Retorna o primeiro valor que não seja `null` ou que esteja definido. Portanto, o código: ```php $nome = $_GET['user'] ?? $_POST['user'] ?? 'Maria'; ``` significa que: - Se `$_GET['user']` estiver definido e não for `null`, `$nome` receberá esse valor. - Se `$_GET['user']` não estiver definido ou for `null`, o PHP verificará `$_POST['user']`. Se `$_POST['user']` estiver definido e não for `null`, `$nome` receberá esse valor. - Se ambos `$_GET['user']` e `$_POST['user']` não estiverem definidos ou forem `null`, `$nome` receberá o valor `'Maria'`. Assim, a afirmação de que o operador `??` fará retornar o primeiro valor definido entre `$_GET['user']`, `$_POST['user']` e `'Maria'` está **correta**. Se os dois primeiros operandos não existirem ou forem nulos, `$nome` realmente receberá o valor `'Maria'`. Gabarito: Correto
336
9. (CEBRASPE / TJ RJ- 2021) Assinale a opção que apresenta a variável superglobal do PHP que contém um array associativo com variáveis passadas para o script atual via método do ambiente. a) $_ENV b) $_VARIABLE c) $_REQUEST d) $_SCRIPT e) $_SESSION
A variável superglobal do PHP que contém um array associativo com variáveis passadas para o script atual via método do ambiente é a $_ENV. Esta variável contém informações do ambiente do sistema, como variáveis de ambiente definidas no servidor. As outras opções não representam essa funcionalidade específica: a) Correto - $_ENV representa as variáveis de ambiente do sistema. b) Incorreto - $_VARIABLE não é uma variável superglobal do PHP. c) Incorreto - $_REQUEST contém variáveis passadas para o script via métodos GET, POST e COOKIE. d) Incorreto - $_SCRIPT não é uma variável superglobal do PHP. e) Incorreto - $_SESSION contém variáveis de sessão do usuário. Portanto, a opção correta é a letra a) $_ENV. Gabarito: Letra A
337
10. (CEBRASPE / PGDF- 2021) No que se refere a linguagens de programação, julgue o item subsequente. PHP é uma linguagem de script projetada para desenvolvimento web, mas que também pode ser usada para programação de uso geral.
A afirmativa está **correta**. O **PHP** (Hypertext Preprocessor) é uma linguagem de script amplamente utilizada, especialmente no desenvolvimento web. Originalmente, o PHP foi criado para gerar páginas dinâmicas na web, mas ele evoluiu ao longo do tempo e também pode ser utilizado para **programação de uso geral**. Embora seja mais conhecido por sua aplicação no lado do servidor (backend) para criar sites dinâmicos, PHP pode ser usado em outros contextos, como: - Scripts de automação. - Desenvolvimento de aplicações de linha de comando (CLI). - Aplicações de desktop, embora essa não seja sua principal aplicação. Portanto, é correto afirmar que o PHP foi projetado para desenvolvimento web, mas também pode ser usado para programação de uso geral. Gabarito: Correto
338
1. (CEBRASPE / MPE AP- 2021) No desenvolvimento de um sistema em PHP, o desenvolvedor precisa validar se o endereço bob@mpap.mp.br é ou não um email válido. A partir dessa situação hipotética, assinale a opção em que o código apresentado é o correto para o desenvolvedor realizar a referida validação, tendo como referência que a variável a ser testada é $email. a) b) c) d) e)
A opção correta para validar se o endereço de email é válido em PHP, usando a variável `$email`, é a **letra a**. A função **`filter_var`** com o filtro **`FILTER_VALIDATE_EMAIL`** é a maneira correta de validar endereços de email em PHP. Essa função verifica se a string fornecida segue o formato de um email válido. O código da alternativa correta é: ```php ``` Explicação: - **`filter_var`**: Função usada para filtrar e validar dados. - **`FILTER_VALIDATE_EMAIL`**: Um filtro específico para validar endereços de email. As demais opções contêm erros, como o uso inadequado de expressões regulares ou funções que não se aplicam à validação de emails. Gabarito: A
339
12. (CEBRASPE / ProTI - ME- 2020) Considerando as linguagens de programação Java (versão 8 ou superior) e PHP (versão 7 ou superior), julgue o próximo item. O resultado obtido com a execução do seguinte código PHP é Paulo. c = $c; } } $d = new Teste("Pedro e Maria"); $e = $d; $e->c = "Paulo"; echo $d->c; ?>
O código PHP da questão cria uma classe chamada Teste com uma propriedade pública $c e um método construtor __construct() para inicializar essa propriedade. O código cria uma instância da classe Teste chamada $d com o valor "Pedro e Maria" atribuído à propriedade $c. Em seguida, a variável $e é atribuída à instância $d. Portanto, $e e $d referenciam o mesmo objeto. Quando $e->c é atualizado para "Paulo", isso afeta diretamente o objeto ao qual $d se refere, pois $e e $d referenciam o mesmo objeto. Portanto, ao imprimir $d->c, o resultado será "Paulo". Portanto, o item está correto. Gabarito: Correto
340
13. (CEBRASPE / TJ PA- 2020) Uma página PHP está sendo executada em um servidor Apache e necessita buscar informações em um banco de dados, como, por exemplo, o MySQL Server. Para isso, ao se habilitar o PHP no servidor, foi configurado o módulo de suporte do PHP para buscar dados no MySQL Server. Nessa situação hipotética, caso se deseje verificar se esse módulo está instalado, será correto o uso da função a) php_db(). b) phpcheck(). c) phpinfo(). d) php_mysql(). e) phpmodules().
Para verificar se o módulo de suporte do PHP para MySQL está instalado e habilitado no servidor, pode-se utilizar a função phpinfo(). Essa função exibe informações detalhadas sobre a configuração do PHP, incluindo os módulos carregados. Ao chamar phpinfo(), será exibida uma página com todas as informações relevantes sobre a instalação do PHP, incluindo os módulos disponíveis e habilitados, como o módulo do MySQL. Portanto, ao visualizar a saída de phpinfo(), é possível verificar se o módulo do MySQL está presente e disponível para uso no PHP. As demais opções estão incorretas: a) php_db() - Não é uma função padrão do PHP. b) phpcheck() - Não é uma função padrão do PHP. d) php_mysql() - Não é uma função padrão do PHP. e) phpmodules() - Não é uma função padrão do PHP. Gabarito: Letra C
341
14. (CEBRASPE / ProTI - ME- 2020) Considerando as linguagens de programação Java (versão 8 ou superior) e PHP (versão 7 ou superior), julgue o próximo item. O resultado obtido com a execução do seguinte código PHP é 24.
O código PHP fornecido define uma função anônima que recebe um argumento $x e retorna um array contendo quatro elementos: $x, $x+2, $x+4 e $x*6. Em seguida, a função é imediatamente invocada com o argumento 4 ((4)), o que resulta na criação do array [4, 6, 8, 24]. Finalmente, é acessado o elemento de índice 3 desse array, que corresponde a 24. Portanto, ao ser executado, o código exibirá 24 como resultado. Portanto, o item está correto. Gabarito: Correto
342
15. (CEBRASPE / TJ AM- 2019) No que se refere à linguagem PHP, julgue o item subsecutivo. A função current ( ) retorna o valor armazenado onde o ponteiro atual aponta.
A função current() em PHP retorna o valor do elemento atual em um array. Ela não move o ponteiro interno do array. Portanto, current() retorna o valor armazenado onde o ponteiro atual aponta, mas não altera a posição do ponteiro. Essa função é frequentemente usada em conjunto com outras funções de iteração de arrays, como foreach(), para obter o valor do elemento atual durante o loop. Portanto, o item está correto. Gabarito: Correto
343
16. (CEBRASPE / TJ AM- 2019) No que se refere à linguagem PHP, julgue o item subsecutivo. A linguagem PHP suporta o uso de operadores lógicos capazes de diversas comparações lógicas. O operador && considera que uma comparação será verdadeira se um ou ambos os argumentos forem verdadeiros.
O gabarito está incorreto. O operador lógico &&, também conhecido como "E lógico" ou "AND lógico", considera que uma comparação será verdadeira somente se ambos os argumentos forem verdadeiros. Se pelo menos um dos argumentos for falso, o resultado da expressão será falso. Gabarito: Errado
344
17. (CEBRASPE / TJ AM- 2019) No que se refere à linguagem PHP, julgue o item subsecutivo. Após a configuração de um servidor Apache com módulo PHP, uma forma de validar o seu funcionamento é criar uma página HTML e inserir a função phpinfo(), que mostra informações a respeito da configuração do PHP no servidor Apache.
Após configurar um servidor Apache com o módulo PHP, uma maneira comum de validar se o PHP está funcionando corretamente é criar uma página HTML e inserir a função phpinfo(). Quando essa página é acessada pelo navegador, ela exibe informações detalhadas sobre a configuração do PHP no servidor Apache, incluindo versão do PHP, configurações do servidor, módulos carregados, configurações do ambiente, entre outras informações úteis. Portanto, ao acessar essa página, o usuário pode verificar se o PHP está corretamente configurado e funcionando como esperado. Assim, o item está correto. Gabarito: Correto
345
18. (CEBRASPE / EBSERH- 2018) Julgue o item que se segue a respeito das características da linguagem PHP e de compiladores. Na linguagem PHP, o comando explode() permite descarregar os buffers de saída de qualquer backend que o PHP esteja usando, como, por exemplo, um CGI ou um servidor web.
O comando explode() em PHP é usado para dividir uma string em um array de strings, com base em um delimitador especificado. Ele não está relacionado à descarga de buffers de saída de qualquer backend que o PHP esteja usando. Para descarregar os buffers de saída em PHP, geralmente são utilizadas funções como flush() e ob_flush(), que são responsáveis por enviar qualquer dado armazenado em buffers de saída para o cliente (navegador) imediatamente. Portanto, o item está incorreto. O comando explode() não está relacionado à descarga de buffers de saída. Gabarito: Errado
346
19. (CEBRASPE / EBSERH- 2018) Acerca de programação orientada a objetos, Java e PHP, julgue o item a seguir. Em PHP, a diretiva display_errors, incluída no arquivo php.ini, determinará a realização de registros de log dos erros que ocorrerem na execução do código e sua gravação em um arquivo definido pela diretiva error_log.
A afirmativa está **incorreta**. A diretiva **`display_errors`** no arquivo **`php.ini`** controla se os erros serão exibidos diretamente na saída padrão, como em uma página da web ou no console. Ela não está relacionada ao registro de logs, mas apenas à **exibição** de erros durante a execução do código PHP. Por outro lado, o registro de erros em um arquivo de log é controlado por outra diretiva: **`log_errors`**. Quando **`log_errors`** está ativada, os erros serão registrados em um arquivo especificado pela diretiva **`error_log`**. Aqui está o papel de cada uma dessas diretivas: - **`display_errors`**: Controla se os erros serão exibidos na saída padrão (como no navegador). O valor padrão é **`Off`** em ambientes de produção para evitar a exposição de informações sensíveis. - **`log_errors`**: Controla se os erros serão registrados em um arquivo de log. - **`error_log`**: Define o caminho do arquivo onde os erros serão registrados, se **`log_errors`** estiver ativada. Portanto, a afirmativa confunde a funcionalidade das diretivas e está **incorreta**. A exibição de erros e o registro em logs são controlados por diretivas diferentes. Gabarito: Errado
347
20. (CEBRASPE / STM- 2018) Em relação aos fundamentos de PHP 5, julgue o item a seguir. O comando INCLUDE interromperá a execução do script assim que ocorrer um erro, enquanto o comando REQUIRE continuará a executar o código após o erro.
A afirmativa está **incorreta**. Na linguagem PHP, a diferença entre **`include`** e **`require`** está no comportamento em caso de erro ao tentar incluir um arquivo: - **`include`**: Se o arquivo especificado não puder ser encontrado ou não puder ser incluído, o PHP emitirá um **aviso** (warning), mas a execução do script continuará. Isso significa que o código após o comando **`include`** será executado. - **`require`**: Se o arquivo especificado não puder ser encontrado ou não puder ser incluído, o PHP emitirá um **erro fatal** (fatal error), e a execução do script será interrompida. Ou seja, o código após o comando **`require`** não será executado. Portanto, a correta descrição é que o **`require`** interrompe a execução do script em caso de erro, enquanto o **`include`** permite que a execução continue. Assim, a afirmativa apresentada está **incorreta**. Gabarito: Errado
348
21. (CEBRASPE / STM- 2018) Em relação aos fundamentos de PHP 5, julgue o item a seguir. Em PHP, o código deve ser escrito entre as tags .
Pessoal, na verdade, o código PHP é delimitado pelas tags , e não pelas tags . As tags são usadas para código JavaScript e não para código PHP. Portanto, a afirmação correta seria: "Em PHP, o código deve ser escrito entre as tags ." Assim, o gabarito está errado. Gabarito: Errado
349
22. (CEBRASPE / STM- 2018) Em relação aos fundamentos de PHP 5, julgue o item a seguir. O comando a seguir concatena corretamente caracteres em PHP. $final = "abc" . "efg";
No código fornecido, o comando . é o operador de concatenação em PHP. Ele é usado para concatenar duas ou mais strings em uma única string. No caso apresentado, a expressão "abc" . "efg" concatena as strings "abc" e "efg", resultando na string "abcefg". O resultado da concatenação é armazenado na variável $final. Portanto, o comando $final = "abc" . "efg"; concatena corretamente caracteres em PHP. Gabarito: Correto
350
23. (CEBRASPE / STM- 2018) Julgue o item subsecutivo, a respeito das camadas de persistência. O resultado da execução do script PHP a seguir é B. teste(); ?>
A afirmativa está **incorreta**. Vamos analisar o código PHP apresentado: 1. **Classe A**: - A classe **`A`** possui um método mágico chamado **`_call`**, que é chamado quando um método não existente é acessado. Esse método chama **`static::who()`**, que resolve a chamada para o método estático da classe que está sendo referenciada em tempo de execução, ou seja, a classe da instância atual (que é **`B`** no caso). 2. **Classe B**: - A classe **`B`** estende **`A`** e implementa seu próprio método estático **`who()`**. Quando **`static::who()`** é chamado a partir de uma instância da classe **`B`**, ele chama **`B::who()`** devido ao comportamento de vinculação estática. 3. **Chamada do Método**: - Quando o código executa **`$b->teste();`**, o método **`teste()`** não existe na classe **`B`**, então o PHP chama o método mágico **`_call()`** da classe **`A`**. - Dentro do método **`_call()`**, a linha **`return static::who();`** executa o método **`who()`** da classe **`B`**, imprimindo **`B`**. Portanto, a saída do script é realmente **`B`**. No entanto, o código apresentado não possui um método chamado **`teste()`**, o que resultaria em um erro fatal ao tentar chamar um método que não existe. Se o código fosse alterado para usar **`$b->_call('teste', null);`**, o resultado seria **`B`**. Como está, a execução do script resultaria em um erro, e a afirmativa está, portanto, **incorreta** na forma que foi apresentada. Gabarito: Errado
351
24. (CEBRASPE / EBSERH- 2018) Julgue o item que se segue a respeito das características da linguagem PHP e de compiladores. PHP consiste de uma linguagem compilada para código nativo e gera um bytecode que é interpretado por uma máquina virtual implantada em cada cliente onde o código será executado.
O PHP conforme vimos é uma linguagem interpretada e não uma linguagem compilada. PHP é uma linguagem de script do lado do servidor que é interpretada em tempo de execução, em vez de ser compilada para código nativo antes da execução. O PHP é focado principalmente nos scripts do lado do servidor, portanto, você pode fazer qualquer coisa que outro programa de interface de aplicativos externos pode fazer, como coletar dados de formulários, gerar páginas com conteúdo dinâmico ou enviar e receber cookies. Mas o PHP pode fazer muito mais. Gabarito: Errado
352
25. (CEBRASPE / TCE-MG- 2018) Considerando o código precedente, assinale a opção que apresenta o resultado final da execução desse código em um navegador. a) O valor 1 b) O valor 12 c) O valor 1234 d) O valor 123456789012345678901234567890 e) O valor
O código PHP decodifica uma string JSON {"valor": 123456789012345678901234567890). Nota-se um erro no JSON, pois falta uma aspa dupla no final do número, mas assumindo que seja um erro de digitação na questão e que o JSON correto seja {"valor": 123456789012345678901234567890}, o valor é corretamente decodificado para um objeto PHP. O valor decodificado, que é um número extremamente grande, é atribuído à variável PHP $valor. O valor é passado para uma variável JavaScript numero. Devido à forma como o PHP e o JavaScript lidam com números grandes, o número pode ser transformado em notação científica ou perder precisão. No entanto, o foco aqui está na operação subsequente. A linha numero= numero/10E27; efetivamente divide o número por 10 elevado a 27. Isso reduz o valor original para algo manejável pelo JavaScript e pelo espaço de número do PHP que está sendo impresso diretamente no código JavaScript. A divisão e a conversão em um número inteiro (usando parseInt(numero)) deveriam resultar em "12", que é o valor que será exibido dentro da tag com id destino. O script JavaScript atualiza o conteúdo da tag para o valor calculado, que é "12". Gabarito: Letra B
353
26. (CEBRASPE / EBSERH- 2018) Julgue o item que se segue a respeito das características da linguagem PHP e de compiladores. O código PHP apresenta o resultado a seguir. Viva a vida $txt a vida
O item está correto. Vamos analisar o código PHP e o resultado apresentado: Primeira linha de saída (print " $txt a vida \n";): Utilizando aspas duplas ", o PHP interpreta variáveis dentro da string. Portanto, o valor da variável $txt (que é "Viva") é incorporado à string resultante. O \n é um caractere de nova linha. No entanto, em um contexto HTML (como quando você visualiza o resultado em um navegador), este caractere de nova linha não cria uma nova linha visível; ele seria mais relevante em um contexto de console ou arquivo de texto. Portanto, a saída visível é "Viva a vida". Segunda linha de saída (print ' $txt a vida ';): Utilizando aspas simples ', o PHP trata o conteúdo literalmente, sem interpretar a variável $txt. Assim, a saída é literalmente o texto $txt a vida. Gabarito: Correto
354
27. (CEBRASPE / ABIN- 2018) Acerca de PHP e SOA (service oriented architecture), julgue o item a seguir. Se uma aplicação é executada em um servidor web Apache usando a linguagem PHP na versão 4.X, então ela deve ter a configuração register_globals=off para diminuir riscos de segurança relacionados a essa versão e também evitar que os desenvolvedores escrevam códigos inseguros.
Na versão 4.X do PHP, a diretiva register_globals era uma configuração crítica para a segurança. Quando ativada (register_globals=on), ela permitia que variáveis de requisições (GET, POST, COOKIE) fossem registradas como variáveis globais, o que apresentava um risco de segurança significativo, pois facilitava a injeção de variáveis maliciosas no script. Portanto, definir register_globals=off era uma prática recomendada para melhorar a segurança, evitando a exposição a esses riscos e incentivando os desenvolvedores a adotarem práticas de programação mais seguras, acessando esses dados através dos arrays superglobais ($_GET, $_POST, $_COOKIE, etc.) de forma explícita. Gabarito: Correto
355
1. (CESGRANRIO/ BASA- 2022) Considere o seguinte fragmento de código em PHP. php $var = 2; function primeira(&$var) { $var++;} function segunda($var) { $var++;} function terceira() { $var++;} echo $var; primeira($var); echo $var; segunda($var);echo $var; terceira($var); echo $var; ?> Qual será a saída gerada pelo fragmento de código acima? a) 2222 b) 2234 c) 2333 d) 2334 e) 2344
Vamos analisar o código passo a passo para determinar a saída. Inicialmente, a variável $var é definida como 2, e logo em seguida, o seu valor atual, que é 2, é exibido (echo $var;) como a primeira saída. Posteriormente, quando a função primeira é invocada por referência, ela incrementa $var para 3 ({ $var++;}), o que é imediatamente refletido na segunda saída, demonstrando a mudança. Por outro lado, embora a função segunda seja chamada por valor e incremente $var internamente, essa alteração não tem impacto na variável externa, mantendo a terceira saída em 3, uma vez que a mudança interna da função não afeta o escopo externo. Além disso, a tentativa da função terceira de incrementar $var acaba sendo ineficaz, pois ela não só não recebeu nenhum argumento, mas também carece de acesso à variável externa devido a um erro de chamada, visto que foi definida sem parâmetros, resultando em uma quarta saída que ainda apresenta o valor 3. Assim, a sequência de ações e seus respectivos efeitos sobre a variável $var ilustram como as diferentes formas de invocação de funções e o escopo das variáveis influenciam o comportamento do código. Portanto, a saída do código é 2333, o que corresponde à opção (c). Gabarito: Letra C
356
2. (CESGRANRIO/ BASA- 2021) O corredor com camisa de numeração 327 foi prejudicado durante uma competição pelos 10 corredores que chegaram logo a sua frente. A direção da corrida resolveu, então, desclassificar esses 10 corredores. Um programador designado para construir um programa que listasse somente os números das camisas desses corredores desclassificados chegou ao programa apresentado abaixo, que recebe como entrada o número de cada um dos competidores pela ordem de chegada, do primeiro ao último, e acha o competidor 327. 327;$i++); // TODO: laço para imprimir os 10 anteriores // ?> No entanto, esse programa está incompleto porque apenas encontra o corredor 327. Que instruções PHP devem ser colocadas, no lugar do comentário marcado com a palavra TODO no programa apresentado, para que sejam impressas as numerações das camisas dos 10 competidores desclassificados? a) for ($j=0;$j<10;$j++) { echo $array[$i--]; } b) for ($j=0;$j<=10;$j++) { echo $array[--$i]; } c) for ($j=0;$j<10;$j++) { echo $array[--$i]; } d) for ($j=1;$j<10;$j++) { echo $array[--$i]; } e) for ($j=0;$j<10;$j++) { echo $array[$i+$j]; }
Para imprimir os números das camisas dos 10 competidores desclassificados, que chegaram logo à frente do competidor com a camisa de numeração 327, é necessário iterar para trás a partir da posição onde o competidor 327 foi encontrado, sem incluí-lo. Isso significa que devemos começar a impressão a partir do competidor imediatamente antes do 327 e continuar até completar os 10 corredores. A opção correta para realizar essa tarefa é: for ($j=0;$j<10;$j++) { echo $array[--$i]; } Esta solução, indicada pela letra C, funciona da seguinte forma: $i é a posição no array onde o competidor 327 foi encontrado. --$i decrementa $i antes de usar seu valor, ou seja, começa a partir do competidor imediatamente anterior ao 327. O laço for se repete 10 vezes ($j<10), o que significa que ele imprimirá os números das camisas dos 10 competidores que chegaram imediatamente antes do competidor 327. As outras opções falham por diferentes razões: A opção A (echo $array[$i--];) também decrementa $i, mas o faz depois de acessar o valor, o que significa que na primeira iteração ele tentaria imprimir o competidor 327, que não é desejado. A opção B (for ($j=0;$j<=10;$j++) {) tentaria imprimir 11 competidores devido à condição $j<=10. A opção D (for ($j=1;$j<10;$j++) {) imprimiria apenas 9 competidores, pois inicia a contagem de $j em 1 e vai até $j<10. A opção E (echo $array[$i+$j];) tentaria acessar competidores que chegaram após o 327, o que não é o objetivo da tarefa. Gabarito: Letra C
357
3. (CESGRANRIO/ UNIRIO- 2019) Conhecer o uso de operadores em PHP pode significar a diferença entre programas que funcionam corretamente ou não. Considere o seguinte trecho de código em PHP: $A = 3; $B = “2”; echo $A+$B; echo $B.$A; echo $A|$B; echo $A&$B; echo “\n”; Qual será a saída desse trecho de código? a) 5623 b) 5632 c) 52323 d) 52332 e) 332323
Vamos entender cada echo. $A + $B: Soma de um inteiro e uma string que é convertível em inteiro, resultando em 5. $B . $A: Concatenação de strings, onde 3 é convertido em string e concatenado com "2", resultando em "23". $A | $B: OR bit a bit entre 3 e o valor ASCII de "2" (50), que, ao ser interpretado como texto, é mostrado como o caractere que corresponde ao resultado ("3", porque 3 | "2" resulta em 51, que é o código ASCII para "3"). $A & $B: AND bit a bit, que, dada a conversão de tipos e os valores envolvidos, resulta em um caractere que, quando interpretado como texto, não segue a lógica simples de 2 como no exemplo da explicação anterior, mas sim comporta-se de acordo com a representação binária dos valores envolvidos. Assim, nosso gabarito é: 52332, Letra D. Gabarito: Letra D
358
4. (CESGRANRIO/ BASA- 2018) O comando PHP que cria corretamente um vetor ou conjunto (array) associativo é: a) $pessoa=array(''Nome'':''Ana'',''Idade'':''52'', ''Cidade'':''Manaus''); b) $pessoa=array(''Nome'':=''Ana'',''Idade'':=''52'', ''Cidade'':=''Manaus''); c) $pessoa=array(''Nome''=''Ana'',''Idade''=''52'', ''Cidade''=''Manaus''); d) $pessoa=array(''Nome''=>''Ana'',''Idade''=>''52'', ''Cidade''=>''Manaus''); e) $pessoa=array(''Nome''->''Ana'',''Idade''->''52'', ''Cidade''->''Manaus'');
Nessa questão precisamos saber a sintaxe correta para a criação de um array associativo em PHP utiliza => para associar chaves a valores dentro do array. Portanto, a opção correta é: d) $pessoa=array('Nome'=>'Ana','Idade'=>'52', 'Cidade'=>'Manaus'); Vamos fazer uma revisão? Arrays associativos no PHP são estruturas de dados que mapeiam chaves a valores. Ao contrário dos arrays indexados numericamente, onde os índices são números inteiros, os índices dos arrays associativos são strings ou números que você define explicitamente. Para definir um array associativo, você utiliza a sintaxe chave => valor dentro da função array(). As aspas simples (') são usadas para delimitar strings, tanto para as chaves quanto para os valores dentro do array. A opção D utiliza corretamente o operador => para associar cada chave ao seu valor correspondente, seguindo a sintaxe válida de PHP para definição de arrays associativos. As demais opções falham na utilização correta dessa sintaxe: A opção A tenta usar dois pontos (:) em vez de =>, o que não é válido em PHP para arrays. A opção B emprega uma sintaxe :=, que não é reconhecida pelo PHP. A opção C usa igual (=) para tentar definir os pares chave-valor, o que também é inválido. A opção E tenta usar uma seta (->), que é a sintaxe para acessar propriedades de objetos, não para definir pares chave-valor em arrays. Portanto, a única opção que corretamente cria um array associativo em PHP é a D. Gabarito: Letra D
359
1. (FCC/ TCE-GO- 2022) Considere o bloco de código PHP abaixo. Ao executar o código em um ambiente PHP em condições ideais será exibido na página somente: a) uma mensagem de erro b) 3 c) Concurso 125 d) 125 e) Concurso 1223
Ao analisar o código PHP: ```php ``` A expressão `echo "Concurso " . $a + 3;` realiza uma operação de concatenação e soma. O operador `.` é utilizado para concatenar strings em PHP. Entretanto, a precedência dos operadores entra em jogo aqui. 1. O PHP avalia `echo "Concurso " . $a + 3;` da seguinte forma: - Primeiro, realiza a concatenação de `"Concurso "` com `$a`, que resulta na string `"Concurso 122"`. - Após a concatenação, o PHP tenta somar `3` ao resultado da string, o que pode gerar comportamento inesperado. Em PHP, quando você tenta somar um número a uma string, ele interpreta a string até onde consegue entender como um número. Nesse caso, a string começa com "Concurso", que não pode ser interpretada como um número. Como resultado, PHP retorna um *warning* e considera o valor numérico inicial da string como `0`, somando `3` a ele. Portanto, o código exibirá: - **3**, após o PHP gerar um *warning*. A resposta correta é a **letra b) 3**. Gabarito: Letra B
360
2. (FCC/ TJ CE- 2022) Considere o trecho de código PHP abaixo. Para fazer a conexão com o banco de dados MySQL de forma bem-sucedida, em condições ideais, as lacunas I, II e III devem ser, correta e respectivamente, preenchidas com a) mysql_connect − mysql_error() − mysql_close b) connect_mysql − error_mysql() − close_mysql c) pdo_connect − pdo_connect_error() − pdo_close d) connect_mysqli − error_mysqli() − close_mysqli e) mysqli_connect − mysqli_connect_error() − mysqli_close
No código fornecido, o objetivo é conectar-se a um banco de dados MySQL usando PHP. Para isso, vamos analisar cada lacuna com base nas funções corretas. O código PHP correto para conectar-se a um banco de dados MySQL deve usar a extensão **MySQLi**, que é a interface mais atual e recomendada para interagir com o MySQL. A sintaxe correta para essa conexão e manipulação inclui as funções: 1. **mysqli_connect**: É a função usada para abrir uma conexão com o MySQL. 2. **mysqli_connect_error**: É a função usada para retornar o erro da conexão, caso haja algum problema. 3. **mysqli_close**: É a função usada para fechar a conexão com o banco de dados. Analisando as lacunas no código: ```php $servername = "localhost"; $database = "dbname"; $username = "username"; $password = "password"; $conn = I ($servername, $username, $password, $database); // I = mysqli_connect if (!$conn) { die("Conexão falhou. Erro: " . II ); // II = mysqli_connect_error() } echo "Conexão bem-sucedida."; III ($conn); // III = mysqli_close ``` Assim, as lacunas são preenchidas da seguinte forma: - **I = mysqli_connect** - **II = mysqli_connect_error()** - **III = mysqli_close** Portanto, a resposta correta é a **letra e) mysqli_connect − mysqli_connect_error() − mysqli_close**. Gabarito: Letra E
361
3. (FCC/ PGE AM- 2022) Considere o bloco PHP abaixo. Caso o segundo parâmetro passado para o método divide seja 0 ao invés de 10, ocorrerá uma exceção. Para tratar adequadamente esta exceção a chamada ao método realizada pelo comando echo divide(5, 10); deverá mudar para a) try {echo divide(5,0);} catch(DivisionByZeroException $e) {echo "Impossível dividir.";} b) try {divide(5,0);} catch(DivisionException $e) {echo "Impossível dividir.";} c) try {echo divide(5,0);} catch(Exception $e) {finally echo "Impossível dividir.";} d) try {echo divide(5,0);} catch(Exception $e) {echo "Impossível dividir.";} e) try {divide(5,0);} catch(Exception $e) {printf "Impossível dividir.";}
Para tratar adequadamente a exceção gerada pela tentativa de dividir por zero, é necessário envolver a chamada ao método divide(5, 0) em um bloco try-catch. O bloco try é onde o código potencialmente problemático é colocado, e o bloco catch é onde a exceção é tratada caso ocorra. Portanto, a forma correta de tratar a exceção é a opção D: try { echo divide(5, 0); } catch(Exception $e) { echo "Impossível dividir."; } Essa estrutura tentará executar o código dentro do bloco try e, se uma exceção for lançada, o código dentro do bloco catch será executado para lidar com ela. Gabarito: Letra D
362
4. (FCC/ DETRAN AP- 2022) Considere a seguinte função PHP: crypt(string $str, string $salt = ?): string Considere que str é a string a ser encriptada e salt é uma string opcional que define a base hash da encriptação. Se não fornecida, essa base será sempre a) CRYPT_STD_DES - Codificação Standard DES-based com um salt de 2 caracteres. b) CRYPT_EXT_DES - Codificação Extended DES-based com um salt de 9 caracteres. c) CRYPT_MD5 - Codificação MD5 com um salt de 12 caracteres começando com %1$. d) CRYPT_BLOWFISH - Codificação Blowfish com um salt de 16 caracteres começando com $2%. e) gerada randomicamente pelo PHP cada vez que chamar esta função.
A função crypt em PHP é usada para criar uma hash de uma string. Se um salt não for fornecido como argumento, o PHP gera um salt randomicamente cada vez que a função é chamada. Portanto, a opção correta é a letra E. Gabarito: Letra E
363
5. (FCC/ DETRAN AP- 2022) As variáveis predefinidas em PHP, chamadas de "superglobais", podem ser acessadas a partir de qualquer função, classe ou arquivo. Dentre estas variáveis está a a) $_ENV, que envia dados do servidor para páginas HTML. b) $_SESSION, que cria uma seção ou contêiner onde será executado código PHP. c) $_REQUEST, que é utilizada para enviar dados para formulários HTML. d) $GLOBALS, que é utilizada para acessar informações do servidor. e) $_SERVER['SERVER_ADDR'], que retorna o endereço IP do servidor.
A variável $_SERVER['SERVER_ADDR'] é uma das superglobais em PHP e retorna o endereço IP do servidor. Portanto, a opção correta é a letra E. É uma matriz associativa que inclui informações como nome do script atual, diretórios, endereços IP do cliente, entre outros. Essa superglobal é comumente utilizada para acessar informações do servidor web e do ambiente de execução do PHP. Revisão rápida das variáveis superglobais, vamos? ● $_SERVER: Uma matriz contendo informações como cabeçalhos, caminhos e locais de script. As entradas nessa matriz são criadas pelo servidor web. ● $_REQUEST: Uma matriz que contém variáveis passadas para o script via HTTP Request. Isso inclui variáveis $_GET, $_POST e $_COOKIE. ● $_POST: Uma matriz associativa de variáveis passadas para o script atual via método HTTP POST quando usado com formulários HTML. ● $_GET: Uma matriz associativa de variáveis passadas para o script atual via parâmetros de consulta no URL. ● $_FILES: Uma matriz associativa de itens enviados para o script atual via método HTTP POST com o atributo enctype="multipart/form-data" em um formulário HTML. ● $_COOKIE: Uma matriz associativa de variáveis passadas para o script atual via cookies HTTP. ● $_SESSION: Uma matriz associativa contendo variáveis de sessão disponíveis para o script atual. ● $_ENV: Uma matriz associativa contendo variáveis de ambiente disponíveis para o script atual. Gabarito: Letra E
364
6. (FCC/ PGE AM- 2022) A variáveis predefinidas em PHP, chamadas super globais, estão sempre acessíveis, independentemente do escopo. Considere o exemplo abaixo. As variáveis predefinidas que podem ser utilizadas corretamente nas lacunas I, II e III são, respectivamente, a) $_POST, $_SERVER e $_GLOBALS b) $_SEND, $_HTTP e $_REQUEST c) $_SERVER, $_SERVER e $_POST d) $_SERVER, $_SERVER e $_GLOBALS e) $_SUBMIT, $_HTTP e $_POST
Para a lacuna I, deve-se usar $_SERVER['PHP_SELF']. Esta variável contém o nome do arquivo do script que está sendo executado. Isso é necessário para definir o atributo action do formulário HTML para garantir que os dados do formulário sejam enviados de volta para o próprio script PHP. Para a lacuna II, deve-se usar $_SERVER. Esta superglobal é usada para acessar informações sobre a solicitação HTTP, e $_SERVER['REQUEST_METHOD'] retorna o método de requisição HTTP utilizado para acessar a página atual. No contexto do código apresentado, queremos verificar se o método de requisição é POST para processar os dados do formulário submetido. Para a lacuna III, deve-se usar $_POST. Esta superglobal contém os dados enviados para o script via método POST, ou seja, os dados do formulário HTML são acessados através desta superglobal após a submissão do formulário. Gabarito: Letra C
365
7. (FCC/ TJ SC- 2021) Considere o método abaixo, em uma classe PHP chamada Cliente. public function setNome($Nome) { $this->Nome = $Nome; } A partir de outra classe, um objeto na classe Cliente foi instanciado por meio da instrução $cli = new Cliente;. Para chamar o método acima e passar o nome 'Paulo' como parâmetro, utiliza-se a instrução a) $cli::setNome('Paulo'); b) $cli->setNome('Paulo'); c) $cli.nome('Paulo'); d) $cli->send.setNome('Paulo'); e) $cli.setNome('Paulo');
No contexto de PHP orientado a objetos, ao instanciar um objeto de uma classe e chamar um método público, a sintaxe correta é usar o operador `->` para acessar métodos ou propriedades do objeto. O código da questão envolve o seguinte método da classe `Cliente`: ```php public function setNome($Nome) { $this->Nome = $Nome; } ``` Após instanciar a classe `Cliente` com: ```php $cli = new Cliente; ``` Para chamar o método `setNome` e passar o parâmetro `'Paulo'`, a sintaxe correta é: ```php $cli->setNome('Paulo'); ``` - **a) $cli::setNome('Paulo');**: Incorreto. O operador `::` é usado para acessar métodos ou propriedades estáticos, o que não é o caso aqui. - **b) $cli->setNome('Paulo');**: Correto. O operador `->` é usado para acessar métodos não estáticos de um objeto. - **c) $cli.nome('Paulo');**: Incorreto. A sintaxe de ponto (`.`) não é usada para acessar métodos em PHP. - **d) $cli->send.setNome('Paulo');**: Incorreto. Essa sintaxe é inválida em PHP. - **e) $cli.setNome('Paulo');**: Incorreto. A sintaxe com ponto também é inválida em PHP. Portanto, a resposta correta é **b) $cli->setNome('Paulo');**.
366
8. (FCC/ ALAP- 2020) Considere a função abaixo, existente em uma classe PHP de acesso a dados: public function localizar($Usuario) { try { $c = new PDO("mysql:host=localhost;dbname=dados", "root", ""); $c->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $st = $c->prepare("SELECT * FROM Colaborador WHERE user=? AND password=?"); ...I... ; /*restante do código aqui */ } catch (PDOException $ex) { return null; } } Considerando que $Usuario é um objeto da classe Usuario, que possui os atributos User e Password e os respectivos métodos getter e setter, para executar a instrução SQL INSERT, a lacuna I acima deve ser preenchida corretamente com: a) $st->execute([$Usuario->User, $Usuario->Password]) b) $st->exec([$Usuario.getUser(),$Usuario.getPassword()]) c) $c->execute([$st -> getUser($Usuario), $st -> getPassword($Usuario)) d) $st->exec([$Usuario->getUser(),$Usuario ->getPassword()]) e) $c->$st->execute([$Usuario(User), $Usuario(Password)])
Para executar a instrução SQL INSERT corretamente dentro do método localizar, preenchendo a lacuna I com a opção correta, considerando que $Usuario é um objeto da classe Usuario, que possui os atributos User e Password, e os métodos getter correspondentes, a instrução correta seria: a) $st->execute([$Usuario->User, $Usuario->Password]) A função execute é usada para executar uma declaração preparada (prepared statement) no banco de dados. Os valores dos parâmetros para a declaração preparada devem ser passados como um array para a função execute. Neste caso, os valores para os parâmetros user e password são os valores dos atributos User e Password do objeto $Usuario, respectivamente. Portanto, a opção correta é a letra A. Gabarito: Letra A
367
9. (FCC/ Pref Manaus- 2019) Considere o fragmento de código abaixo, que é parte de uma página construída em um ambiente PHP ideal, com todos os recursos disponíveis. $servername = "localhost"; $username = "semef"; $password = "1b3Z"; $dbname = "tributario"; try { $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "UPDATE Contribuinte SET nome='Paulo' WHERE id=1"; ..I.. echo "Operação realizada com sucesso"; } catch(PDOException $e) { echo $sql . "
" . $e->getMessage(); } $conn = null; Considerando o uso de PHP Data Objects, para que o comando UPDATE seja executado corretamente a lacuna I deve ser preenchida com a) mysqli_query($conn, $sql); b) $conn.execute($sql); c) $st = $conn.prepare($sql); $st.exec(); d) $conn->query($sql); e) $st = $conn->prepare($sql); $st->execute();
Para que o comando UPDATE seja executado corretamente usando PHP Data Objects (PDO), a lacuna I deve ser preenchida com a opção correta que prepara e executa a declaração SQL. A forma correta de fazer isso é utilizando os métodos prepare e execute do objeto PDOStatement. Portanto, a opção correta é: e) $st = $conn->prepare($sql); $st->execute(); O método prepare prepara a declaração SQL para execução e retorna um objeto PDOStatement. Já, o método execute executa a declaração SQL preparada. Portanto, para que o comando UPDATE seja executado corretamente, a lacuna I deve ser preenchida com a opção correta da letra E. Gabarito: Letra E
368
10. (FCC/ TJ MA- 2019) Considere a função abaixo existente em uma classe PHP em condições ideais. public function inserir($User) { try { $conn = new PDO("mysql:host=localhost;dbname=dados", "root", ""); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "INSERT INTO Usuarios(nome, usuario, senha) VALUES ('$User->Nome', ' $User->Usuario','$User->Senha')"; ..I..; return 1; } catch (PDOException $e) { return $e->getCode(); } } Para que a instrução INSERT seja executada corretamente, a indicação I deve ser substituída por: a) $conn->exec($sql) b) $stmt = $conn->fetch($sql) c) $conn.exec($sql) d) $conn->fetchExec($sql) e) $stmt = $conn.createStatement($sql)
Para que a instrução INSERT seja executada corretamente, a indicação I deve ser substituída por: a) $conn->exec($sql) O método exec() do objeto PDO executa uma instrução SQL fornecida como parâmetro. Neste caso, a instrução SQL é uma operação de inserção (INSERT INTO), portanto, o método exec() é a opção correta para executá-la. Assim, para que a instrução INSERT seja executada corretamente, a indicação I deve ser substituída pela opção correta da letra A. Gabarito: Letra A
369
11. (FCC/ TRF3- 2019) Para concatenar a string "TRF" com a variável reg que contém o valor inteiro 3, em Java e PHP, utilizam-se, respectivamente, a) String("TRF")+reg e str("TRF").$reg b) "TRF"+reg e "TRF".$reg c) "TRF"+reg e "TRF"+$reg d) "TRF",reg e Concat("TRF",$reg) e) String.Concat("TRF",reg) e "TRF"+$reg
Para concatenar uma string com uma variável em **Java** e **PHP**, as linguagens utilizam diferentes operadores e métodos. Vamos analisar as opções: **Concatenação em Java:** Em Java, o operador de concatenação de strings é o **`+`**. Quando concatenamos uma string com um valor inteiro, o inteiro é convertido automaticamente para string. Portanto, para concatenar `"TRF"` com a variável `reg`, que contém o valor `3`, usamos: ```java "TRF" + reg; ``` **Concatenação em PHP:** Em PHP, o operador de concatenação de strings é o **`.`**. Para concatenar `"TRF"` com a variável `$reg`, usamos: ```php "TRF" . $reg; ``` Analisando as opções: - **a) String("TRF")+reg e str("TRF").$reg**: Incorreto, a sintaxe de Java e PHP está incorreta. - **b) "TRF"+reg e "TRF".$reg**: Correto. Em Java, `"TRF" + reg` e, em PHP, `"TRF" . $reg` são as formas corretas de concatenação. - **c) "TRF"+reg e "TRF"+$reg**: Incorreto. Em PHP, o operador de concatenação é `.` e não `+`. - **d) "TRF",reg e Concat("TRF",$reg)**: Incorreto. A sintaxe está incorreta tanto em Java quanto em PHP. - **e) String.Concat("TRF",reg) e "TRF"+$reg**: Incorreto. O método `String.Concat` não é utilizado em Java, e o operador `+` em PHP também está incorreto. Portanto, a resposta correta é **b) "TRF"+reg e "TRF".$reg**. Gabarito: Letra B
370
12. (FCC/ TRF3- 2019) Considere o código PHP abaixo, que faz a conexão com um banco de dados. Para o código estar correto, as lacunas I e II devem ser, respectiva e corretamente, preenchidas por a) mysqli_connect − SQLException b) PDOConnect − PDOException c) mysqli_connect − Exception d) new PDO − PDOException e) database_connect – DataBaseException
A questão trata de um código PHP que realiza a conexão com um banco de dados e solicita o preenchimento correto das lacunas para que o código funcione adequadamente. Vamos analisar as opções. Conexão com banco de dados em PHP Existem duas maneiras principais de se conectar a um banco de dados MySQL em PHP: 1. **Usando MySQLi** (procedural ou orientado a objetos). 2. **Usando PDO** (PHP Data Objects), que é uma interface que permite o uso de diferentes bancos de dados com uma única interface. Analisando as opções: - **a) mysqli_connect − SQLException**: Incorreto. `mysqli_connect` é a função correta para a conexão MySQLi, mas `SQLException` não é uma exceção válida em PHP, já que ela pertence ao Java. Em PHP, para MySQLi, as exceções são genéricas do tipo `Exception`. - **b) PDOConnect − PDOException**: Incorreto. Não existe uma função chamada `PDOConnect` em PHP. A maneira correta de usar PDO é instanciando um novo objeto com `new PDO`. - **c) mysqli_connect − Exception**: Correto para MySQLi. `mysqli_connect` é a função usada para conectar a um banco de dados MySQL, e `Exception` é a exceção genérica usada em PHP para capturar erros. - **d) new PDO − PDOException**: Correto para PDO. `new PDO` é a forma correta de instanciar uma conexão usando PDO, e `PDOException` é a exceção específica para erros relacionados ao PDO. - **e) database_connect – DataBaseException**: Incorreto. Não existe uma função `database_connect` em PHP, nem uma exceção `DataBaseException`. Resumo: - Se o código usa **MySQLi**, a resposta correta seria **c) mysqli_connect − Exception**. - Se o código usa **PDO**, a resposta correta seria **d) new PDO − PDOException**. Portanto, as duas opções corretas, dependendo do contexto da questão, são **c) mysqli_connect − Exception** e **d) new PDO − PDOException**. Gabarito: Letra D
371
13. (FCC/ SANASA- 2019) Considere os comandos PHP abaixo, que objetivam criar um array. I. $servico = array("Água"=>"8,70", "Esgoto"=>"4,30"); II. $servico [ 'Água' ] = "8,70"; $servico [ 'Esgoto' ] = "4,30"; III. $servico = new array { 'Água' -> "8,70"; 'Esgoto' -> "4,30" }; IV. $servico = array { [ "Água" ] [ "8,70" ]; [ "Esgoto" ] [ "4,30" ] }; Está correto o que consta APENAS em a) III e IV. b) I e III. c) I e IV. d) II e III. e) I e II.
Vamos analisar cada comando PHP apresentado para verificar quais estão corretos para criar um array. I. ```php $servico = array("Água"=>"8,70", "Esgoto"=>"4,30"); ``` Esse comando está correto. Ele utiliza a função `array()` para criar um array associativo, onde as chaves são `"Água"` e `"Esgoto"`, e os valores correspondentes são `"8,70"` e `"4,30"`. II. ```php $servico['Água'] = "8,70"; $servico['Esgoto'] = "4,30"; ``` Esse comando também está correto. Aqui, um array associativo é criado por meio da atribuição direta de valores a chaves específicas do array `$servico`. III. ```php $servico = new array { 'Água' -> "8,70"; 'Esgoto' -> "4,30" }; ``` Esse comando está **incorreto**. A palavra-chave `new` não é usada para criar arrays em PHP, e a sintaxe `->` é usada para acessar propriedades de objetos, não para definir arrays. IV. ```php $servico = array { [ "Água" ] [ "8,70" ]; [ "Esgoto" ] [ "4,30" ] }; ``` Esse comando também está **incorreto**. A sintaxe `{}` usada aqui é inválida, e a forma correta de criar arrays em PHP seria com `array()` ou usando `[]` para definir chaves e valores. Conclusão: Os comandos corretos são apenas **I e II**. Portanto, a resposta correta é **e) I e II**. Gabarito: Letra E
372
14. (FCC/ TRF3- 2019) Em uma aplicação PHP, considere $conn um objeto que contém uma conexão válida com um banco de dados e $n uma variável string que contém o nome de uma pessoa. Após a conexão com o banco de dados ter sido efetuada, a instrução abaixo prepara uma instrução SQL parametrizada. $stmt = $conn->prepare("INSERT INTO Usuarios(nome)VALUES (:nome)"); Para passar o conteúdo da variável $n como parâmetro para a instrução SQL acima utiliza-se o comando a) $stmt->setParam(':nome', $n); b) $stmt->bindParam($n->':nome'); c) $stmt->bindParam(':nome', $n); d) $stmt->setParameter($n->':nome'); e) $stmt->param($n, ':nome');
O comando correto para passar o conteúdo da variável $n como parâmetro para a instrução SQL preparada é o método bindParam() da classe PDOStatement. Portanto, a resposta correta é a opção: c) $stmt->bindParam(':nome', $n); Este método vincula um parâmetro de substituição nomeado à variável especificada. Gabarito: Letra C
373
15. (FCC/ Pref Manaus- 2019) Um programador web deseja armazenar dados no navegador do usuário para rastrear ou identificar aqueles que retornam ao site. Para isso, no site que está sendo desenvolvido em PHP 7, deverá ser utilizada a função a) setcookie() antes da tag html. b) set_cookie() em qualquer local página. c) setdrawcookie() no interior do cabeçalho da página. d) setdrawcookie() antes do corpo da página. e) setcookie() após tag html.
Para armazenar dados no navegador do usuário e rastrear ou identificar visitantes que retornam ao site, a função correta em PHP é **`setcookie()`**. Essa função define um cookie que é enviado ao navegador do usuário e armazenado, permitindo que o servidor identifique o usuário em visitas futuras. Regras importantes sobre o uso de `setcookie()`: - A função **`setcookie()`** deve ser chamada **antes de qualquer saída HTML**, ou seja, antes de a página enviar qualquer conteúdo ao navegador, pois os cookies são enviados nos cabeçalhos HTTP. Analisando as opções: - **a) setcookie() antes da tag html**: Correto. A função `setcookie()` deve ser usada **antes de qualquer saída HTML**, o que inclui a abertura da tag ``. - **b) set_cookie() em qualquer local da página**: Incorreto. Além do nome da função estar incorreto (`set_cookie()` não existe em PHP), a função não pode ser chamada "em qualquer local da página" por causa da restrição de ser usada antes da saída de conteúdo HTML. - **c) setdrawcookie() no interior do cabeçalho da página**: Incorreto. Não existe uma função `setdrawcookie()` em PHP. - **d) setdrawcookie() antes do corpo da página**: Incorreto. Além de `setdrawcookie()` não ser uma função válida em PHP, essa instrução está incorreta. - **e) setcookie() após tag html**: Incorreto. A função `setcookie()` não pode ser usada após a tag ``, pois os cookies devem ser enviados antes de qualquer saída de conteúdo HTML. Resposta correta: **a) setcookie() antes da tag html**. Gabarito: Letra A
374
16. (FCC/ TRF4- 2019) Ataques Cross-Site Scripting (XSS) muitas vezes usam caracteres especiais em campos de formulário para acessar áreas restritas do site. Para evitar esse tipo de ataque, um programador PHP recebeu o login de um usuário, digitado em um campo de formulário, da seguinte forma. $login = filter_input(INPUT_POST, 'login', __I__); Considerando que no campo login do formulário foi digitado , para que os sinais de < (menor) e > (maior) sejam trocados por suas respectivas referências de nome de entidade, ficando no formato <comando>, a lacuna I deverá ser preenchida corretamente por a) FILTER_SANITIZE_MAGIC_CHARACTERS b) FILTER_SANITIZE_FULL_ENTITY_CHARACTERS c) FILTER_SANITIZE_SPECIAL_CHARS d) FILTER_SANITIZE_FULL_SPECIAL_ENTITIES e) FILTER_SANITIZE_MAGIC_QUOTES
Para proteger contra ataques **Cross-Site Scripting (XSS)**, que exploram a inserção de caracteres especiais como `<` e `>`, é comum "sanitizar" esses caracteres, convertendo-os para suas entidades HTML correspondentes, como `<` e `>`. Em PHP, isso pode ser feito utilizando o filtro adequado. A função no código da questão usa: ```php $login = filter_input(INPUT_POST, 'login', __I__); ``` A lacuna deve ser preenchida com um filtro que transforme caracteres especiais em suas entidades HTML. Analisando as opções: - **a) FILTER_SANITIZE_MAGIC_CHARACTERS**: Não existe um filtro com esse nome no PHP, então essa opção está incorreta. - **b) FILTER_SANITIZE_FULL_ENTITY_CHARACTERS**: Também não existe um filtro com esse nome no PHP. Incorreto. - **c) FILTER_SANITIZE_SPECIAL_CHARS**: **Correto**. Esse filtro transforma caracteres especiais como `<`, `>`, e `&` em suas respectivas entidades HTML (`<`, `>`, `&`), o que evita a execução de scripts injetados. - **d) FILTER_SANITIZE_FULL_SPECIAL_ENTITIES**: Não existe um filtro com esse nome em PHP. Incorreto. - **e) FILTER_SANITIZE_MAGIC_QUOTES**: Esse filtro não sanitiza caracteres especiais como `<` e `>`. Ele foi usado no passado para adicionar barras invertidas a aspas simples e duplas, mas foi descontinuado a partir do PHP 5.4. Incorreto. Resposta correta: **c) FILTER_SANITIZE_SPECIAL_CHARS**. Gabarito: Letra C
375
17. (FCC/ Pref Manaus- 2019) Considere o fragmento de código abaixo. "João","cpf" => "145267087-1"); var_dump($b,$c, $d, $e); ?> Ao compilar e executar esse fragmento de código criado em PHP 7, um dos valores exibidos será exatamente a) array(2) {"nome"=>"João", "cpf"=>"145267087-1"}. b) boolean(1) true. c) string(5) "SEMEF". d) int(3). e) array(2) {String (5), String (11)}.
O código PHP fornecido usa a função `var_dump()` para exibir informações sobre as variáveis. Vamos analisar o que cada variável contém e o que será exibido ao executar o fragmento de código: ```php $b = 3.1; // um número em ponto flutuante (float) $c = true; // um valor booleano $d = "SEMEF"; // uma string $e = array("nome" => "João","cpf" => "145267087-1"); // um array associativo var_dump($b, $c, $d, $e); ``` Análise das variáveis: 1. **$b**: É um número de ponto flutuante (float), `3.1`. - A saída será: `float(3.1)` 2. **$c**: É um valor booleano, `true`. - A saída será: `bool(true)` 3. **$d**: É uma string, `"SEMEF"`. - A saída será: `string(5) "SEMEF"` (5 é o comprimento da string). 4. **$e**: É um array associativo com duas chaves. - A saída será: `array(2) { ["nome"]=> string(4) "João" ["cpf"]=> string(11) "145267087-1" }` (onde 4 é o comprimento de "João" e 11 é o comprimento de "145267087-1"). Analisando as opções: - **a) array(2) {"nome"=>"João", "cpf"=>"145267087-1"}.**: Esta opção não é a saída exata gerada pelo `var_dump()`, pois a sintaxe é um pouco diferente. - **b) boolean(1) true.**: A saída correta seria `bool(true)`, não `boolean(1) true`, então esta opção está incorreta. - **c) string(5) "SEMEF".**: **Correto**. Essa é a saída correta para a string. - **d) int(3).**: Incorreto. `$b` é um float, e não um int. - **e) array(2) {String (5), String (11)}.**: Esta opção não corresponde exatamente à saída do `var_dump()`. Resposta correta: **c) string(5) "SEMEF".** Gabarito: Letra C
376
18. (FCC/ DPE AM- 2018) Considere o fragmento de código PHP abaixo. exec("DELETE FROM Produto WHERE nome = 'caneta'"); ?> A variável $count receberá a) o valor "true", caso o produto seja excluído com sucesso. b) uma cópia do registro a ser excluído, para exibição e confirmação da ação pelo usuário. c) o número de linhas excluídas da tabela pelo comando DELETE. d) o número 1 se o registro foi excluído ou 0 se ocorrer algum erro na exclusão, mesmo que tenha mais de um produto de nome caneta. e) o valor "false", caso o produto de nome caneta não esteja cadastrado.
Claro! Aqui está uma explicação mais detalhada sobre a questão 18: No código PHP fornecido, a variável `$count` é atribuída ao resultado do método `exec()` após a execução de um comando SQL DELETE. O código é o seguinte: ```php $base = new PDO('odbc:sample', 'db2B001', 'ibmdb2'); $count = $base->exec("DELETE FROM Produto WHERE nome = 'caneta'"); ``` O que acontece: - O método `exec()` é usado para executar comandos SQL que não retornam dados (como INSERT, UPDATE e DELETE). - Ao executar o comando DELETE, `$count` receberá **o número de linhas que foram excluídas da tabela**. Resposta correta: **c) o número de linhas excluídas da tabela pelo comando DELETE.** Se não houver registros correspondentes, `$count` será `0`. Se houver, ele conterá o número de linhas deletadas. Gabarito: Letra C
377
19. (FCC/ TRT2- 2018) Considere o trecho de programa PHP abaixo. Supondo que ao executar este trecho, um usuário passou como entrada: cujo objetivo é capturar os dados de cookie do site alvo e enviá-los para o site www.coletor.com Um Técnico de TI conclui corretamente que a) o trecho com a instrução echo imprime os dados passados pelo usuário, sem oferecer vulnerabilidades ao site alvo. b) nada ocorrerá, pois o usuário não poderia passar a entrada indicada. c) o navegador, ao perceber que a entrada se trata de um script, encerrará o código sem executar o echo. d) trata-se de um ataque do tipo XSS, pois com os dados de cookie é possível capturar senhas de e-mail. e) trata-se de um ataque do tipo SQL-Injection, pois o usuário invasor inseriu uma consulta que será enviada diretamente para o banco de dados relacional.
Vamos analisar o trecho de código PHP e a entrada do usuário fornecida, considerando os conceitos de segurança da web e os tipos de ataques mencionados nas opções. Código PHP: ```php ``` Entrada do Usuário: ```html ``` Análise 1. **Função `setcookie`**: O código define cookies com valores que podem conter informações sensíveis, como `login` e `senha`. 2. **Uso de `echo`**: O comando `echo $_GET['var'];` imprime qualquer valor que seja passado como um parâmetro na URL (por exemplo, `script.php?var=