7

2D 配列を 1D に変換しようとしています。私は C/C++ に非常に慣れていませんが、2D 配列を 1D に変換する方法を学ぶことは非常に重要だと思います。だからここで私はこの問題に出くわしています。

これまでの私のコードは http://ideone.com/zvjKwPです

#include<iostream>

using namespace std;

int main()
{

int n=0,m=0; // 2D array nRow, nCol
int a[n][m];
int i,j; // цикъл въвеждане 2D
int q,p,t; // for 2D=>1D
int b[100];
int r; // for cout
cout<<"Enter the array's number of rows and columns: ";
cin>>n>>m;

// entering values for the 2D array
    for (i = 0;i<=n;i++)
    {
        for (j = 0;j<=m;j++)
        {
            cout<<"a["<<i<<"]["<<j<<"]="<<endl;
            cin>>a[i][j];
            cin.ignore();
        }
    }

  // Most likely the failzone IMO
  for (q = 0;q<=i;q++)
    {
        for (t = 0;t<=i*j+j;t++)
        {
            b[t] = a[i][j];
        }
    }
    // attempting to print the 1D values
     cout<<"The values in the array are"<<"\n";
    for(r=0;r<=t;r++)
    {
        cout<<"b["<<r<<"] = "<<b[r]<<endl;
    }

    cin.get();
    return 0;
    }

失敗したと思うところにコメントを書きました。

また、1D に入る数値を、値 ^2 が 50 より大きい数値に制限する必要があります。ただし、2D=>1D の変換で問題を解決する必要があります。

4

6 に答える 6

7

あなたの推測は正しいです:

サイクルは次のようになります。

for (q = 0; q < n; q++)
{
    for (t = 0; t < m; t++)
    {
        b[q * m + t] = a[q][t];
    }
}

より高い次元の配列の観点から、このような変換を検討する方が常に簡単です。さらに、コードを実際に変更しiたりjb割り当てサイクルで変更したりしていないため、 の異なる配列メンバーに異なる値が割り当てられるとは思わないでくださいb

于 2013-11-11T18:51:46.723 に答える
5

http://www.cplusplus.com/doc/tutorial/arrays/

そのリンクで、疑似多次元配列のセクションを見てください。

添字アルゴリズムが間違っている多くの例を見てきました。疑わしい場合は、トレースしてください。2D 配列の添え字の順序は、0-(HEIGHT*WIDTH-1) の順である必要があります。

#define WIDTH 5
#define HEIGHT 3

int jimmy [HEIGHT * WIDTH];
int n,m;

int main ()
{
  for (n=0; n<HEIGHT; n++)
    for (m=0; m<WIDTH; m++)
    {
      jimmy[n*WIDTH+m]=(n+1)*(m+1);
    }
}
于 2014-06-13T18:29:59.313 に答える
2

まず、1D 配列のサイズは にする必要がありますn*m

サイクルは次のようになります-

int lim = n*m;

for(q = 0; q<lim; ++q) {

    b[q] = a[q/m][q%m];
}
于 2013-11-11T19:10:41.657 に答える
1

このコード

int n=0,m=0; // 2D array nRow, nCol
int a[n][m];

無効です。まず第一に、次元は定数式でなければならず、それらを 0 に設定する意味はありません。

タスクを実行するためのより簡単な方法は、ポインターを使用することです。例えば

int *p = b;

for ( const auto &row : a )
{
    for ( int x : row ) *p++ = x;
}
于 2013-11-11T19:03:38.427 に答える