Вы не учитываете символы новой строки.
Эта строка:
cin >> numTestScores;
Считывает число из ввода, но НЕ символ новой строки.Поэтому, если вы набрали 8 , вы читаете 8, но новая строка не читается с ввода.
Итак, когда вы в первый раз заходите в цикл и делаете это:
cin.getline(name,30);
Это читаетсимвол новой строки, который вы ввели после 8 (и ничего больше).
Пара других ошибок ...
1) Забыл прочитать и выбросить новую строку.
cin >> numTestScores;
Решения:
// 1: Read the line into a string then read the value from the string.
std::string testScoresString;
std::getline(std::cin, testScoresString);
std::stringstream testScoreStream(testScoreString);
testScoreStream >> numTestScores
// 2: Use boost::lexical cast on the string stream:
std::string testScoresString;
std::getline(std::cin, testScoresString);
testScoreStream = boost::lexical_cast<int>(testScoreString);
// 3: Read number then ignore input to the new line character
cin >> numTestScores;
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
2: Не используйте new / delete в коде C ++
Вы можете создавать новые динамические объекты, но забыть удалить их сложно.Вы должны использовать умные указатели или контейнеры для управления сроком службы динамических объектов.
studentNames = new string[numTestScores];
testScorePtr = new double[numTestScores];
В этой ситуации лучше использовать std :: vector.
std::vector<std::string> studentNames(numTestScores);
std::vector<double> testScorePtr(numTestScores);
3: Donне используйте массив фиксированного размера для ввода пользователем:
cin.getline(name,30);
Вы просто просите пользователя завершить работу вашей программы.Вводя действительно длинное имя.
Используйте версию, которая читает строку в std :: string.Строка будет расширяться по мере необходимости.
std::getline(std::cin, studentNames[i]);
4: вам здесь не нужен endl.Используйте endl, когда вы хотите, чтобы буфер очищался.Я использую это все время, так что на самом деле все в порядке.Просто хотел убедиться, что вы знали, что буфер очищен.
cout << studentNames[i] <<endl;
4: Не уверен, для чего это нужно.Чтение и отбрасывание первого символа следующей строки !!!!!!
cin.get();
5: Обратите внимание, это работает нормально.Поскольку оператор >> игнорирует символ новой строки при поиске следующей оценки.
//Get a test score.
//cout << "Enter test score "
//<< (i + 1) << ": ";
//cin >> testScorePtr[i];
6: Как я и предсказывал выше, вы забыли удалить один из массивов.Просто используйте вектор.В любом месте, где вы используете new / delete, вы пишете код, подобный написанному на C. Хороший код C ++ не должен иметь практически никаких удалений (если вы не пишете умный указатель / контейнер).Вы знаете, что есть std :: sort метод .
void sort(double* score, int size)
8: Вы можете приблизиться с помощью std :: аккумулировать
double average(double* score, int numScores)