Buscar

Atividade 02 - 10 de 10

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 10 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 10 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 10 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Usuário JEFFERSON GOMES LIRA 
Curso GRA1033 TÉCNICAS DE PROGRAMAÇÃO GR3342211 - 
202110.ead-14912.01 
Teste ATIVIDADE 2 (A2) 
Iniciado 11/05/21 19:20 
Enviado 29/05/21 13:41 
Status Completada 
Resultado da 
tentativa 
10 em 10 pontos 
Tempo decorrido 426 horas, 21 minutos 
Resultados 
exibidos 
Respostas enviadas, Respostas corretas, Comentários 
• Pergunta 1 
1 em 1 pontos 
 
Para a evocação de uma função, algumas informações deverão ser 
armazenadas, como o endereço da linha que contém a evocação 
(registrador PC – Program Counter – Contador de Programa), para que, 
quando a função for finalizada, o computador saiba voltar ao ponto de 
chamada. Dentre as afirmativa abaixo, assinale com “V” aquela(s) que 
você julgar estar correta e, com “F”, a(s) falsa(s). 
 
( ) As informações para o retorno, em função da evocação da função, são 
empilhadas em uma região da memória principal do computador 
chamada “ stack” (pilha). 
( ) Não precisamos nos preocupar com a quantidade de evocações 
aninhadas (uma função chamando outra e assim por diante, em uma 
ação de profundidade) independentemente dos dispositivo para o qual 
estamos implementando nosso código. 
( ) Funções recursivas são aquelas que demandam muito recurso da 
máquina. 
( ) O sistema operacional também empilha as informações decorrentes 
das funções associadas às interrupções do computador. 
 
Assinale a alternativa abaixo que contenha a sequência que você julgue 
ser a correta: 
 
Resposta Selecionada: 
.V; F; F; V. 
Resposta Correta: 
.V; F; F; V. 
Comentário 
da resposta: 
Parabéns! Sua resposta foi a correta! Realmente, o sistema 
operacional deve salvar o endereço da linha na qual 
 
ocorreu a evocação da função para que se possa, ao 
término da função, voltar à linha subsequente à chamada. 
Esse salvamento ocorre em uma estrutura de pilha ( stack) 
da memória principal. Essa região de pilha pode ser 
extremamente limitada em ambientes com pouca 
memória, tal como nos sistemas embarcados. As 
interrupções da máquina são tratadas, superficialmente 
falando, de forma análoga às funções. 
 
• Pergunta 2 
1 em 1 pontos 
 
Com a recursividade, os laços de repetição são substituídos pelas 
chamadas recursivas. Esse tipo de implementação tem os seus estudos 
aprofundados na área da computação denominada como matemática 
discreta. Para essa questão, pense em uma solução recursiva, 
implementada em C, para resolver a expressão 2 n. Dentre as alternativas 
a seguir, escolha aquela que tiver uma codificação que corresponda à 
solução. 
 
Escolha a opção correta: 
 
Resposta 
Selecionada: 
 
. int dois_a_n(int n) { if(n == 0) return 
1; return 2*dois_a_n(n-1); } 
 . 
Resposta Correta: 
. int dois_a_n(int n) { if(n == 0) return 
1; return 2*dois_a_n(n-1); } 
 . 
Comentário 
da resposta: 
Parabéns! Sua resposta foi a correta! Você observou a 
relação entre a condição de parada e a variação do 
parâmetro passado. Como a condição de parada é 0, os 
parâmetros devem ser passados de forma descrescente. 
 
 
• Pergunta 3 
1 em 1 pontos 
 
Recursividade é uma técnica que permite a escrita de códigos de forma 
mais sucinta porém faz uso de forma mais massivo da pilha de memória. 
Para essa questão, analise o código a seguir: 
 
#include <stdio.h> 
 
int f(int a, int b) 
 { 
 if(!b)return a; 
 return f(b, a % b); 
 
 } 
 
int main() 
{ 
 int x=3, y=10; 
 printf("%d",f(x,y)); 
} 
 
Escolha a opção correta: 
Resposta 
Selecionada: 
 
.O código calcula o MDC (Máximo Divisor Comum) 
usando o algoritmo de Euclides. 
Resposta Correta: 
.O código calcula o MDC (Máximo Divisor Comum) 
usando o algoritmo de Euclides. 
Comentário 
da resposta: 
Parabéns! Sua resposta foi a correta! Você lembrou bem 
que a fórmula de Euclides é originalmente 
recursiva: MDC(a,b) = MDC(b,r) onde, “ r”= resto da divisão 
de “ a” por “ b”. 
 
 
• Pergunta 4 
1 em 1 pontos 
 
Uma das etapas iniciais da implementação das funções consiste na definição 
de suas interfaces, ou seja, definição dos tipos de retornos e de suas listas 
de parâmetros. Para essa questão, suponha o seguinte enunciado: “Um 
certa loja apresenta um programa de incentivo aos seus vendedores 
atribuindo premiações àqueles que realizaram mais vendas no mês 
(independentemente do valor vendido) e àqueles que conseguiram maiores 
montantes de venda (maior valor vendido independentemente do número de 
vendas efetuadas). As vendas estão lançadas em uma matriz – cada linha 
denota um vendedor e as colunas representam as vendas de cada 
vendedor. A última posição das colunas de cada vendedor contém o valor -1 
indicando o término dos lançamentos. Os nomes dos vendedores estão 
lançados em um vetor de strings – cada vendedor respresenta um índice do 
vetor“. 
 
Para tanto, serão criadas as funções abaixo: 
 
NomeVendedorMaiorQtdVendas( ); 
NomeVendedorMaiorValorVendas( ); 
 
Para a questão, suponha que a quantidade máxima de vendas vale 30 e os 
nomes têm o tamanho máximo de 40 caracteres. Assinale a opção abaixo 
que contenha as interfaces das funções apropriadas ao enunciado: 
 
Resposta 
Selecionada: 
 
. int NomeVendedorMaiorQtdVendas(float vendas[][30], 
char nomes[][40], 
 
 char nomemaior[]) 
; 
 float NomeVendedorMaiorValorVendas(float 
vendas[][30], char nomes[][40], 
 char 
nomemaior[]) . 
Resposta 
Correta: 
 
. int NomeVendedorMaiorQtdVendas(float vendas[][30], 
char nomes[][40], 
 char nomemaior[]) 
; 
 float NomeVendedorMaiorValorVendas(float 
vendas[][30], char nomes[][40], 
 char 
nomemaior[]) . 
Comentário 
da resposta: 
Parabéns! Sua resposta foi a correta! Você interpretou 
bem o enunciado realizando corretamente o tipo de 
retorno das funções e seus respectivos parâmetros. 
Podemos reforçar o fato da escolha do tipo “ int” para a 
maior quantidade de vendas (o número de vendas é um 
valor inteiro) e do tipo “ float” para o valor vendido (o 
montande de valor é uma grandeza que manipula os 
centavos, portanto, um valor do tipo real – float). 
Salientamos o fato de que, quando passamos matrizes 
como parâmetros, temos que informar o tamanho de pelo 
menos a última dimensão – essa foi o motivo de 
preenchermos o tamanho das colunas. 
 
• Pergunta 5 
1 em 1 pontos 
 
Para essa questão, suponha o seguinte enunciado. “A resistência de uma 
liga metálica se dá pelos percentuais de utilização de carbono misturados a 
outros elementos, essencialmente o ferro. Suponha a necessidade de se 
implementar uma função que, dada uma métrica de resistência (tipo de 
resistência – suponha que existam disponíveis 10 níveis de resistência) e um 
volume de ferro (em toneladas) calcule e retorne o percentual e a massa (em 
toneladas) de carbono a ser utilizada na liga metálica”. Para esse enunciado 
foi implementada uma função cuja chamada ocorrerá na forma: 
 
. . . 
float massaCarbono; 
massaCabono = CalculaQtdCarbono(tipo_resist,massaFerro, &percentual_carbono); 
. . . 
 
Assinale a opção abaixo que represente a interface mais apropriada para a 
questão: 
 
Resposta 
Selecionada: 
 
. float CalculaQtdCarbono(unsigned char, float, 
float *); . 
Resposta Correta: 
. float CalculaQtdCarbono(unsigned char, float, 
float *); . 
Comentário 
da resposta: 
Parabéns! Sua resposta foi a correta! Você interpretou 
corretamente o enunciado! Realmente, a função deve 
retornar dois valores: a massa de carbono (colocado 
como float em razão dos valores fracionários) e o 
percentual de carbono (passado como referência, 
como float, na lista de parâmetros da função). Foi 
utilizado o “ unsigned int” para o tipo da liga em função de 
uma escala com poucos valores (por exemplo, de 1 a 10). 
 
• Pergunta 6 
1 em 1 pontos 
 
Gerar números aleatórios tem a sua serventia em diversas situações,tais 
como geração de sequências para testes de softwares, solução inicial em 
problemas de otimização e definição do intervalo de tempo para o reenvio de 
informações em redes de computadores. Para o teste, imaginemos um 
cenário onde dois jogares disputam uma partida de lançamento de dados – 
ganha aquele que obtiver maior pontuação no dado lançado. Para simular 
esse cenário, imaginemos o código abaixo: 
 
#include <stdio.h> //arquivo header para a funcao printf() 
#include <stdlib.h> //arquivo header para as funcoes srand() e rand() 
#include <time.h> //arquivo header para a funcao time() 
 
 
void Compara(int __jog1, int __jog2) 
{ 
 if(jog1 > jog2) printf("Jogador 1 vencedor (1=%d x 2=%d)\n",jog1,jog2); 
 else if (jog1 < jog2) printf("Jogador 2 vencedor!(1=%d x 2=%d)\n",jog1,jog2); 
 else printf("Empate (%d)\n",jog1); 
} 
 
___ Dado() 
{ 
 return ____; 
} 
 
int main() 
{ 
 srand(time(NULL)); 
 Compara(Dado(),Dado()); 
 return 0; 
} 
 
 
 
Assinale a opção abaixo que contenha os trechos de código para preencher 
as lacunas (o caracter “_” significa para deixar a lacuna vazia): 
Resposta Selecionada: 
. __ ; __ ; int ; (rand()%6)+1 . 
Resposta Correta: 
. __ ; __ ; int ; (rand()%6)+1 . 
Comentário 
da resposta: 
Parabéns! Sua resposta foi a correta! Realmente nenhuma 
função requer passagem de parâmetros por referência 
pois o único valor retornado é feito através do retorno da 
função “ Dado()”. A geração do número aleatório segue a 
forma “ (rand()%6)+1” pois a soma por um impede a 
geração do valor 0 e o resto da divisão define o valor limite 
superior do número gerado. 
 
 
• Pergunta 7 
1 em 1 pontos 
 
Na linguagem C/C++, encontramos alguns comandos capazes de modificar 
o fluxo de execução de um programa: “ return ” (retorno de uma função), 
“ break ” (finaliza, por exemplo, um laço de repetição) e “ continue ” que volta 
para a linha que contém a definição do laço de repetição (por exemplo, a 
linha que contém a palavra “ for ”). Para essa questão, suponha que seja 
necessário implementar uma função hipotética que, passados como 
parâmetros os valores de “ início ” e de “ final ” de uma contagem, imprima os 
elementos de acordo com o seguinte conjunto de regras: não imprimir os 
números ímpares; caso seja encontrado um valor múltiplo de 5, sair de laço 
de repetição; caso seja encontrado o valor 48, sair da função. Para tanto, 
analise o código a seguir: 
 
 
#include <stdio.h> 
 
void func(int inicio, int final) 
{ 
 int i=inicio; 
 for(; i<final; i++) 
 { 
 if(i%2) ____; 
 printf("%d ",i); 
 if(!(i%5)) ____; 
 if(i==48) 
 { 
 printf("\nSaindo da funcao pois encontrou 48.\n"); 
 ____; 
 } 
 } 
 if(i==final) printf("\nsaiu do laco pelo limite da contagem\n"); 
 else printf("\nsaiu do laco pois encontrou um multiplo de 5\n"); 
} 
 
 
int main() 
{ 
 printf("Execucao 1:\n"); 
 func(6,15); 
 printf("Execucao 2:\n"); 
 func(46,55); 
 printf("Execucao 3:\n"); 
 func(36,39); 
 return 0; 
} 
 
Assinale a opção abaixo que contenha a ordem correta de aparição dos 
comandos “ return ”, “ break ” e “ continue ”: 
Resposta Selecionada: 
. continue ; break ; return . 
Resposta Correta: 
. continue ; break ; return . 
Comentário 
da resposta: 
Parabéns! Sua resposta foi a correta! Realmente, para 
pular os ímpares, deve-se incrementar o contador de 
contagem e voltar ao início do laço de repetição, usando, 
para tal, o “ continue”. Por sua vez, a finalização do laço 
(quando for múltiplo de 5) é conseguido pelo comando 
“ break”. Por fim, para encerrar totalmente a função, ao se 
deparar com o valor 48, utiliza-se o comando “ return”. 
 
 
• Pergunta 8 
1 em 1 pontos 
 
Na interface das funções, podemos encontrar as variáveis passadas por 
valor e as variáveis passadas por referência. Para essa questão, analise as 
afirmativas abaixo: 
 
I – Na passagem por valor, as modificações realizadas internamente à 
função não impactam sobre o valor da variável na origem da chamada da 
função. 
II – Na passagem por referência, qualquer alteração dentro da função, 
automaticamente altera o valor da variável na origem pois ambas 
possuem o mesmo endereço de memória. 
III – No código: “ func(int a , float *b)”, a variável “ a” é passada por 
referência enquanto que a variável “ b” é passada por valor. 
IV – Para realizar modificações ou acessar o conteúdo de variáveis 
passadas por referência, deve-se usar variável precedida pelo sinal “ &” 
para indicar o seu conteúdo. Por exemplo, na função “ func(int a , 
float *b)”, para se instanciar a variável “ b”, dentro do código, usaremos, 
por exemplo: “ &b = 5;”. 
 
 
Escolha a alternativa abaixo que você julgue ser a correta: 
Resposta Selecionada: 
.Apenas as afirmativas II e II estão corretas. 
Resposta Correta: 
.Apenas as afirmativas II e II estão corretas. 
Comentário 
da resposta: 
Parabéns! Sua resposta foi a correta! Realmente, a 
passagem de parâmetros por referência, a posição de 
memória é a mesma da variável origem, o que 
proporciona que ambas as variáveis estarão sempre 
sincronizadas. O acesso às variáveis passadas por 
referência, no caso do função da afirmativa IV, é feito 
mediante o uso do símbolo “*” (por exemplo, “ &b = 5;”). 
 
 
• Pergunta 9 
1 em 1 pontos 
 
Em algumas situações, como inversão de vetores, surge a necessidade de 
implementar uma função que realiza a troca de dois elementos entre si, ou 
seja, o elemento “ vet[i] ” recebe o valor de “ vet[j] ” e “ vet[j] ” recebe o valor de 
“ vet[i] ”. Sendo assim, pode-se codificar uma função que realizará 
exatamente essa permuta. Para essa questão, considere o código 
apresentado a seguir: 
 
 
#include <stdio.h> 
#include <string.h> 
 
void swap(char __c1, char __c2) 
{ 
 char tmp; 
 tmp = __c1; 
 __c1 = __c2; 
 __c2 = tmp; 
} 
 
void Ordena(char str[]) 
{ 
 for(int i=0; i < strlen(str)-1; i++) 
 for(int j=i+1; j < strlen(str); j++) 
 if(str[i]>str[j]) swap(__str[i],__str[j]); 
} 
 
int main() 
{ 
 char str[11]="icbjdgfeah"; 
 printf("Vetor original: %s\n",str); 
 Ordena(str); 
 printf("Vetor ordenado: %s\n",str); 
 
 return 0; 
} 
 
Assinale a opção abaixo que contenha os elementos para preencher as 
lacunas (nas opções abaixo, o símbolo ”_” significa deixar a lacuna sem 
preenchimento): 
Resposta Selecionada: 
. * ; * ; * ; * ; * ; * ; & ; & . 
Resposta Correta: 
. * ; * ; * ; * ; * ; * ; & ; & . 
Comentário 
da resposta: 
Parabéns! Sua resposta foi a correta! Você observou que, 
apesar da função “ swap” manipular elementos do vetor, 
foram passadas posições específicas, ou seja, foram 
passados apenas caracteres. Sendo assim, é necessário 
passar as referências dos itens “ str[i]” e “ str[j]” para 
que as alterações realizadas dentro da função “ swap” 
tenham validade na função “ Ordena”. 
 
 
• Pergunta 10 
1 em 1 pontos 
 
Os compiladores C/C++, para realizar a verificação de consistência de uso 
das funções, faz uso dos arquivos de cabeçalhos ( headers ). Nestes 
arquivos, por exemplo, o protótipo das funções são declarados. Desta forma, 
o compilador verifica se as chamadas implementadas estão compatíveis com 
as definições das funções. Para essa questão, suponha a existência de dois 
arquivos: um contendo o arquivo header e outro contendo a implementação 
em C . 
 
(A) Arquivo header : 
 
#ifndef _ARQHEADER 
#define _ARQHEADER 
 
int func1(int *, int); 
float func2(float, char []); 
void func3(int *, int *, float); 
int func4(char[],int, char); 
 
#endif 
 
(B) Arquivo de implementação 
 
int main() 
{ 
 int a,b,c; 
 float f1,f2; 
 char str[20],carac; 
 c=func1(a,b); //Linha 1 
 
 f2=func2(f1,str[0]); //Linha 2 
 c=func3(&a, &b, f1); //Linha 3 
 c=func4(str,a,carac); //Linha 4 
 func1(&c,a); //Linha 5 
 return 0; 
} 
 
Analisando a parte de implementação com o arquivoheader, assinale a 
alternativa que contém os possíveis erros que seriam acusados pelo 
compilador: 
Resposta 
Selecionada: 
 
.Na linha 1, o parâmetro “ a” não está sendo passado por 
referência (falta o “ &”); na linha 2, está sendo passado o 
caracter da posição 0 e não toda a string 
“ str”; na linha 3, está sendo atribuído um valor à 
variável “ c” por intermédio de uma função que nada 
retorna ( func3); as demais linhas estão corretas. 
Resposta 
Correta: 
 
.Na linha 1, o parâmetro “a” não está sendo passado por 
referência (falta o “&”); na linha 2, está sendo passado o 
caracter da posição 0 e não toda a string 
“str”; na linha 3, está sendo atribuído um valor à variável 
“c” por intermédio de uma função que nada retorna 
(func3); as demais linhas estão corretas. 
Comentário 
da resposta: 
Parabéns! Sua resposta foi a correta! Você fez a 
correspondência correta dos protótipos das funções 
(interfaces) definidos no arquivo de cabeçalhos nas 
chamadas inseridas no programa principal. Você observou 
bem que, apesar de uma função retornar um valor, não é 
obrigatório fazer uso do retono no momento da chamada 
da função (como está codificada a linha 5).

Continue navegando