• 締切済み

非常に困ってます

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 入力した行列の掛け算は出来ません

みんなの回答

  • BLK314
  • ベストアンサー率55% (84/152)
回答No.7

#6さん >よって、上記if文のr1 == c2の部分は不要ですね。 全くもって仰せの通りでございます。 ご指摘有難うございます。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答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列になるんだも~ん。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

「K&R の訳本はきちんと突っ込みができて一人前」ってやつですね>#4. で, あなたはどこまでできるんですか?

  • 1108435
  • ベストアンサー率43% (94/217)
回答No.4

C/C++を勉強する場合、K&Rは標準です(Standard Cですけど。)この本をしっかり読みましょう。今あるかどうかはわかりませんが、Cの入門書で理解が進んだのはハーバート・シルトの書いた「独習C」も同時に読んだことがお勧めでしたね。人のソースを見ることは重要ですが、安易に聞くのも?ですね。とくに、配列の切り方は人によって癖がありますから標準を覚えてからいろんなテクニックを覚えなければ。

  • BLK314
  • ベストアンサー率55% (84/152)
回答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; }

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

問題の答えを聞いても意味無いでしょう。問題を解くのが目的ではなくてC言語の学習が目的なんですよね? ならば、問題が解けない理由は入門書の読みが足らないからです。最初から読み直し見てください。 ここで聞くなら自分がやったところまでのソースを書いて、うまくいかない理由を聞くなら意味は有ります。その場合はソースを提示してください。 それから、面倒な質問をたくさんしてますが1つ1つ片付けてから次の質問をしたほうが良いでしょう。たちの悪い質問者と思われて返答がこなくなる恐れがあります。

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.1

問題集は、回答が掛ける力が付いてから、自分で書いた回答があっているか確かめるためのものです。 まずは入門書で勉強しましょう。

関連するQ&A

  • ほかの人が作ったのも見たいのでよろしくお願いします

    if,for,switch,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 入力した行列の掛け算は出来ません

  • C言語をなるべく早く教えてください

    C言語の問題集の回答がないので困っているので誰か教えてください。 私はまだ始めたばかりなので手におえません。 今私が理解しているif文、switch文、for文、while文、do-while文、配列、を 使用してでお願いします。 入力した行列を表示させるプログラムを作成しなさい。ただし、行列は任意に指定できるものにし、表示のさせ方にも気を付けること。 実行結果例1 N×M行列数を入力してください N=3 M=2 3×2行列を入力して下さい 1行1列を入力して下さい 1 1行2列を入力して下さい 2 2行1列を入力して下さい 3 2行2列を入力して下さい 4 3行1列を入力して下さい 5 3行2列を入力して下さい 6 入力した3×2行列は次のようなものです 1.00 2.00 3.00 4.00 5.00 6.00 <実行結果例2> N×M行列数を入力してください N=3 M=4 3×4行列を入力して下さい 1行1列を入力して下さい 1 1行2列を入力して下さい 2 1行3列を入力して下さい 3 1行4列を入力して下さい 4.23 2行1列を入力して下さい 5.1224 2行2列を入力して下さい 92.12 2行3列を入力して下さい 2.12 2行4列を入力して下さい 36.54 3行1列を入力して下さい 2.213 3行2列を入力して下さい 9.56 3行3列を入力して下さい 8 3行4列を入力して下さい 5.23153 入力した3×4行列は次のようなものです 1.00 2.00 3.00 4.23 5.12 92.12 2.12 36.54 2.21 9.56 8.00 5.23

  • 行列をベクトルに(C言語)

    行列をベクトルに(C言語) m行n列の行列Aがあったとき、それをm×n行1列の行列(ベクトル)Bに するというプログラムを作りたいです。 これは、行列Aの1列目m行分の要素をそのまま行列Bの1行1列目に持っていき、 それを行列Aのn列の数だけ繰り返す、といった要領です(画像参照) つまり MATRIX B; B.m=A.m*A.n; B.n=1; return B; ということだと思うのですが、なかなかうまいくいきません。 また、構造体も使いたいので、 typedef struct { int m; int n; double *mat; } MATRIX; と宣言しました。 画像は説明のため、一応載せておきました。(例として4列の行列になっています) みなさんよろしくお願いします。

  • 分散共分散行列の逆行列

    以下の行列を考えます. 行列X(M行N列,成分の値は分散1のガウスノイズ) 行列Xの分散共分散行列S(M行M列), 行列Sの逆行列Y(M行M列) N=M+1のときはN≠M+1のときに比べて行列Yの各成分の大きさがかなり大きくなる,という結果が得られました. (計算にはMATLABの関数covとpinvを用いました.) これは数学的に正しいことなのでしょうか. また,正しいとしたらどうしてこのようなことが起こるのでしょうか. 行列Yの計算結果の例を以下に示します.(行列Yを500回算出し,それらの平均値を示しています.) http://wisteria.orz.ne.jp/download/pinvcovX.jpg 縦・横方向の軸は行列Yのインデックスを,高さ方向の軸は行列Yの成分の値を示しています. 上述した現象の原因についてご教授いただけると幸いです.

  • OpenCVの行列の掛け算

    OpenCVで行列同士の掛け算をしようとしています. 4×1の行列と4×4の行列を cvMullで掛け算しようとすると 行と列の次元が合わないので掛け算できません 二つの行列を掛け算する方法はありますか?

  • フォートランで行列の計算

    n×n行列同士の掛け算をする文が書けません。data文を使わないで、read文を使って、次元nと行列A,Bを入力したいんですが、どなたか教えて下さい。

  • c言語のプログラムで行列の積を計算する

    指定された行・列数(それぞれ10以下とする)の行列 X, Y の積 Z = X × Y を求めるプログラムを作成せよ.行列の要素はすべて整数とする. このプログラムで行と列の成分を入力するときに、1列になってしまうのですがどうしたらちゃんと入力できますか? int main(void) { double A[10][10]; double B[10][10]; int i,j,m,n,p,k; printf("行列xの行数は?:"); scanf("%d",&m); printf("行列xの列数(行列yの行数)は?:"); scanf("%d",&n); printf("行列yの列数は?:"); scanf("%d",&p); printf("行列xを入力してください。\n"); for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { scanf("%d", &A[i][j]); } } printf("行列yを入力してください。\n"); for (i = 0; i < n; i++) { for (j = 0; j < p; j++) { scanf("%d", &B[i][j]); } }

  • C++

    forを使って mとnを入力し(m、nとも最大10)、 m*n個の実数を入力して、m行n列の行列を作る。 この行列に対して、各行の合計、平均及び最大と各列の合計、平均及び最大を求めるプログラムを作成。-----------------------------------------------------------------教えてください。

  • 成分が行列(?)の行列式の証明について.

    成分が行列(?)の行列式の証明について. 画像添付が失敗してしまったようで再掲です.すみません. ---問題ここから--- Aがm次の正方行列,Bがm行n列の行列,Cがn次の正方行列,Oがn行m列のゼロ行列の時, |A B| |O C| = |A||C| を示せ. ---問題ここまで--- という問題です.(実際の問題文の画像を添付しました.) まさか2次正方行列の公式を使って示したことにはならないでしょうし, 左辺を1行で余因子展開して A|C|-B|O|=A|C| としてみたのですが,これでは右辺と等しいとは言えませんよね. 成分が行列の行列式ってどう計算したらよいのでしょうか,やり方がわからずハマってしまいました... どなたか解答の方針を教えて頂けませんか?

  • C言語の問題が解けません

    C言語の問題ができなくて困っています。 これが問題文です。 与えられた表の縦・横の値の平均/合計をそれぞれの行・列ごとに求め出力するプログラムを作成しなさい。ただし、縦・横のデータ数は10個未満とし、それぞれの数字は整数とする。また、出力は右詰め6桁で出力することとし、平均における小数点以下は1桁まで表示する。平均行/列および合計行/列がぶつかる個所は、表全体の平均と合計を計算した結果を表示する。 補足として入力された行列数が10未満であることは、プログラム内でチェックすること。 例:20,3→再入力となる(行が9未満でない)  :2,-5→再入力となる(行が負の値) 実行結果例はこんな感じらしいです。 行数(最大9),列数(最大9)をカンマ区切りで入力(行,列):4,4 データをカンマ区切りで行ごとに入力[4行 4列] 52,96,15,20 86,22,35,45 45,78,54,36 16,86,74,55  52 96 15 20 45.8 183  86 22 35 45 47.0 188  45 78 54 36 53.3 213  16 86 74 55 57.8 231 49.8  70.5 44.5 39.0 50.9 - 199 282 178 156 - 815 自分はここまで自力でやったのですがここからが試行錯誤してもできません。このあとどのようにプログラムを書いていけばいいのですか? よろしくお願いします。 #include <stdio.h> int main(){ int gyou,retu,Loop1=0,Loop2=0; int kazu[8][8]; printf("行数(最大9行)、列数(最大9列)をカンマで区切って入力 (行,列):"); scanf("%d,%d",&gyou,&retu); if((gyou<=9)&&(retu<=9)){ printf("データをカンマ区切りで行ごとに入力 [%d行,%d列]\n",gyou,retu); for(Loop2=0;Loop2<gyou;Loop2++){ for(Loop1=0;Loop1<retu;Loop1++){ scanf("%d\n",&kazu[gyou--][retu--]);