有没有办法从输入中单独找到二维数组的行和列?

时间:2015-05-17 21:26:54

标签: c++ arrays multidimensional-array

作为我正在进行的更大任务的一部分,我试图找到一种方法,仅从输入中找到二维数组的行和列。

目前我正在做的设置参数只是要求行和列。 (见下文/忽略一些指令,初始化)。

但我想做的就是跳过我通过输入设置行和列的部分;而是能够以一种矩阵方式输入数组的值,并以这种方式获得行和列。这可能吗?

//what I'd to be able to do
Enter values:
1 2 3 4
5 6 7 8
//the array would then be ex_array[2][4]

//current method I am using
#include<iostream>
#include<cmath>
#include <iomanip> 
using namespace std;

int main()
{
   int n,m;
   double sqt;
   double elevation;
   double answer;
   int array[10][10];
   int lowest,highest;
   int lowest_x_coordinate_index;
   int lowest_y_coordinate_index;
   int highest_x_coordinate_index;
   int highest_y_coordinate_index;

   cout<<"Enter No of rows: ";
   cin>>m;

   cout<<"Enter No of columns: ";
   cin>>n;

   cout<<"Enter values:\n";
   //Read array values from keyboard
   for(int i=0;i<m;i++)
   {
       for(int j=0;j<n;j++)
       {
           cin>>array[i][j];
       }
   }
}

2 个答案:

答案 0 :(得分:0)

不,除非您通过引用传递数组,否则数组会衰减到指向其第一个元素的指针。通过引用传递的示例:

#include <iostream>

template <typename T, size_t M, size_t N>
void f(T (&arr)[M][N])
{
    std::cout << "Size: " << M << " " << N;
}

int main()
{
    int arr[2][3];
    f(arr); // can deduce the size here
}

如果你问是否可以创建一个可变长度的数组,答案仍然是否定的,C ++不允许变量大小的数组。您唯一的选择是使用动态分配,

int M = 10, N = 20; // sizes, can be read also from input
int* array = new int*[M];
for(size_t i = 0 ; i < N; ++i)
    array[i] = new int[N];

然后在你完成它时不要忘记将其删除

for(size_t i = 0 ; i < N; ++i)
    delete[] array[i];
delete[] array;

正如你所看到的,事情开始变得不那么好了。不要使用普通的C风格数组,而是尝试使用标准库std::vector(或std::array编译时固定大小的数组)。它们更灵活,更不容易出错。例如:

std::vector<std::vector<int>> v(M, std::vector<int>(N)); // vector of vector, M x N

答案 1 :(得分:0)

是(如果我已正确理解您的问题)。

可以这样做:

Enter values:
1 2 3 4
5 6 7 8
                         <- empty line
//the array would then be ex_array[2][4]

你必须使用:

  • getline逐行阅读输入
  • 用于解析每一行的字符串流
  • 构建每一行的向量
  • 用于构建完整数组的数组向量

但是......在C ++中没有方便的方法来声明具有运行时已知大小的2D数组! (参考:How do I declare a 2d array in C++ using new?),你最多只能得到一个数组数组。但是,如果您接受使用静态大小声明数组,就像它在代码中一样,那么它就更简单了:

#include <string>
#include <iostream>
#include <sstream>
#include <vector>

int main() {
    std::string line;
    int cols = -1;
    int linenum = 0;
    int arr[10][10];

    for(;;) {
        linenum++;
        int i;
        std::getline(std::cin, line);
        if (line == std::string("")) break;
        if (linenum >= 10) {
            std::cerr << "Too much lines (limited to 10)" << std::endl;
            return 1;
        }
        std::istringstream ss(line);
        std::vector<int> values;
        for(;;) {
            ss >> i;
            if (ss.fail()) break;
            values.push_back(i);
        }
        if (! ss.eof()) {
            std::cerr << "Incorrect input line " << linenum << std::endl;
            return 1;
        }
        if (cols == -1) {
            cols = values.size();
            if (cols > 10) {
                std::cerr << "Too much columns " << cols << ">10" << std::endl;
                return 1;
            }
        }
        else if (cols != values.size()) {
            std::cerr << "Error line " << linenum << " : " << cols;
            std::cerr << " columns expected - found " << values.size();
            std::cerr << std::endl;
            return 1;
        }
        for(int i=0; i<cols; i++) arr[linenum - 1][i] = values[i];
    }
    int nrows = linenum -1;
    std::cout << nrows << " lines - " << cols << " columns" << std::endl;
    for (int i=0; i<nrows; i++) {
        for (int j=0; j<cols; j++) {
            std::cout << " " << arr[i][j];
        }
        std::cout << std::endl;
    }
    return 0;
}

输入:

1 2 3 4
5 6 7 8

它给出了:

2 lines - 4 columns
 1 2 3 4
 5 6 7 8