1. 复数是什么
复数是由实数和虚数构成的数,形如:a + bi,其中a为实部,b为虚部,i为虚数单位。
1.1 常用符号
复数中常见的符号有:
i:虚数单位,满足i^2=-1。
z:表示一般的复数。
a:实部。
b:虚部。
conj:复数共轭运算。
2. C语言中复数的表示方式
C语言中复数的表示方式是通过结构体来实现的,具体实现如下:
typedef struct {
double real; //实部
double imag; //虚部
} Complex;
其中real表示实部,imag表示虚部。对于一个复数,可以通过定义一个Complex类型的变量来表示。
Complex z;
z.real = 1.0; //设置实部
z.imag = 2.0; //设置虚部
3. C语言中复数的基本运算
3.1 复数的加、减法
复数加减法的运算规则与实数的加减法类似,只需分别计算实部和虚部的和或差即可。
如给定两个复数z1 = a1 + b1i和z2 = a2 + b2i,其和为:
Complex add(Complex z1, Complex z2) {
Complex res;
res.real = z1.real + z2.real;
res.imag = z1.imag + z2.imag;
return res;
}
其差为:
Complex sub(Complex z1, Complex z2) {
Complex res;
res.real = z1.real - z2.real;
res.imag = z1.imag - z2.imag;
return res;
}
3.2 复数的乘法
复数乘法的运算规则为:
$$
(a_1+b_1i)(a_2+b_2i)=(a_1a_2-b_1b_2)+(a_1b_2+b_1a_2)i
$$
如给定两个复数z1 = a1 + b1i和z2 = a2 + b2i,其积为:
Complex mul(Complex z1, Complex z2) {
Complex res;
res.real = z1.real * z2.real - z1.imag * z2.imag;
res.imag = z1.real * z2.imag + z1.imag * z2.real;
return res;
}
3.3 复数的除法
复数除法的运算规则为:
$$
\frac{a_1+b_1i}{a_2+b_2i}=\frac{a_1a_2+b_1b_2}{a_2^2+b_2^2}+\frac{b_1a_2-a_1b_2}{a_2^2+b_2^2}i
$$
如给定两个复数z1 = a1 + b1i和z2 = a2 + b2i,其商为:
Complex div(Complex z1, Complex z2) {
Complex res;
double d = z2.real * z2.real + z2.imag * z2.imag;
res.real = (z1.real * z2.real + z1.imag * z2.imag) / d;
res.imag = (z1.imag * z2.real - z1.real * z2.imag) / d;
return res;
}
4. 复数的其他运算
4.1 复数的模长
复数的模长指复数到原点的距离,其计算公式为:
$$
|z|=\sqrt{a^2+b^2}
$$
如给定一个复数z = a + bi,其模长为:
double abs(Complex z) {
return sqrt(z.real * z.real + z.imag * z.imag);
}
4.2 复数的幅角
复数的幅角指与正半轴之间的夹角,其计算公式为:
$$
\varphi = \begin{cases} \tan^{-1}(\frac{b}{a}) & a > 0, b \ge 0 \\
\pi + \tan^{-1}(\frac{b}{a}) & a < 0, b \ge 0 \\
\tan^{-1}(\frac{b}{a}) - \pi & a < 0, b < 0 \\
-\frac{\pi}{2} & a = 0, b > 0 \\
\frac{\pi}{2} & a = 0, b < 0 \\
undefined & a = 0, b = 0
\end{cases}
$$
其中,tan-1为反正切函数。
如给定一个复数z = a + bi,其幅角为:
double arg(Complex z) {
double t = atan2(z.imag, z.real);
if (t < 0) {
t += 2 * M_PI;
}
return t;
}
5. 实现一个复数计算器
下面我们来用C语言实现一个复数计算器,支持复数的加减乘除和求模长、幅角等操作。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct {
double real; //实部
double imag; //虚部
} Complex;
Complex add(Complex z1, Complex z2) {
Complex res;
res.real = z1.real + z2.real;
res.imag = z1.imag + z2.imag;
return res;
}
Complex sub(Complex z1, Complex z2) {
Complex res;
res.real = z1.real - z2.real;
res.imag = z1.imag - z2.imag;
return res;
}
Complex mul(Complex z1, Complex z2) {
Complex res;
res.real = z1.real * z2.real - z1.imag * z2.imag;
res.imag = z1.real * z2.imag + z1.imag * z2.real;
return res;
}
Complex div(Complex z1, Complex z2) {
Complex res;
double d = z2.real * z2.real + z2.imag * z2.imag;
res.real = (z1.real * z2.real + z1.imag * z2.imag) / d;
res.imag = (z1.imag * z2.real - z1.real * z2.imag) / d;
return res;
}
double abs(Complex z) {
return sqrt(z.real * z.real + z.imag * z.imag);
}
double arg(Complex z) {
double t = atan2(z.imag, z.real);
if (t < 0) {
t += 2 * M_PI;
}
return t;
}
int main() {
Complex z1, z2;
double r;
int op;
printf("请输入第一个复数(实部 虚部):");
scanf("%lf %lf", &z1.real, &z1.imag);
printf("请输入第二个复数(实部 虚部):");
scanf("%lf %lf", &z2.real, &z2.imag);
printf("\n请选择要进行的运算:\n");
printf("1. 加法\n");
printf("2. 减法\n");
printf("3. 乘法\n");
printf("4. 除法\n");
printf("5. 模长\n");
printf("6. 幅角\n");
scanf("%d", &op);
switch (op) {
case 1:
printf("结果为:%.2f + %.2fi\n", add(z1, z2).real, add(z1, z2).imag);
break;
case 2:
printf("结果为:%.2f + %.2fi\n", sub(z1, z2).real, sub(z1, z2).imag);
break;
case 3:
printf("结果为:%.2f + %.2fi\n", mul(z1, z2).real, mul(z1, z2).imag);
break;
case 4:
printf("结果为:%.2f + %.2fi\n", div(z1, z2).real, div(z1, z2).imag);
break;
case 5:
r = abs(z1);
printf("第一个复数的模长为:%.2f\n", r);
r = abs(z2);
printf("第二个复数的模长为:%.2f\n", r);
break;
case 6:
r = arg(z1);
printf("第一个复数的幅角为:%.2f\n", r);
r = arg(z2);
printf("第二个复数的幅角为:%.2f\n", r);
break;
default:
printf("无效输入\n");
break;
}
return 0;
}
6. 结语
本文详细介绍了C语言中的复数操作,包括复数的基本概念、C语言中复数的表示方式以及复数的加减乘除、求模长和幅角等操作。通过实现一个复数计算器的例子,也向大家展示了如何使用C语言来进行复数计算。希望对大家有所帮助。