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

質問編集履歴

2

編集

2018/08/09 20:42

投稿

carnage0216
carnage0216

スコア194

title CHANGED
@@ -1,1 +1,1 @@
1
- 意図した通りの式をプログラムに出来ているかについて。
1
+ 意図した通りの式をプログラムに出来ているかについて。(編集:jのfor文がうまく機能しません。)
body CHANGED
@@ -1,31 +1,32 @@
1
- 質問したいことがあります。
1
+ ~~質問したいことがあります。
2
- 以下の式に間違いがないかを指摘してほしいです。
2
+ 以下の式に間違いがないかを指摘してほしいです。~~
3
- ```
4
- for (i = N - 1; i >= 0; i--) {
5
3
 
4
+ ~~ for (i = N - 1; i >= 0; i--) {~~
5
+
6
-   d = a[i][N] ; //d = a[2][3] / a[2][2]
6
+   ~~d = a[i][N] ; //d = a[2][3] / a[2][2]
7
7
    for (j = i + 1; j < N; j++)
8
8
  a[i][N] = d - a[i][j] * a[i][N] / a[i][i];
9
+ ~~
9
10
 
10
-
11
- ```
11
+ ~~}~~
12
- の式a[i][N] = d - a[i][j] * a[i][N] / a[i][i]は
13
- a[i][N] = (d - a[i][j] * a[i][N]) / a[i][i]と同じような式なのでしょうか?
14
- また、同じように、
15
- ```
16
- for (i = N - 1; i >= 0; i--) {
17
12
 
18
- a[i][N] = a[i][N] ;
19
-   for (j = i + 1; j < N; j++)
20
- a[i][N] = a[i][N] - a[i][j] * a[i][N] / a[i][i];
13
+ ~~の式a[i][N] = d - a[i][j] * a[i][N] / a[i][i]は~~
14
+ ~~a[i][N] = (d - a[i][j] * a[i][N]) / a[i][i]と同じような式なのでしょうか?~~
15
+ ~~また、同じように、~~
21
16
 
22
- }
23
- ```
24
- の式a[i][N] = a[i][N] - a[i][j] * a[i][N] / a[i][i]は
17
+ ~~ for (i = N - 1; i >= 0; i--) {~~
25
- a[i][N] = a[i][N] - (a[i][j] * a[i][N] / a[i][i])と同じような式なのでしょうか?
26
18
 
19
+ ~~a[i][N] = a[i][N] ; ~~
20
+   ~~for (j = i + 1; j < N; j++)~~
21
+ ~~ a[i][N] = a[i][N] - a[i][j] * a[i][N] / a[i][i];
22
+ ~~
23
+ ~~}~~
27
24
 
25
+ ~~の式a[i][N] = a[i][N] - a[i][j] * a[i][N] / a[i][i]は~~
26
+ ~~a[i][N] = a[i][N] - (a[i][j] * a[i][N] / a[i][i])と同じような式なのでしょうか?~~
28
27
 
28
+
29
+
29
30
  編集
30
31
  以下のプログラムをprintfで中身を表示してみました。
31
32
  以下が全体のプログラムです。
@@ -110,4 +111,93 @@
110
111
  **a[0][3],中身は36.000000です**
111
112
  252.000000
112
113
 
113
- ```
114
+ ```
115
+
116
+ 編集8/10
117
+ ```
118
+ #include <iostream>
119
+ #include <stdio.h>
120
+
121
+ // 元の数定義
122
+ #define N 3 // 3
123
+
124
+ using namespace std;
125
+
126
+ //double a[N][N+1];
127
+ // 係数
128
+ static double a[N][N + 1] = {
129
+ { 1.0, 2.0, 8.0, 4.0},
130
+ { 4.0, 3.0, 2.0, 12.0},
131
+ { 1.0, 4.0, 2.0, 4.0},
132
+ };
133
+
134
+
135
+ int main()
136
+ {
137
+ double d;
138
+ int i;
139
+ int j;
140
+
141
+ for (i = N - 1; i >= 0; i--) {
142
+
143
+ d = a[i][N]/ a[i][i];
144
+ printf("d=a[%d][%d]/a[%d][%d]よりdは%fです\n",i,N,i,i,d);
145
+
146
+ for (j = i + 1; j < N; j++)
147
+ a[i][N] = d - a[i][j] * a[i][N] / a[i][i];
148
+ printf("式は%f - a[%d][%d] * a[%d][%d]/a[%d][%d]です\n", d, i, j, i, N, i, i);
149
+ printf(" a[%d][%d]の中身は%f\n",i,N,a[i][N]);
150
+ printf("%f/%f-(%f)*%f/%fである\n", a[i][N],a[i][i],a[i][j],a[i][N],a[i][i]);
151
+
152
+ }
153
+
154
+
155
+
156
+ for (i = N - 1; i >= 0; i--) {
157
+
158
+ a[i][N] = a[i][N]/ a[i][i];
159
+ printf("a[%d][%d]の中身は%fです\n", i,N, a[i][N]);
160
+ for (j = i + 1; j < N; j++)
161
+ a[i][N] = a[i][N] - a[i][j] * a[i][N] / a[i][i];
162
+ printf("%f\n", a[i][N]);
163
+ printf("式はa[%d][%d] - a[%d][%d] * a[%d][%d] / a[%d][%d]です\n",i,N,i,j,i,N,i,i);
164
+ }
165
+
166
+ return 0;
167
+ }
168
+ ```
169
+ を実行したところ、以下のようになりました。
170
+ ```
171
+ d=a[2][3]/a[2][2]よりdは2.000000です
172
+ 式は2.000000 - a[2][3] * a[2][3]/a[2][2]です
173
+ a[2][3]の中身は4.000000
174
+ 4.000000/2.000000-(4.000000)*4.000000/2.000000である
175
+ d=a[1][3]/a[1][1]よりdは4.000000です
176
+ 式は4.000000 - a[1][3] * a[1][3]/a[1][1]です
177
+ a[1][3]の中身は-4.000000
178
+ -4.000000/3.000000-(-4.000000)*-4.000000/3.000000である
179
+ d=a[0][3]/a[0][0]よりdは4.000000です
180
+ 式は4.000000 - a[0][3] * a[0][3]/a[0][0]です
181
+ a[0][3]の中身は36.000000
182
+ 36.000000/1.000000-(36.000000)*36.000000/1.000000である
183
+ a[2][3]の中身は2.000000です
184
+ 2.000000
185
+ 式はa[2][3] - a[2][3] * a[2][3] / a[2][2]です
186
+ a[1][3]の中身は-1.333333です
187
+ -0.444444
188
+ 式はa[1][3] - a[1][3] * a[1][3] / a[1][1]です
189
+ a[0][3]の中身は36.000000です
190
+ 252.000000
191
+ 式はa[0][3] - a[0][3] * a[0][3] / a[0][0]です
192
+ ```
193
+ jの部分がなぜか変化せず、3のままです。
194
+ 他にもi=2,N=3,j=3の時、j<Nよりj=3の時は実行結果の
195
+ ```
196
+ 式は2.000000 - a[2][3] * a[2][3]/a[2][2]です
197
+ 4.000000/2.000000-(4.000000)*4.000000/2.000000である
198
+ ```
199
+ 自体は出ないと思います。
200
+ printfで中身を表示してみたのですが、原因が全くわかりません。
201
+ どうしたらfor文を正しく動作させて、jを変化させて理想の計算をさせられるでしょうか?
202
+ 以前に載せたプログラムと少し違うのですが、**私のくだらない質問**を新しく質問として投稿するのは申し訳ないと思い編集という形で質問させていただきました。
203
+ どうか知恵を貸していただけないでしょうか。お願いします。

1

編集

2018/08/09 20:42

投稿

carnage0216
carnage0216

スコア194

title CHANGED
File without changes
body CHANGED
@@ -22,4 +22,92 @@
22
22
  }
23
23
  ```
24
24
  の式a[i][N] = a[i][N] - a[i][j] * a[i][N] / a[i][i]は
25
- a[i][N] = a[i][N] - (a[i][j] * a[i][N] / a[i][i])と同じような式なのでしょうか?
25
+ a[i][N] = a[i][N] - (a[i][j] * a[i][N] / a[i][i])と同じような式なのでしょうか?
26
+
27
+
28
+
29
+ 編集
30
+ 以下のプログラムをprintfで中身を表示してみました。
31
+ 以下が全体のプログラムです。
32
+ ```
33
+ #include <iostream>
34
+ #include <stdio.h>
35
+
36
+ // 元の数定義
37
+ #define N 3 // 3
38
+
39
+ using namespace std;
40
+
41
+ //double a[N][N+1];
42
+ // 係数
43
+ static double a[N][N + 1] = {
44
+ { 1.0, 2.0, 8.0, 4.0},
45
+ { 4.0, 3.0, 2.0, 12.0},
46
+ { 1.0, 4.0, 2.0, 4.0},
47
+ };
48
+
49
+
50
+ int main()
51
+ {
52
+ double d;
53
+ int i;
54
+ int j;
55
+
56
+ for (i = N - 1; i >= 0; i--) {
57
+
58
+ d = a[i][N] ; //d = a[2][3] / a[2][2]
59
+
60
+ printf("**d=a[%d][%d],中身は%fです**\n",i,N,d);
61
+
62
+ for (j = i + 1; j < N; j++)
63
+  
64
+     a[i][N] = d - a[i][j] * a[i][N] / a[i][i];
65
+
66
+     printf("%f/%f-(%f)*%f/%fである\n", a[i][N],a[i][i],a[i][j],a[i][N],a[i][i]);
67
+     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);
68
+     printf("%f\n", a[i][N]);
69
+
70
+ }
71
+
72
+
73
+
74
+ for (i = N - 1; i >= 0; i--) {
75
+
76
+ a[i][N] = a[i][N] ;
77
+
78
+ printf("a[%d][%d],中身は%fです\n", i,N, a[i][N]);
79
+ for (j = i + 1; j < N; j++)
80
+
81
+ a[i][N] = a[i][N] - a[i][j] * a[i][N] / a[i][i];
82
+
83
+ printf("%f\n", a[i][N]);
84
+
85
+ }
86
+
87
+ return 0;
88
+ }
89
+ ```
90
+ 正直、変数に置き換えた場合と配列のまま置いて計算した場合でなぜ答えが変わってくるのかよくわかりません。どうか理由を計算順序を踏まえて詳しく教えていただけないでしょうか?
91
+
92
+ 実行結果は以下の通りです。
93
+ ```
94
+ d=a[2][3],中身は4.000000です
95
+ 4.000000/2.000000-(4.000000)*4.000000/2.000000である
96
+ a[2][3] / a[2][2]-a[2][3]*a[2][3]/a[2][2]である
97
+ 4.000000
98
+ d=a[1][3],中身は12.000000です
99
+ 4.000000/3.000000-(4.000000)*4.000000/3.000000である
100
+ a[1][3] / a[1][1]-a[1][3]*a[1][3]/a[1][1]である
101
+ 4.000000
102
+ d=a[0][3],中身は4.000000です
103
+ 36.000000/1.000000-(36.000000)*36.000000/1.000000である
104
+ a[0][3] / a[0][0]-a[0][3]*a[0][3]/a[0][0]である
105
+ 36.000000
106
+ **a[2][3],中身は4.000000です**
107
+ 4.000000
108
+ **a[1][3],中身は4.000000です**
109
+ 1.333333
110
+ **a[0][3],中身は36.000000です**
111
+ 252.000000
112
+
113
+ ```