c - C中数组的和

标签 c arrays visual-studio loops double

我正在为学校开发一个小程序,但无法正确求和我的 double 数组。我收到的具体错误是

warning C4244: 'return': conversion from 'double' to 'int', possible loss of data 

在返回 sum 的行上。显示的总和是乱码。

该代码的目的是:

  1. 用用户输入填充 double 组,
  2. 将 double 打印在屏幕上的一列中,
  3. 将数组中的所有 double 相加,并且
  4. 将总和打印到屏幕上。

代码

#define _CRT_SECURE_NO_WARNINGS 1 
#include<stdio.h>
#define MAX_SIZE 15

void FillArray(double a[], int *i); 
void PrintArray(double a[], int i);  
SumArray(double a[], int *i);        
int main()
{
    double input[15];             
    int input_size;
    double sum;


    FillArray(input, &input_size);         
    PrintArray(input, input_size);       
    sum = SumArray(input, &input_size);     
    printf("The sum is %f\n", sum);          
    return 0;

}

void FillArray(double a[], int *i)         
{
    int k;
    printf("Filling an array of doubles\n");                      
    printf("How many doubles do you want to enter (<15)\n");        
    scanf(" %d", i);                                               

    for (k = 0; k <*i; k++)                                      
    {
        printf("Enter double:\n");                                
        scanf("%lf", &a[k]);                                      
    }
}

void PrintArray(double a[], int i)                        
{
    int k;
    printf("Printing an array of integers:\n");             
    for (k = 0; k<i; k++)                                   
    {
        printf("%f\n", a[k]);                                
    }
    printf("\n");
}

SumArray(double a[], int *i)                        
{
    int k;
    double sum = 0;
    for (k = 0; k<*i; k++);
    {
        sum +=a[k];
    }
    return (sum) ;
}

最佳答案

您需要在声明和定义函数时指定double SumArray(...),而不仅仅是SumArray(...)。如果未指定返回类型,则假定为 int。具体来说:

  void FillArray(double a[], int *i); 
  void PrintArray(double a[], int i);  
  double SumArray(double a[], int *i);        
/*^^^^^^-- add return type*/
  int main()

  double SumArray(double a[], const int numElements)
/*^^^^^^- same deal*/ /* also ^^^^^     ^^^^^^^^^^^ */

  {
      int k;
      double sum = 0.0; /* Edit 3: 0.0 rather than 0 for clarity */
      for (k = 0; k < numElements; ++k) /* no ; here!  --- Edit 3: ++k for speed and good practice */
      {            /* ^^^^^^^^^^^ */
          sum +=a[k];
      }
      return (sum) ;
  }

编辑 此外,您可以在 SumArray 中使用 const int numElements 代替 int *i。您不需要修改 SumArray 内部的值,因此不需要 * 并且可以指定 const。为变量提供描述性名称是一个很好的做法,例如,numElements 而不是 i。当您以后需要维护自己的代码时,这将帮助您理解它! (问我怎么知道。;))

要使用此功能,您还需要更改 main 中的调用以删除 &:

sum = SumArray(input, input_size);
                   /* ^ no & here */

编辑 2 正如 @BLUEPIXY 所指出的,for 循环上的尾随 ; 放错了位置。结果,{} block 在循环完成后运行一次。这将是您看到的“乱码”的一个重要原因:效果是设置 k=numElements 然后设置 sum=a[numElements],这是一个非- 存在的元素。因此,sum 被设置为 a 之后发生的任何随机内存内容。

关于c - C中数组的和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40289377/

相关文章:

ruby - 如何从更频繁地返回开头对象的数组中取值?

c++ - 为什么汉字经过编译器会变成乱码?

visual-studio - NuGet 3.5/Visual Studio 2015 - 更改包缓存位置

c++ - Linux 中的代码执行时间

c - 二叉搜索树插入在 C 中无法正常运行(可能是无知错误)

c++ - 这些是空指针,还是指向地址 0 的指针?

javascript - 循环遍历数组并在到达末尾时返回到开头

c - 调用约定会阻止可变大小的返回值吗?

javascript - JSON 格式的句子(带空格的单词)

visual-studio - 是否有一个 Visual Studio 模板用于创建客户端 TypeScript 应用程序而无需使用 asp.net 等