# プログラミング基礎WS問題 ## 問題文(試験レベル問題) 整数型2次元配列$x[n][n]$($n$は定数)を正方行列と考える。 正方行列$x$と$n$のサイズを入力から読み取り、boolean型の変数$check$を用いて対角行列かどうか判定するプログラムを作成しなさい。このとき、$n$は3以上5以下とする。 正方行列$x[n][n]$(Nは定数)が対角行列であれば1を出力し、そうでなければ0を出力しなさい。ただし, 0≤行列の要素≤9と仮定してよいものとする。<br>なお、boolean型を用いる場合は<stdbool.h>を含める必要があり、boolean型は$true$の場合は1を、$false$の場合は0を出力する。<br>また、対角行列とは、正方行列$A$で$Aij=0(i≠j)$の行列のことをいう。 ## 入力 入力は以下の形式で標準入力から与えられる。 ``` N a b c d e f g h i ``` ## 出力 問題文の指示に従って対角行列か判定し、対角ならば1、対角でないならば0を出力せよ ## 入力例1 ``` 3 2 0 0 0 3 0 0 0 4 ``` ## 出力例1 ``` 1 ``` ## 入力例2 ``` 4 5 0 0 0 0 2 0 0 0 2 1 0 0 0 0 2 ``` ## 出力例2 ``` 0 ``` ## 入力例3 ``` 5 8 0 0 0 0 0 9 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 0 5 ``` ## 出力例3 ``` 1 ``` # 解答例 ``` #include <stdio.h> #include <stdbool.h> boolean型を用いるのに必要 int main(void) { /*行列の要素数の宣言*/ int n; scanf("%d", &n); //入力から行列のサイズnを読み取る int x[n][n]; //行列xを2重配列x[n][n]で定義 bool check = true; //boolean型の変数宣言(true==1,false==0) /*2重配列x[][]にn行、n列のそれぞれの要素を格納*/ for (int i = 0; i < n; i++) {  //iをn行まで繰り返す for (int j = 0; j < n; j++) {  //jをn列まで繰り返す scanf("%d", &x[i][j]); //行列の要素を読み取る /*対角以外の成分が0か否か*/ if(i != j){   if (x[i][j] != 0) {  //対角成分以外の場合   check = false;   //i≠jのとき、x[i][j]≠0ならばcheckにfalse代入   } } } } /*checkを出力*/ printf("%d", check);  //check==trueなら1を出力 //check==falseなら0を出力 return 0; } ``` ## 解説 ### 細分化 ![](https://i.imgur.com/IKsOws2.png) ### 手順 - 行列のサイズnの入力、行列xや変数checkの宣言 - 最初にキーボードから正の整数行列のサイズnを読み込む。これをnとする。 - 行列$x$を整数型で宣言するので、データ型はint型を持ち、<br>行列$x$は要素数nの2重配列$x[n][n]$として定義する。 - 対角化判定のためのboolean型変数check=trueを宣言する。 - • #include <stdbool.h>を入れる - 2重配列x[][]に行列xのn行、n列のそれぞれの要素を格納(行列の要素の入力) - 行を表す変数を整数型のi、列を表す変数を整数型のjとする。 - i、jともにn行までfor文でループさせ、行列$x$の要素を読み取る。 * 対角成分か否かで場合分け - i、jともにn行までfor文でループさせながら、以下の処理を行う。 - 対角成分が0のときはcheck==trueのまま - 対角以外の成分が0か否かで場合分け   - 対角以外の成分が1のときはcheckにfalseを代入   - 対角以外の成分が0のときはcheck==trueのまま * 出力 - checkの値を出力 - check==trueなら1を出力 - check==falseなら0を出力