Desenvolva um programa em c++ para ler dois números inteiros com 4 algarismos na notação binária, e mostrar na tela a sua soma e a sua subtração. (linguaguem de programação c++)

Passo 1

O enunciado pede o seguinte:
  • Ler dois números inteiros, cada um escrito com 4 algarismos na notação binária (ou seja, duas cadeias de 4 caracteres compostas por 0 e 1).
  • Mostrar na tela a soma desses dois números e a subtração (primeiro menos o segundo).
Informações relevantes que o enunciado dá:
  • Cada entrada é uma sequência de exatamente 4 dígitos binários (por exemplo, 0101, 1111).
  • Saída esperada: a soma e a subtração dos dois números — o enunciado não detalha o formato exato da saída (se em binário puro, se com sinal, se em decimal), então vamos assumir que devemos mostrar os resultados em binário (pois os números de entrada estão em binário) e também mostrar o valor decimal para facilitar a conferência.

Passo 2

Entender como converter um número binário (cadeia de 4 caracteres) para valor inteiro:
Se a cadeia tem bits b_3 b_2 b_1 b_0 (onde b_3 é o bit mais significativo e b_0 o menos significativo), o valor decimal é
\text{valor} = b_3\cdot 2^{3} + b_2\cdot 2^{2} + b_1\cdot 2^{1} + b_0\cdot 2^{0}.
Aqui cada b_i vale 0 ou 1. Exemplo rápido: a cadeia 1011
1\cdot2^{3} + 0\cdot2^{2} + 1\cdot2^{1} + 1\cdot2^{0} = 8 + 0 + 2 + 1 = 11.
Na prática em código podemos calcular isso percorrendo a string da esquerda para a direita e acumulando:
  • começar com v=0,
  • para cada caractere c (que vale '0' ou '1'), atualizar v \leftarrow 2\cdot v + (c - '0').
Isso evita depender de funções prontas e funciona com qualquer comprimento, é simples e robusto.

Passo 3

Decidir o formato das saídas (como mostrar soma e subtração):
  • A soma de dois números no intervalo [0,15] fica no intervalo [0,30] — precisa de até 5 bits para representar em binário.
  • A subtração (primeiro menos o segundo) fica no intervalo [-15,15] — pode ser negativa.
Formato escolhido (claro e didático):
  • Mostrar, para cada operação, o resultado em binário (sem zeros iniciais desnecessários — isto é, representação mínima, exceto que o zero será mostrado como 0) e também o valor decimal correspondente.
  • Se a subtração for negativa, mostrar o sinal - seguido da representação binária do valor absoluto, por exemplo -101 para -5. (Se quiser a representação em complemento de dois fixe com 4 bits, isso seria outra escolha; aqui optamos pela forma decimal e binária com sinal explícito, que é mais simples e transparente.)

Passo 4

Como converter um inteiro (não-negativo) n em representação binária mínima:
  • Se n = 0 então a string é "0".
  • Caso contrário, repetir: calcular o resto de n por 2 (dá 0 ou 1), empilhar esse dígito e fazer n \leftarrow \lfloor n/2\rfloor até n=0. Ao final, inverter a sequência de restos para obter os bits na ordem correta.
    Em código é prático construir a string em ordem invertida e depois dar um reverse.

Passo 5

Validações a fazer no programa (boas práticas):
  • Verificar que cada entrada tem comprimento igual a 4.
  • Verificar que cada caractere é 0 ou 1.
  • Se alguma validação falhar, informar um erro amigável ao usuário e terminar.
Isso ajuda caso alguém digite algo fora do esperado na prova/uso.

Passo 6

Esboço do algoritmo completo (passo a passo que o programa seguirá):
  1. Ler duas strings s_1 e s_2.
  2. Validar s_1 e s_2 (tamanho 4 e somente caracteres 0/1).
  3. Converter s_1 para inteiro x usando a regra x \leftarrow 2\cdot x + (c-'0').
  4. Converter s_2 para inteiro y idem.
  5. Calcular S = x + y e D = x - y.
  6. Converter S para binário mínimo e imprimir junto com seu valor decimal.
  7. Converter D para string com sinal: se D\ge0 imprime binário de D, senão imprime - seguido do binário de |D|. Sempre imprimir também o valor decimal (com sinal).
  8. Fim.

Passo 7

Dicas de implementação em C++ (explicando trechos úteis que aparecerão no código):
  • Ler strings com std::string a, b; std::cin >> a >> b; — isso aceita entradas separadas por espaço ou nova linha.
  • Validar comprimento com a.size() == 4.
  • Verificar caracteres 0/1 com um laço for (char c : a) if (c != '0' && c != '1') ....
  • Converter para inteiro com: \text{int }v=0;\quad\text{para cada caractere }c:\; v = 2\cdot v + (c-'0').
  • Converter inteiro não-negativo n para string binária mínima com a técnica dos restos (ou usar std::bitset seguido de remoção de zeros à esquerda — mas a técnica manual é pedagógica e fácil).
  • Exemplo: para exibir S em binário mínimo: gera-se a string binS e imprime-se binS.

Passo 8

Exemplo manual rápido para verificação (imagina que a entrada seja a = "0110" e b = "0011"):
  • Converter 0110 0\cdot2^3 +1\cdot2^2 +1\cdot2^1 +0\cdot2^0 = 4+2=6.
  • Converter 0011 0\cdot2^3 +0\cdot2^2 +1\cdot2^1 +1\cdot2^0 = 2+1=3.
  • Soma S = 6 + 3 = 9 → binário 1001.
  • Diferença D = 6 - 3 = 3 → binário 11.
    O programa deve exibir esses resultados (tanto em binário quanto em decimal) de forma clara.

Passo 9

Encorajamento final antes de mostrar o código: você já tem tudo entendido — conversão binário→decimal, operações aritméticas comuns, e conversão decimal→binário. No código abaixo eu juntei tudo e ainda tratei validações; copie, teste com vários casos e, se quiser, ajustamos para usar complemento de dois de 4 bits ao exibir resultados negativos.

Resposta

#include <bits/stdc++.h>
using namespace std;
int bin4_to_int(const string &s) {
int v = 0;
for (char c : s) {
v = v * 2 + (c - ‘0’);
}
return v;
}
string int_to_bin_min(unsigned int n) {
if (n == 0) return “0”;
string t;
while (n > 0) {
t.push_back(char(‘0’ + (n % 2)));
n /= 2;
}
reverse(t.begin(), t.end());
return t;
}
bool valid_bin4(const string &s) {
if (s.size() != 4) return false;
for (char c : s) if (c != ‘0’ && c != ‘1’) return false;
return true;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
string a, b;
if (!(cin >> a >> b)) {
    cerr << "Erro: forneca dois numeros binarios de 4 digitos.\n";
    return 1;
}

if (!valid_bin4(a) || !valid_bin4(b)) {
    cerr << "Erro: cada numero deve ter exatamente 4 caracteres '0' ou '1'.\n";
    return 1;
}

int x = bin4_to_int(a); // 0..15
int y = bin4_to_int(b); // 0..15

int S = x + y; // 0..30
int D = x - y; // -15..15

string binS = int_to_bin_min((unsigned int)S);
string binD;
if (D < 0) binD = "-" + int_to_bin_min((unsigned int)(-D));
else binD = int_to_bin_min((unsigned int)D);

cout << "Entrada 1 (bin): " << a << "  -> decimal: " << x << "\n";
cout << "Entrada 2 (bin): " << b << "  -> decimal: " << y << "\n";
cout << "Soma (bin): " << binS << "  -> decimal: " << S << "\n";
cout << "Subtracao (bin): " << binD << "  -> decimal: " << D << "\n";

return 0;
}

Exercícios relacionados