用C语言实现复数和相量的四则运算和相互转化

        在电子电路学科领域中,相量法是分析研究正弦电流电路稳定状态的一种简单易行的方法。相量法与复数有直接的联系。而在普通计算器中,一般不能对复数和相量进行直接的四则运算和相互转化,本文将介绍使用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语言学以致用,对专业学习产生帮助。

        由于编者水平有限,程序中肯定有一些不完善的地方,欢迎大家批评指正。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Celestial_Wings_2022

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值