2016-06-21 7 views
0

4件の観光名所するために必要な、このコード「ながら」でアキュムレータをクリア:C++ - ループ

  • が販売アイテム
  • の数は、税金の割合を入力し、各販売アイテム
  • の価格を入力してください
  • 再び

を実行するためのオプション私は、これらすべての要件を完了しているが、コードが繰り返されたときに、私の唯一の問題はでています。私はテスト後のループの中でアキュムレータに総項目値を保存します。プログラムがループすると、アキュムレータがクリアされず、古い値の上に新しい値が追加され続けます。あなたが必要とする

(例:コードの私の最初の走行は20 $の合計を持っていた、と繰り返し実行が30 $の合計を持って、それは50 $であること、私の合計金額が表示されます)

#include <iostream> 
#include <iomanip> 
using namespace std; 

int main(){ 

char answer = ' '; 
int saleItems = 0; 
double itemValue = 0.0; 
double titemValue = 0.0; 
double taxPerc = 0.0; 

do { 
    cout << "How many sales items do you have? : "; 
    cin >> saleItems; 

    for (int x = 1; x <= saleItems; x += 1){ 
     cout << "Enter in the value of sales item " << x << " : $"; 
     cin >> itemValue; 
     titemValue += itemValue; 
    } 

    cout << endl << endl; 
    cout << "Enter in the sales tax percentage(Enter 10 for 10%): "; 
    cin >> taxPerc; 
    cout << endl << endl; 

    double saleTax = titemValue * (taxPerc/100); 
    double grandTotal = titemValue + saleTax; 

    cout << fixed << setprecision(2); 

    cout << "********************************************" << endl; 
    cout << "******** S A L E S R E C E I P T ********" << endl; 
    cout << "********************************************" << endl; 
    cout << "**          **" << endl; 
    cout << "**          **" << endl; 
    cout << "**          **" << endl; 
    cout << "**          **" << endl; 
    cout << "** Total Sales   $" << setw(9) << titemValue << "  **" << endl; 
    cout << "** Sales Tax    $" << setw(9) << saleTax << "  **" << endl; 
    cout << "**       ---------- **" << endl; 
    cout << "** Grand Total   $" << setw(9) << grandTotal << "  **" << endl; 
    cout << "**          **" << endl; 
    cout << "**          **" << endl; 
    cout << "********************************************" << endl << endl << endl; 

    cout << "Do you want to run this program again? (Y/N):"; 
    cin >> answer; 
    answer = toupper(answer); 
    cout << endl << endl; 

    } while (answer == 'Y'); 


return 0; 
} 
+0

プログラムの先頭に変数を初期化します。プログラムは一度実行しますが、ループを複数回実行します。したがって、各反復の開始時に変数を初期化する場合は、変数を0.0に初期化する必要があります。あなたがしたように宣言に初期設定を残すことは良い習慣ですが。 – Bartez

答えて

2

ループ内のtitemValueの値をリセットしますが、ループ外に設定されています。あなたは、必ずしも最初の行を変更する必要はありません

char answer = ' '; 
int saleItems = 0; 
double itemValue = 0.0; 
double titemValue = 0.0; 
double taxPerc = 0.0; 

do { 
    cout << "How many sales items do you have? : "; 
    cin >> saleItems; 

char answer = ' '; 
int saleItems = 0; 
double itemValue = 0.0; 
double titemValue; // (changed) 
double taxPerc = 0.0; 

do { 
    titemValue = 0.0; // (new) 
    cout << "How many sales items do you have? : "; 
    cin >> saleItems; 

に変更したが、二度同じ事に、その値を設定することで無感。 AFAIKコンパイラの中には、二重初期化を途中でやめてしまえば、それを最適化するものがあります。 Visual Studioのようなデフォルトのデバッグ構成設定では動作しないものもあります。

+1

*しかし、その値を同じものに2回設定する意味はありません。*変数を常に初期化することをお勧めします.YMMV。 –

+1

おそらくアプリケーションに依存しています。つまり、実行速度と潜在的なバグについてどの程度懸念していますか。非常に大きな配列が2回初期化されていて、それが2回初期化されていると確信していて、初期化に時間がかかる場合は、例外が発生することがあります。この場合、明らかになったため削除しましたが、そうでない場合や、共同開発者が潜在的に変更するものを変更することを期待していた場合は残しておきます(たとえば、通常クラスメンバーの場合、たとえそれらが後で再び初期化されたとしても)。 –

+1

コンパイラが出てくると、 'double titemValue = 0.0;'の割り当てがプログラムに全く影響を及ぼしていないことを確認してください。一方、問題があってバグがあれば、RAMにトラップされたランダムなクラップより0.0をトラップする方がはるかに簡単です。 – user4581301