Buscar

GRA1033 TÉCNICAS DE PROGRAMAÇÃO GR3342211 - 202110

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

Pergunta 1
Resposta
Selecionada:
Resposta
Correta:
Comentário
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 ordem
crescente. 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 2
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. 
1 em 1 pontos
1 em 1 pontos
Resposta
Selecionada:
Resposta
Correta:
Comentário
da resposta:
 
Escolha a opção correta:
. int dois_a_n(int n) { if(n == 0) return 1; 
return 2*dois_a_n(n-1); } 
 .
. int dois_a_n(int n) { if(n == 0) return 1; 
return 2*dois_a_n(n-1); }
 .
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
Resposta
Selecionada:
 
Resposta Correta: 
Comentário
da resposta:
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; 
} 
 
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.
1 em 1 pontos
Pergunta 4
Resposta Selecionada: 
Resposta Correta: 
Comentário
da resposta:
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:
. pos<0 ; pos-1 ; exp*2 .
. pos<0 ; pos-1 ; exp*2 .
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 5
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:
1 em 1 pontos
1 em 1 pontos
Resposta Selecionada: 
Resposta Correta: 
Comentário
da resposta:
.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 6
Resposta Selecionada: 
Resposta Correta: 
Comentário
da resposta:
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:
. float CalculaIRPF(float, float *); .
. float CalculaIRPF(float, float *); .
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 7
Resposta Selecionada: 
Resposta Correta: 
Comentário
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
Pergunta 8
Resposta Selecionada: 
Resposta Correta: 
Comentário
da resposta:
Quando se implementa uma fução, devemos seguir a sintaxe da linguagem de
programação utilizada e, também, realzar a definição de sua interface de acordo
com as nossas necessidades. Para essa questão, suponha o trecho de código a
seguir:
 
#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() 
 
___ func1(int ___x, ___ a) 
{ 
 ___x=rand()%a; 
 return ___x*(rand()%5); 
} 
 
int main() 
{ 
 int aleat,ret; 
 int a=10; 
 srand(time(NULL)); //iniciacao do gerador de numeros aleatorios 
 for(int i=0; i<10;i++) 
 { 
 ret=func1(__aleat,a); 
 printf("valor aleatorio gerado %d: %d (limitado %d) - ret funcao: %d.\n", 
 i,aleat,a,ret); 
 } 
 return 0; 
} 
 
Escolha a afirmativa que contém o resultado da impressão pela função “ printf ” e
os trechos a serem inseridos nas lacunas:
. int ; * ; deixar em branco ; * ; * ; & .
.int ; * ; deixar em branco ; * ; * ; & .
Parabéns! Sua resposta foi a correta! Você observou bem o fato de que a variável
“ aleat”, dentro da função “ main()” não foi instanciada e que a referida
instanciação ocorre dentro da função “ func1”. Desta forma, é necessário que
ela seja passada como referência. Associando esse tipo de passagem, os demais
preenchimentos são consequência.
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 metálica”. Para esse enunciado foi implementada uma
função cuja chamada ocorrerá na forma:
 
. . . 
float massaCarbono; 
massaCabono = CalculaQtdCarbono(tipo_resist,massaFerro,&percentual_carbono); 
. . . 
 
1 em 1 pontos
1 em 1 pontos
Resposta
Selecionada:
 
Resposta
Correta:
Comentário
da resposta:
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: 
Comentário
da resposta:
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:
.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.
1 em 1 pontos

Continue navegando