プロが教えるわが家の防犯対策術!

#include <iostream>  
#include <stdio.h>   

// 元の数定義
#define N 3  // 3

using namespace std;

//double a[N][N+1];
// 係数
static double a[N][N + 1] = {
  { 1.0, 2.0,  8.0, 4.0},
  { 4.0,  3.0,  2.0, 12.0},
  { 1.0,  4.0,  2.0,  4.0},
};


int main()
{
double d;
int i;
int j;

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[i][N] / a[i][i];

}

 

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

a[i][N] = a[i][N]/a[i][i] ;
 
printf("a[%d][%d],中身は%fです\n", i,N, a[i][N]);
for (j = i + 1; j < N; j++)

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

printf("%f\n", a[i][N]);

}

return 0;
}
の計算過程が以下のようになったのですが、
d(??)=a[2][3](4.00) /a[2][2](2.00);
d(2.00)=a[1][3](12.00)/a[1][1](3.00);
a[1][3](12.00)=d(4.00)-a[1][2](2.00)*a[1][3](12.00)/a[1][1](3.00);
d(4.00)=a[0][3](4.00)/a[0][0](1.00);
a[0][3](4.00)=d(4.00)-a[0][1](2.00)*a[0][3](4.00)/a[0][0](1.00);
a[0][3](-4.00)=d(4.00)-a[0][2](8.00)*a[0][3](-4.00)/a[0][0](1.00);
a[2][3](4.00)=a[2][3](4.00)/a[2][2](2.00);
a[1][3](-4.00)=a[1][3](-4.00)/a[1][1](3.00);
a[1][3](-1.33)=a[1][3](-1.33)-a[1][2](2.00)*a[1][3](-1.33)/a[1][1](3.00);
a[0][3](36.00)=a[0][3](36.00)/a[0][0](1.00);
a[0][3](36.00)=a[0][3](36.00)-a[0][1](2.00)*a[0][3](36.00)/a[0][0](1.00);
a[0][3](-36.00)=a[0][3](-36.00)-a[0][2]( 8.00)*a[0][3](-36.00)/a[0][0](1.00);

しかし、-36や36がどうやって出てきたのかデバッグで以上のようにしたのですがわかりませんでした。
どうやって出てきたのでしょうか?

質問者からの補足コメント

  • あの、siffon9さんにリクエストしたかったのですが、やり方が分からず補足として、
    質問したい事がございます。
    以下のプログラムに関してなのですが、なぜdに置き換えると計算結果が変わってしまうのでしょうか?
    なんとか必死に考えているのですがさっぱりです。
    どうか知恵を貸して頂けないでしょうか?
    どうかよろしくお願い致します。

      補足日時:2018/08/10 17:41
  • 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];
    }
    }

      補足日時:2018/08/10 17:42
  • アドバイスありがとうございます。
    以下のようにプログラムを組み、中身を表して見たのですが、正しく出来ていますでしょうか?
    確認して頂けるとありがたいです。
    どうかよろしくお願い致します。

      補足日時:2018/08/10 19:55
  • #include <iostream>
    #include <stdio.h>

    // 元の数定義
    #define N 3 // 3

    using namespace std;

    //double a[N][N+1];
    // 係数
    static double a[N][N + 1] = {
    { 1.0, 2.0, 8.0, 4.0 },
    { 4.0, 3.0, 2.0, 12.0 },
    { 1.0, 4.0, 2.0, 4.0 },
    };

    int main() {
    int i;
    int j;
    double d;

      補足日時:2018/08/10 19:56
  • for (i = N - 1; i >= 0; i--) {
    a[i][N] /= a[i][i];
    printf("a[%d][%d](%f) = a[%d][%d](%f) / a[%d][%d](%f)\n",i,N,a[i][N], i, N, a[i][N], i, i, a[i][i]);
    for (j = i + 1; j < N; j++) {
    a[i][N] = a[i][N] - a[i][j] * a[j][N] / a[i][i];

      補足日時:2018/08/10 19:56
  • printf("式はa[%d][%d](%f) = a[%d][%d](%f) - a[%d][%d](%f) * a[%d][%d](%f) / a[%d][%d](%f)です\n",i,N, a[i][N], i, N, a[i][N], i, j, a[i][j], j, N, a[j][N], i, i,a[i][i]);
    }
    }

      補足日時:2018/08/10 19:56
  • // [B]
    for (i = N - 1; i >= 0; i--) {
    d = a[i][N] / a[i][i];
    printf("d(%f) = a[%d][%d](%f) / a[%d][%d](%f)\n",d, i, N, a[i][N], i, i, a[i][i]);
    for (j = i + 1; j < N; j++) {
    a[i][N] = d - a[i][j] * a[j][N] / a[i][i];

      補足日時:2018/08/10 19:57
  • printf("式はa[%d][%d](%f) = d(%f) - a[%d][%d](%f) * a[%d][%d](%f) / a[%d][%d](%f)です\n",i,N, a[i][N],d,i,j, a[i][j],j,N, a[j][N],i,i, a[i][i]);
    }
    }

    return 0;
    }

      補足日時:2018/08/10 19:57
  • 実行結果
    a[2][3](2.000000) = a[2][3](2.000000) / a[2][2](2.000000)
    a[1][3](4.000000) = a[1][3](4.000000) / a[1][1](3.000000)
    式はa[1][3](2.666667) = a[1][3](2.666667) - a[1][2](2.000000) * a[2][3](2.000000) / a[1][1](3.000000)です
    a[0][3](4.000000) = a[0][3](4.000000) / a[0][0](1.000000)
    式はa[0][3](-1.333333) = a[0][3](-1.333333) - a[0][1](2.000000) * a[1][3](2.666667) / a[0][0](1.000000)です

      補足日時:2018/08/10 19:57
  • 式はa[0][3](-17.333333) = a[0][3](-17.333333) - a[0][2](8.000000) * a[2][3](2.000000) / a[0][0](1.000000)です
    d(1.000000) = a[2][3](2.000000) / a[2][2](2.000000)
    d(0.888889) = a[1][3](2.666667) / a[1][1](3.000000)
    式はa[1][3](-0.444444) = d(0.888889) - a[1][2](2.000000) * a[2][3](2.000000) / a[1][1](3.000000)です
    d(-17.333333) = a[0][3](-17.333333) / a[0][0](1.000000)

      補足日時:2018/08/10 19:58

A 回答 (5件)

補足日時:2018/08/10 19:55


> 以下のようにプログラムを組み、中身を表して見たのですが、正しく出来ていますでしょうか?


C言語の基本です
int a;
a = 1
a = a + 1; //(※)

(※)の式で、右辺のaと左辺のaの値が違うことはご理解されていますか?



もしご理解されているのでしたら

> a[i][N] = a[i][N] - a[i][j] * a[j][N] / a[i][i];
> printf("式はa[%d][%d](%f) = a[%d][%d](%f) - a[%d][%d](%f) * a[%d][%d](%f) / a[%d][%d](%f)です\n",i,N, a[i][N], i, N, a[i][N], i, j, a[i][j], j, N, a[j][N], i, i,a[i][i]);


このprintで値が正しく表示されないことがご理解いただけると思います。
    • good
    • 0

補足日時:2018/08/10 17:41


> 以下のプログラムに関してなのですが、なぜdに置き換えると計算結果が変わってしまうのでしょうか?

以前のご質問(https://oshiete.goo.ne.jp/qa/10645368.html)のNo.1で回答したとおりなのですが……
a[i][N] /= a[i][i]; は、 
a[i][N] = a[i][N] /a[i][i]; と同じです。
すなわち、a[i][N] /a[i][i]の計算結果がa[i][N] に代入されます。
つまりa[i][N]の値が変化します。


これをdに置き換えてしまうと
 d = a[i][N]/ a[i][i];
a[i][N]/ a[i][i]の計算結果が、a[i][N]ではなくdに代入されるので、a[i][N]の値が変化しません。

ここに違いがあります。
よく考えてみてください。
    • good
    • 0

> i=0, j=1のループ


> a[0][3](-4.00)=d(4.00)-a[0][1](2.00)*a[0][3](4.00)/a[0][0](1.00);
> i=0, j=2のループ
> a[0][3](36.00)=d(4.00)-a[0][2](8.00)*a[0][3](-4.00)/a[0][0](1.00);
> に関してですが、
> 最終的にa[0][3]は36.00となるのでしょうか?
> 一時的にa[0][3](-4.00)であったが、そのあとa[0][3](36.00)に上書きされ、
> a[0][3]は36.00になったと言う解釈で大丈夫でしょうか?

その通りです。


さらにその後、計算の後半で
> i=0のループ
> a[0][3](36.00)=a[0][3](36.00)/a[0][0](1.00);
> i=0, j=1のループ
> a[0][3](-36.00)=a[0][3](36.00)-a[0][1](2.00)*a[0][3](36.00)/a[0][0](1.00);
> i=0, j=2のループ
> a[0][3](252.00)=a[0][3](-36.00)-a[0][2](8.00)*a[0][3](-36.00)/a[0][0](1.00);

という様に何度か上書きされて、プログラムの最終状態では、a[0][3]は、252.00 になります。
    • good
    • 1
この回答へのお礼

本当にわかりやすくて、感激です。
今後ともどうかよろしくお願い致します。
ツイッターもやっているのでもしよろしければ@carnage54610335と入力して頂ければ出ると思います。
もちろん、ご連絡がなくても大丈夫です。
今後ともよろしくお願いします。

お礼日時:2018/08/10 15:18

> 36がどうやって出てきたのでしょうか?



36って終盤の
> i=0のループ
> a[0][3](36.00)=a[0][3](36.00)/a[0][0](1.00);
のこと?

計算の経緯のa[0][3]の部分をピックアップすればわかりますよね?

計算の前半部分
> i=0のループ
> d(4.00)=a[0][3](4.00)/a[0][0](1.00);
> i=0, j=1のループ
> a[0][3](-4.00)=d(4.00)-a[0][1](2.00)*a[0][3](4.00)/a[0][0](1.00);
> i=0, j=2のループ
> a[0][3](36.00)=d(4.00)-a[0][2](8.00)*a[0][3](-4.00)/a[0][0](1.00);

っていうか、計算の経緯を全て提示しているのですから、しっかり読んで下さい。


> 各ループと一緒に配列の式を書いて頂けないでしょうか?

既に提示しているつもりですが???
    • good
    • 2
この回答へのお礼

度々すいません。
i=0, j=1のループ
a[0][3](-4.00)=d(4.00)-a[0][1](2.00)*a[0][3](4.00)/a[0][0](1.00);
i=0, j=2のループ
a[0][3](36.00)=d(4.00)-a[0][2](8.00)*a[0][3](-4.00)/a[0][0](1.00);
に関してですが、
最終的にa[0][3]は36.00となるのでしょうか?
一時的にa[0][3](-4.00)であったが、そのあとa[0][3](36.00)に上書きされ、
a[0][3]は36.00になったと言う解釈で大丈夫でしょうか?
どうかよろしくお願い致します。

お礼日時:2018/08/10 14:45

> どうやって出てきたのでしょうか?



出力してる値が間違っていませんか?


>a[i][N] = a[i][N] - a[i][j] * a[i][N] / a[i][i];
>a[0][3](-36.00)=a[0][3](-36.00)-a[0][2]( 8.00)*a[0][3](-36.00)/a[0][0](1.00);

a[i][N]は式の右辺(式の実行前)と左辺(式の実行後)で値が違うことはわかりますよね?
(結果として同じになる場合もありますが)
左辺の値も式の実行前の値を表示しているのではないですか?


こちらで行った計算結果は以下です。

上記引用部分と同じ箇所の出力結果
a[0][3](252.00)=a[0][3](-36.00)-a[0][2](8.00)*a[0][3](-36.00)/a[0][0](1.00);



----全出力結果 ここから
aの初期値
a[0][0]=1.00
a[0][1]=2.00
a[0][2]=8.00
a[0][3]=4.00
a[1][0]=4.00
a[1][1]=3.00
a[1][2]=2.00
a[1][3]=12.00
a[2][0]=1.00
a[2][1]=4.00
a[2][2]=2.00
a[2][3]=4.00

i=2のループ
d(2.00)=a[2][3](4.00)/a[2][2](2.00);
i=1のループ
d(4.00)=a[1][3](12.00)/a[1][1](3.00);
i=1, j=2のループ
a[1][3](-4.00)=d(4.00)-a[1][2](2.00)*a[1][3](12.00)/a[1][1](3.00);
i=0のループ
d(4.00)=a[0][3](4.00)/a[0][0](1.00);
i=0, j=1のループ
a[0][3](-4.00)=d(4.00)-a[0][1](2.00)*a[0][3](4.00)/a[0][0](1.00);
i=0, j=2のループ
a[0][3](36.00)=d(4.00)-a[0][2](8.00)*a[0][3](-4.00)/a[0][0](1.00);

i=2のループ
a[2][3](2.00)=a[2][3](4.00)/a[2][2](2.00);
a[2][3],中身は2.00です
2.00
i=1のループ
a[1][3](-1.33)=a[1][3](-4.00)/a[1][1](3.00);
a[1][3],中身は-1.33です
i=1, j=2のループ
a[1][3](-0.44)=a[1][3](-1.33)-a[1][2](2.00)*a[1][3](-1.33)/a[1][1](3.00);
-0.44
i=0のループ
a[0][3](36.00)=a[0][3](36.00)/a[0][0](1.00);
a[0][3],中身は36.00です
i=0, j=1のループ
a[0][3](-36.00)=a[0][3](36.00)-a[0][1](2.00)*a[0][3](36.00)/a[0][0](1.00);
i=0, j=2のループ
a[0][3](252.00)=a[0][3](-36.00)-a[0][2](8.00)*a[0][3](-36.00)/a[0][0](1.00);
252.00
----ここまで
    • good
    • 0
この回答へのお礼

大変わかりやすい解答ありがとうございます。
あの、36がどうやって出てきたのでしょうか?
また、各ループと一緒に配列の式を書いて頂けないでしょうか?
どうかよろしくお願い致します。

お礼日時:2018/08/10 09:15

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