函数和数组

时间:2016-03-19 21:15:20

标签: c++ arrays function

问题是

设计等级处理程序以使用函数和数组。让用户输入成绩数(将最大值设置为50)。将等级存储在数组中。为每个计算创建一个单独的函数(共3个函数):1)平均等级,2)最高等级,3)高于平均值的等级数。显示所有结果。

我认为我得到了主要部分,但是我在如何编写函数方面遇到了麻烦,函数由于某种原因输出了一个,而且我在编写max函数时遇到了麻烦或者如何开始吧。

#include <iostream>
using namespace std;

double average(double x[], int n);
double maximum(double x[], int n);
int nAboveAvg(double x[], int n);

int main()
{
    double grades[50];
    int ngrades;

    cout<<"How many grades? (max = 50)";
    cin>>ngrades;

//create for loop to get grades from user
    for(int i = 0; i<ngrades; i++)
    {
         cout<<"Enter grade ";
         cin>> grades[i];
    }

      //call the functions
   double avg = average(grades, ngrades);
   double max = maximum(grades, ngrades);
   int nAbove = nAboveAvg(grades, ngrades);
   //display results

   cout<<"Average = "<<avg<<endl;
   cout<<"# above average = "<<nAbove<<endl;


}

double average(double x[], int npts) //define the functon to recieve the array
{
    double sum = 0;
    for(int k = 0; k<npts; k++)
    {
       sum = sum +x[k];
    }
    return sum / npts;
}
double maximum(double x[], int npts)
{
   double max = 0;
   for(int i = 0; i<npts; i++)
   {
      if(max == npts)
      {
          return max;
      }
      if(max < npts)
      {
          return npts;
      }
   }
}
int nAboveAvg(double x[], int npts)
{
    int nAboveAvg = 0;
    for(int i = 0; i<npts;i++)
    {
        if(x[i] > npts)
        {
            nAboveAvg++;
        }
    }
    return nAboveAvg;
}

2 个答案:

答案 0 :(得分:2)

打印不正确

//call the functions
double avg = average(grades, ngrades);
double max = maximum(grades, ngrades);
int nAbove = nAboveAvg(grades, ngrades);

请注意,您定义了名为avgnAbove的变量。

//display results
cout<<"Average = "<<average<<endl;
cout<<"# above average = "<<nAboveAvg<<endl;

但是当您尝试打印结果时,您会使用averagenAboveAvg(函数)。

这里的正确版本是:

cout << "Average = " << avg << endl;
cout << "# above average = " << nAbove << endl;

编译器警告

当我尝试compile this时,编译器会发出许多警告。 e.g。

main.cpp: In function 'int main()':
main.cpp:29:24: warning: the address of 'double average(double*, int)' will always evaluate as 'true' [-Waddress]

    cout<<"Average = "<<average<<endl;

main.cpp:24:11: warning: unused variable 'avg' [-Wunused-variable]

    double avg = average(grades, ngrades);

不要忽视这些警告是个好主意。

高于平均值

        if(x[i] > npts)
        {
            nAboveAvg++;
        }

您将位置 i 值与输入值数进行比较。 但是,您应该将位置 i 值与所有值的平均值进行比较。因此

int nAboveAvg(double x[], int npts)
{
    int count = 0;
    double avg = average(x, npts);

    for (int i(0); i < npts; ++i) {
        if (x[i] > avg) {
            ++count;
        }
    }
    return count;
}

重构

您现在可能会注意到,在我们的程序中,我们最终计算两次平均值。我们可以通过使我们的函数更通用来解决这个问题 - 而不是计算高于平均值的值的数量,让我们计算作为参数传递的任意目标之上的值的数量。

int count_above(double x[], int npts, double target)
{
    int count = 0;
    for (int i(0); i < npts; ++i) {
        if (x[i] > target) {
            ++count;
        }
    }
    return count;
}

现在我们可以写

//call the functions
double avg = average(grades, ngrades);
double max = maximum(grades, ngrades);
int nAbove = count_above(grades, ngrades, avg);

最大值

让我们考虑算法,从最简单的情况开始 - 只有一个数组值。在这种情况下,第一个值也是最大值。

double max = x[0];

知道了,当输入数组中有2个值时,让我们考虑如何找到最大值。我们已经知道第二个值之前的所有值的最大值。因此

if (x[1] > max) {
    max = x[1];
}

下一步,输入3个值的数组。同样,我们已经知道第三个值之前的所有值的最大值。因此

if (x[2] > max) {
    max = x[2];
}

我们可以在这里看到一个重复的模式,我们可以在循环中进行包装。

double maximum(double x[], int npts)
{
    if (npts <= 0) {
        exit(-1); // Error...
    }

    double max = x[0];

    for (int i(1); i < npts; ++i) {
        if (x[i] > max) {
            max = x[i];
        }
    }
    return max;
}

验证输入

您没有对传递给您的函数的输入进行任何验证,但有一些明显的情况需要考虑。

  • 在您的所有功能中,当npts为否定时会发生什么?
  • 0元素的平均值是什么?
  • 0元素的最大值是什么?

处理这些情况的一种非常简单的方法是返回一些特殊值。然后,每次调用该函数时都必须检查该值的结果。在许多情况下,可能很难为此选择合适的值。

在初学者级别接受的另一种可能性是简单地向控制台打印一些错误消息,并退出程序。例如

if (npts <= 0) {
    cerr << "Too few values in input array." << endl;
    exit(-1); // Error...
}

正确的C ++方法是抛出异常,例如std::invalid_argument。例如

#include <stdexcept>

// ....

if (npts <= 0) {
    throw std::invalid_argument("Too few values in input array.);
}

答案 1 :(得分:0)

“平均”功能看起来不错。在main的最后两行中,我认为你想输出avg而不是average(因为average是函数的名称,而不是保存计算值的变量的名称)。同样,输出nAbove而不是nAboveAvg。

最大函数看起来像一个空实现。我不认为会编译,因为它需要(至少)返回一个double值。

在nAboveAvg函数中,“x [i]&gt; npts”似乎是错误的测试。我想你想比较x [i]和avg(你会希望将avg作为参数传递给这个函数。