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

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

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

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

C++

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

Q&A

解決済

4回答

727閲覧

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

carnage0216

総合スコア194

C

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

C++

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

0グッド

1クリップ

投稿2018/07/28 09:00

編集2018/07/28 12:54
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;

}

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

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

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

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

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

guest

回答4

0

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

投稿2018/07/28 10:15

yumetodo

総合スコア5850

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

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

m.ts10806

2018/07/28 12:10

それくらいは調べましょ
carnage0216

2018/07/28 12:40

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

2018/07/28 12:43

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

2018/07/28 13:21

夕飯を食べていたので補足助かります。 C++で単体テストを書くならGoogleTestが有名ですが個人的にはiutestを推しておきます。まあ完全なる宗教問題ですが。
carnage0216

2018/07/28 13:23

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

0

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

投稿2018/07/28 09:46

episteme

総合スコア16614

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

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

carnage0216

2018/07/28 09:52

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

2018/07/28 11:01

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

2018/07/28 11:15

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

2018/07/28 12:52

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

0

とりあえず、

配列の定義上

c

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

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

c

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

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

中身は-5486124068793688683255936251187209270074392635932332070112001988456197381759672947165175699536362793613284725337872111744958183862744647903224103718245670299614498700710006264535590197791934024641512541262359795191593953928908168990292758500391456212260452596575509589842140073806143686060649302051520512.000000です

↑みたいなものが

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

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

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

投稿2018/07/28 10:04

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/07/28 10:05

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

2018/07/28 10:21

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

0

ベストアンサー

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


問題は

c

1 float h; 2 h = a[1][3] / a[1][2] + a[1][1] / a[1][2]; 3 printf("Y=%f\n", h); 4 5 float j; 6 j = h / a[0][0] + g / a[0][0]; 7 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 10:08

asm

総合スコア15147

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

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

carnage0216

2018/07/28 10:22

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

2018/07/28 10:56

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

2018/07/28 12:09

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

2018/07/28 12:51

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

2018/07/28 13:52

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問