アプリ版:「スタンプのみでお礼する」機能のリリースについて

for (i = N - 1; i >= 0; i--) {
a[i][N] /= a[i][i];
for (j = i + 1; j < N; j++)
a[i][N] -= a[i][j] * a[j][N] / a[i][i];
}
のプログラムを
for (i = N - 1; i >= 0; i--) {
  d = a[i][N]/ a[i][i];
  for (j = i + 1; j < N; j++)
    a[i][N] = d- a[i][j] * a[j][N] / a[i][i];
}

と a[i][N]をdと置き換えたところ、計算結果の異なりました。
何故なのでしょうか?
理由を詳しく説明して頂けると大変有り難いです。
また、どうしたらdに置き換えたとしても正しい計算が行えるのかを詳しく説明して頂けると有り難いです。
どうかよろしくお願い致します。

A 回答 (5件)

for (i = N - 1; i >= 0; i--) {


d = a[i][N]/ a[i][i];
for (j = i + 1; j < N; j++)
a[i][N] = d- a[i][j] * a[j][N] / a[i][i];
}

ではなくて

for (i = N - 1; i >= 0; i--) {
d = a[i][N]/ a[i][i];
for (j = i + 1; j < N; j++)
d -= a[i][j] * a[j][N] / a[i][i];
a[i][N]=d;
}

この計算順だと、dを使う意味無いですけどね。

ひょっとして -= 演算子の意味がわかってない?
    • good
    • 1

#3です。



>1回週のdで固定してしまったため、
一回週のdにはi=2のが入りそのままとなったので、2週目のdにも1週目と同じdが入る。なので、間違った計算になるという事でしょうか?

i=2とは限りませんが上記の理解でよい。
    • good
    • 0

内側のループの1回目終了後ではa[i][N]の値は同じ値になります。


なぜならループ内の式を実行する前の段階で上のコードでのa[i][N]と下のコードでのdの値が等しいので式の値は一致します。

ただし、2回目以降は異なります。
なぜなら2回目にループに入る直線の段階で上のコードでのa[i][N]と下のコードでのdの値は異なるため式が同じ値にならないのです。
dの値を変える式は存在しないため、何回目のループであろうともdの値は変化しません。

下の式をあえてdを使うコードに替えるには二通りの方法があります。
1.内側のループの最後に次の式を追加する。
d = a[i][N];

2.dをポインタとして定義してdの示すアドレスをa[i][N]のアドレスにしてしまう。
dをポインタとして宣言(たとえば int *d;)して、最初のループの頭に
d = &a[i][N];
としてポインタ変数dにa[i][N]のアドレスを代入します。そうすると以降*dはa[i][N]の値を返すようになります。
以降の式はdを*dに置き換えれば意図したように動くはずです。
    • good
    • 0
この回答へのお礼

1回週のdで固定してしまったため、
一回週のdにはi=2のが入りそのままとなったので、2週目のdにも1週目と同じdが入る。なので、間違った計算になるという事でしょうか?

お礼日時:2018/08/03 18:43

No.1です。


お礼の文章ですが、適度な改行や空行を入れて、他の人が読みやすいかどうかを気にしていただけますと嬉しいです。


閑話休題

> dではなく、なぜa[i][N]だと正しく代入され、置き換えたdでは正しく代入されないのでしょうか?

a[i][N] = d- a[i][j] * a[j][N] / a[i][i]

において質問者様は、置き換えたdのことばかり気にされているようです。
問題はdではなく、a[j][N]の値にあることをNo.1で回答しました。

もう一度、時間をかけてよく読んで内容を理解してください。
また、aの配列の値について二次元の表を紙(やエクセル)に書いて、dを使用した場合と使用しない場合で、二重のforループでの表中の各値がどのように変化していくかを手(電卓)計算すれば、より理解が深まると思います。
    • good
    • 0
この回答へのお礼

だとしたら、元のプログラム
for (i = N - 1; i >= 0; i--) {
d = a[i][N];
for (j = i + 1; j < N; j++)
d -= a[i][j] * a[j][N];
a[i][N] = d / a[i][i];
}
はdを使っていますが、なぜdが1週目で固定されないのでしょうか?
最後にa[i][N] = d / a[i][i];があるためですか?

お礼日時:2018/08/03 19:21

Nは定数と仮定して。


外側のforでi=1の時を考えます。

 a[1][N] /= a[1][1];
  ↓
 d = a[1][N]/ a[1][1];

と変更したので
この行が実行された段階でa[1][N]には正しい値が代入されておりません。


次に外側のforでi=0のループに変わります。
このとき内側のforの最初のループではj=i+1(=1)となるので。
内側のforの中にある式は

 a[0][N] = d- a[0][1] * a[1][N] / a[0][0];

となりますが、式の中のa[1][N]には正しい値が入っていないので
結果、a[0][N]にも正しい計算結果が代入されないことになります。


ここまでi=1の場合で考えましたが、当然iが他の値でも同じことが起こります。



> また、どうしたらdに置き換えたとしても正しい計算が行えるのか

 d = a[i][N]/ a[i][i];
 ↓
 d = a[i][N]/ a[i][i];
 a[i][N] = d;

とするとか?
(詳しくみてないので、これでもダメかもしれません)
    • good
    • 0
この回答へのお礼

わかりやすい解答ありがとうございます。あのd = a[i][N]/ a[i][i]においてdとおきました。そしてa[i][N] = d- a[i][j] * a[j][N] / a[i][i]にd = a[i][N]/ a[i][i]を代入しようとa[i][N] = d- a[i][j] * a[j][N] / a[i][i]にdをつけたのですが、これではa[i][N] = d- a[i][j] * a[j][N] / a[i][i]のdにd = a[i][N]/ a[i][i]は代入されないのでしょうか?
dではなく、なぜa[i][N]だと正しく代入され、置き換えたdでは正しく代入されないのでしょうか?
どうかよろしくお願い致します。
二次元配列などと関係あるのでしょうか?

お礼日時:2018/08/03 05:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!