【C语言深度解剖】复数运算问题--【好题系列】学会这题,结构体没问题

复数问题在这里插入图片描述
今天博主给大家带来一道博主自己在学校做到的一个题目。这个题目可以很好的加深我们对C语言结构体的理解,在这里分享给大家。学懂这题,我们的C语言结构体,没问题了!

本篇建议收藏后食用!以免退出找不到噢~

前言

那么这里博主先安利一下一些干货满满的专栏啦!

在食用这篇博客之前,博主在这里介绍一下其它高质量的编程学习栏目:
数据结构专栏:数据结构 这里包含了博主很多的数据结构学习上的总结,每一篇都是超级用心编写的,有兴趣的伙伴们都支持一下吧!
算法专栏:算法 这里可以说是博主的刷题历程,里面总结了一些经典的力扣上的题目,和算法实现的总结,对考试和竞赛都是很有帮助的!
力扣刷题专栏:Leetcode 想要冲击ACM、蓝桥杯或者大学生程序设计竞赛的伙伴,这里面都是博主的刷题记录,希望对你们有帮助!
C的深度解剖专栏:C语言的深度解剖 想要深度学习C语言里面所蕴含的各种智慧,各种功能的底层实现的初学者们,相信这个专栏对你们会有帮助的!
在这里插入图片描述

题目

在这里插入图片描述
这题的难点其实就在于,复数的计算和大小的比较,和我们输出时的美观程度。

实现思路

比较好想到的就是,我们一个复数可以用一个结构体来表示,一个变量表示复数的实部,一个变量表示复数的虚部。
要注意的点:

  • 比较大小时的情况要考虑全
  • 打印结果尽量美观,符合我们数学上的习惯

实现代码详解

复数结构

typedef struct complex {
	int realPart;//实部
	int imaginaryPart;//虚部
}complex;

需要实现的接口,为什么要实现它们?

这里提供的仅仅只是博主在解题时候的思路,如果伙伴们有更好的思路,可以在评论区留言噢!

首先我们要搞清楚我们要实现哪一些接口:
首先我们要计算,所以写一个计算函数时肯定要的
其次,我们因为要找最大值,我们最好写一个排序算法,把这几个复数排好序。那么在排序的过程中,我们肯定要写一个比较函数的,作用是比较两个复数的大小。
最后,因为我们要输出最大个复数,有可能我们的结果是由重复的,最大的不止一个,所以我们都要输出,因此,我们要写一个判断两个复数是否相等的函数,如果相等而且都是最大的,一起输出!

要实现的接口:

  • 排序
  • 比较
  • 判断是否相等
  • 计算

整体代码

要注意的点:

  • 比较函数中,要分为实部虚部相等或者不相等的情况
  • 判断是否相等函数中,也要分实部虚部的情况
  • 加减乘除得到的结果我们可以放在一个顺序表里面(结构体数组)
  • 打印结果尽量美观,符合我们数学上的习惯
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//复数的运算与最值
#if 1
typedef struct complex {
	int realPart;
	int imaginaryPart;
}complex;
//比较两个复数大小的函数
int compare(complex* p, complex* q) {
	//实部不相等的情况
	if (p->realPart > q->realPart) {
		return 1;
	}
	else if (p->realPart < q->realPart) {
		return -1;
	}
	else {//实部相等的情况
		if (p->imaginaryPart > q->imaginaryPart)
			return 1;
		else if (p->imaginaryPart < q->imaginaryPart)
			return -1;
		else
			return 0;
	}
}
//交换函数
void swap(complex* p, complex* q) {
	complex tmp = { 0 };
	tmp = *p;
	*p = *q;
	*q = tmp;
}
//排序函数
void sort(complex* arr) {
	int i = 0;
	int j = 0;
	for (i = 0; i < 4 - 1; i++) {
		for (j = 0; j < 3 - i; j++) {
			if (compare(arr+i, (arr + 1+i)) < 0) {
				swap(arr + i, (arr + i + 1));
			}
		}
	}
}
//判断两个复数是否相等
int is_equivalence(complex* p, complex* q) {
	if (p->realPart != q->realPart)//实部已经不相等
		return 0;
	else {//实部相等
		if (p->imaginaryPart != q->imaginaryPart)
			return 0;
		else
			return 1;
	}
}
//打印一个复数的函数
void print(complex* p) {
	if (p->realPart == 0 && p->imaginaryPart == 0) {//实部虚部都为0
		printf("{0}\n");
	}
	else if (p->realPart == 0 && p->imaginaryPart != 0) {//实部为0,虚部不为0
		if(p->imaginaryPart!=1)
			printf("{%di}", p->imaginaryPart);
		else
			printf("{i}");
	}
	else if (p->realPart != 0 && p->imaginaryPart == 0) {//实部不为0,虚部为0
		printf("{%d}", p->realPart);
	}
	else {//实部虚部都不为0
		if(p->imaginaryPart<0)
			if(p->imaginaryPart!=-1)
				printf("{%d%di}", p->realPart, p->imaginaryPart);
			else
				printf("{%d-i}", p->realPart);
		else
			if(p->imaginaryPart!=1)
				printf("{%d+%di}", p->realPart, p->imaginaryPart);
			else
				printf("{%d+i}", p->realPart);

	}
}
//计算
void count_ret(int a,int b,int c,int d,complex*ret) {
	int newReal = 0;
	int newIma = 0;
	//计算和
	ret[0].realPart = a + c;
	ret[0].imaginaryPart = b + d;
	//计算差
	ret[1].realPart = a - c;
	ret[1].imaginaryPart = b - d;
	//计算积
	ret[2].realPart = a * c - b * d;
	ret[2].imaginaryPart = a * d + b * c;
	//计算商
	ret[3].realPart = (a * c + b * d) / (c * c + d * d);
	ret[3].imaginaryPart = (b * c - a * d) / (c * c + d * d);
}
//输出结果函数
void output_ret(complex* num) {
	complex ret[4] = { 0 };
	int max = 0;
	int i = 0;
	//计算
	count_ret(num[0].realPart, num[0].imaginaryPart, num[1].realPart, num[1].imaginaryPart,ret);
//输出数据
	//输出两个虚数
	printf("第一个虚数为:");
	print(num);
	printf("\n");
	printf("第二个虚数为:");
	print(num+1);
	printf("\n");
	//输出和差积商
	printf("两个虚数的和为:");
	print(ret);
	printf("\n");
	printf("两个虚数的差为:");
	print(ret+1);
	printf("\n");
	printf("两个虚数的积为:");
	print(ret + 2);
	printf("\n");
	printf("两个虚数的商为:");
	print(ret + 3);
	printf("\n");
//排序
	sort(ret);
	//判断两个复数是否完全相等的函数 相等返回1,不相等返回0
#if 0 is_equivalence();
#endif
	//输出一个复数的函数
#if 0
	print();
#endif
	//输出最大那个虚数
	printf("最大那个复数为:");
	i = 0;
	while (1) {
		print(ret+i);
		if (is_equivalence(ret + i, ret + i + 1)) {
			i++;
		}
		else
			break;
	}
	printf("\n");
}
int main() {
	complex num[2] = { 0 };
	int a = 0;
	int b = 0;
	int c = 0;
	int d = 0;
	//提示输入
	printf("请输入a,b,c,d四个数的值:\n");
	scanf("%d %d %d %d",&num[0].realPart,&num[0].imaginaryPart,&num[1].realPart,&num[1].imaginaryPart);
	//输出结果
	output_ret(num);
	return 0;
}
#endif

运行结果展示

在这里插入图片描述

尾声

看到这里,如果伙伴们都理解了代码的意思和内容,相信都对C语言结构体有了一个更深的理解了吧!
如果你感觉这篇博客对你有帮助的话,不要忘了一键三连噢!
在这里插入图片描述

posted @ 2022-05-03 17:00  背包Yu  阅读(17)  评论(0编辑  收藏  举报  来源