質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

141閲覧

計算結果の値が正しく得られません。

carnage0216

総合スコア194

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/07/26 20:19

編集2018/07/27 20:24

<環境>

  • windows10
  • visuals studio 2017
#include <stdio.h> #define N 3 int main() { float a[N][N+1] = { {5,-1,-1,0}, { 2,1,-3,-5 }, { 1,1,1 ,6} }; // The matrix int i; for (i = 0; i <=3; i++) { a[1][i] = a[1][i] - a[0][i] * a[1][0] / a[0][0]; //printf("%d= a[1][i]- a[0][i]* a[0][i]/ a[0][i]である\n", b); printf("a[1][%d]= a[1][%d]- a[0][%d]* a[0][%d]/ a[0][%d]である\n",i, i, i, i, i); } //デバック a[1][1] = a[1][1] - a[0][1] * a[1][0] / a[0][0]; { printf("a[1][1]は%fである\n", a[1][1]); } a[2][i] = a[2][i] - a[0][i] * a[2][0] / a[0][0]; return 0; }

以上のプログラムのa[1][1] = a[1][1] - a[0][1] * a[1][0] / a[0][0];より
a[1][1] - a[0][1] * a[1][0] / a[0][0]の計算結果をa[1][1]にいれてprintfで中の数字を表示させたいのですが、なぜか1.0000000とでます。

以下は実行結果です。

a[1][0]= a[1][0]- a[0][0]* a[0][0]/ a[0][0]である a[1][1]= a[1][1]- a[0][1]* a[0][1]/ a[0][1]である a[1][2]= a[1][2]- a[0][2]* a[0][2]/ a[0][2]である a[1][3]= a[1][3]- a[0][3]* a[0][3]/ a[0][3]である a[1][1]は1.000000である

紙に計算したところ1.4と出ました。

初歩的な質問で恥ずかしいのですが、今回はfor文や基礎的なものを実践的に学んで基礎力を付けるため一から3つの連立方程式を解くプログラムを作ろうとしています。

<編集>
asmさんのアドバイスのおかげで正しい結果は出たのですが、なぜ正しい結果が出たのか恥ずかしながら全くわかりません。
以下はasmさんのアドバイスを基に編集したプログラムです。
質問1 なぜ(i = 3; i >= 0; i--)と置くことで正しい結果1.4が得られたのか。
質問2 仮にforの中で

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

と表すとしたらどうすればよいのでしょうか?

for (i = 3; i >= 0; i--) { a[1][i] = a[1][i] - a[0][i] * a[1][0] / a[0][0]; //printf("%d= a[1][i]- a[0][i]* a[0][i]/ a[0][i]である\n", b); printf("a[1][%d]= a[1][%d]- a[0][%d]* a[0][%d]/ a[0][%d]である\n",i, i, i, i, i); } //デバック float d = a[1][0] / a[0][0]; a[1][1] = a[1][1] - a[0][1] * d;

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

i = 0の時に
a[1][i] = a[1][0]が0になってしまうので
その後のa[1][0] / a[0][0]が0になります。

forを逆順に回す

c

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

もしくはforの外で計算しておく

c

1 float d = a[1][0] / a[0][0];

と正しい計算結果が得られます。


追記

問題を単純化します。

c

1#include <stdio.h> 2 3int main(void) 4{ 5 int s[3] = {3, 6, 9}; 6 for(int i = 0; i < 3; i++){ 7 printf("s[%d]\t= s[%d] / s[0]\n", i, i); 8 printf("\t= %d / %d\n", s[i], s[0]); 9 printf("\t= %d\n", s[i] / s[0]); 10 s[i] /= s[0]; 11 } 12 return 0; 13}

配列sをsの先頭要素で割るという単純なプログラムです。
実行結果は

s[0]= s[0] / s[0] = 3 / 3 = 1 s[1]= s[1] / s[0] = 6 / 1 = 6 s[2]= s[2] / s[0] = 9 / 1 = 9

となります。

計算順序の問題で
i = 0の時: s[0] が3から1に変化
i = 1の時: s[0] は1
となってしまっています

  • s[0]を退避するか
  • s[0]/=s[0]を最後に計算するか
  • 答え領域bを作るか

この辺が回避策になりますね

投稿2018/07/26 20:48

編集2018/07/28 00:21
asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

carnage0216

2018/07/26 21:06

迅速な解答ありがとうございます。 あの質問があるのですが、なぜi = 0の時にa[1][0]が0になってしまうのでしょうか? 理解力が低くてすいません。
asm

2018/07/26 21:07

a[1][i] = a[1][i] - a[0][i] * a[1][0] / a[0][0]; の結果
carnage0216

2018/07/27 10:51

どうもありがとうございます。
carnage0216

2018/07/27 18:09

もう一つお聞きしたいのですが、なぜforの外で計算すれば正しい答えが得られるのですか? 逆にforの中で計算させるにはどうすればいいのでしょうか? どうかよろしくお願いいたします。
asm

2018/07/28 00:31

順序の問題で、a[1][1]を計算時にはa[1][0]が0になっているのが問題なので a[1][0]が書き換わる前に、つまりforの前に計算してやればいいです。 > forの中で いままで提示した解決策の何が問題なのでしょうか?
guest

0

asmさんが指摘している以外の点として、
最後の計算
a[2][i] = a[2][i] - a[0][i] * a[2][0] / a[0][0];
これもダメです。
i=4となっていて配列外をアクセスしています。

ところで、aの配列の値を計算中に更新(変えて)してもいいのですか?

ちなみに、asmさんの指摘の部分は
a[1][i] = a[1][i] - a[0][i] * a[1][0] / a[0][0];
i=0の時、
a[1][0] = 2.0 - 5.0 * 2.0 / 5.0;
a[1][0] = 0.0;
こういうことです。

投稿2018/07/27 00:22

ardin

総合スコア544

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

carnage0216

2018/07/29 12:46

どうもありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問