用C ++计算两个不同的平均值

时间:2012-01-17 02:33:09

标签: c++ average dev-c++

我的任务是计算保龄球平均值。我有五名球员,每位球员有三场比赛。我目前有两个循环运行,一个用于播放器,另一个用于游戏号码。我需要在每个循环结束时显示玩家平均值,并且团队在该循环结束时平均。

我修复了我的代码,并用下面的新代码替换了我的旧代码。在我查看每个人的评论之前,我正在玩它,然后我就解决了它。

但是谢谢大家!

#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“);”?我真的很讨厌使用它。

5 个答案:

答案 0 :(得分:6)

您宣布double* playerScore,但我看不到您在哪里分配存储空间。也许你正在覆盖一些东西。

答案 1 :(得分:3)

你的循环不会检查最后一个游戏号码或玩家号码。

仅仅因为持有打开控制台而导致system("pause")不好吗?您可以通过使用system("pause")std::cin.get()等内容来避免使用getchar()

你还使playerScore指针并在它之前没有*的情况下使用它,所以你实际上试图得到它指向的任何地址(在这种情况下没有 - 它没有'甚至得到分配)。

答案 2 :(得分: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标志 - 您的编译器可能需要不同的东西)但它应该能够警告您这一点。虽然您不需要修复每个编译器警告,但不要忽略它们 - 在现代编译器中有数千年的编程经验。

答案 3 :(得分:2)

所以这里有一些问题:

  • 您永远不会为您的阵列分配任何空间。您的playerScore需要new某处。
  • cin >> playerScore[currentGame]只会编写数组指示0,1和2.这个逻辑需要以某种方式组合currentPlayer和currentGame。
  • playerAverage += playerScore[currentGame];
  • 相同
  • 完成delete[]数组后,您需要new playerScore分配的空间。

答案 4 :(得分:2)

您将输入存储在未知位置。我很惊讶你还没有遇到过段错误。

double* playerScore;不一定声明一个数组,它是一个“指向双精度的指针”。您可以使用它在堆上创建一个数组(playerScore = new double[SOME_SIZE];)。

直到你实际告诉指针指向何处使用它就像使用任何其他未初始化的变量一样,没有告诉它实际包含的内容。区别在于不是将存储在那里的字节解释为int,double等,而是将其解释为内存地址,并尝试写入内存中的该位置。

既然您知道需要存储多少个值,我只需要声明一个静态数组double playerScore[SOME_SIZE]