复数的运算 (数据结构C语言)

问题描述

定义抽象数据类型“复数”(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;
}

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值