最低限プログラム4:2次元配列

1. 次のプログラム(もちろん右の解説を除く。またコメント行も無視してよい)を入力してコンパイル・実行せよ
#include<stdio.h>
/* 2次元配列の使い方 */
main()
{
  double a[2][2];       実数配列を宣言
  int i,j;

/*  2次元配列に値をいれる(値自身は意味なし) */
  a[0][0]=0.5;
  a[0][1]=1.0;
  a[1][0]=0.8;
  a[1][1]=2.0;

/* 出力  */
  printf("matrix a:\n");
  for( i=0; i<=1; ++i){
    for( j=0; j<=1; ++j){       二次元配列を出力したいので二重ループ
      printf("  %f",a[i][j]);
    }
    printf("\n");                  一行出力したら改行
  }

/*  2次元配列の各要素の値を二乗する */
  for( i=0; i<1; ++i){             二次元配列なので要素を指定するために
                                     i,jのふたつの変数を使う。
                                     ループも二重になる。
    for( j=0; j<=1; ++j){
       a[i][j] = a[i][j]*a[i][j];       各要素を二乗して、元の配列にいれる
    }
  }

/* 出力  */
  printf("matrix a*a:\n");
  for( i=0; i<=1; ++i){
    for( j=0; j<=1; ++j){       二次元配列を出力したいので二重ループ
      printf("  %f",a[i][j]);
    }
    printf("\n");                  一行出力したら改行
  }
}
2. 次のプログラム(もちろん右の解説を除く。またコメント行も無視してよい)を入力してコンパイル・実行せよ(いきなりプログラムが長くなったが、小さな部品の組み合わせにすぎない)。行列とベクトルの掛け算を習っていなければ、これは飛ばしてよい。
#include<stdio.h>
/* 行列とベクトルの掛け算 */
main()
{
  double a[2][2],x[2],y[2];       実数配列を宣言
  int i,j;

/*  行列に値をいれる(値自身は意味なし) */
  a[0][0]=0.5;
  a[0][1]=1.0;
  a[1][0]=0.8;
  a[1][1]=2.0;

/*  ベクトルに値をいれる(これも意味のない値) */
  x[0]=1.0;
  x[1]=2.0;

/*  ベクトルyを初期化(値を0に) */
  for( i=0; i<=1; ++i){           配列のすべての要素を0にする
     y[i]=0;
  }    

/*  a*xによりyを求める */
  for( i=0; i<1; ++i){             二次元配列なので要素を指定するために
                                     i,jのふたつの変数を使う。
                                     ループも二重になる。
    for( j=0; j<=1; ++j){
       y[i] += a[i][j]*x[j];        行列とベクトルの積の計算はいつもこれ。
                                    a[i][j]とx[j]の積をy[i]に足している。
    }
  }

/* 出力  */
  printf("matrix a:\n");
  for( i=0; i<=1; ++i){
    for( j=0; j<=1; ++j){       二次元配列を出力したいので二重ループ
      printf("  %f",a[i][j]);
    }
    printf("\n");                  一行出力したら改行
  }
  printf("vector x:\n");
  for( i=0; i<=1; ++i){         こちらは一次元配列なので一重ループ
    printf("  %f\n",x[i]);
  }
  printf("vector y=a*x:\n");
  for( i=0; i<=1; ++i){ 
    printf("  %f\n",y[i]);
  }
}
解説 問題
  1. 10行10列の行列を表わす二次元配列を作り、2重ループを使ってn行m列目の要素の値がn*mとなるようにすべての要素に値を代入し、最後に配列の中身を出力するプログラムを作れ

 ひとつ戻る 次へ進む