Leve em consideração o código abaixo, em linguagem C: #incl...

Próximas questões
Com base no mesmo assunto
Q1800676 Programação
Leve em consideração o código abaixo, em linguagem C:
#include <stdio.h> int a(int b){ if(b <= 1){ return 1;} return b * a(b - 1) -1;}
void main (){ int b = a(5), d = 0, c = 1, e = 43; while (1){ d = 1; c += 2; b -= 7; if ((c + e + d + b) <= 44); printf("%d\n", c); break; d = a(d); e -= c;} printf("%d\n", e); printf("%d", b);}
Os valores impressos na tela serão, respectivamente:
Alternativas

Gabarito comentado

Confira o gabarito comentado por um dos nossos professores

Alternativa correta: B - 3, 43, 27.

A questão aborda conceitos de programação em linguagem C, com foco em recursividade, controle de fluxo com estruturas de laço e condicionais, assim como atribuição de variáveis e impressão de resultados. Para resolver a questão, é necessário entender como funciona a chamada de uma função recursiva, além de acompanhar os valores das variáveis alterados pelo laço de repetição while.

A função a(int b) é uma função recursiva que calcula o fatorial de um número b e subtrai 1 de cada resultado intermediário. A execução da função a(5) resultará em (5 * a(4) - 1) e assim sucessivamente, até a(1), onde retorna 1. Os cálculos são:

a(5) = 5 * a(4) - 1 = 5 * (4 * a(3) - 1) - 1
     = 5 * (4 * (3 * a(2) - 1) - 1) - 1
     = 5 * (4 * (3 * (2 * a(1) - 1) - 1) - 1) - 1
     = 5 * (4 * (3 * (2 * 1 - 1) - 1) - 1) - 1
     = 5 * (4 * (3 * 1 - 1) - 1) - 1
     = 5 * (4 * 2 - 1) - 1
     = 5 * 7 - 1
     = 35 - 1
     = 34

Portanto, int b = a(5) terá o valor 34 após a execução da função recursiva.

Em seguida, o código inicia um loop while infinito, já que a condição é sempre verdadeira (while (1)). Dentro do loop, as operações matemáticas alteram os valores das variáveis d, c, e b, e uma condição verifica a soma desses valores com e. A linha if ((c + e + d + b) <= 44); contém um ponto e vírgula, o que significa que o corpo do if sempre será executado, independentemente da condição. O primeiro valor impresso será o valor atual de c, que recebeu um incremento de 2, sendo então 3. Logo após, o comando break; força a saída do loop.

Depois da saída do loop, o código imprime os valores de e e b. A variável e mantém seu valor inicial, pois a linha e -= c; não é executada devido ao break;, portanto, o segundo valor impresso é 43. Já a variável b teve 7 subtraídos de seu valor inicial 34 uma única vez antes do break, resultando em 27.

Assim, os valores impressos na tela serão, respectivamente, 3, 43, 27, o que corresponde à alternativa (B).

Clique para visualizar este gabarito

Visualize o gabarito desta questão clicando no botão abaixo

Comentários

Veja os comentários dos nossos alunos

No método main, há um ponto e vírgula depois do IF. Assim, o "break" vai ser executado independente dele.

Se não fosse essa "pegadinha", seria GAB A.

.

GAB B

Clique para visualizar este comentário

Visualize os comentários desta questão clicando no botão abaixo