0
    bool Customer::checkout(Inventory* inv) {

  double total = 0;

  for( unsigned int i=0; i < _Cart.size(); i++ ) {
      total += (_Cart[i].price * _Cart[i].quant); //

  }

  if( balance < total ) {
      cout << "Checkout Failed. You do not have enough money to afford everything." 
          <<"Please go back and remove items as necessary.\n";
      return false;
  }

  else {

    unsigned int j = 0;                                          //Then, you need to add said food into the purchased vector
    for (j = 0; j < inv->_Purchases.size(); j++)    {                //When you add the food into the purchased vector, you need to look through
        if (inv->_Purchases[j].name == _Cart[j].name) {     //the entire purchased vector to see if the food is already there, 
             inv->_Purchases[j].quant += _Cart[j].quant;     //if so, increment quantity if not, just push the food into the vector
             break;

        }
    }

         if( j == inv->_Purchases.size()) {
             inv->_Purchases.push_back(_Cart[j]);
             cout << "Checkout is Complete.\n";
             return true;
        }

        _Cart.clear();

  }



    balance -= total;
    inv->interval += 1;
    inv->restock( "restock fruits.txt", 2 );
    inv->restock( "restock inventory.txt", 3);
    cout << "Checkout Complete.\n";
    return true;

}



    void Inventory::summary() {
    double total = 0;
    for( unsigned int j=0; j<_Purchases.size(); j++ ) {
      cout << "\nTotal purchases for the store are:";
      cout << "\nFood: " << _Purchases[j].name << " | Quantity: " << _Purchases[j].quant << " | Price: " << _Purchases[j].price << endl;
      total += (_Purchases[j].quant * _Purchases[j].price);
  }
  cout << "Total Purchase: " << total << endl;

    //cout the purchased vector's .name
    //cout the quant 
    //cout the price*quant
    //make a total, and cout it at the end
    }

これが私のメインです:

    #include "foodservice.h"
    #include <iostream>
    using namespace std;

    int main() {
      Inventory Master;
      bool flag;
      Customer Bob("Bob", 12345, 100.00 );
      Customer Joe("Joe", 56789, 50.00 );
      Customer Arjun("Arjun", 98765, 35.89 );
      Customer Randy("Randy", 54689, 30.28);
      Customer Mark("Mark", 76598, 15.18);


  Master.firststock( "inventory.txt" );
  vector<Food> temp = Master._Inv;
  cout <<"Hi, What would you like to buy today?" << endl;
  for(unsigned int i=0; i<temp.size(); i++ ) {
    cout << temp[i].name << " " << temp[i].quant << " " << temp[i].price << endl;
  }

  cout <<"\n";
  Food Apple("Apples", .99, 10);
  Food Oranges("Oranges", .99, 2);
  Food Chips("Chips", 3.00, 2);

  cout <<"\nHi Bob" << endl;
  flag = Bob.addCart(Apple, 7, &Master);
  cout <<"Bob's total purchases are Currently: \n";
  Bob.report();
  flag = Bob.addCart(Oranges, 2, &Master);
  flag = Bob.addCart(Chips, 2, &Master);
  flag = Bob.removeCart(Apple, 3, &Master);
  Bob.report();
  cout <<"Bob, ";
  flag = Bob.checkout(&Master);

  cout <<"\nHi Arjun" << endl;
  flag = Arjun.addCart(Apple, 3, &Master);
  cout <<"Arjun, ";
  Arjun.report();
  flag = Arjun.checkout(&Master);

  Master.summary();

summary(); を呼び出すと、メインでは、何らかの理由で、次のようにリンゴのみを出力に表示するようです:

"ストアの購入合計: 食品: りんご | 数量: 7 | 価格: 0.99 購入合計: 6.93"

しかし、ご覧のとおり、Bob のカートにリンゴ、オレンジ、チップスをすべて追加したので、3 つすべてが表示されるはずですが、表示されません。助けていただければ幸いです。これはまだ進行中の作業です。なんか関係ある気がする

if( j == inv->_Purchases.size()) {
             inv->_Purchases.push_back(_Cart[j]);
             cout << "Checkout is Complete.\n";
             return true;

But i am not sure.
4

3 に答える 3

2

問題は、既に購入したアイテムを追加するループにあります。論理が間違っています。

あなたが書いた

for (j = 0; j < inv->_Purchases.size(); j++)
    if (inv->_Purchases[j].name == _Cart[j].name)
...

しかし、これはandとetc.と比較_Purchases[0]します。必要なのは2つのループなので、すべてのアイテムをすべてのアイテムと比較します。このようなもの_Cart[0]_Purchases[1]_Cart[1]_Cart_Purchases

for (i = 0; i < _Cart.size(); i++)
{
    for (j = 0; j < inv->_Purchases.size(); j++)
    {
        if (_Cart[i].name == inv->_Purchases[j].name)
...

残りはお任せします。いい運動になります。

于 2012-08-05T08:15:51.610 に答える
0

あなたの検索ループは完全に正しくないようです:

  • _Purchases と _Cart の両方をスキャンするために同じインデックスを使用する
  • 最初の製品が在庫と一致したときにサイクルを中断します

おそらく、_Cart.size() に対してループが実行されたときにチェックされる一致のカウンターは、よりうまく機能する可能性があります。

于 2012-08-05T08:15:49.703 に答える
0

異なる配列で同じインデックスを比較しinv->_Purchases[ j ].name == _Cart[ j ].name、1 つの要素を追加した後に戻ると、_Cart.size() < inv->_Purchases.size()(バッファ オーバーフロー) または_Cart.size() == 0(ヌル ポインタの逆参照) の場合に問題が発生します。

したがって、これを変更します。

{
    unsigned int j = 0;
    for (j = 0; j < inv->_Purchases.size(); j++)
    {
        if (inv->_Purchases[j].name == _Cart[j].name)
        {
            inv->_Purchases[j].quant += _Cart[j].quant;
            break;
        }
    }
    if( j == inv->_Purchases.size() )
    {
        inv->_Purchases.push_back( _Cart[j] );
        cout << "Checkout is Complete.\n";
        return true;
    }
    _Cart.clear();
}

これに:

{
    unsigned i, PurchasesBefore = inv->_Purchases.size();
    while( !_Cart.empty() )
    {
        for( i = 0; i != inv->_Purchases.size(); ++i )
        {
            if( inv->_Purchases[i].name == _Cart.back().name )
            {
                inv->_Purchases[i].quant += _Cart.back().quant;
                break;
            }
        }
        if( i == inv->_Purchases.size() )
            inv->_Purchases.push_back( _Cart.back() );
        _Cart.pop_back();
    }
    if( PurchasesBefore != inv->_Purchases.size() )
    {
        cout << "Checkout is Complete.\n";
        return true;
    }
}

注:このコードについてはよくわかりません:

balance -= total;
inv->interval += 1;
inv->restock( "restock fruits.txt", 2 );
inv->restock( "restock inventory.txt", 3);
cout << "Checkout Complete.\n";
return true;
于 2012-08-05T08:25:42.140 に答える