Buscar

TÉCNICAS DE PROGRAMAÇÃO - ATIVIDADE 02

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 9 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 9 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 9 páginas

Prévia do material em texto

Curso CCO04097 TÉCNICAS DE PROGRAMAÇÃO GR3342202 - 
202020.ead-11058.01 
Teste ATIVIDADE 2 (A2) 
Iniciado 29/10/20 12:02 
Enviado 06/11/20 16:33 
Status Completada 
Resultado da 
tentativa 
10 em 10 pontos 
Tempo decorrido 196 horas, 30 minutos 
Resultados 
exibidos 
Respostas enviadas, Respostas corretas, Comentários 
• Pergunta 1 
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 *); . 
Feedback 
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 2 
1 em 1 pontos 
 
Quando construimos aplicações para que sejam executadas a partir do 
comando de linha (prompt ou console), temos a possibilidade de 
passarmos informações ao programa. Para tanto, usamos os parâmetros 
comumente identificados por “ argc ” e “ argv ”. Considerando o trecho: 
 
 int main(int argc, char *argv[]) 
 
Analise as afirmativas a seguir, marcando com “V” a(s) verdadeira(s) e, 
com “F” a(s) falsa(s): 
 
( ) caso colocarmos, em nosso código “ printf(“%s”,argv[0]) ”, será 
impresso o nome do próprio programa. 
( ) caso não passemos nenhum parâmetro ao programa, “ argv ” assumirá o 
valor 0. 
( ) o parâmetro “ argv ” é uma lista de strings . 
( ) o parâmetro “ argc ” sempre será positivo e maior ou igual a 1. 
 
Marque a opção que tiver a sequência que você julgue ser a correta: 
 
Resposta Selecionada: 
.V ; F; V ; V . 
Resposta Correta: 
.V ; F; V ; V . 
Feedback 
da resposta: 
Parabéns! Sua resposta foi a correta! Realmente, o parâmetro “ 
argv” sempre conterá pelo menos um item – que é o nome do 
arquivo executável evocado para a execução, inserido na posição 0 
do parâmetro “ argv”. Desta forma, o “ argc” sempre será maior 
ou igual a 1. 
 
 
• Pergunta 3 
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[]) . 
Feedback 
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 4 
1 em 1 pontos 
 
Para essa questão, suponha o seguinte enunciado: “O imposto de renda 
incidirá sobre o salário de todos os assalariados de modo que o desconto 
seja proporcional ao seu salário e de acordo com as faixas de valores”. 
Para esse enunciado foi implementada uma função cuja chamada ocorrerá 
na forma: 
 
 
. . . 
float salarioLiquido; 
salarioLiquido = CalculaIRPF(salario_bruto, &imposto_retido); 
. . . 
 
Assinale a opção abaixo que represente a interface mais apropriada para a 
questão: 
Resposta Selecionada: 
. float CalculaIRPF(float, float *); . 
Resposta Correta: 
. float CalculaIRPF(float, float *); . 
Feedback 
da resposta: 
Parabéns! Sua resposta foi a correta! Você interpretou 
corretamente o enunciado observando bem os valores retornados 
pela função. Os valores retornados devem ser passados como 
referência usando o símbolo “ *” no protótipo da função e “ &” na 
chamada da função. 
 
 
• Pergunta 5 
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 arquivo header, 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. 
Feedback 
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). 
 
 
• 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 . 
Feedback 
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 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. 
Feedback 
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 8 
1 em 1 pontos 
 
Um valor binário pode ser representado no padrão conhecido como BCD 
8421 ( Binary-coded Decimal – Decimal Codificado em Binário). Nesta 
codificação, os valores 8421 representam o resultado de 2 i , onde i denota 
a posição do dígito dentro da palavra. Por exemplo, 1001 (2) = 1*8 + 0*4 + 
0*2 +1*1 = 9 (10) . Para essa questão, suponha o seguinte código recursivo: 
 
#include <stdio.h> 
#include <string.h> 
 
int Bin2Dec(char bin[],int pos,int exp) 
{ 
 if(____) return 0; 
 return (bin[pos]-48)*exp + Bin2Dec(bin,____,____); 
} 
 
int main() 
{ 
 char binario[9]="10011101"; //valor em decimal = 157 
 printf("Valor convertido: %d", Bin2Dec(binario,strlen(binario)-
1,1)); 
 return 0; 
} 
 
Assinale a opção abaixo que contenha os trechos de código para 
preencher as lacunas: 
 
Resposta Selecionada: 
. pos<0 ; pos-1 ; exp*2 . 
Resposta Correta: 
. pos<0 ; pos-1 ; exp*2 . 
 
Feedback 
da 
resposta: 
Parabéns! Sua resposta foi a correta! Realmente o código foi 
implementado para que a última posição fosse evocada antes para 
facilitar o cálculo do expoente – à medida que se aproxima da 
posição 0 (início do vetor – posição mais significativa do número 
binário), o expoente vai sendo multiplicado por 2. Sendo assim, a 
posição foi descrementada a cada evocação da função recursiva. A 
posição 0 do vetor também deveria ser manipulada – essa a razão 
do ( pos<0). 
 
• Pergunta 9 
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); } 
 . 
Feedback 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 10 
1 em 1 pontos 
 
Modularizar um sistema significa dividí-lo em blocos funcionais e, estes subdividí-
los em funções. É recomendável que as funções tenham o seu comportamento bem 
pontual, ou seja, deve ser única a desempenhar uma função específica. Diante da 
questão sobre modularização, assinale com “V” a(s) afirmativa(s) abaixo que você 
julgue como verdadeira(s) e, com (F), a(s) falsa(s). 
 
( ) Dificulta o processo de testes pelo fato de que, com a modularização, deve-se 
testar um número muito maior de funções . 
 
( ) Facilita a reutilização do código pois a funcionalidade de uma função pode fazer 
parte de uma outra parte do sistema. 
( ) O programa fica mais organizado, separado por funcionalidades. 
( ) A compreensão do código se torna mais exaustiva devido ao grande número de 
chamadas de funções na implementação. 
 
Escolha a opção correta: 
Resposta Selecionada: 
.F ; V ; V ; F . 
Resposta Correta: 
.F ; V ; V ; F . 
Feedback 
da resposta: 
Parabéns! Sua resposta foi a correta! Realmente, a modularização 
facilita o processo de verificação, testes, compreensão e 
reaproveitamento de código pelo fato de que existe uma separação 
funcional do código assim como as funções são implementadas de 
forma mais pontuais.

Outros materiais