Escreva (utilizando para, se, então, …) um algoritmo para conversão de um número fracionário da base dois para base dez. (sugestão: página 6 do livro da Ruggiero)
Passo 1
O que o enunciado pede e o que temos de entrada:
- Pede um algoritmo (em pseudocódigo usando comandos como “para”, “se”, “então”, …) que converta um número fracionário dado na base dois para a base dez.
- Entrada: uma representação em texto de um número binário com parte inteira e opcional parte fracionária, por exemplo
ou ou . Pode também ter sinal negativo, por exemplo . - Saída: um número em base dez (real) equivalente ao binário de entrada, por exemplo
para .
O enunciado não exige formato específico de saída (string, float, etc.), então assumimos que a saída será um número real em base dez com precisão suficiente ou arredondada conforme necessário.
Passo 2
Ideia matemática por trás da conversão (a “aula” rápida):
- Cada dígito binário vale
ou . - À esquerda do ponto binário os pesos são potências inteiras de dois: da direita para a esquerda
. - À direita do ponto binário os pesos são potências negativas de dois: da esquerda para a direita
. - Portanto, para um número binário escrito genericamente como
o valor em decimal é
onde cada
. (Aqui indexes positivos são contados a partir do dígito de menor ordem à esquerda do ponto.)
Exemplo concreto e didático: converter
.
- Parte inteira
. - Parte fracionária
. - Soma =
.
Passo 3
Método direto (fácil de entender e aplicar na prova): somar contribuições das potências de dois — algoritmo conceitual.
- Passos principais:
- Separar a string binária em parte inteira e parte fracionária (ao redor do ponto).
- Percorrer os dígitos da parte inteira da direita para a esquerda, acumulando
com começando em e incrementando. - Percorrer os dígitos da parte fracionária da esquerda para a direita, acumulando
com começando em e incrementando.
- Observação prática importante para prova: em vez de calcular
com potência, mantenha um multiplicador que começa em (para ) e multiplica por a cada passo; para a fração comece o multiplicador em e divida por a cada passo. Assim evita-se uso de função pow e fica tudo com multiplicações/divisões simples à mão.
Passo 4
Implementação passo a passo mostrando como calcular sem funções de potência (maneira “caneta e papel”):
- Para a parte inteira:
- Inicialize
. - Inicialize
(que representa ). - Percorra os dígitos da parte inteira do menos significativo (direita) para o mais significativo (esquerda):
- Converta o caractere do dígito em
. - Faça
. - Atualize
.
- Converta o caractere do dígito em
- Inicialize
- Para a parte fracionária:
- Inicialize
(que representa ). - Percorra os dígitos da parte fracionária da esquerda para a direita:
- Converta o caractere do dígito em
. - Faça
. - Atualize
.
- Converta o caractere do dígito em
- Inicialize
- No final, trate sinal negativo se houver.
Exemplo rápido usando essa técnica para
:
- Parte inteira: digits direita->esquerda 1,0,1 com pesos
=> acrescenta . - Parte fracionária: digits esquerda->direita 0,1,1 com pesos
=> acrescenta .
Passo 5
Método alternativo (útil para sófrações ou quando quiser ver o processo de geração de dígitos): algoritmo “multiplica por 2” para a parte fracionária.
- Ideia: se
é a parte fracionária em decimal (inicialmente interpretada como binário ), então repetidamente faz-se ; a parte inteira de dá o próximo dígito binário; depois subtrai-se essa parte inteira de e continua-se. Para conversão inversa (binário → decimal) isso serve para entender repetição infinita ou para gerar aproximações. Na prática para converter binário→decimal esse método é mais usado quando se quer converter decimal fracionário para outra base; para o nosso caso de binário→decimal a soma com pesos é mais direta. Ainda assim, é bom conhecer. - Limite-se a um número máximo de iterações para controlar precisão (por exemplo
dígitos da fração desejados).
Passo 6
Casos extremos, precisão e validações (coisas para a prova):
- Se a parte fracionária for periódica (algumas frações binárias geram representação finita em binário? sim — muitas geram infinita em base dez, mas aqui a entrada já é binária), ao converter para decimal o resultado é exato se a representação binária for finita; caso a entrada seja conceito de fração com repetição, não vamos inventar repetição: usamos a string que foi dada.
- Se a entrada contiver caracteres diferentes de ‘0’, ‘1’, ‘.’ e opcionalmente ‘-’, então detectar erro e avisar.
- Deixar explícito quantas casas decimais de saída serão apresentadas (ou retornar o número real com precisão da linguagem).
- Em prova sem calculadora, a técnica do multiplicador
e permite somas manuais passo a passo sem potências complexas.
Passo 7
Agora sim: o pseudocódigo final (claro, usando os comandos exigidos “para, se, então, …”) — este é o algoritmo pedido que pode ser usado como resposta direta na prova. Usei notação simples e explícita; todas as variáveis matemáticas aparecem em TeX conforme pedido.
Resposta
Entrada: uma string
no formato opcionalmente com sinal, contendo dígitos ‘0’ ou ‘1’ e no máximo um ponto ‘.’ separando parte inteira e parte fracionária.
Saída: número decimal .
Saída: número decimal
Algoritmo:
-
\n -
\n - se
então\n
\n
\n - separar
em duas partes pela ‘.’; se não houver ‘.’, parte inteira e parte fracionária \n -
\n - // converter parte inteira\n
-
// representa \n - para
de comprimento( ) até passo faça\n
\n
senão é ‘0’ nem ‘1’ então\n
erro: entrada inválida\n
fim se\n
se então senão \n
\n
\n - fim para\n
- // converter parte fracionária\n
-
// representa \n - para
de até comprimento( ) faça\n
\n
senão é ‘0’ nem ‘1’ então\n
erro: entrada inválida\n
fim se\n
se então senão \n
\n
\n - fim para\n
-
\n - retornar