• 締切済み

配列を使ったC++(マトリックス)

3元3列の連立方程式の係数を格納し、格納されて結果を表示するプログラムを表示せよ。ただし以下の2通りで行う事 係数を『初期化』を使って配列に入力する キーボードから入れる 上に書いたやつを参考にできると思って載せたんですが、分かる人いますか? 上のプログラムを参考になるっぽいんですが分かる人いますか? 連立方程式の形はこんな感じです a00x+a01y+ao2z=α a10x+a11y+a12z=β a20x+a21y+a22z=γ #include <iostream> using namespace std; int main() { から始まって return 0; } で終わる感じで教えてくれませんか

みんなの回答

  • hatabo44
  • ベストアンサー率100% (1/1)
回答No.3

質問の中にある 「ただし以下の2通りで行う事 係数を『初期化』を使って配列に入力する キーボードから入れる 」 の解釈に悩みました。 私は、以下のように解釈しました。 下の「この回答への補足」にあるように、2つプログラムを作るように見えます。 とりあえず、「キーボードから入れる 」のプログラムを作ってみました。 また、α、β、γもキーボードから入力できるようにしました。 方程式の解法として用いたアルゴリズム?としては、逆行列を使うことにしました。 逆行列については、 http://www4.osk.3web.ne.jp/~tnpevips/program/invmat01.html を参考にしました。 3元1次方程式を行列で表し、その解を逆行列で求める説明ついては、ここでは省略します。 前置きが多くなりましたが、私が作成したプログラムです。 もし、初期化で係数を入力する場合は、以下の2つのことを行ってください。 (1) 関数「SUB_InputExpression」を削除する。 (2) mainで宣言している「lCoefficient」に係数と解を入力してください。 こんなところですかねぇ #include <iostream> using namespace std; #define D_EXPRESSION (3) // 式の数 #define D_VARIABLE (3+1) // 入力する変数の数(係数の数+解) void SUB_InputExpression(int aCoefficient[D_EXPRESSION][D_VARIABLE] ); void SUB_RequestAnswer(int aCoefficient[D_EXPRESSION][D_VARIABLE],double aAnswer[D_VARIABLE]); void SUB_RequestReverseDeterminant(int aCoefficient[D_EXPRESSION][D_VARIABLE],double lReverseDeterminant[D_EXPRESSION][D_VARIABLE]); void SUB_GetReverseDeterminant(int i,int j,int aCoefficient[D_EXPRESSION][D_VARIABLE],double aReverseDeterminant[D_EXPRESSION][D_VARIABLE],double aDetA); int main() { // 変数を定義する箇所で「初期化」している int lCoefficient[D_EXPRESSION][D_VARIABLE] = {{0,0,0,0},{0,0,0,0},{0,0,0,0}}; // 係数及び解 static string lVariableName[D_VARIABLE] = {"X","Y","Z"}; double lAnswer[D_VARIABLE]; SUB_InputExpression(lCoefficient); SUB_RequestAnswer(lCoefficient,lAnswer); for(int i = 0;i < D_EXPRESSION;i++){ for(int j = 0;j < (D_VARIABLE-1);j++){ printf("式(%d)の%sの係数は%dです\n",i,lVariableName[j].c_str(),lCoefficient[i][j] ); } } for(int i = 0;i < D_VARIABLE-1;i++){ printf("%s = %lf\n",lVariableName[i].c_str(),lAnswer[i]); } return 0; } // 各式の係数を入力する void SUB_InputExpression(int aCoefficient[D_EXPRESSION][D_VARIABLE]) { static string lVariableName[D_VARIABLE] = {"X","Y","Z"}; static string lSolutionName[D_VARIABLE] = {"α","β","γ"}; for(int i = 0;i < D_EXPRESSION;i++){ for(int j = 0;j < (D_VARIABLE-1);j++){ printf("式(%d)の%sの係数を入力してください\n",i+1,lVariableName[j].c_str()); printf(">>> "); cin >> aCoefficient[i][j] ; } printf("式(%d)の解(%s)を入力してください\n",i+1,lSolutionName[i].c_str()); printf(">>> "); cin >> aCoefficient[i][3] ; } return ; } void SUB_RequestAnswer(int aCoefficient[D_EXPRESSION][D_VARIABLE],double aAnswer[D_VARIABLE]) { double lReverseDeterminant[D_EXPRESSION][D_VARIABLE]; SUB_RequestReverseDeterminant(aCoefficient,lReverseDeterminant); aAnswer[0] = lReverseDeterminant[0][0] * aCoefficient[0][3] + lReverseDeterminant[0][1] * aCoefficient[1][3] + + lReverseDeterminant[0][2] * aCoefficient[2][3] ; aAnswer[1] = lReverseDeterminant[1][0] * aCoefficient[0][3] + lReverseDeterminant[1][1] * aCoefficient[1][3] + + lReverseDeterminant[1][2] * aCoefficient[2][3] ; aAnswer[2] = lReverseDeterminant[2][0] * aCoefficient[0][3] + lReverseDeterminant[2][1] * aCoefficient[1][3] + + lReverseDeterminant[2][2] * aCoefficient[2][3] ; } // 参考にしたURL //http://www4.osk.3web.ne.jp/~tnpevips/program/invmat01.html void SUB_RequestReverseDeterminant(int aCoefficient[D_EXPRESSION][D_VARIABLE],double aReverseDeterminant[D_EXPRESSION][D_VARIABLE]) { double lDetA; //a11a22a33+a21a32a13+a31a12a23-a11a32a23-a31a22a13-a21a12a33 lDetA = aCoefficient[0][0]*aCoefficient[1][1]*aCoefficient[2][2] + aCoefficient[1][0]*aCoefficient[2][1]*aCoefficient[0][2] + aCoefficient[2][0]*aCoefficient[0][1]*aCoefficient[1][2] - aCoefficient[0][0]*aCoefficient[2][1]*aCoefficient[1][2] - aCoefficient[2][0]*aCoefficient[1][1]*aCoefficient[0][2] - aCoefficient[1][0]*aCoefficient[0][1]*aCoefficient[2][2]; if(lDetA == 0){ printf("計算式に問題があります\n"); return ; } for(int i = 0;i < D_EXPRESSION;i++){ for(int j = 0;j < (D_VARIABLE - 1);j++){ SUB_GetReverseDeterminant(i,j,aCoefficient,aReverseDeterminant,lDetA); } } return ; } void SUB_GetReverseDeterminant(int aExpression,int aVariable,int aCoefficient[D_EXPRESSION][D_VARIABLE],double aReverseDeterminant[D_EXPRESSION][D_VARIABLE],double aDetA) { switch(aExpression){ case 0 : switch(aVariable){ case 0 : aReverseDeterminant[aExpression][aVariable] = (aCoefficient[1][1]*aCoefficient[2][2]-aCoefficient[1][2]*aCoefficient[2][1])/aDetA; break; case 1 : aReverseDeterminant[aExpression][aVariable] = (aCoefficient[2][1]*aCoefficient[0][2]-aCoefficient[2][2]*aCoefficient[0][1])/aDetA; break; case 2 : aReverseDeterminant[aExpression][aVariable] = (aCoefficient[0][1]*aCoefficient[1][2]-aCoefficient[0][2]*aCoefficient[1][1])/aDetA; break; default: break; } break; case 1 : switch(aVariable){ case 0 : aReverseDeterminant[aExpression][aVariable] = (aCoefficient[1][2]*aCoefficient[2][0]-aCoefficient[1][0]*aCoefficient[2][2])/aDetA; break; case 1 : aReverseDeterminant[aExpression][aVariable] = (aCoefficient[2][2]*aCoefficient[0][0]-aCoefficient[2][0]*aCoefficient[0][2])/aDetA; break; case 2 : aReverseDeterminant[aExpression][aVariable] = (aCoefficient[0][2]*aCoefficient[1][0]-aCoefficient[0][0]*aCoefficient[1][2])/aDetA; break; default: break; } break; case 2 : switch(aVariable){ case 0 : aReverseDeterminant[aExpression][aVariable] = (aCoefficient[1][0]*aCoefficient[2][1]-aCoefficient[1][1]*aCoefficient[2][0])/aDetA; break; case 1 : aReverseDeterminant[aExpression][aVariable] = (aCoefficient[2][0]*aCoefficient[0][1]-aCoefficient[2][1]*aCoefficient[0][0])/aDetA; break; case 2 : aReverseDeterminant[aExpression][aVariable] = (aCoefficient[0][0]*aCoefficient[1][1]-aCoefficient[0][1]*aCoefficient[1][0])/aDetA; break; default: break; } break; default: break; } return ; }

参考URL:
http://www4.osk.3web.ne.jp/~tnpevips/program/invmat01.html
noname#127615
質問者

補足

cout→出力 cin→入力って感じでやってるんですよね。 3*3のマトリックスを作って、初期化を自分でする。 みたいな事をヒントに書いてあるんですがどういう事ですかね

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

>係数を『初期化』を使って配列に入力する  int matrix[][3] = {{1,2,3},{4,5,6},{7,8,9}}; これが初期化を使った代入です。この場合係数は1,2,3,4,5,6,7,8,9 つまり  1X+2Y+3Z  4X+5Y+6Z  7X+8Y+9Z  の場合の初期化を用いた方法です。 >キーボードから入れる  キーボードから入力するものが係数だけでよければ  cin >> matrix[0][0]; cin >> matrix[0][1];      :  cin >> matrix[2][2]; とすればよいでしょう。for文を使えばもっと簡単になります。  キーボードから入力するものが式(AX+BY+CZ=XX)の場合は文字列で入力して解析するのがよいでしょう。    

noname#127615
質問者

補足

じゃあこの問題はプログラム2つ作るんですか?

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「上に書いたやつを参考にできると思って載せた」とあるのですが, どこにあるのでしょうか? そして, どこが (あるいは何が) わからないのですか?

noname#127615
質問者

補足

やっぱり、何も関係なさそうですが、載せます。 #include <iostream> using namespace std; int main() { int i,j; int vector[]={10,20,30,40}; int matrix[][3] = {{1,2,3},{4,5,6},{7,8,9}}; for (i=0;i<4;i++) { cout << vector[i] << ' '; } cout << '\n'; for(i=0;i<3;i++) { for(j=0;j<3;j++) { cout << matrix[i][j] << ' '; } cout << '\n'; } return 0; } 問題自体が難しいです あと、問題の意味が良く分かりません

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C++の連立方程式のプログラム

    3元3列の連立方程式の係数を格納し、格納されて結果を表示するプログラムを表示せよ。ただし以下の2通りで行う事 係数を『初期化』を使って配列に入力する キーボードから入れる 上に書いたやつを参考にできると思って載せたんですが、分かる人いますか? 問題の意味って 連立方程式の係数を入力して(9つの係数)それを3*3のマトリックスで出すってだけで解くわけじゃないんですかね?どこにも連立方程式を解くって書いてないわけだし。 つまり 『1つ目の係数を入力せよ 2 2つめの係数を入力せよ 3 … 9つ目の係数を入力せよ 9 2 3 4 8 8 0 4 5 9』 みたいな ヒントの所には、 3*3のマトリックス作って初期化を自分で行う っていうのと 連立方程式の形が書いてありますが a00x+a01y+a02z=α a10x+a11y+a12z=β a20x+a21y+a22z=γ そして、とりあえず、3*3行列はこれで出来ました。 #include <iostream> using namespace std; int main() { int i,j; int vector[]={10,20,30,40}; int matrix[][3] = {{1,2,3},{4,5,6},{7,8,9}}; for(i=0;i<3;i++) { for(j=0;j<3;j++) { cout << matrix[i][j] << ' '; } cout << '\n'; } return 0; } しかし、問題の連立方程式の係数を格納とかキーボードから入力ができないんですよね 多分上に書いたプログラムくらいのレベルだからそんなに複雑にならないはずなんですが

  • C++の行列について

    3元3列の連立方程式の係数を格納し、格納された結果を表示するプログラムを作成せよ。ただし次の2つのパターンでプログラムせよ。 1.係数を『初期化』を使って配列に入力する 2.キーボードから入力する 聞いてみたら問題に、そうは書いてあるけど、連立方程式は考えないでよくて、下の1.2をやるみたいなんですが、どうやるか分かる人いますか? a00x+a01y+a02z=α a10x+a11y+a12z=β a20x+a21y+a22z=γ ここまでやりましたが、違うみたいなんですが、あとどこをどう修正すればいいんですか? #include <iostream> using namespace std; int main() { int i,j; double a00,a01,a02,a10,a11,a12,a20,a21,a22; double a[3][3]={{a00,a01,a02},{a10,a11,a12},{a20,a21,a22}}; for(i=0;i<3;i++) { for(j=0;j<3;j++) { cout("%9f",a[i][j]); } cout << '\n'; } cout << '\n'; for(i=0;i<3;i++) { for(j=0;j<3;j++) { cout << "a[%d][%d] = i,j\n"; cin >> "%lf",&a[i][j]; } } for(i=0;i<3;i++) { for(j=0;j<3;j++) { cout << "%9f",a[i][j]; } cout << "\n"; } cout << "\n"; return 0; } この辺りが多分違うんですよね cout("%9f",a[i][j]); cout << "%9f",a[i][j]);

  • C++の配列について

    #include <iostream> using namespace std; int main() { float w[] = {1.2,2.3,3.4,4.5,5.6}; float x[] = {4.8,2.6,1.3,9.1,8.7}; float u = 0.0; int i; for(i=0;i<5;i=i++) { u += w[i] * x[i]; } cout << "u=" << u << "です\n"; return 0; } u=105.83って出たんですが、これは何をしているプログラムなんですか

  • C++で2点間の内積と距離を求めるプログラム

    C++で2点間の内積と距離を求めるプログラムを作ったのですが、コンパイルの時点でエラーが6つも出てしまいます>< 何がいけないのでしょうか? #include <iostream> #include <cmath> using namespace std; int main(void){ int x, y, z, w, l, n; cin >> x >> y >> z >> w; n=x*w+y*z;   l=sqrt((x-z)(x-z)+(y-w)(y-w)); cout << "距離は" << l << "で、内積は" << n; return 0; }

  • 【C++】複素数で配列を使いたい

    昨日QNo.3714177で「複素数complex.hがおかしいのでしょうか?」 と言うタイトルで質問させて頂いた、C言語初心者です。 お世話になっております。 今日一日中やっており、C++も少しは理解できるようになったぞっと思った矢先、またまた、問題が発生しました。 複素数の中で、配列を使おうとするとエラーが発生します。 ソースは以下の通りです。上段に私が書いたもの、下段に前回の質問時に教えて頂き、動いたものを記載しております。 どこが間違えているのか教えて頂きたく思います。 よろしくお願い致します。 ============================================================================================================ #include <iostream> #include <iomanip> #include <complex> using namespace std; int main () { int i; for (i=0; i<3; i++) { std::complex <double> Z[i] (i,i); std::cout << "Z[" << i << "]= " << Z[i] << "\n"; } return 0; } //ここより下のみでは動きます。 #if0 #include <iostream> #include <complex> int main() { std::complex<double> x(1.2, 3.4); std::complex<double> y(5.6, 7.8); std::cout << "x = " << x <<"\n"; std::cout << "x = " << y <<"\n"; } #endif ============================================================================================================ Borland C++ 5.6 for Win32 Copyright (c) 1993, 2002 Borland keisan.cpp: エラー E2313 keisna.cpp 11: 定数式が必要(関数 main() ) エラー E2034 keisna.cpp 11: 'int' 型は 'complex<double>[1]' 型に変換できない(関数 main() ) エラー E2293 keisna.cpp 11: ) が必要(関数 main() ) *** 3 errors in Compile ***

  • C言語のプログラムの問題で質問です。

    C言語のプログラムの問題で質問です。 問題は、 与えられた実数(a,b,c,d)に対して、次の連立非線形方程式の解 を「ニュートン法」を用いて解く。 f1(x,y)=y+ax^2-b=0 f2(x,y)=y^2+cx^2-d=0 ただし初期値(a,b,c,d)を入力でき、上記の方程式の解が画面表示されること。 という問題です。 普通の連立方程式を解くプログラムならできるのですが、ニュートン法 で解くというのが分かりません。 プログラムを教えてください。参考にしたいです。

  • 線形代数の質問です

    行基本変形および拡大係数行列を使って連立1次方程式を解く。 x+2y+z=0 -3x-4y-5z=4 2x-2y-5z=5 答えはどうなるのでしょうか?

  • ''C++の条件分岐分からないんですが

    #include<iostream> using namespace std; int main(){ int a; cout << "数値を入力してください\n"; cin >> a; if( a > 30) cout <<"31以上ですね\n"; } else if(a<10){ cout <<"10未満ですね\n"; } else { cout <<"30以下で10以上ですね\n"; } return 0; } これが例文なんですが、 変数aの値がbより小さい場合には、『aはbより小さいです』と表示させ、大きい場合には"a=a+b"を計算させる 文字変数mの中身が'a'ならば、『aが格納されています』と表示させて、'a'でないならば『'a'でない文字が格納されています』と表示させたあと、変数bとcを使った『b=b+c』を計算する。 変数aが、変数bより小さい場合には、『aはbより小さいです』と表示し、変数bより大きい場合には、『aはbより大きいです』と表示し、変数bと等しい場合には、『aとbは等しいです』と表示する #include<iostream> using namespace std; int main(){ int a; if(a < b) { __cout("aはbより小さいです\n"); } else { __c = a + b; }return 0; } #include<iostream> using namespace std; int main(){ int a; if(m == 'a') __cout("aが格納されています\n"); } else { __cout("\'a\'でない文字が格納されています\n"); } return 0; } #include<iostream> using namespace std; int main(){ int a; if(a < b) { __cout("aはbより小さいです\n"); } else if(a == b) { __cout("aとbは等しいです\n"); } else { __cout("aはbより大きいです\n"); } return 0; } これ合ってますか?あとプログラミング環境すらないので実行結果教えてもらっていいですか?

  • クラーメルの公式

    下記のようなx,y,zに関する次の連立方程式についての 問題を解いているのですが、解答がなく、自身の考えが あっているのかどうかがわからず困っております。 ----- 次の連立方程式が一意解を持つのは、aがどのような値の時か答えなさい。 x+3y+az=1  2y+2z=1 x +2z=1 (aはパラメーターである。) ----- 〔自身の解答〕 係数行列の行列式を|A|とすると、 クラーメルの公式より、   |1 3 a| x=|1 2 2| / |A|   |1 0 2| y=・・・ Z=・・・ (y,zは省略させて頂きます。) よって、文意の条件を満たすのは、 |A|≠0 すなわち、 (4-0)-3(0-2)+a(0-2)≠0 ∴2a≠10 ∴ a≠5 したがって、求めるaの値は、a≠5 である。 ----- となったのですが、あっていますでしょうか? また、さらに、a≠5 のときの連立方程式の解を 答える場合には、文字aを含めたまま x=4-2a / 10-2a y=2- a / 10-2a z=4  / 10-2a と解答すれば、いいのでしょうか? 初歩的な質問で申し訳ありませんが、 宜しくお願い致します。

  • ガウスの消去法

    はじめまして。 連立1次方程式を消去法で解くとき、 係数行列を上三角行列に変形できればどのような やり方でもよいのでしょうか?? 例えば、 x-2y+2z=2   (1) 4x-y-z=5    (2) 3x+y-7z=0   (3) これらを消去法で求めるとき(1)に-3、-4をかけて足し合わせて行けば楽なのでしょうが そうでなく、(2)、(3)にそれぞれ-1/4、-1/3をかけて足すという方法でも よいのでしょうか?? 答えは一致すると思うのですが・・・。 初歩的すぎる質問ですみませんm(__)m