Ex09Ans

From Prog0

Jump to: navigation, search

演習第9回

Contents

解答例

A問題

A-1 行列の主対角線にある要素値

ファイル名: ex09a1.c

#include <stdio.h>

int main()
{
  int i, j, mat[][3]={{1, 2, 3},
                      {4, 5, 6},
                      {7, 8, 9}};
  
  for (i=0;i<3; i++){
    for (j=0;j<3; j++){
      printf("%d ", mat[i][j]);
    }
    printf("\n");  
  }

  printf("行列の主対角線にある要素値\n");
  for (i=0;i<3; i++){
    printf("%d ", mat[i][i]);
  }
  printf("\n");  
 
  return 0; 
}

A-2 配列形状の変換

ファイル名: ex09a2.c

#include <stdio.h> 
 
int main()
{
 int i, j, m, n;
 int mat1[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};
 int mat2[3][4];
 
 printf("4x3行列の表示\n");
 for (i=0; i<4; i++){
   for (j=0; j<3; j++){
     printf("%2d ", mat1[i][j]); 
   }
   printf("\n");
 }
 
 /* 4x3行列から3x4行列への変換 */
 for (i=0; i<4; i++){
   for (j=0; j<3; j++){ 
     m = (3*i+j)/4;
     n = (3*i+j)%4;
     mat2[m][n] = mat1[i][j];
   } 
 }
 
 printf("配列形状変換後の3×4行列の表示\n");
 for (i=0; i<3; i++){
   for (j=0; j<4; j++){
     printf("%2d ", mat2[i][j]); 
   }
   printf("\n");
  }
 
return 0;
}

A-3 行列の積とマクロ

ファイル名: ex09a3.c

#include <stdio.h>
#define ROW 3
#define COL 2

int main()
{
  int i, j; 
  int A[ROW][COL], B[COL][ROW];

  /* 配列要素への入力 */
  printf("3 x 2行列Aを整数値で入力してください\n");
  for (i=0; i<ROW; i++){
    for (j=0; j<COL; j++){
      scanf("%d", &A[i][j]);
    }
  }

  printf("2 x 3行列Bを整数値で入力してください\n");
  for (i=0; i<COL; i++){
    for (j=0; j<ROW; j++){
      scanf("%d", &B[i][j]);
    }
  }

  /* 行列の積の計算と表示 */
  printf("行列の積:\n");
  for (i=0; i<ROW; i++){
    for (j=0; j<ROW; j++){
      printf("%3d ", A[i][0]*B[0][j] + A[i][1]*B[1][j]);
    }
    printf("\n");
  }
 
  return 0; 
}

B問題

B-1 2次元配列から1次元配列への変換

ファイル名: ex09b1.c

#include <stdio.h>

int main()
{
  int i, j;
  int matrix[ ][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
  int array[9];
  
  printf("2次元配列[matrix]の内容:\n"); /* 1次元配列への移し替えも行う */
  for(i = 0; i < 3; i++){
    for(j = 0; j < 3; j++){
      printf("%d ", matrix[i][j]);
      array[i*3+j] = matrix[i][j];
  }
    printf("\n");
  }

  printf("配列[array]の内容:\n");
  for(i = 0; i < 9; i++){
      printf("%d ", array[i]);
  }
  printf("\n");
 
  return 0;
}

B-2 行列要素の抜き出し

ファイル名: ex09b2.c

#include <stdio.h>
#define ROW 4
#define COL 3

int main()
{
  int i, j, mode, sel;
  int mat[ROW][COL]={{1, 2, 3},{4, 5, 6},{7, 8, 9},{10, 11, 12}};
 
  printf("行要素と列要素のどちらを表示したいか選択して下さい\n");
  printf("(行要素:0, 列要素:1)  ");
  scanf("%d", &mode);

  if (mode==0) {
    printf("表示したい行番号を入力して下さい :");
    scanf("%d",&sel);
    if (sel >= 0 && sel<ROW){
      for (j=0; j<COL; j++){
        printf("%2d ", mat[sel][j]);
      }
    }else{
      printf("行の範囲外です");
    }
      printf("\n");
  } else if (mode==1) {
    printf("表示したい列番号を入力して下さい :");
    scanf("%d",&sel);
    if (sel >=0 && sel<COL){
      for (i=0; i<ROW; i++){
          printf("%2d\n", mat[i][sel]);
      }
    }else{
      printf("列の範囲外です\n");
    }
  } else {
    for (i=0; i<ROW; i++) {
      for (j=0; j<COL; j++) {
        printf("%2d ",mat[i][j]);
      }
      printf("\n");
    }
  }

  return 0;
}

B-3 行列の反転

ファイル名: ex09b3.c

#include <stdio.h>
#define N 5

int main()
{
  int i, j, r;
  int mat[5][5] = {{1, 1, 1, 1, 1},
                   {0, 1, 1, 1, 1},
                   {0, 0, 1, 1, 1},
                   {0, 0, 0, 1, 1},
                   {0, 0, 0, 0, 1}};
  
  printf("反転する方向を指定してください(縦:0、横:1)");
  scanf("%d", &r); 

  if (r == 0) {
    for (i = N-1; i >= 0; i--) {
      for (j = 0; j < N; j++) {
        printf("%d ", mat[i][j]);
      }
      printf("\n");
    }
  } else if (r == 1) {
    for (i = 0; i < N; i++) {
      for (j = N-1; j >= 0; j--) {
        printf("%d ", mat[i][j]);
      }
      printf("\n");
    }
  } else {
    printf("不適切な数値が入力されました\n");
  }

  return 0;
}

Extra問題

E-1 〇×三目並べゲーム

ファイル名: ex09e1.c

#include <stdio.h>
#define NUM 3

int main()
{
  int map[NUM][NUM];
  int i, j, m, n;
  int flag = 0;
  int endflag;
  int sum;
  int win = 0;

  /* 配列の初期化 */
  for (i=0; i<NUM; i++)
    for (j=0; j<NUM; j++)
      map[i][j] = 0;

  while (1) {
    /* 盤の表示 */
    for (i=0; i<NUM; i++) {
      for (j=0; j<NUM; j++) {
        if (map[i][j]==1) printf("(%d %d) 〇 ", i, j);
        else if (map[i][j]==-1) printf("(%d %d) × ", i, j);
        else printf("(%d %d)   ", i, j);
      }
      printf("\n");
    }

    /* 終了判定(勝敗が決まった時) */
    /*  行チェック */
    for (i=0; i<NUM; i++) {
      sum = 0;
      for (j=0; j<NUM; j++) {
        sum += map[i][j];
      }
      if (sum==NUM) win = 1;
      if (sum==-NUM) win = -1;
    }
	
    /*  列チェック */
    for (j=0; j<NUM; j++) {
      sum = 0;
      for (i=0; i<NUM; i++) {
        sum += map[i][j];
      }
      if (sum==NUM) win = 1;
      if (sum==-NUM) win = -1;
    }

    /*  右下がり斜めチェック */
    sum = 0;
    for (i=0; i<NUM; i++) {
      sum += map[i][i];
    }
    if (sum==NUM) win = 1;
    if (sum==-NUM) win = -1;

    /*  左下がり斜めチェック */
    sum = 0;
    for (i=0; i<NUM; i++) {
      sum += map[i][NUM-i-1];
    }
    if (sum==NUM) win = 1;
    if (sum==-NUM) win = -1;
    if (win==1) {printf("〇の勝ち!!\n"); break;}
    else if (win==-1) {printf("×の勝ち!!\n"); break;}

    /* 終了判定(盤面が埋まった時) */
    endflag = 0;
    for (i=0; i<NUM; i++)
      for (j=0; j<NUM; j++)
        if (map[i][j]==0) endflag = 1;
    if (endflag==0) {
      printf("引き分け\n");
      break;
    }

    /* 座標の入力 */
    if (flag==0) {
      printf("〇の番です\n座標を行・列の順で入力してください:");
      scanf("%d%d", &m, &n);
      if (m<0 || m>=NUM || n<0 || n>=NUM) {
        printf("盤の範囲外です\n");
        continue;
      }
      if (map[m][n]!=0) {
        printf("そこには打てません!\n");
        continue;
      }
      map[m][n] = 1;
      flag = 1;
    } else {
      printf("×の番です\n座標を行・列の順で入力してください:");
      scanf("%d%d", &m, &n);
      if (m<0 || m>=NUM || n<0 || n>=NUM) {
    	 printf("盤の範囲外です\n");
        continue;}
      if (map[m][n]!=0) {
    	 printf("そこには打てません!\n");
        continue;
      }
      map[m][n] = -1;
      flag = 0;
     }
  }

  return 0;
}
Personal tools