【复数】的定义和实现

来源:互联网 发布:风行软件下载 编辑:程序博客网 时间:2024/05/18 17:04

/*
ADT Complex{
    数据对象:D={real,image|real∈R,image∈R}
    数据关系:R={<real,image>}
    基本操作:
      InitComplex(&C)
        操作结果:构造一个复数
      GetReal(C,&real)
        初始条件:复数C存在
        操作结果:用real返回复数C的实部
      GetImage(C,&image)
        初始条件:复数C存在
        操作结果:用image返回复数C的虚部
      OutputComplex(C)
        初始条件:复数C存在
        操作结果:输出复数C的值
      Add(&C,C1,C2)
        初始条件:复数C1,C2存在
        操作结果:用复数C返回复数C1,C2的和
      Sub(&C,C1,C2)
        初始条件:复数C1,C2存在
        操作结果:用复数C返回复数C1,C2的差
      Mul(&C,C1,C2)
        初始条件:复数C1,C2存在
        操作结果:用复数C返回复数C1,C2的积
      Div(&C,C1,C2)
        初始条件:复数C1,C2存在
        操作结果:用复数C返回复数C1,C2的商
}ADT Complex
*/
#include "stdio.h"
#include "conio.h"
#include <math.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0

typedef struct{
   float real;
   float image;
}Complex;

void InitComplex(Complex *C)
{
   printf("Imput real and image:");
   scanf("%f",&C->real);
   scanf("%f",&C->image);
}

void GetReal(Complex *C,float *realptr)
{
   *realptr=C->real;
}

void GetImage(Complex *C,float *imageptr)
{
   *imageptr=C->image;
}

void OutputComplex(Complex *C)
{
   printf("%f %f/n",C->real,C->image);
}

void Add(Complex *C,Complex C1,Complex C2)
{
   C->real=C1.real+C2.real;
   C->image=C1.image+C2.image;
}

void Sub(Complex *C,Complex C1,Complex C2)
{
   C->real=C1.real-C2.real;
   C->image=C1.image-C2.image;
}

void Mul(Complex *C,Complex C1,Complex C2)
{
   /*对复数z1=a+ib,z2=c+id,z1*z2=(a+ib)(c+id)=ac-bd+i(ad+bc) */
   C->real=C1.real*C2.real-C1.image*C2.image;
   C->image=C1.real*C2.image+C1.image*C2.real;
}

void Div(Complex *C,Complex C1,Complex C2)
{
   /*(a+bi)/(c+di)
   =(a+bi)*(c-di)/(c+di)*(c-di)
   =(ac-adi+bci+bd)/(c*c+d*d)
   =(ac+bd)/(c^2+d^2)+〔(bc-ad)/(c^2+d^2)〕i*/
   if(C2.real==0||C2.image==0)
      exit(0);
    C->real=(C1.real*C2.real+C1.image*C2.image)/(pow(C2.real,2)*pow(C2.image,2));
   C->image=(C1.image*C2.real-C1.real*C2.image)/(pow(C2.real,2)*pow(C2.image,2));
}

原创粉丝点击