Вычисление двух разных средних в C ++ - PullRequest
2 голосов
/ 17 января 2012

Мое задание - рассчитать средние значения для боулинга.У меня есть пять игроков и три игры для каждого игрока.В настоящее время у меня работает две петли, одна для игрока, а другая для номера игры.Мне нужно показать среднее число игроков в конце каждого из этих циклов, а среднее число команд в конце этого цикла.

Я исправил свой код и заменил старый код новым кодом, приведенным ниже.Я играл с ним до того, как проверил здесь, чтобы увидеть все комментарии и т. Д., И я решил это к тому времени.

Но спасибо всем!

#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 ]

6 голосов
/ 17 января 2012

Вы объявляете double* playerScore, но я не вижу, где вы распределяете хранилище.Возможно, вы что-то перезаписываете.

3 голосов
/ 17 января 2012

Ваша петля не проверит номер последней игры или номер игрока.

Разве system("pause") не плохо для удержания открытой консоли?Вы можете избежать использования system("pause"), используя что-то вроде std::cin.get() или getchar().

Вы также сделали playerScore указатель и используете его без * перед ним, так что вы действительно пытаетесь получитьадрес того, на что он указывает (в данном случае ничего - он даже не был выделен).

2 голосов
/ 17 января 2012

Вы храните ввод в неизвестном месте. Я удивлен, что вы еще не столкнулись с сегфоутом.

double* playerScore; не обязательно объявляет массив, это «указатель на двойное число». Вы можете использовать его для создания массива в куче (playerScore = new double[SOME_SIZE];).

Пока вы не укажете указателю, куда указать его, все равно, что использовать любую другую неинициализированную переменную, невозможно сказать, что именно она содержит. Разница заключается в том, что вместо того, чтобы интерпретировать байты, хранящиеся там, как int, double и т. Д., Он интерпретируется как адрес памяти, и вы пытаетесь записать в это место в памяти.

Поскольку вы знаете, сколько значений вам нужно сохранить, я бы просто объявил статический массив double playerScore[SOME_SIZE]

2 голосов
/ 17 января 2012

Итак, здесь есть несколько проблем:

  • Вы никогда не выделяете место для вашего массива.Вашему playerScore нужно где-то new.
  • cin >> playerScore[currentGame] будет только когда-либо записывать массивы со значениями 0, 1 и 2. Эта логика должна как-то комбинировать currentPlayer и currentGame.
  • То же самое сplayerAverage += playerScore[currentGame];
  • Вам понадобится delete[] место, которое вы выделите с помощью new после того, как вы закончите с массивом playerScore.
2 голосов
/ 17 января 2012
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 - вашему компилятору может потребоваться что-то другое), но он должен быть в состоянии предупредить вас об этом.Хотя вам не нужно исправлять каждое предупреждение компилятора, не просто игнорируйте их - в современных компиляторах накоплен тысячелетний опыт программирования.

...