[C言語]構造体を用いて分数の四則演算を計算するプログラム[コード付き]

今回は構造体を使ったプログラミングです。
簡単にするため関数中に既約はしないようにしてあるのでご注意ください。
また記事の最後に全体のコードを張っておきます。



構造体とは?

struct complex{
    int a;
    int b;
    char f[10];
    double d;
};

こんな感じで自分で中の要素の型を決めることができるデータセットのようなものです。

上の場合だとcomplex.aで構造体complexの中のint型変数aを扱うことができます。

ちなみにこの構造体を宣言するときは
struct complex (変数名)ですね。struct complexの部分がいつも使ってるintとかdoubleということ。



コードの実装

やることは

  • 構造体の定義
  • 四則演算の関数の実装

ですね。早速やっていきましょう。



分数を表す構造体の定義

簡単にいきましょう。
分数は分母と分子からなっているのでその2つを要素にすれば良いですね。

ちなみにcはchildのc
mはmotherのmです。

struct rational{
    int c;
    int m;
};





和と差の関数

とりあえず和から。
引数は上で定義したstruct rational型を2つ、返り値もそれでおkですね。

分数の計算が整数の計算と違うところは同じ分母じゃないと計算できないところです。
なのでお互いの分母分子に、相手の分母を掛けてあげて揃えましょう。

ただ分母が同じ時はそのまま計算するようにif文をつけます。
無駄に数字が大きくなりますし、計算量も増えちゃうので。

struct rational add(struct rational X,struct rational Y){
    struct rational Z;
    if(X.m == Y.m){
        Z.c = X.c + Y.c;
        Z.m = X.m;
    }else{
        Z.c = (X.c*Y.m) + (Y.c*X.m);
        Z.m = X.m*Y.m;
    }
    
    return Z;
}

次は差の関数なんですけど普通に和の関数の分子のところマイナスにするだけなんで省きます。



積と商の関数

積はもっと簡単ですね。
とりあえず関数の型と仮引数は和と差の関数と同じように定義しましょう。

返り値用の構造体を用意して、
お互いの分母同士と分子同士をかけてあげるだけです。超簡単。

struct rational multi(struct rational X,struct rational Y){
    struct rational Z;
    
    Z.c = X.c*Y.c;
    Z.m = X.m*Y.m;
    
    return Z;
}



商の関数は工夫しましょう。

お互いの分母同士と分子同士を割ってあげるだけでもいいんですが、
分数の割り算の性質である「逆数」を使いましょう
つまり割る側の分母と分子を入れ替えてあげて掛け算を実行すればよいですね。
じゃあ入れ替えたらさっきの積の関数同じように書けばいいだけ!

と思いきやまだ工夫できますね。

どうせ掛け算をするのならさっきの積の関数に渡しちゃいましょう。
その返り値をそのまま商の関数の積にすればおkですね。

まあ正直このぐらいの短さならこんなことやらなくてもって感じですが関数の中で別の関数の再利用は複雑なコードを書くときには必要になってくるのでやっちゃいましょう。
てかそのほうがかっこいいしね。



実際に動かしてみた

適当に値を受け取れるようにmain関数を実装して実行してみます。

おk

てことで完成です。
今回は既約しなかったけどのちのち既約するコードも紹介しようと思います。


では次の記事で会いましょう。

#include <stdio.h>

struct rational{
    int c;
    int m;
};

struct rational add(struct rational X,struct rational Y){
    struct rational Z;
    if(X.m == Y.m){
        Z.c = X.c + Y.c;
        Z.m = X.m;
    }else{
        Z.c = (X.c*Y.m) + (Y.c*X.m);
        Z.m = X.m*Y.m;
    }
    
    return Z;
}

struct rational sub(struct rational X,struct rational Y){
    struct rational Z;
    if(X.m == Y.m){
        Z.c = X.c + Y.c;
        Z.m = X.m;
    }else{
        Z.c = (X.c*Y.m) - (Y.c*X.m);
        Z.m = X.m*Y.m;
    }
    
    return Z;
}

struct rational multi(struct rational X,struct rational Y){
    struct rational Z;
    
    Z.c = X.c*Y.c;
    Z.m = X.m*Y.m;
    
    return Z;
}

struct rational divi(struct rational X,struct rational Y){
    int temp;
    temp = Y.m;
    Y.m = Y.c;
    Y.c = temp;
    
    return multi(X,Y);
}

int main(void){
    int a,b,c,d;
    struct rational wa,sa,seki,syou;
    printf("分数Aを入力してください\n");
    printf("分子:"); scanf("%d",&a);
    printf("分母:"); scanf("%d",&b);
    
    printf("分数Bを入力してください\n");
    printf("分子:"); scanf("%d",&c);
    printf("分母:"); scanf("%d",&d);
    
    struct rational A = {a,b};
    struct rational B = {c,d};
    
    wa = add(A,B); sa = sub(A,B);
    seki = multi(A,B); syou = divi(A,B);
    
    printf("A+B= %d/%d\n",wa.c,wa.m);
    printf("A-B= %d/%d\n",sa.c,sa.m);
    printf("A*B= %d/%d\n",seki.c,seki.m);
    printf("A/B= %d/%d\n",syou.c,syou.m);
    
    return 0;
}

syumokuzame

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

コメントする