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

【C语言深度解剖】复数运算问题--【好题系列】学会这题,结构体没问题的更多相关文章
- C语言深度解剖读书笔记
开始本节学习笔记之前,先说几句题外话.其实对于C语言深度解剖这本书来说,看完了有一段时间了,一直没有时间来写这篇博客.正巧还刚刚看完了国嵌唐老师的C语言视频,觉得两者是异曲同工,所以就把两者一起记录下 ...
- 【转】 C语言深度解剖读书笔记(1.关键字的秘密)
本文出处:http://blog.csdn.net/mbh_1991/article/details/10149805 开始本节学习笔记之前,先说几句题外话.其实对于C语言深度解剖这本书来说,看完了有 ...
- C语言深度解剖读书笔记(6.函数的核心)
对于本节的函数内容其实就没什么难点了,但是对于函数这节又涉及到了顺序点的问题,我觉得可以还是忽略吧. 本节知识点: 1.函数中的顺序点:f(k,k++); 这样的问题大多跟编译器有关,不要去刻意追求 ...
- c语言深度解剖(笔记)
1.1最宽恒大量的关键字----auto 函数内部变量,限制作用域为这个 1.2.1最快的关键字---- register函数. 关键字请求编译器尽可能的将变量存在 CPU 内部寄存器中 1.2.2使 ...
- 《C语言深度解剖》学习笔记之关键字
第一章 关键字 C语言共有32个关键字. 关键字 auto 声明自动变量 int 声明整型变量 long 声明长整型变量 char 声明字符型变量 float 声明浮点型变量 short 声明短整 ...
- GO语言系列(五)- 结构体和接口
结构体(Struct) Go中struct的特点 1. 用来自定义复杂数据结构 2. struct里面可以包含多个字段(属性) 3. struct类型可以定义方法,注意和函数的区分 4. struct ...
- Android JNI编程(六)——C语言函数指针、Unition联合体、枚举、Typedef别名、结构体、结构体指针
版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:函数指针 1.函数指针顾名思义就是定义一个指针变量指向一个函数,和一级指 ...
- 《C语言深度解剖》面试题整理
请在40分钟内完成以下20道C语言基础题.在没有任何提示的情况下,如果能得满分,那么你可以扔掉本书了,你的水平已经大大超过了作者:如果能的80分以上,说明你的C语言基础还不错,学习本书可能会比较轻松: ...
- 《C语言深度解剖》学习笔记之函数
第6章 函数 1.编码风格 [规则6-1]每一个函数都必须有注释 [规则6-2]每个函数定义之后以及每个文件结束之后都要加若干个空行 [规则6-3]在一个函数体内,变量定义与函数语句之间要加空行 [规 ...
- 《C语言深度解剖》学习笔记之内存管理
第5章 内存管理 1.野指针 定义指针变量的同时最好初始化为NULL,用完指针后也将变量的值设置为NULL.也就是说除了使用时,别的时间都把它设置为NULL 2.堆,栈和静态区 堆:由malloc系列 ...
随机推荐
- 如何使用阿里云 CDN 对部署在函数计算上的静态网站进行缓存
前言 为了进一步提升网站的访问速度,我们会使用 CDN 对网站进行加速,但是最近在调试阿里云的函数计算和 CDN 的配合使用时发现了一个需要额外注意的地方,下面带大家一起看一下. 如何使用 CDN 对 ...
- mybatis-plus-QueryWrapper 如何写or效果的语句 以及如何给or加括号
先说想要的结果 希望mybatis-plus中QueryWrapper写法生成的sql语句中查询条件是 WHERE (( (LOGIN_ID = ? OR SHI_JI_LOGIN_ID = ?) ) ...
- 【驱动】ifconfig up后内核网络驱动做了什么.md
背景 最近在排查一个网络问题,ifconfig eth0 up 后,网卡link up比较慢.因此,分析了下从ifconfig up 到网络驱动的调用流程.这里顺便作个记录. ifconfig eth ...
- div模拟表格单元格合并
效果如下图: html代码如下: 1 <ul class="schedule-list"> 2 <li class="schedule-title&qu ...
- Can‘t resolve ‘core-js/modules/es.symbol‘ in
https://blog.csdn.net/guoqing2016/article/details/108639300?utm_medium=distribute.pc_relevant.none-t ...
- JS单线程的理解
一.首先需要区分几个概念: 1. 进程和线程的概念: 进程:指在系统中运行的一个应用程序,目的就是担当分配系统资源(CPU时间.内存等)的基本单位 线程:系统分配处理器时间资源的基本单元,建立在进程的 ...
- Transformer的应用
Transformer 写在前面 本学期学习了NLP的课程,本小菜鸡结合做的课设(基于Transformer的英文文档摘要系统的设计与实现),来写一下有关于Transformer的相关内容吧,有问题之 ...
- 在线photoshop网页版工具开发
基于javascript开发的在线ps工具,打包方式webpack 在线预览 在线ps网页版 源码地址 https://github.com/geeeeeeeek 功能介绍 在线图像编辑器允许您使用H ...
- [转帖][java] GC (Allocation Failure)日志分析
日前查看某个程序的日志,发现一直在报GC相关的信息,不确定这样的信息是代表正确还是不正确,所以正好借此机会再复习下GC相关的内容: 以其中一行为例来解读下日志信息: [GC (Allocation F ...
- [转帖]深度硬核文:Nginx的301重定向处理过程分析
https://zhuanlan.zhihu.com/p/84539204 本文首发于公众号:js-mindmap 一,序言 "晚上九点,办公室里烟雾缭绕,工作进度依然没有什么进展.王二胖打 ...
