2017-09-21 6 views
0

Je travaille sur un projet de panier et je souhaite imprimer l'entrée utilisateur comme la sortie suivante. Je ne sais pas comment utiliser les mots-clés setW et right/left, quand il s'agit de l'utilisateur décide ce que la sortie va être. Donc, quand ils entrent dans des entrées différentes en longueur, par exemple setW (20) ne fonctionne pas pour tous.Formatage de la sortie (entrée par l'utilisateur) dans les colonnes

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 
---------------------------------------------------------------- 

C'est la fonction d'affichage:

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

Et ceci est la sortie que j'obtiens avec ceci:

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 
---------------------------------------- 

Et voici mon 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; 
} 

Répondre

0

La stratégie que vous utilisez ne fait pas sens e à moi. Voici une façon d'obtenir la sortie désirée:

  1. Utilisez 20 caractères pour la première colonne et assurez-vous qu'elle est sortie avec le texte aligné à gauche.
  2. Utilisez 10 caractères pour les deuxième et troisième colonnes et assurez-vous qu'ils sont sortis avec du texte aligné à droite. Utilisez std::left et std::right pour contrôler l'alignement du texte.

Voici un programme simplifié qui illustre l'idée.

#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); 
} 

sortie:

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