【问题标题】:Array not printing?数组不打印?
【发布时间】:2020-02-12 09:14:14
【问题描述】:

我正在尝试在 10 行和 10 列中打印一个包含 100 个数字的数组,每个数字都是由某个范围内的随机数生成器随机生成的。但是,要么什么都不打印,要么只打印一个数字。我该如何解决这个问题?

我查看了一些打印数组的示例,但代码似乎不适用于我的程序。我还研究了使用数组播种随机数生成器的方法,但这些方法似乎也不起作用。

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

int main()
    {
        int myRandomNumber, i, a;
        srand(0);
        myRandomNumber = rand();
        double doubarr[10][10];
        for (a = 0; a <100; a++);
            for (i = 0; i<100; i++);
                doubarr[i][a]=(double)(rand()%100+1)/2.0;
        printf("%.2lf ", doubarr[i][a]);    
    }

我希望最终结果在上面代码中指定的范围内打印 10 行和 10 列随机生成的数字。谢谢!

【问题讨论】:

  • 开启编译器警告
  • 循环不需要语句终止符 (;)。您的循环应该迭代 10 而不是 100。您的打印应该在循环中。
  • srand(0) 不应该是srand(time(0))
  • @clockstream 它应该包含来自/dev/rand 或同等的数据。 time(NULL) 对于远程随机值来说还远远不够。

标签: c arrays for-loop random


【解决方案1】:

当您学习 C 并使用 for 时,请务必用大括号清楚地表达:

 for (a = 0; a <10; a++) {
   for (i = 0; i<10; i++) {
     doubarr[i][a]=(double)(rand()%100+1)/2.0;
     printf("%.2lf ", doubarr[i][a]);
   }
 }

您用; 提前终止了每个for 循环,因此它们各自没有做任何事情。

你的代码是有效的:

 for (a = 0; a <10; a++) { }
 for (i = 0; i<10; i++) { }

 doubarr[i][a]=(double)(rand()%100+1)/2.0;

这是使用a 的最后分配值,实际上是在数组外踩踏内存。

另一个要养成的好习惯是在循环本身中声明迭代器:

 for (int a = 0; a <100; a++) { ... }

【讨论】:

  • 您不能在c 中的for 循环中声明迭代器,除非您使用-std=c99(或更高版本)进行编译。
  • (当每个for循环迭代到100时,还要注意double doubarr[10][10];
  • @NickReed 你还会反对使用命名空间或模板的 C++ 答案吗?
【解决方案2】:

由于您只调用 printf() 一次并且它在两个 for 循环之外,因此正在打印一个数字。如果要打印每个值,则必须将其移动到嵌套的 for 循环中。此外,您的数组大小为 [10][10],但您的循环转到 [100][100]。

【讨论】:

    【解决方案3】:

    printf("%.2lf ", doubarr[i][a]); 这会打印出一个单独的值——具体来说,就是在doubarr 中位于[i][a] 的那个值。由于您的for 循环周围没有大括号,打印代码直到它们都完成后才会执行,因为没有大括号的for 循环只在它们之后执行一行。要打印每个值,您需要遍历数组中的每个值。

    话虽如此,您编写的代码既不会编译也不会运行,而是会出现段错误:doubarr 的大小为 10、10,而您尝试分配的大小为 0-100、0-100。

    更正的代码:

    #include <stdio.h>
    #include <time.h>
    #include <stdlib.h>
    
    int main()
        {
            int myRandomNumber, i, a;
            srand(0);
            myRandomNumber = rand();
            double doubarr[10][10];
            for (a = 0; a <10; a++) {
                for (i = 0; i<10; i++) {
                    doubarr[i][a]=(double)(rand()%100+1)/2.0;
                    printf("%.2lf ", doubarr[i][a]);
                }
            }    
        }
    

    Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      相关资源
      最近更新 更多