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

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

ただいまの
回答率

90.50%

  • C

    4543questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 801

carnage0216

score 122

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

 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を変化させて理想の計算をさせられるでしょうか?
以前に載せたプログラムと少し違うのですが、私のくだらない質問を新しく質問として投稿するのは申し訳ないと思い編集という形で質問させていただきました。
どうか知恵を貸していただけないでしょうか。お願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • carnage0216

    2018/08/10 06:45

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

    キャンセル

  • Zuishin

    2018/08/10 06:52

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

    キャンセル

  • carnage0216

    2018/08/10 06:57

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

    キャンセル

回答 2

checkベストアンサー

+11

四則演算の順序

どうぞ。

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/09 20:02 編集

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

    キャンセル

  • 2018/08/10 06:13 編集

    計算順序を変えたら答えが変わることもわかっていますか?
    それがわかっていれば計算順序を変えた二つの式が同じ答えにならないことはわかるはずです。

    それと書き換えられた質問の内容ですが、j が変わらないのは当然です。
    i を変化させて j の範囲を確かめてください。

    キャンセル

  • 2018/08/10 06: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]と同じような式なのでしょうか?

    計算順序が変わっているので違う式です。
    順序についてわかっているならば、これの何がわからないのですか?

    キャンセル

  • 2018/08/10 06: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

    なぜ計算の順序がわかっているのにこれがわからないのですか?
    なぜこれらが同じものに見えるのですか?

    キャンセル

  • 2018/08/10 06: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;

    キャンセル

  • 2018/08/10 06: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]です

    キャンセル

  • 2018/08/10 06:49

    同じものでないことはわかっています。そう回答しました。

    私が聞いているのは、計算順序がわかっているのになぜわからなかったのかということです。

    今あなたは二つが違うものだとわかっています。
    しかし質問した時点ではわかりませんでした。
    何がわかったから違うことがわかったのですか?
    計算順序でないなら何ですか?

    キャンセル

  • 2018/08/10 06:56

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

    キャンセル

  • 2018/08/10 07: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 について触れてもいません。
    回答をもらった後で何がわかったのですか?

    キャンセル

+7

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/09 18:10

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

    キャンセル

同じタグがついた質問を見る

  • C

    4543questions

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

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