情報処理5レポート課題(3)の解答例

更新:2009年5月19日


  1. 有理数を表す構造体を宣言し、 四則演算、構築、画面表示を行う関数を定義して main関数で使ってみてください。 約分はしなくてもかまいません(興味があればどうぞ)。 約分はしなくてもかまいません(興味があればどうぞ)。
    fraction.c
    #include<stdio.h>
    
    struct Fraction{
    	int Denominator, Numerator;
    };
    
    struct Fraction Fraction(int num, int den);
    void print_Fraction(struct Fraction arg);
    struct Fraction add_Fraction(struct Fraction lhs, struct Fraction rhs);
    struct Fraction sub_Fraction(struct Fraction lhs, struct Fraction rhs);
    struct Fraction mul_Fraction(struct Fraction lhs, struct Fraction rhs);
    struct Fraction div_Fraction(struct Fraction lhs, struct Fraction rhs);
    struct Fraction yakubun(struct Fraction arg);
    
    int main(void){
    	struct Fraction x=Fraction(2, 3), y=Fraction(-1, 3), z;
    	printf("x="); print_Fraction(x);
    	printf("y="); print_Fraction(y);
    	z=add_Fraction(x, y);
    	printf("z=x+y="); print_Fraction(z);
    	z=sub_Fraction(x, y);
    	printf("z=x-y="); print_Fraction(z);
    	z=mul_Fraction(x, y);
    	printf("z=x*y="); print_Fraction(z);
    	z=div_Fraction(x, y);
    	printf("z=x/y="); print_Fraction(z);
    	return 0;
    }
    
    struct Fraction Fraction(int num, int den){
    	struct Fraction result;
    	result.Denominator=den;
    	result.Numerator=num;
    	/***result=yakubun(result);***/
    	return result;
    }
    
    void print_Fraction(struct Fraction arg){
    	printf("(%d)/(%d)\n", arg.Numerator, arg.Denominator);
    	return;
    }
    
    struct Fraction add_Fraction(struct Fraction lhs, struct Fraction rhs){
    	struct Fraction result;
    	result.Denominator=lhs.Denominator*rhs.Denominator;
    	result.Numerator=lhs.Denominator*rhs.Numerator+lhs.Numerator*rhs.Denominator;
    	/***
    	result=yakubun(result);
    	***/
    	return result;
    }
    
    struct Fraction sub_Fraction(struct Fraction lhs, struct Fraction rhs){
    	struct Fraction result;
    	result.Denominator=lhs.Denominator*rhs.Denominator;
    	result.Numerator=rhs.Denominator*lhs.Numerator-rhs.Numerator*lhs.Denominator;
    	/***
    	result=yakubun(result);
    	***/
    	return result;
    }
    
    struct Fraction mul_Fraction(struct Fraction lhs, struct Fraction rhs){
    	struct Fraction result;
    	result.Denominator=lhs.Denominator*rhs.Denominator;
    	result.Numerator=lhs.Numerator*rhs.Numerator;
    	/***
    	result=yakubun(result);
    	***/
    	return result;
    }
    
    struct Fraction div_Fraction(struct Fraction lhs, struct Fraction rhs){
    	struct Fraction result;
    	result.Denominator=lhs.Denominator*rhs.Numerator;
    	result.Numerator=lhs.Numerator*rhs.Denominator;
    	/***
    	result=yakubun(result);
    	***/
    	return result;
    }
    
    int min(int lhs, int rhs){
    	if(lhs<rhs)return lhs;
    	else	return rhs;
    }
    
    struct Fraction yakubun(struct Fraction arg){
    	struct Fraction result;
    	int tmp_numerator=arg.Numerator;
    	int tmp_denominator=arg.Denominator;
    	int i;
    
    	for(i=2;i<=min(abs(tmp_numerator), abs(tmp_denominator));i++){
    		if(abs(tmp_numerator)%i==0 && abs(tmp_denominator)%i==0){
    			tmp_numerator/=i;
    			tmp_denominator/=i;
    		}
    	}
    	result.Numerator=tmp_numerator;
    	result.Denominator=tmp_denominator;
    	return result;
    }
    
    

info5/