在 C 中将数组作为参数传递
Passing arrays as arguments in 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是数组,size是数组的大小。我收到错误提示“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);
因为具有数组类型的参数被编译器调整为指向数组元素类型的指针。
你的函数 return 也没什么,尽管它的 return 类型不是 void
。
此外,该函数使用未声明的变量,例如变量 tam
。
如果数组有 size
个元素,则索引的有效范围是 [0, size )
。
此外,该函数不应更改传递的数组。并且为了避免整数溢出 return 类型应该是 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, 8, 9, 7, 3, 8, 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, 输出=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
开始循环,然后比较 (i == 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, max, output);
return output; /* return the requested sum */
}
int list[] = { 3, 2, 5, 6, 5, 4, 7, 3, 7, 4, 7, 2, 1, 6, 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.c
命名为 test
):
$ test
test.c:23:sum: pos0 = 6, pos1 = 10, max = 7, output = 21
test.c:34:main: result = 21
$ _
我正在尝试创建一个函数来识别数组中的最大值并计算它每次出现的总和。这很好,但问题是我需要使函数 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是数组,size是数组的大小。我收到错误提示“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);
因为具有数组类型的参数被编译器调整为指向数组元素类型的指针。
你的函数 return 也没什么,尽管它的 return 类型不是 void
。
此外,该函数使用未声明的变量,例如变量 tam
。
如果数组有 size
个元素,则索引的有效范围是 [0, size )
。
此外,该函数不应更改传递的数组。并且为了避免整数溢出 return 类型应该是 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, 8, 9, 7, 3, 8, 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, 输出=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
开始循环,然后比较 (i == 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, max, output);
return output; /* return the requested sum */
}
int list[] = { 3, 2, 5, 6, 5, 4, 7, 3, 7, 4, 7, 2, 1, 6, 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.c
命名为 test
):
$ test
test.c:23:sum: pos0 = 6, pos1 = 10, max = 7, output = 21
test.c:34:main: result = 21
$ _