2012-10-31 1 views
0

Ниже мой код: он работает хорошо, но как сделать его средним все баллы, введенные пользователем, но сбросить самый низкий счет до вычисления? Я вставил какой-то код, но я считаю его неправильным, потому что я не могу заставить его работать правильно. Есть ли более короткий, самый простой способ написать этот код? Или лучший способ написать его? Спасибо.Как мне получить мою программу для вычисления среднего падения самого низкого балла?

#include <iostream> 
#include <iomanip> 
using namespace std; 

//void sortArray(double arr[], int numTest, int scoreNum); 
//void displayArray(double arr[], int numTest, int scoreNum); 

int main() 
{ 
    //To dynamically allocate an array, Accumulator, to hold the average scores. 
    double *score;  
    double total = 0; 
    double average; 


    //int for counter, to hold the number of test scores. 
    int count; 
    int numTest; 


    // To obtain the number of test scores the user would like to enter. 
    cout << "How many test scores would you like to enter? " << endl; 
    cin >> numTest; 


    //Dynamically allocates an array large enough to hold the amount of test scores to enter. 
    score = new double[numTest]; 


    //Get the test scores. 
    cout << "Enter the test score desired. " << endl; 
    for (count = 0; count < numTest; count++) 
    { 
     cout << "Score " << (count + 1) << ": "; 
     cin >> score[count]; 
    } 

    //sortArray(score, numTest, scoreNum); (Need to get this part to work) 
    //displayArray(score, numTest, scoreNum); (Need to get this part to work) 

    //Calculate the total test scores. 
    for (count = 0; count < numTest; count++) 
    { 
     total += score[count]; 
    } 

    //Calculate the test scores average minus the lowest score. (I need help here - is this how I drop the lowest score?) 
    average = total/numTest; 

    //Display the results 
    cout << fixed << showpoint << setprecision(2); 
    cout << "Test Scores Average with the lowest dropped is: " << average << endl; 

    //Free dynamically allocated memory 
    delete [] score; 
    score = 0; // Makes score point to null. 

    system("pause"); 
    return 0; 
} 

/* void sortArray(double arr[], int numTest, int scoreNum) 
{ 
    double num = 0; 
    int posNum = 0; 
    for (int i = 0; i < numTest; i++) 
    { 
     for (int x = (i + 1); x < numTest; x++) 
     { 
      if (arr[i] > arr[x]) 
      { 
       num = score[i]; 
       posNum = scoreNum[i]; 
       arr[i] = arr[x]; 
       scoreNum[i] = scoreNum[x]; 
       arr[x] = num; 
       scoreNum[x] = posNum; 
      } 
     } 
    } 
} 

void displayArray(double arr[], int numTest, int scoreNum) 
{ 
    double average = 0.0; 
    double sum = 0.0; 
    int x; 
    for (int i = 0; i < numTest; i++) 
    { 
     for (x = 1; x < numTest; x++) 
     { 
      sum += arr[x]; 
     } 
    } 

    average = sum(numTest - 1); 

    cout << fixed << showpoint << setprecision(2) << endl; 
    cout << "The average of all test scores dropping the lowest is: " << average << endl; 
} 
*/ 
+0

Какие проблемы вы с с кодом? – Xymostech

+0

Сортировка кажется излишним для поиска наименьшего значения. Измените оценку как вектор , затем сделайте следующее: double minScore = 1e6; int minScoreIndex; for (count = 0; count score [count]) {minScore = score [count]; minScoreIndex = кол; }} оценка.erase (оценка.begin() + minScoreIndex); – DigitalGhost

+0

Мне нужно, чтобы он сбросил самый низкий балл, а затем вычислил его. Прямо сейчас я могу получить его, чтобы рассчитать общие баллы, не снижая самый низкий балл. Я немного неясен относительно того, как правильно записать функцию, чтобы сбросить самый низкий балл. Я написал что-то вниз (что я прокомментировал внизу), но я не получаю этого, чтобы работать вообще. Могу ли я использовать что-то вроде: voidFindLowest ..., а затем average = total/(numTest - lower)? Или у меня должен быть массив сортировки, а затем найти самый низкий, а затем удалить его и отобразить? – user1787078

ответ

1

Как только у вас есть все оценки, проведите через них, чтобы найти самый низкий. Простая итерация будет работать нормально:

int lowest = score[0]; 
for(count = 1; count < numTest; count++) 
{ 
    if(score[count] < lowest) lowest = score[count]; 
} 

lowest Теперь будет держать низкий балл. Вы можете вычесть его из общей суммы и делить на numTest-1, и вы должны быть установлены.

+0

Это вырожденный случай. Я предполагаю, что на данный момент это не просто пузырь, а затем ... – GraphicsMuncher

+0

Мне по-прежнему сложно использовать этот код. позвольте мне посмотреть, не разрешит ли я представить некоторые из них. – user1787078

+0

// Найти самый низкий результат. \t int lower = score [count]; \t для (кол = 1; кол user1787078

3

Прежде чем мы начнем, вы должны использовать std::vector вместо необработанного указателя для вашего массива.

// instead of: 
double *score = new double[numTest]; 

// use: 
std::vector<double> scores; 
scores.resize(numTest); 

на ваш вопрос:

Во-первых, вам нужно отсортировать результаты, чтобы найти самые низкие:

// partial_sort will find the first n (here, 1) items, and leave the remainder 
std::partial_sort(&score[0], &score[1], &score[numTest]); 

Далее, получить среднее всех, кроме самых низких:

auto avg = std::accumulate(&score[1], &score[numTest], 0.0)/(numTest - 1); 

(Это пропускает все ошибки обработки, например, вы должны проверить, что numTest больше, чем 1.)

+0

Сортировка баллов - это избыток для исключения наименьшего балла из в среднем. – kevintodisco

+0

@ktodisco: вы правы. Я сейчас редактирую его. – moswald

+1

@moswald: Могу ли я также предложить 'scores.begin() + 1' вместо' & score [1] '. более приятным и чувствует себя более тихим. –

0

Чтобы сделать это эффективно (избегая как можно большего количества инструкций), вы можете отслеживать самый низкий балл одновременно с суммированием своих значений, поэтому вам нужно только один раз перебирать свои баллы.

double lowest = MAX_SCORE; 
//Calculate the total test scores. 
for (count = 0; count < numTest; count++) 
{ 
    if (score[count] < lowest) 
     lowest = score[count]; 
    total += score[count]; 
} 
total -= lowest; 
average = total/(numTest - 1); 
+0

Awesome. Это то, что я имел в виду, но не мог собрать его вместе. Огромное спасибо. – user1787078

+0

Проблема с этим подходом заключается в том, что он может ввести гораздо больше ошибок округления, чем суммирование отсортированного массива. – Mankarse

+0

@Mankarse Пожалуйста, уточните? – kevintodisco

0
std::vector<double> scores; 
// populate scores here 
double lowest = scores[0]; 
double sum = scores[0]; 
for (int i = 1; i < scores.size(); ++i) { 
    lowest = std::min(lowest, scores[i]); 
    sum += scores[i]; 
} 
sum -= lowest; 
sum /= scores.size() - 1; 

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

  • Нет связанных вопросов^_^