【问题标题】:Double arrays in CC中的双数组
【发布时间】:2021-12-06 08:56:03
【问题描述】:

我正在学习C,课程的基础是Cprimer plus(6th edition)。我们使用 Eclipse 作为 IDE。

对于一个项目,我们必须创建数组。一个数组在循环中采用数字,另一个数组显示累积值。因此,如果数组 1 的值是 1、5 和 3(总共 10 个输入),那么数组 2 中的结果输入应该是 9(在第 3 个输入上,因为数组 1 中有 3 个输入)。

我无法以正确的方式开始 - 这里的任何人都知道我该如何继续? 到目前为止,我有这个作为初学者,但原谅我它非常弱:

#include <stdio.h>
#include <stdlib.h>

#define SIZE 10
void doublearrays (double usernumber);

int main(void)
{
    double usernumbers = 0.0;
    int loop1 = 1;
    while(loop1)
    {
        printf("Type numbers as doubles. \n");
        fflush(stdout);
        loop1 = scanf("%lf", &usernumber);
        if(loop1)
        {
            doublearrays(usernumber);
        }
    }
    return 0;
}

【问题讨论】:

  • 离题,但if(loop1) 应该是if(loop1==1)。与循环条件相同:while(loop1) 应为 while(loop1==1)
  • 开始:创建一个静态分配的数组,读取固定数量的用户号码(如何在循环中完成?),将数组及其大小传递给函数。接下来的步骤是问自己:我知道用户愿意输入多少个数字吗?我应该动态分配内存吗?我怎么知道用户输入完数字?
  • 用户输入可以有不同的长度。看起来你想创建创建动态数据结构。不幸的是,普通 C 在 C++ 中没有像矢量这样的动态容器
  • @Vlad 总共 10 个输入。无需动态分配
  • @Someprogrammerdude 你的建议是 if(loop) '应该是' if(loop==1) 不会产生语义差异。我假设您知道这一点,并且您对其中一个的偏好是出于可读性目的?

标签: arrays c loops


【解决方案1】:

应阅读家庭作业中的所有文本:

对于一个项目,我们必须创建 两个数组...总共 10 个输入...

你到底为什么不声明它们?...你已经定义了SIZE所以

double usernumbers[SIZE];
double cumulnumbers[SIZE];

接下来帮自己一个忙,一次解决一个问题:

一个在循环中接受数字的数组...

好的,所以直接在数组中写一个最多 10 个读取浮点数的循环,并注意接收到多少个数字

int n;
for(n=0; n<SIZE; n++) {
    if (scanf("%lf", &usernumbers[n]) != 1) break;
}
// ok we now have n number in the first array

我们继续

和另一个显示累积值的数组。

Ok cumul 最初为 0。并在第一个数组中的每个值上递增:

double cumul = 0.;
for(int i=0; i<n; i++) {
    cumul += usernumbers[i];
    cumulnumbers[i] = cumul;
}

【讨论】:

  • 感谢您花时间和精力帮助我。当我编写您的代码时,它给了我:scanf 行以及 culmul 和 cumulnumbers 行(最后一个和倒数第二个)上的“下标值既不是数组也不是指针也不是向量”。如果我想打印带有 culmul 数字的列表,我应该使用 printf("The list is &numbers\n");还是?
【解决方案2】:

(您当前的代码不是您需要的...删除它然后...)

这里有人知道我该如何继续吗?

第一步是实际定义一些数组。

double input[SIZE];
double cum[SIZE];

下一步是读取输入的循环。

for (int i = 0; i < SIZE; ++i)
{
    if (scanf("%lf", &input[i]) != 1)
    {
        // Input error - add error handling - or just exit
        exit(1);
    }
}

下一步是添加计算累积值的代码。

我会把它留给你作为练习。

最后一步是打印数组,我也会留给你做练习。

【讨论】:

    【解决方案3】:

    这样做的直接方法,也将使用两个数组和一个循环构造,将创建类似这样的东西。我已将双精度数更改为整数。 (我也忽略了来自 scanf() 的任何错误)。

    #include <stdio.h>
    #include <stdlib.h>
    
    #define SIZE 10
    
    static void
    print_array(int *arr, const char *arr_name)
    {
       int i;
       printf("%s  = [");
       for (i = 0; i < SIZE; i++)
          printf("%d%s", arr[i], i < SIZE -1 ? ",":"");
       printf("]\n");
    }
    
    
    int main(int argc, char **argv)
    {
       int i;
       int input[SIZE];
       int cumsum[SIZE];
    
       for (i = 0; i < SIZE; i++)
       {
          int _input;
    
          printf("Give me numbers!\n");
          fflush(stdout);
          scanf("%d", &_input); /* assuming integer */
          input[i] = _input;
          cumsum[i] = i > 0 ? cumsum[i-1] + _input : _input;
       }
    
       print_array(input, "input");
       print_array(cumsum, "cumulative");
    
       return 0;
    }
    

    或者如果你想玩弄指针并有一个更紧凑的版本..也许这可以帮助你理解指针,它和我上面的代码做同样的事情

    #include <stdio.h>
    #include <stdlib.h>
    
    #define SIZE 10
    static int data[SIZE*2];
    
    int main(int argc, char *argv[])
    {
       int *input_p = &data[0];
       int *cumsum_p = &data[0] + SIZE;
    
       for (; input_p != &data[0] + SIZE; input_p++, cumsum_p++)
       {
          printf("Give me numbers!\n");
          scanf("%d", input_p);
          *cumsum_p = input_p == &data[0] ? *input_p : *(cumsum_p-1) + *input_p;
       }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-12-16
      • 1970-01-01
      • 2021-06-25
      • 1970-01-01
      • 1970-01-01
      • 2019-04-08
      • 1970-01-01
      • 2019-11-25
      • 2022-01-06
      相关资源
      最近更新 更多