- 締切済み
配列を使ったC++(マトリックス)
3元3列の連立方程式の係数を格納し、格納されて結果を表示するプログラムを表示せよ。ただし以下の2通りで行う事 係数を『初期化』を使って配列に入力する キーボードから入れる 上に書いたやつを参考にできると思って載せたんですが、分かる人いますか? 上のプログラムを参考になるっぽいんですが分かる人いますか? 連立方程式の形はこんな感じです a00x+a01y+ao2z=α a10x+a11y+a12z=β a20x+a21y+a22z=γ #include <iostream> using namespace std; int main() { から始まって return 0; } で終わる感じで教えてくれませんか
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- hatabo44
- ベストアンサー率100% (1/1)
質問の中にある 「ただし以下の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 ; }
- cyacya2000
- ベストアンサー率54% (39/71)
>係数を『初期化』を使って配列に入力する 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)の場合は文字列で入力して解析するのがよいでしょう。
補足
じゃあこの問題はプログラム2つ作るんですか?
- Tacosan
- ベストアンサー率23% (3656/15482)
「上に書いたやつを参考にできると思って載せた」とあるのですが, どこにあるのでしょうか? そして, どこが (あるいは何が) わからないのですか?
補足
やっぱり、何も関係なさそうですが、載せます。 #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; } 問題自体が難しいです あと、問題の意味が良く分かりません
補足
cout→出力 cin→入力って感じでやってるんですよね。 3*3のマトリックスを作って、初期化を自分でする。 みたいな事をヒントに書いてあるんですがどういう事ですかね