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