Ex09Ans
From Prog0
演習第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 2次元配列から1次元配列への変換
ファイル名: ex09a2.c
#include <stdio.h> int main() { int i, j; /* 以下の形式で初期化された2次元配列の行数がどうなるかはハンドアウトLec09-13を参照すること */ 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; }
A-3 行列とマクロ
ファイル名: ex09a3a.c, ex09a3b.c
ex09a3a.c
#include <stdio.h> #define ROW 3 #define COL 2 int main() { int i, j; int mat1[ROW][COL],mat2[ROW][COL],mat3[ROW][COL]; printf("%d x %d 行列[mat1]の要素を入力してください:\n", ROW, COL); for(i = 0; i < ROW; i++) for(j = 0; j < COL; j++) scanf("%d", &mat1[i][j]); printf("%d x %d 行列[mat2]の要素を入力してください:\n", ROW, COL); for(i = 0; i < ROW; i++) for(j = 0; j < COL; j++) scanf("%d", &mat2[i][j]); for(i = 0; i < ROW; i++) { for(j = 0; j < COL; j++) { mat3[i][j] = mat1[i][j] + mat2[i][j]; } } printf("[mat1]と[mat2]の和は:\n"); for(i = 0; i < ROW; i++){ for(j = 0; j < COL; j++){ printf("%2d ", mat3[i][j]); } printf("\n"); } return 0; }
ex09a3b.c
#include <stdio.h> #define ROW 4 #define COL 3 int main() { int i, j; int mat1[ROW][COL],mat2[ROW][COL],mat3[ROW][COL]; printf("%d x %d 行列[mat1]の要素を入力してください:\n", ROW, COL); for(i = 0; i < ROW; i++) for(j = 0; j < COL; j++) scanf("%d", &mat1[i][j]); printf("%d x %d 行列[mat2]の要素を入力してください:\n", ROW, COL); for(i = 0; i < ROW; i++) for(j = 0; j < COL; j++) scanf("%d", &mat2[i][j]); for(i = 0; i < ROW; i++) { for(j = 0; j < COL; j++) { mat3[i][j] = mat1[i][j] + mat2[i][j]; } } printf("[mat1]と[mat2]の和は:\n"); for(i = 0; i < ROW; i++){ for(j = 0; j < COL; j++){ printf("%2d ", mat3[i][j]); } printf("\n"); } return 0; }
B問題
B-1 配列形状の変換
#include <stdio.h> int main() { int i, j, m, n; int inarray[12]={1,2,3,4,5,6,7,8,9,10,11,12}; int mat1[4][3], mat2[3][4]; /* 1次元配列から4x3配列への変換 */ for (i=0; i<4; i++){ for (j=0; j<3; j++){ mat1[i][j]=inarray[i*3+j]; } } printf("1次元配列から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("4x3配列から3x4配列への変換結果\n"); for (i=0; i<3; i++){ for (j=0; j<4; j++){ printf("%2d ", mat2[i][j]); } 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> int main() { int i, j; int A[3][2], B[2][3]; /* 配列要素への入力 */ printf("3 x 2行列Aを整数値で入力してください\n"); for (i=0; i<3; i++){ for (j=0; j<2; j++){ scanf("%d", &A[i][j]); } } printf("\n2 x 3行列Bを整数値で入力してください\n"); for (i=0; i<2; i++){ for (j=0; j<3; j++){ scanf("%d", &B[i][j]); } } /* 行列の積の計算と表示 */ printf("\n行列の積:\n"); for (i=0; i<3; i++){ for (j=0; j<3; j++){ printf("%3d ", (A[i][0]*B[0][j] + A[i][1]*B[1][j])); } 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; }