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

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

ただいまの
回答率

90.50%

  • C

    3696questions

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

  • C++

    3455questions

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

プログラムが正しいかどうかの確認をお願い致します。

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 509

carnage0216

score 122

https://qiita.com/haya_walker/items/d64a5fc624c65a324fa2

こちらのサイトの方程式を使わせていただきました

以下は自作のプログラムです。

#include <stdio.h>

#define N  3 

int main(void) {
    float a[N][N+1] = {
    {5,-1,-1,0},
    { 2,1,-3,-5 },
    { 1,1,1 ,6} };    // The matrix

    int t;
    int u;
    for (t = 0; t <= 3; t++) {
        for (u = 0; u <= 3; u++) {
            printf("中身は%fです\n", a[t][u]);

        }}
    int i;

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


    for (i = 0; i <= 3; i++) {//forを使う上で上限がなかったので3までが上限なのでi<=3と書いた。
        a[1][i] = a[1][i] - a[0][i] * d;
        {
            printf("a[1][%d]=%fとなる\n", i,a[1][i]);
        }

        //printf("a[1][%d]= a[1][%d]- a[0][%d]* a[0][%d]/ a[0][%d]である\n", i, i, i, i, i);

    }


    float r;
    r = a[2][0] / a[0][0];
    for (i = 0; i <= 3; i++) {
        a[2][i] = a[2][i] - a[0][i] * r;
    }
    int I;
    for (I = 0; I <= 3; I++) {
        printf("a[2][%d]=%fとなる\n", I,a[2][I]);
        }

    float z;
    z= a[2][1] / a[1][1];
    int y; //iは1から3まで入るのでkに+1した形で入ってもらいiを利用する。kはforより3までとする。
    for (y = 0; y <= 3; y++) {
        a[2][y] = a[2][y] - a[1][y] * z;
        printf("a[2][%d]=%fとなる\n", y, a[2][y]);
    }

    float g = a[2][3] / a[2][2];
    printf("Z=%f\n", g);

    float h;
    h = a[1][3] / a[1][2] + a[1][1] / a[1][2];
    printf("Y=%f\n", h);

    float j;
    j = h / a[0][0] + g / a[0][0];
    printf("X=%f\n", j);

    return 0;
}

以下は実行結果です。

中身は5.000000です
中身は-1.000000です
中身は-1.000000です
中身は0.000000です
中身は2.000000です
中身は1.000000です
中身は-3.000000です
中身は-5.000000です
中身は1.000000です
中身は1.000000です
中身は1.000000です
中身は6.000000です
中身は0.000000です
中身は0.000000です
中身は0.000000です
中身は0.000000です
a[1][0]=0.000000となる
a[1][1]=1.400000となる
a[1][2]=-2.600000となる
a[1][3]=-5.000000となる
a[2][0]=0.000000となる
a[2][1]=1.200000となる
a[2][2]=1.200000となる
a[2][3]=6.000000となる
a[2][0]=0.000000となる
a[2][1]=0.000000となる
a[2][2]=3.428571となる
a[2][3]=10.285715となる
Z=3.000000
Y=1.384615
X=0.876923

サイトでの答えは 

x=1,  y=2,  z=3

なのですが、私のプログラムの出した答えは正しいのでしょうか?紙にも計算してみましたがサイトとは違う答えになりました。

<編集>7/28
以下が正しいプログラムです。皆様の知恵をお借りしてできました。どうもありがとうございます。

#include <stdio.h>
#include <time.h>

#define N  3 

int main(void) {

    clock_t start, end;
    start = clock();


    float a[N][N+1] = {
    {5,-1,-1,0},
    { 2,1,-3,-5 },
    { 1,1,1 ,6} };    // The matrix

    int t;
    int u;
    for (t = 0; t <= 3; t++) {
        for (u = 0; u <= 3; u++) {
            printf("中身は%fです\n", a[t][u]);
            //printf("中身は%fです\n", a[0][0]);
            //printf("中身は%fです\n", a[0][0]);
        }}
    int i;

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


    for (i = 0; i <= 3; i++) {//forを使う上で上限がなかったので3までが上限なのでi<=3と書いた。
        a[1][i] = a[1][i] - a[0][i] * d;
        {
            printf("a[1][%d]=%fとなる\n", i,a[1][i]);
        }

        //printf("a[1][%d]= a[1][%d]- a[0][%d]* a[0][%d]/ a[0][%d]である\n", i, i, i, i, i);

    }

        //printf("%fです\n", a[1][0]);
        //printf("%fです\n", a[1][1]);
        //printf("%fです\n", a[1][2]);
        //printf("%fです\n", a[1][3]);

        //int I;//forを使ってまとめた。
        //for (I = 0; I <= 3; I++) {
            //printf("forを使うと%fとなる\n", a[1][I]);
        //}

    float r;
    r = a[2][0] / a[0][0];
    for (i = 0; i <= 3; i++) {
        a[2][i] = a[2][i] - a[0][i] * r;
    }
    int I;
    for (I = 0; I <= 3; I++) {
        printf("a[2][%d]=%fとなる\n", I,a[2][I]);
        }

    float z;
    z= a[2][1] / a[1][1];
    int y; //iは1から3まで入るのでkに+1した形で入ってもらいiを利用する。kはforより3までとする。
    for (y = 0; y <= 3; y++) {
        a[2][y] = a[2][y] - a[1][y] * z;
        printf("a[2][%d]=%fとなる\n", y, a[2][y]);
    }

    float g = a[2][3] / a[2][2];
    printf("Z=%f\n", g);

    float h;
    h = a[1][3] / a[1][1] - a[1][2] / a[1][1]* a[2][3] / a[2][2];
    printf("Y=%f\n", h);

    float j;
    j = h / a[0][0] + g / a[0][0];
    printf("X=%f\n", j);
    end = clock();
    printf("%f sec\n", (double)(end - start) / CLOCKS_PER_SEC);

    return 0;
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • 退会済みユーザー

    2018/08/09 23:29

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 4

+3

検算すれば正解か否かは明らかなのに、ナゼにこんなところで問うのかわからんのですが。
「私のプログラムの出した答えは正しいのでしょうか?」があなたの知りたいこと?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/28 18:52

    自分の計算に自信がないためです。
    ちょっとした計算でミスすることがあるためお願いしようと思いました。
    申し訳ありません。

    キャンセル

  • 2018/07/28 20:01

    ざっくり眺めてみたけど、Yを求めるとこでやらかしてるね。

    キャンセル

  • 2018/07/28 20:15

    もう一度、一から紙に書いてみます。
    どうもすいません。

    キャンセル

  • 2018/07/28 21:52

    なんとか正しいプログラムが出来ました。

    キャンセル

+3

本日の単体テストを書きましょう案件

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/28 20:52

    単体テストとは?

    キャンセル

  • 2018/07/28 21:10

    それくらいは調べましょ

    キャンセル

  • 2018/07/28 21:40

    すいません。てっきり造語かと思っていました。
    調べさせていただきます。

    キャンセル

  • 2018/07/28 21:43

    調べてヒットしなければ確認すればいいだけですよ。
    というか回答するような人がいちいち造語を用いるはずがないですね。
    質問者が混乱するだけなので。
    調べてすぐ出てくるような表現のみです。

    > yumetodoさん
    横やり失礼しました。

    キャンセル

  • 2018/07/28 22:21

    夕飯を食べていたので補足助かります。

    C++で単体テストを書くならGoogleTestが有名ですが個人的にはiutestを推しておきます。まあ完全なる宗教問題ですが。

    キャンセル

  • 2018/07/28 22:23

    わざわざどうもありがとうございます。
    Googleは過去に苦い思い出があり極力使わないようにしているので推していただいたものを使わせていただきます。

    キャンセル

checkベストアンサー

0

x + y + z = 6
に当てはめれば、どう考えても等式にならないのでプログラムにミスがあります。


問題は

    float h;
    h = a[1][3] / a[1][2] + a[1][1] / a[1][2];
    printf("Y=%f\n", h);

    float j;
    j = h / a[0][0] + g / a[0][0];
    printf("X=%f\n", j);

です。

ここまででわかってる等式は

a[0][0]x + a[0][1]y + a[0][2]z = a[0][3]
           a[1][1]y + a[1][2]z = a[1][3]
                             z = g

の3つなので

a[1][1]y = a[1][3] - a[1][2]z
       y = (a[1][3]-a[1][2]g) / a[1][1]
         = h

a[0][0]x = a[0][3] - a[0][1]y -a[0][2]z
       x = (a[0][3] - a[0][1]h -a[0][2]g) / a[0][0]

とまぁ、こんな感じ

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/28 19:22

    外出中でして、帰宅次第すぐに確認し編集します。
    どうもすいません。

    キャンセル

  • 2018/07/28 19:56

    ちなみに、
    a[1][1]y = a[1][3] - a[1][2]zなどの配列の引き算を表すようなプログラムでN次元方程式のように作る事は可能でしょうか?
    やはりN次元方程式となるとfor文を使って工夫しないと出来ないでしょうか?
    どうかよろしくお願い致します。

    キャンセル

  • 2018/07/28 21:09

    "N次元方程式"ってナニ?

    キャンセル

  • 2018/07/28 21:43

    造語ですね。

    キャンセル

  • 2018/07/28 21:51

    すいません。勝手に勘違いしていました。
    正しくは「多元線形連立方程式」です。

    キャンセル

  • 2018/07/28 22:52

    > などの配列の引き算を表すようなプログラムでN次元方程式のように作る事は可能でしょうか?

    単に係数を配列の要素で代用しただけの"数式"なのでプログラムと言えるかは微妙ですね。(少なくともC言語ではない)
    「連立方程式のように作る」という意味が全く分かりませんが
    https://teratail.com/questions/136220 を繰り返すつもりならば、無理です

    キャンセル

0

とりあえず、

配列の定義上

for (t = 0; t <= 3; t++) {
    for (u = 0; u <= 3; u++) {
        printf("中身は%fです\n", a[t][u]);
    }
}


は少し違います。配列のサイズが3 * 4なので正しくは

for (t = 0; t < N; t++) {
    for (u = 0; u < N + 1; u++) {
        printf("中身は%fです\n", a[t][u]);
    }
}


です。おそらく下のようなエラーが出たのではないでしょうか.

中身は-5486124068793688683255936251187209270074392635932332070112001988456197381759672947165175699536362793613284725337872111744958183862744647903224103718245670299614498700710006264535590197791934024641512541262359795191593953928908168990292758500391456212260452596575509589842140073806143686060649302051520512.000000です


↑みたいなものが

また、せっかくdefineでNの定義をしたのでそれを使いましょう。

カウンター変数をt,u,i,y,Iなど使っていますが、i,jの2つを使いまわしていいと思います。

3元の連立方程式をいろいろ解いて検算すればいいと思います.

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/28 19:05

    また、floatで計算しているので少しの誤差は出ると思います。

    キャンセル

  • 2018/07/28 19:21

    すいません。実は今外出中でして、確認ができません。
    帰宅次第プログラムを編集させて頂きます。
    どうもすいません。

    キャンセル

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    タイピングゲームの作成、乱数について

    前提・実現したいこと Cでタイピングゲームのような物を作っているのですが、今のコードのままだとランダムに表示させた問題を正解したときに再度同じ問題が出てしまいます 既に使用した

  • 受付中

    解決策が分かりません・・・

    5人の点数をキーボードから読み込んで、合計点、平均点、最高点、最低点を表示したいのですが(点数は0以上100以下)、 実行例 5人の点数を入力してください。 1番:95 2

  • 解決済

    Cで行列のランク計算のプログラムを作っています。

    前提・実現したいこと Cで行列のランク計算をするプログラムを作っています。 プログラムの流れは、 1.行列の行数(lnum)、列数(cnum)を入力 2.行列の各成分を

  • 解決済

    C言語 行列のファイル読み込み(と、ガウス消去法計算)

    大学の課題で、コンパイルは通ったのですが、うまく読み込んでいないようです。 ガウス消去法を用いて Ax = B を x について解くというもので、行列Aと行列Bはそれぞれ.c

  • 受付中

    プログラムを見やすく改良したい

    正常に動くプルグラムを見やすく改良したい。 具体的に教えていただければありがたいです。セグメンテーションフォルトでベスト7まで表示して停止します。173行あたりだと思うのですが、よ

  • 解決済

    行と列が違う配列の掛け算

    前提 書籍で勉強している学生です。 書籍の2周目をしています。 書籍の解答がないため問題のヒントや解説をしていただけると嬉しいです。 問題 4行3列の行列と3行4列の行列の積を

  • 解決済

    64bit整数型が遅い理由

    C言語で実験プログラムを作りました。 変数の型によって速度の差があるかを確かめました。 64bit整数型:C/C++における整数型には気をつけよ  #include<std

  • 解決済

    irfanviewで書き出したpgmファイルの再配置。

     前提・実現したいこと プログラミング初心者です。 数字をirfanviewでグレースケールで書きだしたのですが横文字70制限のためこのように書き出されました。 このpgmファイル

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

  • C

    3696questions

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

  • C++

    3455questions

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