どうも、porukaです。
C言語を用いて、正方行列を二つ入力すると、その積を勝手に計算してくれるものを作りました。
このソースコードを読めるようになると、少しはポインターの理解が深まるかと思います。
正方行列の行と列の大きさは、自由に変更可能です。
↓入力の順番、結果の出力までの流れは以下のようになっています。↓
- コンパイルして、行と列の数(大きさ)をインプットします。
- 一つ目の行列の左上の値から、順番に値を入力していきます。
- 二つ目の行列の値を同じように右上の値から、順番に入力していきます。
- 入力が終わると、結果が自動的に出てきます。
ソースコードです。
#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; }
解説
- あまり綺麗ではありませんが、解説をして行きます。
- main()で、最初に正方行列の大きさを代入するint型、そして、ポインターを使って動的に行列の数値を代入する配列を宣言します。
- scanf()で正方行列の大きさを受け取ります。
- その大きさに応じて配列に必要なメモリをgetumemory()より取得します。配列なので、2回mallocを使っています。
- input()で、入力された行列の値を配列に一つずつ格納します。
- 入力された行列をoutput()で表示します。
- calculation()で行列の積を計算して、同様にoutput()を用いて出力します。
計算結果はこんな感じで表示がされます。
ぜひ、正方行列の積の計算が大変だと思う人やc言語を勉強したい人は有効活用していただければと思います。