複數數據結構的定義和實現

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");//清屏 
	}
}


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