行列(ベクトル)

[C言語] 入力した行列を画面に表示する

C言語で行列を入力し、画面に表示する方法について解説します。

行列は二次元配列として表現され、ユーザーからの入力を受け取る際には、scanf関数を用いて各要素を取得します。

その後、printf関数を使用して、行列の各要素を整形して出力します。

このプロセスにより、ユーザーは行列の内容を視覚的に確認することができます。

行列のサイズや要素の型に応じて、コードを適切に調整することが重要です。

行列の入力方法

行列をC言語で扱う際には、まず行列のデータをどのように入力するかが重要です。

ここでは、標準入力、ファイルからの入力、そしてユーザー定義関数を用いた入力方法について解説します。

標準入力からの行列入力

標準入力を用いて行列を入力する方法は、最も基本的な方法です。

scanf関数を使用して、ユーザーから行列の要素を入力します。

#include <stdio.h>
int main() {
    int rows, cols;
    printf("行数と列数を入力してください: ");
    scanf("%d %d", &rows, &cols);
    int matrix[rows][cols];
    printf("行列の要素を入力してください:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            scanf("%d", &matrix[i][j]);
        }
    }
    printf("入力された行列:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
    return 0;
}
行数と列数を入力してください: 2 3
行列の要素を入力してください:
1 2 3
4 5 6
入力された行列:
1 2 3
4 5 6

このプログラムでは、まず行数と列数をユーザーから入力し、その後に行列の各要素を入力します。

最後に、入力された行列を表示します。

ファイルからの行列入力

ファイルから行列を入力する方法は、データが大きい場合や複数回の入力が必要な場合に便利です。

fscanf関数を使用して、ファイルから行列の要素を読み込みます。

#include <stdio.h>
int main() {
    FILE *file = fopen("matrix.txt", "r");
    if (file == NULL) {
        printf("ファイルを開けませんでした。\n");
        return 1;
    }
    int rows, cols;
    fscanf(file, "%d %d", &rows, &cols);
    int matrix[rows][cols];
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            fscanf(file, "%d", &matrix[i][j]);
        }
    }
    fclose(file);
    printf("ファイルから読み込んだ行列:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
    return 0;
}
ファイルから読み込んだ行列:
1 2 3
4 5 6

このプログラムでは、matrix.txtというファイルから行列のデータを読み込みます。

ファイルが開けない場合はエラーメッセージを表示します。

ユーザー定義関数を用いた入力

ユーザー定義関数を用いることで、行列の入力処理を再利用可能にし、コードの可読性を向上させることができます。

#include <stdio.h>
void inputMatrix(int rows, int cols, int matrix[rows][cols]) {
    printf("行列の要素を入力してください:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            scanf("%d", &matrix[i][j]);
        }
    }
}
int main() {
    int rows, cols;
    printf("行数と列数を入力してください: ");
    scanf("%d %d", &rows, &cols);
    int matrix[rows][cols];
    inputMatrix(rows, cols, matrix);
    printf("入力された行列:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
    return 0;
}
行数と列数を入力してください: 2 3
行列の要素を入力してください:
1 2 3
4 5 6
入力された行列:
1 2 3
4 5 6

このプログラムでは、inputMatrixという関数を定義し、行列の入力処理をその中にまとめています。

これにより、行列の入力処理を簡潔に再利用できます。

行列の表示方法

行列をC言語で表示する際には、標準出力を用いるのが一般的です。

ここでは、標準出力への基本的な表示方法、フォーマットを指定した表示方法、そして表示における注意点について解説します。

標準出力への行列表示

標準出力を用いて行列を表示する方法は、printf関数を使用して行列の各要素を順に出力します。

#include <stdio.h>
void displayMatrix(int rows, int cols, int matrix[rows][cols]) {
    printf("行列の内容:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
}
int main() {
    int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};
    displayMatrix(2, 3, matrix);
    return 0;
}
行列の内容:
1 2 3
4 5 6

このプログラムでは、displayMatrix関数を用いて行列の内容を標準出力に表示しています。

各行の要素をスペースで区切り、行の終わりには改行を入れています。

フォーマットを指定した表示

行列の表示を見やすくするために、フォーマットを指定することができます。

printf関数のフォーマット指定子を用いて、各要素の表示幅を調整します。

#include <stdio.h>
void displayFormattedMatrix(int rows, int cols, int matrix[rows][cols]) {
    printf("フォーマットを指定した行列の内容:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%4d", matrix[i][j]);  // 各要素を4桁幅で表示
        }
        printf("\n");
    }
}
int main() {
    int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};
    displayFormattedMatrix(2, 3, matrix);
    return 0;
}
フォーマットを指定した行列の内容:
   1   2   3
   4   5   6

このプログラムでは、%4dを使用して各要素を4桁幅で表示しています。

これにより、行列の各列が揃い、見やすくなります。

行列の表示における注意点

行列を表示する際には、いくつかの注意点があります。

  • 要素の幅を揃える: 行列の各列が揃うように、フォーマット指定子を用いて表示幅を調整することが重要です。

これにより、行列の構造が視覚的に明確になります。

  • 大きな行列の表示: 行列が大きい場合、全てを一度に表示すると見づらくなることがあります。

必要に応じて、部分的に表示するか、スクロール可能な形式で表示することを検討してください。

  • データ型の一致: 行列の要素のデータ型とprintfのフォーマット指定子が一致していることを確認してください。

例えば、int型の要素を表示する際には%dを使用します。

これらのポイントを押さえることで、行列の表示をより効果的に行うことができます。

行列表示の実装例

行列を表示するプログラムを実装する際には、基本的な方法から動的メモリを使用する方法、エラーチェックを含む方法まで様々なアプローチがあります。

ここでは、それぞれの実装例を紹介します。

基本的な行列表示プログラム

基本的な行列表示プログラムでは、固定サイズの配列を用いて行列を表示します。

#include <stdio.h>
void displayMatrix(int rows, int cols, int matrix[rows][cols]) {
    printf("行列の内容:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
}
int main() {
    int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};
    displayMatrix(2, 3, matrix);
    return 0;
}
行列の内容:
1 2 3
4 5 6

このプログラムは、固定サイズの2×3行列を表示します。

displayMatrix関数を用いて、行列の内容を標準出力に表示しています。

動的メモリを使用した行列表示

動的メモリを使用することで、実行時に行列のサイズを決定し、柔軟に行列を扱うことができます。

#include <stdio.h>
#include <stdlib.h>
void displayMatrix(int rows, int cols, int **matrix) {
    printf("動的メモリを使用した行列の内容:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
}
int main() {
    int rows = 2, cols = 3;
    int **matrix = (int **)malloc(rows * sizeof(int *));
    for (int i = 0; i < rows; i++) {
        matrix[i] = (int *)malloc(cols * sizeof(int));
    }
    // 行列の初期化
    int count = 1;
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            matrix[i][j] = count++;
        }
    }
    displayMatrix(rows, cols, matrix);
    // メモリの解放
    for (int i = 0; i < rows; i++) {
        free(matrix[i]);
    }
    free(matrix);
    return 0;
}
動的メモリを使用した行列の内容:
1 2 3
4 5 6

このプログラムでは、mallocを用いて動的にメモリを確保し、行列を表示しています。

使用後はfreeを用いてメモリを解放することが重要です。

エラーチェックを含む行列表示

エラーチェックを含む行列表示プログラムでは、入力やメモリ確保の際にエラーが発生した場合に適切に対処します。

#include <stdio.h>
#include <stdlib.h>
void displayMatrix(int rows, int cols, int **matrix) {
    printf("エラーチェックを含む行列の内容:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
}
int main() {
    int rows = 2, cols = 3;
    int **matrix = (int **)malloc(rows * sizeof(int *));
    if (matrix == NULL) {
        printf("メモリの確保に失敗しました。\n");
        return 1;
    }
    for (int i = 0; i < rows; i++) {
        matrix[i] = (int *)malloc(cols * sizeof(int));
        if (matrix[i] == NULL) {
            printf("メモリの確保に失敗しました。\n");
            return 1;
        }
    }
    // 行列の初期化
    int count = 1;
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            matrix[i][j] = count++;
        }
    }
    displayMatrix(rows, cols, matrix);
    // メモリの解放
    for (int i = 0; i < rows; i++) {
        free(matrix[i]);
    }
    free(matrix);
    return 0;
}
エラーチェックを含む行列の内容:
1 2 3
4 5 6

このプログラムでは、メモリ確保時にNULLチェックを行い、エラーが発生した場合にはメッセージを表示してプログラムを終了します。

これにより、メモリ不足などのエラーに対処できます。

応用例

行列の基本的な表示方法を学んだ後は、行列の操作を行い、その結果を表示する応用例を見ていきましょう。

ここでは、行列の転置、加算、乗算の各操作を行い、その結果を表示する方法を紹介します。

行列の転置と表示

行列の転置とは、行と列を入れ替える操作です。

以下のプログラムでは、行列を転置して表示します。

#include <stdio.h>
void transposeMatrix(int rows, int cols, int matrix[rows][cols], int transposed[cols][rows]) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            transposed[j][i] = matrix[i][j];
        }
    }
}
void displayMatrix(int rows, int cols, int matrix[rows][cols]) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
}
int main() {
    int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};
    int transposed[3][2];
    transposeMatrix(2, 3, matrix, transposed);
    printf("転置された行列:\n");
    displayMatrix(3, 2, transposed);
    return 0;
}
転置された行列:
1 4
2 5
3 6

このプログラムでは、transposeMatrix関数を用いて行列を転置し、displayMatrix関数で結果を表示しています。

行列の加算と表示

行列の加算は、同じサイズの行列同士の対応する要素を加算する操作です。

以下のプログラムでは、2つの行列を加算して表示します。

#include <stdio.h>
void addMatrices(int rows, int cols, int matrix1[rows][cols], int matrix2[rows][cols], int result[rows][cols]) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            result[i][j] = matrix1[i][j] + matrix2[i][j];
        }
    }
}
void displayMatrix(int rows, int cols, int matrix[rows][cols]) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
}
int main() {
    int matrix1[2][3] = {{1, 2, 3}, {4, 5, 6}};
    int matrix2[2][3] = {{7, 8, 9}, {10, 11, 12}};
    int result[2][3];
    addMatrices(2, 3, matrix1, matrix2, result);
    printf("加算された行列:\n");
    displayMatrix(2, 3, result);
    return 0;
}
加算された行列:
8 10 12
14 16 18

このプログラムでは、addMatrices関数を用いて2つの行列を加算し、displayMatrix関数で結果を表示しています。

行列の乗算と表示

行列の乗算は、行列の行と列を掛け合わせる操作です。

以下のプログラムでは、2つの行列を乗算して表示します。

#include <stdio.h>
void multiplyMatrices(int rows1, int cols1, int matrix1[rows1][cols1], int rows2, int cols2, int matrix2[rows2][cols2], int result[rows1][cols2]) {
    for (int i = 0; i < rows1; i++) {
        for (int j = 0; j < cols2; j++) {
            result[i][j] = 0;
            for (int k = 0; k < cols1; k++) {
                result[i][j] += matrix1[i][k] * matrix2[k][j];
            }
        }
    }
}
void displayMatrix(int rows, int cols, int matrix[rows][cols]) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
}
int main() {
    int matrix1[2][3] = {{1, 2, 3}, {4, 5, 6}};
    int matrix2[3][2] = {{7, 8}, {9, 10}, {11, 12}};
    int result[2][2];
    multiplyMatrices(2, 3, matrix1, 3, 2, matrix2, result);
    printf("乗算された行列:\n");
    displayMatrix(2, 2, result);
    return 0;
}
乗算された行列:
58 64
139 154

このプログラムでは、multiplyMatrices関数を用いて2つの行列を乗算し、displayMatrix関数で結果を表示しています。

行列の乗算では、最初の行列の列数と2番目の行列の行数が一致している必要があります。

まとめ

行列の入力と表示に関する基本的な方法から応用例までを学ぶことで、C言語での行列操作の基礎を理解することができます。

振り返ると、行列の入力方法、表示方法、そして応用的な操作を通じて、行列を効果的に扱うための知識を得ることができました。

これを機に、さらに複雑な行列操作やアルゴリズムに挑戦し、プログラミングスキルを向上させてみてください。

関連記事

Back to top button