3

これは、動的に C で行列 (2D 配列) を作成し、ユーザー入力をその要素に読み込む唯一の方法です。

  • x各ポインターがマトリックス内の行を表すポインターの配列へのポインターを作成すると、マトリックス内xの行の数 (高さ) になります。

  • この配列内の各ポインターをy要素を持つ配列にポイントします。ここyで、 は行列の列数 (幅) です。


int main()
{

  int i, j, lines, columns, **intMatrix;

  printf("Type the matrix lines:\t");
  scanf("%d", &lines);
  printf("Type the matrix columns:\t");
  scanf("%d", &columns);

  intMatrix = (int **)malloc(lines * sizeof(int *)); 
  //pointer to an array of [lines] pointers

  for (i = 0; i < lines; ++i)
      intMatrix[i] = (int *)malloc(columns * sizeof(int)); 
      //pointer to a single array with [columns] integers

  for (i = 0; i < lines; ++i)
  {
      for (j = 0; j < columns; ++j)
      {
        printf("Type a number for <line: %d, column: %d>\t", i+1, j+1);
        scanf("%d", &intMatrix[i][j]);
      }
  }

これを行う他の方法はありますか?

4

3 に答える 3

5

このように試すことができます

int main()
{    
  int i, j, lines, columns, *intMatrix;

  printf("Type the matrix lines:\t");
  scanf("%d", &lines);
  printf("Type the matrix columns:\t");
  scanf("%d", &columns);

  intMatrix = (int *)malloc(lines * columns * sizeof(int)); 

  for (i = 0; i < lines; ++i)
  {
      for (j = 0; j < columns; ++j)
      {
        printf("Type a number for <line: %d, column: %d>\t", i+1, j+1);
        scanf("%d", &intMatrix[i*lines + j]);
      }
  }
于 2012-10-05T13:55:21.140 に答える
2

C99 以降 (C++ を除く) では、可変長配列を使用できます。

int main()
{    
  int i, j, lines, columns;

  printf("Type the matrix lines:\t");
  scanf("%d", &lines);
  printf("Type the matrix columns:\t");
  scanf("%d", &columns);

  {
    int intMatrix[lines][columns];

    for (i = 0; i < lines; ++i)
    {
        for (j = 0; j < columns; ++j)
        {
          printf("Type a number for <line: %d, column: %d>\t", i+1, j+1);
          scanf("%d", &intMatrix[i][j]);
        }
    }
  }
}

または、次のようにします。

void readData (int lines, int columns, int array[lines][columns])
{
  int i, j;

  for (i = 0; i < lines; ++i)
  {
      for (j = 0; j < columns; ++j)
      {
        printf("Type a number for <line: %d, column: %d>\t", i+1, j+1);
        scanf("%d", &array[i][j]);
      }
  }
}

int main()
{
  int lines, columns;

  printf("Type the matrix lines:\t");
  scanf("%d", &lines);
  printf("Type the matrix columns:\t");
  scanf("%d", &columns);

  {
    int intMatrix[lines][columns];

    readData (lines, columns, intMatrix);
  }
}

ただし、どちらの場合も、配列データはすべてヒープではなくスタックに格納されるため、適切に格納する方法がなく、構造体や malloc されたものに配置することはできません。

于 2012-10-05T14:22:26.910 に答える
0
struct matrix {
    type *mem;
};

struct matrix* matrix_new () {
    struct matrix *M = malloc (sizeof(matrix));
    M->mem = malloc (sizeof (type) * rows * cols);
    return M;
}

reallocmemcpymemmoveおよびを使用freeして、配列のチャンクを変更します。単一の要素にアクセスするには、次のようなものを使用するか、優先するもの (mem[row*cols+col]または行mem[rows*col+row]と列を定義するもの) に依存します。

于 2012-10-05T13:56:14.527 に答える