Buscar

Recursividade, Passagem de Parâmetros e Modularização

Prévia do material em texto

PERGUNTA 1
1. 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 é “4 3 2 1 0”. Por sua vez, a função “Recursao2” é pós-ordem, por consequência, o seu resultado é: “0 1 2 3 4” .
	
	
	.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 eu resultado é o mesmo da função “Recursao1” .
	
	
	.A função “Recursao1” segue uma recursão pós-ordem – logo o seu resultado é “0 1 2 3 4”. Por sua vez, a função “Recursao2” é pré-ordem, por consequência, o seu resultado é: “4 3 2 1 0” .
	
	
	.A função “Recursao1” segue uma recursão pós-ordem – logo o seu resultado é “4 3 2 1 0”. Por sua vez, a função “Recursao2” é pré-ordem, por consequência, o seu resultado é: “0 1 2 3 4” .
1 pontos   
PERGUNTA 2
1. 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:
	
	
	.Apenas as afirmativas II e II estão corretas.
	
	
	.Apenas a afirmativa III é falsa.
	
	
	.Apenas as afirmativas III e IV são corretas.
	
	
	.Todas as afirmativas são corretas.
	
	
	. Apenas a afirmativa IV é falsa.
1 pontos   
PERGUNTA 3
1. 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 ; V .
	
	
	.V ; F ; V ; F .
	
	
	.V ; F ; F ; V .
	
	
	.F ; F ; V ; F .
1 pontos   
PERGUNTA 4
1. 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:
	
	
	.O código calcula o MDC (Máximo Divisor Comum) usando o algoritmo de Euclides.
	
	
	.O código calcula o MMC (Mínimo Múltiplo Comum) usando o método da fatoração.
	
	
	.O código calcula a mediana entre os dois números.
	
	
	.O código calcula o número de arranjos estatísticos de Ax,y.
	
	
	.O código calcula o número de combinações estatísticas de xCy.
1 pontos   
PERGUNTA 5
1. 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); na linha 5, falta uma variável para receber o retorno da função “func1”. A linha 4 está correta.
	
	
	.Na linha 1, o parâmetro “a” não está sendo passado por referência (falta o “&”); 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.
	
	
	.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”; as demais linhas estão corretas.
1 pontos   
PERGUNTA 6
1. 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);  .
	
	
	.  int CalculaIRPF(float, float *);  .
	
	
	.  float CalculaIRPF(float *, float *);  .
	
	
	.  float CalculaIRPF(float, float *);  .
1 pontos   
PERGUNTA 7
1. Funções são blocos funcionais modulares presentes nas linguagensde programação estruturadas. A criação de funções, por exemplo, em C, deve seguir a sintaxe: <tipo_de_retorno> nome_da_função (lista_de_parâmetros). Para essa questão, suponha o trecho de código a seguir:
 
int funcao(int a, int *b)
  {
     a++;
     *b = a * 2;
     return b+5;
  }
 
int main()
{
   int x=4,y=8,z;
   z = funcao(x,&y);
   printf(“%d    %d    %d\n”,x,y,z);
   return 0;
}
 
Assinale a alternativa que apresenta os valores impressos pela função “ printf ”:
	
	
	.4    10    15.
	
	
	.5    10    15.
	
	
	.4     16   21.
	
	
	.5     16   21.
	
	
	.4     16   15. 
1 pontos   
PERGUNTA 8
1. 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:
	
	
	.void ; * ; * ; *  .
	
	
	.void ; deixar em branco ; * ; deixar em branco  .
	
	
	.int ; deixar em branco ; deixar em branco ; deixar em branco  .
	
	
	.void ; deixar em branco ; deixar em branco ; deixar em branco  .
	
	
	.void ; * ; deixar em branco ; deixar em branco  .
1 pontos   
PERGUNTA 9
1. 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 ”:
	
	
	. continue ; return ; break .
	
	
	. continue ; break ; return .
	
	
	. break ; return ; continue .
	
	
	. return ; break ; continue .
	
	
	. break ; continue ; return .
1 pontos   
PERGUNTA 10
1. 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) .
	
	
	.  n<2 ; printf("%d",n%2) ; Dec2Bin(n / 2) .
	
	
	.  n==0 ; Dec2Bin(n / 2) ; printf("%d",n%2) .
	
	
	.  n<2 ; printf("%d",n/2) ; Dec2Bin(n % 2) .
· Pergunta 1
1 em 1 pontos
	
	
	
	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:
	
	
	
	
		Resposta Selecionada:
	 
.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” .
	Resposta 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” .
	Comentário da resposta:
	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
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 3
1 em 1 pontos
	
	
	
	Modularizar um sistema significa dividí-lo em blocosfuncionais 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 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
	
	
	
	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.
	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).
	
	
	
· Pergunta 6
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 *);  .
	Comentário 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 7
1 em 1 pontos
	
	
	
	Funções são blocos funcionais modulares presentes nas linguagens de programação estruturadas. A criação de funções, por exemplo, em C, deve seguir a sintaxe: <tipo_de_retorno> nome_da_função (lista_de_parâmetros). Para essa questão, suponha o trecho de código a seguir:
 
int funcao(int a, int *b)
  {
     a++;
     *b = a * 2;
     return b+5;
  }
 
int main()
{
   int x=4,y=8,z;
   z = funcao(x,&y);
   printf(“%d    %d    %d\n”,x,y,z);
   return 0;
}
 
Assinale a alternativa que apresenta os valores impressos pela função “ printf ”:
	
	
	
	
		Resposta Selecionada:
	 
.4    10    15.
	Resposta Correta:
	 
.4    10    15.
	Comentário da resposta:
	Parabéns! Sua resposta foi a correta! Você utilizou, com sucesso, os conceitos de passagem de parâmetros por valor e por referência. No caso, realmente, devido à passagem por valor, a variável “ a”, apesar da alteração internamente à função, não influenciará o valor de “ x” - variável de origem.
	
	
	
· Pergunta 8
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 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
	
	
	
	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:
	
	
	
	
		Resposta Selecionada:
	 
.  n<2 ; Dec2Bin(n / 2) ; printf("%d",n%2) .
	Resposta Correta:
	 
.  n<2 ; Dec2Bin(n / 2) ; printf("%d",n%2) .
	Comentário da resposta:
	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.

Continue navegando