在电子电路学科领域中,相量法是分析研究正弦电流电路稳定状态的一种简单易行的方法。相量法与复数有直接的联系。而在普通计算器中,一般不能对复数和相量进行直接的四则运算和相互转化,本文将介绍使用C语言编写程序实现复数和相量直接的四则运算和相互转化,编写后的exe应用程序可以直接使用,能够方便同学们在做题或研究时实现便捷计算。
一、源代码及注释
#define _CRT_SECURE_NO_WARNINGS #include#include #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)in", 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)in", 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)in", 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)in", 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)in", 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+b1ita2+b2in"); 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 p1tu2 p2n"); 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+bin"); scanf("%f%f", &a, &b);//输入复数的实部和虚部 con_pha(a, b);//执行 system("pause");//程序运行暂停,便于查看结果 } else if (input == 4)//进入将相量转化为复数模式 { system("cls"); printf("Please input the phasor:na/_bn"); 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语言学以致用,对专业学习产生帮助。
由于编者水平有限,程序中肯定有一些不完善的地方,欢迎大家批评指正。



