【问题标题】:Calculating two different averages in C++在 C++ 中计算两个不同的平均值
【发布时间】:2012-02-11 22:11:17
【问题描述】:

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

我修复了我的代码,并用下面的新代码替换了我的旧代码。在我在这里查看每个人的 cmets 等之前,我一直在玩它,到那时我已经解决了。

但是谢谢大家!

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

【问题讨论】:

  • 如果 cin 执行成功,它下面的行就会执行。我怀疑您看到了一些调试器工件,它看起来像是 cin 正在执行,而不是下面的行。
  • 谢谢大家!在我发布这个之后,我正在摆弄代码,我通过移动一些行以某种方式让它工作。我想这可能是侥幸。下次我去编写这样的代码时,我一定会搞砸的:P
  • 有时问题只是你忘记保存源文件,或者在你重建东西时它没有自动重新编译。这些事情可能非常令人沮丧。
  • 我肯定会说 Dev-C++ 内置的调试器很糟糕。我希望它可以像 Visual Studio 一样向我展示价值和东西。可能有,我没仔细看。是的,事情肯定会变得非常令人沮丧,但到目前为止,C++ 比上学期的 C# 容易得多。

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


【解决方案1】:

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

system("pause") 只是因为打开控制台不好吗?您可以通过使用std::cin.get()getchar() 之类的东西来避免使用system("pause")

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 你好像知道自己在做什么,不像我。有趣的是,一旦我改变了if statements 的顺序并将playerAverage += playerScore[currentGame]; 放在它们之间,并将teamAverage += playerAverage 放在if(currentGame == 2) 块中playerAverage = 0; 之前,它解决了我的问题,我跑了几个次,最后的数学是正确的。但是谢谢你,我真的很感谢你的帮助。
    • 在覆盖任意内存位置时,您通常会通过尝试覆盖某个受保护的位置来获得段错误。如果巧合的是,该位置没有受到保护,它实际上最终可以正常工作。问题是当实际应该使用该内存位置的代码执行并且数据被更改时。可能是它会覆盖并且没有伤害没有犯规。或者它可能取决于那里的价值并且发生了一些奇怪的事情。
    【解决方案3】:

    所以这里有几个问题:

    • 您永远不会为您的阵列分配任何空间。你的playerScore 需要一个new 在某个地方。
    • cin &gt;&gt; playerScore[currentGame] 只会写入数组索引 0、1 和 2。这个逻辑需要以某种方式结合 currentPlayer 和 currentGame。
    • playerAverage += playerScore[currentGame];相同
    • 在完成 playerScore 数组后,您需要使用 new 分配的空间 delete[]

    【讨论】:

    • 不,它不需要new。大小在编译时是固定的。
    • @R.MartinhoFernandes 是的,我很清楚你知道编译时的大小并且可以在堆栈上分配。然而,也许他被告知在这里使用动态分配。我决定做最少的改动。
    • 更改最少的解决方案是使用静态数组。
    • 指针通常不需要new,但他们确实需要一些他从未做过的东西。
    • 别在意这是吹毛求疵,还有其他人都懒得指出的实际逻辑错误。
    【解决方案4】:
    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 标志——您的编译器可能需要不同的东西)但它应该能够警告您这一点。虽然您不需要修复每个编译器警告,但不要只是忽略它们——现代编译器中提炼了数千年的编程经验。

    【讨论】:

    • +1 表示警告。每个老师都应该警告不要在在第一节课上打开警告。
    • @R.Martinho:虽然在你花了一个小时试图找出这样的错误之前,这可能是一个很难接受的建议。 :)
    • 如果我要分配号码,它更像是double playerScore[PLAYER_NUMBER*GAME_NUMBER];// or 15,感谢警告,我在 dev-c++ 中没有任何显示,所以我认为一切都很好
    【解决方案5】:

    您声明了double* playerScore,但我看不到您在哪里分配存储空间。也许您正在覆盖某些内容。

    【讨论】:

    • 我正要说同样的话。不要为以后的分配声明一个指针,除非分配特别需要它。你知道数组需要多少元素,就在栈上声明吧。
    • 我在那里声明了指针,因为有人告诉我应该在顶部声明稍后将使用的所有内容,以便在任何地方都可以访问它。最长的时间(实际上只有 5 天)我以为我又在使用数组了,但我现在不这么认为了?
    • 总之,指针是指向playerScore[currentGame]的值。我在那里用它来表示用户将玩家的分数放在游戏中的任何数字上。
    • 您可以使用指针通过new“创建”一个数组(或单个变量)。指针本身就是一个指针。
    • 我从课堂上挑选了未注释的样本和一些教科书材料,我以为我最初是在用* 制作一个数组。我已经使用 C++ 两周了。不幸的是,我也不擅长 C# 中的数组。我还是不明白。
    猜你喜欢
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多