复数数据结构的定义和实现

1)复数抽象数据类型描述:

ADT Complex

{

数据对象:D = {c1, c2 | c1, c2 ΠR(R为实数集)}

数据关系:S =  {<c1, c2> ( c1为实部,c2为虚部)}

基本操作:

Assign(&A, c1, c2)

Add(&A, B)

Minus(&A, B)

Multiply(&A, B)

Divide(&A, B)

...

}ADT Complex

2)复数抽象数据类型的C语言定义:

typefdef double ItemType;

typedef  struct{

ItemType r ;

ItemType v;

} Complex;    /* 复数抽象数据类型 */

void Assign(Complex *A, ItemType r, ItemType v);   

/* 赋值 */

void Add(Complex *A, Complex B); /* A+B */

void Minus(Complex *A, Complex B); /* A-B */

void Multiply(Compex *A, Complex B); /* A*B */

void Divide(Complex *A, Complex B); /* A/B */

...

3)复数运算的实现:

例如,赋值操作的实现:

void Assign(Complex *A, ItemType real, ItemType virtual)

{

A->r = real;

A->v = virtual;

} /* Assign( ) */

请对照课件中的例子,实习其他操作。最后在主函数(main)中测试所实现的相关操作,例如,计算复数1+2i与3+4i进行加、减、乘和除运算的结果,并输出到屏幕上。

提示:

①复数乘法:z1=a+bi,z2=c+di(a、b、c、dR)是任意两个复数,那么它们的积(a+bi)(c+di)=(ac-bd)+(bc+ad)i.

②复数除法:z1=a+bi,z2=c+di(a、b、c、dR)是任意两个复数,那么它们相除:(a+bi)/(c+di)=(ac+bd)/(c^2+d^2) +(bc-ad)/(c^2+d^2)i.

#include<stdio.h>
#include<stdlib.h>
typedef  struct Complex
{
	float	r ;  //实部
	float	v;   //虚部
} Complex ;	   /* 复数抽象数据类型 */
void Assign(Complex *A, float a, float b);    /* 赋值 */
void OutComplex(Complex A);
void Add(Complex *A, Complex B,Complex C);		            /* B+C */
void Minus(Complex *A, Complex B,Complex C);	                /* B-C */
void Multiply(Complex *A, Complex B,Complex C);              	/* C*B */
void Divide(Complex *A, Complex B,Complex C);	                /* B/C */

void Assign(Complex *A, float a, float b) //构造一个复数
{
	A->r = a;
	A->v = b;
}

void OutComplex(Complex A)
{
	if(A.v>0)
	printf("%f+%fi",A.r,A.v);
	else printf("%f%fi",A.r,A.v);
}

void Add(Complex *A, Complex B,Complex C)
{
	A->r=B.r+C.r;
	A->v=B.v+C.v;
}

void Minus(Complex *A, Complex B,Complex C)
{
	A->r=B.r-C.r;
	A->v=B.v-C.v;
}

void Multiply(Complex *A, Complex B,Complex C)
{
	A->r=B.r*C.r-B.v*C.v;
	A->v=B.v*C.r+B.r*C.v;
}

void Divide(Complex *A, Complex B,Complex C)
{
	A->r=(B.r*C.r+B.v*C.v)/(C.r*C.r+C.v*C.v);
	A->v=(B.v*C.r-B.r*C.v)/(C.r*C.r+C.v*C.v);
}

void main()
{
	int i;
	Complex z,z1,z2;
	float a1,a2,b1,b2;  
	while(i!=0)
	{ printf("        ******王尼玛复数加减乘除运算器******       \n");  
  		printf("请分别输入复数z1的实部和虚部(空格隔开):");
	    scanf("%f%f",&a1,&b1);
	    printf("请分别输入复数z2的实部和虚部(空格隔开):");
	    scanf("%f%f",&a2,&b2);
	    Assign(&z1,a1,b1);
	    Assign(&z2,a2,b2);
	    printf("复数z1=");
	    OutComplex(z1);
	    printf("\n复数z2=");
		OutComplex(z2);	
		   Add(&z,z1,z2);
		   printf("\n复数z1+z2=");
		   OutComplex(z);
	    	Minus(&z,z1,z2);
            printf("\n复数z1-z2=");
    		OutComplex(z);
			Multiply(&z,z1,z2);
		    printf("\n复数z1*z2=");
		    OutComplex(z);
		    Divide(&z,z1,z2);
		    printf("\n复数z1/z2=");
	    	OutComplex(z);

		printf("\n如果想结束计算,将按 0 键,如要继续其他复数的运算请按1~9任意键。\n");
		scanf("%d",&i);
		system("cls");//清屏 
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章