Форматирование вывода (вводится пользователем) в столбцах

Я работаю над проектом корзины покупок и хочу распечатать вводимые пользователем данные, как показано ниже. Я не знаю, как использовать ключевые слова setW и вправо / влево, когда дело доходит до того, что пользователь решает, каким будет результат. Поэтому, когда они вводят разные входы по длине, например, setW (20) не работает для них всех.

Here is your order:
----------------------------------------------------------------
Name                     Unit_Price                  Quantity
T-shirt                    $19.99                       2

Sweater                    $39.99                       1

iphone_case                $25.5                        3

Towel                      $9.99                        5

The total charge is $206.42
----------------------------------------------------------------

Это функция отображения:

ostream& operator <<(ostream& os, Item& source) {
os << source.getName() << setw(18)
<< source.getPrice() << setw(20) << source.getQuantity() << endl;
return os;
}

И это вывод, который я получаю с этим:

Here is your order:
----------------------------------------
NAME             PRICE            QUANTITY
tshirt           19.99               2
sweater           39.99               1
iphone_case            25.5               3
towel            9.99               5

The total price of the order is 206.42
----------------------------------------

А вот и мой main.cpp

#include "ShoppingCart.h"#include "Item.h"
#include <iostream>
#include <iomanip>
#include <string>

using namespace std;int main()
{
cout << endl << endl << "Welcome to XXX SHOPPING CENTER" << endl;

Item items[10];
ShoppingCart<Item> cart;
char userAnswer;

cout << "Enter the item you selected as the following order:\nname unitPrice quantity\n"<< "(Name can not contain any space. Otherwise errors happen!)" << endl;
cin >> items[0];
cart.add(items[0]);

cout << "Want to continue? y/n" << endl;
cin >> userAnswer;

int index = 1;
while(userAnswer == 'y' || userAnswer == 'Y') {

cout << "Enter the next item:" << endl;
cin >> items[index];
cart.add(items[index]);
cout << "Want to continue? y/n" << endl;
cin >> userAnswer;
index++;
}// Display the summary of the orders
cout << endl << "Here is your order:" << endl;
// "--------------------------------------------------------------------"for(int i=0; i < 40; i++)
cout << "-";

cout << endl << "NAME" << setw(18) << "PRICE" << setw(20) << "QUANTITY" << endl;

for(int i=0; i < cart.getCurrentSize(); i++) {
cout << items[i];
}

cout << endl << "The total price of the order is " << cart.getTotalPrice() << endl;
// "---------------------------------------------------------------------"for(int i=0; i < 40; i++)
cout << "-";
cout << endl;

return 0;
}

0

Решение

Стратегия, которую вы используете, не имеет смысла для меня. Вот один из способов получить желаемый результат:

  1. Используйте 20 символов для первого столбца и убедитесь, что он выводится с выровненным по левому краю текстом.
  2. Используйте 10 символов для второго и третьего столбцов и убедитесь, что они выводятся с выровненным по правому краю текстом.
  3. использование std::left а также std::right контролировать выравнивание текста.

Вот упрощенная программа, которая демонстрирует идею.

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

struct Item
{
std::string name;
double price;
int quantity;
};

std::ostream& operator<<(std::ostream& out, Item const& item)
{
// First column
out << std::left << std::setw(20) << item.name;

// Second and third columns
out << std::right << std::setw(10) << item.price << std::setw(10) << item.quantity;

return out;
}

void printLine(std::ostream& out)
{
for(int i=0; i < 40; i++)
out << "-";
out << std::endl;
}

int main()
{
std::vector<Item> items;
items.push_back({"tshirt", 19.99, 2});
items.push_back({"sweater", 39.99, 1});
items.push_back({"iphone_case", 25.50, 3});
items.push_back({"towel", 9.99, 5});

printLine(std::cout);

// First column
std::cout << std::left << std::setw(20) << "NAME"
// Second and third columns
std::cout << std::right << std::setw(10) << "PRICE" << std::setw(10) << "QUANTITY" << std::endl;

// The items
for(int i=0; i < 4; i++) {
std::cout << items[i] << std::endl;
}

printLine(std::cout);
}

Выход:

----------------------------------------
NAME                     PRICE  QUANTITY
tshirt                   19.99         2
sweater                  39.99         1
iphone_case               25.5         3
towel                     9.99         5
----------------------------------------
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]