包含函数的数组总和 - C

Sum of array including a function - C

我在编程方面有点菜鸟,这就是为什么我在这个相当简单的代码上苦苦挣扎。 我们的任务是使用函数对数组的所有元素求和。 该函数应打印出数组,然后对其元素求和并将其总和返回给 main。 应该在那里打印。 我认为它一直在工作,直到达到功能为止。

阅读了很多关于这个问题的其他帖子,但仍然无法解决这个问题。 我的编译器还告诉我“Segementation fault (core dumped)”。我真的很困惑。

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX 9           // i think the math one is a bit unneccessary but well

int sum(int array[], int size)
{
    int i;
    int sum = 0;
    for (i = 0; i <= MAX; i++)
    {
        printf("\n%d", array[i]);
    }
    for (i = 0; i <= MAX; i++)
    {
        sum = sum + array[i];
    }
    return sum;
}

int main()
{
    int i;
    int array[MAX];
    int size;
    for (i = 1; i <= 10; i++)
    {
        printf("\nGeben Sie die %d. Zahl ein: ", i);      // Its in german, basically saying the user should fill the array, starting with the 1. element
        scanf("%d", &array[i - 1]);
    }
    sum(array[MAX], size);
    printf("%d", size);
    return 0;
}

能帮到我真是太好了。 谢谢!

我使用函数 sum 扫描数组的元素并对数组的元素求和

    scanf("%d", &array[i - 1]);

如果你想从 SIZE-1 到 0 填充数组,只需反转 for 循环 (for(int i=SIZE-1;i>=0;i--))

  int size;

如果您想在调用函数时将大小作为参数,则应将其初始化为 SIZE(size=SIZE)

你的函数 sum 返回了数组元素的总和,所以改变了这个

sum(array[MAX], size);//use it in void main()

 int k = sum(array, size);//just write the name of array without [MAX]

我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX 9           // i think the math one is a bit unneccessary but well

int sum(int array[], int size)
{
  int sum = 0;
  for (int i = 0; i < MAX; i++)
  {
    scanf("%d",&array[i]);
    sum = sum + array[i];
  }
  return sum;
}

 int main()
{
  int array[MAX];
  printf("%d",sum(array, MAX));//here you just write the name of array without his size
  return 0;
}

发生这种情况是因为数组元素从 0 变为 MAX - 1。通过从 0 循环到 MAX(包括在内),您要求您的程序访问第 11 个元素(array[10])。

奖励:您对该函数的调用应该是 sum(array, size) 并且您可以使用一个循环而不是两个循环:

for (i = 0; i < MAX; i++)
{
    printf("\n%d", array[i]);
    sum = sum + array[i]; // Same as sum += array[i];
}

<math.h> 在这里确实是不必要的,你没有使用 <stdlib.h> 也没有使用参数 size,所以你可以安全地删除它们。

如果您的数组包含 MAX 个元素,则索引的有效范围为 [ 0, MAX ).

函数sum没有使用参数size并且传递的参数size没有被初始化。

而且函数调用的第一个参数

sum(array[MAX], size);

具有类型 int 而不是 int *

程序如下所示

#include <stdio.h>

#define MAX 9

long long int sum( const int array[], size_t size )
{
    long long int total = 0;

    for ( size_t i = 0; i < size; i++ )
    {
        total += array[i];
        printf( "%d ", array[i] );
    }
    
    putchar( '\n' );
    
    return total;
}

int main(void) 
{
    int array[MAX];
    
    for ( size_t i = 0; i < MAX; i++ )
    {
        printf("Geben Sie die %zu. Zahl ein: ", i + 1 );
        scanf( "%d", array + i );
    }
    
    printf( "%lld\n", sum( array, MAX ) );
    
    return 0;
}

它的输出可能看起来像

Geben Sie die 1. Zahl ein: 1
Geben Sie die 2. Zahl ein: 2
Geben Sie die 3. Zahl ein: 3
Geben Sie die 4. Zahl ein: 4
Geben Sie die 5. Zahl ein: 5
Geben Sie die 6. Zahl ein: 6
Geben Sie die 7. Zahl ein: 7
Geben Sie die 8. Zahl ein: 8
Geben Sie die 9. Zahl ein: 9
1 2 3 4 5 6 7 8 9 
45

您需要清楚地记住,用 MAX 元素声明的数组的最后一个元素是第 MAX-1 个,因为元素从 0 开始。

例如int array[3]的元素是:array[0]array[1]array[2]

现在你明白你的循环应该是

for (i = 0; i < MAX; i++)

因为在 i == MAX 的情况下,您将尝试访问不属于数组的 array[MAX]

如果MAX是9,最后一个元素是array[8]所以for (i = 0; i <= 10; i++)应该是

for (i = 0; i < 9; i++)

但是最好使用 MAX 而不是 9,这样如果你想让你的程序适用于 20 个元素的数组,你只需修改 MAX 的值和不是你写的所有代码 9

现在来函数调用sum(array[MAX], size);应该是

sum(array, size);

要传递数组,您必须传递其第一个元素的地址,即 &array[0] 甚至只是 arrayIs an array name a pointer?

那么你传递的size是未初始化的,你甚至没有在sum()中使用它,所以没有理由声明它。

我还注意到你想在最后打印 size 并且因为你将它传递给 sum(),也许你想将它的值修改到 sum() 函数中。如果是这样,那么仅仅传递 size 是不够的。这将传递 size 的副本,并且对其值的任何更改都将丢失(除非你 return 它,但你已经 returning sum)。要真正修改 size,您必须传递其地址 &size,并让 sum() 接收指向 int int *

的指针
int sum(int array[], int *size)

还有你 return sum 但不要将其存储在任何地方。你应该把它存储在像

这样的地方
newVariable = sum(array, size);

或者如果你只是想打印它,那么就打印它

printf("%d", sum(array, size));