質問編集履歴

3

解、判別式の訂正と入力データ確認の部分の修正

2020/05/13 06:04

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -34,168 +34,152 @@
34
34
 
35
35
  ##発生している問題・エラーメッセージ
36
36
 
37
-
37
+ 虚数解の場合が表示されません。すべて解がb/aとして計算されてしまいます。
38
+
39
+
40
+
41
+ ###該当のソースコード
42
+
43
+
44
+
45
+ ```c
46
+
47
+ //修正済み
48
+
49
+
50
+
51
+ #include <stdio.h>
52
+
53
+ #include <stdlib.h>
54
+
55
+
56
+
57
+
58
+
59
+ //解の公式の√(判別式)の部分の処理を行う関数
60
+
61
+
62
+
63
+ double mysqrt(double y){
64
+
65
+
66
+
67
+ double a,b,c,d;
68
+
69
+
70
+
71
+ int count=0; //反復回数
72
+
73
+
74
+
75
+ printf(" %21.16g(反復回数%d 回)¥n", y, count);
76
+
77
+
78
+
79
+ while(count < 1000) {
80
+
81
+ count++;
82
+
83
+ y = -(a*d + b*c)*(a*d + b*c); //判別式
84
+
85
+
86
+
87
+ printf(" %21.16g(反復回数%d 回)¥n", y, count);
88
+
89
+
90
+
91
+ }
92
+
93
+
94
+
95
+ //値の更新
96
+
97
+ y = -(a*d + b*c)*(a*d + b*c);
98
+
99
+
100
+
101
+ return y;
102
+
103
+ }
104
+
105
+
106
+
107
+ int main(){
108
+
109
+
110
+
111
+ double a=0,b=0,c=0,d=0;
112
+
113
+
114
+
115
+ double num1=0,num2=0; //解
116
+
117
+ double real=0, image=0; //複素数を含む場合
118
+
119
+
120
+
121
+ double y=0; //判別式
122
+
123
+
124
+
125
+ printf("係数を入力せよ\n");
126
+
127
+
128
+
129
+ scanf("%lf",&a);
130
+
131
+ scanf("%lf",&b);
132
+
133
+ scanf("%lf",&c);
134
+
135
+ scanf("%lf",&d);
136
+
137
+
138
+
139
+
140
+
141
+ //入力データの確認
142
+
143
+ if ((a*a+c*c)==0) {
144
+
145
+ printf("解の公式の分母は0以外の数にしてください¥n");
146
+
147
+ exit(EXIT_SUCCESS);
148
+
149
+ }
150
+
151
+
152
+
153
+
154
+
155
+ if(y==0){
156
+
157
+ num1 = num2 = b/a; //重解を持つ場合
158
+
159
+
160
+
161
+ printf("解: x=%.2f, %.2f\n",num1,num2);
162
+
163
+
164
+
165
+ }else{ //虚数解をもつ場合
166
+
167
+ real = (a*b+c*d)/(a*a+c*c);
168
+
169
+ image = mysqrt(y)/(a*a+c*c);
170
+
171
+
172
+
173
+ printf("解: %.2f+%.2fi, %.2f-%.2fi\n",real,image);
174
+
175
+ }
176
+
177
+ return 0;
178
+
179
+ }
38
180
 
39
181
  ```
40
182
 
41
- 係数を入力せよ
42
-
43
- (任意のa)
44
-
45
- (任意のb)
46
-
47
- (任意のc)
48
-
49
- (任意のd)
50
-
51
- 解の公式の分母は0以外の数にしてください
52
-
53
- ```
54
-
55
- 全て0以外の数値を代入しているのですが、解の公式の分母である(a^2+c^2)が0として認識されます。
56
-
57
- ###該当のソースコード
58
-
59
-
60
-
61
- ```c
62
-
63
- //修正済み
64
-
65
-
66
-
67
- #include <stdio.h>
68
-
69
- #include <stdlib.h>
70
-
71
-
72
-
73
-
74
-
75
- //解の公式の√(判別式)の部分の処理を行う関数
76
-
77
-
78
-
79
- double mysqrt(double y){
80
-
81
-
82
-
83
- double a,b,c,d;
84
-
85
-
86
-
87
- int count=0; //反復回数
88
-
89
-
90
-
91
- printf(" %21.16g(反復回数%d 回)¥n", y, count);
92
-
93
-
94
-
95
- while(count < 1000) {
96
-
97
- count++;
98
-
99
- y = -(a*d + b*c)*(a*d + b*c); //判別式
100
-
101
-
102
-
103
- printf(" %21.16g(反復回数%d 回)¥n", y, count);
104
-
105
-
106
-
107
- }
108
-
109
-
110
-
111
- //値の更新
112
-
113
- y = -(a*d + b*c)*(a*d + b*c);
114
-
115
-
116
-
117
- return y;
118
-
119
- }
120
-
121
-
122
-
123
- int main(){
124
-
125
-
126
-
127
- double a=0,b=0,c=0,d=0;
128
-
129
-
130
-
131
- double num1=0,num2=0; //解
132
-
133
- double real=0, image=0; //複素数を含む場合
134
-
135
-
136
-
137
- double y=0; //判別式
138
-
139
-
140
-
141
- printf("係数を入力せよ\n");
142
-
143
-
144
-
145
- scanf("%lf",&a);
146
-
147
- scanf("%lf",&b);
148
-
149
- scanf("%lf",&c);
150
-
151
- scanf("%lf",&d);
152
-
153
-
154
-
155
-
156
-
157
- //入力データの確認
158
-
159
- if (!(a*a+c*c)==0) {
160
-
161
- printf("解の公式の分母は0以外の数にしてください¥n");
162
-
163
- exit(EXIT_SUCCESS);
164
-
165
- }
166
-
167
-
168
-
169
-
170
-
171
- if(y==0){
172
-
173
- num1 = num2 = b/a; //重解を持つ場合
174
-
175
-
176
-
177
- printf("解: x=%.2f, %.2f\n",num1,num2);
178
-
179
-
180
-
181
- }else{ //虚数解をもつ場合
182
-
183
- real = (a*b+c*d)/(a*a+c*c);
184
-
185
- image = mysqrt(y)/(a*a+c*c);
186
-
187
-
188
-
189
- printf("解: %.2f+%.2fi, %.2f-%.2fi\n",real,image);
190
-
191
- }
192
-
193
- return 0;
194
-
195
- }
196
-
197
- ```
198
-
199
183
 
200
184
 
201
185
  #### 試したこと

2

解や判別式の訂正

2020/05/13 06:04

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
 
18
18
 
19
- ・<math.h>をインクルードしないこと(sqrt等使用しないこと)
19
+ ・<math.h>をインクルードしないこと(sqrt等使用しない)
20
20
 
21
21
 
22
22
 

1

解や判別式の訂正

2020/05/13 05:37

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -40,13 +40,19 @@
40
40
 
41
41
  係数を入力せよ
42
42
 
43
- (任意の整数a)
43
+ (任意のa)
44
+
44
-
45
+ (任意のb)
46
+
47
+ (任意のc)
48
+
49
+ (任意のd)
50
+
45
- Segmentation fault
51
+ 解の公式の分母は0以外の数にしてください
46
52
 
47
53
  ```
48
54
 
49
- コンパイルは出来るのですが、一つ目係数を入力したところ"Segmentatio fault"表示されます。
55
+ 全て0以外の数値を代入しているのですが、公式の分母ある(a^2+c^2)が0して認識されます。
50
56
 
51
57
  ###該当のソースコード
52
58
 
@@ -54,6 +60,10 @@
54
60
 
55
61
  ```c
56
62
 
63
+ //修正済み
64
+
65
+
66
+
57
67
  #include <stdio.h>
58
68
 
59
69
  #include <stdlib.h>
@@ -62,7 +72,7 @@
62
72
 
63
73
 
64
74
 
65
- //平方根求める関数
75
+ //解の公式の√(判別式)の部分の処理行う関数
66
76
 
67
77
 
68
78
 
@@ -70,126 +80,120 @@
70
80
 
71
81
 
72
82
 
83
+ double a,b,c,d;
84
+
85
+
86
+
87
+ int count=0; //反復回数
88
+
89
+
90
+
91
+ printf(" %21.16g(反復回数%d 回)¥n", y, count);
92
+
93
+
94
+
95
+ while(count < 1000) {
96
+
97
+ count++;
98
+
99
+ y = -(a*d + b*c)*(a*d + b*c); //判別式
100
+
101
+
102
+
103
+ printf(" %21.16g(反復回数%d 回)¥n", y, count);
104
+
105
+
106
+
107
+ }
108
+
109
+
110
+
111
+ //値の更新
112
+
113
+ y = -(a*d + b*c)*(a*d + b*c);
114
+
115
+
116
+
117
+ return y;
118
+
119
+ }
120
+
121
+
122
+
123
+ int main(){
124
+
125
+
126
+
73
127
  double a=0,b=0,c=0,d=0;
74
128
 
129
+
130
+
131
+ double num1=0,num2=0; //解
132
+
133
+ double real=0, image=0; //複素数を含む場合
134
+
135
+
136
+
75
- int count=0; //反復回数
137
+ double y=0; //判別式
76
-
77
-
78
-
79
- while(count < 1000) {
138
+
80
-
81
- count++;
139
+
82
-
83
- y = 2*a*b*c*d - (a*a*d*d+c*c*d*d); //判別式の定義
140
+
84
-
85
-
86
-
87
- printf(" %21.16g(反復回%d 回)¥n", y, count);
141
+ printf("を入力せよ\n");
142
+
143
+
144
+
88
-
145
+ scanf("%lf",&a);
146
+
147
+ scanf("%lf",&b);
148
+
149
+ scanf("%lf",&c);
150
+
151
+ scanf("%lf",&d);
152
+
153
+
154
+
155
+
156
+
157
+ //入力データの確認
158
+
159
+ if (!(a*a+c*c)==0) {
160
+
89
- printf("%21.16g (反復回%d回)\n",y,count);
161
+ printf("解の公式の分母は0以外のにしてください¥n");
162
+
90
-
163
+ exit(EXIT_SUCCESS);
164
+
91
- }
165
+ }
166
+
167
+
168
+
169
+
170
+
92
-
171
+ if(y==0){
93
-
94
-
172
+
95
- //値の更新
173
+ num1 = num2 = b/a; //重解を持つ場合
174
+
175
+
176
+
96
-
177
+ printf("解: x=%.2f, %.2f\n",num1,num2);
178
+
179
+
180
+
181
+ }else{ //虚数解をもつ場合
182
+
97
- y = 2*a*b*c*d - (a*a*d*d+c*c*d*d);
183
+ real = (a*b+c*d)/(a*a+c*c);
184
+
98
-
185
+ image = mysqrt(y)/(a*a+c*c);
186
+
187
+
188
+
99
-
189
+ printf("解: %.2f+%.2fi, %.2f-%.2fi\n",real,image);
190
+
100
-
191
+ }
192
+
101
- return y;
193
+ return 0;
102
194
 
103
195
  }
104
196
 
105
-
106
-
107
- int main(){
108
-
109
-
110
-
111
- double a=0,b=0,c=0,d=0;
112
-
113
-
114
-
115
- double num1=0,num2=0; //解
116
-
117
- double real=0, image=0; //複素数を含む場合
118
-
119
-
120
-
121
- double y=0; //判別式
122
-
123
-
124
-
125
- printf("係数を入力せよ\n");
126
-
127
-
128
-
129
- scanf("%lf",a);
130
-
131
- scanf("%lf",b);
132
-
133
- scanf("%lf",c);
134
-
135
- scanf("%lf",d);
136
-
137
-
138
-
139
-
140
-
141
- //入力データの確認
142
-
143
- if (!(a=0)) {
144
-
145
- printf("aは0以外の数にしてください¥n");
146
-
147
- exit(EXIT_SUCCESS);
148
-
149
- }
150
-
151
- //判別式の場合分け
152
-
153
-
154
-
155
-    if(y>0){
156
-
157
- num1 = ((a*b+c*d)+mysqrt(y))/(a*a+c*c);
158
-
159
- num2 = ((a*b+c*d)-mysqrt(y))/(a*a+c*c);
160
-
161
-
162
-
163
- printf("解: x=%.2f, %.2f\n",num1,num2);
164
-
165
-
166
-
167
- }else if(y==0){
168
-
169
- num1 = num2 = (a*b+c*d)/(a*a+c*c);
170
-
171
-
172
-
173
- printf("解: x=%.2f, %.2f\n",num1,num2);
174
-
175
-
176
-
177
- }else{
178
-
179
- real = (a*b+c*d)/(a*a+c*c);
180
-
181
- image = mysqrt(-y)/(a*a+c*c);
182
-
183
-
184
-
185
- printf("解: %.2f+%.2fi, %.2f-%.2fi\n",real,image);
186
-
187
- }
188
-
189
- return 0;
190
-
191
- }
192
-
193
197
  ```
194
198
 
195
199
 
@@ -202,6 +206,8 @@
202
206
 
203
207
  ・全ての変数を初期化
204
208
 
209
+ ・解を求めるif文の箇所を訂正
210
+
205
211
 
206
212
 
207
213
  ##### 補足情報(FW/ツールのバージョンなど)