0

このプログラムは、ユーザーが入力したいくつかの基本的な野球の統計情報を受け取り、いくつかの操作を実行して、最終的に複雑な統計情報を出力します。関数の学習を始めたばかりですが、最初は関数でこのプログラムを実行しようとしましたが、惨めに失敗しました。ただし、プログラムは関数なしで実行できると思います。これまでのコードは次のとおりです。

(投稿システムは、#include < の後に何かを入力することを拒否しますが、私は iostream、iomanip、conio.h、および cmath を使用しています。)

using namespace std;   

int main()   

{   
    int H, TB, BB, HBP, AB, YEAR, LGRS, LGPA;   
    double REqA, EqR, RA, WIN, AEqA, LGEqA, aWIN;   

    cout << "Enter the player's at bats." << endl;   
    cin >> AB;   

    cout << "Enter the player's hits." << endl;   
    cin >> H;   

    cout << "Enter the player's total bases." << endl;   
    cin >> TB;   

    cout << "Enter the player's walks." << endl;   
    cin >> BB;   

    cout << "Enter the player's times hit by pitch." << endl;   
    cin >> HBP;   

    cout << "Enter the year the player played." << endl;   
    cin >> YEAR;   

    if (YEAR != 2012)   
    {   
       cout << "Sorry, this program only supports the 2012 season." << endl;   
    }   

    else  

    {   
       LGRS = 21017;   
       LGPA = 184179;   
       LGEqA = 0.72401;   

    }      

    REqA = (H + TB + (1.5 * (BB + HBP))) / (AB + BB + HBP);   

    EqR = (2 * REqA / LGEqA - 1) * (AB + BB + HBP) * (LGRS / LGPA);   

    WIN = (EqR * EqR) / ((EqR * EqR) + (RA * RA));   

    aWIN = (WIN / (1 - WIN));   

    AEqA = pow(aWIN, 0.2) * 0.26;   

    cout << "The player had a " << AEqA << " EqA in " << YEAR << "." << endl;   

    getch();   

    return 0;   

}  

AEqA の最終的な出力は、最初に入力された数値に関係なく、常に 0 です。REqA を出力するようにプログラムを設定すると、プログラムは必要な数を出力しています。しかし、AEqA の最終出力のために、その後に続くすべてのステップを実行する必要があり、それは常にゼロになります。EqR を出力するようにプログラムを設定すると、出力も常に 0 になるため、問題は EqR を計算する行にあると思います。

4

2 に答える 2

0

ユーザー入力には getline を使用することをお勧めします

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

int main ()
{

  int H, TB, BB, HBP, AB, YEAR, LGRS, LGPA;   
  double REqA, EqR, RA, WIN, AEqA, LGEqA, aWIN; 

  cout << "Enter the player's at bats.? " << endl;
  getline (cin, AB);

  //etc ...

   return 0;

}

于 2012-11-08T22:44:15.017 に答える
0

この行

 WIN = (EqR * EqR) / ((EqR * EqR) + (RA * RA));

あなたの変数RAは決して初期化されません。そのような場合、おそらくデフォルトでゼロに初期化されます。このような場合、これは次のようになります。

WIN = 1 

あなたがこれを行うとき

aWIN = (WIN / (1 - WIN));  

したがって、ゼロによる浮動小数点除算を行っているため、無限大になります。無限大の呼び出しが何をするのかpowはわかりませんが、それは良くないと思います。変数が何を表しているのかわかりませんが、いつでもこの問題が発生します

RA = 0

そのため、何かに初期化するか、ユーザー入力値をキャッチすることをお勧めします。デバッガーを使用して、プログラムの実行時に変数が正しく設定/計算されていることを確認することを強くお勧めします。

ここで整数除算によってゼロを取得していることにも注意してください-設定します

LGRS = 21017;   
LGPA = 184179; 

そして、この行で

EqR = (2 * REqA / LGEqA - 1) * (AB + BB + HBP) * (LGRS / LGPA);   

結果として

(LGRS / LGPA)

以降、常にゼロに等しいLGRS < LGPA。2 つの整数型の除算の結果は当然のことながら整数であり、分子と分母が両方とも正であるが、分子が分母より小さい場合、結果はゼロになります (このサイトまたは一般的な Web で整数除算を調べてください)。結果として、製品にはゼロ項が含まれているため、EqR == 0

于 2012-11-08T22:49:45.610 に答える