【问题标题】:one-dimensional array fill with C Functions用 C 函数填充一维数组
【发布时间】:2013-11-28 23:02:41
【问题描述】:

大家好,我正在尝试用 C 函数进行一维数组填充 10 元素随机数介于 10 和 20 之间,平均 10 个元素后打印到屏幕我不太了解这些函数的帮助...

 int main()  {

       int m[ 10 ]; 
       int i,j;

       for ( i = 1; i < 11; i++ )   
       {
          m[ i ] = i + 0;   
       }

       for (j = 1; j < 11; j++ )    
       {
          printf("Element[%d] = %d\n", j, m[j] );
       }

       return 0;

}

【问题讨论】:

  • 今天的边界似乎很困难。 int m[10]; 声明了一个包含 10 个 ints 的数组,这意味着您可以使用 m[0] 直到(包括)m[9] 但不能再使用。没有m[10],因为您的循环尝试这样做。
  • 我认为你在语言方面有点挣扎。你是说“我想用 10 到 20 之间的 10 个随机数填充 10 个元素的数组,然后取这 10 个数字的平均值并将这些数字及其平均值打印到屏幕上”?您需要查看的函数是 rand,但您必须对其进行缩放(因为它产生的数字超出了您感兴趣的范围)。
  • 数组索引在 c 中从 0 开始。参见参考 rand() 和 srand()
  • 使用一些教程再问
  • 没有它的 10 元素随机数与 {10, 11, 12, 13, 14, 15, 16, 17, 18, 19} 到这 10 个元素

标签: c arrays function


【解决方案1】:

您可以为此使用 rand 函数。这是关于如何确定随机数范围的一个小说明。我们上面有很好的解决方案。所以我不想在这里写代码。

如果要生成 10-20 之间的数字,可以使用以下公式。

a=10 b=20 值 = a + rand()%(b-a+1)

这会给你

10 + 兰德() % 11;

希望对你有帮助

塔兰加·阿贝西拉

【讨论】:

    【解决方案2】:

    以下内容应该有所帮助 - 它解决了循环索引的问题(从 0 到 9,而不是 1 到 10),并生成 10 到 20 之间的随机数。有一个小错误 - 使用你得到的模数运算符分布非常轻微的不均匀。如果您足够关心,您可以创建一个消除上述随机数的函数,例如 32758。那么它将是“完全公平的”。

    编辑我已经修改了这个程序,所以它被分成了许多函数——一个生成数组,另一个打印数组,第三个取数组的平均值。它还包括一个自定义函数,可以进行“公平”随机分布。我想你的教授会认为你有帮助(如果他用谷歌搜索代码中的任何短语,他会登陆这个页面)。所以以此为灵感,然后编写自己的代码。从例子中学习是好的;抄袭不好。

    EDIT 修改了fillArray 函数。现在使用在主程序中分配的空间,而不是在函数本身中创建空间。简单一点。

    #include <stdio.h>
    #include <stdlib.h>
    
    // function declarations
    int* fillArray(int* a, int n, int llim, int ulim);
    float arrayAverage(int *a, int nElements);
    void arrayPrint(int *a, int n);
    int fairRand(int, int);
    
    int main(int argc, char* argv[])  {
    
       int m[10];
       float av;
       m = fillArray(m, 10, 10, 20); // note that 'm' is a pointer (int*) to the array m[]
       av = arrayAverage(m, 10);
       arrayPrint(m, 10);
       printf("The average is %.2f\n", av);
       return 0;
    }
    
    int* fillArray(int *a, int n, int llim, int ulim) {
      // given an array a with size n
      // fill each element in the array with a random element
      // between llim and slim (inclusive)
      int i;
    
       for ( i = 0; i < n; i++ )
       {
          a[ i ] = fairRand(llim, ulim); // calling our user-defined function
       }
       return a;
    }
    
    float arrayAverage(int *a, int n) {
      // returns the sum of values in a[n] divided by n
      int j;
      double s=0.0;
       for (j = 0; j < n; j++ )
       {
         s += a[j];
       }
       return (float)(s / (double) n);
    
    }
    
    void arrayPrint(int *a, int n) {
      // prints each element in the array m[n]
      int  j;
       for (j = 0; j < n; j++ )
       {
          printf("Element[%d] = %d\n", j, a[j] );
       }
    }
    
    int fairRand(int a, int b) {
      // generates fair random number between a and b, inclusive
      int diff = b - a + 1;
      int r;
      int largest = diff * (RAND_MAX / diff);
      // this is the "magic" line: keep generating random numbers
      // until the number generated fits in the interval that has equal number
      // of each possible value after the modulo operation:
      while( (r = rand()) >= largest) {
        // keep going around...
      } ;
    
      // we now have a "fair" random number r
      return a +  r % diff;
    }
    

    【讨论】:

    • m[ i ] = 10 + rand() % 11;为什么我们给 % 11 ?
    • 10, 11, 12 ... 20 总共是 11 个数字(换句话说,表达式 mod 11 产生从 0 到 10 的数字)
    • void main (void) 我必须使用函数?!?!
    • 实际上什么是函数意味着没有任何解释如果代码以void main (void)开头这意味着一个函数与int main()有什么不同??
    • 如果您要发布一个实际的家庭作业问题,您必须准备好展示您所做的工作以及非常具体您遇到的困难。不要让它听起来像“为我做作业”,你会没事的。例如whathaveyoutried.com 以获得一些指导。
    【解决方案3】:
    #include <stdlib.h>
    ...
    for ( i = 1; i < 11; i++ )   
        m[ i ] = 10 + rand() % 11;   
    
    int sum = 0, size = 10;
    for (j = 0; j < size; j++ )    
    {
        sum += m[j];
        printf("Element[%d] = %d\n", j, m[j] );
    }
    
    double average = (double) sum / (double) size;
    printf("Average = %lf\n", average);
    

    【讨论】:

      【解决方案4】:

      在他的答案中发布的代码 Bit Fiddleing Code Monkey 应该可以工作。您的问题还包括将其打印出来,因此我将根据您的上下文重写他的代码:

      int main()  
      {
          int m[ 10 ]; 
          int i,j;
          int sum = 0, average;
      
          srand(time(NULL));              // Randomize seed
      
          for(int i = 0; i < 10; i++)
          {
              m[i] = (rand() % 11) + 10; // Get a random number in the range 10 to 20
              sum += m[i];               // Get sum
          }
      
          average = sum / 10;            // Get average
      
          for (j = 0; j < 10; j++ )    
          {
              printf("Element[%d] = %d\n", j+1, m[j] );
          }
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-03
        • 1970-01-01
        • 2015-01-24
        • 1970-01-01
        • 1970-01-01
        • 2013-07-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多