【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系列 ...
随机推荐
- 无需代码绘制人工神经网络ANN模型结构图的方法
本文介绍几种基于在线网页或软件的.不用代码的神经网络模型结构可视化绘图方法. 之前向大家介绍了一种基于Python第三方ann_visualizer模块的神经网络结构可视化方法,大家可以直接点 ...
- P1765
和那道题一样,这次用的getchar,结果对了可是洛谷评测WA了,换成scanf单个字符,结果还是WA了,换成直接getline读入整个字符串就对了. 可见读入单个字符的方式有可能出现各种小错,尤其是 ...
- C#设计模式11——享元模式的写法
1. 什么是享元模式? 享元模式是一种结构型设计模式,目的是通过共享对象来尽量减少内存使用和对象数量.它通过将对象分为可共享的和不可共享的来实现这一目的. 2. 为什么要使用享元模式? 使用享元模式可 ...
- java进阶(24)--ArrayList集合、LinkList集合、Vector集合
一.基础 1.ArrayList集合底层是Object[]数组 2.默认容量10(优先:Add第一个元素,初始化未0,jdk13) 3.构造方法:无参(默认).有参 4.ArrayList集合扩容比例 ...
- CoinBase是什么?
什么是CoinBase交易? 比特币区块链上的每个区块中都会包含一个或者多个交易(transaction),其中第一个交易就叫做CoinBase交易. 什么是CoinBase交易? CoinBase交 ...
- java项目实战-jdbc实现-书城的增删改查-day21
目录 1. 安装mysql 安装navicate 2. jdbc实现增删改查 1. 安装mysql 安装navicate 参考网上资料 创库 创表 并放入3条测试数据 2. jdbc实现增删改查 bo ...
- Redis 缓存与数据库数据不一致问题
Redis缓存与数据库数据不一致问题是指在使用Redis作为缓存系统时,由于缓存和数据库之间的操作没有同步或处理不当,导致缓存中的数据与数据库中的数据不同步,产生数据不一致的情况. 现象: 数据库更新 ...
- JS - 递归实现无限分类
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- JMS微服务开发示例(八)双机热备
双机热备,指两个一模一样的微服务,两个同时在运行,但是只有一个在工作,当工作中的微服务垮掉后,另一个会自行补上. 要实现这个,只需要设置 SingletonService = true. var mi ...
- [转帖]Google SRE 薪水,看看同样作为 SRE 的你相差多少
https://zhuanlan.zhihu.com/p/566098252 SRE 是确保所有生产环境(Infra/Server/DBS 等)一直正常运行的人.每个网络科技公司基本都有这个部门.但是 ...
