今だけ人気マンガ100円レンタル特集♪

3元3列の連立方程式の係数を格納し、格納されて結果を表示するプログラムを表示せよ。ただし以下の2通りで行う事
係数を『初期化』を使って配列に入力する
キーボードから入れる
上に書いたやつを参考にできると思って載せたんですが、分かる人いますか?

上のプログラムを参考になるっぽいんですが分かる人いますか?

連立方程式の形はこんな感じです
a00x+a01y+ao2z=α
a10x+a11y+a12z=β
a20x+a21y+a22z=γ

#include <iostream>
using namespace std;
int main() {
から始まって
return 0;
}
で終わる感じで教えてくれませんか

このQ&Aに関連する最新のQ&A

A 回答 (3件)

質問の中にある


「ただし以下の2通りで行う事
係数を『初期化』を使って配列に入力する
キーボードから入れる 」

の解釈に悩みました。
私は、以下のように解釈しました。

下の「この回答への補足」にあるように、2つプログラムを作るように見えます。

とりあえず、「キーボードから入れる 」のプログラムを作ってみました。
また、α、β、γもキーボードから入力できるようにしました。

方程式の解法として用いたアルゴリズム?としては、逆行列を使うことにしました。

逆行列については、

http://www4.osk.3web.ne.jp/~tnpevips/program/inv …

を参考にしました。

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/inv …
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/inv …

この回答への補足

cout→出力
cin→入力って感じでやってるんですよね。

3*3のマトリックスを作って、初期化を自分でする。
みたいな事をヒントに書いてあるんですがどういう事ですかね

補足日時:2009/11/14 23:17
    • good
    • 0

>係数を『初期化』を使って配列に入力する


 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つ作るんですか?

補足日時:2009/11/14 16:36
    • good
    • 0

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


そして, どこが (あるいは何が) わからないのですか?

この回答への補足

やっぱり、何も関係なさそうですが、載せます。
#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;
}

問題自体が難しいです
あと、問題の意味が良く分かりません

補足日時:2009/11/14 00:29
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング