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()or getchar()

您还创建了playerScore一个指针并在没有它*之前使用它,因此您实际上是在尝试获取它指向的任何地址(在这种情况下什么都没有——它甚至没有被分配)。

于 2012-01-17T02:43:28.433 回答
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;不一定要声明一个数组,它是一个“指向双精度数的指针”。playerScore = new double[SOME_SIZE];您可以使用它在堆 ( )上创建一个数组。

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

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

于 2012-01-17T02:54:50.823 回答
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 回答