我想创建一个函数,该函数将接受1:array_of_int和2:size_of_array,然后返回3个最大整数的和。代码如下:
#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
时,该怎么办?我不太了解。
答案 0 :(得分:1)
您的if
语句:
if (arr[i] > max)
第一次找到max
(在j > 0
时为即)之后,不会再输入。
您需要在以下时间将其归零:
max_arr[j] = max;
max = 0;
答案 1 :(得分:0)
以下建议的代码:
size_t
,因为它是sizeof()
返回的类型sizeof(arr)/sizeof(arr[0])
使编译器可以计算数组中的条目数int arr[] = {1,5,9,12,16,14};
让编译器为数组分配空间现在,建议的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h> // memcpy()
void swap(int *xp, int *yp)
{
int temp = *xp;
*xp = *yp;
*yp = temp;
}
// A function to implement bubble sort
void bubbleSort(int arr[], size_t n)
{
size_t i;
size_t j;
for (i = 0; i < n-1; i++)
{
// Last i elements are already in place
for (j = 0; j < n-i-1; j++)
{
if (arr[j] > arr[j+1])
{
swap(&arr[j], &arr[j+1]);
}
}
}
}
int max_3(int arr[], size_t asize)
{
int localArray[ asize ];
memcpy( localArray, arr, asize*sizeof( int ) );
// sort array
bubbleSort( localArray, asize );
// calculate sum of max 3 entries
int sum = localArray[asize-1] + localArray[asize-2] + localArray[asize-3];
return sum;
}
int main ( void )
{
int arr[] = {1,5,9,12,16,14};
printf( "%i\n", max_3( arr, sizeof(arr)/sizeof(arr[0])) );
return (EXIT_SUCCESS);
}
运行建议的代码将导致:
42
答案 2 :(得分:0)
在外循环(循环for(int j=0; j<3; j++)
)的第一次迭代之后,max
和pi
的值将永远不变。
在外循环的第一次迭代中,您将发现数组中的第五个元素最大,max
等于16
,而pi
则指向该数组元件。您将max_arr[0]
设置为16
,并将*pi
设置为零。然后,外循环从max
仍等于16
开始。现在,数组中将没有等于或大于该值的值。因此,您也将max_arr[1]
设置为16
,并将*pi
(其中pi
仍指向第五个元素)再次 设置为零。下一次迭代也是一样。
自然的解决方案是在外部循环内部定义max
和pi
:
for(int j=0; j<3; j++)
{
// The variables will be redefined and reinitialized each iteration of the loop
int max = 0;
int *pi;
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)
}
该代码还有其他一些问题,例如pi
永远不会被初始化的可能性。我将其作为练习供读者了解何时会发生以及如何解决。