1

私はこのサイトに不慣れで、今学期は C++ 言語でプログラミングしています。

私は2日間本当に頑張っていて、クラスメートに尋ねましたが、彼らも知りません. クラスメートは 2D 配列を使用すると言っていましたが、それが何であるかはわかりません。私の教授は 2D 配列について行っていません。

私は立ち往生しており、本当に助けていただければ幸いです。

入力ファイルには次のものが含まれます。

Plain_Egg 1.45
Bacon_and_Egg 2.45
Muffin 0.99
French_Toast 1.99
Fruit_Basket 2.49
Cereal 0.69
Coffee 0.50
Tea 0.75

すべての「ユーザー」注文を表示する方法をidk

基本的に領収書は、彼がこれと何個注文してから「他に何か欲しい?」と聞いて、注文番号と何個かを聞き、最後にこのような領収書を返します。

bacon_and_eggs    $2.45
Muffin            $0.99
Coffee            $0.50
Tax               $0.20
Amount Due        $4.14

これが私のコードです:

// Libraries

#include <iostream>
#include <string>
#include <iomanip>
#include <fstream>
#include <cmath>

using namespace std;

//structures

struct menuItemType {
    string itemName;
    double itemCost;
};


// Prototypes
void header();
void readData(menuItemType menu[]);
void Display(menuItemType menu[]);

int main() {

    header();
    menuItemType menu [8];
    readData(menu); 
    Display(menu);

    //system("pause");

    return 0;
}

void header() {
    char c= 61;
    for (int i=0; i < 64; i++) {
        cout << c; 
}

cout << c << endl; 
cout << endl;
cout << "Breakfast Menu" <<endl;


    for (int i=0; i < 64; i++) {
        cout << c; 
    }

    cout << "" << c << endl;
    cout << endl;
}

void readData(menuItemType item[]) {
    int i=0;
    ifstream in;
    in.open("input.txt");
    cout << fixed << setprecision(2);

    while(!in.eof()) {
        in >> item[i].itemName >> item[i].itemCost;
        ++i;
    }
}

void Display(menuItemType item[]) {
    int choice = 0, quantity = 0;
    double total = 0.0, totalF = 0.0, tax = 0.0;
    char exit = 'y';
    int j = 1, z = 1, i = 1;

    //the Menu
    for (int i=0; i<8; i++){
        cout << j << ". " << setw(18) << left << item[i].itemName << "$" << setw(10) << item[i].itemCost << endl;
        j++;
    }

    cout << endl;

    while(exit == 'y' || exit == 'Y') {

        cout << "Please Enter your Selection or 0 to Exit : ";
        cin >> choice;

        if(cin.fail()) {
            cout << "*******Invalid selection*******" << endl;
            cin.clear();
            cin.ignore(1000,'\n');
        } else if (choice==0) {break; }
        else {
            cout<< "Enter Quantity: ";
            cin>> quantity;

            if (quantity==0) { break;}
            else {
                choice--;
                total += (quantity * item[choice].itemCost);
                tax = (total * .05);
                totalF = total + tax;
                cout << endl;
            }
            cout << endl;
            cout << "======================================================" << endl;
            cout << item[choice].itemName << "\t\t" << item[choice].itemCost << endl;
            cout << "======================================================" << endl;
            cout << "Do you want to continue (Y/N): ";
            cin >> exit;
        }
    }
}
4

1 に答える 1

3

まず、これには 2 次元配列は必要ありません。私が知る限り、適切な構造の 1 次元配列が既にあります。オブジェクトの名前とその価格を格納するものです。いくらか欠けているのは、現在配列内にあるオブジェクトの数と、そのスペースの量です。配列全体の内容を使いたい場合は、オブジェクトが正しく初期化されていることを確認してください。たとえば、名前が空であること (これは実際には自動的に行われます) や、価格がゼロであること (これは行われません) などです。

コピー & ペースト エラーかどうかはわかりませんが、ヘッダーが正しく含まれていません。インクルード ディレクティブは次のようになります。

#include <iostream>

値を読み取る実際のループは実際には機能しません。読み取りを試みた、入力が成功したことを常に確認する必要があります。また、ループの終了をチェックするために使用するのは間違っています (人々がどこからこれを拾ったのかわかりません。入力ループをチェックするために使用することを推奨する本は、書き込みにのみ役立ちます)。ループは次のようになります。eof()eof()

while (i < ArraySize && in >> item[i].itemName >> item[i].itemCost)
    ++i;
}

これにより、配列が消費できる以上の入力がある場合の潜在的な境界オーバーランも修正されます。代わりにa の使用を検討することをお勧めしますstd::vector<Item>。このクラスは要素の数を追跡し、必要に応じて新しい要素を追加できます。

何にこだわっているのかを完全に述べていないことに注意してください。実際の問題が何であるかをより明確に説明する必要があります。上記は既存のエラーを修正し、見る方向を再調整しているだけです (つまり、今のところ 2 次元配列は忘れてください)。

于 2012-11-12T01:33:26.113 に答える