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

更新:2009年5月26日


  1. 複素数構造体および有理数構造体について、 構造体を引数に取る関数を、構造体へのポインタを引数に取るように書き換えてください。
    complex_pointer.c
    #include<stdio.h>
    #include<stdlib.h>
    
    struct Complex{
    	double Re, Im;
    };
    
    struct Complex Complex(double re, double im);
    void print_Complex(struct Complex *arg);
    struct Complex add_Complex(struct Complex *lhs, struct Complex *rhs);
    struct Complex sub_Complex(struct Complex *lhs, struct Complex *rhs);
    struct Complex mul_Complex(struct Complex *lhs, struct Complex *rhs);
    struct Complex div_Complex(struct Complex *lhs, struct Complex *rhs);
    
    
    int main(void){
    	struct Complex x=Complex(2.0, 3.1), y=Complex(-1.2, 3.4), z=Complex(5.6, 7.8), u=Complex(-9.1, 2.3), result;
    	printf("x="); print_Complex(&x);
    	printf("y="); print_Complex(&y);
    	result=add_Complex(&x, &y);
    	printf("result=x+y="); print_Complex(&result);
    	result=sub_Complex(&x, &y);
    	printf("result=x-y="); print_Complex(&result);
    	result=mul_Complex(&x, &y);
    	printf("result=x*y="); print_Complex(&result);
    	result=div_Complex(&x, &y);
    	printf("result=x/y="); print_Complex(&result);
    	/*** ポインタ変数を引数にとるように
    	     関数を書き換えたので、
    	     もはや↓のような書き方は不可能なので
    	     混合演算をしたい場合には
    	     中間変数を用意して
    	     一つ一つ行わなければならない***/
    	/*** result=sub_Complex(add_Complex(x, div_Complex(mul_Complex(y, x), z)), u);
    	     printf("result=x+y*x/z-u=(%.3e)+(%.3e)j\n", result.Re, result.Im);***/
    	return 0;
    }
    
    struct Complex Complex(double re, double im){
      struct Complex result;
      result.Re=re;
      result.Im=im;
      return result;
    }
    
    void print_Complex(struct Complex *arg){
      printf("(%.3e)+i(%.3e)\n", arg->Re, arg->Im);
      return;
    }
    
    struct Complex add_Complex(struct Complex *lhs, struct Complex *rhs){
    	struct Complex result;
    	result.Re=lhs->Re+rhs->Re;
    	result.Im=lhs->Im+rhs->Im;
    	return result;
    }
    
    struct Complex sub_Complex(struct Complex *lhs, struct Complex *rhs){
    	struct Complex result;
    	result.Re=lhs->Re-rhs->Re;
    	result.Im=lhs->Re-rhs->Im;
    	return result;
    }
    
    struct Complex mul_Complex(struct Complex *lhs, struct Complex *rhs){
    	struct Complex result;
    	result.Re=lhs->Re*rhs->Re-lhs->Im*rhs->Im;
    	result.Im=lhs->Re*rhs->Im+lhs->Im*rhs->Re;
    	return result;
    }
    
    struct Complex div_Complex(struct Complex *lhs, struct Complex *rhs){
    	struct Complex result;
    	if(rhs->Re==0.0 && rhs->Im==0.0){
    		printf("Division by 0\n");
    		exit(1);
    	}
    	result.Re=(lhs->Re*rhs->Re+lhs->Im*rhs->Im)/(rhs->Re*rhs->Re+rhs->Im*rhs->Im);
    	result.Im=(lhs->Im*rhs->Re-lhs->Re*rhs->Im)/(rhs->Re*rhs->Re+rhs->Im*rhs->Im);
    	return result;
    }
    
    fraction_pointer.c
    #include<stdio.h>
    
    struct Fraction{
    	int Denominator, Numerator;
    };
    
    struct Fraction Fraction(int numerator, int denominator);
    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);
    
    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 numerator, int denominator){
    	struct Fraction result;
    	result.Denominator=denominator;
    	result.Numerator=numerator;
    	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;
    	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;
    	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;
    	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;
    	return result;
    }
    
  2. 複素数構造体および有理数構造体について、 ヘッダファイル、関数定義ファイル、main関数のファイルの3つに 分割してコンパイル・実行できることを確認してください。
    complex/complex.h
    struct Complex{
    	double Re, Im;
    };
    
    struct Complex Complex(double re, double im);
    void print_Complex(struct Complex *arg);
    struct Complex add_Complex(struct Complex *lhs, struct Complex *rhs);
    struct Complex sub_Complex(struct Complex *lhs, struct Complex *rhs);
    struct Complex mul_Complex(struct Complex *lhs, struct Complex *rhs);
    struct Complex div_Complex(struct Complex *lhs, struct Complex *rhs);
    
    complex/complex.c
    #include <stdio.h>
    #include "complex.h"
    
    struct Complex Complex(double re, double im){
      struct Complex result;
      result.Re=re;
      result.Im=im;
      return result;
    }
    
    void print_Complex(struct Complex *arg){
      printf("(%.3e)+i(%.3e)\n", arg->Re, arg->Im);
      return;
    }
    
    struct Complex add_Complex(struct Complex *lhs, struct Complex *rhs){
    	struct Complex result;
    	result.Re=lhs->Re+rhs->Re;
    	result.Im=lhs->Im+rhs->Im;
    	return result;
    }
    
    struct Complex sub_Complex(struct Complex *lhs, struct Complex *rhs){
    	struct Complex result;
    	result.Re=lhs->Re-rhs->Re;
    	result.Im=lhs->Im-rhs->Im;
    	return result;
    }
    
    struct Complex mul_Complex(struct Complex *lhs, struct Complex *rhs){
    	struct Complex result;
    	result.Re=lhs->Re*rhs->Re-lhs->Im*rhs->Im;
    	result.Im=lhs->Re*rhs->Im+lhs->Im*rhs->Re;
    	return result;
    }
    
    struct Complex div_Complex(struct Complex *lhs, struct Complex *rhs){
    	struct Complex result;
    	if(rhs->Re==0.0 && rhs->Im==0.0){
    		printf("Division by 0\n");
    		exit(1);
    	}
    	result.Re=(lhs->Re*rhs->Re+lhs->Im*rhs->Im)/(rhs->Re*rhs->Re+rhs->Im*rhs->Im);
    	result.Im=(lhs->Im*rhs->Re-lhs->Re*rhs->Im)/(rhs->Re*rhs->Re+rhs->Im*rhs->Im);
    	return result;
    }
    
    complex/main_complex.c
    #include<stdio.h>
    #include<stdlib.h>
    #include"complex.h"
    
    int main(void){
    	struct Complex x=Complex(2.0, 3.1), y=Complex(-1.2, 3.4), z=Complex(5.6, 7.8), u=Complex(-9.1, 2.3), result;
    	printf("x="); print_Complex(&x);
    	printf("y="); print_Complex(&y);
    	result=add_Complex(&x, &y);
    	printf("result=x+y="); print_Complex(&result);
    	result=sub_Complex(&x, &y);
    	printf("result=x-y="); print_Complex(&result);
    	result=mul_Complex(&x, &y);
    	printf("result=x*y="); print_Complex(&result);
    	result=div_Complex(&x, &y);
    	printf("result=x/y="); print_Complex(&result);
    	/*** ポインタ変数を引数にとるように
    	     関数を書き換えたので、
    	     もはや↓のような書き方は不可能なので
    	     混合演算をしたい場合には
    	     中間変数を用意して
    	     一つ一つ行わなければならない***/
    	/*** result=sub_Complex(add_Complex(x, div_Complex(mul_Complex(y, x), z)), u);
    	     printf("result=x+y*x/z-u=(%.3e)+(%.3e)j\n", result.Re, result.Im);***/
    	return 0;
    }
    
    fraction/fraction.h
    struct Fraction{
    	int Denominator, Numerator;
    };
    
    struct Fraction Fraction(int numerator, int denominator);
    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);
    
    fraction/fraction.c
    #include<stdio.h>
    #include"fraction.h"
    
    struct Fraction Fraction(int numerator, int denominator){
    	struct Fraction result;
    	result.Denominator=denominator;
    	result.Numerator=numerator;
    	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;
    	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;
    	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;
    	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;
    	return result;
    }
    
    fraction/main_fraction.c
    #include<stdio.h>
    #include"fraction.h"
    
    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;
    }
    

info5/