Baixe o app para aproveitar ainda mais
Prévia do material em texto
ESTRUTURA DE DADOS Lupa Calc. PPT MP3 CCT0826_A8_201902160274_V1 Aluno: OSMAR DA SILVA GUIMARÃES Matr.: 201902160274 Disc.: ESTRUTURA DE DADOS 2020.1 EAD (G) / EX Prezado (a) Aluno(a), Você fará agora seu TESTE DE CONHECIMENTO! Lembre-se que este exercício é opcional, mas não valerá ponto para sua avaliação. O mesmo será composto de questões de múltipla escolha. Após responde cada questão, você terá acesso ao gabarito comentado e/ou à explicação da mesma. Aproveite para se familiarizar com este modelo de questões que será usado na sua AV e AVS. 1. Considere int *ptr, *qtr, *r; int a = 10, b = 20; Após executar cada instrução conforme a ordem dada a seguir : ptr = &a; qtr = &b; *ptr = *ptr + *qtr; ++(*qtr); r = qtr; qtr = ptr; assinale a opção que mostra, correta e respectivamente, os valores de *ptr, *qtr , *r , a e b . 30 30 21 10 20 30 30 21 30 21 30 20 0 30 21 30 20 20 10 20 30 21 21 10 20 2. Considere uma lista simplesmente encadeada com placas de carros. Assinale a opção que, corretamente, imprime todas as placas da lista. Considere : struct no { string placa; struct no *link; }; no *p; //p aponta para o início da lista void imprimir(no *p) { while (p != NULL) { cout << pplaca; } } void imprimir(no *p) { if (p != NULL) { cout << pplaca; p = plink; } } void imprimir(no *p) { while (p != NULL) { cout << p.placa; p = p.link; } } void imprimir(no *p) { while (p != NULL) { cout << pplaca; p = plink; } } void imprimir(no p) { while (p != NULL) { cout << pno; p = plink; } } Gabarito Coment. 3. E C++, quando um ponteiro é declarado para uma struct, o acesso aos campos deste registro (struct) se dá pelo operador : ∙ (ponto). * (asterisco). -> (seta). , (vírgula). & (e comercial ou eitza). Explicação: Por definição, o operador é o seta, pois se tem, no caso, ponteiro para struct. 4. Sou uma empresária que quer crescer e por isso, tenho que aumentar progressivamente a minha lista de clientes, sem limitar este crescimento. Assim, à medida que novos clientes são cadastrados, posso, se necessário, contratar mais e mais empregados. Marque a opção que especifica o tipo de lista e o tipo de alocação de memória mais adequados para este problema. fila encadeada e alocação dinâmica de memória pilha dinâmica e alocação dinâmica de memória fila dinâmica e alocação dinâmica de memória lista encadeada e alocação dinâmica de memória lista sequencial e alocação dinâmica de memória Gabarito Coment. 5. q Considere int *p, *q, *r; int x = 10, y = 20; Após seguir cada instrução na ordem dada a seguir : p = &x; q = &y; *p = *p + *q; (*q)++; r = q; q = p; identifique a opção que fornece correta e respectivamente, os valores de *p, *q , *r , x e y : 30 30 21 10 20 30 30 21 30 21 30 21 21 10 20 30 20 20 10 20 30 20 0 30 21 Explicação: Fazendo passo a passo temos : int *p, *q, *r; int x = 10, y = 20; p = &x; //p aponta para x, que vale 10 q = &y; // q aponta para y que recebeu 20 *p = *p + *q; //a área apontada por p, que é x, vai receber 10 + 20, que dá 30. Logo, *p e x valem 30. (*q)++; //A área apontada por q é incrementada. Ou sejam, y ou *q recebem 21 r = q; //r aponta para y q = p; // q aponta para onde p aponta, ou seja, q aponta para x Logo : *p , que é x, vale 30 *q, que é igual a *p, que é x, vale 30 *r é y, que vale 21 x vale 30 y vale 21 Logo, a resposta certa é 30 30 21 30 21 6. As structs (estruturas) são utilizadas para modelar os nodos de estruturas dinâmicas como, por exemplo, as listas encadeadas, seja o seguinte exemplo de nodo de uma lista de produtos: struct nodo{ float valor; string produto; nodo * proximo; }; Suponha que um determinado ponteiro pt esteja apontando para um nodo desta lista, e que se queira alterar o conteúdo do campo valor deste nodo, que está sendo apontado por pt, para 5.60. Marque a alternativa que corretamente possibilita esta operação: pt->próximo.valor=5.60; pt.valor->5.60; pt->valor=5.60; pt->5.60; pt->próximo->valor=5.60; Explicação: O codigo será: pt->valor=5.60; 7. Tenho uma lista não ordenada de clientes em que registro apenas a matrícula, o nome, o endereço e o telefone de cada cliente. Como não tenho limites para o crescimento da minha lista, como posso implementar a inserção de um novo cliente na lista, sabendo que cada cliente é do tipo Cliente e a lista é do tipo Lista assim definidos : struct Cliente { long int matricula; string nome, endereco, tel; }; struct Lista { Cliente c; struct Lista *link; }; Lista * insereCliente(Lista *p, Cliente cl) { Lista *novo ; novo->c = cl; novo->link = p; return novo; } Lista * insereCliente(Lista *p, Cliente cl) { Lista *novo = new Lista; novo.c = cl; novo.link = p; return novo; } Lista * insereCliente(Lista *p, Cliente cl) { Lista *novo = new Lista; novo->c = cl; novo->link = p; return novo; } Lista * insereCliente(Lista *p) { Lista *novo = new Lista; Cliente cl; novo->c = cl; novo->link = p; return novo; } Lista insereCliente(Lista *p, Cliente cl) { Lista novo[]; novo[0].c = cl; novo[0].link = p; return novo; } Gabarito Coment. 8. Qual é o resultado do código abaixo: int a =10; int *p = &a; cout<< &p << endl; Nenhuma das opções anteriores O endereço da variável a será impresso O endereço da variável p será impresso O conteúdo da variável p será impresso O conteúdo da variável a será impresso Explicação: Analisando o trecho de código : Linha 1 : A variável a recebeu o valor 10 Linha 2 : p é declarado como ponteiro para inteiro e recebe, na declaração, o endereço de a. Linha 3 : É impresso o endereço do ponteiro p. Opções : >> O endereço da variável a será impresso Explicação : Falso. O endereço de a é p ou &a. >> O endereço da variável p será impresso Explicação : Correto. Usou o operador & antes de p. >> O conteúdo da variável a será impresso Explicação : Falso. Para imprimir a temos que fazer cout << a; ou fazer cout << *p; O conteúdo da variável p será impresso Explicação : FAlso. É impresso o endereço de p, pois se usou &. Nenhuma das opções anteriores Explicação : FAlso. Basta ver as opções anteriores. ESTRUTURA DE DADOS Lupa Calc. PPT MP3 CCT0826_A8_201902160274_V2 Aluno: OSMAR DA SILVA GUIMARÃES Matr.: 201902160274 Disc.: ESTRUTURA DE DADOS 2020.1 EAD (G) / EX Prezado (a) Aluno(a), Você fará agora seu TESTE DE CONHECIMENTO! Lembre-se que este exercício é opcional, mas não valerá ponto para sua avaliação. O mesmo será composto de questões de múltipla escolha. Após responde cada questão, você terá acesso ao gabarito comentado e/ou à explicação da mesma. Aproveite para se familiarizar com este modelo de questões que será usado na sua AV e AVS. 1. Qual das inicializaçõesde ponteiros apresentadas abaixo está correta? int *p = new int; int *p = new *int; int *p = create int; int *p = new int*; int *p = new int[]; 2. Tei Ping , famosa cabeleireira das estrelas, possui uma lista não ordenada de clientes em que registra apenas o nome, endereço e o telefone de cada cliente. Como não se pode pré-definir um limite para o tamanho da lista, como se pode implementar a inserção de um novo cliente na lista ? Sabe-se que cada cliente é do tipo Cliente e a lista é do tipo List assim definidos : struct Cliente { long int matricula; string nome, endereco e tel; }; struct List { Cliente p; struct List *link; }; List * insereCliente(List *i, Cliente c){ List *novo ; novo->p = c; novo->link = i; return novo; } List * insereCliente(List *i) { List *novo = new List; Cliente c; novo->p = c; novo->link = i; return novo; } List * insereCliente(List *i, Cliente c) { List *novo = new List; novo->p = c; novo->link =i; return novo; } List insereCliente(List *i, Cliente c) { List novo[]; novo[0].p = c; novo[0].link = i; return novo; } List * insereCliente(List *i, Cliente c) { List *novo = new List; novo.p = c; novo.link = i; return novo; } Explicação: Analisando a resposta certa : List * insereCliente(List *i, Cliente c) { List *novo = new List; //aloca memória para novo nó novo->p = c; //acessa o campo p da área apontada por novo e atribui o cliente c ao campo p novo->link =i; //faz o link do novo nó apontar para onde i está apontando return novo; //retorna o endereço do novo nó } Logo, esta função insere um novo nó no início de uma lista simplesmente encadeada e retorna o ponteiro para o início da lista resultante. Analisando as demais opções, que estão erradas : 2o. item .... Opção errada : faltou alocar memória 3o. item .... Opção errada : Cliente c não está definido. 4o. item .... Opção errada : Usa ponto quando deveria ser o operador seta 5o. item .... Opção errada : Muitos erros... Usa vetor sem definir tamanho e trabalha com o elemento de índice zero de novo, acessando os campos com ponto. 3. As funções abaixo tem objetivos de: A primeira faz uma busca retornando o valor do nó ou NULL quando não encontrado, já a segunda insere um novo nó no final da LSE; A primeira faz uma busca retornando o valor do nó ou NULL quando não encontrado, já a segunda insere um novo nó no inicio da LSE; A primeira faz uma busca retornando o endereço do nó ou NULL quando não encontrado, já a segunda insere um novo nó no final da LSE; A primeira faz uma busca retornando a posição do nó ou NULL quando não encontrado, já a segunda insere um novo nó no inicio da LSE; A primeira faz uma busca retornando o endereço do nó ou NULL quando não encontrado, já a segunda insere um novo nó no inicio da LSE; 4. Podemos dizer que uma lista encadeada tem as seguintes características: i) conhecida como lista ligada. ii) seus nós são responsáveis para manter a sequência da lista. iii) o último nó deve apontar para NULL. Assinale a alternativa que informa as afirmativas corretas. Todas as afirmativas estão incorretas. Todas as afirmativas estão corretas. Somente a afirmativa iii esta correta. Somente as afirmativas i e ii estão corretas. Somente a afirmativa i esta correta. Gabarito Coment. 5. Uma estrutura de dados pode ser Estática ou Dinâmica. No primeiro caso os limites são: Indeterminados Determinados pelo problema em que serão utilizados Determinados pelo usuário Determinados pela memória Determinados pelos ponteiros Explicação: Em uma estrutura estática o espaço em memória é definido antes da execução e será definido pelas características do problema. Não é indeterminado, não temos que usar ponteiros, não é determinado pelo usuário ou pela memória. Quando a alocação é dinâmica, o espaço em memória é definido durante a execução do programa e assim, não podemos determinar previamente o quanto de memória será alocada. 6. Uma lista linear implementada através de encadeamento deve apresentar obrigatoriamente: i) um ponteiro para o primeiro nó da lista; ii) encadeamento entre os nós, através de algum campo de ligação; iii) não deve haver uma indicação de final da lista; iv) um ponteiro para o final da lista. Levando em consideração as afirmações apresentadas, qual das alternativas é a correta? as afirmações i e ii estão corretas. as afirmações ii e iv estão corretas. as afirmações i, ii e iii estão corretas. somente a afirmação iv esta correta. somente a afirmação i esta correta. 7. Numa Lista Encadeada, podemos afirmar que: I) Todos os nós são alocados de uma única vez. II) Os nós não são alocados contiguamente na memória obrigatoriamente. III) Os elementos de uma lista encadeada são ligados por dois ponteiros. IV) Para que possamos percorrer toda a lista, precisamos armazenar o endereço do próximo elemento para possibilitar o encadeamento. II e IV estão corretas I, III e IV estão corretas I, II, III e IV estão corretas I , II e III estão corretas Só a II está correta Gabarito Coment. 8. QUAL A SAÍDA DO PROGRAMA ABAIXO? #include main() { int x=5,*p; p=&x; cout << x - *p << " " << **&*&p + 1 << " " << *p*2+*p << " " << x+**&p; system("pause"); } 1 6 15 12 0 8 16 10 0 6 15 11 0 6 15 10 0 6 16 14 ESTRUTURA DE DADOS Lupa Calc. PPT MP3 CCT0826_A8_201902160274_V3 Aluno: OSMAR DA SILVA GUIMARÃES Matr.: 201902160274 Disc.: ESTRUTURA DE DADOS 2020.1 EAD (G) / EX Prezado (a) Aluno(a), Você fará agora seu TESTE DE CONHECIMENTO! Lembre-se que este exercício é opcional, mas não valerá ponto para sua avaliação. O mesmo será composto de questões de múltipla escolha. Após responde cada questão, você terá acesso ao gabarito comentado e/ou à explicação da mesma. Aproveite para se familiarizar com este modelo de questões que será usado na sua AV e AVS. 1. O conceito de ponteiros foi estudado em uma de nossas aulas. Sendo assim, leia atentamente as afirmativas abaixo e assinale a opção correta. I A variável ponteiro não precisa ser declarada. II A variável ponteiro armazena endereço. III Quanto se usa &nomeDaVariávelPonteiro com o comando cout, é exibido o endereço da variável apontada pela variável ponteiro. IV Quando se usa nomeDaVariávelPonteiro com o comando cout, é exibido o endereço da variável ponteiro. V Quando se usa *nomeDaVariávelPonteiro com o comando cout, é exibido o conteúdo da variável apontada pela variável ponteiro. II e V estão corretas I, II e IV estão corretas Somente a II está correta I IV e V estão corretas IV e V estão corretas Gabarito Coment. 2. Dr. Pei Tam possui uma lista não ordenada de pacientes de seu consultório em que registra apenas o nome endereço e o telefone de cada paciente. Como não há limites para o crescimento de sua lista, como se pode implementar a inserção de um novo paciente na lista, sabendo que cada paciente é do tipo Paciente e a lista é do tipo List assim definidos : struct Paciente { long int matricula; string nome, endereco e tel; }; struct List { Paciente p; struct List *link;}; List * inserePac(List *i, Paciente pt){ List *novo ; novo->p = pt; novo->link = i; return novo; } List * inserePac(List *i, Paciente pt) { List *novo = new List; novo->p = pt; novo->link =i; return novo; } List insereCliente(List *i, Paciente pac) { List novo[]; novo[0].p = pac; novo[0].link = i; return novo; } List * inserePac(List *i, Paciente pac) { List *novo = new List; novo.p = pac; novo.link = i; return novo; } List * inserePac(List *i) { List *novo = new List; Paciente pat; novo->p = pat; novo->link = i; return novo; } Gabarito Coment. 3. Qual o valor de x no final do programa? int main() { int x, *p, y; x = 3; p = &x; y = *p; y = 7; (*p)++; (*p) += y; return(0); } 11 3 -4 7 Nenhuma das anteriores. O programa possui um erro de sintaxe. Explicação: Considerando o trecho do programa dado, vamos analisar passo a passo. int x, *p, y; x = 3; p = &x; //p aponta para x, que vale 3 y = *p; //y recebe o conteúdo da área apontada por p, que é 3. Logo, y recebe 3. y = 7; //Agora y recebe 7 (*p)++; //A área apontada por p é incrementada. Ou seja, x é incrementado, passando a valer 4 (*p) += y; //Equivale a *p = *p + y; Logo, *p recebe 4 + 7, pois *p é x. Então, *p, que é x recebe 11. Portanto, a resposta certa é 11. 4. Assinale a alternativa correta sobre alocação de memória. Na alocação dinâmica de memória, a memória é alocada sob demanda, apenas quando necessário. Uma das vantagens da alocação dinâmica sobre a alocação estática é que não é necessário fazer a liberação da memória utilizada. É correto afirmar que a alocação dinâmica de memória sempre leva a programas mais rápidos. A declaração de um vetor é um exemplo clássico de alocação dinâmica de memória. Alocação estática de memória refere-se ao processo de alocar memória com o uso de ponteiros. 5. Em uma aplicação que usa processos de alocação estática e dinâmica de memória é correto afirmar que A memória utilizada pela aplicação é totalmente alocada após o inicio de sua execução Todas as afirmações acima são incorretas A memória utilizada pela aplicação é inicialmente estática, mas pode mudar Toda a memória utilizada pela aplicação não muda durante toda a sua execução Apenas a memória associada às variáveis do tipo vetor é alocada após o inicio da execução da aplicação Gabarito Coment. 6. Seja a seguinte seqüência de instruções em um programa C++: int *pti; int i = 10; pti = &i; Qual afirmativa é falsa? pti armazena o endereço de i pti é igual a 10 ao se executar *pti = 20; i passará a ter o valor 20 ao se alterar o valor de i, *pti será modificado *pti é igual a 10 Explicação: Analisando cada opção : pti é igual a 10 Explicação : A afirmativa está incorreta porque *pti é igual 10 e não pti é igual a 10. Note que pti é o endereço de i. Logo, a afirmativa deve ser marcada. pti armazena o endereço de i Explicação : pti é um ponteiro que recebeu o endereço (&) de i. Logo, a afirmativa está correta e não deve ser marcada. *pti é igual a 10 Explicação : Afirmativa correta e não deve ser marcada, visto que * é o operador de indireção. Como pti aponta para i, logo *pti é i, que vale 10. ao se executar *pti = 20; i passará a ter o valor 20 Explicação : Afirmativa correta e não deve ser marcada, visto que *pti acessa a área apontada por i. Se *pti recebeu 20 significa que i recebeu 20. ao se alterar o valor de i, *pti será modificado Explicação : Afirmativa correta e não deve ser marcada, visto que pti aponta para i e dessa forma, *pti é i. 7. Em uma aplicação que usa apenas o processo de alocação estática de memória é correto afirmar que: Todas as afirmações acima são incorretas Toda a memória utilizada pela aplicação não muda durante toda a sua execução A memória utilizada pela aplicação é inicialmente estática, mas pode mudar A memória utilizada pela aplicação é totalmente alocada após o inicio de sua execução Apenas a memória associada às variáveis do tipo vetor é alocada após o inicio da execução da aplicação Gabarito Coment. 8. Seja uma lista encadeada cujo nodo é representado por: struct nodo{ int valor; nodo prox; }; Esta estrutura possui um ponteiro de referência que aponta sempre para o primeiro nodo da lista, sendo este declarado como: nodo *lista; Numa lista encadeada seu último nodo possui o campo prox sempre igual a NULL. Marque a opção que representa o trecho de código onde um ponteiro auxiliar é capaz de percorre a lista até seu último nodo: nodo *lista=aux; while(aux->prox)aux=aux->prox; nodo *aux=lista; while(aux->prox)aux->prox=aux->prox; nodo *aux=lista; while(aux)aux->prox=aux; nodo *aux=lista; while(lista->prox)aux=aux->prox; nodo *aux=lista; while(aux->prox)aux=aux->prox; Explicação: nodo *aux=lista; while(aux->prox)aux=aux->prox;
Compartilhar