假设我有一个动态分配的数组,容量为50。
int *myArray = new int[50];
我需要编写一个calAverage函数来计算该数组内部元素的平均值。
并非所有索引都分配了一个值。 myArray可能分配了0、10或50个值。我不知道分配了多少个值或在何处分配了该值。
这是我的calAverage函数:
int calAverage()
{int sum = 0;
int avg = 0;
for (int i=0;i<50;i++)
{
if (element i is present) {sum+=myArray[i];i++}
}
我走对了吗?请帮助我完成calAverage功能。
我不能使用矢量或地图,因为这是一项任务,因此是不允许的。 我收到的提示是创建一个并行数组,并比较两者以检查是否已分配元素。 IDK的逻辑将如何提供帮助。
答案 0 :(得分:0)
并非所有索引都分配了一个值
实际上,在某些情况下,如果其中某些变量没有初始化或分配,则可能具有“未指定的值”(并且读取该值的程序将具有未定义的行为)。
因此,我们可以说这些元素“尚未分配值”。但是我不会这样做,原因有两个:
您要考虑的不是“没有被赋值”。因此,我建议您这样考虑:所有数组元素始终存在。您可以使用其他容器来按需添加元素,也可以选择自己的方式来指定值当前对算法是否“有效”。
如果您想要一个 x→y 映射的列表,其中 x 不连续,那么也许您应该考虑使用std::map
(尽管这样做确实带来了它有它自己的问题,即它可能会变慢)。或者,如果永不将其视为“真实”值,则可以使用诸如-1
之类的前哨值。
答案 1 :(得分:0)
正如Lightness的评论和回答所写,您不能真正检查元素是否已分配值。但是,您确实说过可以使用并行数组来帮助您。如果您改用int怎么办?将值添加到数组时,增加与数组一起传递的计数器。然后,该计数器将保留阵列已用部分的“长度”。可能不是理想的,但是会起作用。像这样:
#include <iostream>
double calAverage(int*, int);
int main()
{
int *myArray = new int[50];
int myArrLength = 0;
double avg;
// add values to array
for (int i = 0, add = 5; add > i; i++)
{
myArray[i] = i;
myArrLength++;
}
avg = calAverage(myArray, myArrLength);
return 0;
}
double calAverage(int *arr, int len)
{
int sum = 0;
for (int i = 0; i < len; i++)
{
sum += arr[i];
}
return sum / static_cast<double>(len);
}