Logo Passei Direto
Buscar

TÉCNICAS DE PROGRAMAÇÃO Atividade 2

Atividade de Técnicas de Programação sobre funções em C: exercícios com trechos de código sobre sintaxe de funções, passagem por valor e por referência, uso de ponteiros, parâmetros argc/argv e interpretação de saídas via printf; inclui alternativas, respostas corretas e feedback.

Ferramentas de estudo

Questões resolvidas

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: 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
”,x,y,z); return 0; }
Assinale a alternativa que apresenta os valores impressos pela função “ printf ”:
.4 10 15.
.4 8 15.
.4 10 8.
.4 8 8.

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:
Escolha a alternativa abaixo que você julgue ser a correta:
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.
Apenas as afirmativas I e II estão corretas.
Apenas as afirmativas II e III estão corretas.
Apenas as afirmativas II e IV estão corretas.
Todas as afirmativas estão corretas.

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 ”.
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.
.V ; F; V ; V .
.F ; V; F ; V .
.V ; V; V ; F .
.F ; F; V ; V .

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 #include 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:
.12 12 ; * ; deixar em branco ; * .
.10 10 ; * ; deixar em branco ; * .
.12 10 ; * ; deixar em branco ; * .
.10 12 ; * ; deixar em branco ; * .

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 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 MMC (Mínimo Múltiplo Comum) usando o método da fatoração.
.O código calcula o MDC (Máximo Divisor Comum) usando o algoritmo de Euclides.
.O código calcula a soma dos dois números.
.O código calcula a média dos dois números.

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.

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”.
Assinale a opção abaixo que represente a interface mais apropriada para a questão:
. float CalculaQtdCarbono(float, float, float *); .
. float CalculaQtdCarbono(unsigned char, float, float *); .
. float CalculaQtdCarbono(int, float, float *); .
. float CalculaQtdCarbono(char, float, float *); .

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).
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 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”.
.Ambas as funções seguem a mesma ordem de recursão.
.A função “ Recursao1” não é recursiva.

Os compiladores C/C++, para realizar a verificação de consistência de uso das funções, fazem uso dos arquivos de cabeçalhos (headers). Nestes arquivos, por exemplo, o protótipo das funções são declarados.
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 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”; a linha 3 está correta; a linha 4 está correta; a linha 5 está correta.
.Todas as linhas estão corretas.

Material
páginas com resultados encontrados.
páginas com resultados encontrados.

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Questões resolvidas

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: 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
”,x,y,z); return 0; }
Assinale a alternativa que apresenta os valores impressos pela função “ printf ”:
.4 10 15.
.4 8 15.
.4 10 8.
.4 8 8.

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:
Escolha a alternativa abaixo que você julgue ser a correta:
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.
Apenas as afirmativas I e II estão corretas.
Apenas as afirmativas II e III estão corretas.
Apenas as afirmativas II e IV estão corretas.
Todas as afirmativas estão corretas.

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 ”.
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.
.V ; F; V ; V .
.F ; V; F ; V .
.V ; V; V ; F .
.F ; F; V ; V .

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 #include 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:
.12 12 ; * ; deixar em branco ; * .
.10 10 ; * ; deixar em branco ; * .
.12 10 ; * ; deixar em branco ; * .
.10 12 ; * ; deixar em branco ; * .

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 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 MMC (Mínimo Múltiplo Comum) usando o método da fatoração.
.O código calcula o MDC (Máximo Divisor Comum) usando o algoritmo de Euclides.
.O código calcula a soma dos dois números.
.O código calcula a média dos dois números.

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.

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”.
Assinale a opção abaixo que represente a interface mais apropriada para a questão:
. float CalculaQtdCarbono(float, float, float *); .
. float CalculaQtdCarbono(unsigned char, float, float *); .
. float CalculaQtdCarbono(int, float, float *); .
. float CalculaQtdCarbono(char, float, float *); .

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).
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 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”.
.Ambas as funções seguem a mesma ordem de recursão.
.A função “ Recursao1” não é recursiva.

Os compiladores C/C++, para realizar a verificação de consistência de uso das funções, fazem uso dos arquivos de cabeçalhos (headers). Nestes arquivos, por exemplo, o protótipo das funções são declarados.
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 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”; a linha 3 está correta; a linha 4 está correta; a linha 5 está correta.
.Todas as linhas estão corretas.

Prévia do material em texto

TÉCNICAS DE PROGRAMAÇÃO – Atividade 2
Pergunta 1
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.
	Feedback 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 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.
	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 3
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 4
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 ; * .
	Feedback 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 5
0 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 MMC (Mínimo Múltiplo Comum) usando o método da fatoração.
	Resposta Correta:
	 
.O código calcula o MDC (Máximo Divisor Comum) usando o algoritmo de Euclides.
	Feedback da resposta:
	Infelizmente a sua resposta está incorreta. Para responder essa questão, reflita que algumas funções citadas nas alternativas faz uso da aplicação da fórmula diretamente, ou seja, não compensaria fazer uso de funções recursivas.
	
	
	
· Pergunta 6
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.
	Feedback 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 7
0 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 volumede 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(float, float, float *); .
	Resposta Correta:
	 
. float CalculaQtdCarbono(unsigned char, float, float *); .
	Feedback da resposta:
	Infelizmente a sua resposta está incorreta. Para responder essa questão,  você deve refletir sobre o fato de a função deve retornar dois valores: um valor é representado pela massa do carbono a ser usada na liga e, o outro, refere-se ao percentual de carbono. Reflita, também, sobre a faixa de valores possíveis para o tipo da liga e escolha um tipo de dados mais condizente para a referida faixa.
	
	
	
· Pergunta 8
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” .
	Feedback 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 9
0 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); na linha 5, falta uma variável para receber o retorno da função “ func1”. A linha 4 está correta.
	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:
	Infelizmente a sua resposta está incorreta. Para responder essa questão, analise os parâmetros das e o tipo de retorno das funções descritos no arquivo de cabeçalhos e faça a correspondência exata nas chamadas das funções. Os tipos devem bater com exatidão.
	
	
	
· Pergunta 10
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  .
	Feedback 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.

Mais conteúdos dessa disciplina