【问题标题】:2-D Array in C storing user inputsC中存储用户输入的二维数组
【发布时间】:2020-03-30 12:22:41
【问题描述】:

这里总共 C 新手。感谢您事先提供的任何帮助。

我需要编写一个具有以下属性的代码:

  1. 要求用户在二维数组中输入他们想要的行数和列数
  2. 创建一个包含那么多行和列的二维数组来存储整数
  3. 用 1 到 1000 之间的随机数填充数组
  4. 输出数组中最大的数

这是我现在可以去的地方:

#include <stdio.h>

int main(){

 int rows;
 int columns;

 scanf("%d", &rows);
 scanf("%d", &columns);
 }

我该怎么办? 对不起,这个非常开放的问题,我被卡住了,不知道该怎么做。一个指南将是完美的。谢谢:)

编辑:

感谢您的指导,这是我的解决方法: 解决方案:

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

int main () {
    //Declare variables
    int a,b,k,l,big,z[100][100];
    //Ask user input
    printf("ENTER ROWS & COLUMNS\n");
    scanf("%d\n%d", &a, &b);
    //Randomize array values
    srand(time(NULL));
    big = 1;
    for (k=0;k<a;k++){
        for(l=0;l<b;l++){
            z[k][l]=rand()%1000 + 1;
            if(z[k][l]>big) big=z[k][l];
            printf("%d\t", z[k][l]);
        }
        printf("\n");
    }
    //Print biggest number
    printf("\nBIGGEST NUMBER IN THE ARRAY: %d", big);
    return 0;
}

【问题讨论】:

  • 对不起,但 SO 不能那样工作。我们帮助解决您的代码中的问题,但我们不会为您编写代码。
  • 所以你需要更具体...你在哪里卡住了?你知道那个程序开头是:int main(void) { ....}; 那么你解决不了的问题是什么?获取用户输入?创建一个二维数组?填充数组? ....
  • 首先尝试实现#1 并使用printf 将其打印回标准输出,以查看输入是否被正确读取。然后尝试实现#2和#3并打印二维数组的内容,看看是否有效。然后尝试实施#4。如果您对上述任何步骤有具体问题,欢迎您提出具体问题。
  • 以这种方式使用scanf是不安全的。您可能需要阅读此内容以获取更多信息:A beginner's guide away from scanf()
  • scanf("%d", &amp;rows); ==> if (scanf("%d", &amp;rows) != 1) exit(1);

标签: c arrays multidimensional-array


【解决方案1】:

指南将是完美的。

好吧……我们走吧……

  1. 要求用户在二维数组中输入他们想要的行数和列数

使用scanf 或更好的fgets,后跟sscanf

  1. 创建一个包含那么多行和列的二维数组来存储整数

使用malloc(在网上搜索“如何正确分配二维数组”或直接查看Correctly allocating multi-dimensional arrays

  1. 用 1 到 1000 之间的随机数填充数组

使用srandrand% 运算符

  1. 输出数组中最大的数

迭代数组的所有元素并与正在运行的最大值进行比较。

【讨论】:

  • 感谢您的指导。现在可以解决但没有使用malloc。
  • @Xavier99:一般来说,如果您认为某个答案解决了您的问题,请接受它。不过,您只能接受一个答案。但是,如果您有 15 个声望点,那么您可以对所有您认为有用的答案进行投票。如果您认为没有答案可以解决您的问题,您也可以编写自己的答案并接受。
【解决方案2】:

C 本身不支持二维数组,您需要分配一个数组数组。事先不知道大小,所以需要使用malloc动态分配数组内存。

为了生成随机数,您可以使用rand,但您需要首先使用srand 为伪随机整数序列设置一个种子,以便在每次执行时(可能)获得不同的数字,或者您可以使用rand_r 用一个功能来做这两个操作。请注意,rand 生成一个介于0RAND_MAX 之间的随机数,您需要使用模数运算符% 的技巧来生成特定范围[min, max] 内的随机数。

min + (rand() % (max - min + 1))

您可以使用两个循环遍历数组,以获得最大数量。

要了解如何使用这些功能,您可以阅读手册页:mallocrand

附带说明,您实际上并不需要二维数组来获得最大数量,您可以通过分配任何额外的内存直接计算它。


您的解决方案可以使用,但仅限于 100 列和 100 行。例如,如果用户输入更高的数字,您的代码大部分会崩溃。如果您不想处理动态内存分配,一种解决方案是验证输入并拒绝超过 100 的数字,但在现实世界中这种情况非常罕见,动态内存分配是必要的。

你不应该用一个字符的名字来命名你的变量,特别是如果它们寿命很长的话。最好使用像 columnsNumber 这样的描述性好的名称。

【讨论】: