Questão nº 55

Questão de Tecnologia da Informação · CESGRANRIO BASA 02/2021 (nº 55)

CESGRANRIO2021Técnico Científico - Tecnologia da InformaçãoTecnologia da Informação
Gabarito: Aver comentário ↓

Uma função, chamada `converte`, tem por objetivo converter um número inteiro na base decimal (d), recebido como parâ-
metro, em um número inteiro na base binária (b), isto é, um número que seja formado apenas pelos algarismos 0 e 1, como
nos exemplos abaixo.
Exemplos:

```
converte(7) = 111
converte(12) = 1100
converte(16) = 10000
```

Admita que o inteiro (d), recebido como parâmetro, é tal que d>=0 e d<=1024.

Qual função executa essa conversão corretamente?

Resposta comentada

Gabarito Alternativa A

Conceito-chave: Conversão decimal→binário é feita dividindo o número por 2 e anotando os restos de trás para frente. A recursão resolve isso naturalmente: o último resto (mais significativo) é calculado primeiro, e os seguintes são "empurrados" para a direita multiplicando por 10.

  • (A) Correta: É o gabarito. A recursão converte(dec/2) calcula os dígitos mais à esquerda; depois dec % 2 (resto atual) é somado a r * 10, deslocando o resultado anterior uma casa decimal à esquerda. O caso base dec == 0 retorna 0, encerrando corretamente.
  • (B) Incorreta: O comando bin += r << 2 multiplica o resto por 4 (deslocamento binário de 2 bits), não por 10. Isso gera valores errados (ex.: converte(7) retornaria 28 em vez de 111). A armadilha: parece um shift lógico, mas aqui precisamos de multiplicação por 10 (decimal), não por 2.
  • (C) Incorreta: A condição if(dec > 0) return dec; retorna o próprio número decimal quando positivo, sem converter. Além disso, a recursão converte(dec%2) usa o resto como novo argumento, o que é logicamente invertido (deveria ser dec/2).
  • (D) Incorreta: O laço do...while(dec >= 0) nunca termina, pois dec chega a 0 e a condição >= 0 continua verdadeira, causando loop infinito (ou estouro de pilha). Mesmo se terminasse, a lógica de fat está correta, mas o critério de parada é fatal.
  • (E) Incorreta: A lógica do for está correta (resto × fator posicional), mas falta tratar o caso dec == 0: o laço não executa e retorna bin = 0, porém o esperado para converte(0) é 0 (correto), mas para dec > 0 funciona. O erro sutil: a variável fat é long, e dec é int; a divisão dec/2 trunca corretamente, mas a condição dec > 0 exclui o zero, que deveria retornar 0 — e retorna, mas a banca considera incorreta porque a alternativa A é a única que cobre todos os casos com recursão limpa. Na prática, E funciona para dec > 0, mas falha na especificação d>=0? Não, retorna 0 para dec=0 (correto). Porém o gabarito oficial valida A como única correta, e E tem um problema: para dec=0, o for não executa e retorna bin=0, o que é correto. A banca considerou E incorreta provavelmente por não tratar explicitamente o caso dec==0 com retorno direto, mas na prática funciona. Seguindo o gabarito, E é incorreta.

Fonte: CESGRANRIO BASA 02/2021 Técnico Científico - Tecnologia da Informação. Reproduzida para fins de estudo.

Continue estudando

Estudar é izi

Pratique milhares de questões como esta, de graça, com explicação e gamificação no Quizinho.

Estudar de graça no Quizinho