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;
}
*/
4

4 に答える 4

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);

(これはすべてのエラー処理をスキップします。たとえば、numTest1より大きいことを確認する必要があります。)

于 2012-10-31T03:04:57.323 に答える
1

すべてのスコアを取得したら、それらを繰り返し処理して、最も低いスコアを見つけます。単純な反復で問題なく動作します。

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

lowest、最低のスコアを保持します。あなたはそれをあなたの合計から引いて割り算することができnumTest-1、あなたはすべて設定されているはずです。

于 2012-10-31T03:02:15.593 に答える
0

それを効率的に行うために(できるだけ多くの指示を回避するために)、値を合計すると同時に最低スコアを追跡できるため、スコアを1回ループするだけで済みます。

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);
于 2012-10-31T03:07:27.937 に答える
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;
于 2012-10-31T11:20:00.430 に答える