在 C 中将数组作为参数传递

问题描述

我正在尝试创建一个函数来识别数组中的最大值并计算每次出现时的总和。这很好,但问题是我需要使函数 args 成为数组和数组本身的大小。

这就是我到目前为止所想到的:

int sum(int a,int size)
{
    int i,max,output=0;

    //checking every index for max value
    for(i=0;i<=tam;i++){
        if(i==1){
            //setting max on the first index
            max=a[i];
        }else{
            if(a[i]>max){
                a[i]=max;
            }
        }
    }
    //making the sum
    for(i=0;i<size;i++){
        if(a[i]==max);
        output=output+max;
    }
    printf("%d",output);
}

参数“a”是数组,大小是数组的大小。我收到错误说“a”既不是数组也不是指针也不是向量。

感谢任何帮助。

解决方法

int sum(int a,int size) 替换为 int sum(int *a,int size)int sum(int a[],int size)

,

这个函数声明

int sum(int a,int size);

声明一个带有两个 int 类型参数的函数。如果您的意思是第一个参数应该指定一个一维数组,那么函数声明将如下所示

int sum(int a[],int size);

int sum( int *a,int size);

因为具有数组类型的参数被编译器调整为指向数组元素类型的指针。

此外,您的函数虽然返回类型不是 void,但什么也不返回。

此外,该函数使用未声明的变量,例如变量 tam

如果一个数组有 size 个元素,那么索引的有效范围是 [0,size )

此外,该函数不应更改传递的数组。并且为了避免整数溢出,返回类型应该是 long long int

此外,该函数不应输出任何消息。决定是否输出消息的是函数的调用者。

该函数可以如下所示,如下面的演示程序所示。

#include <stdio.h>

long long int sum( const int a[],size_t n )
{
    long long int total = n == 0 ? 0 : a[0];
    
    size_t max = 0;
    
    for ( size_t i = 1; i < n; i++ )
    {
        if ( a[max] < a[i] )
        {
            total = a[i];
            max = i;
        }
        else if ( !( a[i] < a[max] ) )
        {
            total += a[max];
        }
    }
    
    return total;
}

int main(void) 
{
    int a[] = { 2,8,9,7,3,1,9 };
    const size_t N = sizeof( a ) / sizeof( *a );
    
    printf( "The sum of elements with the maximum value is %lld\n",sum( a,N ) );
    
    return 0;
}

程序输出为

The sum of elements with the maximum value is 18
,
#include<stdio.h>
#include<stdlib.h>
int sum(int *a,int size);
int main()
{
   int *a=(int*)malloc(10*sizeof(int));

    for(int i=0;i<10;i++)
          a[i]=i+1;
          sum(a,10);
 }

int sum(int *a,int size) { int i,max,output=0;

//checking every index for max value
for(i=0;i<size;i++){
    if(i==1){
        //setting max on the first index
        max=a[i];
    }else{
        if(a[i]>max){
            a[i]=max;
        }
    }
}
//making the sum
for(i=0;i<size;i++){
    if(a[i]==max);
    output=output+max;
}
printf("%d",output);

}

,

好吧,你可以一次完成,因为当你确定一个新的最大值时,最后一个的累计和不再有效(它不是指最大的数,而是指较小的数)

您的代码中有些东西很奇怪……您从 0 开始循环,然后比较 if (i == 1) 我猜这是一个错误(不应该是 {{1} }?),因为您应该检查您是否在第一个(而不是在第二个单元格)进行 0 的初始化。无论如何,有一个聪明的方法是将 max 初始化为您可以拥有的最小数字(对于 max,您在 int 中将该值作为常量 <limits.h> )。现在,我将向您展示解决您的问题的一种可能的源代码(取自您的,但更改了一些变量并添加了其他变量,以向您展示一次您可以完成很多工作:

INT_MIN

哪个应该输出(如果程序从 #include <stdio.h> #include <limits.h> /* pretty format of output with location of trace in source file */ #define F(_fmt) __FILE__":%d:%s: "_fmt,__LINE__,__func__ /* to pass an array,just declare it as below. The array size is * unspecified because your don't know it before calling sum,* and this is the reason to pass the array size. */ int sum(int a[],int size) { int i,pos0 = -1,pos1 = -1,max = INT_MIN,output=0; /* checking every index for max value,and output,you made * an error here and used tam instead of size. */ for(i = 0; i <= size; i++){ if (a[i] > max) { /* if greater than max */ pos0 = i; /* save position as first */ max = a[i]; /* save max value */ output = max; /* initialize output to max */ } else if (a[i] == max) { /* if equal to max */ pos1 = i; /* save position as last */ output += max; /* add to output */ } /* else nothing */ } /* print all the values we got */ printf(F("pos0 = %d,pos1 = %d,max = %d,output = %d\n"),pos0,pos1,output); return output; /* return the requested sum */ } int list[] = { 3,2,5,6,4,2 }; /* max is located ^ ^ ^ in these positions * 6 8 10 */ /* the following macro gives us the size of the array list by * dividing the size of the complete array by the size of the * first element. */ #define n_list (sizeof list / sizeof list[0]) int main() { printf(F("result = %d\n"),sum(list,n_list)); } 命名为 test):

test.c