C ++プログラムのカフェ

C ++でカフェを作りたいです。ユーザーに各質問に「はい」または「いいえ」で答えてもらいたい。彼らがはいまたはいいえと答えるならば、私は彼らの合計価格を表示したいです。

#include 
using namespace std;
int main()
{
    //Develop a billing statement for a store/restaurant 
   //Define variables 
    double donut, bagel, burrito, sandwhich, omelet, coffee, cappachino, smootie, water, spirit, total, tax;
    char answerType;
    bagel = 2.50;
    burrito = 3.50;
    donut = 1.00;
    sandwhich = 3.50;
    omelet = 1.25;
    coffee = 1.50;
    cappachino = 2.00;
    smootie = 3.25;
    water = 0.99;
    spirit = 1.00;
    total = 0.00;
    tax = 6.25;
    cout << "Welcome to Junelle's Cafe" << endl;
   //Introduction to my cafe

    //Customer knows the options before hand 
    //Customer enters yes (y) or no (n) 
    cout << "Enter a y (yes) or no (n) for every question asked." << endl;

//Ask user if they want a bagel 
    cout << "Would you like to buy a bagel for $2.50?:";
    cin >> answerType;

    if (answerType == 'y')

    {

        cout << "A bagel has been added to your order. Your total is " << total + bagel << endl;

    }

    else if (answerType == 'n')

    {
        cout << "Your total is " << total << endl;

    }
//item2
    cout << "Would you like to buy a donut for $1.00?:";
    cin >> answerType;

    if (answerType == 'y')

    {

        cout << "A donut has been added to your order. Your total is " << total + donut+bagel << endl;

    }


    else if (answerType == 'n')

    {
        cout << "Your total is " << total << endl;

    }
//item3 
    cout << "Would you like to buy a omelet for $1.25?:";
    cin >> answerType;

    if (answerType == 'y')

    {

        cout << "A omelet has been added to your order. Your total is " << total + donut + bagel+ omelet << endl;

    }

    else if (answerType == 'n')

    {
        cout << "Your total is " << total << endl;

    }
//item 4
    cout << "Would you like to buy a burrito for $2.50?:";
    cin >> answerType;

    if (answerType == 'y')

    {

        cout << "A burrito has been added to your order. Your total is " << total + donut + bagel
            + omelet + burrito << endl;

    }

    else if (answerType == 'n')

    {
        cout << "Your total is " << total << endl;

    }

//item 5 
    cout << "Would you like to buy a sandwhich for $2.50?:";
    cin >> answerType;

    if (answerType == 'y')

    {

        cout << "A sandwhich has been added to your order. Your total is " << total + donut + bagel
            + omelet+ burrito+sandwhich << endl;

    }

    else if (answerType == 'n')

    {
        cout << "Your total is " << total << endl;

    }
//item 6
    cout << "Would you like to buy a coffee for $1.50?:";
    cin >> answerType;

    if (answerType == 'y')

    {

        cout << "A coffee has been added to your order. Your total is " << total + donut + bagel 
            + omelet+ burrito + sandwhich + coffee<< endl;

    }

    else if (answerType == 'n')

    {
        cout << "Your total is " << total << endl;

    }

//item 7 
    cout << "Would you like to buy a cappachino for $2.00?:";
    cin >> answerType;

    if (answerType == 'y')

    {

        cout << "A cappachino has been added to your order. Your total is " << total + donut + bagel 
            + omelet + burrito + sandwhich + coffee+ cappachino << endl;

    }

    else if (answerType == 'n')

    {
        cout << "Your total is " << total << endl;

    }
//item 8
    cout << "Would you like to buy a water for $0.99?:";
    cin >> answerType;

    if (answerType == 'y')

    {

        cout << "A water has been added to your order. Your total is " << total + donut + bagel
            + omelet + burrito + sandwhich + coffee + cappachino + water << endl;

    }

    else if (answerType == 'n')

    {
        cout << "Your total is " << total << endl;

    }
//item 9 
    cout << "Would you like to buy a spirit for $1.00?:";
    cin >> answerType;

    if (answerType == 'y')

    {

        cout << "A spirit has been added to your order. Your total is " << total + donut + bagel
            + omelet + burrito + sandwhich + coffee + cappachino + water + spirit<< endl;

    }

    else if (answerType == 'n')

    {
        cout << "Your total is " << total << endl;

    }
//item 10 
    cout << "Would you like to buy a smootie for $1.25?:";
    cin >> answerType;

    if (answerType == 'y')

    {

        cout << "A smootie has been added to your order. Your total is " << total + donut + bagel 
            + omelet + burrito + sandwhich + coffee + cappachino + water + spirit + smootie << endl;

    }

    else if (answerType == 'n')

    {
        cout << "Your total is " << total << endl;

    }

    cout << "Thank you for visiting Junelle's Cafe" << endl;
    while (1);
    return 0;
}
25
ru de
ああ、私は私のC ++コードがこの数ヶ月前のようだったのを覚えています。それを練習し続けてください、そうすればあなたはずっと良いコードを書くでしょう。よろしく。
追加された 著者 Xam,

4 答え

しません。繰り返す。あなた自身。

それは本質的な原則です。あなたは手動で何度も何度も「XYしますか」というサイクルを繰り返します。それは間違いを起こしやすいだけでなく、維持するのも難しいです。たとえば、顧客に必要なアイテム数を 要求するとします。それからあなたはすべての一つ一つの項目のためにあなたの入力処理を追加または変更しなければならないでしょう。

たぶんあなたは使いたいです

 15 bagels
200 coffee
  1 water
  1 donut

現在のプログラムでこれを行うのはかなり面倒です。 int bagelCount、coffeeCount、waterCount、coconoutCount…が必要です。パターンが得られます。

そのため、可能であれば、単一のコードブロックですべての項目を同じ方法で処理するようにしてください。それでは、次のトピックに進みます。

情報を再利用する

あなたのプログラムの始めに、 bagel = 2.50 があります。ただし、顧客にベーグルを購入したいかどうかを尋ねるときには、その情報を利用することは避けてください。

cout << "Would you like to buy a bagel for $2.50?:";
                                           ^^^^^^

これもまたDRY違反です。 ベーグルの価格を変更した場合は、2か所で変更する必要があります。それは間違いを起こしやすいです。代わりに、すでに手元にある情報を再利用してください。

std::cout << "Would you like to buy a bagel for $" << bagel << ": ";

ところで、変数がその値を変更してはいけない場合は、 const と宣言してください。また、可能な限り変数を値で初期化するようにしてください。

typedef double Price;

const Price bagelPrice = 2.50;
const Price coffeePrice = 1.50;

しかし、後で変更するので、まだ使用しないでください。

顧客を信用しない

顧客が「y」または「n」の代わりに「a」を入力した場合はどうなりますか。まあ、あなたはそれを受け入れて何も追加しません。

ただし、顧客に「ベーグルを使用しますか?」と尋ねた場合そして彼らは "Cthulhu!"と答え、あなたはおそらく彼らにあなたの申し出を受け入れるか辞退するかを頼むでしょう。小さな

bool ask_yes_no() {
    /* exercise */
}

機能はあなたを助けることができます。

ネームスペース

自分のしていることが分からない限り、 using namespace std を使わないでください。

抽象化

それでは、アイテム交換を見てみましょう。

//Ask user if they want a bagel 
    cout << "Would you like to buy a bagel for $2.50?:";
    cin >> answerType;

    if (answerType == 'y')

    {

        cout << "A bagel has been added to your order. Your total is " << total + bagel << endl;

    }

    else if (answerType == 'n')

    {
        cout << "Your total is " << total << endl;

    }

他のすべての項目は同じ構造に従っているので、これに焦点を当てましょう。ここにパターンがあります。

  1. 商品名と価格を言う
  2. 商品を購入するかどうかを確認します
  3. 注文に商品を追加して合計を増やします(この手順はありません)
  4. お客様に新しい合計をお知らせください
  5. まだ商品がある場合は、次の商品を選択して1に進みます。
  6. それ以外の場合、顧客に合計を伝えます。

したがって、そのダイアログを書き換えてみましょう。

std::cout << "Would you like to buy a " << item_name
          << " for $" << item_price << ": ";

if(asks_yes_no()) {//see exercise above
    total += item_price;

    std::cout << "A " << item_name<< " has been added to your order. ";
}

std::cout << "Your total is $" << total << ".";

必要なのは、 item_nameitem_price を取得してすべての商品を検索する方法だけです。いくつかの方法があります。

  • we can use an associative collection, e.g. std::map
  • we can couple the name and the price in a single Item and use a normal collection std::vector

他のレビューでは後者が使用されているので、前者の std :: map

typedef std::string ItemName
typedef double Price;

const std::map menu {
    {"bagel",  2.50 },
    {"coffee", 1.50 },
    {"sugar", 0.02 },
    {"full breakfast", 5.00}
};

メニュー内のすべての項目を簡単に移動できます。

// You might not know this kind of loop yet.
// It's basically going through the menu.
// The current pair of item and price is item_and_price,
// the .first-Member is the item, and the .second-Member
// is the price.
//
// The following holds throughout the loop:
//
//    menu[item_and_price.first] == item_and_price.second
for(const auto & item_and_price : menu) {
    const auto & item_name = item_and_price.first;
    const auto & item_price = item_and_price.second;

    std::cout << "Would you like to buy a " << item_name 
              << " for $" << item_price << ": ";

    if(asks_yes_no()) {//see exercise above
        total += item_price;

        std::cout << "A " << item_name << " has been added to your order. ";
    }

    std::cout << "Your total is $" << total << ".";
}

注文を追跡することもできます。

typedef unsigned int Amount;

std::map order;

/* ... */

total += item_price;

order[item_name] = 1;

浮動小数点値に関する小さな注意

Floating point arithmetic isn't exact. Instead of double, we should use an exact type and cents instead of a floating point type and dollars, e.g.

const Cents bagelPrice = 250;

小さなおもちゃのプログラムでは、 double で結構です。しかし、あなたがあなたのコードで本当のお金を扱ったことがあるなら、顧客、あなた、または政府のどちらも払いすぎないこと、または十分なお金を得ないことを確認してください。

使いやすさ

大事なことを言い忘れましたが、メニューをユーザーに表示して、購入したいアイテムを選択させることができます。

Welcome to our shop. We have the following products at hand:

 1) Bagel     ($2.50)
 2) Coffee    ($1.50)
 3) Espresso  ($1.50)
 4) Breakfast ($5.20)
 5) Checkout

Your choice? [1-5]: 1

Amount of bagels: 20

Your order of 20 bagels has been registered. Your new total is $50.00.

---- ---- ----

 1) Bagel     ($2.50)
 2) Coffee    ($1.50)
 3) Espresso  ($1.50)
 4) Breakfast ($5.20)
 5) Checkout

You ordered 20 bagels. Your next choice [1-5]: 5

Your total is $50.00. Thanks for visiting and come again!

そうすれば、20個のベーグルを購入したいだけであれば、すべての製品を調べる必要はありません。

55
追加された
丸めや精度の誤差があるため、金額の値として浮動小数点数を使用することに注意してください。 double は、おそらく c ++ の最良の選択肢の1つですが、注意すべき注意事項がいくつかあります。 stackoverflow.com/q/149033/1474939
追加された 著者 Nicolas Irisarri,
@Baldrickk私はその点に関して C ++コアガイドラインに従っています。 "名前空間stdを使用しているユーザーは stdとこのリスクについて知っているはずです"
追加された 著者 Zeta,
@ wizzwizz4私が何かを欠いていない限り、タイプミスはありませんでした。 itemName は、 "dialog"の例の元の変数です。これは、OPが最初に使用していた命名規則に従いました。 item_name は、会社の命名規則のために私が使用したものです。ところで、私のコードのすべての型はPascalCaseであり、camelCaseではありません。
追加された 著者 Zeta,
@BrianJの発言を拡張するには、おそらく金額をセントの金額として整数で格納する必要があります。
追加された 著者 Ron,
typedef に関するメモ - その使い方については非常に実用的です。 double のセマンティクスは一般的によく理解されています。 double が表示された場合 - 何が行われていて、どの演算子が利用可能かをすぐにわかります。 Price が表示されたら、何が起きているのかを調べるためにドキュメントを読む必要があります。あるいは、もっと悪いことに仮定する必要があります。これは価格と呼ばれる std::vectortypedef によってさらに拡大されます。
追加された 著者 Cristian Mergea,
「自分のしていることが分からないのであれば、 using namespace std を使用しないでください。
追加された 著者 mike,
@ゼータはい。わかります。それは私がそれを使わないと言う理由です。誰かがそれについて十分に知っていると、彼らはその規則を破るべき時を知っています。 ;)
追加された 著者 mike,
タイプミス: std :: cout << "A" << itenName << "が注文に追加されました。"; また、 itemName は型ではありませんか?この領域は奇妙に見えます。
追加された 著者 Kyo,
@Gerardもう1つの賢明な方法は、よりわかりやすい方法で変数に名前を付けることです。 double price_per_hour は、型を別名設定する必要なしに同じ情報を持ちます。
追加された 著者 Sab,

これはこれを実装するための非常に簡単な方法であり、読むのはとても簡単です。それは素晴らしいことです!しかし、もっと簡単な方法があることがあなたには起こったかもしれません。これを単純化することについてのいくつかの考えがあります。

クラスを使う

すべて同じプロパティを持つ項目がいくつかあることに注目してください。それらはすべて名前と値段があります。そのため、それらを1つのクラスにまとめることは意味があります。単純なクラスは次のようになります。

class InventoryItem {
    public:
        InventoryItem (const std::string& itemName, const double itemPrice);
        ~InventoryItem();

        std::string getName() const;
        double getPrice() const;

    private:
        std::string name;
        double price;
};

クラスのコンストラクタは、渡された商品名に name フィールドを、渡された商品の価格に price フィールドを設定するだけです。

InventoryItem (const std::string& itemName, const double itemPrice) : 
    name (itemName), 
    price(itemPrice) 
{
}

get 関数は単に値を返します。

std::string getName() const
{
    return name;
}

このクラスが完成したら、次のようにしてオブジェクトを作成できます。

InventoryItem newItem("burrito", 3.50);

配列を使う

いくつかのアイテムがあり、それらに対して同様の操作を行いたいので、それらを配列に入れることができます。 array は同じ種類の複数のアイテムを保持します。そのため、この場合は、 InventoryItem配列が必要です。次のようにして作成できます。

#include 

int main()
{
    std::array   inventory {
        InventoryItem("bagel", 2.50),
        InventoryItem("burrito",3.50),
        InventoryItem("donut", 1.00),
        InventoryItem("sandwhich", 3.50),
        InventoryItem("omelet", 1.25),
        InventoryItem("coffee", 1.50),
        InventoryItem("cappachino", 2.00),
        InventoryItem("smootie", 3.25),
        InventoryItem("water", 0.99),
        InventoryItem("spirit", 1.00)
    };

}

配列内に項目があり、各項目に対して同じことをしたい場合は、ループ内でそれらを繰り返すことができます。 array は他のオブジェクトを保持するため「コンテナ」の一種です。標準のテンプレートライブラリ(これは std :: プレフィックスのもの)によって提供されるすべてのコンテナは、コンテナ内の各項目をステップスルーすることを可能にする iterator と呼ばれるオブジェクトを提供します。単に container.begin()を呼び出して、コンテナ内の最初の項目を指すイテレータを取得し、次にそれを増分して次の項目を取得します。 container.end()と等しくなるまで増分し続けることができます。これで、処理する必要がなくなったことがわかります。それでは、上記の在庫アイテムの配列を使って試してみましょう。

for (std::array::iterator nextItem = inventory.begin();
     nextItem != inventory.end();
     nextItem++)
{
    std::cout << "Would you like to buy a " << nextItem->getName();
    std::cout << " for " << nextItem->getPrice() << "?\n";

    std::cin >> answerType;

    if (answerType == 'y')
    {
        std::cout << "A " << nextItem->getName();
        std::cout << " has been added to your order. Your total is ";
        std::cout << total << "\n";
    }
    else
    {
        std::cout << "Your total is " << total << "\n";
    }
}

さて、 total について何かおかしなことに気づいたでしょうか。正しく更新されていません。アイテムのコストを合計に追加しませんでした。私がしなかった理由は、私があなたがあなたのバージョンであなたがそれをどのようにしたか見て欲しいからです。最初の if ステートメントで、ユーザーが "y"を選択すると、 total + bagel が印刷されます。しかし、実際には total を更新するのではなく、印刷するだけであることに注意してください。実際に新しい価格を total に割り当てる必要があります。だからあなたはこのようなことをする必要があります:

total = total + bagel;

あるいは array とloopを使った私のバージョンでは、それはただのようになるでしょう:

total = total + nextItem->getPrice();

また、あなたのバージョンでは、2番目の if ステートメントで、ユーザーが "y"を選ぶと、ベーグルとドーナツの価格が表示されます。しかし、ユーザーがベーグルに "n"を、ドーナツに "y"を選んだ場合はどうなりますか?あなたは間違った価格を印刷するよ!

あなたがあなたが行くようにあなたが合計を追跡して、そしてすべての "y"選択の後にそれを更新するならば、それは常に正しい値を持つべきです、そしてあなたは手動で他のすべての選択を加える必要はありません。

そして、あなたは自分のバージョンを終了するのと同じようにそれを終了することができます。

cout << "Thank you for visiting Junelle's Cafe" << endl;
while (1);
return 0;

お立ち寄りいただきありがとうございます。

22
追加された
@NicHartleyと各アイテムの量を追跡する場合は、いつでも std :: multimap を使用できます
追加された 著者 Nick,
これはクラスの悪い例です。それは単なる const std :: pair です。
追加された 著者 Zeta,
もしあなたが保持しなければならないいくつかの不変量または内部状態を持っているならば、それは悪い習慣です。だからこそ、私は帽子から pair を引っ張りました(本当に便利ではありません、TBH)。いずれにせよ、私はあなたの投稿に「このクラスは大きくなるかもしれないので、インターフェースをきれいに整頓しておくべきだ」と付け加えます。その最後の提案は私が目指していたものでした。私は本当にもっとコーヒーが必要です。私たちが現在見直しているものを訪問するべきです。
追加された 著者 Zeta,
別の言い方をすれば(まだコーヒーが必要です): InventoryItemprivate フィールドを持つ class であることには利点があります適切な名前付きフィールドを持つ struct
追加された 著者 Zeta,
主にこれは初心者向けに書かれているので、ほとんどのフィールドをデフォルトで public にするのは悪い習慣だと思います。デバッグしにくいコードを書くことをお勧めします。また、このような単純なクラスは将来さらに多くのフィールドを含むようになるでしょう。実際のクラスがどのように見えるかについての基本的な例になることを主に意図していました。
追加された 著者 Jules,
std ::pair <> は、それが何を含んでいるのかについて有用な情報を提供していないので、特に悪いクラスです。私はそれを避け、可能な限り tuple を使用します。コードが判読できなくなるからです。
追加された 著者 Jules,
@Astrinusその時点で私はおそらくプロパティ(例えば、価格、在庫残高、商品固有の割引、報酬プログラム情報など)を持つクラスを定義し、 std :: map
追加された 著者 Nic Hartley,
私はあなたが本当にクラスを必要としないと主張するでしょう - std :: map itemPrices は同様に意味があり、ルックアップを実行するのがより速く、そしてより少ないコードがつかいます。それは今のところ十分すぎるほどです。より多くの機能(アイテム固有の割引など)が必要な場合は、いつでもコードをリファクタリングできます。
追加された 著者 Nic Hartley,
std :: array ではなく std :: vector を使用することをお勧めします。こうすれば、項目が将来変更されても、宣言を変更する必要はありません。 10 項目があるという事実は、プログラムに固有のものではありません。
追加された 著者 Wicelo,
while(1); とはまったく異なる何かに集中するのは実際にはUBです(副作用のない無限ループです)。
追加された 著者 Ben Steffan,

上記の回答に加えて

財務計算で浮動小数点を使用したことがない

浮動小数点加算は正確ではなく、丸め誤差が直感的ではない方法で伝播するため、これは良くありません。もっと複雑な計算をすると、1セントを失うか1セント上がる可能性が非常に高いです。

あなたの簡単な例ではうまくいくかもしれませんが、会計システムは通常固定小数点表現で動作することに気付くでしょう。

C ++は固定小数点をサポートしていないため、最も簡単な回避策は整数を使用し、すべての価格をセントで格納することです。

18
追加された
@アンドレアス。いいえ、私は従来のバイナリ浮動小数点フォーマットを意味します。すべての入力が(漠然とさえ)同じ大きさの最小額面金額である限り、本当に問題はありません。例を挙げれば、2進数の浮動小数点数として格納されると0.01 + 0.01≠0.02ですが、多くの演算を連鎖する場合でも、ここでは関係ありません)しかしTobyにはどちらかの意味があります。銀行で浮動小数点数が使用される場所は わかりません。
追加された 著者 Brad Tutterow,
「財務計算で浮動小数点を使用することは絶対にありません」 - 私はこのアドバイスをよく耳にし、自分でそれを実行するのをやめていました。しかし、精度の欠如が1セント/セント/ドルにまで及ぶことはないため、銀行では内部的に通貨を表すために浮動小数点を使用していると聞いています。したがって、これは実際には問題ではないという(もっともらしい)主張があります。
追加された 著者 Brad Tutterow,
@MartinYork 0.01は1/100ですが、これは2のべき乗の合計ではありません(または外出中ですか?
追加された 著者 Brad Tutterow,
@ KonradRudolph:0.01はきちんと格納されていると思うでしょう。その1.01それは小さな丸め問題を持つでしょう。 :-)
追加された 著者 Joseph Daigle,
@ KonradRudolph:浮動小数点は難しいです。うんち。いいえ、私は気難しいです。 :-)
追加された 著者 Joseph Daigle,
ちょっとした注意:これが基本的に私のレビューで typedef double Price を使った理由です。財務計算に適したタイプに簡単に変更できます。
追加された 著者 Zeta,
@コンラッド - アドバイスの全形式(ほとんどのプログラミングアドバイスのように)は、「 すべての結果を理解して受け入れない限り 」で終わると思います。 IME、金融ソフトウェアの作成者は、正確な(固定小数点)算術(取引の価格の追加など)を使用する場合と浮動小数点を使用する場合(利子の計算時など)を知っています(または知っておくべきです)。 (批判的に)それらの間で変換するとき。そして、あなたのセント/ペニー/전/分/øre/ kopek/...をあなたの浮動小数点の単位として使うことができないということは何も言っていません、それでそれは全く二分法ではないようです。
追加された 著者 Toby Speight,
倍精度は、お金に対する特定の操作の精度を欠く可能性があります。 speleotrove.com/decimal/decifaq1.html#needed のようなシンプルなカフェの場合これは(1と0からそれほど遠くない、そしてたまにVATを計算するために時には多少の差はありませんが)少しでも足ります。したがって、「財務計算に浮動小数点を使用しない」というのは、あまりにも説得力があり、時には単に間違っています。
追加された 著者 jyo,
@TobySpeight:おそらく固定小数点を使うことの最も重要な点は、それがプログラマに各操作の後に/丸めについて考えることを強いることです。これは金利計算や価格の追加などにも重要です。精度が中間結果の精度が高い場合、再現性を達成するのは困難です。
追加された 著者 Matt Brems,
@ KonradRudolph:これは基数10の浮動小数点です。私はそれがIEEE745規格の一部であり、それがどこで使われるのか疑問に思っていました。
追加された 著者 Matt Brems,

すでにいくつかの素晴らしいアドバイスがありますが、私はそれがSTLを使ったことに気づきました。あなたはカフェの機能を取り入れるためにクラスを使うことによってあなたのプログラムを大いに単純化することができます。

このようなもの:

struct Product
{
    static float total;
    static constexpr float tax = 6.25;
    char desc[16];
    float price;
    bool pitchItem(); 
}productList[10] =
{
    "bagel",2.50,
    "burrito",3.50,
    "donut", 1.00,
    "sandwich", 3.50,
    "omlet", 1.25,
    "coffee", 1.50,
    "cappachino", 2.00,
    "smoothie", 3.25,
    "water", .99,
    "spirit",1.00
};

この製品構造体はあなたが必要とするすべての情報を含んでいます。静的メンバーはオブジェクトではなくクラスのメンバーなので、グローバルまたは集約情報を格納するために使用できます。この場合、メソッドはパラメータを必要としません。スコープ内のdescとpriceの値を参照していると想定しているからです。

この例では、すべてのサイズは静的です。これはスペース節約を目的としたプログラミングの最も効率的な方法ではありませんが、やり過ぎるとやり過ぎることになります。

The pitchItem() method removes redundant typing by doing このようなもの:

bool Product::pitchItem()
{
    bool goodAnswer = true;
    char answer;
    std::cout << "Would you like to buy a " << desc << "?: ";
    std::cin >> answer;
    if(answer == 'y' || answer == 'Y')
    {
        total += price;
        std::cout << "A "<< desc << " has been added to your order. Your total is $"<< std::fixed << std::setprecision(2) <<< "\n"; 
    }
    else if(answer == 'n' || answer == 'N')
    {
        std::cout << "Your total is $" << total << "\n";
    }
    else
    {
        std::cout << "Sorry, I must have misunderstood you.\n";
        goodAnswer = false;
    }
    return goodAnswer;
}

このようなことをすると、forループを使ってすべての選択肢を繰り返すことができます。質問のステータスが返されるので、入力が有効であることを確認するためにこのようなことをすることができます。

    if(!productList[i].pitchItem())
    {
        i--;
    }

それが役立つことを願っています。

1
追加された