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
入力した行列の掛け算は出来ません
A 回答 (7件)
- 最新から表示
- 回答順に表示
No.6
- 回答日時:
>#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列になるんだも~ん。
No.4
- 回答日時:
C/C++を勉強する場合、K&Rは標準です(Standard Cですけど。
)この本をしっかり読みましょう。今あるかどうかはわかりませんが、Cの入門書で理解が進んだのはハーバート・シルトの書いた「独習C」も同時に読んだことがお勧めでしたね。人のソースを見ることは重要ですが、安易に聞くのも?ですね。とくに、配列の切り方は人によって癖がありますから標準を覚えてからいろんなテクニックを覚えなければ。No.3
- 回答日時:
// 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;
}
No.2
- 回答日時:
問題の答えを聞いても意味無いでしょう。
問題を解くのが目的ではなくてC言語の学習が目的なんですよね?ならば、問題が解けない理由は入門書の読みが足らないからです。最初から読み直し見てください。
ここで聞くなら自分がやったところまでのソースを書いて、うまくいかない理由を聞くなら意味は有ります。その場合はソースを提示してください。
それから、面倒な質問をたくさんしてますが1つ1つ片付けてから次の質問をしたほうが良いでしょう。たちの悪い質問者と思われて返答がこなくなる恐れがあります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 3 2022/06/12 11:17
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- その他(プログラミング・Web制作) プログラミング pythonの問題について 2 2022/04/19 00:41
- Visual Basic(VBA) excelにて、特定の列に数字入力してあれば、入力してある行コピーして 別ファイルに張り付ける 2 2022/08/11 05:33
- Visual Basic(VBA) 列の最終行までのセルと1つ隣のセルの合計を別の列に表示 2 2022/07/12 19:50
- Visual Basic(VBA) 先頭と末尾を指定して連続した数字を入力 1 2022/09/14 13:12
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Excel(エクセル) エクセル 自動計算 1 2023/01/30 13:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
正負を反転させて出力するプロ...
-
double型が正常に認識されてい...
-
C言語 While文(ループ)内の...
-
数字以外が入力されたらエラー...
-
プログラムC言語の整数の約数に...
-
C言語 逆ピラミッドの作り方
-
2進数の1の数を数える問題
-
4桁の数字以外を入力したらエラ...
-
ダメだ・・・分からない。while...
-
入力値が1以下、かつ数字以外の...
-
VBでの日付入力値のフォーマッ...
-
c言語でひらがなのしりとりをで...
-
scanfが2回使えない・・・?;
-
Eclipseでコマンドラインを入力...
-
プログラム(C)
-
C言語でのカレンダー作成
-
キーボード入力の終了につきま...
-
C言語 for文をつかって記号を表...
-
C言語でつるかめ算をするにはど...
-
プログラミング初心者です。 Py...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
*をユーザーが入力した数字の数...
-
正負を反転させて出力するプロ...
-
数字以外が入力されたらエラー...
-
プログラミング初心者です。 Py...
-
double型が正常に認識されてい...
-
java初心者です。入力されたの...
-
Eclipseコンソール表示を、リセ...
-
scanfが2回使えない・・・?;
-
C言語scanf_sで何故か2回入力に...
-
if文の条件にscanf関数を使うと…?
-
プログラミングの問題です 「金...
-
Linuxで入力待ちなしkeyread関...
-
ワードで文字を入力する時の変...
-
cout関数を使っているのですが...
-
batプログラム上で文字列を入力...
-
Userformの入力順序をタブオー...
-
scanf が無視されます
-
C言語 逆ピラミッドの作り方
-
gets_sがうまく動かない
-
Excel VBAで、Application.Inpu...
おすすめ情報