【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系列 ...
随机推荐
- POJ 1456 Supermarket【贪心 + 并查集】
http://poj.org/problem?id=1456 题意:给你 N 件不同的商品,每件商品最多可以买一次.每件物品对应两个值 pi di pi 表示物品的价值,di 表示可以买的最迟时间(也 ...
- Codeforces 1312B Bogosort (逆序证明)
Example input 3 1 7 4 1 1 3 5 6 3 2 1 5 6 4 output 7 1 5 1 3 2 4 6 1 3 5 看题的时候发现和sort有关,但一定要逆序排序 证明: ...
- Codeforces Round #689 (Div. 2, based on Zed Code Competition) 个人题解
1461A. String Generation void solve() { int n, k; cin >> n >> k; for (int i = 1; i <= ...
- OpenSCA技术原理之npm依赖解析
本文主要介绍基于npm包管理器的组件成分解析原理. npm 介绍 npm(全称Node Package Manager)是Node.js的预设软件包管理器. npm的依赖管理文件是package.js ...
- 活动回顾|阿里云 Serverless 技术实战与创新上海站回放&PPT下载
5月27日"阿里云 Serverless 技术实战与创新"上海站圆满落幕.活动现场邀请了来自阿里云 一线技术专家,分享当前 Serverless 趋势和落地实践过程中的挑战和机遇: ...
- ElementUI - <el-table> 表格 selection 设置的复选框禁止选中某些行
https://blog.csdn.net/weixin_44198965/article/details/119026054
- BTC-协议
BTC-协议 一个去中心化的数字货币要解决两个问题 1.谁有权发行货币 比特币的发行是由挖矿决定的(coinbase transaction 唯一一个产生新币的途径)比特币通过挖矿来决定货币的发行权, ...
- java基础-Junit 注解 枚举-day12
目录 1. Junit 2. 注解 annotation 3. 枚举 1. Junit 白盒测试 黑盒测试 自行baidu了解 java单元测试 package com.msb01; import o ...
- 时空图预测的方法论,以及 diffusion model 基本概念
前天和善良的同学聊天,请教了 ① 时空图预测的方法论,② diffusion model 基本概念,记录下来. ① 时空图预测的方法论: 首先,构造 0 ~ t-1 时刻的 t 个图,每个图都有 n ...
- Angular系列教程之模板语法
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...
