# 本番試験レベル問題1 解答解説 ## 解説 ### 細分化 ![](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[n][n]$に行列xのn行、n列のそれぞれの要素を格納(行列の要素の入力)** - 行を表す変数を整数型のi、列を表す変数を整数型のjとする。 - 変数i、jともにn行までfor文でループさせ、行列$x$の要素を読み取る。 * **対角成分か否かで場合分け** - 変数i、jともにn行までfor文でループさせながら、以下の処理を行う。 - 対角成分が0のときはcheck$==$trueのままなので、対角以外の成分が0か否かで場合分けを行う。   - 対角以外の成分が1のときはcheckにfalseを代入   - 対角以外の成分が0のときはcheck$==$trueのままなので、<br>条件分岐では考えなくて良い。 * 出力 - checkの値を出力 - check$==$trueなら1を出力 - check$==$falseなら0を出力 ## 解答例 ``` #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]に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; } ```