Baixe o app para aproveitar ainda mais
Prévia do material em texto
1a Questão É um exemplo de TAD Não Linear: Filas Filas de Prioridade Grafos Pilhas Listas Explicação: Um grafo é um tipo de dados abstrato não linear 2a Questão Qual estrutura de dados não linear que é utilizada na implementação de Redes de Computadores, na Computação Gráfica, em modelagem de circuitos digitais e etc. E que se caracteriza por apresentar um conjunto de nós e conexões entre eles. Grafos Filas Encadeadas Listas Encadeadas. Vetores Pilhas Encadeadas 3a Questão As estruturas de dados podem ser caracterizadas como sendo uma forma organizada de armazenar dados ou informações na memória, de modo a otimizar o acesso a estes. Muitas vezes existem algoritmos de manipulação dados associados a estas estruturas. Verifique as seguintes sentenças: I-Filas são estruturas que recuperam os dados na ordem direta em que estes foram armazenados. II-As Pilhas são estruturas que recuperam os dados na ordem reversa em que estes foram armazenados. III-As Pilhas são estruturas que recuperam os dados na ordem direta em que estes foram armazenados. IV-As Filas são estruturas que recuperam os dados na ordem reversa em que estes foram armazenados. Marque a alternativa CORRETA: As alternativas III e IV estão corretas. As alternativas II e IV estão corretas. As alternativas I e III estão corretas. As alternativas I e II estão corretas Todas as alternativas estão corretas. 4a Questão Sobre estrutura de dados, identifique o que está correto afirmar. I. Pilha é uma estrutura de dados com acesso restrito aos seus elementos, uma vez que eles são colocados e retirados por um único lado e são ordenados pelo princípio LIFO (last in first out). Assim, sempre que um elemento é adicionado ou retirado seu topo é alterado. II. Pilha é o tipo de estrutura usada, por exemplo, na avaliação de expressões numéricas, na recursividade e pelos compiladores, na passagem de parâmetros para as funções. III. Registro é uma estrutura básica que permite guardar coleções de dados de diferentes tipos, sendo normalmente utilizado quando um objeto tem diferentes atributos, isto é, contém campos de diferentes tipos. IV. Lista pode conter um número qualquer de elementos, expandindo-se ou contraindo-se conforme o elementos são inseridos ou retirados. Nesse tipo de estrutura, os acessos tanto podem ser feitos sequencialmente como diretamente. V. Fila, assim como a pilha , é uma versão especial de lista, e como tal, seus elementos são ordenados pelo princípio LIFO (last in first out). I, II e III. I, III, IV e V. I, III e V. II, III, IV e V. II, IV e V. 5a Questão As estruturas de dados são utilizadas para manter dados ou informações organizados na memória, o que possibilita a otimização do uso destes dados. Porém, as estruturas guardam características especiais na manipulação destes dados, assim deve-se escolher a estrutura certa ou mais adequada para uma determinada aplicação. Portanto marque a opção que representa a melhor estrutura, quando se tem como requisitos principais o acesso aleatório aos dados e alocação destes de forma contínua na memória. Lista Sequencial Pilha Sequencial Pilha Encadeada Fila Sequencial Lista Encadeada 6a Questão Os irmãos Silva irão viajar por vários países da Europa e por isso, traçaram no mapa o percurso que farão, de cidade a cidade. Qual a estrutura de dados mais adequada para modelar este problema ? Lista Grafo Fila Pilha Árvore 7a Questão Podemos dizer que estrutura de dados é: Uma sequência de passos computacionais que transforma uma entrada em uma saída previamente determinada. O meio para armazenar e organizar dados com o objetivo de facilitar o acesso e as modificações. O que permite o armazenamento e a recuperação de dados independentemente de seu conteúdo. É a saída, que satisfaz a quaisquer restrições impostas pelo problema, necessária para se calcular uma solução do problema. A entrada, que satisfaz a quaisquer restrições impostas pelo problema, necessária para se calcular uma solução do problema. 8a Questão As estruturas de dados podem ser caracterizadas como sendo uma forma organizada de armazenar dados ou informações na memória, de modo a otimizar o acesso a estes. Muitas vezes existem algoritmos de manipulação de dados associados a estas estruturas. Verifique as seguintes sentenças: I-Filas são estruturas que recuperam os dados na ordem direta em que estes foram armazenados. II-As Pilhas são estruturas que recuperam os dados na ordem reversa em que estes foram armazenados. III-As Pilhas são estruturas que recuperam os dados na ordem direta em que estes foram armazenados. IV-As Filas são estruturas que recuperam os dados na ordem reversa em que estes foram armazenados. Marque a alternativa CORRETA: As alternativas II e IV estão corretas. Todas as alternativas estão corretas. As alternativas III e IV estão corretas. As alternativas I e III estão corretas. As alternativas I e II estão corretas 1a Questão O que é estrutura de dados? É uma sequência finita de instruções bem definidas e não ambíguas, cada uma das quais devendo ser executadas mecânica ou eletronicamente em um intervalo de tempo finito e com uma quantidade de esforço finita. É uma forma determinada de armazenamento de dados em um banco de dados. É um conjunto de técnicas de programação. É um modo particular de armazenamento e organização de dados em um computador de modo que possam ser usados eficientemente. É um conjunto de comandos para uma tarefa específica referenciada por um nome no algoritmo principal, retornando um determinado valor no seu próprio nome. Explicação: Estrutura de dados não é banco de dados . Estrutura de dados não é Tipo de dados. Estrutura de dados não é ¿ É um conjunto de comandos para uma tarefa específica referenciada por um nome no algoritmo principal, retornando um determinado valor no seu próprio nome¿ que no caso, fala de função. Estrutura de dados não é ¿ É uma sequência finita de instruções bem definidas e não ambíguas, cada uma das quais devendo ser executadas mecânica ou eletronicamente em um intervalo de tempo finito e com uma quantidade de esforço finita.¿ Esta definição é de algoritmo. Portanto, Estrutura de Dados é ¿ É um modo particular de armazenamento e organização de dados em um computador de modo que possam ser usados eficientemente.¿ Na Aula 1 do conteúdo online há elementos para tal questão. 2a Questão Na maioria dos sistemas operacionais, os arquivos são organizados hierarquicamente em um esquema de diretórios (pastas) e sub-diretórios. Qual a estrutura mais adequada para representar este problema ? pilha lista árvore grafo fila 3a Questão Estão entre algumas das possíveis formas de se estruturar dados: Algoritmos, lista ordenada, vetores. Grafos, algoritmos, fila. Lista encadeada, vetores, algoritmos. Grafos, lista ordenada, algoritmos. Grafos, lista ordenada, vetores. Explicação: FAlso. Algoritmos não são estrutura de dados Grafos, algoritmos,fila. . FAlso. Algoritmos não são estrutura de dados. Grafos, lista ordenada, algoritmos. Correto. Grafos, lista ordenada, vetores. FAlso. Algoritmos não são estrutura de dados. Algoritmos, lista ordenada, vetores. FAlso. Algoritmos não são estrutura de dados. Lista encadeada, vetores, algoritmos. 4a Questão Preciso cadastrar todos os interessados em meu novo curso de programação. Qual a estrutura de dados mais adequada para modelar este problema, visto que não há qualquer preocupação com ordem de chegada ou saída de aluno da turma. Árvore Fila Pilha Grafo Lista 5a Questão Leia com atenção as afirmativas abaixo e assinale a resposta correta. I A estrutura de dados que melhor representa os diretórios ou pastas de arquivos do computador é a árvore. II A estrutura de dados FILA é não linear assim como o Grafo. III O termo folha em uma estrutura de dados é usado para um nó sem filhos e que tem grau 0, IV O grau de uma árvore é definido pelo número de subárvores de um nó. V O grafo é uma estrutura de dados que tem limitação para o número de vértices. VI Uma das aplicações da estrutura de dados grafo é a Computação Gráfica. II, IV e V são afirmativas verdadeiras I, III, IV e VI são afirmativas verdadeiras I, II, III e VI são afirmativas verdadeiras I, II e V são afirmativas verdadeiras II, IV, V e VI são afirmativas verdadeiras 6a Questão Analise as afirmativas abaixo e selecione a alternativa correta. I Algumas aplicações da estrutura de dados grafo são: Diagrama de Entidade Relacionamento e Redes de computadores. II Árvore e lista duplamente encadeada são estruturas não lineares. III A Fila é uma estrutura não linear e a inserção de um elemento acontece ao final. IV A Lista é uma das estruturas de dados mais simples, mas não se pode ordená-la. V O uso de ponteiros é fundamental para construção de listas encadeadas. I , II e IV são verdadeiras II e V são verdadeiras III e V são verdadeiras II E IV são verdadeiras I e V são verdadeiras 7a Questão Preciso fazer uma relação de tudo o que levar em minha viagem de mochila pela Europa. A estrutura de dados mais adequada para armazenar tudo que preciso levar é ... lista grafo fila árvore pilha Explicação: Conforme gabarito e aula 1. 8a Questão Observe o trecho do programa em C++ abaixo e, após, entrar com os valores sugeridos para sua execução assinale a alternativa que representa a resposta final. cin >> a; cin >> b; cin >> c; cin >> d; cout << a; cout << b; cout << c; cout << d; cout << d; cout << c; cout << b; cout << a; Após a impressão dos valores pela ordem teremos uma fila e uma pilha. Após a impressão dos valores pela ordem teremos uma pilha e uma fila. Após a impressão dos valores pela ordem teremos duas pilhas. Após a impressão dos valores pela ordem teremos uma fila e um grafo. Após a impressão dos valores pela ordem teremos duas filas. 1a Questão Na passagem por ____________________ , o endereço da variável da função chamadora é passado para a função chamada e, dessa forma, o valor poderá ser alterado, ou não. número caracter referência valor void Explicação: Esse é o conceito de passagem por referência. 2a Questão Ao definirmos uma função, podemos afirmar: I Toda função tem parâmetros II Quando nada retorna, o tipo é void III Quando todos os parâmetros são do mesmo tipo, é suficiente usar o tipo uma vez e separar os nomes dos parâmetros por vírgulas IV Na passagem por valor, o endereço da variável da função chamadora é passado para a função chamada Após uma análise das afirmativas acima, escolha a opção correta. Somente II está correta Somente II III e IV estão corretas Somente II e III estão corretas Somente II e IV estão corretas Somente I e II estão corretas 3a Questão Considere a função abaixo: int func (int a, int& b){ a = b - a; b = a * 2; a = b * 2; return a; } Considere o seguinte código na função main: int x = 2, y = 3, z; z = func (x, y); cout << x << "; " << y << "; " << z; O que será impresso? 2; 2; 1 1; 2; 4 1; 3; 1 4; 2; 4 2; 2; 4 Explicação: a recebeu o valor de x que era 2 b recebeu 3, a partir de y, que foi passado por referência. Executando a função, passo a passo, tem-se : a recebeu 1 b recebeu 2 a recebeu um novo valor, que é 4. Daí a função retorna o valor de a, que é 4. Voltando para a main temos que z recebeu o retorno da função que é 4, x não se alterou, valendo 2 e y recebeu 4, devido a alteração na função no parâmetro b, passado por referência. Daí, na tela será impresso : 2; 2; 4 4a Questão Diga, para o trecho do programa abaixo, qual a opção que representa a saída em tela. Considere que o programa será compilado sem erros, e irá executar também sem problemas. void troca (int x, int *y){ int tmp; tmp = *y; *y = x; x = tmp; } int main() { int a = 13, b = 10; troca( a, &b ); cout<<"Valores: "<< a<<"\t"<< b<< endl; system("pause"); } Valores: 10 13 Valores: 13 13 Valores: 13 10 Valores: 10 10 Valores: 31 01 Explicação: A execução começa pela main. São passados o valor de a, que é 13 e o endereço de b, que vale 10. Em seguida, é chamada a função troca e são passados o valor de a e o endereço de b. Executando a função troca, x recebe 13 e *y recebe 10. Mas ocorre a troca, usando tmp como auxiliar. Então x recebe 10 e *y recebe 13. Ao terminar a execução da função, voltamos para a main e temos a sem mudanças e b com a mudança ocorrida na função. Note que x é um parâmetro passado por valor e y é um parÂmetro passado por referência. Portanto, a ficou 13 e b ficou 13. Logo, será impresso : Valores: 13 13 5a Questão Auxiliar = 100 Numero1 = 900 Numero2 = 20 Auxiliar = 111 Numero1 = 1000 Numero2 = 80 Auxiliar = 100 Numero1 = 900 Numero2 = 80 Auxiliar = 100 Numero1 = 1000 Numero2 = 20 Auxiliar = 101 Numero1 = 900 Numero2 = 20 Explicação: Acompanhando a execução Na função main() é declarada a variável valor e inicializada com 1000. Quando na main(), a função mistério é chamada, é passado o endereço da variável valor. Logo, de forma bem simples, v seria o nome da variável valor para a função misterio(...) Dentro da função misterio(...), foi declarada uma variável local aux com conteúdo 11 Sendo assim, aux = aux - 11; Deixará aux com 100 v = v - aux ; Deixará v com 900(1000 - 100) Como a variável numero foi declarada globalmente, todas as funções poderão acessá-la e, com isso, alterar seu valor, numero = aux - numero; Deixará numero com 80(100 - 20) Dentro da função misterio(...) será exibido Auxiliar = 100 e quando retornar à função main(), serão exibidos Numero1 = 900 Numero2 = 80 Resposta correta: Auxiliar = 100 Numero1 = 900 Numero2 = 80 6a Questão Funções são instrumentos de modularização de programas, que tem como finalidade tornar o código mais legível, isto é mais fácil de entender, evita replicaçãode instruções e permite o reuso das funções em outros programas. Então considere o seguinte código: #include< iostream > using namespace std; int main( ) { float a=10.0; float b=4.0; cout < < media(a,b); return 0; } float media(float x, float y) { return (x+y)/2;} Marque a alternativa CORRETA: O código compila normalmente e apresenta como resultado o valor 7.0 O código não compila, pois há necessidade de se declarar float media(float, float) como protótipo da função float media(float x, float y)antes da função principal. O código não compila, pois os parâmetros usados na chamada da função deveriam ser "x" e "y"; porém a chamada se deu com identificadores "a" e "b". O código não compila, pois a função float media(float x, float y) retorna um valor que seria ser armazenado em uma variável do tipo float e só então poderia ser usado o comando cout para exibir o resultado. O código compila normalmente, pois como a descrição da função float media(float x, float y)está posicionada após a função int main ( ), não há necessidade do uso de protótipos. Explicação: Quando uma função é posicionada depois da função main(), o protótipo dela precisa estar presente antes da função main(). 7a Questão O que será mostrado na tela pelo programa abaixo ? #include < iostream > using namespace std; int a,b; void dobro(int x){ //x passado por valor x=2*x; } int triplo(int y){ //y passado por valor return 3*y; } void altera(int x, int &y) { //x passado por valor e y passado por referencia x=x+a; y=x+b; } int main (){ a=2; b=3; dobro(a); b=triplo(b); altera(a,b); cout<< a << " e " << b << endl; } 4 e 12 2 e 9 9 e 16 4 e 9 2 e 13 Explicação: Executando o programa, passo a passo, temos : Na main, a recebe 2 e b recebe 3. Note que a e b são variáveis globais. Daí, ainda na main, a função dobro é chamada. Ao executar dobro, temos que o valor 2 é passado e x (local à dobro) recebe 2 * 2, que dá 4. Ao terminar a função dobro, volta-se para a main, mas o valor de a passado não mudou, continuando 2. Após a execução de dobro, a função triplo é chamada na main e é passado o valor de b, que é 3. Iniciando a execução da função triplo, temos que y recebe 3 e a função retorna 3 * 3, que é 9. Voltando para a main, temos que b recebe o valor retornado pela função, que é 9. Até este ponto, temos que a vale 2 e b mudou para 9. Em seguida, a função altera é chamada e são passados 2 e 9, respectivamente, para x e y. Executando a função altera, temos que x recebe 2+2, que dá 4 e y recebe 4+9, que dá 13. Como x é passado por valor e y por referência, temos que a mudará e b mudará (ambas na main). Então, voltando para main temos que a vale 2 e que b vale 13. Assim, será impresso na tela 2 e 13 8a Questão Assinale a alternativa que apresenta duas formas de passagem de parâmetros para uma rotina ou função: Por inferência e por valor. Por teste e por reforço. Por memória e por disco. Por reforço e por referência. Por valor e por referência Explicação: Questão super objetiva. Só pode ser por valor e por referência. 1a Questão Uma função possui um valor de retorno inteiro, recebe por valor um inteiro como primeiro parâmetro e por referência um inteiro como segundo parâmetro. Qual das respostas abaixo poderia representar o protótipo dessa função: void func (int &a, int &b); int func (&int, int); void func (int a, int &b); int func (int a, int &b); int func (int &a, int b); 2a Questão Blocos únicos de códigos que realizam diversas tarefas distintas são de difícil manutenção. Portanto, utiliza-se a técnica da modularização de programas, a fim de facilitar a implementação e a manutenção dos programas. Esta técnica tem como principal elemento: Os Grafos As Filas As Estruturas de Dados As funções Os Vetores 3a Questão Assinale a alternativa que apresenta duas formas de passagem de parâmetros para uma rotina ou função: Por teste e por reforço. Por memória e por disco. Por inferência e por valor. Por reforço e por referência. Por valor e por referência Explicação: Questão super objetiva. Só pode ser por valor e por referência. 4a Questão Nas linguagens C e C++, ao se declarar qualquer função, a especificação de tipo de dados que antecede o nome desta função define o tipo do dado do valor retornado da função para quem a chamou. o tipo dos dados dos parâmetros que são passados à função quando da sua chamada. o tipo das variáveis que serão utilizadas dentro da função. o escopo das variáveis do programa. o protótipo da função. Explicação: Por definição, antes do nome da função colocamos o tipo de dados retornado. Por exemplo, int, double, char ... Quando a função nada retorna colocamos void. 5a Questão Funções são semelhantes aos procedimentos, exceto que uma função sempre retorna um valor. Um exemplo de função seria o conjunto de instruções para calcular o fatorial de um número e após a função ser executada, ela deve retornar o fatorial do número pedido. Marque a opção que representa um protótipo de função válido. nome tipo(parametros); void float(int a, int b); tipo parametros(parametros); retorno nomeFuncao(parametros); tipo parametros(int a, int b); Explicação: Por definição, o protótipo de uma função é formado da seguinte forma : nome_da_função ( ); 6a Questão Considere a função abaixo: void func (int a, int &b) { a++; b = a*2; } e o seguinte trecho de código na função main : int x=2, y=3; func (x,y); func (y,x); cout << x << " ; " << y; Após a execução do cout o que será impresso ? 2; 6 4; 12 14; 6 2; 12 6; 14 Explicação: Fazendo um teste de mesa, chegaremos na opção correta. Iniciando a execução pela main, temos que x recebe 2 e y recebe 3. Em seguida, na 1ª. chamada de func, os valores de x e de y, respectivamente, 2 e 3, são passados para a função. Executando a função func, que possui o parâmetro a passado por valor e o parâmetro b passado por referência (usa &) ... void func (int a, int &b) { a++; b = a*2; } Temos que a recebeu 2 e b recebeu 3. Daí, a ficará 3 e b receberá 6. Assim, ao terminar a função func e retornarmos para a main teremos x sem alteração igual a 2 e y com alteração igual a 6. Após voltarmos para a main, temos uma nova chamada de func que recebe os valores de y e de x, respectivamente, que são 6 e 2. Na 2ª. chamada de func para esses valores, teremos que a recebe 6 e y recebe 2. Dentro da função, temos que a é incrementado para 7 e que b recebe 7 * 2 que dá 14. Ao terminarmos a execução da função, temos que y não sofreu mudança, ficando com o valor 6 e que x mudou para 14. Logo, será impresso 14;6 Logo, as demais opções são incorretas. 7a Questão Considere a função abaixo: int func (int a, int &b) { a = b - a; b = a * 2; a = b * 2; return a; } Considere também o seguinte trecho de código no main : int x=2, y=3, z; z = func (x,y); cout << x << "; " << y<< "; " << z; Após a execução do cout, seria impresso: 2; 2; 4 2; 2; 1 1; 3; 1 4; 2; 4 1; 2; 4 Explicação:Começando a execução pela main, temos que x recebe 2 e y recebe 3. Chamando a função, são passados os valores 2 e 3, respectivamente para a e b. Note que b é passado por referência. Dentro da função tem-se o seguinte : a recebe 1, depois b recebe 2 e então, novamente, a é alterado e recebe 4. Daí, o valor de a igual a 4 é retornado para a main e é atribuído a z. Voltando para a main, temos que x não mudou, ficando igual a 2. Temos ainda que z recebeu 4, o valor retornado pela função e finalmente, y foi alterado para 2. Portanto, foi impresso 2;2;4, pois foram impressos os valores de x, y e z, respectivamente. 8a Questão Blocos únicos de códigos que realizam diversas tarefas distitintas são de dificil manutenção. Portanto, utiliza-se a tecnica da modularização de programas, a fim de facilitar a implementação e a manutenção dos programas. Esta técnica, também chamada de modularização, tem como principal elemento: Os Grafos As Estruturas de Dados As Filas As funções Os Vetores 1a Questão Informe qual deverá ser a saída do programa abaixo: #include void func(int *x) { do{ cout << *x << " "; (*x)--; }while(*x>0); } main() { int x=5; func(&x); cout << x; system("pause"); } 5 3 4 2 1 4 5 4 3 2 1 5 5 3 4 2 1 0 5 4 3 2 1 0 5 4 3 2 1 6 2a Questão Considera a FUNÇÃO abaixo: void inverte(int &x, int &y) { int aux = x; x = y; y = aux; } Quais valores serão impressos na tela quando o seguinte programa principal for executado? int main() { int a = 18, b = 28; inverte(a, b); cout << a <<" e "<< b; return 0; } 28 e 18 18 e 18 28 e 08 18 e 28 08 e 18 Explicação: Teste de Mesa a b x y aux 18 28 //Na main() 18 28 18 28 //Quando a função é chamada x, recebe o endereço de a e y, o de b. Logo acessam os mesmos endereços 18 28 18 28 18 //Na função, aux é declarada e inicializada com o valor de x 18 28 28 28 18 //Na função x = y; Deixará x com valor 28 18 28 28 18 18 //Na função y = aux; Deixará y com valor 18 Como a função é void, nada retorna e nem precisa porque os valores foram trocados pela função misterio(...) que recebeu por passagem por referência. 3a Questão Considere a seguinte função: void dobro(int x) { x = 2 * x; } Qual valor será impresso na tela quando o seguinte programa principal for executado? int main() { int n = 3; n = n + 2; dobro(n); cout << n; return 0; } 5 3 10 0 20 Explicação: A função não retorna valor, então o valor de "n" não é alterado permanecendo igual a 5. 4a Questão Considere o trecho de um programa escrito em C++ : int func1 (long num) { int n, na=1; while (num / 10 != 0){ na += 1; num /= 10; } return na; } main() { cout << func1 (132041); } Marque a opção correta que mostra o que é impresso na tela. 6 2 3 1 4 Explicação: Fazendo passo a passo : int func1 (long num) { int n, na=1; while (num / 10 != 0){ na += 1; num /= 10; } return na; } main() { cout << func1 (132041); } Passos : 1) Chamada da função passando o valor 132041 2) Começa a função com num recebendo o valor 132041 3) na recebe 1 4) enquanto num/10 é diferente de zero faça ... Vejamos : 132041/10 é diferente de zero então na recebe 2 e num recebe 13204 5) Volta no teste do loop... 13204 /10 é diferente de zero ? Sim. Então, na recebe 3 e num recebe 1320 6) Volta no teste do loop... 1320 /10 é diferente de zero ? Sim. Então, na recebe 4 e num recebe 132 7) Volta no teste do loop... 132 /10 é diferente de zero ? Sim. Então, na recebe 5 e num recebe 13 8) Volta no teste do loop... 13 /10 é diferente de zero ? Sim. Então, na recebe 6 e num recebe 1 9) Volta no teste do loop... 1 /10 é diferente de zero ? Não. Então, retorna o valor e na que é 6. 5a Questão Em programação podemos utilizar um recurso que modulariza o programa chamado função. As funções precisam ser ativadas para que possam ser executadas. Para isso, é necessário chamar a função pelo seu nome e enviar, quando necessário, os valores respectivos para os parâmetros de entrada. Ao enviar os valores para os parâmetros de entrada, o programa pode fazer uma cópia deste valor ou trabalhar em um endereço enviado. Quando se envia o endereço estamos ativando a função por meio de: Registro. Passagem por valor. Envio de valor. Ponteiros. Envio de inteiro. Explicação: Falso. Quando se tem endereço não é passagem por valor Passagem por valor. FAlso. Fala-se em endereço do valor Envio de inteiro. Verdadeiro. Ponteiro armazena o endereço de memória de uma variável Ponteiros. Falso. Como é esse envio ? Envio de valor. FAlso. Sem sentido. Resgistro (struct em C++) agrega dados de tipos diferentes. Registro. 6a Questão Para compararmos vetores de char, usaremos a função _____________________ . Para copiarmos o conteúdo de um vetor de char nas posições ocupadas por outro vetor de char, usaremos a função ______________________ . strcat(); e strcpy() ; strcmp(); e strlen() ; strcmp(); e strcat(); strcmp(); e strcpy(); strcmp(); e strcmpi (); Explicação: Nâo há outra possíbilidade de resposta. Em cstring estão declaradas as funções da opção correta, que fazem exatamente o que foi mencionado no enunciado. Ainda a saber : strcat concatena e strlen conta o número de caracteres 7a Questão Caso uma estrutura homogênea (vetor) seja passada como parâmetro para uma função, então: Essa passagem é "por valor" Todos os valores contidos no vetor são copiados para a função Essa passagem é "por referência" Haverá um erro de compilação, pois vetores não podem ser parâmetros de funções Essa passagem pode ser "por valor" ou "por referência" Explicação: Quando o vetor é um parâmetro de uma função ele é sempre passado por referência, não havendo outra possibilidade. Não ocorrerá erro, se o vetor for devidamente passado para a função. 8a Questão Assinale a opção certa. Quando não se escreve o protótipo de uma função ... A chamada da função poderá ser feita em qualquer hipótese. É preciso definir a função antes do programa principal. O programa não funcionará de forma alguma. A chamada da função não poderá ser feita em qualquer hipótese. A definição da função deverá ser escrita, obrigatoriamente, após o programa principal. 1a Questão Em C++, quando uma variável é declarada como uma struct, o acesso para atribuição e leitura dos membros (campos) deste registro se dá pelo operador : , (vírgula). ∙ (ponto). -> (seta). * (asterisco). & (e comercial ou eitza). Explicação: Por definição, o operador que permite acessar os campos de uma variável struct é o ponto (.). 2a Questão Dadas as afirmativas abaixo, identifique as corretas e marque a alternativa verdadeira. I- Vetores e matrizes servem apenas para construir agregados de dados heterogêneos. II- Registros em C++ são tiposde dados compostos formados por mais de um tipo de dados. III- Na Linguagem C++, "struct" é uma palavra reservada que serve para definir registros. IV- Registros são tipos de dados heterogêneos. estão corretas apenas as afirmativas I, III e IV. estão corretas apenas as afirmativas I, II e III. todas as afirmativas estão corretas. estão corretas apenas as afirmativas II, III e IV. estão corretas apenas as afirmativas I, II e IV. Explicação: Analisando as afirmativas, temos : Afirmativa I : Falso. Vetores e matrizes são agregados homogêneos. Afirmativas II, III e IV : Estão corretas. Basicamente, structs são agregados heterogêneos. Logo, a opção correta é estão corretas apenas as afirmativas II, III e IV. 3a Questão Marque a opção correta, considerando struct Livro { int codigo; float preco; } liv; Livro.liv.codigo = 12345; liv->preco = 30.70; liv.preco = 30.70; Livro->liv.codigo = 12345; Livro.codigo = 12345; 4a Questão o programa de computador necessita preencher uma lista de alunos (nome e nota) até que a lista esteja cheia. Sabe-se que a lista tem capacidade para 25 alunos. Utilizando agregados heterogêneos, qual o trecho de código que exibe a melhor forma de solucionar este problema? for (int i = 0; i <= 25; i++) { cin >> lista[i].nome; cin >> lista[i].nota; } for (int i = 0; i < 25; i++) { cin >> lista->nome; cin >> lista->nota; } for (int i = 0; i < 25; i++) { cin >> lista[i]->nome; cin >> lista[i]->nota; } for (int i = 0; i < 25; i++) { cin >> lista[i].nome; cin >> lista[i].nota; } int i = 0; while( i < 25) { cin >> lista[i].nome; cin >> lista[i].cargo; i ++; } Explicação: Analisando cada item : for (int i = 0; i <= 25; i++) { cin >> lista[i].nome; cin >> lista[i].nota; } >> Falso. Veja que se há 25 itens, os índices começarão de 0 e irao até 24 e não 25. for (int i = 0; i < 25; i++) { cin >> lista[i]->nome; cin >> lista[i]->nota; } >> Falso. Para acessar o campo de struct é ponto e não seta. lista[i] é uma struct e não um ponteiro. for (int i = 0; i < 25; i++) { cin >> lista->nome; cin >> lista->nota; } >> Falso. Para acessar o campo de struct é ponto e não seta. lista é um vetor e lista[i] é um componente de lista. Usamos o operador seta quando temos ponteiro para struct. for (int i = 0; i < 25; i++) { cin >> lista[i].nome; cin >> lista[i].nota; } >> Verdadeiro. int i = 0; while( i < 25) { cin >> lista[i].nome; cin >> lista[i].cargo; i ++; } >> Falso, porque foi pedido nome e nota e não cargo. 5a Questão Marque a afirmativa correta para a "Inserção em lista linear sequencial ordenada". Consiste em adicionar um valor no vetor, alterando a ordem existente e ajustando o total de elementos. Consiste em fazer uma busca em um vetor já ordenado, dividindo o espaço de busca ao meio e verificando se o dado está no meio ou, antes do meio ou depois do meio. É o processo pelo qual um conjunto de dados é colocado em uma ordem crescente ou decrescente. Consiste em adicionar um valor no vetor, mantendo a ordem existente e ajustando o total de elementos. Consiste em fazer uma busca em um vetor desordenado, dividindo o espaço de busca ao meio e verificando se o dado está no meio ou, antes do meio ou depois do meio. Explicação: Consiste em adicionar um valor no vetor, mantendo a ordem existente e ajustando o total de elementos. Só pode ocorrer, no entanto, se a lista não estiver cheia. 6a Questão Pode-se definir uma estrutura heterogênea como sendo um conjunto de elementos, geralmente, agrupados sob uma lógica e associados por um nome. Esses elementos podem ser variáveis simples, matrizes ou ainda outras estruturas. Seja a definição de uma estrutura como: struct aluno { string nome; float nota; }; Suponha ainda que exista um vetor desta estrutura, definido como: aluno vet [ 100]; Marque a alternativa em que é atribuída de forma correta a nota 5.7 para o décimo primeiro elemento deste vetor. aluno.vet[10]=5.7; aluno.vet[10].nota=5.7; vet[10]=aluno.5.7; vet[10].aluno.nota=5.7 ; vet[10].nota=5.7; 7a Questão Os métodos de ordenação são muito utilizados em estruturas de dados para facilitar a busca e a recuperação posterior de itens de conjuntos ordenados. Existem vários métodos de ordenação, por este motivo, marque corretamente a alternativa que apresenta o código do método de seleção. int ordena(float v[], float valor, int n){ for (int i = 0; i < n; i++) if (v[i] == valor) return i; return -1; } int ordena(float v[], float valor, int n) { int ini = 0, fim = n-1, meio; while (ini >= fim){ meio = ini/2; if (v[meio] == valor) return meio; if (valor < v[meio]) fim = meio -1; else ini = meio+1; } int ordena(float v[], float valor, int n) { int ini = 0, fim = n -1, meio; while (ini <= fim){ meio = (ini + fim)/2; if (v[meio] == valor) return meio; if (valor < v[meio]) fim = meio -1; else ini = meio+1; } return -1; } void ordena(int v[], int n){ int i, j, menor, aux; for (j = 0; j < n-1; j++) { for (i = j+1; i < n; i++) { if (v[i] < v[j]) { aux = v[j]; v[j] = v[i]; v[i] = aux; } } } } void ordena (int v[], int n){ int i, j, aux; for (j = 1; j < n; j++) for (i=j; i > 0 && v[i-1]> v[i]; i--){ aux = v[i-1]; v[i-1] = v[i]; v[i] = aux; } } Explicação: Na ordenação por seleção, a idéia é sempre procurar o menor elemento do vetor e inseri-lo no início do vetor. Procuramos o menor valor do vetor e colocamos ele em vetor. Procuramos o menor valor do vetor excluindo o já colocado e colocamos ele em vetor. E assim vamos indo até termos todo o vetor ordenado. Partindo sempre a partir do último elemento reordenado (a partir do i), o programa procura o menor elemento no vetor e o substitue pelo elemento i atual. É o que está ocorrendo na primeira opção! 8a Questão Pode-se definir uma estrutura heterogênea como sendo um conjunto de elementos, geralmente, agrupados sob uma lógica e associados por um nome. Esses elementos podem ser variáveis simples, matrizes ou ainda outras estruturas. Seja a definição de uma estrutura como: struct aluno { string nome; float media; }; Suponha ainda que exista um vetor desta estrutura, definido como: aluno vet [ 10]; Marque a alternativa em que é atribuída de forma correta a media 6.0 para o quarto elemento deste vetor. aluno[3].media=6.0; aluno[10]=6.0; vet[3].aluno=6.0; vet[3].media=6.0; aluno[3].10=6.0; 1a Questão Marque a afirmativa correta para a "Inserção em lista linear sequencial ordenada". Consiste em fazer uma busca em um vetor desordenado, dividindo o espaço de busca ao meio e verificando se o dado está no meio ou, antes do meio ou depois do meio. Consiste em adicionar um valor no vetor, alterando a ordem existente e ajustando o total de elementos. Consiste em adicionar um valor no vetor, mantendo a ordem existente e ajustando o total de elementos. Consiste em fazer uma busca em um vetor já ordenado,dividindo o espaço de busca ao meio e verificando se o dado está no meio ou, antes do meio ou depois do meio. É o processo pelo qual um conjunto de dados é colocado em uma ordem crescente ou decrescente. Explicação: Consiste em adicionar um valor no vetor, mantendo a ordem existente e ajustando o total de elementos. Só pode ocorrer, no entanto, se a lista não estiver cheia. 2a Questão Qual das seguintes estruturas de dados é classificada como heterogênea? Loop Vetor Fila Pilha Registro Explicação: Registro permite agregar dados de tipos diferentes. Vetor permite agregar dados do mesmo tipo. Pilha e fila implementadas com vetor ou lista encadeada. Loop : termo genérico para repetições. 3a Questão Os métodos de ordenação são muito utilizados em estruturas de dados para facilitar a busca e a recuperação posterior de itens de conjuntos ordenados. Existem vários métodos de ordenação, por este motivo, marque corretamente a alternativa que apresenta o código do método de seleção. void ordena(int v[], int n){ int i, j, menor, aux; for (j = 0; j < n-1; j++) { for (i = j+1; i < n; i++) { if (v[i] < v[j]) { aux = v[j]; v[j] = v[i]; v[i] = aux; } } } } int ordena(float v[], float valor, int n){ for (int i = 0; i < n; i++) if (v[i] == valor) return i; return -1; } void ordena (int v[], int n){ int i, j, aux; for (j = 1; j < n; j++) for (i=j; i > 0 && v[i-1]> v[i]; i--){ aux = v[i-1]; v[i-1] = v[i]; v[i] = aux; } } int ordena(float v[], float valor, int n) { int ini = 0, fim = n-1, meio; while (ini >= fim){ meio = ini/2; if (v[meio] == valor) return meio; if (valor < v[meio]) fim = meio -1; else ini = meio+1; } int ordena(float v[], float valor, int n) { int ini = 0, fim = n -1, meio; while (ini <= fim){ meio = (ini + fim)/2; if (v[meio] == valor) return meio; if (valor < v[meio]) fim = meio -1; else ini = meio+1; } return -1; } Explicação: Na ordenação por seleção, a idéia é sempre procurar o menor elemento do vetor e inseri-lo no início do vetor. Procuramos o menor valor do vetor e colocamos ele em vetor. Procuramos o menor valor do vetor excluindo o já colocado e colocamos ele em vetor. E assim vamos indo até termos todo o vetor ordenado. Partindo sempre a partir do último elemento reordenado (a partir do i), o programa procura o menor elemento no vetor e o substitue pelo elemento i atual. É o que está ocorrendo na primeira opção! 4a Questão Com relação à struct, é correto afirmar que : A struct é sempre definida dentro da main. Não é possível criar um vetor de structs, pois o vetor trabalha apenas com dados do mesmo tipo. Cada elemento da struct é chamado campo e cada campo deve ser, obrigatoriamente, de um tipo de dados distinto de outro campo. Cada elemento da struct é chamado componente. Cada elemento da struct é denominado membro ou campo, sendo que a struct pode armazenar elementos de tipos diferentes ou não. 5a Questão Pode-se definir uma estrutura heterogênea como sendo um conjunto de elementos, geralmente, agrupados sob uma lógica e associados por um nome. Esses elementos podem ser variáveis simples, matrizes ou ainda outras estruturas. Seja a definição de uma estrutura como: struct aluno { string nome; float media; }; Suponha ainda que exista um vetor desta estrutura, definido como: aluno vet [ 10]; Marque a alternativa em que é atribuída de forma correta a media 6.0 para o quarto elemento deste vetor. vet[3].media=6.0; vet[3].aluno=6.0; aluno[3].10=6.0; aluno[3].media=6.0; aluno[10]=6.0; 6a Questão Marque a opção correta, considerando struct Livro { int codigo; float preco; } liv; liv.preco = 30.70; Livro->liv.codigo = 12345; Livro.liv.codigo = 12345; Livro.codigo = 12345; liv->preco = 30.70; 7a Questão Pode-se definir uma estrutura heterogênea como sendo um conjunto de elementos, geralmente, agrupados sob uma lógica e associados por um nome. Esses elementos podem ser variáveis simples, matrizes ou ainda outras estruturas. Seja a definição de uma estrutura como: struct aluno { string nome; float nota; }; Suponha ainda que exista um vetor desta estrutura, definido como: aluno vet [100]; Marque a alternativa em que é atribuída de forma correta a nota 5.7 para o décimo primeiro elemento deste vetor. vet[10]=aluno.5.7; aluno.vet[10].nota=5.7; vet[10].aluno.nota=5.7 ; aluno.vet[10]=5.7; vet[10].nota=5.7; 8a Questão Dadas as afirmativas abaixo, identifique as corretas e marque a alternativa verdadeira. I- Vetores e matrizes servem apenas para construir agregados de dados heterogêneos. II- Registros em C++ são tipos de dados compostos formados por mais de um tipo de dados. III- Na Linguagem C++, "struct" é uma palavra reservada que serve para definir registros. IV- Registros são tipos de dados heterogêneos. todas as afirmativas estão corretas. 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 II, III e IV. estão corretas apenas as afirmativas I, II e IV. Explicação: Analisando as afirmativas, temos : Afirmativa I : Falso. Vetores e matrizes são agregados homogêneos. Afirmativas II, III e IV : Estão corretas. Basicamente, structs são agregados heterogêneos. Logo, a opção correta é estão corretas apenas as afirmativas II, III e IV. 1a Questão Este vetor foi ordenado pelo método: Ordenação por inserção (insertion sort). Ordenação por seleção (selection sort). Quicksort. Mergesort. Método da bolha (bubble sort). Explicação: O bubblesort trabalha comparando e trocando, se preciso, duplas de dados vizinhos. Portanto, pelo comportamento na sequÊncia descrita temos o método da bolha ou bubblesort. 2a Questão Em relação à classificação do método de ordenação, assinale abaixo aquele que, durante o processo de ordenação, só usa a memória principal: Ordenação Simples Ordenação Externa Ordenação Eficiente Ordenação Simples Externa Ordenação Interna 3a Questão Existem vários tipos de algoritmos para realizar a ordenação dos elementos, onde um algoritmo de ordenação deve rearranjar o vetor de forma a estabelecer uma ordem entre os elementos. Marque a alternativa correta que cita o algoritmo cuja descrição é: "considera cada elemento uma vez inserindo-o em seu lugar correto entre os elementos que já estão em ordem". E o seu passo a passo pode ser descrito como: "o elemento é inserido entre os ordenados movendo-se os elementos maiores que ele uma posição para a direita e posteriormente inserindo-o na posição vaga". Seleção QuickSort MergeSort Bolha Inserção 4a Questão Sabendo-seque o método de seleção também é um método de ordenação que baseia seu algoritmo em trocas entre os elementos de um vetor, se submetermos a sequencia de inteiros armazenada em um vetor inicialmente na seguinte ordem : 13, 23, 3, 8, 1. Pode-se dizer que quando o menor elemento do vetor alcançar sua posição final, a ordenação apresentada no vetor é: 1,3,23,8,13 1,23,3,8,13 1,13,23,8,3 1,8,3,23,13 1,23,13,8,3 5a Questão Marque a afirmativa correta para a "Ordenação em Listas Lineares Sequenciais". É o processo pelo qual um conjunto de dados é colocado em uma ordem crescente ou decrescente. Consiste em fazer uma busca em um vetor já ordenado, dividindo o espaço de busca ao meio e verificando se o dado está no meio ou, antes do meio ou depois do meio. Consiste em adicionar um valor no vetor, mantendo a ordem existente e ajustando o total de elementos. Consiste em fazer uma busca em um vetor desordenado, dividindo o espaço de busca ao meio e verificando se o dado está no meio ou, antes do meio ou depois do meio. Consiste em adicionar um valor no vetor, alterando a ordem existente e ajustando o total de elementos. 6a Questão Sobre o funcionamento da busca binária, é correto afirmar que dividindo seu vetor em duas metades. Se o item for igual ao item que está na metade do vetor, o item não foi encontrado. Se o item for menor que o item que está na metade do vetor, o item foi encontrado. Se o item for menor que o item que está na metade do vetor, procure na segunda metade, ou seja, a da direita. Se o item for igual ao item que está na metade do vetor, o item foi encontrado. Se o item for maior que o item que está na metade do vetor procure na primeira metade, ou seja, a da direita. Explicação: Neste tipo de busca, o vetor deve estar ordenado. Divide-se o conjunto de dados ao meio e procura-se no meio do vetor. Se achou, retorna a posição do dado do meio. SE não achou, verifica-se se o valor procurado vem antes do valor do meio. Se for verdade, redefine-se o fim do vetor, voltando a realizar a busca à esquerda do meio. Se o valor procurado vier depois do valor do meio do vetor, então redefine-se o início e segue-se para a busca na parte à direita do meio do vetor. 7a Questão Para consultarmos uma estrutura de dados, normalmente, empregamos um tipo de pesquisa de dados. O trecho de programa a seguir refere-se a uma pesquisa por um elemento único (sua primeira ocorrência), em um conjunto de elementos de dados armazenado em uma estrutura de acesso indexado e aleatório. Selecione a opção correspondente ao algoritmo utilizado, no programa, para a referida pesquisa: int busca(float v[], float valor, int n) { int ini = 0, fim = n -1, meio; while (ini <= fim) { meio = (ini + fim)/2; if (v[meio] == valor) return meio; if (valor < v[meio]) fim = meio -1; else ini = meio+1; } return -1; } pesquisa indexada pesquisa sequencial pesquisa binária pesquisa cadeias indexada pesquisa de cadeias 8a Questão Estude atentamente o código a segir: int deciframe(int v[ ], int tam, int e){ int i = 0, f = tam -1, m; while ( i <= f ){ m = ( i + f ) / 2; if ( v[m] == e ) { return m; } if ( e < v[m] ) { f = m - 1; } else { i = m + 1; } } return -1; } Sabendo que a chamada da mesma foi feita com os parâmetros recebendo os seguintes valores, o que ela retornaria? v[10] = {0, 2, 4, 6, 8, 10, 20, 100} tam = 8 e = 0 2 1 -2 0 -1 Explicação: A busca pode retornar o índice do elemento encontrado ou pode retornar -1, caso o elemento e não seja encontrado. Vemos que o valor de e é encontrado. Logo, a função retornará a posição do valor e = 0 no vetor. No caso, o elemento zero está na posição 0. Resposta : 0 1a Questão Analise o seguinte trecho de algoritmo de ordenação de dados, cujos elementos estão dispostos em um vetor de nome v com n elementos. ... { int i, j, aux; for (j = 1; j < n; j++) for (i=j; i > 0 && v[i-1]> v[i]; i--) { aux = v[i-1]; v[i-1] = v[i]; v[i] = aux; } } ... Assinale o método ao qual o trecho de algoritmo pertence. Heapsort Seleção Bolha Quicksort Inserção 2a Questão Considere a função misterio e o trecho abaixo. void misterio(int v[ ], int n) { //n é o número de elementos de v int i, j, m, aux; for (j = 0; j < n-1; j++) { m = j; for (i = j+1; i < n; i++) { if (v[i] < v[m]) m = i; } aux = v[j]; v[j] = v[m]; v[m] = aux; } } Trecho na main : int v[4] = {40,30,10,20}; misterio(v, 4); Marque a opção correta. Como ficará o vetor após a execução da função misterio ? 10 20 30 40 10 20 40 30 5 10 20 30 10 30 40 20 10 30 20 40 Explicação: O aluno precisa fazer um teste de mesa para achar a solução. A função implementa a ordenação por seleção, colocando o vetor de entrada em ordem crescente. 3a Questão Nos métodos de ordenação interna, quais são aqueles classificados como tipo método simples? Insert Sort, Bubble Sort e Quick Sort Selection Sort, Shell Sort e Bubble Sort Insert Sort, Bubble Sort e Shell Sort Shell Sort, Quick Sort e Heap Sort Selection Sort, Insert Sort e Bubble Sort 4a Questão Em uma pesquisa sequencial a lista deve estar? ordenada somente do início até a metade da lista. sempre desordenada. ordenada somente o primeiro da lista. ordenada ou desordenada. desordenada somente da metade da lista até o final. Explicação: A busca sequencial pode se usada para listas ordenadas ou não ordenadas, não havendo qualquer restrição a parte ou à totalidade da lista na ordenação. Já a busca binária só pode ser usada para listas ordenadas. 5a Questão Analisando o trecho de código a seguir: inicio=0; fim= tamanho - 1; meio=(inicio+fim)/2; while(procura != nomeVetor[meio] && inicio != fim) { if(procura > nomeVetor[meio]) inicio=meio+1; else fim=meio; meio=(inicio+fim)/2; } if(nomeVetor[meio]==procura) cout<<"\n....: "< < outroVetor[meio]<<endl; else cout<<"\nDado nao encontrado\n";</endl; Pode-se afirmar que: trata-se da implementação do algortimo de ordenação por inserção. trata-se da implementação do algortimo de busca sequencial trata-se da implementação do algortimo de ordenação bolha. trata-se da implementação do algortimo de busca binária. trata-se da implementação do algortimo de ordenação por seleção. 6a Questão Caso seja empregada uma busca binária em uma lista sequencial ordenada com 2048 valores, qual seria o número máximo de comparações para encontrar um valor que esteja na lista? 8 11 9 12 10 Explicação: Como a busca binária sai continuamente dividindo o conjunto de dados ao meio (em duas partes), então vamos fatorar e organizar o resultado como potência de base 2. Fatorando 2048 temos 2 11 Portanto, a resposta é 11. 7a Questão O seguinte trecho de programa abaixo representa qual tipo de estrutura de ordenação? voidordenar(float v[], int n) // n é o no. de elementos em v { int i , // índice aux, // auxiliar para troca trocou = true, fim = n - 1; while (trocou) { trocou = false; // sinaliza que é falso que trocou for (i = 0; i < fim; i++) { if (v[i] > v[i+1]) { aux = v[i]; v[i] = v[i+1]; v[i+1] = aux; // sinaliza que é verdadeiro que trocou trocou = true; } // fim if } // fim for fim--; // decrementa o fim } // fim while } // fim da função Mergesort Bublesort Shellsort Quicksort Heapsort 8a Questão if(vet[j] == vet[j-1] ) { aux=vet[j]; vet[j]= vet[j-1]; vet[j-1]=aux; } if(vet[j-1] > vet[j] ) { aux=vet[j]; vet[j]= vet[j-1]; vet[j-1]=aux; } if(vet[j] < vet[j-1] ) { aux=vet[j]; vet[j]< vet[j-1]; vet[j-1]=aux; } if(vet[j] < vet[j-1] ) { aux=vet[j]; vet[j-1]= vet[j]; vet[j-1]=aux; } if(vet[j-1] < vet[j] ) { aux=vet[j]; vet[j]= vet[j-1]; vet[j-1]=aux; } 1a Questão As estruturas de dados são utilizadas para manter dados ou informações organizados na memória, o que possibilita a otimização do uso destes dados. Porém, as estruturas guardam características especiais na manipulação destes dados, assim deve-se escolher a estrutura certa ou mais adequada para uma determinada aplicação. Portanto marque a opção que representa a melhor estrutura, quando se tem como requisitos principais o acesso aleatório aos dados e alocação destes de forma contínua na memória. Lista Encadeada Lista Sequencial Fila Sequencial Pilha Sequencial Pilha Encadeada 2a Questão Considere as seguintes afirmações sobre Listas Sequenciais: I - São estruturas lineares que utilizam as primeiras posições de um vetor para armazenar os dados de interesse. II - São compostas pelo conjunto dos dados que se deseja armazenar e por uma variável inteira que indica a quantidade de dados armazenados. III - Os dados são sempre inseridos ou removidos no final da lista, tomando-se o cuidado de atualizar a quantidade de dados da mesma. IV - A lista pode admitir ou não admitir que haja dados repetidos (listas podem ser com ou sem repetição). Marque a opção que contém apenas todas as afirmações verdadeiras: I, II, IV I, III, IV I, II, III I, II I, II, III, IV Explicação: Analisando cada afirmativa : I - São estruturas lineares que utilizam as primeiras posições de um vetor para armazenar os dados de interesse. Verdadeiro. As inserções vão ocorrendo do início do vetor (índice zero) em direção ao fim. II - São compostas pelo conjunto dos dados que se deseja armazenar e por uma variável inteira que indica a quantidade de dados armazenados. Verdadeiro. Armazenam-se os dados e controla-se a quantidade de dados na lista. III - Os dados são sempre inseridos ou removidos no final da lista, tomando-se o cuidado de atualizar a quantidade de dados da mesma. Falso. A inserção pode ser no início, no meio ou no final da lista. Na verdade, pode ocorrer inserção e remoção em qualquer posição. IV - A lista pode admitir ou não admitir que haja dados repetidos (listas podem ser com ou sem repetição). Verdadeiro. Uma lista pode ou não ter dados repetidos. Resposta certa : As afirmativas I, II, IV estão certas 3a Questão As estruturas de dados em programação são muito utilizadas para tornar o acesso aos dados mais eficiente e organizado. A estrutura de dados considerada mais simples e tem como característica apresentar apenas uma dimensão é: Matriz Variável Registro Vetor Função 4a Questão __________________________ é uma lista linear em que a alocação de memória pode ser estática, e que a forma de armazenamento é contígua ou sequencial na memória. Usamos este tipo de lista quando se tem em mente um tamanho pré-definido, ou seja, quando se sabe até onde a lista pode crescer. Lista Não Linear Lista Linear de Alocação de Memória Lista Linear Sequencial Lista Linear Não Alocada Lista Linear Não Sequencial 5a Questão for (int i = 0; i < n; i++) cout << L.matricula[i] << " " << L.nome[i] << endl; for (int i = 0; i < n; i++) cout << L.matricula << " " << L.nome << endl; for (int i = 0; i < n; i++) cout << L[i].matricula << " " << L[i].nome[30] << endl; for (int i = 0; i < n; i++) cout << L[i] << endl; for (int i = 0; i < n; i++) cout << L[i].matricula << " " << L[i].nome << endl; 6a Questão Considere as seguintes afirmações: I. Só podemos ter uma matriz de no máximo duas dimensões. Exemplo: C[100][100]. II. Ao declararmos um vetor int A[10], se escrevemos A[2] acessamos o segundo elemento do vetor. III. Uma string declarada como char B[30] armazena no máximo 30 caracteres. Escolha a alternativa correta: Está correta apenas a afirmativa I. Estão corretas apenas as afirmativas I e III. Nenhuma afirmação está correta. Está correta apenas a afirmativa II. Estão corretas apenas as afirmativas I e II. Explicação: Analisando cada afirmativa : I. Só podemos ter uma matriz de no máximo duas dimensões. Exemplo: C[100][100]. Falso. Podemos ter matrizes unidimensionais, tridimensionais, etc... II. Ao declararmos um vetor int A[10], se escrevemos A[2] acessamos o segundo elemento do vetor. Falso. Em C++ o índice inicial é zero. Logo, A[2] é o elemento de índice 2, ou seja, o 3o. elemento do vetor. III. Uma string declarada como char B[30] armazena no máximo 30 caracteres. Escolha a alternativa correta: Falso. B pode armazenar no máximo 29 caracteres que sejam dados, pois existe uma área para o caracter nulo. Logo, todas as opções são falsas. 7a Questão São métodos ou algoritmos conhecidos de ordenação de dados por troca: ordenação shell e hashing. bubble sort e quicksort. busca por ordenação e ordenação shell. hashing e bubble sort. quicksort e hashing. Explicação: Bubble sort é o algoritmo mais simples, mas o menos eficientes. Neste algoritmo cada elemento da posição i será comparado com o elemento da posição i + 1, ou seja, um elemento da posição 2 será comparado com o elemento da posição 3. Caso o elemento da posição 2 for maior que o da posição 3, eles trocam de lugar e assim sucessivamente. Por causa dessa forma de execução, o vetor terá que ser percorrido quantas vezes que for necessária, tornando o algoritmo ineficiente para listas muito grandes. O Quicksort é o algoritmo mais eficiente na ordenação por comparação. Nele se escolhe um elemento chamado de pivô, a partir disto é organizada a lista para que todos os números anteriores a ele sejam menores que ele, e todos os números posteriores a ele sejam maiores que ele. Ao final desse processo o número pivô já está em sua posição final. Os dois grupos desordenados recursivamente sofreram o mesmo processo até que a lista esteja ordenada. 8a Questão Estude atentamente o código a segir: int deciframe(intv[ ], int tam, int e){ int i = 0, f = tam -1, m; while ( i <= f ){ m = ( i + f ) / 2; if ( v[m] == e ) { return m; } if ( e < v[m] ) { f = m - 1; } else { i = m + 1; } } return -1; } Sabendo que a chamada da mesma foi feita com os parâmetros recebendo os seguintes valores, o que ela retornaria? v[10] = {0, 2, 4, 6, 8, 10, 20, 100} tam = 8 e = -6 0 -1 4 6 3 Explicação: Analisando int deciframe(int v[ ], int tam, int e) { int i = 0, f = tam -1, m; while ( i <= f ){ m = ( i + f ) / 2; if ( v[m] == e ) { return m; } if ( e < v[m] ) { f = m - 1; } else { i = m + 1; } } return -1; } Sabendo que a chamada da mesma foi feita com os parâmetros recebendo os seguintes valores, o que ela retornaria? v[10] = {0, 2, 4, 6, 8, 10, 20, 100} tam = 8 e = -6 Está procurando pelo valor e = -6. Como se sabe pelo estudo da busca binária e olhando o código dado, temos que -6 não existe na lista então a função irá retornar -1 (vide última linha da função). SE a busca tivesse sucesso, o teste do 1o. if no while seria verdadeiro e então o índice m de v seria retornado. Mas não é o caso, pois -6 não foi encontrado. 1a Questão Considere as seguintes afirmações sobre Listas Sequenciais: I - São estruturas lineares que utilizam as primeiras posições de um vetor para armazenar os dados de interesse. II - São compostas pelo conjunto dos dados que se deseja armazenar e por uma variável inteira que indica a quantidade de dados armazenados. III - Os dados são sempre inseridos ou removidos no final da lista, tomando-se o cuidado de atualizar a quantidade de dados da mesma. IV - A lista pode admitir ou não admitir que haja dados repetidos (listas podem ser com ou sem repetição). Marque a opção que contém apenas todas as afirmações verdadeiras: I, II, IV I, III, IV I, II I, II, III, IV I, II, III Explicação: Analisando cada afirmativa : I - São estruturas lineares que utilizam as primeiras posições de um vetor para armazenar os dados de interesse. Verdadeiro. As inserções vão ocorrendo do início do vetor (índice zero) em direção ao fim. II - São compostas pelo conjunto dos dados que se deseja armazenar e por uma variável inteira que indica a quantidade de dados armazenados. Verdadeiro. Armazenam-se os dados e controla-se a quantidade de dados na lista. III - Os dados são sempre inseridos ou removidos no final da lista, tomando-se o cuidado de atualizar a quantidade de dados da mesma. Falso. A inserção pode ser no início, no meio ou no final da lista. Na verdade, pode ocorrer inserção e remoção em qualquer posição. IV - A lista pode admitir ou não admitir que haja dados repetidos (listas podem ser com ou sem repetição). Verdadeiro. Uma lista pode ou não ter dados repetidos. Resposta certa : As afirmativas I, II, IV estão certas 2a Questão __________________________ é uma lista linear em que a alocação de memória pode ser estática, e que a forma de armazenamento é contígua ou sequencial na memória. Usamos este tipo de lista quando se tem em mente um tamanho pré-definido, ou seja, quando se sabe até onde a lista pode crescer. Lista Não Linear Lista Linear Não Alocada Lista Linear de Alocação de Memória Lista Linear Não Sequencial Lista Linear Sequencial 3a Questão Estude atentamente o código a segir: int deciframe(int v[ ], int tam, int e){ int i = 0, f = tam -1, m; while ( i <= f ){ m = ( i + f ) / 2; if ( v[m] == e ) { return m; } if ( e < v[m] ) { f = m - 1; } else { i = m + 1; } } return -1; } Sabendo que a chamada da mesma foi feita com os parâmetros recebendo os seguintes valores, o que ela retornaria? v[10] = {0, 2, 4, 6, 8, 10, 20, 100} tam = 8 e = -6 -1 3 6 0 4 Explicação: Analisando int deciframe(int v[ ], int tam, int e) { int i = 0, f = tam -1, m; while ( i <= f ){ m = ( i + f ) / 2; if ( v[m] == e ) { return m; } if ( e < v[m] ) { f = m - 1; } else { i = m + 1; } } return -1; } Sabendo que a chamada da mesma foi feita com os parâmetros recebendo os seguintes valores, o que ela retornaria? v[10] = {0, 2, 4, 6, 8, 10, 20, 100} tam = 8 e = -6 Está procurando pelo valor e = -6. Como se sabe pelo estudo da busca binária e olhando o código dado, temos que -6 não existe na lista então a função irá retornar -1 (vide última linha da função). SE a busca tivesse sucesso, o teste do 1o. if no while seria verdadeiro e então o índice m de v seria retornado. Mas não é o caso, pois -6 não foi encontrado. 4a Questão Considere as seguintes afirmações: I. Só podemos ter uma matriz de no máximo duas dimensões. Exemplo: C[100][100]. II. Ao declararmos um vetor int A[10], se escrevemos A[2] acessamos o segundo elemento do vetor. III. Uma string declarada como char B[30] armazena no máximo 30 caracteres. Escolha a alternativa correta: Está correta apenas a afirmativa I. Nenhuma afirmação está correta. Está correta apenas a afirmativa II. Estão corretas apenas as afirmativas I e II. Estão corretas apenas as afirmativas I e III. Explicação: Analisando cada afirmativa : I. Só podemos ter uma matriz de no máximo duas dimensões. Exemplo: C[100][100]. Falso. Podemos ter matrizes unidimensionais, tridimensionais, etc... II. Ao declararmos um vetor int A[10], se escrevemos A[2] acessamos o segundo elemento do vetor. Falso. Em C++ o índice inicial é zero. Logo, A[2] é o elemento de índice 2, ou seja, o 3o. elemento do vetor. III. Uma string declarada como char B[30] armazena no máximo 30 caracteres. Escolha a alternativa correta: Falso. B pode armazenar no máximo 29 caracteres que sejam dados, pois existe uma área para o caracter nulo. Logo, todas as opções são falsas. 5a Questão Com relação as listas lineares sequenciais: I - Uma lista linear sequencial é um vetor em linguagens estruturadas, também chamado de array. II - Um elemento de uma lista linear sequencial pode ser acessado diretamente através de um índice. III - Uma lista linear sequencial pode ter elementos de um mesmo tipo, ou de tipos diferentes. Apenas as afirmações II e III estão corretas. Apenas as afirmações II está corretas. Apenas a afirmação I está correta. Apenas as afirmações I e III estão corretas. Apenas as afirmações I e II estão corretas. 6a Questão São métodos ou algoritmos conhecidos de ordenação de dados por troca: ordenação shell e hashing. bubble sort e quicksort. hashing e bubble sort. busca por ordenação e ordenação shell. quicksort e hashing. Explicação: Bubble sort é o algoritmo mais simples, mas o menos eficientes. Neste algoritmo cada elemento da posição i será comparado com o elemento da posição i + 1, ou seja, um elemento da posição 2 será comparado com o elemento da posição 3. Caso o elemento da posição 2 for maior que o da posição 3, eles trocam de lugar e assim sucessivamente. Por causa dessa forma de execução, o vetor terá que ser percorrido quantas vezes que for necessária, tornando o algoritmo ineficiente para listas muito grandes. O Quicksort é o algoritmo mais eficiente na ordenação por comparação. Nele se escolhe um elemento chamado de pivô, a partir disto é organizada a lista para que todos os números anteriores a ele sejam menores que ele, e todos os números posteriores a ele sejam maiores que ele. Ao final desse processo o númeropivô já está em sua posição final. Os dois grupos desordenados recursivamente sofreram o mesmo processo até que a lista esteja ordenada. 7a Questão As estruturas de dados são utilizadas para manter dados ou informações organizados na memória, o que possibilita a otimização do uso destes dados. Porém, as estruturas guardam características especiais na manipulação destes dados, assim deve-se escolher a estrutura certa ou mais adequada para uma determinada aplicação. Portanto marque a opção que representa a melhor estrutura, quando se tem como requisitos principais o acesso aleatório aos dados e alocação destes de forma contínua na memória. Lista Sequencial Pilha Encadeada Pilha Sequencial Fila Sequencial Lista Encadeada 8a Questão Considere uma lista com n livros, em que cada livro é modelado pela struct : struct Livro { string titulo, editora, autor; float preco; }; A função X abaixo void X (Livro v[ ], int &n, Livro L) { v[n] = L; n++; cout << "Operação realizada com sucesso."; } implementa a operação de : Ordenação por inserção Inserção Busca Substituição Inicialização
Compartilhar