前提・実現したいこと
こんにちは。プログラミング初学者です。研究の一環でC++ を使用して任意の値を入力して連立方程式を解くプログラム(ガウスの消去法)を作成したいと思っています。単純に計算を行いたいだけなのですがエラーを検索しても解決方法が見つからず困っています。
プログラムは
main文の中で複数の値を入力して配列に格納
↓
配列を受け取って関数内で連立方程式を解く
↓
3つの値を返す(このときtupleを使用している)
↓
返された値を表示
という感じを実現したいと思っています。
基礎的なことが理解できていないかと思いますがご教授願います。
発生している問題・エラーメッセージ
Compiling test1.cpp and linking to test1...
test1.cpp:15:37: error: return type specification for constructor invalid
double Calc1(double g[][N+1]);//doubleを消去した
^
test1.cpp:26:37: error: return type specification for constructor invalid
double Calc2(double g[][N+1]);//doubleを消去した
^
test1.cpp:37:37: error: return type specification for constructor invalid
double Calc3(double g[][N+1]);//doubleを消去した
^
test1.cpp:48:61: error: return type specification for constructor invalid
tuple<double,double,double>Calc1::Calc1(double array1[][N+1])
^
test1.cpp: In constructor ‘Calc1::Calc1(double ()[4])’:
test1.cpp:86:67: error: returning a value from a constructor
return forward_as_tuple(array1[0][N],array1[1][N],array1[2][N]);
^
test1.cpp: At global scope:
test1.cpp:89:61: error: return type specification for constructor invalid
tuple<double,double,double>Calc2::Calc2(double array2[][N+1])
^
test1.cpp: In constructor ‘Calc2::Calc2(double ()[4])’:
test1.cpp:127:67: error: returning a value from a constructor
return forward_as_tuple(array2[0][N],array2[1][N],array2[2][N]);
^
test1.cpp: At global scope:
test1.cpp:130:61: error: return type specification for constructor invalid
tuple<double,double,double>Calc3::Calc3(double array3[][N+1])
^
test1.cpp: In constructor ‘Calc3::Calc3(double (*)[4])’:
test1.cpp:168:67: error: returning a value from a constructor
return forward_as_tuple(array3[0][N],array3[1][N],array3[2][N]);
^
test1.cpp: In function ‘int main()’:
test1.cpp:302:15: error: no matching function for call to ‘Calc1::Calc1()’
Calc1 objCalc1;
該当のソースコード
#include<iostream> #include<stdio.h> #include <tuple> #include<math.h> #define N 3 using namespace std; class Calc1 { private: double array1[N][N + 1]; double d; int i, j, k; public: double Calc1(double g[][N+1]);//doubleを消去した }; //構造体を定義 struct DATA{ double x; double y; double z; }; tuple<double,double,double>Calc1::Calc1(double array1[][N+1]) { double a,b,c; /*static double g[N][N + 1] = { { dr1.x, dr1.y, dr1.z, dB1.x}, { dr2.x, dr2.y, dr2.z, dB2.x}, { dr3.x, dr3.y, dr3.z, dB3.x} };*/ // 元の連立方程式をコンソール出力 for (i = 0; i < N; i++) { for (j = 0; j < N; j++) printf("%+fx%d ", array1[i][j], j + 1); printf("= %+f\n", array1[i][N]); } // 前進消去 for (k = 0; k < N -1; k++) { for (i = k + 1; i < N; i++) { d = array1[i][k] / array1[k][k]; for (j = k + 1; j <= N; j++) array1[i][j] -= array1[k][j] * d; } } // 後退代入 for (i = N - 1; i >= 0; i--) { d = array1[i][N]; for (j = i + 1; j < N; j++) d -= array1[i][j] * array1[j][N]; array1[i][N] = d / array1[i][i]; } // 結果出力 for (k = 0; k < N; k++) printf("x%d = %f\n", k + 1, array1[k][N]); return forward_as_tuple(array1[0][N],array1[1][N],array1[2][N]); } /* * メイン処理 */ int main() { struct DATA r1,r2,r3,r4,rg,dr1,dr2,dr3,dr4,B1,B2,B3,B4,Bg,dB1,dB2,dB3,dB4; //4つの物体の位置と磁場を入力 cout <<"r1.xを入力して下さい" << endl; cin >> r1.x; cout <<"r1.yを入力して下さい" << endl; cin >> r1.y; cout <<"r1.zを入力して下さい" << endl; cin >> r1.z; cout <<"r2.xを入力して下さい" << endl; cin >> r2.x; cout <<"r2.yを入力して下さい" << endl; cin >> r2.y; cout <<"r2.yを入力して下さい" << endl; cin >> r2.z; cout <<"r3.xを入力して下さい" << endl; cin >> r3.x; cout <<"r3.yを入力して下さい" << endl; cin >> r3.y; cout <<"r3.zを入力して下さい" << endl; cin >> r3.z; cout <<"r4.xを入力して下さい" << endl; cin >> r4.x; cout <<"r4.yを入力して下さい" << endl; cin >> r4.y; cout <<"r4.zを入力して下さい" << endl; cin >> r4.z; cout <<"B1.xを入力して下さい" << endl; cin >> B1.x; cout <<"B1.yを入力して下さい" << endl; cin >> B1.y; cout <<"B1.zを入力して下さい" << endl; cin >> B1.z; cout <<"B2.xを入力して下さい" << endl; cin >> B2.x; cout <<"B2.yを入力して下さい" << endl; cin >> B2.y; cout <<"B2.zを入力して下さい" << endl; cin >> B2.z; cout <<"B3.xを入力して下さい" << endl; cin >> B3.x; cout <<"B3.yを入力して下さい" << endl; cin >> B3.y; cout <<"B3.zを入力して下さい" << endl; cin >> B3.z; cout <<"B4.xを入力して下さい" << endl; cin >> B4.x; cout <<"B4.yを入力して下さい" << endl; cin >> B4.y; cout <<"B4.zを入力して下さい" << endl; cin >> B4.z; cout <<"Bg.xを入力して下さい" << endl; cin >> Bg.x; cout <<"Bg.yを入力して下さい" << endl; cin >> Bg.y; cout <<"Bg.zを入力して下さい" << endl; cin >> Bg.z; //重心の位置を計算 rg.x=(r1.x+r2.x+r3.x+r4.x)/4; rg.y=(r1.y+r2.y+r3.y+r4.y)/4; rg.z=(r1.z+r2.z+r3.z+r4.z)/4; //重心の磁場を計算 Bg.x=(B1.x+B2.x+B3.x+B4.x)/(sqrt(B1.x*B1.x)+sqrt(B2.x*B2.x)+sqrt(B3.x*B3.x)+sqrt(B4.x*B4.x)); Bg.y=(B1.y+B2.y+B3.y+B4.y)/(sqrt(B1.y*B1.y)+sqrt(B2.y*B2.y)+sqrt(B3.y*B3.y)+sqrt(B4.y*B4.y)); Bg.z=(B1.z+B2.z+B3.z+B4.z)/(sqrt(B1.z*B1.z)+sqrt(B2.z*B2.z)+sqrt(B3.z*B3.z)+sqrt(B4.z*B4.z)); //δrを計算 dr1.x=r1.x-rg.x; dr1.y=r1.y-rg.y; dr1.z=r1.z-rg.z; dr2.x=r2.x-rg.x; dr2.y=r2.y-rg.y; dr2.z=r2.z-rg.z; dr3.x=r3.x-rg.x; dr3.y=r3.y-rg.y; dr3.z=r3.z-rg.z; dr4.x=r4.x-rg.x; dr4.y=r4.y-rg.y; dr4.z=r4.z-rg.z; //δBを計算 dB1.x=B1.x-Bg.x; dB1.y=B1.x-Bg.y; dB1.z=B1.x-Bg.z; dB2.x=B2.x-Bg.x; dB2.y=B2.x-Bg.y; dB2.z=B2.x-Bg.z; dB3.x=B3.x-Bg.x; dB3.y=B3.x-Bg.y; dB3.z=B3.x-Bg.z; dB4.x=B4.x-Bg.x; dB4.y=B4.x-Bg.y; dB4.z=B4.x-Bg.z; //二次元配列に値を入力 static double array1[N][N + 1] = { { dr1.x, dr1.y, dr1.z, dB1.x}, { dr2.x, dr2.y, dr2.z, dB2.x}, { dr3.x, dr3.y, dr3.z, dB3.x} }; try { double a,b,c,d,e,f,g,h,i; // 計算クラスインスタンス化 Calc1 objCalc1; // 連立方程式を解く(ガウスの消去法) tie(a,b,c)=objCalc1.Calc1(array1); //要素を表示 cout<<"∇BG="<<endl; cout<<a<<b<<c<<endl; } catch (...) { cout << "例外発生!" << endl; return -1; } // 正常終了 return 0; }
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
本来は関数が複数あるのですが質問の文字数状カットしています。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/15 11:43
2021/04/15 11:46
2021/04/15 12:17