非常に困ってます
C言語の問題集の回答がないので困っているので誰か教えてください。
私はまだ始めたばかりなので手におえません。
今私が理解しているif文、switch文、for文、while文、do-while文、配列、を
使用してでお願いします。
入力した行列の掛け算を行うプログラムを作成しなさい。
ただし、行列数は任意に指定できるものにし、表示のさせ方にも気を付けること。
また、入力した行列の掛け算が行えない場合はエラーを返すようにしなさい。
実行結果例1
行列1:N×M行列数を入力してください
N=2
M=2
行列2:O×P行列数を入力してください
O=2
P=2
行列1:2×2行列を入力して下さい
1行1列を入力して下さい
1
1行2列を入力して下さい
2
2行1列を入力して下さい
3
2行2列を入力して下さい
4
行列2:2×2行列を入力して下さい
1行1列を入力して下さい
5
1行2列を入力して下さい
6
2行1列を入力して下さい
7
2行2列を入力して下さい
8
入力した行列1(2×2行列)×行列2(2×2行列)の計算結果は次ようなものです
19.00 22.00
43.00 50.00
実行結果例2
行列1:N×M行列数を入力してください
N=2
M=3
行列2:O×P行列数を入力してください
O=3
P=4
行列1:2×3行列を入力して下さい
1行1列を入力して下さい
1.21
1行2列を入力して下さい
2.35
1行3列を入力して下さい
2.65
2行1列を入力して下さい
1.2356
2行2列を入力して下さい
5.952165
2行3列を入力して下さい
5.23
行列2:3×4行列を入力して下さい
1行1列を入力して下さい
5.9685
1行2列を入力して下さい
86.3251
1行3列を入力して下さい
2.14
1行4列を入力して下さい
1.415
2行1列を入力して下さい
2
2行2列を入力して下さい
3.1415
2行3列を入力して下さい
0.717
2行4列を入力して下さい
2.36
3行1列を入力して下さい
2
3行2列を入力して下さい
3
3行3列を入力して下さい
8.23
3行4列を入力して下さい
4.956
入力した行列1(2×3行列)×行列2(3×4行列)の計算結果は次ようなものです
17.22 119.79 26.08 20.39
29.74 141.05 49.95 41.72
実行結果例3
行列1:N×M行列数を入力してください
N=3
M=2
行列2:O×P行列数を入力してください
O=4
P=3
入力した行列の掛け算は出来ません
>#3さん
>static int IsMultiple(int r1, int c1, int r2, int c2)
>{
>if (r1 == c2 && c1 == r2)
行列の積は、掛けられる行列の列数と掛ける行列の行数が同じであれば成立します。
よって、上記if文のr1 == c2の部分は不要ですね。
だって、2行3列と3行4列の掛け算結果は2行4列になるんだも~ん。
C/C++を勉強する場合、K&Rは標準です(Standard Cですけど。)この本をしっかり読みましょう。今あるかどうかはわかりませんが、Cの入門書で理解が進んだのはハーバート・シルトの書いた「独習C」も同時に読んだことがお勧めでしたね。人のソースを見ることは重要ですが、安易に聞くのも?ですね。とくに、配列の切り方は人によって癖がありますから標準を覚えてからいろんなテクニックを覚えなければ。
// Matrix.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//
#include <stdio.h>
#include <stdlib.h>
// 行列にデータを設定します
static void SetMatrixData(double vector[], int r, int c,
int ColCount, double data)
{
vector[r * ColCount + c] = data;
}
// 行列からデータを読み出します
static double GetMatrixData(double vector[], int r, int c, int ColCount)
{
return vector[r * ColCount + c];
}
// 掛け算ができるか否か判定します
static int IsMultiple(int r1, int c1, int r2, int c2)
{
if (r1 == c2 && c1 == r2)
return 1;
else
return 0;
}
// 行列の掛け算結果の1要素を求めます
static double GetMutliple(double v1[], double v2[], int r1, int c1,
int nRows)
{
double d = 0;
int i;
for (i = 0; i < nRows; ++i)
{
double d1 = GetMatrixData(v1, r1, i, nRows);
double d2 = GetMatrixData(v2, i, c1, nRows);
d += (d1 * d2);
}
return d;
}
int main(int argc, char* argv[])
{
int n, m, o, p;
int i;
printf("行列1:N×M行列数を入力してください\n");
printf("N=");
scanf("%d", &n);
printf("M=");
scanf("%d", &m);
printf("行列2:O×P行列数を入力してください\n");
printf("O=");
scanf("%d", &o);
printf("P=");
scanf("%d", &p);
// 掛け算ができるかチェックします
if (!IsMultiple(m, n, o, p))
{
printf("入力した行列の掛け算は出来ません");
return 1;
}
double* p1 = (double*)malloc(sizeof (double) * n * m);
if (p == NULL)
{
printf("メモリ不足です");
return -1;
}
double* p2 = (double*)malloc(sizeof (double) * o * p);
if (p2 == NULL)
{
printf("メモリ不足です");
return -1;
}
printf("行列1:%d×%d行列を入力してください\n", n, m);
for (i = 0; i < n; ++i)
{
int j;
for (j = 0; j < m; ++j)
{
double d;
printf("%d行%d列を入力してください\n", i + 1, j + 1);
scanf("%lf", &d);
SetMatrixData(p1, i, j, m, d);
}
}
printf("行列2:%d×%d行列を入力してください\n", o, p);
for (i = 0; i < o; ++i)
{
int j;
for (j = 0; j < p; ++j)
{
double d;
printf("%d行%d列を入力してください\n", i + 1, j + 1);
scanf("%lf", &d);
SetMatrixData(p2, i, j, o, d);
}
}
// 結果を表示します
printf("入力した行列1(%d×%d行列)×行列2(%d×%d行列)の計算結果は次ようなものです\n",
m, n, o, p);
for (i = 0; i < m; ++i)
{
int j;
for (j = 0; j < n; ++j)
{
printf("%.2f ", GetMutliple(p1, p2, i, j, n));
}
printf("\n");
}
// mallocで確保したメモリは必ずfreeしなければなりません
free(p1);
free(p2);
return 0;
}
問題の答えを聞いても意味無いでしょう。問題を解くのが目的ではなくてC言語の学習が目的なんですよね?
ならば、問題が解けない理由は入門書の読みが足らないからです。最初から読み直し見てください。
ここで聞くなら自分がやったところまでのソースを書いて、うまくいかない理由を聞くなら意味は有ります。その場合はソースを提示してください。
それから、面倒な質問をたくさんしてますが1つ1つ片付けてから次の質問をしたほうが良いでしょう。たちの悪い質問者と思われて返答がこなくなる恐れがあります。
- 最新から表示
- |
- 回答順に表示













