问题描述
定义抽象数据类型“复数”(Complex),复数是由两个实数分别作为实部和虚部构成的有序对,可以考虑用C语言中结构体类型来表示复数。即:
typedef struct
{
double x; // x是复数的实部
double y; // y是复数的虚部
} Comp;
要求采用C语言作为描述工具来实现“复数”抽象数据类型的加法、减法、乘法和除法等操作。建议每个操作定义为一个函数,程序中通过主函数进行调用计算并输出。
操作1: InitComplex( &Z, v1, v2 ) //构建复数Z
操作2:PrintComplex( Z ) //输出复数Z
操作3:Add( Z1, Z2, &Z3 ) //求两个复数的和
操作4:Sub ( Z1, Z2, &Z3 ) //求两个复数的差
操作5:Mul ( Z1, Z2, &Z3 ) //求两个复数的积
操作6:Div ( Z1, Z2, &Z3 ) //求两个复数的商
输入描述
在一行中输入4个用空格分开的实数,用a,b,c,d来表示,构成两个复数,z1=a+bi,z2=c+di
输出描述
输出共4行,依次输出两个复数的求和、求差、求积、求商的结果,复数的实部与虚部均保留2位小数,格式见样例。若输入的第二个复数为零,不能求商,则输出“The quotient of two complex numbers does not exist!”。
注意:复数的输出格式应符合数学上关于复数的表示习惯,即实部与虚部都为零时只输出一个0.00; 有一个为零时,只输出非零的部分;虚部为负时,例如3-4i,应输出为3.00-4.00i的形式,不要输出3.00+-4.00i。
样例输入
3 -4 -3 4
样例输出
和为:0.00 差为:6.00-8.00i 积为:7.00+24.00i 商为:-1.00
问题分析
&的作用:直接对调用地址里的内容进行操作,改变变量的大小。如果没有使用&,相当于函数只是借用一下变量的值进行运算,并没有对变量大小产生任何变化。&是C++的内容,在VS2022中需要将文件名后缀改为.cpp,否则无法使用类似构建复数的子函数操作。
复数输出需要额外考虑,结果有“+”,"-"的情况。
完整代码
#include<stdio.h>
#include<stdlib.h>
typedef struct
{
double x; //复数的实部
double y; //复数的虚部
}Complex;
Complex z1, z2, answer;
static void InitComplex(Complex &Z, double v1, double v2) //构建复数
{
Z.x = v1; //实部
Z.y = v2; //虚部
}
static void PrintComplex(Complex &answer) //输出复数
{
if (answer.x == 0 && answer.y == 0)
printf("0.00");
else
{
if (answer.x != 0)
printf("%.2lf", answer.x);
if (answer.y > 0)
printf("+");
}
if (answer.y != 0)
printf("%.2lfi", answer.y);
printf("\n");
}
static void Add(Complex z1, Complex z2, Complex &answer) //求和
{
answer.x = z1.x + z2.x;
answer.y = z1.y + z2.y;
}
static void Sub(Complex z1, Complex z2, Complex &answer) //求差
{
answer.x = z1.x - z2.x;
answer.y = z1.y - z2.y;
}
static void Mul(Complex z1, Complex z2, Complex &answer) //求积
{
answer.x = z1.x * z2.x - z1.y * z2.y;
answer.y = z1.x * z2.y + z1.y * z2.x;
}
static void Div(Complex z1, Complex z2, Complex &answer) //求商
{
answer.x = (z1.x * z2.x + z1.y * z2.y) / (z2.x * z2.x + z2.y * z2.y);
answer.y = (z1.y * z2.x - z1.x * z2.y) / (z2.x * z2.x + z2.y * z2.y);
}
int main()
{
double a, b, c, d;
scanf("%lf%lf%lf%lf", &a, &b, &c, &d);
InitComplex(z1, a, b); //构建复数z1
InitComplex(z2, c, d); //构建复数z2
//四则运算
printf("和为:");
Add(z1, z2, answer);
PrintComplex(answer);
printf("差为:");
Sub(z1, z2, answer);
PrintComplex(answer);
printf("积为:");
Mul(z1, z2, answer);
PrintComplex(answer);
if (z2.x == 0 && z2.y == 0) //进行商运算时,第二个复数为零
{
printf("The quotient of two complex numbers does not exist!\n");
return 0; //程序终止
}
printf("商为:");
Div(z1, z2, answer);
PrintComplex(answer);
return 0;
}