0

ファイルから読み取り、さまざまな計算を実行し、出力ファイルに回答を書き込む必要がある課題があります。このステップに到達するまで、すべてが順調に進んでいました。

「合計が 1000 を超えない限り、ファイルを再度読み取り、ファイル内の整数の合計を計算します。フラグ制御ループ構造を使用します。」

私のコードスニペットは次のとおりです。

dataFile2.close();
dataFile2.clear();
dataFile2.open("J:\\datafile2.txt");

sum = 0;
while(sum < 1000)
{
    dataFile2 >> num;
    sum = sum + num;
    if(sum > 1000)
        sum = sum - num;
}

answers << "The sum of the integers not exceeding 1000 is " << sum << endl;
cout << "The sum of the integers not exceeding 1000 is " << sum << endl;
return 0;

私の変数はすでに宣言されています。if ステートメントを取り出すと、合計が最後の数値を追加し、合計が 1000 を超えます。 If ステートメントが残っている場合、answers ステートメントと cout ステートメントは実行されず、コンパイラの警告やエラーは発生しません。

これに関するヘルプは大歓迎です。

-ThePoloHobo

4

2 に答える 2

1

誰もあなたに正しい答えを与えたがっていないように見えるので...(そして公平を期すために、実際にあなたのためにあなたの仕事をしなければ正しい答えを与えるのは難しいです).

コードには 2 つの問題があります。1 つ目は、フラグを使用するという要件です。コメントで述べたように、慣用的な解決策ではフラグを使用しませんが、フラグを使用しても問題はありません。フラグは、 でテストされるブール変数であり while、ループを終了したい何かを見つけたときに、ループ内の条件で設定されます。

2 つ目の問題はnum、入力が成功したことを確認せずに使用していることです。 オペレーターのに確認する必要があります。>>チェックの慣用的な方法 (言語の経験がない人が使用すべき唯一の方法) は、ストリームをブール値であるかのように扱うことです。

dataFile2 >> num;
if ( dataFile2 ) {
    //  Input succeeded...
} else {
    //  Input failed for some reason, maybe end of file
}

ストリームに対するすべての操作はストリームへの参照を返すため、通常はテストと入力をマージします。

if ( dataFile2 >> num ) {
    //  succeeded
} else {
    //  failed
}

(個人的には、状態を anifまたは a のwhile恐ろしい状態で変更するという考えを見つけました。しかし、このイディオムは非常に遍在しているため、おそらく使用する必要があります。単純な理由は、誰もがそれを期待しているためです。)

教育環境では、失敗をファイルの終わりと見なし、テストを単に上に移動することはおそらく許容されますwhile(もちろん、フラグを使用するように求められた場合を除きます)。"abc"他のコンテキストでは、失敗の原因が入力の構文エラー (数値を予期していたファイルに誰かが挿入された) である可能性があるという事実を考慮する必要があります。これを処理する方法はいくつかありますが、そのすべてが実行しようとしている範囲を超えていますが、失敗を検出した、ストリームに問い合わせて理由を知ることができることに注意してください。特に、 dataFile2.eof()が true の場合、失敗は (おそらく) すべてのデータを読み取ったことが原因であり、すべて問題ありません。(つまり、データの読み取りに失敗しても、必ずしもエラーとは限りません。単にファイルの終わりである可能性があります。)

于 2013-03-25T09:22:39.670 に答える
-1

この場合に役立つフラグ変数を使用していないようです。このような何かがそれを修正する必要があります:

sum = 0;
bool sumUnder1000 = true; //Or the C++ equivalent, I'm a bit rusty
while(sumUnder1000)
{
    if(!dataFile2.good()){
        sumUnder1000 = false; //We've reached end of file or an error has occurred
        return;
    }
    dataFile2 >> num;
    sum = sum + num;
    else if(sum > 1000){
        sum = sum - num;
        sumUnder1000 = false;
    }
}
于 2013-03-24T21:32:59.313 に答える