質問編集履歴

2

コードの変更

2020/04/17 00:20

投稿

Kenichir
Kenichir

スコア28

test CHANGED
File without changes
test CHANGED
@@ -138,13 +138,13 @@
138
138
 
139
139
 
140
140
 
141
- # 追記
141
+ # 【解決コード】追記
142
-
142
+
143
- ご回答のに,解が実数場合も虚数部が0であるというようにコードを書いした
143
+ ご回答の通り,vectorを用いればまくいったので修正た最終的なコードを載せおき
144
-
144
+
145
- `main()`関数解を取得する書き方がわかりせん.教えていただきたす.
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
- // xの構造体用意
175
+ // 解を保存しておく
176
+
176
-
177
+ vector<complex<float>> x;
178
+
177
- struct x_struct
179
+ public:
180
+
178
-
181
+ QuadraticEq(float in_a, float in_b, float in_c)
182
+
179
- {
183
+ {
180
-
184
+
181
- float real[2];
185
+ a = in_a;
182
-
186
+
183
- float imag[2];
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, 4, 4);
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 = x_struct{{Smallerx, 0},{Largerx, 0}};
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 = x_struct{RealPart, 0};
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 = x_struct{{RealPart, ImagPart},{RealPart, -ImagPart}};
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 = x_struct{-c / b, 0};
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

コードの変更

2020/04/17 00:20

投稿

Kenichir
Kenichir

スコア28

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
+ ```