質問編集履歴

2

編集

2018/08/09 20:42

投稿

carnage0216
carnage0216

スコア194

test CHANGED
@@ -1 +1 @@
1
- 意図した通りの式をプログラムに出来ているかについて。
1
+ 意図した通りの式をプログラムに出来ているかについて。(編集:jのfor文がうまく機能しません。)
test CHANGED
@@ -1,64 +1,234 @@
1
- 質問したいことがあります。
1
+ ~~質問したいことがあります。
2
-
2
+
3
- 以下の式に間違いがないかを指摘してほしいです。
3
+ 以下の式に間違いがないかを指摘してほしいです。~~
4
-
5
- ```
4
+
6
-
5
+
6
+
7
- for (i = N - 1; i >= 0; i--) {
7
+ ~~ for (i = N - 1; i >= 0; i--) {~~
8
-
9
-
10
-
8
+
9
+
10
+
11
-   d = a[i][N] ; //d = a[2][3] / a[2][2]
11
+   ~~d = a[i][N] ; //d = a[2][3] / a[2][2]
12
12
 
13
13
    for (j = i + 1; j < N; j++)
14
14
 
15
15
  a[i][N] = d - a[i][j] * a[i][N] / a[i][i];
16
16
 
17
-
18
-
19
-
20
-
21
- ```
22
-
23
- の式a[i][N] = d - a[i][j] * a[i][N] / a[i][i]は
24
-
25
- a[i][N] = (d - a[i][j] * a[i][N]) / a[i][i]と同じような式なのでしょうか?
26
-
27
- また、同じように、
28
-
29
- ```
30
-
31
- for (i = N - 1; i >= 0; i--) {
32
-
33
-
34
-
35
- a[i][N] = a[i][N] ;
36
-
37
-   for (j = i + 1; j < N; j++)
38
-
39
- a[i][N] = a[i][N] - a[i][j] * a[i][N] / a[i][i];
40
-
41
-
17
+ ~~
18
+
19
+
20
+
21
+ ~~}~~
22
+
23
+
24
+
25
+ ~~の式a[i][N] = d - a[i][j] * a[i][N] / a[i][i]は~~
26
+
27
+ ~~a[i][N] = (d - a[i][j] * a[i][N]) / a[i][i]と同じような式なのでしょうか?~~
28
+
29
+ ~~また、同じように、~~
30
+
31
+
32
+
33
+ ~~ for (i = N - 1; i >= 0; i--) {~~
34
+
35
+
36
+
37
+ ~~a[i][N] = a[i][N] ; ~~
38
+
39
+   ~~for (j = i + 1; j < N; j++)~~
40
+
41
+ ~~ a[i][N] = a[i][N] - a[i][j] * a[i][N] / a[i][i];
42
+
43
+ ~~
44
+
45
+ ~~}~~
46
+
47
+
48
+
49
+ ~~の式a[i][N] = a[i][N] - a[i][j] * a[i][N] / a[i][i]は~~
50
+
51
+ ~~a[i][N] = a[i][N] - (a[i][j] * a[i][N] / a[i][i])と同じような式なのでしょうか?~~
52
+
53
+
54
+
55
+
56
+
57
+
58
+
59
+ 編集
60
+
61
+ 以下のプログラムをprintfで中身を表示してみました。
62
+
63
+ 以下が全体のプログラムです。
64
+
65
+ ```
66
+
67
+ #include <iostream>
68
+
69
+ #include <stdio.h>
70
+
71
+
72
+
73
+ // 元の数定義
74
+
75
+ #define N 3 // 3
76
+
77
+
78
+
79
+ using namespace std;
80
+
81
+
82
+
83
+ //double a[N][N+1];
84
+
85
+ // 係数
86
+
87
+ static double a[N][N + 1] = {
88
+
89
+ { 1.0, 2.0, 8.0, 4.0},
90
+
91
+ { 4.0, 3.0, 2.0, 12.0},
92
+
93
+ { 1.0, 4.0, 2.0, 4.0},
94
+
95
+ };
96
+
97
+
98
+
99
+
100
+
101
+ int main()
102
+
103
+ {
104
+
105
+ double d;
106
+
107
+ int i;
108
+
109
+ int j;
110
+
111
+
112
+
113
+ for (i = N - 1; i >= 0; i--) {
114
+
115
+
116
+
117
+ d = a[i][N] ; //d = a[2][3] / a[2][2]
118
+
119
+
120
+
121
+ printf("**d=a[%d][%d],中身は%fです**\n",i,N,d);
122
+
123
+
124
+
125
+ for (j = i + 1; j < N; j++)
126
+
127
+  
128
+
129
+     a[i][N] = d - a[i][j] * a[i][N] / a[i][i];
130
+
131
+
132
+
133
+     printf("%f/%f-(%f)*%f/%fである\n", a[i][N],a[i][i],a[i][j],a[i][N],a[i][i]);
134
+
135
+     printf("a[%d][%d] / a[%d][%d]-a[%d][%d]*a[%d][%d]/a[%d][%d]である\n",i,N,i,i,i,j,i,N,i,i);
136
+
137
+     printf("%f\n", a[i][N]);
138
+
139
+
140
+
141
+ }
142
+
143
+
144
+
145
+
146
+
147
+
148
+
149
+ for (i = N - 1; i >= 0; i--) {
150
+
151
+
152
+
153
+ a[i][N] = a[i][N] ;
154
+
155
+
156
+
157
+ printf("a[%d][%d],中身は%fです\n", i,N, a[i][N]);
158
+
159
+ for (j = i + 1; j < N; j++)
160
+
161
+
162
+
163
+ a[i][N] = a[i][N] - a[i][j] * a[i][N] / a[i][i];
164
+
165
+
166
+
167
+ printf("%f\n", a[i][N]);
168
+
169
+
170
+
171
+ }
172
+
173
+
174
+
175
+ return 0;
42
176
 
43
177
  }
44
178
 
45
179
  ```
46
180
 
181
+ 正直、変数に置き換えた場合と配列のまま置いて計算した場合でなぜ答えが変わってくるのかよくわかりません。どうか理由を計算順序を踏まえて詳しく教えていただけないでしょうか?
182
+
183
+
184
+
185
+ 実行結果は以下の通りです。
186
+
187
+ ```
188
+
189
+ d=a[2][3],中身は4.000000です
190
+
191
+ 4.000000/2.000000-(4.000000)*4.000000/2.000000である
192
+
47
- の式a[i][N] = a[i][N] - a[i][j] * a[i][N] / a[i][i]
193
+ a[2][3] / a[2][2]-a[2][3]*a[2][3]/a[2][2]である
194
+
48
-
195
+ 4.000000
196
+
197
+ d=a[1][3],中身は12.000000です
198
+
199
+ 4.000000/3.000000-(4.000000)*4.000000/3.000000である
200
+
49
- a[i][N] = a[i][N] - (a[i][j] * a[i][N] / a[i][i])と同じような式なのしょうか?
201
+ a[1][3] / a[1][1]-a[1][3]*a[1][3]/a[1][1]である
50
-
51
-
52
-
53
-
54
-
55
-
56
-
202
+
57
- 編集
203
+ 4.000000
204
+
58
-
205
+ d=a[0][3],中身は4.000000です
206
+
207
+ 36.000000/1.000000-(36.000000)*36.000000/1.000000である
208
+
209
+ a[0][3] / a[0][0]-a[0][3]*a[0][3]/a[0][0]である
210
+
211
+ 36.000000
212
+
213
+ **a[2][3],中身は4.000000です**
214
+
215
+ 4.000000
216
+
217
+ **a[1][3],中身は4.000000です**
218
+
219
+ 1.333333
220
+
59
- 以下のプログラムをprintfで中身を表示してみました。
221
+ **a[0][3],中身は36.000000です**
222
+
60
-
223
+ 252.000000
224
+
225
+
226
+
227
+ ```
228
+
229
+
230
+
61
- 以下が全体のプログラムです。
231
+ 編集8/10
62
232
 
63
233
  ```
64
234
 
@@ -112,27 +282,21 @@
112
282
 
113
283
 
114
284
 
115
- d = a[i][N] ; //d = a[2][3] / a[2][2]
285
+ d = a[i][N]/ a[i][i];
116
-
117
-
118
-
286
+
119
- printf("**d=a[%d][%d],中身は%fです**\n",i,N,d);
287
+ printf("d=a[%d][%d]/a[%d][%d]よりdは%fです\n",i,N,i,i,d);
120
-
121
-
288
+
289
+
122
290
 
123
291
  for (j = i + 1; j < N; j++)
124
292
 
125
-  
126
-
127
-     a[i][N] = d - a[i][j] * a[i][N] / a[i][i];
293
+ a[i][N] = d - a[i][j] * a[i][N] / a[i][i];
294
+
128
-
295
+ printf("式は%f - a[%d][%d] * a[%d][%d]/a[%d][%d]です\n", d, i, j, i, N, i, i);
296
+
129
-
297
+ printf(" a[%d][%d]の中身は%f\n",i,N,a[i][N]);
130
-
298
+
131
-     printf("%f/%f-(%f)*%f/%fである\n", a[i][N],a[i][i],a[i][j],a[i][N],a[i][i]);
299
+ printf("%f/%f-(%f)*%f/%fである\n", a[i][N],a[i][i],a[i][j],a[i][N],a[i][i]);
132
-
133
-     printf("a[%d][%d] / a[%d][%d]-a[%d][%d]*a[%d][%d]/a[%d][%d]である\n",i,N,i,i,i,j,i,N,i,i);
134
-
135
-     printf("%f\n", a[i][N]);
136
300
 
137
301
 
138
302
 
@@ -148,23 +312,17 @@
148
312
 
149
313
 
150
314
 
151
- a[i][N] = a[i][N] ;
315
+ a[i][N] = a[i][N]/ a[i][i];
152
-
153
-
154
-
316
+
155
- printf("a[%d][%d],中身は%fです\n", i,N, a[i][N]);
317
+ printf("a[%d][%d]中身は%fです\n", i,N, a[i][N]);
156
318
 
157
319
  for (j = i + 1; j < N; j++)
158
320
 
159
-
160
-
161
- a[i][N] = a[i][N] - a[i][j] * a[i][N] / a[i][i];
321
+ a[i][N] = a[i][N] - a[i][j] * a[i][N] / a[i][i];
162
-
163
-
164
322
 
165
323
  printf("%f\n", a[i][N]);
166
324
 
167
-
325
+ printf("式はa[%d][%d] - a[%d][%d] * a[%d][%d] / a[%d][%d]です\n",i,N,i,j,i,N,i,i);
168
326
 
169
327
  }
170
328
 
@@ -176,50 +334,72 @@
176
334
 
177
335
  ```
178
336
 
179
- 正直、変数に置き換えた場合と配列のまま置いて計算した場合でなぜ答えが変わってくるのかよくわかりません。どうか理由を計算順序を踏まえて詳しく教えていただけないでしょうか?
180
-
181
-
182
-
183
- 実行結果は以下のです
337
+ 実行したところ、以下のようになました
184
-
338
+
185
- ```
339
+ ```
340
+
186
-
341
+ d=a[2][3]/a[2][2]よりdは2.000000です
342
+
343
+ 式は2.000000 - a[2][3] * a[2][3]/a[2][2]です
344
+
187
- d=a[2][3],中身は4.000000です
345
+ a[2][3]中身は4.000000
188
346
 
189
347
  4.000000/2.000000-(4.000000)*4.000000/2.000000である
190
348
 
349
+ d=a[1][3]/a[1][1]よりdは4.000000です
350
+
191
- a[2][3] / a[2][2]-a[2][3]*a[2][3]/a[2][2]である
351
+ 式は4.000000 - a[1][3] * a[1][3]/a[1][1]で
192
-
193
- 4.000000
352
+
194
-
195
- d=a[1][3],中身は12.000000です
353
+ a[1][3]中身は-4.000000
196
-
354
+
197
- 4.000000/3.000000-(4.000000)*4.000000/3.000000である
355
+ -4.000000/3.000000-(-4.000000)*-4.000000/3.000000である
356
+
198
-
357
+ d=a[0][3]/a[0][0]よりdは4.000000です
358
+
199
- a[1][3] / a[1][1]-a[1][3]*a[1][3]/a[1][1]である
359
+ 式は4.000000 - a[0][3] * a[0][3]/a[0][0]で
200
-
201
- 4.000000
360
+
202
-
203
- d=a[0][3],中身は4.000000です
361
+ a[0][3]中身は36.000000
204
362
 
205
363
  36.000000/1.000000-(36.000000)*36.000000/1.000000である
206
364
 
207
- a[0][3] / a[0][0]-a[0][3]*a[0][3]/a[0][0]である
208
-
209
- 36.000000
210
-
211
- **a[2][3],中身は4.000000です**
365
+ a[2][3]中身は2.000000です
212
-
366
+
213
- 4.000000
367
+ 2.000000
368
+
214
-
369
+ 式はa[2][3] - a[2][3] * a[2][3] / a[2][2]です
370
+
215
- **a[1][3],中身は4.000000です**
371
+ a[1][3]中身は-1.333333です
216
-
372
+
217
- 1.333333
373
+ -0.444444
374
+
218
-
375
+ 式はa[1][3] - a[1][3] * a[1][3] / a[1][1]です
376
+
219
- **a[0][3],中身は36.000000です**
377
+ a[0][3]中身は36.000000です
220
378
 
221
379
  252.000000
222
380
 
223
-
381
+ 式はa[0][3] - a[0][3] * a[0][3] / a[0][0]です
224
-
382
+
225
- ```
383
+ ```
384
+
385
+ jの部分がなぜか変化せず、3のままです。
386
+
387
+ 他にもi=2,N=3,j=3の時、j<Nよりj=3の時は実行結果の
388
+
389
+ ```
390
+
391
+ 式は2.000000 - a[2][3] * a[2][3]/a[2][2]です
392
+
393
+ 4.000000/2.000000-(4.000000)*4.000000/2.000000である
394
+
395
+ ```
396
+
397
+ 自体は出ないと思います。
398
+
399
+ printfで中身を表示してみたのですが、原因が全くわかりません。
400
+
401
+ どうしたらfor文を正しく動作させて、jを変化させて理想の計算をさせられるでしょうか?
402
+
403
+ 以前に載せたプログラムと少し違うのですが、**私のくだらない質問**を新しく質問として投稿するのは申し訳ないと思い編集という形で質問させていただきました。
404
+
405
+ どうか知恵を貸していただけないでしょうか。お願いします。

1

編集

2018/08/09 20:42

投稿

carnage0216
carnage0216

スコア194

test CHANGED
File without changes
test CHANGED
@@ -47,3 +47,179 @@
47
47
  の式a[i][N] = a[i][N] - a[i][j] * a[i][N] / a[i][i]は
48
48
 
49
49
  a[i][N] = a[i][N] - (a[i][j] * a[i][N] / a[i][i])と同じような式なのでしょうか?
50
+
51
+
52
+
53
+
54
+
55
+
56
+
57
+ 編集
58
+
59
+ 以下のプログラムをprintfで中身を表示してみました。
60
+
61
+ 以下が全体のプログラムです。
62
+
63
+ ```
64
+
65
+ #include <iostream>
66
+
67
+ #include <stdio.h>
68
+
69
+
70
+
71
+ // 元の数定義
72
+
73
+ #define N 3 // 3
74
+
75
+
76
+
77
+ using namespace std;
78
+
79
+
80
+
81
+ //double a[N][N+1];
82
+
83
+ // 係数
84
+
85
+ static double a[N][N + 1] = {
86
+
87
+ { 1.0, 2.0, 8.0, 4.0},
88
+
89
+ { 4.0, 3.0, 2.0, 12.0},
90
+
91
+ { 1.0, 4.0, 2.0, 4.0},
92
+
93
+ };
94
+
95
+
96
+
97
+
98
+
99
+ int main()
100
+
101
+ {
102
+
103
+ double d;
104
+
105
+ int i;
106
+
107
+ int j;
108
+
109
+
110
+
111
+ for (i = N - 1; i >= 0; i--) {
112
+
113
+
114
+
115
+ d = a[i][N] ; //d = a[2][3] / a[2][2]
116
+
117
+
118
+
119
+ printf("**d=a[%d][%d],中身は%fです**\n",i,N,d);
120
+
121
+
122
+
123
+ for (j = i + 1; j < N; j++)
124
+
125
+  
126
+
127
+     a[i][N] = d - a[i][j] * a[i][N] / a[i][i];
128
+
129
+
130
+
131
+     printf("%f/%f-(%f)*%f/%fである\n", a[i][N],a[i][i],a[i][j],a[i][N],a[i][i]);
132
+
133
+     printf("a[%d][%d] / a[%d][%d]-a[%d][%d]*a[%d][%d]/a[%d][%d]である\n",i,N,i,i,i,j,i,N,i,i);
134
+
135
+     printf("%f\n", a[i][N]);
136
+
137
+
138
+
139
+ }
140
+
141
+
142
+
143
+
144
+
145
+
146
+
147
+ for (i = N - 1; i >= 0; i--) {
148
+
149
+
150
+
151
+ a[i][N] = a[i][N] ;
152
+
153
+
154
+
155
+ printf("a[%d][%d],中身は%fです\n", i,N, a[i][N]);
156
+
157
+ for (j = i + 1; j < N; j++)
158
+
159
+
160
+
161
+ a[i][N] = a[i][N] - a[i][j] * a[i][N] / a[i][i];
162
+
163
+
164
+
165
+ printf("%f\n", a[i][N]);
166
+
167
+
168
+
169
+ }
170
+
171
+
172
+
173
+ return 0;
174
+
175
+ }
176
+
177
+ ```
178
+
179
+ 正直、変数に置き換えた場合と配列のまま置いて計算した場合でなぜ答えが変わってくるのかよくわかりません。どうか理由を計算順序を踏まえて詳しく教えていただけないでしょうか?
180
+
181
+
182
+
183
+ 実行結果は以下の通りです。
184
+
185
+ ```
186
+
187
+ d=a[2][3],中身は4.000000です
188
+
189
+ 4.000000/2.000000-(4.000000)*4.000000/2.000000である
190
+
191
+ a[2][3] / a[2][2]-a[2][3]*a[2][3]/a[2][2]である
192
+
193
+ 4.000000
194
+
195
+ d=a[1][3],中身は12.000000です
196
+
197
+ 4.000000/3.000000-(4.000000)*4.000000/3.000000である
198
+
199
+ a[1][3] / a[1][1]-a[1][3]*a[1][3]/a[1][1]である
200
+
201
+ 4.000000
202
+
203
+ d=a[0][3],中身は4.000000です
204
+
205
+ 36.000000/1.000000-(36.000000)*36.000000/1.000000である
206
+
207
+ a[0][3] / a[0][0]-a[0][3]*a[0][3]/a[0][0]である
208
+
209
+ 36.000000
210
+
211
+ **a[2][3],中身は4.000000です**
212
+
213
+ 4.000000
214
+
215
+ **a[1][3],中身は4.000000です**
216
+
217
+ 1.333333
218
+
219
+ **a[0][3],中身は36.000000です**
220
+
221
+ 252.000000
222
+
223
+
224
+
225
+ ```