C言語で5×5行列の行合計と列合計を計算するプログラム
問題
実行時(ランタイム)にユーザーから値を入力し、5×5の2次元配列(行列)の行ごとの合計と列ごとの合計を計算するCプログラムを作成しましょう。
解決策
このプログラムでは、実行時にコンソールから5×5の行列の要素を1つずつ入力します。二重のforループを組み合わせることで、行方向・列方向それぞれの合計をシンプルなロジックで求めることができます。
行合計を求めるロジック
外側のループ変数 i が行、内側のループ変数 j が列に対応します。1行分の要素をすべて加算したら、合計を表示して変数を0に戻します。
for(i=0;i<5;i++){ // i は行
for(j=0;j<5;j++){ // j は列
row = row + A[i][j]; // 行の合計を計算
}
}
列合計を求めるロジック
逆に、外側で j(列)、内側で i(行)を回すことで、同じ列番号の要素を縦方向に加算できます。
for(j=0;j<5;j++){ // j は列
for(i=0;i<5;i++){ // i は行
column = column + A[i][j];
}
}
サンプルコード全体
以下が完全なCプログラムです。
#include <stdio.h>
void main(){
// 配列と変数の宣言 //
int A[5][5], i, j, row=0, column=0;
// 実行時に要素を読み込む //
printf("Enter elements into the array : \n");
for(i=0;i<5;i++){
for(j=0;j<5;j++){
printf("A[%d][%d] : ", i, j);
scanf("%d", &A[i][j]);
}
}
// 各行の要素の合計を計算 //
for(i=0;i<5;i++){
for(j=0;j<5;j++){
row = row + A[i][j];
}
printf("The sum of elements in row number %d is : %d\n", i, row);
row = 0; // 次の行の計算のためにリセット
}
// 各列の要素の合計を計算 //
for(j=0;j<5;j++){
for(i=0;i<5;i++){
column = column + A[i][j];
}
printf("The sum of elements in column number %d is : %d\n", j, column);
column = 0; // 次の列の計算のためにリセット
}
}
実行結果
1〜25までの数値を順番に入力した場合の実行例です。
Enter elements into the array : A[0][0] : 1 A[0][1] : 2 A[0][2] : 3 A[0][3] : 4 A[0][4] : 5 A[1][0] : 6 A[1][1] : 7 A[1][2] : 8 A[1][3] : 9 A[1][4] : 10 A[2][0] : 11 A[2][1] : 12 A[2][2] : 13 A[2][3] : 14 A[2][4] : 15 A[3][0] : 16 A[3][1] : 17 A[3][2] : 18 A[3][3] : 19 A[3][4] : 20 A[4][0] : 21 A[4][1] : 22 A[4][2] : 23 A[4][3] : 24 A[4][4] : 25 The sum of elements in row number 0 is : 15 The sum of elements in row number 1 is : 40 The sum of elements in row number 2 is : 65 The sum of elements in row number 3 is : 90 The sum of elements in row number 4 is : 115 The sum of elements in column number 0 is : 55 The sum of elements in column number 1 is : 60 The sum of elements in column number 2 is : 65 The sum of elements in column number 3 is : 70 The sum of elements in column number 4 is : 75
注意点:よくあるバグ
元のコードでは、列合計を表示する際に %d の引数として j ではなく i を渡していました。この場合、内側のループ終了後の i の値(5)が常に表示され、すべての出力が「column number 5」になってしまいます。また、入力が行われていない状態で未初期化の領域を参照すると、環境依存の不定な値(ガベージ値)が出力されることもあります。列番号を正しく表示するには、必ず j を渡すようにしてください。
補足
- 行・列それぞれの合計用変数(
row/column)は、1行(1列)の計算が終わるたびに必ず0へリセットします。 - 現代のC標準では
void main()ではなくint main(void)を使用し、最後にreturn 0;を返すことが推奨されています。 - 配列サイズを
#define N 5のようなマクロで定義しておくと、任意のサイズへ拡張しやすくなります。
-
【C言語】奇数次正方行列の中央の行と列の積を求める方法
はじめに 正方行列 mat[row][column](行数と列数が等しい行列)を考えます。このとき、行と列の長さが奇数、つまり 2 で割り切れない値である場合、その行列の中央の行と中央の列に含まれる各要素の積を求めるのが本記事の目的です。 たとえば下図のような 3×3 の行列では、2 行目が中央の行、2 列目が中央の列に相当します。 制約条件 入力は必ず正方行列(行数 = 列数)であること。 行と列の長さは必ず奇数であること。 入出力例 例 1 入力: mat[][] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}} 出力: 中央の行の積 = 120 中央の列の積
-
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]これらの四隅の要素を取得して加算