从阵列中删除最低输入?

时间:2012-03-21 18:35:27

标签: c++

我必须找到给出的最低输入,然后平均总数减去最低分数。我的averageScore函数从阵列中找到最低分,我遇到了一些麻烦。我输出非常奇怪的数字。任何关于如何调整这一点的建议将不胜感激。提前谢谢。

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

//function prototypes
double* allocate(int&);
double averageScore(int&);

int main()
{   
    double* testArray;
        int numOfScores;
    double average;

    testArray = allocate(numOfScores);
    average = averageScore(numOfScores);

    //delete memory created
    delete[] testArray;

    return 0;
}

//function to collect user info, dynamically allocate
double* allocate(int &numOfScores)
{
    double* testArray;

    //prompt user for scores
    cout << "How many test scores would\n";
    cout << "you like to process: ";

    //user input validation 
    if(!(cin >> numOfScores))
    {
        cout << "Invalid input!\n";
        cout << "Program termination, please\n";
        cout << "restart the program." << endl;
        exit(0);
    }
    else if(numOfScores < 0)
    {
        cout << "Invalid input!\n";
        cout << "Program termination, please\n";
        cout << "restart the program." << endl;
        exit(0);
    }

    //dynammically allocate an arrray to hold the scores
    testArray = new double[numOfScores];

    //get the scores from user
    for (int count = 0; count < numOfScores; count++)   
    {
        cout << "Enter Score: ";

        //user input validation 
        if(!(cin >> testArray[count]))
        {
            cout << "Invalid input!\n";
            cout << "Program termination, please\n";
            cout << "restart the program." << endl;
            exit(0);
        }
        else if(testArray[count] < 0.0)
        {
            cout << "Invalid input!\n";
            cout << "Program termination, please\n";
            cout << "restart the program." << endl;
            exit(0);
        }


    }

    return testArray;
}

//function to calculate the average score
double averageScore(int &numOfScores)
{   
    double* testArray;

    double total,
           average,
           scores[0],
           lowest;

    lowest = scores[0];   

    //calculate total scores entered
    for(int count = 0; count < numOfScores; count++)
    {
        total += testArray[count];

        //find lowest score entered 
        for(int count = 1; count < numOfScores; count++)
        {
            if (testArray[numOfScores] < lowest)
                lowest = scores[numOfScores];
        }
    }

    //average the total amount of scores drop the lowest
    average = (total -  lowest) / numOfScores;

    cout << "The average test score is: " << average << endl;
    cout << "Lowest is: " << lowest << endl;

    return average;
}

4 个答案:

答案 0 :(得分:3)

std::vector<double> scores = {1.2,6.5,3.0,8.3,4.8,6,7.7};

// drop lowest score
scores.erase(min_element(begin(scores),end(scores)));

double average = accumulate(begin(scores),end(scores),0.0)/scores.size();

答案 1 :(得分:2)

我想你想改变这一行:

if(testArray[numOfScores] < lowest)

到此:

if(testArray[count] < lowest)

另外,正如@jzworkman指出的那样,平均值的分母应该是(numScores - 1),因为你从分子中消除了最低分。 (如果适用,您可能希望测试只有一个分数的边缘情况,一旦消除最低分数,就不会有任何平均值。)

答案 2 :(得分:2)

夫妻问题。你不应该嵌套这两个for循环(而只是使用if语句检查值是否低于最低值)。

由于这是作业,我会给你步骤,然后你可以修复你的代码

  1. 循环并计算总数,同时找到最低分
  2. 计算平均值为(总 - 最低)/(numScores -1)
  3. 返回平均值

答案 3 :(得分:1)

您的averageScore功能存在很多问题,但我现在将介绍最基本的功能。

首先,你应该传递一些数据。现在你正在使用testArray我甚至看不到它的分配位置。当你运行它时,我很惊讶你没有得到分段错误。

但它也没有初始化。在c ++中,当您声明指针时,它指向的变量具有值。它有一个垃圾值,如果你用该垃圾值执行算术运算,那么你的输出也是垃圾。

您必须为您的averageScore功能提供分数列表,最好将其作为参数传递。

平均功能的开头如下所示:

double averageScore(int &numOfScores)
{   
    double* testArray;
    ...

相反它应该看起来像这样

double averageScore(double*testArray, int numOfScores)
{   
    ...

当您使用&numOfScores代替numOfScores时,这意味着如果您更改了numOfScores功能中的averageScore,则会更改main中的double* testArray;功能也是如此,你不应该这样做。

现在,在averageScore行上,你正在声明一个名为“testArray”的全新指针,并且其中没有有意义的数据,尽管它可能充满垃圾。可能还有其他双指针变量,在代码中名为“testArray”,但它们都不属于testArray函数的范围。如果您在方法调用中传递double someNumber = testArray[i],则可以使用它。例如:`double averageScore(double testArray[], int numOfScores)`

请记住,您的数组也是通过引用传递的。如果您希望按值传递它,可以尝试

{{1}}

但不要引用我那个

一旦你完成了,你的代码仍然会有一些问题,但输出应该足够有意义,你希望能够自己解决这些问题。