teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

コードの変更

2020/04/17 00:20

投稿

Kenichir
Kenichir

スコア28

title CHANGED
File without changes
body CHANGED
@@ -68,53 +68,46 @@
68
68
  できる限り疑問点をまとめたつもりですが,どういう風に返したいのかなど曖昧でしたら補足させていただきます.
69
69
  どうぞよろしくお願いいたします.
70
70
 
71
- # 追記
71
+ # 【解決コード】追記
72
- ご回答のように解が実数の場合でも虚数部が0であるというようにコードを書いした
72
+ ご回答の通りvectorを用ればまくいったので修正た最終的なコードを載せおき
73
- し,`main()`関数で解を取得る書き方わかりせん.教えていただきたす.
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
- x_struct x;
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, 4, 4);
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 = x_struct{{Smallerx, 0},{Largerx, 0}};
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 = x_struct{RealPart, 0};
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 = x_struct{{RealPart, ImagPart},{RealPart, -ImagPart}};
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 = x_struct{-c / b, 0};
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

コードの変更

2020/04/17 00:20

投稿

Kenichir
Kenichir

スコア28

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