0

私はコードを書きましたが、合計が間違っていることを除いて動作します。distanceRate に率を掛け、各コストを加算して合計を作成することになっていますが、そうではありません。どんな助けでも大歓迎です。

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

using namespace std;

int main()
{
    //Declare Variables
    ifstream inFile;

    double packageWeight;
    double distance;
    double totalCharge = 0;
    double rate;
    double distanceRate;

    int customerNumber;
    double shippingCharge;
    int packageCount = 0;


    inFile.open("shipping.txt");
    if(inFile)
    {
        cout << "Customer   Package   Shipping" << endl;
        cout << "Number     Weight    Distance" << endl;

        while(!inFile.eof())
        {
            inFile >> customerNumber;
            inFile >> packageWeight;
            inFile >> distance;

            if(0 < packageWeight <= 2)
                rate = 1.10;
            else if(2 < packageWeight <=6)
                rate = 2.20;
            else if(6 < packageWeight <= 10)
                rate = 3.70;
            else if(10 < packageWeight <=20)
                rate = 4.80;
            else
                cout << "Invalid package weight" << endl;

            if( 0 < distance <= 500)
                distanceRate = 1;
            else if( 500 < distance <= 1000)
                distanceRate = 2;
            else if(1000 < distance <= 1500)
                distanceRate = 3;
            else if(1500 < distance <= 2000)
                distanceRate = 4;
            else
                cout << "Invalid distance" << endl;

            packageCount += customerNumber;
            shippingCharge = rate * distanceRate;
            totalCharge += shippingCharge;

            cout << fixed << setprecision(2) << showpoint;
            cout << setw(2) << customerNumber
            << right << setw(14) << packageWeight
            << setw(13) << distance
            << endl;

        } //End of while loop

        cout << "\nPackage shipped : " << packageCount << endl;
        cout << "Total Charge : $" << totalCharge << endl;
        inFile.close();
    }
    else
    {
        cout << "Could not open file" << endl;
    }
    system("pause");
    return 0;
}
4

2 に答える 2

3

あなたがくれたスニペットに見られるいくつかの問題は次のとおりです。

  1. コメントで billz が指摘したように、if ステートメントは無効です。ステートメントif( 0 < distance <= 500)はあなたが期待することをしていません。左から右に評価されるので、0 < distance(それが に評価されるとしtrueましょう) を持ってtrue <= 1000います。これは、実際には のように 2 つの個別の比較に分割する必要がありますdistance > 0 && distance < 500

  2. コメントで指摘したように、パッケージ数に顧客番号を追加しているため、パッケージ数に常に間違った値が返される可能性があります。顧客番号が 1、2、3、4 の場合、パッケージ数は 10 であると主張しますが、実際には 4 つしかありません (このフィールドの目的を誤解していた場合はご容赦ください)。

  3. のデフォルト値はありませんdistanceRateが、予期しない結果をもたらす操作(おそらく初期化されていない)でまだ使用しています(ご覧のとおり)。あなたのelseでは、実際にはダミーの値を与えて、常に設定されることを保証する必要があります。また、それをリセットするので、4 に設定され、次の距離がテストに失敗し、else に入ると、変数のデフォルト値ではなく 4 として別の計算が行われます。初期化時に値を指定しない明確な理由がない限り、使用する予定の変数を初期化する必要があります。ループで変数を使用するときはいつでも、ループの開始時にその値をリセットする必要があります。

追記(編集)


system("pause");単純な一時停止よりも舞台裏で多くのことを行うため、使用することはお勧めしません。私が使用したより良いアプローチは次のとおりです。

#include <iostream>
#include <conio.h>
using namespace std;

int main() {
    cout << "Press any key to continue!";
    _getch();
    cout << "Finished";

    return 0;
}

編集2


If ステートメントには、実行する単一行またはコード ブロックを含めることができます。

単線:

if (someValueIsTrue)
    executeThisFunction();

コードブロック:

if (someValueIsTrue) {
    executeThisFunction();
    alsoThisFunction();
}

if/else/while/for/do...while/etc... で複数のステートメントを実行する必要がある場合はいつでも、コード ブロックが必要になります。(あなたの説明に基づいて)あなたがしたと思います:

if (blah)
    // ....
else
    distanceRate = 0;
    cout << "Invalid Distance";

そして、コンパイラdistanceRate = 0はループ内に入れ子になっていることだけを認識します。coutステートメントは実際にはelseの一部ではなく、前のコードブロックの一部です。ここでコード ブロックを使用する必要があります。

于 2013-02-19T01:18:54.523 に答える
0
!inFile.eof()  // incorrect
 inFile.good() // correct

eof() を読むと、あなたが思うかもしれないことをしません。

if( 0 < distance <= 500) // all the if statements are incorrect
if(distance>0 && distance<=500) // correct

あなたがif条件を書いた方法は、あなたが思っていることをしません。

于 2013-02-19T01:24:12.590 に答える