Buscar

A2 Tecnicas de Programação

Prévia do material em texto

 Pergunta 1 
1 em 1 pontos 
 
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: 
 
Resposta Selecionada: 
. int ; * ; deixar em branco ; * ; * ; & . 
Resposta Correta: 
.int ; * ; deixar em branco ; * ; * ; & . 
Comentário 
da resposta: 
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 2 
1 em 1 pontos 
 
Quando se implementa uma fução, devemos seguir a sintaxe da linguagem 
de programação utilizada e, também, realizar a definição de sua interface de 
acordo com as nossas necessidades. Para essa questão, suponha o trecho 
de código a seguir para procurar uma sequência dentro de uma cadeia de 
DNA: 
 
#include <stdio.h> 
 
#include <string.h> 
 
___ ProcuraDNA(char ___dna[],char ___seq[],int ___ret[]) 
{ 
 int indice=0; 
 for(int i=0; i<strlen(dna); i++) 
 if(!strncmp(&(dna[i]),seq,3)) ret[indice++]=i; 
 ret[indice]=-1; //apenas para marcar o último item adicionado 
} 
 
int main() 
{ 
 int i=0, pos[19]; 
 char str[19] = "GATGATCATGTCGTACATC", //uma sequencia de DNA qualquer 
 seq_proc[4] = "ATG"; //Adenina, Timina, Guanina – uma cadeia exemplo 
 ProcuraDNA(str,seq_proc,pos); 
 printf("posicoes:"); 
 while(pos[i]!=-1) 
 { 
 printf("%d ",pos[i]); 
 i++; 
 } 
 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: 
Resposta 
Selecionada: 
 
. void ; deixar em branco ; deixar em branco ; deixar 
em branco . 
Resposta Correta: 
.void ; deixar em branco ; deixar em branco ; deixar 
em branco . 
Comentário 
da resposta: 
Parabéns! Sua resposta foi a correta! Você se atentou bem 
ao fato de que vetores, de forma como as strings, quando 
passadas como parâmetros, já denotam passagem por 
referência. Sendo assim, os símbolos “*” e “&” não são 
necessários. 
 
 
 Pergunta 3 
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 . 
Comentário 
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 4 
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 5 
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 . 
Comentário 
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. 
 
 
 Pergunta 6 
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 7 
1 em 1 pontos 
 
Na definição do protótipo da função, em sua interface, temos que definir o 
tipo de retorno da função e, também, a lista de parâmetros. Para 
essa questão, suponha o trecho de código a seguir: 
 
#include <stdio.h> 
#include <stdlib.h> 
 
int func(int a, int __b, char __c[]) 
{ 
 a +=++__b; 
 itoa(a,c,10); 
 
 return a; 
} 
 
int main() 
{ 
 char c[10]; 
 int x=5, y=6; 
 printf("%d %s %d %d",func(x,&y,c),c,x,y); 
} 
 
 
Escolha a afirmativa que contém o resultado da impressão pela função 
“ printf” e os trechos a serem inseridos nas lacunas: 
Resposta Selecionada: 
.12 12 ; * ; deixar em branco ; * . 
Resposta Correta: 
.12 12 ; * ; deixar em branco ; * . 
Comentário 
da resposta: 
Parabéns! Sua resposta foi a correta! Você observou bem o 
fato de que a chamada da função, dentro do programa 
principal, requer uma passagem por valor para a variável “x” 
e uma passagem por referência para a variável “y”. Isso 
implica em “ int func(int a, int *b, char __c[])“ e, 
consequentemente, “ a +=++(*b);”. Uma string sempre é 
passada por referência – sendo assim, não necessita o uso 
de “ *”. 
 
 
 Pergunta 8 
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 9 
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 10 
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). 
 
Quarta-feira, 25 de Agosto de 2021 18h43min07s BRT 
 
	 Pergunta 1
	 Pergunta 2
	 Pergunta 3
	 Pergunta 4
	 Pergunta 5
	 Pergunta 6
	 Pergunta 7
	 Pergunta 8
	 Pergunta 9
	 Pergunta 10

Continue navegando