Baixe o app para aproveitar ainda mais
Prévia do material em texto
Algoritmos e Programação Estruturada: Programação Estruturada para Dev Questão 1 Correta Questão com problema? Uma pilha é uma estrutura de dados do tipo LIFO (Last in, First out), ou seja, na qual o último elemento a entrar é o primeiro a sair. Assim, nos elementos que ainda permanecem, o que está no topo da pilha será o primeiro a ser removido. Conforme Tenenbaum, Langsam e Augenstein (2007), uma pilha possui uma estrutura que pode ser declarada contendo dois objetos: um ponteiro, que irá armazenar o endereçamento inicial da pilha; e um valor inteiro, que irá indicar a posição do topo da pilha. Considerando a pilha apresentada no texto, para sua utilização primeiramente é necessário: Sua resposta Correta criar a declaração da estrutura da pilha, criar a pilha com a alocação dinâmica e criar as funções para inserir e remover dela. Questão 2 Incorreta Questão com problema? Observe a figura abaixo referente as operações em uma Pilha: I. Na figura podemos observar uma sequência de operações para inserir um novo elemento na Pilha com a função pop( ), PORQUE II. Com a função push( ) é realizada a remoção do elemento da Pilha. Analise com cuidado as duas proposições, verifique se cada uma é verdadeira ou falsa, e marque a alternativa correta: Sua resposta Incorreta As asserções I e II são proposições verdadeiras, e a II é uma justificativa da I. Solução esperada As asserções I e II são proposições falsas. Questão 3 Correta Questão com problema? Um mecanismo utilizado para organizar nossa informação e prover operações convenientes e eficientes para acessá-la e manipulá-la é conhecido como estrutura de dados. Diversos tipos de estruturas de dados têm sido propostas e o conhecimento das características dessas estruturas é um fator importante para a escolha da estrutura que melhor se encaixa na solução de um determinado problema. Neste contexto, analise o trecho a seguir, completando as lacunas. A ____________ é uma estrutura do tipo ____________, na qual os elementos são inseridos, consultados e removidos apenas na extremidade inicial da estrutura, conhecida como ____________. Assinale a alternativa que preenche corretamente as lacunas. Sua resposta Correta pilha / LIFO / topo. Questão 4 Correta Questão com problema? Uma fila é uma estrutura de dados dinâmica que admite remoção de elementos e inserção de novos objetos. Mais especificamente, uma Fila é uma estrutura sujeita à seguinte regra de operação: sempre que houver uma remoção, o elemento removido é o que está na estrutura há mais tempo (TENENBAUM, 2007). Considerando a utilização de uma Fila, alguns problemas podem surgir com sua utilização, como por exemplo: • • • I. Utilizando-se um vetor, teremos o problema de possuir um armazenamento de tamanho fixo e limitado, enquanto que a Fila pode crescer com a necessidade de uso do sistema, e para resolver essa problemática, teríamos que limitar o tamanho máximo da Fila ao tamanho do vetor. • • • II. Outra situação que pode ocorrer é adicionar um elemento em uma Fila cheia ou remover um elemento de uma Fila vazia. Em ambos os casos seria impossível realizar as operações. Como solução, é importante sempre implementar as funções para verificar se a Fila está cheia (fila_cheia(F)) e para verificar se a Fila está vazia (fila_vazia(F)). III. Podem surgir problemas relacionados aos controles de início e fim de Fila, onde não é possível identificar as posições em que se encontram. Como solução, é preciso incluir duas variáveis (início e fim) para armazenar a posição do início e do fim da Fila, e sempre atualizar esses valores conforme a Fila aumenta ou diminui. A seguir assinale a alternativa correta. Sua resposta Correta As afirmativas I, II e III estão corretas. Questão 5 Correta Questão com problema? Para a remoção de um elemento de uma pilha, é necessário que ela seja realizada somente pelo topo da pilha, usando a função pop(). A implementação do trecho de código para a remoção de elementos do topo da pilha pode ser declarada como no modelo a seguir, utilizando a função pop_pilha( ): float pop_pilha(struct Pilha *p){ float aux = p -> proxElem [p -> topo]; p -> topo--; return aux; } Baseado na implementação do trecho do texto, avalie as afirmações a seguir: I - No trecho apresentado, a função pop_pilha( ) remove a struct da pilha. • II - A variável aux declarada recebe o elemento que está no topo. III - Na linha 3 no código o valor do topo é decrementado. É correto apenas o que se afirma em: Sua resposta Correta II e III. Questão 1 Correta Questão com problema? A recursividade é uma técnica programação usada para tornar o código mais elegante, organizado, o que pode facilitar a manutenção. Essa técnica, em muitos casos, pode ser usada para substituir uma estrutura de repetição iterativa, por exemplo, uma que use o comando for. Uma função recursiva pode substituir uma estrutura de repetição, porém nem sempre é viável, visto os recursos computacionais necessários para a execução da recursividade. Uma função recursiva funciona como um laço de repetição, o qual, será interrompido somente quando o caso base for satisfeito. Considerando o contexto, avalie o programa a seguir, observando as duas funções criadas sobre a recursividade. #include <stdio.h> int fatNaoRecursivo(int n){ if(n<2) return 1; int f=1; int i; for(i=2; i<=n; i++) f*=i; return f; } int fatRecursivo(int n){ if(n<2) return 1; return fatRecursivo(n-1)*n; } int main() { printf("%d\n",fatNaoRecursivo(6)); printf("%d\n",fatRecursivo(6)); return 0; } Analisando o programa proposto, assinale a alternativa correta. Sua resposta Correta O programa demonstra o uso de duas funções, uma com recursividade e a outra não, as duas funções funcionam, a diferença está na quantidade de linha entre as duas técnicas. e não há erros de compilação. Questão 2 Correta Questão com problema? De acordo com Mizrahi (2008) as funções dividem grandes tarefas de programação em tarefas menores, permitindo aos programadores reprogramarem a partir de códigos que já foram produzidos, facilitando e acelerando o trabalho de programação. Observe o programa que demonstra o uso de uma função na linguagem C: #include <stdio.h>#define pi 3.1415float raio ( ){ float r, area; printf("Digite o raio: "); scanf("%f",&r); area = pi * r * r; }int main(){ float result; result = raio (); printf("Area do circulo = %.2f \n",result); return 0;} O programa demonstrado não compila pois possui um erro, escolha a opção correta que mostra o erro do programa. Sua resposta Correta O que causa o erro do programa é a falta do return na função raio ( ), o correto seria adicionar a seguinte linha: return area; isso fará com que o valor seja repassado para a variável result. Questão 3 Incorreta Questão com problema? Um programa de computador pode acelerar o resultado de muitos problemas matemáticos e este é o caso da sequência de Fibonacci. A sequência de Fibonacci é uma sucessão de números que aparecem em muitos fenômenos da natureza. Descrita no final do século 12 pelo italiano Leonardo Fibonacci, ela é infinita e começa com 0 e 1. Os números seguintes são sempre a soma dos dois números anteriores. Portanto, depois de 0 e 1, vêm 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... Observe a função para o cálculo da sequência de Fibonacci e que usa o recurso de recursividade. int fibonacci (int n) { int s1, s2 ; if (n == 0) return 1; else if (n == 1) return 1; else { s1 = fibonacci(n-1); s2 = fibonacci(n-2); return s1 + s2;} } Neste contexto,avalie as afirmativas a seguir: I - A recursividade é indicada quando um problema é menor, pois desta forma o programa ficará ainda mais veloz. II - Devemos evitar o uso de recursividade quando um problema é muito repetitivo, o ideal é chamar funções menores e que podem fazer o mesmo serviço. III - A recursividade é indicada quando um problema é maior e pode ser dividido em instâncias menores do mesmo problema, porém considerando a utilização dos recursos computacionais que cada método empregará. IV. - Um programa recursivo exige mais espaço de memória e é, na grande maioria dos casos, mais lento do que uma função normal. É correto o que se afirma em: Sua resposta Incorreta II e III. Solução esperada III e IV. Questão 4 Correta Questão com problema? Conforme Mizrahi (2008) o escopo de uma variável é definido pelas regiões (blocos) onde a variável pode ser utilizada e é nesta hora que surge o conceitos das variáveis globais e variáveis locais. Variáveis globais são aquelas declaradas no início de um algoritmo. São visíveis, ou seja, podem ser utilizadas no algoritmo principal e por todos as funções. As variáveis locais são aquelas declaradas no início de uma função. São visíveis, ou seja, podem ser utilizadas somente pela função onde foram declaradas. Observe o programa a seguir: #include <stdio.h>int fat (int n){ int res = 1; while (n > 1) { res = res * n; n-- ; } return res;}int main ( ){ int n, res; printf("Entre com o valor de n: "); scanf("%d", &n); res = fat(n+1) / (n+1); printf("Fatorial de %d = %d\n", n, res ); return 0;} Considerando o programa apresentado, avalie as afirmativas a seguir: I. O programa apresentado está errado pois a variável res foi declarada duas vezes, causando um erro de compilação. II. A função fat está escrita antes da função main ( ) porém, o programa começa sempre pela função main ( ) independentemente da quantidade de funções que possam ter antes do main ( ). III. Para a função fat, o parâmetro n funciona como uma variável local (ou seja, válida dentro da função apenas), juntamente com a variável res. IV. A função fat possui a variável n e a variável n recebe seu valor no instante da chamada da função dentro da função main ( ). É correto o que se afirma em: Sua resposta Correta Apenas as afirmativas II, III e IV estão corretas. Questão 5 Correta Questão com problema? Segundo Manzano (2015) o escopo de uma variável é a relação de alcance que se tem com o local onde certo recurso se encontra definido, de modo que possa ser visualizado pelas várias partes do código de um programa. A figura a seguir demonstra o escopo das variáveis de um programa: Com base no contexto apresentado, avalie as seguintes asserções e a relação proposta entre elas: I. A utilização de variáveis globais permite otimizar a alocação de memória, pois em vários casos o desenvolvedor não precisará criar variáveis locais. Por outro lado, essa técnica de programação deve ser usada com cautela, pois variáveis locais são criadas e destruídas ao fim da função, enquanto as globais permanecem na memória durante todo o tempo de execução. PORQUE II. As variáveis locais são aquelas declaradas no início ou dentro de uma função. São visíveis no programa inteiro, ou seja, podem ser utilizadas por todo o programa. Não há diferenças efetivas no desempenho do programa entre usar variáveis globais e locais, deste modo é aconselhável deixar sempre as variáveis como globais. Analise atentamente as asserções e assinale a alternativa correta. Sua resposta Correta A asserção I é uma proposição verdadeira, e a II é uma proposição falsa. Questão 1 Respondida Talvez seja necessário saber quais elementos fazem parte de uma lista em determinado momento de um sistema. Para tal, é necessário percorrer toda a lista ligada para verificá-los. A lista ligada pode ser impressa com todos os seus elementos e é possível utilizar o trecho de código a seguir: void imprimir (Lista* l) { Lista* p; printf(“Elementos:\n”); Por ser uma função que percorrerá toda a lista e de impressão em tela, é possível declará-la como VOID, uma função que não retornará valor para a função principal. for (p = l; p != NULL; p = p -> prox) { printf(“ %d -> “, p -> info); } } Baseado no trecho de comando FOR, avalie as seguintes asserções e a relação proposta entre elas: I. Neste trecho, uma condição de repetição FOR percorre a lista e envia todos os elementos encontrados nela para a memória. PORQUE II. Na função principal, declara-se apenas a chamada da função imprimir(), passando como parâmetro a lista na qual deseja-se imprimir. A respeito dessas asserções, assinale a alternativa correta: • As asserções I e II são proposições verdadeiras, e a II é uma justificativa da I. • As asserções I e II são proposições verdadeiras, mas a II não é uma justificativa da I. • A asserção I é uma proposição verdadeira, e a II é uma proposição falsa. • A asserção I é uma proposição falsa, e a II é uma proposição verdadeira. • As asserções I e II são proposições falsas. Sua resposta As asserções I e II são proposições verdadeiras, mas a II não é uma justificativa da I. A asserção I é uma proposição falsa, e a asserção II é uma proposição verdadeira. I - FALSA - Neste trecho, uma condição de repetição FOR percorre a lista e IMPRIME todos os elementos encontrados nela. II - VERDADEIRA - Na função principal, declara-se apenas a chamada da função imprimir(), passando como parâmetro a lista na qual deseja-se imprimir. Questão 2 Respondida Com uma lista ligada criada, pode-se implementar o uso de funções para a remoção de elementos da lista. Segundo Celes (2004), a função para remover um elemento é mais trabalhosa e complexa, e precisa de informações como parâmetros de remoção, o valor do elemento e a lista. Assim, deve-se atualizar o valor da lista sem o elemento removido. Com base no conceito de remoção de elementos, analise julgue as afirmações que se seguem. I - Caso o primeiro elemento da lista seja o elemento a ser retirado, deve-se manter o valor da lista com o ponteiro para o primeiro elemento, já que o espaço alocado permanece no local. • II - Se o elemento a ser retirado da lista pela função estiver no meio desta, o elemento anterior deverá apontar para o elemento seguinte do qual será removido e, depois disso, liberar a alocação do elemento removido. III -Pode-se utilizar vários trechos de código em uma função para realizar as operações de remoção da lista, sendo do início ou de outra posição desta. É correto apenas o que • I. • II. • III. • II e III. • I e III. Sua resposta II e III. Com base no conceito de remoção de elementos, as asserções a seguir devem ser analisadas assim: I - FALSA - Caso o primeiro elemento da lista seja o elemento a ser retirado, deve- se ATUALIZAR o valor da lista com o ponteiro para o SEGUNDO ELEMENTO, LIBERANDO O ESPAÇO ALOCADO DO ELEMENTO RETIRADO. II - VERDADEIRA - Se o elemento a ser retirado da lista pela função estiver no meio desta, o elemento anterior deverá apontar para o elemento seguinte do qual será removido e, depois disso, liberar a alocação do elemento removido. III - FALSA - Pode-se utilizar UM ÚNICO TRECHO de código em uma função para realizar as operações de remoção da lista, sendo do início ou de outra posição desta. Questão 3 Respondida De acordo com Mizrahi (2008) as funções dividem grandes tarefas de programação em tarefas menores, permitindo aos programadores reprogramarem a partir de códigos que já foram produzidos, facilitando e acelerando o trabalho de programação. Observe o programa que demonstra o uso de uma função na linguagem C:#include <stdio.h>#define pi 3.1415float raio ( ){ float r, area; printf("Digite o raio: "); scanf("%f",&r); area = pi * r * r; }int main(){ float result; result = raio (); printf("Area do circulo = %.2f \n",result); return 0;} O programa demonstrado não compila pois possui um erro, escolha a opção correta que mostra o erro do programa. • O programa está errado pois não foi utilizado um ponto e vírgula após o int main ( ) e o programa deverá ficar da seguinte forma: int main ( ); . • O erro do programa é o tipo de retorno da função, deveria ser utilizado o tipo int, ficando da seguinte forma: int raio ( ); . • O problema do programa é que o nome da função é raio, como é um cálculo não podemos chamar uma função com o nome do cálculo que será executado. • O erro do programa está no return 0, quando há função no programa devemos obrigatoriamente utilizar o return 1. • O que causa o erro do programa é a falta do return na função raio ( ), o correto seria adicionar a seguinte linha: return area; isso fará com que o valor seja repassado para a variável result. Sua resposta O que causa o erro do programa é a falta do return na função raio ( ), o correto seria adicionar a seguinte linha: return area; isso fará com que o valor seja repassado para a variável result. A frase corretamente preenchida é: O que causa o erro do programa é a falta do return na função raio ( ), o correto seria adicionar a seguinte linha: return area; isso fará com que o valor seja repassado para a variável result.O programa deve ser criado da seguinte maneira: #include <stdio.h> #define pi 3.1415 float raio () { float r, area; printf("Digite o raio: "); scanf("%f",&r); area = pi * r * r; return area; //OBRIGATÓRIO } int main ( ) { float result; result = raio ( ); printf("Area do circulo = %.2f \n",result); return 0; } Questão 4 Respondida Podemos remover um elemento da lista ligada, porém é necessário ter certos cuidados. De acordo com Celes (2004), a função para remover um elemento é mais trabalhosa e complexa, e precisa de informações como parâmetros para remoção, o valor do elemento e a lista. Tendo como referência a remoção de elementos de lista, avalie as seguintes asserções e a relação proposta entre elas: I. Caso o primeiro elemento da lista seja o elemento a ser retirado, devemos atualizar o valor da lista com o ponteiro para o segundo elemento e assim, liberar o espaço alocado do elemento retirado. PORQUE II. Se o elemento a ser retirado da lista pela função estiver no meio da lista, o elemento anterior deve apontar para o elemento seguinte do qual será removido e, após isso, liberarmos a alocação do elemento removido. Agora assinale a alternativa correta. • As afirmativas I e II são falsas. • A afirmativa I é verdadeira e afirmativa II é falsa. • A afirmativa I é falsa e afirmativa II é verdadeira. • As afirmativas I e II são verdadeiras e a II é uma justificativa da I. • As afirmativas I e II são verdadeiras, mas a II não é uma justificativa da I. Sua resposta As afirmativas I e II são verdadeiras e a II é uma justificativa da I. Resolução: As duas afirmativas são verdadeiras e a segunda complementa a primeira. O primeiro elemento da lista seja o elemento a ser retirado, deve atualizar o valor da lista com o ponteiro para o segundo elemento e assim, liberar o espaço alocado do elemento retirado. Se o elemento a ser retirado da lista pela função estiver no meio da lista, o elemento anterior deve apontar para o elemento seguinte do qual será removido, e após isso, liberarmos a alocação do elemento removido. Questão 6 Sem resposta Uma estrutura de dados do tipo "pilha" representa um conjunto dinâmico cujos elementos são inseridos e retirados de acordo com o seguinte protocolo: o último elemento que entra no conjunto é o primeiro que sai. Este protocolo é amplamente conhecido como LIFO, do inglês Last in, First out (último a entrar, primeiro a sair). É possível inserir um elemento na pilha a qualquer momento, mas somente o elemento inserido mais recentemente pode ser removido a qualquer momento. Considere a pilha "p", bem como a função "func". Pilha "p": 4 <- topo 3 0 1 1 Função: void func(struct Pilha* p) { assert(p != NULL); struct Pilha* aux = criar(); int x = 0; while(vazia(p) == false) { empilhar(aux, desempilhar(p)); } while(vazia(aux) == false) { int elemento = desempilhar(aux); x += elemento; empilhar(p, elemento); } empilhar(p, x); liberar(aux); } Assinale a alternativa que apresenta corretamente o elemento que estará no topo da pilha "p", após a execução da função "func" sobre essa pilha. • 0. • 9. • 5. • 4. • A função contém erro e, portanto, não pode ser compilada e executada. Sua resposta 4. Alternativa correta: 9 Considerando a função "func" a seguir: 01. void func(struct Pilha* p) { 02. assert(p != NULL); 03. struct Pilha* aux = criar(); 04. int x = 0; 05. 06. while(vazia(p) == false) { 07. empilhar(aux, desempilhar(p)); 08. } 09. while(vazia(aux) == false) { 10. int elemento = desempilhar(aux); 11. x += elemento; 12. empilhar(p, elemento); 13. } 14. 15. empilhar(p, x); 16. liberar(aux); 17. } A função "func" é responsável por somar todos os elementos contidos em uma pilha e, posteriormente, empilhar o resultado nesta pilha. Contudo, para que isso seja feito sem alterar a ordem dos elementos da pilha "p", inicialmente os elementos devem ser inseridos em uma pilha auxiliar "aux" (linhas 6 a 8). Logo após, os elementos são removidos da pilha "aux" e devolvidos para a pilha "p" (linhas 9 a 13). Durante esse processo, os elementos da pilha são somados e o valor da soma é armazenado na variável "x" (linha 11). Por fim, o valor de "x" é empilhado na pilha "p" (linha 15). Dessa forma, o topo sempre conterá a soma de todos os elementos da pilha. Considerando a pilha "p" a seguir, o resultado a ser colocado no topo será 9. Pilha "p": 4 <- topo 3 0 1 1 Questão 8 Sem resposta Leia o trecho de programa a seguir: #include<stdio.h> int x = 10; int main(){ int x = - 1; int b; { extern int x; b = x; } printf("\n Valor de x = %d",x); printf("\n Valor de b (x global) = %d",b); return 0; } De acordo com o trecho de programa, analise as asserções a seguir: I - Na linguagem C, para acessar o valor de uma variável global dentro de uma função que possui uma variável local com mesmo nome, deve-se usar a instrução externa. PORQUE II - Utilizar variáveis globais e locais com mesmo nome na linguagem C necessita criar uma nova variável chamada “b”, com um bloco de instruções, que atribui à nova variável o valor “externo” de x. A respeito dessas asserções, assinale a alternativa correta: • As asserções I e II são proposições verdadeiras, e a II é uma justificativa da I. • As asserções I e II são proposições verdadeiras, mas a II não é uma justificativa da I. • A asserção I é uma proposição verdadeira, e a II é uma proposição falsa. • A asserção I é uma proposição falsa, e a II é uma proposição verdadeira. • As asserções I e II são proposições falsas. Sua resposta As asserções I e II são proposições verdadeiras, e a II é uma justificativa da I. As asserções I e II são proposições verdadeiras, mas a asserção II não é uma justificativa da asserção I. I - VERDADEIRA - Na linguagem C, para acessar o valor de uma variável global dentro de uma função que possui uma variável local com mesmo nome, deve-se usar a instrução extern. II - VERDADEIRA - Utilizar variáveis globais e locais com mesmo nome na linguagem C necessita criar uma nova variável chamada “b”, com um bloco de instruções, que atribui à nova variável o valor “externo” de x. Questão 9 Sem resposta Um mecanismo utilizado para organizar nossa informação e prover operações convenientes eeficientes para acessá-la e manipulá-la é conhecido como estrutura de dados. Diversos tipos de estruturas de dados têm sido propostas e o conhecimento das características dessas estruturas é um fator importante para a escolha da estrutura que melhor se encaixa na solução de um determinado problema. Considerando as informações apresentadas, analise as afirmativas a seguir: I. Em uma pilha, os elementos são inseridos no início e removidos do início, por isso esta estrutura de dados é conhecida como FIFO (First in, First out). II. A operação “remover do início” pode ser facilmente realizada nas estruturas de dados lista e fila, computacionalmente falando. Esta operação pode ser realizada em ambas as estruturas com uma quantidade constante de passos, independentemente da quantidade de elementos. III. A função "free()", pertencente à biblioteca “stdlib.h”, é utilizada para liberar o espaço reservado da memória, quando a mesma não for mais necessária. Considerando o contexto apresentado, é correto o que se afirma em: • I, apenas. • I e II, apenas. • II e III, apenas. • III, apenas. • I, II e III. Sua resposta III, apenas. Alternativa correta: II e III, apenas. I. Em uma pilha, os elementos são inseridos no início e removidos do início, por isso esta estrutura de dados é conhecida como FIFO (First in, First out). INCORRETA, pois em uma pilha, os elementos são inseridos no início e removidos do topo, por isso esta estrutura de dados é conhecida como LIFO (Last in, First out). II. A operação “remover do início” pode ser facilmente realizada nas estruturas de dados lista e fila, computacionalmente falando. Esta operação pode ser realizada em ambas as estruturas com uma quantidade constante de passos, independentemente da quantidade de elementos. CORRETA, pois tanto no caso da fila quanto da lista, é possível acessar o primeiro elemento de forma direta, por meio do ponteiro "inicio", facilitando assim a remoção desse elemento. III. A função "free()", pertencente à biblioteca “stdlib.h”, é utilizada para liberar o espaço reservado da memória, quando a mesma não for mais necessária. CORRETA, pois a função "free()" deve ser utilizada sempre que se deseja desalocar um espaço de memória anteriormente reservado com a função "malloc". Questão 10 Sem resposta Nas linguagens de programação funcional, diz-se que é possível evitar estouros de pilha usando "recursão de cauda". A diferença entre recursiva normal e de cauda é justamente aonde a chamada recursiva é chamada. Caso seja chamada na "cauda" da função, é uma chamada de cauda recursiva. A "cauda" da função é sua última chamada. É a última computação / cálculo feito pela função, e logo depois dela, nenhum tratamento é feito antes de retornar seu valor. Neste contexto, analise as figuras 16(a) e 16(b). Figura 16 – (a) recursão normal e (b) recursão de cauda Considerand o as imagens apresentadas julgue as afirmações que se seguem. I - Na figura 16(a), cada chamada recursiva aumenta porque o programa só pode calcular o resultado da primeira função chamada, para depois calcular o resultado das que a chamaram. Assim, a pilha estoura. II - Na figura 16(b), cada passo de chamadas nem aumenta nem diminui. A partir do momento que a função recursiva é chamada, todas são chamadas no final, sem precisar de mais cálculos. III - Quando um compilador pronto para isso vê uma chamada recursiva na cauda, ele automaticamente a transforma em um laço durante as otimizações. Desta forma não perde as vantagens, nem a elegância da programação funcional, mas também não corre o risco de passar por um estouro de pilha. É correto apenas o que se afirma em: • III. • II e III. • II. • I e II. • I. Sua resposta III. I - FALSA - Na figura 16(a), cada chamada recursiva aumenta porque o programa só pode calcular o resultado da primeira função chamada, para depois calcular o resultado das que a chamaram. Assim, a pilha estoura. O CORRETO É: Na figura 16(a), A CADA chamada recursiva, O NÚMERO DE FUNÇÕES aumenta porque o programa só pode calcular o resultado da ÚLTIMA função chamada, para depois calcular o resultado das que a chamaram. Assim, a pilha estoura. II - FALSA - Na figura 16(b), cada passo de chamadas nem aumenta nem diminui. A partir do momento que a função recursiva é chamada, todas são chamadas no final, sem precisar de mais cálculos. O CORRETO É: Na figura 16(b), A CADA PASSO, A QUANTIDADE de chamadas nem aumenta nem diminui. A partir do momento que a função recursiva é chamada, APENAS ELA é chamada no final, sem precisar de mais cálculos. III - VERDADEIRA - Quando um compilador pronto para isso vê uma chamada recursiva na cauda, ele automaticamente a transforma em um laço durante as otimizações. Desta forma não perde as vantagens, nem a elegância da programação funcional, mas também não corre o risco de passar por um estouro de pilha. Questão 1 Correta Questão com problema? Para criar uma função utiliza-se a seguinte sintaxe: <tipo de retorno> <nome> (<parâmetros>) { <comandos da função> <retorno> ( ) } Para cada declaração da função existem parâmetros que são obrigatórios e outros que são opcionais. Neste contexto, relacione a Coluna A que contém as sintaxe com a Coluna B que contém as funções. Coluna A (Sintaxe) Coluna B (Função) I. <tipo de retorno> A. Identificará a função. II. <nome> B. Indica qual o tipo de valor a função retornará. III. <parênteses depois do nome> C. Toda função terá o nome acompanhado por eles. IV. <comandos da função> D. Se for void é opcional, porém, quando não for void é obrigatório. V. <retorno> E. Só justifica criar se tiver um conjunto de comandos para realizar. Assinale a alternativa que contém a associação correta entre as colunas: Sua resposta Correta I-B / II-A / III-C / IV-E / V-D. Comentário I-B / II-A / III-C / IV-E / V-D. <tipo de retorno> - Indica qual o tipo de valor a função retornará. <nome> - Identificará a função. <parênteses depois do nome> - Toda função terá o nome acompanhado por eles. <comandos da função> - Só justifica criar se tiver um conjunto de comandos para realizar. <retorno> - Se for void é opcional, porém, quando não for void é obrigatório. Questão 2 Correta Questão com problema? Conforme Mizrahi (2008) o escopo de uma variável é definido pelas regiões (blocos) onde a variável pode ser utilizada e é nesta hora que surge o conceitos das variáveis globais e variáveis locais. Variáveis globais são aquelas declaradas no início de um algoritmo. São visíveis, ou seja, podem ser utilizadas no algoritmo principal e por todos as funções. As variáveis locais são aquelas declaradas no início de uma função. São visíveis, ou seja, podem ser utilizadas somente pela função onde foram declaradas. Observe o programa a seguir: #include <stdio.h>int fat (int n){ int res = 1; while (n > 1) { res = res * n; n-- ; } return res;}int main ( ){ int n, res; printf("Entre com o valor de n: "); scanf("%d", &n); res = fat(n+1) / (n+1); printf("Fatorial de %d = %d\n", n, res ); return 0;} Considerando o programa apresentado, avalie as afirmativas a seguir: I. O programa apresentado está errado pois a variável res foi declarada duas vezes, causando um erro de compilação. II. A função fat está escrita antes da função main ( ) porém, o programa começa sempre pela função main ( ) independentemente da quantidade de funções que possam ter antes do main ( ). III. Para a função fat, o parâmetro n funciona como uma variável local (ou seja, válida dentro da função apenas), juntamente com a variável res. IV. A função fat possui a variáveln e a variável n recebe seu valor no instante da chamada da função dentro da função main ( ). É correto o que se afirma em: Sua resposta Correta Apenas as afirmativas II, III e IV estão corretas. Comentário A frase corretamente preenchida é: Apenas as afirmativas II, III e IV estão corretas. A função main e fat possuem ambas variáveis com o nome res, e que main possui uma variável chamada n, que é o nome do parâmetro da função fat. Apesar do mesmo nome, elas são variáveis diferentes. Para a função fat, o parâmetro n funciona como uma variável local (ou seja, válida dentro da função apenas), juntamente com a variável res. A diferença é que o parâmetro n recebe seu valor no instante da chamada. O programa sempre inicia sua execução pela função main. Questão 3 Correta Questão com problema? A recursividade é uma técnica programação usada para tornar o código mais elegante, organizado, o que pode facilitar a manutenção. Essa técnica, em muitos casos, pode ser usada para substituir uma estrutura de repetição iterativa, por exemplo, uma que use o comando for. Uma função recursiva pode substituir uma estrutura de repetição, porém nem sempre é viável, visto os recursos computacionais necessários para a execução da recursividade. Uma função recursiva funciona como um laço de repetição, o qual, será interrompido somente quando o caso base for satisfeito. Considerando o contexto, avalie o programa a seguir, observando as duas funções criadas sobre a recursividade. #include <stdio.h> int fatNaoRecursivo(int n){ if(n<2) return 1; int f=1; int i; for(i=2; i<=n; i++) f*=i; return f; } int fatRecursivo(int n){ if(n<2) return 1; return fatRecursivo(n-1)*n; } int main() { printf("%d\n",fatNaoRecursivo(6)); printf("%d\n",fatRecursivo(6)); return 0; } Analisando o programa proposto, assinale a alternativa correta. Sua resposta Correta O programa demonstra o uso de duas funções, uma com recursividade e a outra não, as duas funções funcionam, a diferença está na quantidade de linha entre as duas técnicas. e não há erros de compilação. Comentário A frase corretamente preenchida é: O programa demonstra o uso de duas funções, uma com recursividade e a outra não, as duas funções funcionam, a diferença está na quantidade de linha entre as duas técnicas. O programa apresenta a diferença entre uma função com recursividade e uma função sem recursividade, podemos observar que existe uma grande diminuição na quantidade de linhas utilizadas para programar. Questão 4 Correta Questão com problema? Conforme Soffner (2013) a utilização funções com de passagem de parâmetros por referência está diretamente ligada aos conceitos de ponteiro e endereço de memória. A ideia da técnica é análoga a passagem por valores, ou seja, a função será definida de modo a receber certos parâmetros e “quem” faz a chamada do método deve informar esses argumentos. Entretanto, o comportamento e o resultado são diferentes. Na passagem por referência não será criada uma cópia dos argumentos passados, na verdade, será passado o endereço da variável e função irá trabalhar diretamente com os valores ali armazenados. Observe o programa a seguir: #include <stdio.h>int testar (int* n1, int* n2){ *n1 = -1; *n2 = -2; printf("\n\n Valores dentro da função testar(): "); printf("\n n1 = %d e n2 = %d",*n1,*n2); return 0;}int main ( ){int n1 = 10;int n2 = 20;printf("\n\n Valores antes de chamar a função: ");printf("\n n1 = %d e n2 = %d",n1,n2);testar(&n1, &n2);printf("\n\n Valores depois de chamar a função: ");printf("\n n1 = %d e n2 = %d",n1,n2);return 0;} Analisando o contexto e o programa apresentado, assinale a alternativa correta quanto ao uso dos sinais * (asterisco) e & (e comercial): Sua resposta Correta O * é para o ponteiro e o & é para a passagem de parâmetros por referência. Comentário A frase corretamente preenchida é: O * é para o ponteiro e o & é para a passagem de parâmetros por referência. Com o uso do & a passagem por referência, os valores das variáveis são alterados. Usamos asterisco para o ponteiro acessar o conteúdo guardado dentro do endereço que ele aponta. Questão 5 Correta Questão com problema? Conforme Salvetti e Barbosa (1998) as variáveis e constantes, são espaços reservados na memória RAM (Random Access Memory - Memória de Acesso Aleatório) do computador para guardar informações que serão utilizadas durante o código do programa. Podem ter valores de diversos tamanhos e tipos, tais como números inteiros, números reais, caracteres, frases, enfim, diversas coisas. Fonte:SALVETTI, D. D., BARBOSA, L. M. Algoritmos. São Paulo: Makron Books, 1998. Com base no contexto apresentado, avalie as seguintes asserções e a relação proposta entre elas: I. Para usar de forma mais otimizada a memória RAM do computador, existe uma alternativa chamada recursividade em cauda. Nesse tipo de técnica a recursividade funcionará como uma função iterativa. PORQUE II. Uma função é caracterizada como recursiva em cauda quando a chamada a si mesmo é a última operação a ser feita no corpo da função. Nesse tipo de função, o caso base costuma ser passado como parâmetro, o que resultará em um comportamento diferente. Analise atentamente as asserções e assinale a alternativa correta. Sua resposta Correta As asserções I e II são proposições verdadeiras, e a II é uma justificativa da I. Comentário A frase corretamente preenchida é: As asserções I e II são proposições verdadeiras, mas a II é uma justificativa da I. Para otimizar a memória, utilizamos a recursividade em cauda. Nesse tipo de técnica a recursividade funcionará como uma função iterativa. Porque, uma função é caracterizada como recursiva em cauda quando a chamada a si mesmo é a última operação a ser feita no corpo da função. Nesse tipo de função, o caso base costuma ser passado como parâmetro, o que resultará em um comportamento diferente. Questão 1 Correta Questão com problema? As listas ligadas são estruturas de dados conhecidas por serem flexíveis quanto às suas operações e seu tamanho é dinâmico. Toda lista é composta por nós, e o nó é um conjunto de informações que permitem apontar para o próximo elemento. Considere a organização das pessoas na fila do banco, porém seu funcionamento coerente depende do comportamento da lista ligada, então aplique o conceito de inserção em listas ligadas para assinalar a alternativa correta: Sua resposta Correta As listas permitem inserção de elementos em qualquer posição. Comentário As listas permitem inserção de elementos em qualquer posição, basta que os ponteiros sejam atualizados para isto. Questão 2 Correta Questão com problema? A pilha representa um conjunto dinâmico cujos elementos são inseridos e retirados de acordo com o seguinte protocolo: o último elemento que entra no conjunto é o primeiro que sai. Este protocolo é amplamente conhecido como LIFO, do inglês Last in, First out (último a entrar, primeiro a sair). Em uma pilha, a inserção dos elementos X, K, L, M, J, R, P, Q, na respectiva ordem e a remoção de quatro elementos, resulta no topo da pilha com o dado Sua resposta Correta M. Comentário Alternativa correta: M Deve-se atentar para a ordem de inserção dos elementos, bem como para o protocolo da pilha (último a entrar, primeiro a sair). A seguir, são apresentados os efeitos das operações mencionadas sobre uma pilha inicialmente vazia: Inserção dos elementos: Q <- topo P R J M L K X Remoção de quatro elementos: M <- topo L K X Questão 3 Correta Questão com problema? A lista representa um conjunto dinâmico cujos elementos podem ser inseridos e retirados de qualquer parte da estrutura. Dentre as principais operaçõesque devem estar presentes em uma ED do tipo fila estão: inserir, remover e obter. Chamamos de "assinatura de uma função", a primeira linha da declaração de uma função, na qual podemos identificar o seu tipo de retorno, seu nome (identificador) e sua lista de parâmetros. Com base no que foi apresentado, assinale a alternativa que representa corretamente a assinatura da função "obter" de uma lista. Sua resposta Correta int obter(struct Lista* li, int pos) Comentário Alternativa correta: int obter(struct Lista* li, int pos) void obter(struct Lista* li). INCORRETA, pois a função deveria receber a posição do elemento a ser obtido da lista. Além disso, seu tipo de retorno deveria ser "int", uma vez que o elemento obtido deve ser retornado pela função. int obter(struct Lista* li). INCORRETA, pois a função deveria receber a posição do elemento a ser obtido da lista. void obter(struct Lista* li, int pos). INCORRETA, pois o tipo de retorno deveria ser "int", uma vez que o elemento obtido deve ser retornado pela função. int obter(struct Lista* li, int pos). CORRETA, pois a função recebe a lista a partir da qual o elemento deve ser obtido. Além disso, seu tipo de retorno é "int", uma vez que o elemento obtido deve ser retornado pela função. Por fim, recebe a posição do elemento a ser obtido da lista. int obter(struct Lista* li). INCORRETA, pois a função deveria receber a posição do elemento a ser obtido da lista. int obter(int pos). INCORRETA, pois a função deveria receber a lista a partir da qual o elemento deve ser obtido. Questão 4 Correta Questão com problema? Um mecanismo utilizado para organizar nossa informação e prover operações convenientes e eficientes para acessá-la e manipulá-la é conhecido como estrutura de dados. Diversos tipos de estruturas de dados têm sido propostas e o conhecimento das características dessas estruturas é um fator importante para a escolha da estrutura que melhor se encaixa na solução de um determinado problema. Considerando as informações apresentadas, analise as afirmativas a seguir: I. Em uma pilha, os elementos são inseridos no início e removidos do início, por isso esta estrutura de dados é conhecida como FIFO (First in, First out). II. A operação “remover do início” pode ser facilmente realizada nas estruturas de dados lista e fila, computacionalmente falando. Esta operação pode ser realizada em ambas as estruturas com uma quantidade constante de passos, independentemente da quantidade de elementos. III. A função "free()", pertencente à biblioteca “stdlib.h”, é utilizada para liberar o espaço reservado da memória, quando a mesma não for mais necessária. Considerando o contexto apresentado, é correto o que se afirma em: Sua resposta Correta II e III, apenas. Comentário Alternativa correta: II e III, apenas. I. Em uma pilha, os elementos são inseridos no início e removidos do início, por isso esta estrutura de dados é conhecida como FIFO (First in, First out). INCORRETA, pois em uma pilha, os elementos são inseridos no início e removidos do topo, por isso esta estrutura de dados é conhecida como LIFO (Last in, First out). II. A operação “remover do início” pode ser facilmente realizada nas estruturas de dados lista e fila, computacionalmente falando. Esta operação pode ser realizada em ambas as estruturas com uma quantidade constante de passos, independentemente da quantidade de elementos. CORRETA, pois tanto no caso da fila quanto da lista, é possível acessar o primeiro elemento de forma direta, por meio do ponteiro "inicio", facilitando assim a remoção desse elemento. III. A função "free()", pertencente à biblioteca “stdlib.h”, é utilizada para liberar o espaço reservado da memória, quando a mesma não for mais necessária. CORRETA, pois a função "free()" deve ser utilizada sempre que se deseja desalocar um espaço de memória anteriormente reservado com a função "malloc". Questão 5 Correta Questão com problema? A professora de uma escola teve a ideia de pedir que os alunos que apresentassem uma breve palestra sobre alguns assuntos da atualidade. Para isso, ela dividiu a turma em grupos e pediu que eles mesmos escolhessem os assuntos com os quais gostariam de trabalhar. Contudo, para que não houvesse dois ou mais grupos com o mesmo assunto, ela definiu o seguinte protocolo: o grupo que primeiro se cadastrar no fórum virtual da disciplina, será o primeiro a escolher o assunto da sua palestra. O segundo a realizar o cadastro, será o segundo a escolher o assunto, não podendo escolher o assunto já definido para o primeiro grupo, e assim sucessivamente. Considerando o contexto anterior, assinale a alternativa que apresenta corretamente o tipo de estrutura de dados cujo protocolo de manipulação dos elementos é idêntico ao adotado pela professora. Sua resposta Correta Fila. Comentário Alternativa correta: Fila. Fila. CORRETA, pois a fila representa um conjunto dinâmico, cujos elementos são inseridos e retirados de acordo com o seguinte protocolo: o primeiro elemento que entra no conjunto é o primeiro que sai. Este protocolo é amplamente conhecido como FIFO, do inglês First in, First out (primeiro a entrar, primeiro a sair). Aplicando esse conceito ao problema em questão, o primeiro grupo a se cadastrar no fórum da disciplina, será o primeiro a escolher o assunto da palestra. Pilha. INCORRETA, pois em uma pilha, o último elemento a ser inserido é o primeiro a sair. Assim, é como se o último grupo a se cadastrar fosse o primeiro a escolher o assunto da palesta. Lista simples e Lista dupla. INCORRETAS, pois essas duas estruturas de dados permitem a manipulação de elementos em qualquer ordem. Assim, é como se um grupo aleatoriamente escolhesse o assunto da palestra em primeiro lugar. Pilha dupla. INCORRETA, pois a "Pilha dupla" não é uma estrutura de dados conhecida. Questão 1 Respondida Conforme Soffner (2013) a utilização funções com de passagem de parâmetros por referência está diretamente ligada aos conceitos de ponteiro e endereço de memória. A ideia da técnica é análoga a passagem por valores, ou seja, a função será definida de modo a receber certos parâmetros e “quem” faz a chamada do método deve informar esses argumentos. Entretanto, o comportamento e o resultado são diferentes. Na passagem por referência não será criada uma cópia dos argumentos passados, na verdade, será passado o endereço da variável e função irá trabalhar diretamente com os valores ali armazenados. Observe o programa a seguir: #include <stdio.h>int testar (int* n1, int* n2){ *n1 = - 1; *n2 = -2; printf("\n\n Valores dentro da função testar(): "); printf("\n n1 = %d e n2 = %d",*n1,*n2); return 0;}int main ( ){int n1 = 10;int n2 = 20;printf("\n\n Valores antes de chamar a função: ");printf("\n n1 = %d e n2 = %d",n1,n2);testar(&n1, &n2);printf("\n\n Valores depois de chamar a função: ");printf("\n n1 = %d e n2 = %d",n1,n2);return 0;} Analisando o contexto e o programa apresentado, assinale a alternativa correta quanto ao uso dos sinais * (asterisco) e & (e comercial): • O * é para a passagem de parâmetros por valor e o & é para a passagem de parâmetros por referência. • O * é para o ponteiro e o & é para a passagem de parâmetros por referência. • O * é para o vetor e o & é para o ponteiro. • O * é para o ponteiro e o & é para a variável local. • O * é para variável local e o & é para a variável global. Sua resposta O * é para o ponteiro e o & é para a passagem de parâmetros por referência. Questão 2 Respondida Diferentes estruturas elementares de dados implementam diferentes protocolos de manipulação de elementos. Esses protocolos ditam como os elementos de uma estrutura de dados podem ser inseridos, removidos e consultados. Sabendo disso, assinale a alternativa querepresenta corretamente o nome das estruturas que implementam os protocolos FIFO e LIFO, respectivamente. • Fila e Lista. • Lista e Fila. • Pilha e Fila. • Pilha e Lista. • Fila e Pilha. Sua resposta Fila e Pilha. Questão 3 Respondida Com uma lista ligada criada, pode-se implementar o uso de funções para a remoção de elementos da lista. Segundo Celes (2004), a função para remover um elemento é mais trabalhosa e complexa, e precisa de informações como parâmetros de remoção, o valor do elemento e a lista. Assim, deve-se atualizar o valor da lista sem o elemento removido. Com base no conceito de remoção de elementos, analise julgue as afirmações que se seguem. I - Caso o primeiro elemento da lista seja o elemento a ser retirado, deve-se manter o valor da lista com o ponteiro para o primeiro elemento, já que o espaço alocado permanece no local. • II - Se o elemento a ser retirado da lista pela função estiver no meio desta, o elemento anterior deverá apontar para o elemento seguinte do qual será removido e, depois disso, liberar a alocação do elemento removido. III -Pode-se utilizar vários trechos de código em uma função para realizar as operações de remoção da lista, sendo do início ou de outra posição desta. É correto apenas o que • I. • II. • III. • II e III. • I e III. Sua resposta II. Questão 4 Respondida Uma Fila é um conjunto ordenado de itens, na qual itens podem ser extraídos de sua extremidade inicial e novos itens podem ser inseridos na sua extremidade final. Observe a imagem a seguir. Associe as colunas que descrevem as principais operações com Filas: • 1. Inicializar • 2. Empilhar • 3. Desempilhar • 4. Frente • 5. Vazia A. Insere um elemento no fundo (cauda) da fila. B. Retorna o elemento que está na frente (cabeça) da fila. C. Indica se a fila está vazia. D. Retira um elemento que está na frente (cabeça) da fila. E. Cria uma fila vazia. Analise os itens de cada coluna e após escolha a alternativa verdadeira que corresponde a associação correta entre os itens: • 1 – C; 2 – A; 3 – B; 4 – D; 5 – E. • 1 – E; 2 – A; 3 – D; 4 – B; 5 – C. • 1 – E; 2 – D; 3 – A; 4 – C; 5 – B. • 1 – C; 2 – A; 3 – D; 4 – B; 5 – E. • 1 – E; 2 – A; 3 – C; 4 – B; 5 – D. Sua resposta 1 – E; 2 – A; 3 – D; 4 – B; 5 – C. Questão 5 Respondida Segundo Silva (2007), as Filas não apresentam uma solução completa, sendo que, mesmo chegando ao final do vetor poderemos ter a Fila cheia mesmo não estando cheia, uma vez que elementos podem ter sido removidos e para isso, podemos utilizar as Filas Circulares como solução para esta situação. Uma Fila Circular utiliza menos instruções a serem executadas, podendo ser mais adequada e eficiente na utilização de programação. Diferentemente da estrutura de Fila, a Fila Circular possui a seguinte definição, em sua implementação, quanto a variáveis: • I. Um vetor para os elementos; • II. Um valor inteiro para o tamanho da Fila; III. Um valor inteiro para o início da Fila; IV. Um valor inteiro para o fim da Fila. Analise atentamente as afirmativas e escolha a opção correta sobre a estrutura de Fila Circular: • Somente a afirmativa IV estão corretas. • Somente as afirmativas I e II estão corretas. • Somente as afirmativas II e III estão corretas. • Somente as afirmativas I, III e IV estão corretas. • As afirmativas I, II, III e IV estão corretas. Sua resposta Somente as afirmativas I, III e IV estão corretas. As afirmativas I, II, III e IV estão corretas. As afirmativas apresentam a definição, em sua implementação,da Fila Circular. Questão 6 Sem resposta Analise o trecho de programa a seguir: #include<stdio.h> #include<stdlib.h> int* alocar(){ return malloc(200); } int main(){ int *memoria; memoria = alocar(); if(memoria != NULL){ printf("Endereco de memoria alocada = %x",memoria); } else{ printf("Memoria nao alocada"); } return 0; } Agora, avalie as seguintes asserções e a relação proposta entre elas. I - Foi criado um ponteiro inteiro e, após a função ser chamada, seu resultado foi armazenado no ponteiro chamado memoria. PORQUE II - Se o valor do ponteiro memoria é diferente de NULL, então sabe-se que a alocação foi feita com sucesso e imprime o endereço da primeira posição, caso contrário, o usuário é informado que a memória não foi alocada. A respeito dessas asserções, assinale a alternativa correta: • As asserções I e II são proposições verdadeiras, e a II é uma justificativa da I. • As asserções I e II são proposições verdadeiras, mas a II não é uma justificativa da I. • A asserção I é uma proposição verdadeira, e a II é uma proposição falsa. • A asserção I é uma proposição falsa, e a II é uma proposição verdadeira. • As asserções I e II são proposições falsas. Sua resposta As asserções I e II são proposições verdadeiras, e a II é uma justificativa da I. As asserções I e II são proposições verdadeiras, mas a asserção II não é uma justificativa da asserção I. I - VERDADEIRA - Foi criado um ponteiro inteiro e, após a função ser chamada, seu resultado foi armazenado no ponteiro chamado memoria. II - VERDADEIRA - Se o valor do ponteiro memoria é diferente de NULL, então sabe-se que a alocação foi feita com sucesso e imprime o endereço da primeira posição, caso contrário, o usuário é informado que a memória não foi alocada. Questão 7 Sem resposta Um dos problemas mais comuns para solucionar com pilhas são os labirintos. Estes são desafios criados como problematização de estrutura de dados. As pilhas podem ser aplicadas também no uso de algoritmos de Backtracking, que consiste em criar marcações para onde o algoritmo pode retornar. Em um labirinto, por exemplo, para encontrar um caminho correto, pode-se andar pelo labirinto até encontrar uma divisão nesse caminho. Assim, adiciona-se a posição onde a divisão ocorre, junto ao caminho escolhido na pilha, e segue-se por ele. Caso o caminho escolhido não possua uma saída, é removido o ponto anterior da pilha, voltando ao último ponto em que o labirinto se dividiu, e recomeça-se por um outro caminho ainda não escolhido, adicionando na pilha o novo caminho. O algoritmo de Backtracking pode ser aplicado também como operação de desfazer. Baseado no algoritmo de Backtracking, complete as lacunas da asserção a seguir: Considerando o contexto apresentado, complete as lacunas a seguir: Para implementar a operação de Backtracking, as ações são ____________ em ____________ e, caso a ____________ seja realizada, o estado anterior do sistema pode ser ____________, ou a ação ____________ pode ser executada. Assinale a alternativa que completa corretamente as lacunas: • armazenadas / uma pilha / operação de refazer / restaurado / realizada. • aplicadas / uma pilha / operação de desfazer / eliminado / contrária à realizada. • armazenadas / uma pilha / operação de desfazer / restaurado / contrária à realizada. • armazenadas / várias pilhas / operação de desfazer / eliminado / realizada. • aplicadas / uma pilha / operação de refazer / restaurado / contrária à realizada. Sua resposta armazenadas / uma pilha / operação de desfazer / restaurado / contrária à realizada. Questão 8 Sem resposta A fila representa um conjunto dinâmico, cujos elementos são inseridos e retirados de acordo com o seguinte protocolo: o primeiro elemento que entra no conjunto é o primeiro que sai. Este protocolo é amplamente conhecido como FIFO, do inglês First in, First out (primeiro a entrar, primeiro a sair). Ou seja, é possível inserir um elemento na fila a qualquer momento, mas somente o elemento que está na fila há mais tempo pode ser removido a qualquer momento. Dentre as principais operações que devem estar presentes em uma Estrutura de Dados do tipo fila estão: enfileirar, desenfileirare inicio. Chamamos de "assinatura de uma função", a primeira linha da declaração de uma função, na qual podemos identificar o seu tipo de retorno, seu nome (identificador) e sua lista de parâmetros. Com base no que foi apresentado, assinale a alternativa que representa corretamente a assinatura da função "enfileirar" de uma fila. • void enfileirar(struct Fila* f) • int enfileirar(struct Fila* f) • void enfileirar(struct Fila* f, int item) • void enfileirar(int item) • void enfileirar(struct Fila* f, int item, int pos) Sua resposta int enfileirar(struct Fila* f) Alternativa correta: void enfileirar(struct Fila* f, int item) void enfileirar(struct Fila* f). INCORRETA, pois falta informar o item a ser enfileirado. int enfileirar(struct Fila* f), INCORRETA, pois falta informar o item a ser enfileirado. Além disso, a função enfileirar não retorna qualquer valor, portanto, seu tipo de retorno deveria ser "void". void enfileirar(struct Fila* f, int item). CORRETA, pois informa corretamente a fila em que o elemento será inserido, o item a ser inserido e como a função não retorna qualquer valor, seu tipo de retorno é "void". void enfileirar(int item). INCORRETA, pois não informa a fila em que o elemento será inserido. void enfileirar(struct Fila* f, int item, int pos). INCORRETA, pois há um parâmetro desnecessário na assinatura da função, a saber "pos". Um vez que, em uma fila, os elementos são inseridos apenas no final, não há necessidade de se informar a posição em que o elemento deve ser inserido. Questão 9 Sem resposta A pilha é uma das estruturas de dados mais simples, apesar de estar entre as mais importantes, uma vez que são utilizadas em diversos tipos de aplicações, desde aplicações de escritório até sistemas operacionais e compiladores. Levando em consideração a estrutura de dados do tipo “Pilha”, analise as afirmativas a seguir: I. O elemento a ser removido da pilha é o que está há menos tempo na estrutura de dados. II. O elemento a ser removido da pilha é o que está há mais tempo na estrutura de dados. III. O elemento a ser inserido é colocado na base da pilha. Considerando o contexto apresentado, é correto o que se afirma em: • I, apenas. • I e III, apenas. • II, apenas. • II e III, apenas. • III, apenas. Sua resposta I, apenas. Questão 10 Sem resposta Conforme Mizrahi (2008) o escopo de uma variável é definido pelas regiões (blocos) onde a variável pode ser utilizada e é nesta hora que surge o conceitos das variáveis globais e variáveis locais. Variáveis globais são aquelas declaradas no início de um algoritmo. São visíveis, ou seja, podem ser utilizadas no algoritmo principal e por todos as funções. As variáveis locais são aquelas declaradas no início de uma função. São visíveis, ou seja, podem ser utilizadas somente pela função onde foram declaradas. Observe o programa a seguir: #include <stdio.h>int fat (int n){ int res = 1; while (n > 1) { res = res * n; n-- ; } return res;}int main ( ){ int n, res; printf("Entre com o valor de n: "); scanf("%d", &n); res = fat(n+1) / (n+1); printf("Fatorial de %d = %d\n", n, res ); return 0;} Considerando o programa apresentado, avalie as afirmativas a seguir: I. O programa apresentado está errado pois a variável res foi declarada duas vezes, causando um erro de compilação. II. A função fat está escrita antes da função main ( ) porém, o programa começa sempre pela função main ( ) independentemente da quantidade de funções que possam ter antes do main ( ). III. Para a função fat, o parâmetro n funciona como uma variável local (ou seja, válida dentro da função apenas), juntamente com a variável res. IV. A função fat possui a variável n e a variável n recebe seu valor no instante da chamada da função dentro da função main ( ). É correto o que se afirma em: • Apenas as afirmativas II, III e IV estão corretas. • Apenas as afirmativas I, III e IV estão corretas. • Apenas as afirmativas I, II e III estão corretas. • Apenas as afirmativas I, II e IV estão corretas. • As afirmativas I, II, III e IV estão corretas. Sua resposta Apenas as afirmativas II, III e IV estão corretas. Questão 1 Respondida Podemos remover um elemento da lista ligada, porém é necessário ter certos cuidados. De acordo com Celes (2004), a função para remover um elemento é mais trabalhosa e complexa, e precisa de informações como parâmetros para remoção, o valor do elemento e a lista. Tendo como referência a remoção de elementos de lista, avalie as seguintes asserções e a relação proposta entre elas: I. Caso o primeiro elemento da lista seja o elemento a ser retirado, devemos atualizar o valor da lista com o ponteiro para o segundo elemento e assim, liberar o espaço alocado do elemento retirado. PORQUE II. Se o elemento a ser retirado da lista pela função estiver no meio da lista, o elemento anterior deve apontar para o elemento seguinte do qual será removido e, após isso, liberarmos a alocação do elemento removido. Agora assinale a alternativa correta. • As afirmativas I e II são falsas. • A afirmativa I é verdadeira e afirmativa II é falsa. • A afirmativa I é falsa e afirmativa II é verdadeira. • As afirmativas I e II são verdadeiras e a II é uma justificativa da I. • As afirmativas I e II são verdadeiras, mas a II não é uma justificativa da I. Sua resposta As afirmativas I e II são verdadeiras e a II é uma justificativa da I. Questão 2 Respondida Uma lista ligada ou lista encadeada é uma forma de estruturar dados para o seu armazenamento, ou seja, é determinar a forma de inseri-los ou removê-los, sendo necessário organizá-los em células e inserir um ponteiro que aponte para o primeiro elemento e outro que aponte para o seu fim. De acordo com Salvetti (1998, p.147) a busca consiste em verificar se um valor dado ocorre ou não na lista. Na Figura-1 podemos visualizar a função de busca em uma lista. Figura-1 - Lista de Busca Fonte: Werlich, 2017. Com base nas funcionalidades de busca de uma lista ligada, apresentada na Figura-1, avalie a sequência de busca proposta a seguir: • 1. Recebe a informação referente ao elemento a pesquisar • 2. Retorna NULL, caso o elemento não seja encontrado na lista. • 3. Retorna o ponteiro do nó da lista que representa o elemento. • 4. Percorre a lista até encontrar o elemento ou chegar ao fim da lista. A seguir assinale a alternativa que apresenta a ordem correta dos procedimentos realizados pela função. • 1 - 2 - 3 - 4 • 1 - 4 - 3 - 2 • 4 - 2 - 3 - 1 • 2 - 4 - 3 - 1 • 3 - 2 - 1 - 4 Sua resposta 1 - 4 - 3 - 2 Questão 3 Respondida Lista duplamente encadeada: Segundo ORTH (2002) afirma que Listas Duplamente Encadeadas possuem além de seus campos, mais dois nós (ou nodos). Um nó aponta para o próximo elemento da lista e outro para o último elemento da lista. Observe a Figura-1 a seguir. Figura-1 - Lista Duplamente Encadeada Fonte: Werlich, 2017. Com relação a Lista Ligada Duplamente Encadeada, avalie as seguintes afirmativas: I.Cada elemento tem um ponteiro para o próximo elemento e um ponteiro para o elemento anterior. • II.Dado um elemento, é possível acessar o próximo elemento e o elemento anterior. III. Dado um ponteiro para o último elemento da lista, é possível percorrer a lista em ordem inversa. A seguir assinale a alternativa correta. • Somente a afirmativa I está correta. • Somente a afirmativa II está correta. • Somente as afirmativas I e III estão corretas. • Somente as afirmativas II e III estão corretas. • As afirmativas I, II e III estão corretas. Sua resposta As afirmativas I, II e III estão corretas. Questão 4 Respondida Uma situação eu pode ocorreré adicionar um elemento em uma Fila cheia ou remover um elemento de uma Fila vazia. Em ambos os casos seria impossível realizar as operações. Como solução, é importante sempre implementar as funções para verificar se a Fila está cheia (fila_cheia(F)) e para verificar se a Fila está vazia (fila_vazia(F)). Uma Fila Circular utiliza menos instruções a serem executadas, podendo ser mais adequada e eficiente na utilização de programação. Assim, com base em Filas Circulares, avalie as seguintes asserções e a relação proposta entre elas: I. Utiliza-se as Filas Circulares como solução para várias situações. PORQUE II. As Filas não apresentam uma solução completa, sendo que, mesmo chegando ao final do vetor poderemos ter a Fila cheia mesmo não estando ocupada, uma vez que elementos podem ter sido removidos. A seguir assinale a alternativa correta. • as asserções I e II são proposições verdadeiras, mas a II não é uma justificativa da I. • a asserção I é uma proposição verdadeira, e a II é uma proposição falsa • a asserção I é uma proposição falsa, e a II é uma proposição verdadeira. • as asserções I e II são proposições falsas. • as asserções I e II são proposições verdadeiras e a II é uma justificativa da I. Sua resposta as asserções I e II são proposições verdadeiras e a II é uma justificativa da I. Questão 5 Respondida Analise o trecho de programa a seguir: #include<stdio.h> #include<stdlib.h> int* alocar(){ return malloc(200); } int main(){ int *memoria; memoria = alocar(); if(memoria != NULL){ printf("Endereco de memoria alocada = %x",memoria); } else{ printf("Memoria nao alocada"); } return 0; } Agora, avalie as seguintes asserções e a relação proposta entre elas. I - Foi criado um ponteiro inteiro e, após a função ser chamada, seu resultado foi armazenado no ponteiro chamado memoria. PORQUE II - Se o valor do ponteiro memoria é diferente de NULL, então sabe-se que a alocação foi feita com sucesso e imprime o endereço da primeira posição, caso contrário, o usuário é informado que a memória não foi alocada. A respeito dessas asserções, assinale a alternativa correta: • As asserções I e II são proposições verdadeiras, e a II é uma justificativa da I. • As asserções I e II são proposições verdadeiras, mas a II não é uma justificativa da I. • A asserção I é uma proposição verdadeira, e a II é uma proposição falsa. • A asserção I é uma proposição falsa, e a II é uma proposição verdadeira. • As asserções I e II são proposições falsas. Sua resposta As asserções I e II são proposições verdadeiras, mas a II não é uma justificativa da I. Questão 6 Sem resposta Conforme Tenenbaum et al. (2007, p. 225), uma lista é uma estrutura de dados dinâmica. O número de nós de uma lista pode variar consideravelmente à medida que são inseridos e removidos elementos. A natureza dinâmica de uma lista pode ser comparada à natureza estática de um vetor cujo tamanho permanece constante. Ao criar uma lista ligada, conforme a estrutura apresentada no parágrafo anterior, a lista é criada sem nenhum valor, ou seja, é vazia. Segundo Celes et al. (2004), para inserir um elemento na lista ligada, é necessário alocar o espaço na memória, de forma dinâmica, para armazenar o elemento e ligá-lo à lista existente. Pode-se inserir um elemento em uma lista em três situações diferentes. Ao inserir uma informação na lista ligada, é imprescindível que: • seja atualizado o valor do ponteiro dessa lista, assim a lista ligada deve apontar ao novo elemento da lista. • seja atualizado o valor do nó dessa lista, assim a lista ligada deve apontar ao novo elemento da lista. • seja atualizado o valor da lista ligada, assim ela deve apontar ao novo elemento da lista. • seja atualizado o valor do ponteiro dessa lista, assim a lista ligada deve apontar ao último elemento da lista. • seja atualizado o valor do nó dessa lista, assim a lista ligada deve apontar ao último elemento da lista. Sua resposta seja atualizado o valor do nó dessa lista, assim a lista ligada deve apontar ao novo elemento da lista. Conforme conceito de inserção de elementos, a resposta certa é: Pode-se inserir um elemento em uma lista em três situações diferentes. Ao inserir uma informação na lista ligada, é imprescindível que seja atualizado o valor do ponteiro dessa lista, assim a lista ligada deve apontar ao novo elemento da lista. Questão 7 Sem resposta A estrutura de Fila é do tipo FIFO (First in, First out), ou seja, o primeiro elemento que entra na fila é o primeiro elemento a ser removido, assim, todo primeiro elemento que entra na fila por uma extremidade, saíra primeiro pela outra extremidade. Um aluno afirmou que a estrutura de Fila é muito similar a uma fila de espera de um caixa eletrônico em um banco ou até mesmo uma fila para passar as compras em um mercado. Considerando o contexto apresentado, avalie as seguintes asserções e a relação proposta entre elas. I. Um função que podemos implementar na Fila, é a de verificação se a Fila está vazia ou não. No trecho de remoção de um elemento da Fila, já realizamos a chamada a esta função, e ela pode ser implementada com o trecho de código a seguir: int fila_vazia (Fila* f) { return (f -> n == 0); } PORQUE II. É impossível remover um elemento de uma Fila vazia. Agora assinale a alternativa correta. • as asserções I e II são proposições verdadeiras, mas a II não é o motivo que justificativa da implementação da I. • a asserção I é uma proposição verdadeira, e a II é uma proposição falsa. • a asserção I é uma proposição falsa, e a II é uma proposição verdadeira. • as asserções I e II são proposições falsas. • as asserções I e II são proposições verdadeiras e a II é o motivo que justificativa da implementação da I. Sua resposta a asserção I é uma proposição verdadeira, e a II é uma proposição falsa. Resposta incorreta! Uma situação que pode ocorrer é adicionar um elemento em uma Fila cheia ou remover um elemento de uma Fila vazia. Em ambos os casos seria impossível realizar as operações. Como solução, é importante sempre implementar as funções para verificar se a Fila está cheia (fila_cheia(F)) e para verificar se a Fila está vazia (fila_vazia(F)). Assim, as asserções I e II são proposições verdadeiras, e a II é o motivo que justificativa da implementação da I. Questão 8 Sem resposta Segundo Celes et al. (2004), para inserir um elemento na lista ligada, é necessário alocar o espaço na memória, de forma dinâmica, para armazenar o elemento e ligá-lo à lista existente. Inserir um novo elemento no início da lista é a forma mais simples de inserção em uma lista ligada. É possível implementar a função para adicionar um novo elemento em mais dois pontos da lista. A figura 1 a seguir, mostra uma possibilidade de inserção de elemento: Figura 1 – Inserção de elemento: Fonte: elaborada pelo autor. A inserção do elemento mostrado na imagem anterior se da • no início da lista. • no final da lista. • primeiro da lista. • no nulo da lista. • no meio da lista. Sua resposta no meio da lista. Questão 9 Sem resposta Uma pilha é uma estrutura de dados do tipo LIFO (Last in, First out), ou seja, na qual o último elemento a entrar é o primeiro a sair. Assim, nos elementos que ainda permanecem, o que está no topo da pilha será o primeiro a ser removido. Neste contexto, julgue as afirmações que se seguem. I. Uma estrutura de pilha, devem ser implementadas duas operações básicas: empilhar um novo elemento e desempilhar um elemento. • II. A operação de empilhar um novo elemento tem a função de inserir um elemento na pilha, sendo definida na programação em C++ como push_pilha( ). III. A operação de desempilhar tem a função de removerum elemento do topo da pilha, sendo utilizada na programação em C++ como pop_pilha( ). É correto apenas o que se afirma em: • I. • II. • III. • I e II. • I, II e III. Sua resposta I, II e III. Questão 10 Sem resposta As listas ligadas são estruturas de dados conhecidas por serem flexíveis quanto às suas operações e seu tamanho é dinâmico. Toda lista é composta por nós, e o nó é um conjunto de informações que permitem apontar para o próximo elemento. Considere a organização das pessoas na fila do banco, porém seu funcionamento coerente depende do comportamento da lista ligada, então aplique o conceito de inserção em listas ligadas para assinalar a alternativa correta: • As listas só permitem inserção de elementos em seu início. • As listas só permitem inserção de elementos em seu fim. • As listas só permitem inserção de elementos em seu início ou seu fim. • As listas não permitem sobreposição ao inserir elementos. • As listas permitem inserção de elementos em qualquer posição. Sua resposta As listas permitem inserção de elementos em qualquer posição.
Compartilhar