Baixe o app para aproveitar ainda mais
Prévia do material em texto
EXERCÍCIO - UNIDADE 3 1. Nas linguagens de programação funcional, diz-se que é possível evitar estouros de pilha usando "recursão de cauda". A diferença entre recursiva normal e de cauda é justamente aonde a chamada recursiva é chamada. Caso seja chamada na "cauda" da função, é uma chamada de cauda recursiva. A "cauda" da função é sua última chamada. É a última computação / cálculo feito pela função, e logo depois dela, nenhum tratamento é feito antes de retornar seu valor. Neste contexto, analise as figuras 16(a) e 16(b). Figura 16 – (a) recursão normal e (b) recursão de cauda É correto apenas o que se afirma em: I - Na figura 16(a), cada chamada recursiva aumenta porque o programa só pode calcular o resultado da primeira função chamada, para depois calcular o resultado das que a chamaram. Assim, a pilha estoura. II - Na figura 16(b), cada passo de chamadas nem aumenta nem diminui. A partir do momento que a função recursiva é chamada, todas são chamadas no final, sem precisar de mais cálculos. III - Quando um compilador pronto para isso vê uma chamada recursiva na cauda, ele automaticamente a transforma em um laço durante as otimizações. Desta forma não perde as vantagens, nem a elegância da programação funcional, mas também não corre o risco de passar por um estouro de pilha. III ----------------------- --------------- 3. O trecho de programa a seguir calcula a média entre duas temperaturas distintas: #include<stdio.h> float t1, t2; float calcularMedia(){ return (t1 + t2)/2; } int main(){ printf("\n Digite as duas temperaturas: "); scanf("%f %f",&t1,&t2); printf("\n A temperatura media = %.2f",calcularMedia()); return 0; } O trecho de programa é um exemplo prático da utilização do: escopo global de uma variável. ------ 4. Para criar uma função utiliza-se a seguinte sintaxe: <tipo de retorno> <nome> (<parâmetros>) { <comandos da função> <retorno> ( ) } Para cada declaração da função existem parâmetros que são obrigatórios e outros que são opcionais. Neste contexto, relacione a Coluna A que contém as sintaxe com a Coluna B que contém as funções. I-B / II-A / III-C / IV-E / V-D. <tipo de retorno> - Indica qual o tipo de valor a função retornará. <nome> - Identificará a função. <parênteses depois do nome> - Toda função terá o nome acompanhado por eles. <comandos da função> - Só justifica criar se tiver um conjunto de comandos para realizar. <retorno> - Se for void é opcional, porém, quando não for void é obrigatório. ---- 5. Analise o trecho de programa a seguir: #include<stdio.h> #include<stdlib.h> int* alocar(){ return malloc(200); } int main(){ int *memoria; memoria = alocar(); if(memoria != NULL){ printf("Endereco de memoria alocada = %x",memoria); } else{ printf("Memoria nao alocada"); } return 0; } Agora, avalie as seguintes asserções e a relação proposta entre elas. I - Foi criado um ponteiro inteiro e, após a função ser chamada, seu resultado foi armazenado no ponteiro chamado memoria. PORQUE II - Se o valor do ponteiro memoria é diferente de NULL, então sabe-se que a alocação foi feita com sucesso e imprime o endereço da primeira posição, caso contrário, o usuário é informado que a memória não foi alocada. As asserções I e II são proposições verdadeiras, mas a asserção II não é uma justificativa da asserção I. I - VERDADEIRA - Foi criado um ponteiro inteiro e, após a função ser chamada, seu resultado foi armazenado no ponteiro chamado memoria. II - VERDADEIRA - Se o valor do ponteiro memoria é diferente de NULL, então sabe-se que a alocação foi feita com sucesso e imprime o endereço da primeira posição, caso contrário, o usuário é informado que a memória não foi alocada. ----- 4 – Tentativa 2 Conforme Mizrahi (2008) o escopo de uma variável é definido pelas regiões (blocos) onde a variável pode ser utilizada e é nesta hora que surge o conceitos das variáveis globais e variáveis locais. Variáveis globais são aquelas declaradas no início de um algoritmo. São visíveis, ou seja, podem ser utilizadas no algoritmo principal e por todos as funções. As variáveis locais são aquelas declaradas no início de uma função. São visíveis, ou seja, podem ser utilizadas somente pela função onde foram declaradas. Observe o programa a seguir: Considerando o programa apresentado, avalie as afirmativas a seguir: I. O programa apresentado está errado pois a variável res foi declarada duas vezes, causando um erro de compilação. II. A função fat está escrita antes da função main ( ) porém, o programa começa sempre pela função main ( ) independentemente da quantidade de funções que possam ter antes do main ( ). III. Para a função fat, o parâmetro n funciona como uma variável local (ou seja, válida dentro da função apenas), juntamente com a variável res. IV. A função fat possui a variável n e a variável n recebe seu valor no instante da chamada da função dentro da função main ( ). É correto o que se afirma em: Apenas as afirmativas II, III e IV estão corretas.
Compartilhar