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

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

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

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

```math
ax + by = c \\
dx + ey = f
```

このように定義します
では早速コードを書きましょう。

```c:main.c
    int a;
    int b;
    int c;
    int d;
    int e;
    int f;
    int x; //xの解
    int y; //yの解
```

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

```c:main.c
    int tmpB; //d*bのために用意する変数
    int tmpC; //d*cのために用意する変数
    int tmpE; //a*eのために用意する変数
    int tmpF; //a*fのために用意する変数
```

という感じで後々に「リーダブルなコード」を書くために必要となるものです。
~~（変数名が『リーダブル』じゃない）~~

printfで入力を促します

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

この後に

```c: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をかけます。

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

```math
adx + bdy = cd \\
dax + eay = fa
```

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

```c: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をゼロにするために同符号なら減算を、異符号なら加算をさせます。

```c: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すれば完了です。

```c:main.c
    x = (c - y * b) / a; //移項するのでyはマイナスになりますそれをxの係数であるaで割れば完全に求められます
    
    printf("A,x=%d y=%d" ,x , y);
    }
```

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

ソースコード

```c: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);
}

    }
```