(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、d∈R)是任意兩個複數,那麼它們的積(a+bi)(c+di)=(ac-bd)+(bc+ad)i.
②複數除法:設z1=a+bi,z2=c+di(a、b、c、d∈R)是任意兩個複數,那麼它們相除:(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");//清屏
}
}