Buscar

Atividade N1(A2) - Técnicas de Programação

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

Prévia do material em texto

27/11/2020 Blackboard Learn
https://unp.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller# 1/6
Curso GRA1033 TÉCNICAS DE PROGRAMAÇÃO GR3342202 - 202020.ead-6374.04
Teste ATIVIDADE 2 (A2)
Iniciado 09/11/20 23:44
Enviado 27/11/20 19:25
Status Completada
Resultado da tentativa 10 em 10 pontos 
Tempo decorrido 427 horas, 41 minutos
Resultados exibidos Respostas enviadas, Respostas corretas, Comentários
Pergunta 1
Resposta
Selecionada:
Resposta
Correta:
Feedback
da
resposta:
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:
.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.
.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.
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).
1 em 1 pontos
27/11/2020 Blackboard Learn
https://unp.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller# 2/6
Pergunta 2
Resposta
Selecionada:
 
Resposta Correta: 
Feedback
da
resposta:
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:
. int NomeVendedorMaiorQtdVendas(float vendas[][30], char nomes[][40], 
 char nomemaior[]) ; 
 float NomeVendedorMaiorValorVendas(float vendas[][30], char nomes[]
[40], 
 char nomemaior[]) .
. int NomeVendedorMaiorQtdVendas(float vendas[][30], char nomes[][40], 
 char nomemaior[]) ;
 float NomeVendedorMaiorValorVendas(float vendas[][30], char nomes[]
[40], 
 char nomemaior[]) .
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 3
Resposta Selecionada: 
Resposta Correta: 
Feedback
da
resposta:
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:
.F ; V ; V ; F .
.F ; V ; V ; F .
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.
1 em 1 pontos
1 em 1 pontos
27/11/2020 Blackboard Learn
https://unp.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller# 3/6
Pergunta 4
Resposta
Selecionada:
Resposta
Correta:
Feedback
da
resposta:
Em funções recursivas, a posição da chamada recursiva em relação às demais linhas de seu código
influencia o resultado. Dependendo da posição, a recursividade é dita como pré-ordem (quando o
processamento antecede a chamada recursiva); ordem simétrica (quando o processamento encontra-
se entre duas chamadas recursivas) ou, finalmente, pós-ordem (processamento após as chamadas
recursivas). Para essa questão, suponha o código a seguir:
 
#include <stdio.h> 
 
void Recursao1(int i) 
 { 
 if(i>=5) return; 
 printf("%d ",i); 
 Recursao1(i+1); 
 } 
 
void Recursao2(int i) 
 { 
 if(i>=5) return; 
 Recursao2(i+1); 
 printf("%d ",i); 
 } 
 
int main() 
{ 
 printf("Recursao1\n"); 
 Recursao1(0); 
 printf("\n\nRecursao2\n"); 
 Recursao2(0); 
 return 0; 
} 
 
Assinale a opção que você julgue ser a correta:
.A função “ Recursao1” segue uma recursão pré-ordem – logo o seu resultado é “ 0 1 2
3 4”. Por sua vez, a função “ Recursao2” é pós-ordem, por consequência, o seu
resultado é: “ 4 3 2 1 0” .
.A função “Recursao1” segue uma recursão pré-ordem – logo o seu resultado é “0 1 2 3
4”. Por sua vez, a função “Recursao2” é pós-ordem, por consequência, o seu resultado
é: “4 3 2 1 0” .
Parabéns! Sua resposta foi a correta! Você observou corretamente a ordem de chamada
e impressão do resultado. Na pré-ordem, a impressão acontece antes da chamada, por
consequência, a impressão é realizada, neste caso, na ordemcrescente. Na pós-ordem,
a impressão acontece na ordem descrescente pois a recursão caminha por todos os
níveis da contagem e imprime o resultado na volta das chamadas recursivas.
Pergunta 5
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:
1 em 1 pontos
1 em 1 pontos
27/11/2020 Blackboard Learn
https://unp.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller# 4/6
Resposta Selecionada: 
Resposta Correta: 
Feedback
da
resposta:
.V; F; F; V.
.V; F; F; V.
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 6
Resposta Selecionada: 
Resposta Correta: 
Feedback
da
resposta:
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:
.V ; F; V ; V .
.V ; F; V ; V .
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 7
Na computação, existem várias formas de representação numérica, dentre as quais, podemos citar as
representações decimal, hexadecimal, octal e binária. Para realizar a conversão, por exemplo, de um
valor formatado na base decimal para uma base K , basta realizar divisões sucessivas por K e coletar
o último quociente e todos os restos das divisões em ordem inversa. 
Suponha a necessidade de criar uma função recursiva para a conversão de um número na base
decimal para a representação binária (base 2). Para essa questão, suponha o trecho a seguir:
 
#include <stdio.h> 
 
void Dec2Bin(int n) 
{ 
 if(__) printf("%d",n); 
 else 
 { 
 ___; 
 ___; 
 } 
} 
 
int main() 
{ 
 
 Dec2Bin(14); 
 return 0; 
} 
1 em 1 pontos
1 em 1 pontos
27/11/2020 Blackboard Learn
https://unp.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller# 5/6
Resposta Selecionada: 
Resposta Correta: 
Feedback
da
resposta:
 
Assinale a opção abaixo que contenha os trechos de código para preencher as lacunas:
. n<2 ; Dec2Bin(n / 2) ; printf("%d",n%2) .
. n<2 ; Dec2Bin(n / 2) ; printf("%d",n%2) .
Parabéns! Sua resposta foi a correta! Você interpretou corretamente o fato de a
impressão dos restos das divisões sucessivas é realizada na ordem reversa às divisões,
ou seja, a impressão necessita ser do tipo “pós-ordem”, inserida após a chamada
recursiva. Como critério de parada, a cláusula que indica a não possibilidade de
continuar as divisões por 2.
Pergunta 8
Resposta Selecionada: 
Resposta Correta: 
Feedback
da
resposta:
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):
. * ; * ; * ; * ; * ; * ; & ; & .
. * ; * ; * ; * ; * ; * ; & ; & .
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 9
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
1 em 1 pontos
1 em 1 pontos
27/11/2020 Blackboard Learn
https://unp.blackboard.com/webapps/late-Course_Landing_Page_Course_100-BBLEARN/Controller# 6/6
Resposta Selecionada: 
Resposta Correta: 
Feedback
da
resposta:
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:
. float CalculaQtdCarbono(unsigned char, float, float *); .
. float CalculaQtdCarbono(unsigned char, float, float *); .
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 10
Resposta Selecionada: 
Resposta Correta: 
Feedback
da
resposta:
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çãodo
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):
. __ ; __ ; int ; (rand()%6)+1 .
. __ ; __ ; int ; (rand()%6)+1 .
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.
1 em 1 pontos

Outros materiais