分からない、知らないを解決する

poruka blog

c言語で正方行列の積を計算してみた!

どうも、porukaです。

 

C言語を用いて、正方行列を二つ入力すると、その積を勝手に計算してくれるものを作りました。

このソースコードを読めるようになると、少しはポインターの理解が深まるかと思います。

 

 

正方行列の行と列の大きさは、自由に変更可能です。

↓入力の順番、結果の出力までの流れは以下のようになっています。↓

  1. コンパイルして、行と列の数(大きさ)をインプットします。
  2. 一つ目の行列の左上の値から、順番に値を入力していきます。
  3. 二つ目の行列の値を同じように右上の値から、順番に入力していきます。
  4. 入力が終わると、結果が自動的に出てきます。

 

 

ソースコードです。

#include <stdio.h>
#include <stdlib.h>


//行列の入力
void input(int num,int** numbers){
    for (int i=1; i<=num; i++) {
                printf("%dline\n",i);
        for (int j=1; j<=num; j++) {
            printf("%dcolumn:",j);
            scanf("%d",&numbers[i-1][j-1]);
        }
    }
}

//行列の出力
void output(int num,int** numbers){
    for (int i=1; i<=num; i++) {
        for (int j=1; j<=num; j++) {
        printf("%4d ",numbers[i-1][j-1]);
        }
    printf("\n");
    }
}

//メモリ確保
int** getmemory(int num) {
    int** numbers;
    numbers = malloc(sizeof(int *) * num);
    for (int i=1;i<=num;i++) {
        numbers[i-1] = malloc(sizeof(int) * num);
    }
    return numbers;
}

//計算過程
void calculation(int num,int** number1,int** number2){
    int** resultnumbers;
    resultnumbers = getmemory(num);
    //初期化
    for (int l=1; l<=num; l++){
        for (int m=1; m<=num; m++) {
            resultnumbers[m-1][l-1] = 0;
        }
    }
    //計算
    for (int k=1; k<=num; k++) {
        for (int j=1; j<=num; j++){
            for (int i=1; i<=num; i++) {
                    resultnumbers[k-1][j-1] += number1[k-1][i-1]*number2[i-1][j-1];
            }
        }
    }
    output(num, resultnumbers);
}

int main(void) {
    
    int num;
    int** numbers1,**numbers2;
    
    printf("n×n matrix? n=");
    scanf("%d", &num);
    
    numbers1 = getmemory(num);
    numbers2 = getmemory(num);
    
    input(num,numbers1);
    printf("----------\n");
    input(num,numbers2);
    printf("first matrixs:\n");
    output(num,numbers1);
    printf("second matrixs:\n");
    output(num,numbers2);
    printf("-----------\n");
    printf("results:\n");
    calculation(num,numbers1,numbers2);
    return 0;
}

 

解説

  1. あまり綺麗ではありませんが、解説をして行きます。
  2. main()で、最初に正方行列の大きさを代入するint型、そして、ポインターを使って動的に行列の数値を代入する配列を宣言します。
  3. scanf()で正方行列の大きさを受け取ります。
  4. その大きさに応じて配列に必要なメモリをgetumemory()より取得します。配列なので、2回mallocを使っています。
  5. input()で、入力された行列の値を配列に一つずつ格納します。
  6. 入力された行列をoutput()で表示します。
  7. calculation()で行列の積を計算して、同様にoutput()を用いて出力します。

 

計算結果はこんな感じで表示がされます。

 

ぜひ、正方行列の積の計算が大変だと思う人やc言語を勉強したい人は有効活用していただければと思います。

 

  • B!