#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がどうやって出てきたのかデバッグで以上のようにしたのですがわかりませんでした。
どうやって出てきたのでしょうか?
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.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で値が正しく表示されないことがご理解いただけると思います。
No.4
- 回答日時:
補足日時: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]の値が変化しません。
ここに違いがあります。
よく考えてみてください。
No.3
- 回答日時:
> 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 になります。
本当にわかりやすくて、感激です。
今後ともどうかよろしくお願い致します。
ツイッターもやっているのでもしよろしければ@carnage54610335と入力して頂ければ出ると思います。
もちろん、ご連絡がなくても大丈夫です。
今後ともよろしくお願いします。
No.2
- 回答日時:
> 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);
っていうか、計算の経緯を全て提示しているのですから、しっかり読んで下さい。
> 各ループと一緒に配列の式を書いて頂けないでしょうか?
既に提示しているつもりですが???
度々すいません。
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になったと言う解釈で大丈夫でしょうか?
どうかよろしくお願い致します。
No.1
- 回答日時:
> どうやって出てきたのでしょうか?
出力してる値が間違っていませんか?
>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
----ここまで
大変わかりやすい解答ありがとうございます。
あの、36がどうやって出てきたのでしょうか?
また、各ループと一緒に配列の式を書いて頂けないでしょうか?
どうかよろしくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C++初心者です stirng 2 2022/09/20 20:43
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラミングについて。 1つ...
-
画面を強制的に再描画させる方法
-
DoEventsが必要な理由について
-
pythonでファイルのコメント行...
-
DOSコマンドのループ内のTIMEコ...
-
For文を使った九九表の作成
-
VBAで3秒だけ時間を止めたい
-
vbscriptでIE自動入力(途中で...
-
ループ内での条件処理
-
CSVファイルの特定の行だけを読...
-
GIFアニメをループさせたくない
-
VBA横データを縦にしたいです
-
vb.netからエクセル関数書き込み
-
エクセル関数で1〜12の数字がル...
-
vb.netです。2次元配列の要素を...
-
VBA for文が止まらない
-
アセンブラによるウェイト(WAIT...
-
UWSCの終了の仕方
-
テキストボックスの名前に変数...
-
アクティブセルから、A列最終行...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
画面を強制的に再描画させる方法
-
VBAで3秒だけ時間を止めたい
-
VBAでの一時停止と再開の方法
-
どなたかこのプログラミングを...
-
Escキーを押すと、中断する時と...
-
UWSCの終了の仕方
-
エクセルの当番表を作っていま...
-
VBA for i=1 to lastrow
-
「偶数・奇数の和」のフローチ...
-
アクティブセルから、A列最終行...
-
DoEventsが必要な理由について
-
vb.netからエクセル関数書き込み
-
GIFアニメをループさせたくない
-
DOSコマンドのループ内のTIMEコ...
-
範囲指定したセルを1つずつ飛...
-
流れ図(フローチャート)が分か...
-
乱数の桁数指定、または範囲指定。
-
テキストボックスの名前に変数...
-
CSVファイルの特定の行だけを読...
-
vb.netです。2次元配列の要素を...
おすすめ情報
あの、siffon9さんにリクエストしたかったのですが、やり方が分からず補足として、
質問したい事がございます。
以下のプログラムに関してなのですが、なぜdに置き換えると計算結果が変わってしまうのでしょうか?
なんとか必死に考えているのですがさっぱりです。
どうか知恵を貸して頂けないでしょうか?
どうかよろしくお願い致します。
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];
}
}
アドバイスありがとうございます。
以下のようにプログラムを組み、中身を表して見たのですが、正しく出来ていますでしょうか?
確認して頂けるとありがたいです。
どうかよろしくお願い致します。
#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;
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];
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]);
}
}
// [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];
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;
}
実行結果
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)です
式は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)