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