在电子电路学科领域中,相量法是分析研究正弦电流电路稳定状态的一种简单易行的方法。相量法与复数有直接的联系。而在普通计算器中,一般不能对复数和相量进行直接的四则运算和相互转化,本文将介绍使用C语言编写程序实现复数和相量直接的四则运算和相互转化,编写后的exe应用程序可以直接使用,能够方便同学们在做题或研究时实现便捷计算。
一、源代码及注释
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#define pi 3.1415926
void menu()//主菜单界面
{
printf("*********************************************\n");
printf("***Calculator of complex number and phasor***\n");
printf("*********************************************\n");
printf("*****1.Complex four principle operation *****\n");//选1进入复数四则运算
printf("*****2.Phasor four principle operation *****\n");//选2进入相量四则运算
printf("***** 3.complex->phasor *****\n");//选3将复数转化为相量
printf("***** 4.phasor->complex *****\n");//选4将相量转化为复数
printf("***** 0.EXIT *****\n");//选0退出程序
printf("*********************************************\n");
}
void menu1()//复数四则运算菜单界面
{
printf("********************************************\n");
printf("***** Complex four principle operation *****\n");
printf("********************************************\n");
printf("***** 1.Addition 2.Subtract *****\n");
printf("***** 3.Multiply 4.Divide *****\n");
printf("***** 0.EXIT *****\n");
printf("********************************************\n");
}
void menu2()//相量四则运算菜单界面
{
printf("********************************************\n");
printf("***** Phasor four principle operation *****\n");
printf("********************************************\n");
printf("***** 1.Addition 2.Subtract *****\n");
printf("***** 3.Multiply 4.Divide *****\n");
printf("***** 0.EXIT *****\n");
printf("********************************************\n");
}
void con_pha(float a, float b)//将复数转化为相量
{
float num, rad;
num = sqrt(a * a + b * b);
rad = atan(b / a) * 180 / pi;
printf("ans=%f∠%f°\n", num, rad);
}
void con_com(float a, float b)//将相量转化为复数
{
float re, im;
re = a * cos(b * pi / 180);
im = a * sin(b * pi / 180);
printf("ans=(%f)+(%f)i\n", re, im);
}
void cadd(float a1, float b1, float a2, float b2)//复数加法
{
float ra, ia;
ra = a1 + a2;
ia = b1 + b2;
printf("ans=(%f)+(%f)i\n", ra, ia);
}
void csub(float a1, float b1, float a2, float b2)//复数减法
{
float ra, ia;
ra = a1 - a2;
ia = b1 - b2;
printf("ans=(%f)+(%f)i\n", ra, ia);
}
void cmul(float a1, float b1, float a2, float b2)//复数乘法
{
float ra, ia;
ra = a1 * a2 - b1 * b2;
ia = a1 * b2 + a2 * b1;
printf("ans=(%f)+(%f)i\n", ra, ia);
}
void cdiv(float a1, float b1, float a2, float b2)//复数除法
{
float ra, ia;
ra = (a1 * a2 + b1 * b2) / (a2 * a2 + b2 * b2);
ia = (-a1 * b2 + a2 * b1) / (a2 * a2 + b2 * b2);
printf("ans=(%f)+(%f)i\n", ra, ia);
}
void padd(float u1, float p1, float u2, float p2)//相量加法
{
float a1, b1, a2, b2, ra, ia;
a1 = u1 * cos(p1 * pi / 180);//先将两个相量转化为两个复数
b1 = u1 * sin(p1 * pi / 180);
a2 = u2 * cos(p2 * pi / 180);
b2 = u2 * sin(p2 * pi / 180);
ra = a1 + a2;//进行复数加法运算
ia = b1 + b2;
con_pha(ra, ia);//调用另一函数将复数转化为相量
}//以下函数大致思路同上
void psub(float u1, float p1, float u2, float p2)//相量减法
{
float a1, b1, a2, b2, ra, ia;
a1 = u1 * cos(p1 * pi / 180);
b1 = u1 * sin(p1 * pi / 180);
a2 = u2 * cos(p2 * pi / 180);
b2 = u2 * sin(p2 * pi / 180);
ra = a1 - a2;
ia = b1 - b2;
con_pha(ra, ia);
}
void pmul(float u1, float p1, float u2, float p2)//相量乘法
{
float a1, b1, a2, b2, ra, ia;
a1 = u1 * cos(p1 * pi / 180);
b1 = u1 * sin(p1 * pi / 180);
a2 = u2 * cos(p2 * pi / 180);
b2 = u2 * sin(p2 * pi / 180);
ra = a1 * a2 - b1 * b2;
ia = a1 * b2 + a2 * b1;
con_pha(ra, ia);
}
void pdiv(float u1, float p1, float u2, float p2)//相量除法
{
float a1, b1, a2, b2, ra, ia;
a1 = u1 * cos(p1 * pi / 180);
b1 = u1 * sin(p1 * pi / 180);
a2 = u2 * cos(p2 * pi / 180);
b2 = u2 * sin(p2 * pi / 180);
ra = (a1 * a2 + b1 * b2) / (a2 * a2 + b2 * b2);
ia = (-a1 * b2 + a2 * b1) / (a2 * a2 + b2 * b2);
con_pha(ra, ia);
}
int main()
{
float a1, b1, a2, b2, a, b, result;
int input = 1, funch = 1;
void(*pc[4 + 1])(float a1, float b1, float a2, float b2) = { NULL,cadd,csub,cmul,cdiv };
//函数指针数组,用于存放4种复数运算
void(*pp[4 + 1])(float u1, float p1, float u2, float p2) = { NULL,padd,psub,pmul,pdiv };
//函数指针数组,用于存放4种相量运算
void(*pmenu[2 + 1])() = { NULL,menu1,menu2 };//函数指针数组,用于存放2个菜单界面
do
{
system("cls");//清屏
menu();//显示主菜单
printf("Please choose the model:>");
scanf("%d", &input);//选择模式
if (input == 1 || input == 2)
{
if (input == 1)//进入复数四则运算模式
{
system("cls");//清屏
pmenu[input]();//显示分菜单
printf("Please choose the function:>");
scanf("%d", &funch);//选择功能
if (funch >= 1 && funch <= 4)
{
system("cls");//清屏
printf("Please input:\na1+b1i\ta2+b2i\n");
scanf("%f%f%f%f", &a1, &b1, &a2, &b2);//输入两个复数的实部和虚部
pc[funch](a1, b1, a2, b2);//执行
system("pause");//程序运行暂停,便于查看结果
}
else if (funch == 0)
{
system("cls");
printf("The program has exited.\n");
exit(0);//退出程序
}
else
{
system("cls");
printf("INPUT ERROR!\n");//提示输入错误
system("pause");
}
}
else//进入相量四则运算模式
{
system("cls");//清屏
pmenu[input]();//显示分菜单
printf("Please choose the function:>");
scanf("%d", &funch);//选择功能
if (funch >= 1 && funch <= 4)
{
system("cls");//清屏
printf("Please input:\nu1 p1\tu2 p2\n");
scanf("%f%f%f%f", &a1, &b1, &a2, &b2);//输入两个相量的模和辐角
pp[funch](a1, b1, a2, b2);//执行
system("pause");//程序运行暂停,便于查看结果
}
else if (funch == 0)
{
system("cls");
printf("The program has exited.\n");
exit(0);//退出程序
}
else
{
system("cls");
printf("INPUT ERROR!\n");//提示输入错误
system("pause");
}
}
}
else if (input == 3)//进入将复数转化为相量模式
{
system("cls");
printf("Please input the complex number:\na+bi\n");
scanf("%f%f", &a, &b);//输入复数的实部和虚部
con_pha(a, b);//执行
system("pause");//程序运行暂停,便于查看结果
}
else if (input == 4)//进入将相量转化为复数模式
{
system("cls");
printf("Please input the phasor:\na/_b\n");
scanf("%f%f", &a, &b);//输入相量的模和辐角
con_com(a, b);//执行
system("pause");//程序运行暂停,便于查看结果
}
else if (input == 0)
{
system("cls");
printf("The program has exited.\n");
exit(0);//退出程序
}
else
{
system("cls");
printf("INPUT ERROR!\n");//提示输入错误
system("pause");
}
} while (input);
return 0;
}
二、部分运行界面
三、总结
该程序的特点有两个:1.使用函数指针数组,将相同类型(返回值与形式参数相同)的函数的指针存放于一个数组中,而不用大量的分支语句,使代码更加简洁。2.运用数学库函数中的三角函数,使复数与相量之间的转化更加便捷。3.大量使用system函数,构造沉浸式用户体验界面,避免了控制台显示语句过多。
该程序可以直接进行复数和相量的四则运算以及相互转化,在电子电工行业中进行相关计算比较快捷,也充分体现了将C语言学以致用,对专业学习产生帮助。
由于编者水平有限,程序中肯定有一些不完善的地方,欢迎大家批评指正。