复数问题
今天博主给大家带来一道博主自己在学校做到的一个题目。这个题目可以很好的加深我们对C语言结构体的理解,在这里分享给大家。学懂这题,我们的C语言结构体,没问题了!
文章目录本篇建议收藏后食用!以免退出后找不到噢~
- 前言
- 题目
- 实现思路
- 实现代码详解
- 复数结构
- 需要实现的接口,为什么要实现它们?
- 整体代码
- 运行结果展示
- 尾声
那么这里博主先安利一下一些干货满满的专栏啦!
题目在食用这篇博客之前,博主在这里介绍一下其它高质量的编程学习栏目:
数据结构专栏:数据结构 这里包含了博主很多的数据结构学习上的总结,每一篇都是超级用心编写的,有兴趣的伙伴们都支持一下吧!
算法专栏:算法 这里可以说是博主的刷题历程,里面总结了一些经典的力扣上的题目,和算法实现的总结,对考试和竞赛都是很有帮助的!
力扣刷题专栏:Leetcode 想要冲击ACM、蓝桥杯或者大学生程序设计竞赛的伙伴,这里面都是博主的刷题记录,希望对你们有帮助!
C的深度解剖专栏:C语言的深度解剖 想要深度学习C语言里面所蕴含的各种智慧,各种功能的底层实现的初学者们,相信这个专栏对你们会有帮助的!
这题的难点其实就在于,复数的计算和大小的比较,和我们输出时的美观程度。
比较好想到的就是,我们一个复数可以用一个结构体来表示,一个变量表示复数的实部,一个变量表示复数的虚部。
要注意的点:
- 比较大小时的情况要考虑全
- 打印结果尽量美观,符合我们数学上的习惯
typedef struct complex {
int realPart;//实部
int imaginaryPart;//虚部
}complex;
需要实现的接口,为什么要实现它们?
这里提供的仅仅只是博主在解题时候的思路,如果伙伴们有更好的思路,可以在评论区留言噢!
首先我们要搞清楚我们要实现哪一些接口:
首先我们要计算,所以写一个计算函数时肯定要的
其次,我们因为要找最大值,我们最好写一个排序算法,把这几个复数排好序。那么在排序的过程中,我们肯定要写一个比较函数的,作用是比较两个复数的大小。
最后,因为我们要输出最大个复数,有可能我们的结果是由重复的,最大的不止一个,所以我们都要输出,因此,我们要写一个判断两个复数是否相等的函数,如果相等而且都是最大的,一起输出!
要实现的接口:
- 排序
- 比较
- 判断是否相等
- 计算
要注意的点:
- 比较函数中,要分为实部虚部相等或者不相等的情况
- 判断是否相等函数中,也要分实部虚部的情况
- 加减乘除得到的结果我们可以放在一个顺序表里面(结构体数组)
- 打印结果尽量美观,符合我们数学上的习惯
#define _CRT_SECURE_NO_WARNINGS 1 #include运行结果展示 尾声//复数的运算与最值 #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语言结构体有了一个更深的理解了吧!
如果你感觉这篇博客对你有帮助的话,不要忘了一键三连噢!



