【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语言结构体有了一个更深的理解了吧!
如果你感觉这篇博客对你有帮助的话,不要忘了一键三连噢!