LoginSignup
11
2

More than 5 years have passed since last update.

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

Posted at

筆者が中学三年年生になったので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);
}

    }
11
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
2