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

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

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

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

Q&A

解決済

3回答

182閲覧

jのfor文がうまく機能しません。

carnage0216

総合スコア194

C

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

0グッド

0クリップ

投稿2018/08/09 21:34

編集2018/08/10 03:42

こちらの方で編集で質問させていただきましたが、新しい質問をして投稿させて頂きました。
どうか解答して頂けるならば、こちらに解答して頂けきたいです。
どうかよろしくお願いいたします。

#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ページで確認できます。

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

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

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

Zuishin

2018/08/09 21:45

むしろ何がわからないのかがわかりません。j を変化させたいのなら変化できるだけの範囲を与えたらいいではありませんか。範囲を限定しておいて範囲外の値を取るようにしてほしいという質問には無理があります。何をするプログラムか知りませんが、j の値が変化しないのは仕様です。変化させようと思えばプラグラムが変わり、計算したいことができなくなる可能性があります。
guest

回答3

0

for文は正しく動いています。

c

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

j < Nが偽、つまりjが3になった時にfor文から脱出し、その後

c

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

が実行されます。


なお、このプログラムは前段と後段のプログラムの結果を比較したいのでしょうけど問題があります。

前段で配列aの中身が変化するため後段で同じことやっても結果は別になる。

(そもそも、後退代入部分だけ取り出したのになぜ係数配列が前進消去を終えていないのでしょうか)
計算すると(どっちにしろ)あんまりキレイな解にならないし、不要部分の0埋めをやってないだけっぽいかな


追記
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[j][N] / a[i][i];
です。

なるべく、元のコードを直しつつ

  • 上記バグ修正
  • 経過を見やすく

してみた

c++

1#include <iostream> 2#include <stdio.h> 3 4// 元の数定義 5#define N 3 // 3 6 7using namespace std; 8 9static double A[N][N + 1] = { 10 { 1.0, 2.0, 8.0, 4.0}, 11 { 0.0, 3.0, 2.0, 12.0}, 12 { 0.0, 0.0, 2.0, 4.0}, 13}; 14 15void copy(double a[N][N+1]){ 16 for(int i = 0; i < N; i++) 17 for(int j = 0; j <= N; j++) 18 a[i][j] = A[i][j]; 19} 20 21int main() 22{ 23 double d; 24 int i; 25 int j; 26 double a[N][N+1]; 27 28 copy(a); 29 30 for (i = N - 1; i >= 0; i--) { 31 printf("i=%d: ", i); 32 d = a[i][N]/ a[i][i]; 33 printf("d=a[%d][%d]/a[%d][%d]よりdは%fです\n",i,N,i,i,d); 34 35 for (j = i + 1; j < N; j++){ 36 printf(" j=%d:\n", j); 37 printf(" a[%d][%d]の中身は%f\n",i,N,a[i][N]); 38 printf(" 式は%f - a[%d][%d] * a[%d][%d]/a[%d][%d]です\n", d, i, j, j, N, i, i); 39 a[i][N] = d - a[i][j] * a[j][N] / a[i][i]; 40 printf(" a[%d][%d]の中身は%f\n",i,N,a[i][N]); 41 } 42 } 43 44 45 puts("---------------------------------------------------------------------"); 46 copy(a); 47 48 for (i = N - 1; i >= 0; i--) { 49 a[i][N] = a[i][N]/ a[i][i]; 50 printf("i=%d: ", i); 51 printf("a[%d][%d]の中身は%fです\n", i,N, a[i][N]); 52 for (j = i + 1; j < N; j++){ 53 printf(" j=%d:\n", j); 54 printf(" a[%d][%d] = %f\n", i, N, a[i][N]); 55 printf(" 式はa[%d][%d] - a[%d][%d] * a[%d][%d] / a[%d][%d]です\n",i,N,i,j,j,N,i,i); 56 a[i][N] = a[i][N] - a[i][j] * a[j][N] / a[i][i]; 57 printf(" a[%d][%d] = %f\n", i, N, a[i][N]); 58 } 59 } 60 61 return 0; 62}

投稿2018/08/09 21:56

編集2018/08/09 23:03
asm

総合スコア15147

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

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

carnage0216

2018/08/10 00:42 編集

ありがとうございます。 今、外出中でして、帰宅次第asmさんのプログラムと私の書いたプログラムを比較しながらどこをどうすべきだったのかを見直します。 助けられてばかりで、ほんとに無能な自分だなと思いました。無能なりに頑張ります。 なので、プログラムを書いてきます。 少し時間はかかりますが待っていてください。
asm

2018/08/10 03:56

私が式前後でa[i][N]を出力している意味をもう少し考えましょう。
rubato6809

2018/08/10 07:07

asmさん 彼に考えさせても迷走・暴走するばかりで、実りが無い気がします(苦笑
guest

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である
自体は出ないと思います。

内側の for (j = i + 1; j < N; j++) ループの、ループ範囲を示す中括弧が無いままだから、そして、そのことに質問者が気づいてないから、でしょう。

次の部分(だけじゃなさそうだけど)は、

C

1 for (j = i + 1; j < N; j++) 2 a[i][N] = d - a[i][j] * a[i][N] / a[i][i]; 3 printf("式は%f - a[%d][%d] * a[%d][%d]/a[%d][%d]です\n", 4 d, i, j, i, N, i, i);

たとえばこんな風にすべきだった。

C

1 for (j = i + 1; j < N; j++) { 2 a[i][N] = d - a[i][j] * a[i][N] / a[i][i]; 3 printf("式は%f - a[%d][%d] * a[%d][%d]/a[%d][%d]です\n", 4 d, i, j, i, N, i, i); 5 }

ただし、中括弧をどこで閉じるかは神のみぞ知るで、質問者本人が判断できるかどうかはアヤシイと思う。
ともかくこうすれば、ループ中で変化する j の値が表示されるわけで、彼が何を疑問に思ったか、謎は解ける。

少し前、どなたか彼に「中括弧を省略するな」とアドバイスしてたけど、言われた方は何のことか理解できないらしく、その後、中括弧を補ったのを見た覚えが無い。こんな基本的な事すら身についてないから、いつまでたってもこんな質問を繰り返しているのだと思う。

投稿2018/08/10 06:54

編集2018/08/10 07:01
rubato6809

総合スコア1380

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

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

carnage0216

2018/08/11 09:56 編集

お礼のお返事が遅くなり申し訳ありません。 rubato6809さん、どうもありがろうございます。 >>少し前、どなたか彼に「中括弧を省略するな」とアドバイスしてたけど、言われた方は何のことか理解できないらしく、その後、中括弧を補ったのを見た覚えが無い。こんな基本的な事すら身についてないから、いつまでたってもこんな質問を繰り返しているのだと思う。 おっしゃる通りです。決してわざとやっているわけではないのですが、飲み込みが悪いもので、ほんとうにすいません。 どうかプログラミングに向いていないかもしれませんが、これからも学ばせて頂きたいと思います。どうかよろしくお願いいたします。 ほんと、rubato6809さんやエピスさんやasmさんや皆様が親切に手取り足取り教えていただけなければ全然知らなかったことが多くて、感謝しかありません。 甘えてばかりはよくないので過去の質問を復習しながら基礎を学ばせて頂いています。
guest

0

よく見てませんけど、中括弧の場所とか添字が不自然です。

投稿2018/08/09 21:48

HogeAnimalLover

総合スコア4830

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問