gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:08:44 26 4
gpt4 key购买 nike

这是从一门 C++ 类(class)开始的,不涉及成绩,因为我只是跟着学习,试图在多年后记住一些东西。该类已经到了我们使用指针和动态数组的地步。我正在尝试将数组(或指针)传递给与整数列表上的各种计算有关的不同函数。有些功能正在运行,有些则没有。但我以相同的方式传递它们,也以相同的方式调用它们。由于某些函数正在返回垃圾值,所以感觉我实际上并没有指出我认为我所在的位置,并且正在运行的函数只是偶然运行。

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

到目前为止,这是我的代码。返回垃圾的是 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;
}

最佳答案

int length = 0;
int *an_array;

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

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

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

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 绑定(bind)在一起,而不是使用两个独立的对象,您可以只使用一个 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.dataarr.size 分别代替。大功告成!

通过所有这些改进,您的 main() 将变成这样:

int main()
{
array arr = getarray();

printarray(arr);

cout << "Maximum value in list is: "<< findmax(arr) << "\n";
cout << "Minimum value in list is: "<< findmin(arr) << "\n";

printf("Average is: %10.5f\n", findavg(arr));
printf("Median is: %10.5f\n", findmedian(arr));

delete [] arr.data;
return 0;
}

这看起来更好。

关于C++ 指针动态数组和函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8322610/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com