【发布时间】:2019-08-27 15:26:43
【问题描述】:
我想创建一个函数,它可以接受 1:array_of_int 和 2:size_of_array,然后返回 3 个最大 int 的总和。代码如下:
#include <stdio.h>
#include <stdlib.h>
int max_3(int arr[], int asize)
{
int max_arr[3];
int max =0;
int sum = 0;
int* pi;
for(int j=0; j<3; j++)
{
for(int i =0; i<asize;i++)
{
if(arr[i] > max)
{
max = arr[i];
pi = (arr + i); // to know the address of the max int of 'i' cycle
}
}
max_arr[j] = max;
*pi = 0; // make the max int = 0 so that the next 'i' cycle doesnt have the previous max in it
//(so it can look for another max value - the second one)
}
for(int i=0; i<3; i++)
sum += max_arr[i];
return sum;
}
int main (int argc, char** argv) {
int arr[6] = {1,5,9,12,16,14};
printf("%i\n",max_3(arr, 6));
return (EXIT_SUCCESS);
}
指针pi 不会使当前max 的值变为0,并且for (int i..) 中的下一个循环与上一个一样再次变为最大。因此,它没有返回 max val1 + val2 + val3,而是返回 3 * val1(最大的一个)——在我的特定示例中——它打印出 48 而不是 42 (12 + 16 + 14)——它应该.但是当我将地址的值(我的指针指向的)设置为0 时如何?我不是很明白。
【问题讨论】:
-
你试过debug your program吗?如果您使用变量来存储最大元素的 index(而不是指针),该索引是否正确?代码是否使用索引代替?
-
还有一个小提示:在内循环之后,
max的值是多少?你在哪里重置它?这应该非常通过一点调试很容易找到。 -
函数修改输入数组会让大多数用户感到非常惊讶。
-
@molbdnilo 它是如何修改的?如果我进行一些排序 - 然后将修改数组,但在我的示例中,我制作了“辅助”数组
max_arr并将最大值存储在其中,这样我就不会修改输入数组arr- 所以它确实和你说的相反。 -
@Someprogrammerdude max int 的值每次都是不同的 - 在两个循环中 - 如图所示 -
if(arr[i]>max) max = arr[i]- 如果某物大于该数组中的最大值 - 然后它变成最大限度。每一个周期。这就是为什么它存储在函数空间中的原因 - 而不是在循环中
标签: c