// Matrix.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//
#include <stdio.h>
#include <stdlib.h>
// 行数
static int RowCount;
// 列数
static int ColCount;
// 行列にデータを設定します
static void SetMatrixData(double vector[], int r, int c, double data)
{
vector[r * ColCount + c] = data;
}
// 行列からデータを読み出します
static double GetMatrixData(double vector[], int r, int c)
{
return vector[r * ColCount + c];
}
int main(int argc, char* argv[])
{
int i;
printf("N×M行列数を入力してください\n");
printf("N=");
scanf("%d", &RowCount);
printf("M=");
scanf("%d", &ColCount);
printf("%d×%d行列数を入力してください\n", RowCount, ColCount);
// 行列用のメモリを確保します
// 行列自体はCでは2次元配列で表現できます。
// 本課題では、行数・列数とも可変でなければなりません
//
// 幾つか、実装案があります
// A) 大きめの2次元配列を使う
// 例えば100 x 100の2次元配列を確保しておき
// 10 x 10 の場合は残りを無駄にする方法です
// 101 x 100とかが指定されたらエラーとします
// 単純で実装も易しいですが、勝手な上限を設けてよいのか
// 疑問が残ります
//
// B) 動的に確保します
// mallocで必要なメモリを動的に確保して使います
// 基本的に1次元配列しか確保できないので
// 2次元配列としては扱うのが、多少面倒です
// メモリの許す範囲内で任意のサイズの行列を扱えます
//
// 今回は、多少複雑にはなりますが
// より厳密に課題を解決できるBを採用します。
double* p = (double*)malloc(sizeof (double) * RowCount * ColCount);
if (p == NULL)
{
printf("メモリ不足です");
return -1;
}
for (i = 0; i < RowCount; ++i)
{
int j;
for (j = 0; j < ColCount; ++j)
{
double d;
printf("%d行%d列を入力してください\n", i + 1, j + 1);
scanf("%lf", &d);
SetMatrixData(p, i, j, d);
}
}
// 結果を表示します
printf("入力した%d×%d行列は次のようなものです\n", RowCount, ColCount);
for (i = 0; i < RowCount; ++i)
{
int j;
for (j = 0; j < ColCount; ++j)
{
printf("%.2f ", GetMatrixData(p, i, j));
}
printf("\n");
}
// mallocで確保したメモリは必ずfreeしなければなりません
free(p);
return 0;
}