c言語 プログラミング

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言語を勉強したい人は有効活用していただければと思います。

 

  • この記事を書いた人

ポルカ

もうすぐ社会人。数学、最近は特に統計学やデータサイエンスにまつわる記事を誰にでも分かりやすくをコンセプトに執筆しています。 そのほか、独学でのアプリ開発の経験や光回線についての記事も発信中!!

-c言語, プログラミング
-,

© 2020 poruka blog Powered by AFFINGER5