2

私の課題は、ボウリングの平均を計算することです。5 人のプレーヤーがいて、各プレーヤーに 3 つのゲームがあります。私は現在、プレイヤー用とゲーム番号用の 2 つのループを実行しています。これらの各ループの終了時にプレイヤーの平均を表示し、そのループの終了時にチームの平均を表示する必要があります。

コードを修正し、古いコードを以下の新しいコードに置き換えました。ここでみんなのコメントなどを見る前に遊んでいましたが、それまでに解決していました。

でもみんなありがとう!

#include <iostream>

using namespace std;

int main()
{
//DECLARATIONS
const int PLAYER_NUMBER = 5; //There are five players total
const int GAME_NUMBER = 3; //There are three games total
const int MIN = 0; //Min number
const int MAX = 300; //Max number
double* playerScore; //The players' score of current game
double playerAverage = 0; //The current players' average
double teamAverage = 0; //The teams' average

//INPUT

for (int currentPlayer = 0; currentPlayer < PLAYER_NUMBER; currentPlayer++)
{//Set the current player number  

    for (int currentGame = 0; currentGame < GAME_NUMBER; currentGame++)
    {//Set the current game number
             //Get scores

             cout << "For Player " << (currentPlayer + 1) << ", enter score for game " << (currentGame + 1) << ": ";
             cin  >> playerScore[currentGame];


             if(playerScore[currentGame] < MIN || playerScore[currentGame] > MAX)
             {//Check range
                   cout << "The score must be between 0 and 300!\n";
                   currentGame--; //If there is an error, subtract the game number by one
             }//End If statement

             playerAverage += playerScore[currentGame];

             if(currentGame == 2)
             {//Current player average
                cout << endl << "The average for player " << (currentPlayer + 1) << " is: " << (playerAverage / 3) << endl << endl;
                teamAverage += playerAverage;
                playerAverage = 0;
             }//End If statement

    }//End game for-statement

}//End player for-statement

    cout << endl << "The average for the team is: " << (teamAverage / 15) << endl << endl;

//ENDING    
system("Pause");
return 0;    
}//Close main

しかし、まだそこにいる人にとって、ターミナルを開いたままにし、「sys("PAUSE");」を使用する必要がない方法はありますか? 私はそれを使うのが本当に嫌いです。

4

5 に答える 5

6

宣言しdouble* playerScoreていますが、ストレージをどこに割り当てているのかわかりません。おそらくあなたは何かを上書きしています。

于 2012-01-17T02:39:31.393 に答える
3

ループは最後のゲーム番号またはプレーヤー番号をチェックしません。

system("pause")コンソールを開いたままにしておくだけでも悪いことではありませんか?またはsystem("pause")のようなものを使用することで使用を避けることができます。std::cin.get()getchar()

またplayerScore、ポインタを作成し、それを*前に付けずに使用したため、実際には、ポインタが指しているもののアドレスを取得しようとしています(この場合は何もありません。割り当てられていません)。

于 2012-01-17T02:43:28.433 に答える
2
int main()
{
/* ... */
double* playerScore; //The players' score of current game

for (int currentPlayer = 0; currentPlayer < PLAYER_NUMBER; currentPlayer++) {
    for (int currentGame = 0; currentGame < GAME_NUMBER; currentGame++) {
             cout << "For Player " << (currentPlayer + 1) << ", enter score for game " << (currentGame + 1) << ": ";
             cin  >> playerScore[currentGame];

に書き込んでいるときはplayerScore[currentGame]、割り当てられていないメモリに書き込んでいます。あなたが何に書いているのかわかりませんが、書くのはあなたではありません。

にメモリを割り当てる必要がありますplayerScore。メモリを割り当てるための最良の方法を決定する必要がありますが、次のようなものです。

double playerScore[PLAYER_NUMBER];

良い出発点かもしれません。

ちなみに、これはおそらくコンパイラが警告するものです。さらに警告をオンにする必要があるかもしれませんが(-Wall -Wextra私のお気に入りのフラグgccです-コンパイラには別の何かが必要な場合があります)、これについて警告できるはずです。すべてのコンパイラ警告を修正する必要はありませんが、無視しないでください。最新のコンパイラでは、何千年ものプログラミング経験が蓄積されています。

于 2012-01-17T02:41:58.090 に答える
2

したがって、ここにはいくつかの問題があります。

  • アレイにスペースを割り当てることはありません。あなたはどこかplayerScoreに必要です。new
  • cin >> playerScore[currentGame]配列インデックス0、1、2のみを書き込みます。このロジックは、currentPlayerとcurrentGameを何らかの方法で組み合わせる必要があります。
  • と同じplayerAverage += playerScore[currentGame];
  • アレイを使い終わったら、delete[]割り当てるスペースを確保する必要があります。newplayerScore
于 2012-01-17T02:47:29.673 に答える
2

入力を不明な場所に保存しています。まだセグメンテーション違反に遭遇していないことに驚いています。

double* playerScore;必ずしも配列を宣言する必要はありません。これは「double へのポインター」です。これを使用して、ヒープ上に配列を作成できます ( playerScore = new double[SOME_SIZE];)。

他の初期化されていない変数を使用するのと同じように、ポインターを使用して指す場所を実際にポインターに指示するまで、実際に何が含まれているかはわかりません。違いは、そこに格納されているバイトをint、doubleなどとして解釈するのではなく、メモリアドレスとして解釈し、メモリ内のその場所に書き込もうとすることです。

保存する必要がある値の数がわかっているので、静的配列を宣言するだけですdouble playerScore[SOME_SIZE]

于 2012-01-17T02:54:50.823 に答える