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

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

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

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

Q&A

解決済

2回答

2258閲覧

意図した通りの式をプログラムに出来ているかについて。(編集:jのfor文がうまく機能しません。)

carnage0216

総合スコア194

C

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

0グッド

0クリップ

投稿2018/08/08 20:45

編集2018/08/09 20:42

質問したいことがあります。
以下の式に間違いがないかを指摘してほしいです。

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

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

の式a[i][N] = d - a[i][j] * a[i][N] / a[i][i]は
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] ; ~~

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

の式a[i][N] = a[i][N] - a[i][j] * a[i][N] / a[i][i]は
a[i][N] = a[i][N] - (a[i][j] * a[i][N] / a[i][i])と同じような式なのでしょうか?

編集
以下のプログラムをprintfで中身を表示してみました。
以下が全体のプログラムです。

#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] ; //d = a[2][3] / a[2][2] printf("**d=a[%d][%d],中身は%fです**\n",i,N,d); for (j = i + 1; j < N; j++)       a[i][N] = d - a[i][j] * a[i][N] / a[i][i];     printf("%f/%f-(%f)*%f/%fである\n", a[i][N],a[i][i],a[i][j],a[i][N],a[i][i]);     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);     printf("%f\n", a[i][N]); } for (i = N - 1; i >= 0; i--) { a[i][N] = a[i][N] ; 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.000000です 4.000000/2.000000-(4.000000)*4.000000/2.000000である a[2][3] / a[2][2]-a[2][3]*a[2][3]/a[2][2]である 4.000000 d=a[1][3],中身は12.000000です 4.000000/3.000000-(4.000000)*4.000000/3.000000である a[1][3] / a[1][1]-a[1][3]*a[1][3]/a[1][1]である 4.000000 d=a[0][3],中身は4.000000です 36.000000/1.000000-(36.000000)*36.000000/1.000000である a[0][3] / a[0][0]-a[0][3]*a[0][3]/a[0][0]である 36.000000 **a[2][3],中身は4.000000です** 4.000000 **a[1][3],中身は4.000000です** 1.333333 **a[0][3],中身は36.000000です** 252.000000

編集8/10

#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]; printf("d=a[%d][%d]/a[%d][%d]よりdは%fです\n",i,N,i,i,d); for (j = i + 1; j < N; j++) a[i][N] = d - a[i][j] * a[i][N] / a[i][i]; printf("式は%f - a[%d][%d] * a[%d][%d]/a[%d][%d]です\n", d, i, j, i, N, i, i); printf(" a[%d][%d]の中身は%f\n",i,N,a[i][N]); printf("%f/%f-(%f)*%f/%fである\n", a[i][N],a[i][i],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]); printf("式はa[%d][%d] - a[%d][%d] * a[%d][%d] / a[%d][%d]です\n",i,N,i,j,i,N,i,i); } return 0; }

を実行したところ、以下のようになりました。

d=a[2][3]/a[2][2]よりdは2.000000です 式は2.000000 - a[2][3] * a[2][3]/a[2][2]です a[2][3]の中身は4.000000 4.000000/2.000000-(4.000000)*4.000000/2.000000である d=a[1][3]/a[1][1]よりdは4.000000です 式は4.000000 - a[1][3] * a[1][3]/a[1][1]です a[1][3]の中身は-4.000000 -4.000000/3.000000-(-4.000000)*-4.000000/3.000000である d=a[0][3]/a[0][0]よりdは4.000000です 式は4.000000 - a[0][3] * a[0][3]/a[0][0]です a[0][3]の中身は36.000000 36.000000/1.000000-(36.000000)*36.000000/1.000000である a[2][3]の中身は2.000000です 2.000000 式はa[2][3] - a[2][3] * a[2][3] / a[2][2]です a[1][3]の中身は-1.333333です -0.444444 式はa[1][3] - a[1][3] * a[1][3] / a[1][1]です a[0][3]の中身は36.000000です 252.000000 式はa[0][3] - a[0][3] * a[0][3] / a[0][0]です

jの部分がなぜか変化せず、3のままです。
他にもi=2,N=3,j=3の時、j<Nよりj=3の時は実行結果の

式は2.000000 - a[2][3] * a[2][3]/a[2][2]です 4.000000/2.000000-(4.000000)*4.000000/2.000000である

自体は出ないと思います。
printfで中身を表示してみたのですが、原因が全くわかりません。
どうしたらfor文を正しく動作させて、jを変化させて理想の計算をさせられるでしょうか?
以前に載せたプログラムと少し違うのですが、私のくだらない質問を新しく質問として投稿するのは申し訳ないと思い編集という形で質問させていただきました。
どうか知恵を貸していただけないでしょうか。お願いします。

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

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

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

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

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

asm

2018/08/08 23:48

意図を説明せずに「意図通りにプログラミングできているか」と聞かれても、「文法的な誤りはみつかりません。強いて言えばインデントを意識しましょう」としか言いようがないです。
fana

2018/08/09 04:30

"同じ「ような」式" ってどういう意味でしょう……?
Zuishin

2018/08/09 21:15

質問を再利用せず新たな質問にしてください。私のベストアンサーを外したければ自己解決して外せばいいだけでしょう。
carnage0216

2018/08/09 21:29

本当にすいません。新しく質問します。どうもありがとうございました。いえ、ベストアンサーのままでお願いいたします。
Zuishin

2018/08/09 21:38

計算の順序がわかっているのに二つの式が同じかどうか尋ねた理由についても私の回答のコメントで質問しています。答えてください。
carnage0216

2018/08/09 21:45

すいません。a[i][N] = 1 - 2 * 3 / 4とa[i][N] = (1 - 2 * 3) / 4は違うものです。
Zuishin

2018/08/09 21:52

違うことを教えてくれなくて結構です。私は知っています。
carnage0216

2018/08/09 21:57

余計なことをしてしまいすいません。気を付けます。
guest

回答2

0

ベストアンサー

四則演算の順序

どうぞ。

C の四則演算の優先順位は算数・数学に準じます。
四則演算とは+-×÷のことで、それにカッコを含めてどこから計算するかには明確なルールがあります。
小学校で習うことなので、知らなければかなり恥ずかしい思いをすることもありますから、忘れているなら復習してください。

一つ例を挙げると、「1 - 2 * 3」と「(1 - 2) * 3」は違う結果が出ます。乗除は加減より先んじて計算するからです。
リンク先は必ず参照して自分のものにしてください。学生にも社会人にも最低限必須の知識の一つですし、方程式を解く上でもプログラミングをする上でも必ず必要となる前提知識です。

投稿2018/08/08 21:31

編集2018/08/08 22:00
Zuishin

総合スコア28660

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

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

carnage0216

2018/08/09 20:47 編集

出直してきます。 ありがとうございます。 >>一つ例を挙げると、「1 - 2 * 3」と「(1 - 2) * 3」は違う結果が出ます。乗除は加減より先んじて計算するからです。 私は出来は悪いですが、さすがに以上の計算順序自体はさすがに知っています。質問の仕方が悪かった私に責任があります。まあ、ここまで出来が悪いと計算ができないだろうと思われても仕方ないです。 いつもいつも申し訳ありません。ほんと出来の悪さには嫌になります。
Zuishin

2018/08/09 21:37 編集

計算順序を変えたら答えが変わることもわかっていますか? それがわかっていれば計算順序を変えた二つの式が同じ答えにならないことはわかるはずです。 それと書き換えられた質問の内容ですが、j が変わらないのは当然です。 i を変化させて j の範囲を確かめてください。
Zuishin

2018/08/09 21:18

> a[i][N] = d - a[i][j] * a[i][N] / a[i][i]は > a[i][N] = (d - a[i][j] * a[i][N]) / a[i][i]と同じような式なのでしょうか? 計算順序が変わっているので違う式です。 順序についてわかっているならば、これの何がわからないのですか?
Zuishin

2018/08/09 21:25

仮に次の値になったとします。 なるかどうかは問題ではありません。 なったとします。 d = 1 a[i][j] = 2 a[i][N] = 3 a[i][i] = 4 この時、前の式 a[i][N] = d - a[i][j] * a[i][N] / a[i][i] これは次のようになります。 a[i][N] = 1 - 2 * 3 / 4 後の式 a[i][N] = (d - a[i][j] * a[i][N]) / a[i][i] これは次のようになります。 a[i][N] = (1 - 2 * 3) / 4 あなたの質問は次の二つの式が同じものかどうかということです。 a[i][N] = 1 - 2 * 3 / 4 a[i][N] = (1 - 2 * 3) / 4 なぜ計算の順序がわかっているのにこれがわからないのですか? なぜこれらが同じものに見えるのですか?
carnage0216

2018/08/09 21:41 編集

同じものには見えません。 すいません。 プログラムにおいてjを正しく働かせて正しい実行結果が得られました。 以下はプログラムです。 #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]; //d = a[2][3] / a[2][2] printf("d=a[%d][%d]/a[%d][%d]よりdは%fです\n",i,N,i,i,d); for (j = i + 1; j < N; j++) { a[i][N] = d - a[i][j] * a[i][N] / a[i][i]; printf("式は%f - a[%d][%d] * a[%d][%d]/a[%d][%d]です\n", d, i, j, i, N, i, i); printf(" a[%d][%d]の中身は%f\n", i, N, a[i][N]); //printf("%fです", d); printf("%f/%f-(%f)*%f/%fである\n", a[i][N], a[i][i], a[i][j], a[i][N], a[i][i]); //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); } } 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]); printf("式はa[%d][%d] - a[%d][%d] * a[%d][%d] / a[%d][%d]です\n", i, N, i, j, i, N, i, i); } } return 0;
carnage0216

2018/08/09 21:42

実行結果は以下の通りになりました。 d=a[2][3]/a[2][2]よりdは2.000000です d=a[1][3]/a[1][1]よりdは4.000000です 式は4.000000 - a[1][2] * a[1][3]/a[1][1]です a[1][3]の中身は-4.000000 -4.000000/3.000000-(2.000000)*-4.000000/3.000000である d=a[0][3]/a[0][0]よりdは4.000000です 式は4.000000 - a[0][1] * a[0][3]/a[0][0]です a[0][3]の中身は-4.000000 -4.000000/1.000000-(2.000000)*-4.000000/1.000000である 式は4.000000 - a[0][2] * a[0][3]/a[0][0]です a[0][3]の中身は36.000000 36.000000/1.000000-(8.000000)*36.000000/1.000000である a[2][3]の中身は2.000000です a[1][3]の中身は-1.333333です -0.444444 式はa[1][3] - a[1][2] * a[1][3] / a[1][1]です a[0][3]の中身は36.000000です -36.000000 式はa[0][3] - a[0][1] * a[0][3] / a[0][0]です 252.000000 式はa[0][3] - a[0][2] * a[0][3] / a[0][0]です
Zuishin

2018/08/09 21:49

同じものでないことはわかっています。そう回答しました。 私が聞いているのは、計算順序がわかっているのになぜわからなかったのかということです。 今あなたは二つが違うものだとわかっています。 しかし質問した時点ではわかりませんでした。 何がわかったから違うことがわかったのですか? 計算順序でないなら何ですか?
carnage0216

2018/08/09 21:56

わかりにくい質問で申し訳ありません。 >>何がわかったから違うことがわかったのですか? jのfor文が機能していなかったため、意図した計算と違う計算結果が出てきました。 私は正しい計算結果が出ないのは計算順序が正しくないと思ってしまいました。(jのfor文が正しく機能していると思い込んでいました。) しかし、計算順序は間違っておらず、ただjのfor文が正しく機能していなかった為、正しい答えが出なかったということが判明しました。 >>計算順序でないなら何ですか? jのfor文です。
Zuishin

2018/08/09 22:03

質問が変わっています。 > a[i][N] = d - a[i][j] * a[i][N] / a[i][i]は > a[i][N] = (d - a[i][j] * a[i][N]) / a[i][i]と同じような式なのでしょうか? この二つが違う式であるとあなたは今は知っています。 しかし回答をもらう前はそれがわかりませんでした。 ではなぜ今はそれらが違うとわかったのですか? for については解決していないので別問題です。 あなたはまだ for についてわかっていません。 しかし二つの式が違うことはわかりました。 ということは for がわからなくても式が違うことがわかったということです。 なぜわかったのですか? 私は計算順序の回答しかしていません。 for について触れてもいません。 回答をもらった後で何がわかったのですか?
guest

0

なぜprintfを使ったりして各処理の経過を検証されないんでしょうか。
第三者の太鼓判が必要な理由がわかりません。

二つのプログラムに関してなぜ結果が異なるのでしょうか?
置き換えただけで誤った計算結果がでます。
で計算の解説や処理の解説など回答されておられます。

結局、検証作業を楽したいとしか思えないんですけど。

2018/8/9 17:18 追記
元々配列で構成されていた処理をcarnage0216さん自身が変数に置き換えたんですよね。
で、「結果があわない」と
~~
置き換えただけで誤った計算結果がでます。~~
二つのプログラムに関してなぜ結果が異なるのでしょうか?
と同じような事しているわけですけど
元々あった処理にもどすか、carnage0216さん自身でデバッグ・修正するべきです。
なぜにまた修正のお手伝いをせねばならんのですか。

投稿2018/08/08 21:09

編集2018/08/09 08:31
YomogiKOBO

総合スコア187

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

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

carnage0216

2018/08/09 09:10

おっしゃる通りです。 自身でなんとかします。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問