2012-01-17 6 views
2

Мое задание - рассчитать средние боулинг. У меня пять игроков и три игры для каждого игрока. В настоящее время у меня две петли, одна для игрока, а другая для номера игры. Мне нужно показать средние игроки в конце каждого из этих циклов, а команды - в конце этого цикла.Расчет двух разных средних значений в 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 «);»? Я действительно ненавижу использовать его.

+0

Если CIN выполняется успешно, строки ниже ее выполнения. Я подозреваю, что вы видите артефакт отладчика, который заставляет его казаться, что 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 -Wextra - мои любимые флаги gcc - вашему компилятору может понадобиться что-то другое), но он должен быть в состоянии предупредить вас об этом. Хотя вам не нужно исправлять каждый предупреждающий сигнал компилятора, не просто игнорировать их - тысячи современных программных продуктов перегоняются в современных компиляторах.

+1

+1 для * предупреждения *. Каждый учитель должен предупредить о включении предупреждений * в первом классе *. –

+0

@ R.Martinho: хотя до тех пор, пока вы не потратили час, пытаясь найти такую ​​ошибку, это может быть трудный совет. :) – sarnold

+0

Если бы я собирался выделить номер, это было бы больше похоже на 'double playerScore [PLAYER_NUMBER * GAME_NUMBER]; // или 15' и спасибо за предупреждения, у меня ничего не появилось в dev- C++, поэтому я думал, что все было хорошо –

3

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

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

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

2

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

  • Вы никогда не распределяющие любое пространство для вашего массива. Ваш playerScore нуждается в new.
  • cin >> playerScore[currentGame] будет записывать только массивные цифры 0, 1 и 2. Эта логика должна как-то совместить currentPlayer и currentGame.
  • То же самое с playerAverage += playerScore[currentGame];
  • Вам нужно delete[] пространство вы выделить с new после того как вы сделали с вашей playerScore массива.
+0

Нет, ему не нужно 'new'. Размер фиксируется во время компиляции. –

+0

@ R.MartinhoFernandes Да, я хорошо знаю, что вы знаете размер во время компиляции и можете выделить в стеке. Однако, возможно, ему сказали использовать динамическое распределение здесь. Я решил пойти с минимальными изменениями. – Yuushi

+0

Решение с наименьшими изменениями включает использование статического массива. –

2

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

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

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

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

+0

Кажется, вы знаете, что вы делаете, в отличие от меня.Смешно, когда я изменил порядок 'if statements' и поместил' playerAverage + = playerScore [currentGame]; 'между ними и поместил' teamAverage + = playerAverage' в блок 'if (currentGame == 2)' до 'playerAverage = 0;', он исправил мою проблему, и я пробежал через нее пару раз, и математика была права в конце. Но спасибо, я очень ценю вашу помощь. –

+0

При перезаписи произвольных мест памяти вы часто получаете segfault, пытаясь записать через какое-то место, которое защищено. Если совпадение местоположения не защищено, он может фактически работать. Проблема заключается в том, что выполняется код, который должен был использовать эту ячейку памяти, и данные изменяются. Может быть, он собирается перезаписать и не навредить - не-фол. Или это может быть в зависимости от ценности там, и что-то странное происходит. – Matt

Смежные вопросы