【发布时间】:2020-11-23 05:21:32
【问题描述】:
函数arrayAvgMinMax 应该通过传入的指针返回平均值、最小值和最大值。平均值也应该使用正常的返回机制返回。在您的代码中不使用库函数。
ArrayAvgMinMaxMain.c
#include <stdio.h>
#include <stdlib.h>
double arrayAvgMinMax(double array[], int length, double *avg, double *min, double *max);
int main(int argc, char **argv) {
int length = 200;
double avg, min, max;
double lowRange=0, highRange=1;
double divisor = (double) RAND_MAX;
int i;
if(argc > 1)
length = atoi(argv[1]);
if(argc > 2) {
lowRange = atoi(argv[2]);
highRange = atoi(argv[3]);
}
//Initialize values to make it clear if they are not changed.
avg = min = max = 99999.9999;
double *array = calloc(length, sizeof(double));
srand(131313); // Set the starting seed so we always get the same results
for(i = 0; i < length; ++i)
array[i] = lowRange + (highRange-lowRange)*rand()/divisor;
double average = arrayAvgMinMax(array, length, &avg, &min, &max);
printf("avg=%f (%f), min=%f, max = %f\n", avg, average, min, max);
return 0;
}
ArrayAvgMinMaxFunction.c 只编辑这个函数
只有一个for循环来提高效率
#include <stdio.h>
double arrayAvgMinMax(double array[], int length, double *avg, double *min, double *max) {
//one for loop
int i;
int sum;
min=max=&array[i];
for(i = 0; i < length; i++) {
if(min > array[i]){
min = &array[i];
}
if(max<array[i]) {
max = &array[i];
}
sum = sum + array[i];
avg = (double)sum/(i+1);
}
return 0;
}
输入:10000000 100 200
输出:avg=149.991665 (149.991665),min=100.000010,max = 199.999993
【问题讨论】:
-
i在代码执行时未初始化min=max=&array[i];— 将i替换为0(零)。不要在每次迭代时计算avg——在循环之后计算一次。avg是一个指针;你应该得到avg = (double)sum/(i+1);的编译错误——*avg是正确的。您将double的值汇总为int;这不好。min和max也是指针;您应该在赋值和引用中使用*min和*max(或为最小值和最大值创建局部变量(double l_min, l_max;),然后使用它们直到最后,分配*min = l_min; *max = l_max;等。