【C言語】行列の主対角要素と副対角要素を入れ替えるプログラム
問題概要
本記事では、行列の主対角要素(左上から右下へ向かう対角線上の要素)と副対角要素(右上から左下へ向かう対角線上の要素)を入れ替えるC言語プログラムを紹介します。行列のサイズは実行時に入力として受け取ります。
入力された行数 m と列数 n が一致しない場合には「正方行列ではありません」というメッセージを表示します。主対角要素と副対角要素の入れ替えが可能なのは、行数と列数が等しい正方行列に限られるためです。
解決策
行列の対角要素を入れ替えるCプログラムの実装手順は以下の通りです。
対角要素を入れ替えるための基本ロジックは次のようになります。
for (i=0;i<m;++i){
a = ma[i][i];
ma[i][i] = ma[i][m-i-1];
ma[i][m-i-1] = a;
}
このループでは、各行 i について、まず主対角要素 ma[i][i] の値を一時変数 a に退避させ、その後、副対角要素 ma[i][m-i-1] の値と交換しています。これをすべての行に対して繰り返すことで、両対角線上の要素が完全に入れ替わります。
サンプルコード
以下は、行列の主対角要素と副対角要素を入れ替えるC言語プログラムの完全なソースコードです。
#include<stdio.h>
main (){
int i,j,m,n,a;
static int ma[10][10];
printf ("Enter the order of the matrix m and n\n");
scanf ("%dx%d",&m,&n);
if (m==n){
printf ("Enter the co-efficients of the matrix\n");
for (i=0;i<m;++i){
for (j=0;j<n;++j){
scanf ("%d",&ma[i][j]);
}
}
printf ("The given matrix is \n");
for (i=0;i<m;++i){
for (j=0;j<n;++j){
printf (" %d",ma[i][j]);
}
printf ("\n");
}
for (i=0;i<m;++i){
a = ma[i][i];
ma[i][i] = ma[i][m-i-1];
ma[i][m-i-1] = a;
}
printf ("Matrix after changing the \n");
printf ("Main & secondary diagonal\n");
for (i=0;i<m;++i){
for (j=0;j<n;++j){
printf (" %d",ma[i][j]);
}
printf ("\n");
}
}
else
printf ("The given order is not square matrix\n");
}
このプログラムの処理の流れは次の通りです。
- 行列の次数(行数 m と列数 n)をキーボードから入力します。
- m と n が等しい場合、行列の各要素を入力し、元の行列を画面に表示します。
- for ループを使って、主対角要素と副対角要素を一時変数経由で入れ替えます。
- 入れ替え後の行列を表示します。
- m と n が異なる場合は、正方行列ではない旨のメッセージを出力して終了します。
実行結果
上記のプログラムを実際に実行すると、以下のような出力が得られます。
Run 1: Enter the order of the matrix m and n 3x3 Enter the co-efficient of the matrix 1 2 3 4 5 6 7 8 9 The given matrix is 1 2 3 4 5 6 7 8 9 Matrix after changing the Main & secondary diagonal 3 2 1 4 5 6 9 8 7 Run 2: Enter the order of the matrix m and n 4x3 The given order is not square matrix
Run 1 のように 3x3 の正方行列を入力すると、対角要素が正しく入れ替えられた行列が出力され、Run 2 のように 4x3 の非正方行列を入力すると、エラーメッセージが表示されることが確認できます。
-
C++で行列の各列の0の個数に基づいて列をソートし、インデックスを出力する方法
N行M列のサイズを持つ行列が与えられたとき、各列に含まれる0の個数を数え、その個数に基づいて列をソートし、ソート後の列のインデックスを出力するのが課題です。 例えば、1列目に0が1つ含まれ、2列目には0がまったく含まれず、3列目に0が2つ含まれている場合、0の少ない順に並べると出力は「2 1 3」になります。 入力例と出力例 Input: 0 0 0 1 1 1 1 0 1 Output: 1 3 2 解説 上記の入力における各列の0の個数は次のとおり
-
Cプログラムで2次元行列の四隅の要素とその合計を出力する方法
概要 サイズ2×2以上の2次元配列(行列)が与えられたとき、その四隅に格納されているすべての要素を取り出し、合計を求めて出力するのが本記事のテーマです。 四隅の要素とは? 行数「r」、列数「c」(いずれも0から開始)をもつ行列 mat[r][c] を考えると、四隅の要素は次の4つになります。 左上:mat[0][0] 右上:mat[0][c-1] 左下:mat[r-1][0] 右下:mat[r-1][c-1] したがって、求める合計は次の式で表されます。mat[0][0] + mat[0][c-1] + mat[r-1][0] + mat[r-1][c-1]これらの四隅の要素を取得して加算