質問編集履歴
2
コードの変更
title
CHANGED
File without changes
|
body
CHANGED
@@ -68,53 +68,46 @@
|
|
68
68
|
できる限り疑問点をまとめたつもりですが,どういう風に返したいのかなど曖昧でしたら補足させていただきます.
|
69
69
|
どうぞよろしくお願いいたします.
|
70
70
|
|
71
|
-
# 追記
|
71
|
+
# 【解決コード】追記
|
72
|
-
ご回答の
|
72
|
+
ご回答の通り,vectorを用いればうまくいったので修正した最終的なコードを載せておきます.
|
73
|
-
|
73
|
+
かなり初歩的なところだとは思いますが,同じようなところで詰まっている誰かの参考になればと思います.
|
74
|
-
```C++
|
74
|
+
``` C++
|
75
75
|
#include <iostream>
|
76
76
|
#include <string>
|
77
77
|
#include <cmath>
|
78
|
-
|
78
|
+
#include <vector>
|
79
|
+
#include <complex>
|
79
80
|
using namespace std;
|
80
81
|
|
81
|
-
// 二次関数を表現するためのクラス
|
82
82
|
class QuadraticEq
|
83
83
|
{
|
84
84
|
// a x^2 + b x + c = 0のための変数
|
85
85
|
float a;
|
86
86
|
float b;
|
87
87
|
float c;
|
88
|
-
// xの構造体用意
|
89
|
-
struct x_struct
|
90
|
-
{
|
91
|
-
float real[2];
|
92
|
-
float imag[2];
|
93
|
-
};
|
94
88
|
// 解を保存しておく
|
95
|
-
|
89
|
+
vector<complex<float>> x;
|
96
90
|
public:
|
97
91
|
QuadraticEq(float in_a, float in_b, float in_c)
|
98
92
|
{
|
99
93
|
a = in_a;
|
100
94
|
b = in_b;
|
101
95
|
c = in_c;
|
102
|
-
// クラス呼び出し時に解を求めて内部変数に保存
|
103
96
|
Solve();
|
104
97
|
};
|
105
98
|
// 解を計算して内部変数に保存する関数
|
106
99
|
void Solve();
|
100
|
+
void Disp();
|
107
101
|
};
|
108
102
|
|
109
103
|
///////////// main /////////////////
|
110
104
|
int main(int argc, const char * argv[]) {
|
111
105
|
// insert code here...
|
112
|
-
QuadraticEq EQ(1,
|
106
|
+
QuadraticEq EQ(1, 1, -6);
|
113
|
-
|
107
|
+
EQ.Disp();
|
114
108
|
return 0;
|
115
109
|
}
|
116
110
|
|
117
|
-
///////////// Solve()記述 /////////////////
|
118
111
|
void QuadraticEq::Solve()
|
119
112
|
{
|
120
113
|
// aが0以外なら二次方程式
|
@@ -128,13 +121,14 @@
|
|
128
121
|
// 実部の計算
|
129
122
|
float Smallerx = (-b - sqrt(SqrtPart)) / 2 * a;
|
130
123
|
float Largerx = (-b + sqrt(SqrtPart)) / 2 * a;
|
124
|
+
x.push_back(complex<float>(Smallerx,0));
|
131
|
-
x
|
125
|
+
x.push_back(complex<float>(Largerx,0));
|
132
126
|
}
|
133
127
|
// 解が実数かつ重解
|
134
128
|
else if (SqrtPart == 0)
|
135
129
|
{
|
136
130
|
float RealPart = -b / 2 * a;
|
137
|
-
x
|
131
|
+
x.push_back(complex<float>(RealPart,0));
|
138
132
|
}
|
139
133
|
// 解が複素数
|
140
134
|
else
|
@@ -143,13 +137,34 @@
|
|
143
137
|
float RealPart = - b / (2 * a);
|
144
138
|
// 虚部の計算
|
145
139
|
float ImagPart = SqrtPart / (2 * a);
|
146
|
-
x
|
140
|
+
x.push_back(complex<float>(RealPart, -ImagPart));
|
141
|
+
x.push_back(complex<float>(RealPart, ImagPart));
|
147
142
|
}
|
148
143
|
}
|
149
144
|
// aが一次方程式
|
150
145
|
else
|
151
146
|
{
|
152
|
-
x
|
147
|
+
x.push_back(complex<float>(-c / b, 0));
|
153
148
|
}
|
154
149
|
};
|
150
|
+
|
151
|
+
void QuadraticEq::Disp()
|
152
|
+
{
|
153
|
+
for (int i = 0; i < x.size(); i++)
|
154
|
+
{
|
155
|
+
// 虚部の値によって表示を変える
|
156
|
+
if (x[i].imag() > 0)
|
157
|
+
{
|
158
|
+
cout << x[i].real() << " + " << x[i].imag() << endl;
|
159
|
+
}
|
160
|
+
else if (x[i].imag() == 0)
|
161
|
+
{
|
162
|
+
cout << x[i].real() << endl;
|
163
|
+
}
|
164
|
+
else
|
165
|
+
{
|
166
|
+
cout << x[i].real() << x[i].imag() << endl;
|
167
|
+
}
|
168
|
+
}
|
169
|
+
};
|
155
170
|
```
|
1
コードの変更
title
CHANGED
File without changes
|
body
CHANGED
@@ -66,4 +66,90 @@
|
|
66
66
|
```
|
67
67
|
C++について問題を解決するために何を調べたら良いかもいまいちわからず苦戦しています.
|
68
68
|
できる限り疑問点をまとめたつもりですが,どういう風に返したいのかなど曖昧でしたら補足させていただきます.
|
69
|
-
どうぞよろしくお願いいたします.
|
69
|
+
どうぞよろしくお願いいたします.
|
70
|
+
|
71
|
+
# 追記
|
72
|
+
ご回答のように,解が実数の場合でも虚数部が0であるというようにしてコードを書いてみました.
|
73
|
+
しかし,`main()`関数で解を取得する書き方がわかりません.教えていただきたいです.
|
74
|
+
```C++
|
75
|
+
#include <iostream>
|
76
|
+
#include <string>
|
77
|
+
#include <cmath>
|
78
|
+
|
79
|
+
using namespace std;
|
80
|
+
|
81
|
+
// 二次関数を表現するためのクラス
|
82
|
+
class QuadraticEq
|
83
|
+
{
|
84
|
+
// a x^2 + b x + c = 0のための変数
|
85
|
+
float a;
|
86
|
+
float b;
|
87
|
+
float c;
|
88
|
+
// xの構造体用意
|
89
|
+
struct x_struct
|
90
|
+
{
|
91
|
+
float real[2];
|
92
|
+
float imag[2];
|
93
|
+
};
|
94
|
+
// 解を保存しておく
|
95
|
+
x_struct x;
|
96
|
+
public:
|
97
|
+
QuadraticEq(float in_a, float in_b, float in_c)
|
98
|
+
{
|
99
|
+
a = in_a;
|
100
|
+
b = in_b;
|
101
|
+
c = in_c;
|
102
|
+
// クラス呼び出し時に解を求めて内部変数に保存
|
103
|
+
Solve();
|
104
|
+
};
|
105
|
+
// 解を計算して内部変数に保存する関数
|
106
|
+
void Solve();
|
107
|
+
};
|
108
|
+
|
109
|
+
///////////// main /////////////////
|
110
|
+
int main(int argc, const char * argv[]) {
|
111
|
+
// insert code here...
|
112
|
+
QuadraticEq EQ(1, 4, 4);
|
113
|
+
// 【疑問】ここで解を取り出したい
|
114
|
+
return 0;
|
115
|
+
}
|
116
|
+
|
117
|
+
///////////// Solve()記述 /////////////////
|
118
|
+
void QuadraticEq::Solve()
|
119
|
+
{
|
120
|
+
// aが0以外なら二次方程式
|
121
|
+
if(a != 0)
|
122
|
+
{
|
123
|
+
// qrtPart : 根号の中を計算
|
124
|
+
float SqrtPart = b*b - 4*a*c;
|
125
|
+
// 解が実数で二つの時
|
126
|
+
if(SqrtPart > 0)
|
127
|
+
{
|
128
|
+
// 実部の計算
|
129
|
+
float Smallerx = (-b - sqrt(SqrtPart)) / 2 * a;
|
130
|
+
float Largerx = (-b + sqrt(SqrtPart)) / 2 * a;
|
131
|
+
x = x_struct{{Smallerx, 0},{Largerx, 0}};
|
132
|
+
}
|
133
|
+
// 解が実数かつ重解
|
134
|
+
else if (SqrtPart == 0)
|
135
|
+
{
|
136
|
+
float RealPart = -b / 2 * a;
|
137
|
+
x = x_struct{RealPart, 0};
|
138
|
+
}
|
139
|
+
// 解が複素数
|
140
|
+
else
|
141
|
+
{
|
142
|
+
// 実部の計算
|
143
|
+
float RealPart = - b / (2 * a);
|
144
|
+
// 虚部の計算
|
145
|
+
float ImagPart = SqrtPart / (2 * a);
|
146
|
+
x = x_struct{{RealPart, ImagPart},{RealPart, -ImagPart}};
|
147
|
+
}
|
148
|
+
}
|
149
|
+
// aが一次方程式
|
150
|
+
else
|
151
|
+
{
|
152
|
+
x = x_struct{-c / b, 0};
|
153
|
+
}
|
154
|
+
};
|
155
|
+
```
|