Médio C++

Leitura de linha completa e formatação

Enunciado

Escreva um programa que leia o nome completo de uma pessoa (com espaços) e um valor em reais (double). Em seguida, imprima o nome e o valor formatado com duas casas decimais, usando std::fixed e std::setprecision. A saída deve ser: Nome: [nome]\nValor: R$ [valor].

Requisitos

  • Use std::getline para ler o nome completo.
  • Use std::cin para ler o valor double.
  • Formate o valor com duas casas decimais usando std::fixed e std::setprecision.
  • A saída deve conter exatamente as linhas especificadas.

Código inicial

#include <iostream>
#include <iomanip>
#include <string>

int main() {
    // Seu código aqui
    return 0;
}

Saída esperada

Nome: João da Silva
Valor: R$ 1234.56
Ver dica

Após ler o valor com cin >>, pode ser necessário limpar o buffer antes de usar getline se a ordem for invertida. Neste exercício, leia o nome primeiro com getline e depois o valor.

Mostrar solução
#include <iostream>
#include <iomanip>
#include <string>

int main() {
    std::string nome;
    std::getline(std::cin, nome); // lê a linha inteira, incluindo espaços

    double valor;
    std::cin >> valor; // lê o valor double

    std::cout << "Nome: " << nome << std::endl;
    std::cout << std::fixed << std::setprecision(2);
    std::cout << "Valor: R$ " << valor << std::endl;

    return 0;
}

Passo a passo

  1. Incluímos <iomanip> para os manipuladores std::fixed e std::setprecision.
  2. Declaramos nome como std::string e usamos std::getline(std::cin, nome) para ler a linha completa, incluindo espaços.
  3. Declaramos valor como double e lemos com std::cin >> valor.
  4. Imprimimos o nome com std::cout.
  5. Aplicamos std::fixed e std::setprecision(2) para formatar o valor com duas casas decimais.
  6. Imprimimos o valor formatado.

Por que funciona

std::getline lê todos os caracteres até encontrar \n, incluindo espaços, o que permite nomes compostos. A leitura do double com >> ignora espaços em branco iniciais e lê até encontrar um caractere não numérico. Os manipuladores alteram o estado do fluxo de saída, fazendo com que números de ponto flutuante sejam exibidos com notação fixa e duas casas decimais.

Erros comuns

  • Esquecer de incluir <iomanip>: os manipuladores std::fixed e std::setprecision não estarão disponíveis.
  • Usar std::cin >> nome para ler o nome completo: a leitura para no primeiro espaço, perdendo o restante.
  • Não restaurar a formatação padrão após usar std::fixed: isso afeta todas as saídas subsequentes. Se necessário, use std::defaultfloat.

Outra forma de resolver

Usar std::format para formatar a saída:

std::cout << std::format("Valor: R$ {:.2f}\n", valor);

É mais conciso e evita alterar o estado global do fluxo.

Saída esperada

Nome: João da Silva
Valor: R$ 1234.56