【发布时间】:2017-08-12 13:22:02
【问题描述】:
我为一个班级编写了一个程序,但遇到了问题。该程序的目的是将一组值读入一个数组,计算平均值,然后找出该数组中有多少元素大于该平均值。提供了函数原型,因此无法更改。此外,我们被指示将数组的大小初始化为 10,并在读取元素的数量超过当前大小时将大小加倍,因此无法更改。
我遇到的问题是从上述平均函数返回一个值。它本身可以正常工作(我可以在返回之前放置一个 printf 来显示计数,但是在主函数中,返回的值是 0。有没有人可以帮助解决这个问题?这越来越令人沮丧。
此外,注释的 printf 行用于检查函数返回的值。我将其注释掉而不是删除它,这样我就不必每次都重新输入。
#include <stdio.h>
#include <stdlib.h>
double average(double *ptr, int size);
int aboveaverage(double *ptr, int size, double average);
int main(int argc, char* argv[])
{
double *ptr, avg, above, temp;
int size = 10, i, j;
void *tmp;
FILE *fp;
avg = above = 0;
if (argc != 2)
{
printf("Invalid number of arguments, 2 required\n");
return 1;
}
fp = fopen(argv[1], "r");
ptr = (double *)calloc(10, sizeof(double));
printf("Allocated 10 doubles\n");
for (i = 0;fscanf(fp, "%lf", &temp) != EOF; i++)
{
if (i >= size - 1)
{
size*=2;
tmp = realloc(ptr, size);
if (tmp == NULL)
{
printf("Error with realloc, exiting\n");
return 1;
}
printf("Reallocated to %d doubles\n", size);
}
ptr[i] = temp;
j = i;
}
size = j + 1;
avg = average(ptr, size);
above = aboveaverage(ptr, size, avg);
//printf("%d\n", above);
printf("%d elements are above average of %lf\n", above, avg);
free(ptr);
return 0;
}
double average(double *ptr, int size)
{
double sum;
int i;
while (i < size)
{
sum+=ptr[i];
i++;
}
return (sum / size);
}
int aboveaverage(double *ptr, int size, double avg)
{
int count=0, temp;
for (int i = 0; i < size; i++)
{
temp = (int)ptr[i];
if (temp > avg)
count++;
}
return count;
}
【问题讨论】:
-
这对您的问题没有帮助,但您的代码很好,如果您阅读
realloc()的文档,您可以稍微简化此代码。此外,您不需要强制转换malloc()或realloc()的返回值。 -
above应该是int。或者只是将%d elements更改为%f elements,但我推荐前者,因为当您的函数返回int时,为什么above是double是没有意义的。 -
在函数
average中,i未初始化。上帝只知道你在访问什么。