2012-01-17 7 views
2

私の割り当てはボウリング平均を計算することです。私は5人の選手と各選手に3人の選手がいます。私は現在、2つのループを実行しています.1つはプレイヤー用、もう1つはゲーム番号用です。私は、各ループの終わりにプレーヤーの平均を表示する必要があり、チームはそのループの最後に平均します。C++で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「)を使用する必要がない持っている方法はあり;」?私はそれを使用して本当に嫌いです。

+0

を宣言し格納する必要がありますどのように多くの価値を知っているので、その下の行が実行されます。私はあなたがcinが実行しているように見えるようにするいくつかのデバッガアーチファクトを見ていると思うし、以下の行ではない。 –

+0

みなさんありがとう!私はこれを投稿した直後にコードを操作していましたが、どういうわけか、いくつかの行を動かすことで動かすことができました。私はそれが偶然かもしれないと思う。次回、このようなコードを書くときには、私は間違いなくそれを取り締まるでしょう:P –

+0

問題は単純にソースファイルを保存するのを忘れていた、または再構築時に自動的に再コンパイルされなかったことがあります。これらのことは非常にイライラする可能性があります。 –

答えて

6

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

+0

私も同じことを言っていました。割り当てが明示的に呼び出さない限り、後で割り当てるためのポインタを宣言しないでください。配列に必要な要素数を知っていて、それをスタックに宣言します。 – Matt

+0

後で使用されるすべてのものを宣言する必要があると言われたので、そこにポインタを宣言しました。そして、最も長い時間(実際には5日間しかなかった)、私は再びアレイで作業していると思ったが、今はそうは思わない? –

+0

とにかく、ポインターは、playerScore [currentGame]に置かれている値を指しています。私はそこにそれを使用して、ユーザーがゲームの何番の数字でプレーヤーのスコアを入力していると言います。 –

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 -Wextragccへの私のお気に入りのフラグです - あなたのコンパイラは別のものが必要かもしれませんが)これについて警告することができます。 コンパイラの警告ごとに修正する必要はありませんが、無視するだけではありません。何千年ものプログラミング経験が現代のコンパイラで掘り下げられています。

+1

+1。すべての教師は、ファーストクラス*の警告を*オンにすることについて警告する必要があります。 –

+0

@ R.Martinho:このような間違いを見つけようとするまでに1時間を費やすまでは、取るのが難しいかもしれません。 :) – sarnold

+0

もし私がその番号を割り当てようとするなら、それは のようになります 'double playerScore [PLAYER_NUMBER * GAME_NUMBER]; //または15' そして警告については、私はdev- C++だから私はすべてが良かったと思った。 –

3

あなたのループは、最後のゲーム番号またはプレーヤー番号を確認しません。

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

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

2

だからここにいくつかの問題があります。

  • あなたはアレイの任意の領域を割り当てることはありませんが。 playerScoreにはnewが必要です。
  • cin >> playerScore[currentGame]は、配列の添え字0,1,2を書き込みます。このロジックは、currentPlayerとcurrentGameを何とか組み合わせる必要があります。あなたがdelete[]に、あなたのplayerScoreアレイに終わった後、あなたはnewに割り当てるスペースが必要になりますplayerAverage += playerScore[currentGame];
  • と同じ
+0

いいえ、 'new'は必要ありません。サイズはコンパイル時に固定です。 –

+0

@ R.MartinhoFernandesはい、コンパイル時にサイズを知っていて、スタックに割り当てることができます。しかし、おそらく彼はここで動的割り当てを使用するように指示されています。私は必要な変更を最小限に抑えることに決めました。 – Yuushi

+0

最小限の変更を加えたソリューションには、静的配列を使用することが含まれます。 –

2

入力を不明な場所に保存しています。私はあなたがまだセグメンテーションに遭遇していないのに驚いています。

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

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

あなたはCINが正常に実行された場合、私はちょうど静的配列double playerScore[SOME_SIZE]

+0

あなたは私とは違って、あなたがしていることを知っているようです。面白いのは、 'if文'の順序を変更して 'playerAverage + = playerScore [currentGame];'を入れ、 '(currentGame == 2)'ブロックに 'teamAverage + = playerAverage'を入れると、 'playerAverage = 0;'の前に、私の問題は解決されました。私は数回それを実行しました。 ありがとう、本当にありがとうございます。 –

+0

任意のメモリ位置を上書きするときは、保護されている場所を上書きしようとすることによって、segfaultを取得することがよくあります。偶然にその場所が保護されていない場合、実際にはその場所が動作する可能性があります。問題は、実際にそのメモリ位置を使用するはずのコードが実行され、データが変更されたときです。それが上書きされ、無害でないことがあります。または、そこにある値に依存する可能性があり、何か奇妙なことが起こります。 – Matt

関連する問題