复数问题
今天博主给大家带来一道博主自己在学校做到的一个题目。这个题目可以很好的加深我们对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语言深度解剖】复数运算问题--【好题系列】学会这题,结构体没问题的更多相关文章

  1. C语言深度解剖读书笔记

    开始本节学习笔记之前,先说几句题外话.其实对于C语言深度解剖这本书来说,看完了有一段时间了,一直没有时间来写这篇博客.正巧还刚刚看完了国嵌唐老师的C语言视频,觉得两者是异曲同工,所以就把两者一起记录下 ...

  2. 【转】 C语言深度解剖读书笔记(1.关键字的秘密)

    本文出处:http://blog.csdn.net/mbh_1991/article/details/10149805 开始本节学习笔记之前,先说几句题外话.其实对于C语言深度解剖这本书来说,看完了有 ...

  3. C语言深度解剖读书笔记(6.函数的核心)

    对于本节的函数内容其实就没什么难点了,但是对于函数这节又涉及到了顺序点的问题,我觉得可以还是忽略吧. 本节知识点: 1.函数中的顺序点:f(k,k++);  这样的问题大多跟编译器有关,不要去刻意追求 ...

  4. c语言深度解剖(笔记)

    1.1最宽恒大量的关键字----auto 函数内部变量,限制作用域为这个 1.2.1最快的关键字---- register函数. 关键字请求编译器尽可能的将变量存在 CPU 内部寄存器中 1.2.2使 ...

  5. 《C语言深度解剖》学习笔记之关键字

    第一章 关键字 C语言共有32个关键字. 关键字   auto 声明自动变量 int 声明整型变量 long 声明长整型变量 char 声明字符型变量 float 声明浮点型变量 short 声明短整 ...

  6. GO语言系列(五)- 结构体和接口

    结构体(Struct) Go中struct的特点 1. 用来自定义复杂数据结构 2. struct里面可以包含多个字段(属性) 3. struct类型可以定义方法,注意和函数的区分 4. struct ...

  7. Android JNI编程(六)——C语言函数指针、Unition联合体、枚举、Typedef别名、结构体、结构体指针

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:函数指针 1.函数指针顾名思义就是定义一个指针变量指向一个函数,和一级指 ...

  8. 《C语言深度解剖》面试题整理

    请在40分钟内完成以下20道C语言基础题.在没有任何提示的情况下,如果能得满分,那么你可以扔掉本书了,你的水平已经大大超过了作者:如果能的80分以上,说明你的C语言基础还不错,学习本书可能会比较轻松: ...

  9. 《C语言深度解剖》学习笔记之函数

    第6章 函数 1.编码风格 [规则6-1]每一个函数都必须有注释 [规则6-2]每个函数定义之后以及每个文件结束之后都要加若干个空行 [规则6-3]在一个函数体内,变量定义与函数语句之间要加空行 [规 ...

  10. 《C语言深度解剖》学习笔记之内存管理

    第5章 内存管理 1.野指针 定义指针变量的同时最好初始化为NULL,用完指针后也将变量的值设置为NULL.也就是说除了使用时,别的时间都把它设置为NULL 2.堆,栈和静态区 堆:由malloc系列 ...

随机推荐

  1. win32com报错:无效的类字符串(Invalid Class String)

    异常:无效的类字符串 (Invalid Class String) . 使用python操作COM组件的朋友应该都碰到过,这个报错来自于python标准库pythoncom.win32com也是建立在 ...

  2. 5 Englishi 词根

    词根 1 ced/cess = go 行走 precede    pre=before   ced =go unprecedentedly  un   pre  ced +ed变成adj  +ly 变 ...

  3. Linux: CPU C-states

    0. Overview There are various power modes of the CPU which are determined based on their current usa ...

  4. docker 原理之 user namespace(下)

    1. user namespace user namespace 主要隔离了安全相关的标识符和属性,包括用户 ID,用户组 ID,key 和 capabilities 等.同样一个用户 id 在不同 ...

  5. 43 干货系列从零用Rust编写负载均衡及代理,内网穿透方案完整部署

    wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,七层负载均衡,内网穿透,后续将实现websocket代 ...

  6. 【Freertos】任务切换分析

    任务切换实现 xPortPendSVHandler: mrs r0, psp // 获取进入异常时的进程栈 isb ldr r3, =pxCurrentTCB // 加载线程控制块地址到r3 ldr ...

  7. SpringMVC01——回顾MVC

    1.1什么是MVC MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范. 是将业务逻辑.数据.显示分离的方法来组织代码. MVC主要作用是降低了视图 ...

  8. [转帖]Oracle中unicode的几种不同字符编码模式

    https://zhuanlan.zhihu.com/p/668340691#   在Oracle中unicode字符集中,存在以下几种不同unicode字符集的编码模式 AL32UTF8 UTF8 ...

  9. [转帖]Jmeter_jmeter-plugins插件的安装使用

    一.安装JMter Plugins 1.官网下载 JMeter Plugins 的jar包 2. 将下载的jar包复制到 %JMETER_HOME%\lib\ext 目录下 3. 启动 JMeter ...

  10. 【转帖】linux环境下使用route指令设置多个网络连接的优先级(通过修改路由表的默认网关条目)

    1. 背景 在生活中的会经常遇见一台PC同时连接多个网络的场景.最典型的,一台笔记本可以同时连接一个无线网(手机热点)和一个有线网(以太网).linux和window操作系统在默认情况都会使用最早连接 ...