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

时间:2014-02-07 06:46:18

标签: c++

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

  

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

示例运行:

  

输入2D数组的大小: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个负值!

     

输入2D数组的大小: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;
}

2 个答案:

答案 0 :(得分:0)

有几件事:

由于数组的维度是动态的,因此该行无效(请参阅此链接了解更多信息: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++?

答案 1 :(得分:0)

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

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

1
2
3
4

或做:

1 2
3 4

它都会起作用。