質問編集履歴
2
コードの変更
test
CHANGED
File without changes
|
test
CHANGED
@@ -138,13 +138,13 @@
|
|
138
138
|
|
139
139
|
|
140
140
|
|
141
|
-
# 追記
|
141
|
+
# 【解決コード】追記
|
142
|
-
|
142
|
+
|
143
|
-
ご回答の
|
143
|
+
ご回答の通り,vectorを用いればうまくいったので修正した最終的なコードを載せておきます.
|
144
|
-
|
144
|
+
|
145
|
-
|
145
|
+
かなり初歩的なところだとは思いますが,同じようなところで詰まっている誰かの参考になればと思います.
|
146
|
-
|
146
|
+
|
147
|
-
```C++
|
147
|
+
``` C++
|
148
148
|
|
149
149
|
#include <iostream>
|
150
150
|
|
@@ -152,14 +152,14 @@
|
|
152
152
|
|
153
153
|
#include <cmath>
|
154
154
|
|
155
|
-
|
155
|
+
#include <vector>
|
156
|
+
|
157
|
+
#include <complex>
|
156
158
|
|
157
159
|
using namespace std;
|
158
160
|
|
159
161
|
|
160
162
|
|
161
|
-
// 二次関数を表現するためのクラス
|
162
|
-
|
163
163
|
class QuadraticEq
|
164
164
|
|
165
165
|
{
|
@@ -172,44 +172,32 @@
|
|
172
172
|
|
173
173
|
float c;
|
174
174
|
|
175
|
-
//
|
175
|
+
// 解を保存しておく
|
176
|
+
|
176
|
-
|
177
|
+
vector<complex<float>> x;
|
178
|
+
|
177
|
-
|
179
|
+
public:
|
180
|
+
|
178
|
-
|
181
|
+
QuadraticEq(float in_a, float in_b, float in_c)
|
182
|
+
|
179
|
-
{
|
183
|
+
{
|
180
|
-
|
184
|
+
|
181
|
-
|
185
|
+
a = in_a;
|
182
|
-
|
186
|
+
|
183
|
-
|
187
|
+
b = in_b;
|
188
|
+
|
189
|
+
c = in_c;
|
190
|
+
|
191
|
+
Solve();
|
184
192
|
|
185
193
|
};
|
186
194
|
|
187
|
-
// 解を保存しておく
|
188
|
-
|
189
|
-
x_struct x;
|
190
|
-
|
191
|
-
public:
|
192
|
-
|
193
|
-
QuadraticEq(float in_a, float in_b, float in_c)
|
194
|
-
|
195
|
-
{
|
196
|
-
|
197
|
-
a = in_a;
|
198
|
-
|
199
|
-
b = in_b;
|
200
|
-
|
201
|
-
c = in_c;
|
202
|
-
|
203
|
-
// クラス呼び出し時に解を求めて内部変数に保存
|
204
|
-
|
205
|
-
Solve();
|
206
|
-
|
207
|
-
};
|
208
|
-
|
209
195
|
// 解を計算して内部変数に保存する関数
|
210
196
|
|
211
197
|
void Solve();
|
212
198
|
|
199
|
+
void Disp();
|
200
|
+
|
213
201
|
};
|
214
202
|
|
215
203
|
|
@@ -220,9 +208,9 @@
|
|
220
208
|
|
221
209
|
// insert code here...
|
222
210
|
|
223
|
-
QuadraticEq EQ(1,
|
211
|
+
QuadraticEq EQ(1, 1, -6);
|
224
|
-
|
212
|
+
|
225
|
-
|
213
|
+
EQ.Disp();
|
226
214
|
|
227
215
|
return 0;
|
228
216
|
|
@@ -230,8 +218,6 @@
|
|
230
218
|
|
231
219
|
|
232
220
|
|
233
|
-
///////////// Solve()記述 /////////////////
|
234
|
-
|
235
221
|
void QuadraticEq::Solve()
|
236
222
|
|
237
223
|
{
|
@@ -258,7 +244,9 @@
|
|
258
244
|
|
259
245
|
float Largerx = (-b + sqrt(SqrtPart)) / 2 * a;
|
260
246
|
|
247
|
+
x.push_back(complex<float>(Smallerx,0));
|
248
|
+
|
261
|
-
x
|
249
|
+
x.push_back(complex<float>(Largerx,0));
|
262
250
|
|
263
251
|
}
|
264
252
|
|
@@ -270,7 +258,7 @@
|
|
270
258
|
|
271
259
|
float RealPart = -b / 2 * a;
|
272
260
|
|
273
|
-
x
|
261
|
+
x.push_back(complex<float>(RealPart,0));
|
274
262
|
|
275
263
|
}
|
276
264
|
|
@@ -288,7 +276,9 @@
|
|
288
276
|
|
289
277
|
float ImagPart = SqrtPart / (2 * a);
|
290
278
|
|
291
|
-
x
|
279
|
+
x.push_back(complex<float>(RealPart, -ImagPart));
|
280
|
+
|
281
|
+
x.push_back(complex<float>(RealPart, ImagPart));
|
292
282
|
|
293
283
|
}
|
294
284
|
|
@@ -300,7 +290,47 @@
|
|
300
290
|
|
301
291
|
{
|
302
292
|
|
303
|
-
x
|
293
|
+
x.push_back(complex<float>(-c / b, 0));
|
294
|
+
|
295
|
+
}
|
296
|
+
|
297
|
+
};
|
298
|
+
|
299
|
+
|
300
|
+
|
301
|
+
void QuadraticEq::Disp()
|
302
|
+
|
303
|
+
{
|
304
|
+
|
305
|
+
for (int i = 0; i < x.size(); i++)
|
306
|
+
|
307
|
+
{
|
308
|
+
|
309
|
+
// 虚部の値によって表示を変える
|
310
|
+
|
311
|
+
if (x[i].imag() > 0)
|
312
|
+
|
313
|
+
{
|
314
|
+
|
315
|
+
cout << x[i].real() << " + " << x[i].imag() << endl;
|
316
|
+
|
317
|
+
}
|
318
|
+
|
319
|
+
else if (x[i].imag() == 0)
|
320
|
+
|
321
|
+
{
|
322
|
+
|
323
|
+
cout << x[i].real() << endl;
|
324
|
+
|
325
|
+
}
|
326
|
+
|
327
|
+
else
|
328
|
+
|
329
|
+
{
|
330
|
+
|
331
|
+
cout << x[i].real() << x[i].imag() << endl;
|
332
|
+
|
333
|
+
}
|
304
334
|
|
305
335
|
}
|
306
336
|
|
1
コードの変更
test
CHANGED
File without changes
|
test
CHANGED
@@ -135,3 +135,175 @@
|
|
135
135
|
できる限り疑問点をまとめたつもりですが,どういう風に返したいのかなど曖昧でしたら補足させていただきます.
|
136
136
|
|
137
137
|
どうぞよろしくお願いいたします.
|
138
|
+
|
139
|
+
|
140
|
+
|
141
|
+
# 追記
|
142
|
+
|
143
|
+
ご回答のように,解が実数の場合でも虚数部が0であるというようにしてコードを書いてみました.
|
144
|
+
|
145
|
+
しかし,`main()`関数で解を取得する書き方がわかりません.教えていただきたいです.
|
146
|
+
|
147
|
+
```C++
|
148
|
+
|
149
|
+
#include <iostream>
|
150
|
+
|
151
|
+
#include <string>
|
152
|
+
|
153
|
+
#include <cmath>
|
154
|
+
|
155
|
+
|
156
|
+
|
157
|
+
using namespace std;
|
158
|
+
|
159
|
+
|
160
|
+
|
161
|
+
// 二次関数を表現するためのクラス
|
162
|
+
|
163
|
+
class QuadraticEq
|
164
|
+
|
165
|
+
{
|
166
|
+
|
167
|
+
// a x^2 + b x + c = 0のための変数
|
168
|
+
|
169
|
+
float a;
|
170
|
+
|
171
|
+
float b;
|
172
|
+
|
173
|
+
float c;
|
174
|
+
|
175
|
+
// xの構造体用意
|
176
|
+
|
177
|
+
struct x_struct
|
178
|
+
|
179
|
+
{
|
180
|
+
|
181
|
+
float real[2];
|
182
|
+
|
183
|
+
float imag[2];
|
184
|
+
|
185
|
+
};
|
186
|
+
|
187
|
+
// 解を保存しておく
|
188
|
+
|
189
|
+
x_struct x;
|
190
|
+
|
191
|
+
public:
|
192
|
+
|
193
|
+
QuadraticEq(float in_a, float in_b, float in_c)
|
194
|
+
|
195
|
+
{
|
196
|
+
|
197
|
+
a = in_a;
|
198
|
+
|
199
|
+
b = in_b;
|
200
|
+
|
201
|
+
c = in_c;
|
202
|
+
|
203
|
+
// クラス呼び出し時に解を求めて内部変数に保存
|
204
|
+
|
205
|
+
Solve();
|
206
|
+
|
207
|
+
};
|
208
|
+
|
209
|
+
// 解を計算して内部変数に保存する関数
|
210
|
+
|
211
|
+
void Solve();
|
212
|
+
|
213
|
+
};
|
214
|
+
|
215
|
+
|
216
|
+
|
217
|
+
///////////// main /////////////////
|
218
|
+
|
219
|
+
int main(int argc, const char * argv[]) {
|
220
|
+
|
221
|
+
// insert code here...
|
222
|
+
|
223
|
+
QuadraticEq EQ(1, 4, 4);
|
224
|
+
|
225
|
+
// 【疑問】ここで解を取り出したい
|
226
|
+
|
227
|
+
return 0;
|
228
|
+
|
229
|
+
}
|
230
|
+
|
231
|
+
|
232
|
+
|
233
|
+
///////////// Solve()記述 /////////////////
|
234
|
+
|
235
|
+
void QuadraticEq::Solve()
|
236
|
+
|
237
|
+
{
|
238
|
+
|
239
|
+
// aが0以外なら二次方程式
|
240
|
+
|
241
|
+
if(a != 0)
|
242
|
+
|
243
|
+
{
|
244
|
+
|
245
|
+
// qrtPart : 根号の中を計算
|
246
|
+
|
247
|
+
float SqrtPart = b*b - 4*a*c;
|
248
|
+
|
249
|
+
// 解が実数で二つの時
|
250
|
+
|
251
|
+
if(SqrtPart > 0)
|
252
|
+
|
253
|
+
{
|
254
|
+
|
255
|
+
// 実部の計算
|
256
|
+
|
257
|
+
float Smallerx = (-b - sqrt(SqrtPart)) / 2 * a;
|
258
|
+
|
259
|
+
float Largerx = (-b + sqrt(SqrtPart)) / 2 * a;
|
260
|
+
|
261
|
+
x = x_struct{{Smallerx, 0},{Largerx, 0}};
|
262
|
+
|
263
|
+
}
|
264
|
+
|
265
|
+
// 解が実数かつ重解
|
266
|
+
|
267
|
+
else if (SqrtPart == 0)
|
268
|
+
|
269
|
+
{
|
270
|
+
|
271
|
+
float RealPart = -b / 2 * a;
|
272
|
+
|
273
|
+
x = x_struct{RealPart, 0};
|
274
|
+
|
275
|
+
}
|
276
|
+
|
277
|
+
// 解が複素数
|
278
|
+
|
279
|
+
else
|
280
|
+
|
281
|
+
{
|
282
|
+
|
283
|
+
// 実部の計算
|
284
|
+
|
285
|
+
float RealPart = - b / (2 * a);
|
286
|
+
|
287
|
+
// 虚部の計算
|
288
|
+
|
289
|
+
float ImagPart = SqrtPart / (2 * a);
|
290
|
+
|
291
|
+
x = x_struct{{RealPart, ImagPart},{RealPart, -ImagPart}};
|
292
|
+
|
293
|
+
}
|
294
|
+
|
295
|
+
}
|
296
|
+
|
297
|
+
// aが一次方程式
|
298
|
+
|
299
|
+
else
|
300
|
+
|
301
|
+
{
|
302
|
+
|
303
|
+
x = x_struct{-c / b, 0};
|
304
|
+
|
305
|
+
}
|
306
|
+
|
307
|
+
};
|
308
|
+
|
309
|
+
```
|