【问题标题】:Sum of array including a function - C包含函数的数组总和 - C
【发布时间】:2021-04-06 12:18:11
【问题描述】:

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

阅读了很多关于这个问题的其他帖子,但我仍然无法理解解决方案。 我的编译器还告诉我“分段错误(核心转储)”。我真的很困惑。

这是我的代码:

#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;
}

帮助我真的很好。 谢谢!

【问题讨论】:

  • 如果您有一个包含 MAX 个元素的数组,则有效索引为 0 - MAX-1。
  • for (i = 1; i &lt;= 10; i++) -> for (i = 1; i &lt;= 9; i++)。最好还是使用更标准的基于 0 的计数器:for (i = 0; i &lt; MAX; i++) scanf("%d", &amp;array[i]);
  • @sam3004 你的函数没有使用参数大小,传递的参数大小没有初始化。
  • sum(array[MAX], size); -> sum(array, size);。由于类型不兼容,编译器应该给你一个警告。始终注意警告。

标签: arrays c for-loop sum function-definition


【解决方案1】:

这是因为数组元素从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];
}

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

【讨论】:

  • 我担心size 没有被初始化,却没有注意到它被忽略了,很好发现。 (严格来说,我认为它仍然是未定义的行为。)
【解决方案2】:

如果您有一个包含 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

【讨论】:

    【解决方案3】:

    您需要清楚地记住,使用 MAX 元素声明的数组的最后一个元素是 MAX-1-th,因为元素从 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 &lt;= 10; i++) 应该是

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

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

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

    sum(array, size);
    

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

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

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

    int sum(int array[], int *size)
    

    您还返回sum,但不要将其存储在任何地方。你应该把它存储在类似的地方

    newVariable = sum(array, size);
    

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

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

    【讨论】:

      【解决方案4】:

      我使用函数 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;
      }
      

      【讨论】:

      • 对不起,我正在写我的答案,我没有看到你在此期间发布了你的答案。在这种情况下的行为准则是​​什么,我应该删除我的,因为它们非常相似?
      • @MDXZ:如果您认为您的回答对之前的回答没有任何价值,您可以将其删除。但是这个只是代码答案,而你的答案包含解释,所以我的建议是你应该保留它。
      • 虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
      • 很抱歉,我来解释一下
      • 感谢你们的快速回复!您的回答对我帮助很大!
      猜你喜欢
      • 2016-07-09
      • 1970-01-01
      • 1970-01-01
      • 2019-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多