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

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

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

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

Q&A

解決済

5回答

340閲覧

連立一次方程式のプログラミングについて

natsu0025

総合スコア11

C

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

0グッド

0クリップ

投稿2019/07/15 02:35

連立一次方程式
ax+by=c
dx+ey=f
をコマンドライン引数を用いてプログラミングしたのですがコンパイルに成功するものの答えが合いません。
どこが間違っているのか教えていただけないでしょうか?

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char*argv[]){
int a,b,c,d,e,f,o,q,x,y,tmpA,tmpB,x1,x2,s,t,y1,y2,p1,p2,r1,r2;
argc=6;
a=atoi(argv[0]);
b=atoi(argv[1]);
c=atoi(argv[2]);
d=atoi(argv[3]);
e=atoi(argv[4]);
f=atoi(argv[5]);

o=ce-bf;
p1=ae-bd;
q=af-dc;
r1=ae-db;

if(o==0)printf("x=0");
if(q==0)printf("y=0");
if(p1==0||r1==0)printf("解なし");

p2=p1;
if(o<p2){tmpA=o;
o=p2;
p2=tmpA;}
s=o%p2;
while(s!=0){
o=p2;
p2=s;
s=o%p2;}
x1=o/p2;
x2=p1/p2;

r2=r1; if(q<r2){tmpB=o; q=r2; r2=tmpB;} t=q%r2; while(t!=0){ q=r2; r2=t; t=q%r2;} y1=q/r2; y2=r1/r2; if(x1<0&&x2<0){ x1=-1*(o/p2); x2=-1*(p1/p2);} if(y1<0&&y2<0){ y1=-1*(q/r2); y2=-1*(r1/r2);} if(x1>0&&x2<0){ x1=-1*(o/p2); x2=-1*(p1/p2);} if(y1>0&&y2<0){ y1=-1*(q/r2); y2=-1*(r1/r2);} if(x1==x2)printf("x=1"); if(y1==y2)printf("y=1"); else printf("x=%d/%d,y=%d/%d",x1,x2,y1,y2); return 0;

}

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/07/15 02:38

記述した方が良いもの エラーログ 解き方 codeタグを使い見易くする
jimbe

2019/07/15 02:56

どこまでデバッグされたのでしょうか. 数パターンの入力と出力の組み合わせがあれば, どこで計算が間違っているかの想定は出来ると思います. また, 各部で変数の値を表示することで, 「この時はこの値のはずなのに」という箇所も見つかると思います. それらの情報を集めてお考えの上でそれでもお分かりにならなければ, その情報をご提示ください.
guest

回答5

0

ベストアンサー

読みにくいコードはバグが入りやすくなります。次のようにアルゴリズムから考え直してください。

① ax + by = c
② dx + ey = f

①②にそれぞれ e, b を乗じて①́②́を作ります。

①́ eax + eby = ec
②́ bdx + bey = bf → bey = bf - bdx

①́に②́を代入して①́́を作ります。

①́́ eax + (bf - bdx) = ec

これを変形して x を求める式①́́́を作ります。

①́́́ x = (ec - bf) / (ea - bd)

a, b, c, d, e, f はすべて定数なので、この式に代入することで x を求めることができます。
また y も同様に求められます。

以上はコード化する必要はありません。コメントに書いておけば十分です。
コード化するのは、①́́́から作った関数 int solve_x(int a, int b, int c, int d, int e, int f) および int solve_y(int a, int b, int c, int d, int e, int f) です。

これらを関数化して main から外に出せば読みやすくバグも入りにくくなります。

投稿2019/07/15 04:53

Zuishin

総合スコア28656

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

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

natsu0025

2019/07/15 07:43

わかりやすい説明ありがとうございます!
guest

0

argv[0]を確認することをおすすめします

投稿2019/07/15 04:08

asm

総合スコア15147

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

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

natsu0025

2019/07/15 07:38

確認しました!答えに近づきましたありがとうございます!
guest

0

コピペで作ると変数名の修正忘れが発生し易いです.
同じ処理なら関数を作られたほうが良いかと思います.

投稿2019/07/15 03:14

jimbe

総合スコア12545

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

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

natsu0025

2019/07/15 03:27

分かりました!ありがとうございます
guest

0

全変数がintとなっていますので、割り算の結果も途中で整数に丸められてしまいます。適宜doubleなどを使いましょう。

投稿2019/07/15 03:01

maisumakun

総合スコア145121

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

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

natsu0025

2019/07/15 03:23

大学の課題なのですがintだけを使うように指定されていてdoubleを使ってはいけないみたいです、、
maisumakun

2019/07/15 04:36

えっと、係数が整数でも解が整数にならないパターンもあるのですが(2x+0y=1、0x+3y=4など)、本当に問題ないのですか?
katoy

2019/07/15 12:15

質問文のコードでは printf("x=%d/%d,y=%d/%d",x1,x2,y1,y2); などとしています。doouble を使わずに 分数で表示することを目指しているようです。
guest

0

a.c

c

1#include <stdio.h> 2#include <stdlib.h> 3 4// ax + by = c 5// dx + ey = f 6// ==> 7// x = (ce - bf) / (ae - bd) 8// y = (af - cd) / (ae - bd) 9 10int gcd(int a, int b) { 11 int r; 12 while ((r = a % b) != 0) { 13 a = b; 14 b = r; 15 } 16 return b; 17} 18 19void show(char * name, int p, int q) { 20 if (q == 0) { 21 return; 22 } 23 24 if (q < 0) { 25 q *= -1; 26 p *= -1; 27 } 28 int g = gcd(abs(p), abs(q)); 29 p /= g; 30 q /= g; 31 if ((p / q) * q == p) { 32 printf("%s = %d\n", name, p / q); 33 } else { 34 printf("%s = %d / %d\n", name, p, q); 35 } 36} 37 38void solv(int a, int b, int c, int d, int e, int f) { 39 int det = (a * e - b * d); 40 if (det == 0) { 41 printf("解なし\n"); 42 return; 43 } 44 45 show("x", c * e - b * f, det); 46 show("y", a * f - c * d, det); 47} 48 49int main(int argc, char* argv[]) { 50 int p = 1; 51 int a = atoi(argv[p++]); 52 int b = atoi(argv[p++]); 53 int c = atoi(argv[p++]); 54 int d = atoi(argv[p++]); 55 int e = atoi(argv[p++]); 56 int f = atoi(argv[p++]); 57 58 solv(a, b ,c, d ,e, f); 59 return 0; 60}

実行例
イメージ説明

int だけの計算で処理してますが、掛け算、引き算・足し算での桁溢れ等の対処を省略しています。

投稿2019/07/15 12:12

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問