要求用户在 2d 数组时输入 1 行的值

Posted

技术标签:

【中文标题】要求用户在 2d 数组时输入 1 行的值【英文标题】:ask the user to input the values 1 row at a time of 2d array 【发布时间】:2014-02-07 06:46:17 【问题描述】:

编写一个程序,要求用户输入 方 (n x n) 数组的维数 (n),然后要求用户输入值 1 行 一次。例如:

“输入二维数组的大小:” “在数组中输入第 1 行的值,用空格分隔,然后按 Enter:” - 将数组的大小限制为最大 10 x 10 并检查错误。 数组初始化后,检查数组中是否有负元素并显示结果:  如果没有负值:“所有值都是非负的!”  如果有 # 个负值:“有 # 个负值!” … 哪儿是 找到的负值数。

示例运行:

输入二维数组的大小:4 在数组中输入第 1 行的值,用空格分隔,然后按 Enter:1 5 6 3 在数组中输入第 2 行的值,用空格分隔,然后按 Enter:-5 6 -12 5 在数组中输入第 3 行的值,用空格分隔,然后按 Enter:9 4 -3 1 在数组中输入第 4 行的值,用空格分隔,然后按 Enter:7 5 -3 9 有4个负值!

输入二维数组的大小:12 错误:您的数组太大!输入 1 到 10

这是我到目前为止的内容,但我不知道如何一次输入一行信息。 我是否将 的值输入到两个单独的数组中,然后尝试将它们组合起来?但是这些值需要保留在它们的接受行中。 谢谢

#include <iostream>
#include <string>
using namespace std;

int main()

    int num;
    cout << "please enter the size of the 2D array" << endl;
    cin >> num;
    while (num < 1 || num > 10)
    
        cout << "You have entered an invalid number that is less than 10"<< endl;
        cout << "Enter a new # " << endl;
        cin >> num;
    
    cout <<"Enter a sequence of numbers separated by spaces" << endl;
    int c = 0;
    int arr[num][num];
    for(int i = 0; i < num; i++)
    
        for(int j = 0; j < num; j++)
        
            cin >> arr[i][j];
            if(arr[i][j] < 0 )
            
                c = c+1;
            
        

    
    for(int i=0; i < num; i++)
    
        for(int j=0; j < num; j++)
        
            cout << arr[i][j] << endl;
        
    

    cout << c << endl;
    return 0;

【问题讨论】:

【参考方案1】:

使用您的代码,它已经能够每次读取一行整数。事实上,您可以输入每个整数并按回车键,然后输入下一个……依此类推。也可以输入一整行整数,只要计数正确,程序就会接受。

例如,如果我想输入一个 2x2 数组, 我可以输入:

1
2
3
4

或者做:

1 2
3 4

两者都可以。

【讨论】:

您不能创建动态大小的数组,如 OP 代码中所示,因为 C++ 要求数组的大小是常量或在编译时已知 - 用户输入的值也不是。因此,虽然数据的输入和分配是正确的,但所述数组的创建是错误的。 真的吗?但在发布之前,我什至写了一点代码测试,它对我来说很好。我在代码块(mingw)上做到了 咨询这个:learncpp.com/cpp-tutorial/… 感谢您提供的信息。但我认为这仅在旧版本中是不允许的?我也很好奇,所以我用谷歌搜索了它,看看这个:link 原来它在 C99 中很好。 您在这个问题上是正确的。谢谢你的知识。【参考方案2】:

有几点:

由于数组的维度是动态的,因此该行无效(更多信息请参见此链接:http://www.learncpp.com/cpp-tutorial/69-dynamic-memory-allocation-with-new-and-delete/):

int arr[num][num];

因此,您需要指针数组指向数组)或vector来分配并管理内存(鉴于这是一个赋值,您可能无法使用向量,而必须使用指针)。

关于你的问题:

我是否将 的值输入到两个单独的数组中,然后尝试合并 他们?

您不必这样做。

如果您使用指针(技术上:指向数组的指针数组)或向量,那么您应该能够直接访问和修改特定行和列索引处的内容。

例子:如果你要走指针路线:

#include <iostream>
#include <cstdlib>

int main() 
    std::size_t size;

    std::cout << "Enter a dimension: " << std::endl;
    std::cin >> size;

    int **arr = new int*[size];

    //allocate the memory for the columns:
    for (int i = 0; i < size; ++i) 
        //remember, it's an array of pointers which in turn point to arrays
        //so, that's why we have to allocate the memory for each row manually
        arr[i] = new int[size];
    

    //now you can alter the data in the array:
    for (int i = 0; i < size; ++i) 
        //the following for loop is how you would prompt the user to enter the value for a specific row:
        for (int j = 0; j < size; ++j) 
            std::cout << "Enter a value for row " << i << " and column " << j << std::endl;
            std::cin >> arr[i][j];
        
    

    //now print the entire thing:
    for (int i = 0; i < size; ++i) 
        for (int j = 0; j < size; ++j) 
            std::cout << arr[i][j] << " ";
        
        //print a new line at the end of each row:
        std::cout << std::endl;
    

    //free the memory we've allocated:
    for (int i = 0; i < size; ++i) 
        delete [] arr[i];
    

    delete [] arr;

    return 0;

但是,正如您所注意到的:这有很多样板代码。如果您可以使用该选项,那么改用矢量可能是一个更好的主意。

有关该讨论的更多信息,请参阅以下内容:

When would you use an array rather than a vector/string?

When to use vectors and when to use arrays in C++?

【讨论】:

int arr[10][10]; 对于 OP 来说已经足够简单了。 @Jarod42:也许吧。在这种情况下这是合理的,但在一般意义上并非如此。但是,请注意!

以上是关于要求用户在 2d 数组时输入 1 行的值的主要内容,如果未能解决你的问题,请参考以下文章

创建数组并添加值

指针引用不同的值

检查输入时出错:预期 conv2d_1_input 的形状为 (3, 32, 32) 但得到的数组的形状为 (32, 32, 3)

在二维数组中输入和存储字符串

ValueError:检查输入时出错:预期 conv2d_input 有 4 个维度,但得到的数组具有形状(无,1)

检查模型输入时出错:预期的 convolution2d_input_1 有 4 个维度,但得到了形状为 (32, 32, 3) 的数组