C ++指针动态数组和函数

时间:2011-11-30 07:43:59

标签: c++ arrays function pointers

这是一个C ++课程的开始,没有涉及成绩,因为我只是跟着试图记住太多年后的东西。该类已达到我们使用指针和动态数组的程度。我试图将数组(或指针)传递给不同的函数,这些函数与整数列表上的各种计算有关。有些功能正在发挥作用,而其他功能则没有。但是我以同样的方式传递它们,我也以同样的方式调用它们。由于某些函数正在返回垃圾值,感觉我实际上并没有指向我认为我在哪里而且正在运行的函数只是偶然起作用。

在有人建议我应该使用向量而不是数组之前,练习的重点是使用动态分配的数组。

到目前为止,这是我的代码。这是findavg()findmedian()返回垃圾。

#include <iostream>
#include <iomanip>

using namespace std;

void getarray(int *a, int &l)
{
    int input = 0;

    //-1 is not important here, just to make the while loop run
    while(input != '-1') 
    {
        cout << "Enter length of the list of numbers: ";

        if(!(cin >> input))
        {
            cout << "Please enter numeric characters only." << "\n";    
            //show error if they don't enter a number
            cin.clear();                                                
            //get rid of invalid characters
            cin.ignore(10000,'\n');
        }

        else if(input <= 0)
        {
            cout << "Please enter a number greater than 0." << "\n";    
            //show error if they enter a non-positive number
            cin.clear();                                                
            //get rid of invalid characters
            cin.ignore(10000,'\n');
        }
        else
        {
            l = input;  //input is a positive number
            break; //got good input, break out of while loop
        }

    }


    int i;
    int x; 

    cout << "Enter " << l << " integers on one line seperated by spaces.\n";


    for( i = 0; i < l  &&  cin >> x; ++i)
    {
        a[i] = x;
    }

}

void printarray(int *a, int &l)
{
    int i;

    cout << "The array of integers is:\n";
    for( i = 0; i < l; ++i)
        cout << setw(4) << a[i];
    cout << "\n";

}

int findmin(int *a, int &l)
{
    int min = 0;
    min = a[0]; 

    for(int i = 1; i<l; i++)
    {
        if(a[i] < min)
            min = a[i];
    }
    return min; 
}

int findmax(int *a, int &l)
{
    int max = 0;
    max = a[0];

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

float findavg(int *a, int &l)
{
    int total = 0;
    total = a[0];

    for(int i = 1; i<l; i++)
    {
        total = total + a[i];
    }

    return static_cast<float>(total/static_cast<float>(l));

}

float findmedian(int *a, int &l)
{
    int max = 0;
    int min = 0;

    max = findmax(a, l);
    min = findmin(a, l);

    return static_cast<float>((max + min)/2.0);

}


int main()
{

    int length = 0;
    int *an_array;

    an_array = new int[length];

    getarray(an_array, length);

    printarray(an_array, length);

    cout << "Maximum value in list is: "<< findmax(an_array, length) << "\n";
    cout << "Minimum value in list is: "<< findmin(an_array, length) << "\n";
    printf("Average is: %10.5f", findavg(an_array, length));
    cout << "\n";
    printf("Median is: %10.5f", findmedian(an_array, length));
    cout << "\n";

    delete [] an_array;

    return 0;
}

2 个答案:

答案 0 :(得分:1)

int length = 0;
int *an_array;

an_array = new int[length]; //What is this ?

您为an_array分配零字节,因为length0。这是我能看到的一个问题。

在读取数组长度后,您应该在an_array函数中为getarray分配内存:

void getarray(int * &a, int &l) //see the change here!
{
    //code which reads length is omitted for brevity

    a = new int[l]; //alllocate memory after reading length

    //now read array elements here
}

或者,您可以将结构编写为:

struct array
{
      int *data;
      size_t size;
};

然后到处使用它。最好是因为您将sizedata绑在一起,而不是使用两个独立的对象,您只能使用一个array类型的对象,如下所述。

array getarray() 
{
    array arr;

    //read length into arr.size

    arr.data= new int[arr.size]; //alllocate memory after reading length

    //now read array elements into arr.data

    return arr; //returning arr means you're returning both: data and size!
}

然后将其称为:

 array arr = getarray(); //no need to pass any argument!

此外,如果您要使用此功能,则其他功能签名将变为:

void printarray(array arr);
int findmax(array arr);
float findavg(array arr);
float findmedian(array arr);

现在您还需要修改这些功能,但幸运的是,不会有重大变化:无论您使用al,请使用arr.data和{{1分别代替。你已经完成了!

通过所有这些改进,您的arr.size将成为:

main()

这看起来更好。

答案 1 :(得分:0)

您没有为阵列分配任何内存。随之而来的是未定义的行为。

更改你的getarray函数来进行分配并返回新创建和填充的数组:

int* getarray(int &length)

甚至

void AllocateAndPopulateArray(int* &array, int &length)

用于更对称的界面。

如果你想要一个非终止循环使用

while(true)

无需在while循环中输入输入。

由于您没有修改它,因此在任何其他例程中通过引用传递长度是没有意义的。事实上,您要求通过引用传递麻烦,因为编码错误可能会无意中更改该值。你应该用const声明它,以使编译器捕获你可能犯的任何愚蠢的错误。

我最衷心地同意纳瓦兹关于将指针和长度变量联系在一起的建议。

在你的平均计算中,我个人会宣布总数为浮动,从而避免看起来很笨拙的演员。

你的中位数实现是完全错误的,但这似乎是一个侧面问题。