Cで連立方程式を実装する

More than 1 year has passed since last update.


筆者が中学三年年生になったのでCで中学数学を独力で網羅した日記を連載したいと思います。

今回は連立方程式の「加減法」についてやっていこうと思います

まず、連立方程式の係数だけを読み込むために変数を宣言するのですが筆者はこの作業を適当にこなしため、後で面倒くさい事態が起こったのでちゃんと考えます。変数の配置としては

ax + by = c \\

dx + ey = f

このように定義します

では早速コードを書きましょう。


main.c

    int a;

int b;
int c;
int d;
int e;
int f;
int x; //xの解
int y; //yの解

まずは係数の変数と解の変数を用意します。そしてさらに


main.c

    int tmpB; //d*bのために用意する変数

int tmpC; //d*cのために用意する変数
int tmpE; //a*eのために用意する変数
int tmpF; //a*fのために用意する変数

という感じで後々に「リーダブルなコード」を書くために必要となるものです。

(変数名が『リーダブル』じゃない)

printfで入力を促します


main.c

    printf("ax + by = c\ndx + ey = f\nのa,b,c,d,e,fの部分を入力してください\n");


この後に


main.c

    printf("a = "); //aの入力を促す

scanf("%d", &a); //aの数字を読み込む

printf("b = "); //bの入力を促す
scanf("%d", &b); //bの数字を読み込む

printf("c = "); //cの入力を促す
scanf("%d", &c); //cの数字を読み込む

printf("d = "); //dの入力を促す
scanf("%d", &d); //dの数字を読み込む

printf("e = "); //eの入力を促す
scanf("%d", &e); //eの数字を読み込む

printf("f = "); //fの入力を促す
scanf("%d", &f); //fの数字を読み込む


これで計算の準備が整いました!

まず本番に入る前にやらなくてはいけないことがあります。

xの係数を揃えるために上段にdを下段にaをかけます。

つまりはこういうことです。

adx + bdy = cd \\

dax + eay = fa

そしてコードに起こすために「リーダブル」のコードのために用意した変数に代入してきましょう


main.c

    tmpB = b; //bを代入

tmpC = c; //cを代入
tmpE = e; //eを代入
tmpF = f; //fを代入

tmpB *= d; //さらにdをかける
tmpC *= d; //さらにdをかける
tmpE *= a; //さらにaをかける
tmpF *= a; //さらにaをかける


いよいよ本格的な計算に入っていきます。

まずはxをゼロにするために同符号なら減算を、異符号なら加算をさせます。


main.c

    //減法の時の条件

if ((a < 0 && d < 0) || (a > 0 && d > 0)) {
y = (tmpC - tmpF) / (tmpB - tmpE);
}
//加法の時の条件
if ((a < 0 && d > 0) || (a > 0 && d < 0)) {
y = (tmpC + tmpF) / (tmpB + tmpE);
}

これでyを求めることに成功しました。

最後にxを求めてprintfすれば完了です。


main.c

    x = (c - y * b) / a; //移項するのでyはマイナスになりますそれをxの係数であるaで割れば完全に求められます

printf("A,x=%d y=%d" ,x , y);
}


これは、中三数学を作った時よりだいぶ難しかったので少しでも参考になればと思います。

ソースコード


main.c

    #include <stdio.h>


int main() {
// insert code here...
int a;
int b;
int c;
int d;
int e;
int f;
int x = 0;
int y = 0;

int tmpB = 0;
int tmpC = 0;
int tmpE = 0;
int tmpF = 0;

printf("ax + by = c\ndx + ey = f\nのa,b,c,d,e,fの部分を入力してください\n");

printf("a = "); //aの入力を促す
scanf("%d", &a); //aの数字を読み込む

printf("b = "); //bの入力を促す
scanf("%d", &b); //bの数字を読み込む

printf("c = "); //cの入力を促す
scanf("%d", &c); //cの数字を読み込む

printf("d = "); //dの入力を促す
scanf("%d", &d); //dの数字を読み込む

printf("e = "); //eの入力を促す
scanf("%d", &e); //eの数字を読み込む

printf("f = "); //fの入力を促す
scanf("%d", &f); //fの数字を読み込む

tmpB = b; //bを代入
tmpC = c; //cを代入
tmpE = e; //eを代入
tmpF = f; //fを代入

tmpB *= d; //さらにdをかける
tmpC *= d; //さらにdをかける
tmpE *= a; //さらにaをかける
tmpF *= a; //さらにaをかける

//減法の時の条件
if ((a < 0 && d < 0) || (a > 0 && d > 0)) {
y = (tmpC - tmpF) / (tmpB - tmpE);
}
//加法の時の条件
if ((a < 0 && d > 0) || (a > 0 && d < 0)) {
y = (tmpC + tmpF) / (tmpB + tmpE);
}

x = (c - y * b) / a; //移項するのでyはマイナスになりますそれをxの係数であるaで割れば完全に求められます

printf("A,x=%d y=%d" ,x , y);
}

}