61003
マクロM，Nを定義して、M✕N行列の和と差を計算するプログラムを作成したいです。

マクロ関数ははじめに `define` で定義することは知っていますが、それからmain関数にどのようなことを書けばいいのかがわかりません。恐らく
`for` 文の中身が変わると考えているのですが、  
`i<2` や `j<3` の箇所を `i＜M`, `j＜N` のように変えるだけでいいのでしょうか。

実行例としては、下のようになればOKです。

**実行例** (3×2行列)

```

    $ ./a.out
    A?
    (1, 1)成分? 1
    (1, 2)成分? 2
    (2, 1)成分? 3
    (2, 2)成分? 4
    (3, 1)成分? 5
    (3, 2)成分? 6
    B?
    (1, 1)成分? 6
    (1, 2)成分? 3
    (2, 1)成分? 4
    (2, 2)成分? 5
    (3, 1)成分? 1
    (3, 2)成分? 2
    A=
      1   2 
      3   4 
      5   6 
    B=
      6   3 
      4   5 
      1   2 
    A+B=
      7   5 
      7   9 
      6   8 
    A-B=
     -5  -1 
     -1  -1 
      4   4 
    $
    
```

マクロを使わずに行列演算するプログラムを示します。

```

    int main(void)
    {
        /*2✕3の行列*/
        int ma[2][3],mb[2][3],mc[2][3];
        int i,j;
        /*行列A*/
        printf("A?\n");
    
        for(i=0;i<2;i++) {
            for(j=0;j<3;j++) {
                printf("(%d,%d)成分?", i+1, j+1);
                scanf("%d",&ma[i][j]);
            }
        }
    
        /*行列B*/
        printf("B?\n");
        for(i=0;i<2;i++) {
            for(j=0;j<3;j++) {
                printf("(%d,%d)成分?", i+1, j+1);
                scanf("%d",&mb[i][j]);
            }
        }
    
       /*A*/
        printf("A= \n");
        for(i=0;i<2;i++) {
                for(j=0;j<3;j++) {
        printf("%3d", ma[i][j]);
    
       }printf("\n");
      }
    
      /*B*/
        printf("B= \n");
        for(i=0;i<2;i++) {
                for(j=0;j<3;j++) {
        printf("%3d", mb[i][j]);
    
       }printf("\n");
      }
       /*A+B*/
        printf("A+B= \n");
        for(i=0;i<2;i++) {
                for(j=0;j<3;j++) {
        printf("%3d", ma[i][j] + mb[i][j]);
    
       }printf("\n");
      }
    
       /*A-B*/
         printf("A-B= \n");
         for(i=0;i<2;i++) {
                for(j=0;j<3;j++) {
        printf("%3d", ma[i][j] - mb[i][j]);          
       }printf("\n");
      }
    }
    
```
CC BY-SA 4.0
2019-11-30T06:47:10.110
60959
2019-12-02T04:31:41.953
2019-12-02T02:27:18.107
3060
36412
question
c
マクロを用いて行列を計算
学校の課題を解かれているということで、「マクロを用いた」行列の計算が最終的に何を求めているのかは出題者にしか分からないのですが、期待する実行結果等から察するに(ご自身でも質問中に追記された通り)  
「行列のサイズ M, N をそれぞれ `define` で定義する」でよいのではないでしょうか。

* * *

プログラムの実行時にユーザーが入力するのは "要素の値" のみで、行列のサイズは固定のようです。  
サイズが同じ2つの行列 A,B
で入力の受け付けと、結果の出力等で繰り返し行列のサイズを参照する必要が出てきますが、後からこの行列のサイズを変えたくなった時に、既存のマクロを使わないプログラムでは個々の
`for` ループをすべて修正しなければいけません。

このような場合に `define` を用いて行列のサイズを **定数** として定義しておけば、プログラムの修正が最小限で済みます。

また、`for` ループの定義部分で `i<2`
のように数字を直接指定してしまうと、後から見返した時にその数字が何を表しているのかが分かりづらくなります。(いわゆる
[マジックナンバー](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%82%B8%E3%83%83%E3%82%AF%E3%83%8A%E3%83%B3%E3%83%90%E3%83%BC_%28%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%29)
等と呼ばれます)

定数として "意味のある" 名前を割り当てておく事で、他人がそのプログラムを見たときでも内容を把握しやすくなります。
CC BY-SA 4.0
2019-12-02T04:31:41.953
61003
2019-12-02T04:31:41.953
3060
60959
answer