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::getlinepara ler o nome completo. - Use
std::cinpara ler o valor double. - Formate o valor com duas casas decimais usando
std::fixedestd::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
- Incluímos
<iomanip>para os manipuladoresstd::fixedestd::setprecision. - Declaramos
nomecomostd::stringe usamosstd::getline(std::cin, nome)para ler a linha completa, incluindo espaços. - Declaramos
valorcomodoublee lemos comstd::cin >> valor. - Imprimimos o nome com
std::cout. - Aplicamos
std::fixedestd::setprecision(2)para formatar o valor com duas casas decimais. - 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 manipuladoresstd::fixedestd::setprecisionnão estarão disponíveis. - Usar
std::cin >> nomepara 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, usestd::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