复数

  • 1.前言
  • 2.内容
    • 1.头文件 Complex.h
    • 2.实现 Complex.c
  • 3.总结及思路提示
    • 1.初始化
    • 2.销毁
    • 3.四则运算
    • 4.输出格式注意点
  • 4.更新日志

1.前言

所期待实现的功能包括:

1.复数的初始化
2.销毁复数
3.获取复数的实部、虚部
4.复数的四则运算
5.如何正确地表示运算过程并输出结果

2.内容

1.头文件 Complex.h

#pragma once    //保证编译一次
#include <stdio.h>
#include <stdlib.h>   //exit
#include <stdbool.h> //bool
typedef struct {double Real, Imag;bool exist_r, exist_i;
}Complex;
void InitComplex(Complex* c, double real, double  imag);  //初始化
void DestroyComplex(Complex* c);   //销毁复数
double GetReal(Complex c);    //获取复数的实部
double GetImag(Complex c);   //获取复数的虚部
Complex Add(Complex c1, Complex c2);  //  +
Complex Sub(Complex c1, Complex c2); //  -
Complex Mul(Complex c1, Complex c2); //  *
Complex Div(Complex c1, Complex c2); //  /
void PrintComplex(Complex c);    //输出复数[被PrintRes调用]
void PrintRes(Complex c1, Complex c2, Complex c3, char op);  //输出答案
//注1:不用typedef时,定义时要加struct
//注2: 为了较小地影响精度 以及 保持美观,运算结果只保留一位小数输出

2.实现 Complex.c

#include <stdio.h>
#include <Complex.h>
#include <stdbool.h>
typedef struct{double Real, Imag;bool exist_r, exist_i;
}Complex;char op[] = { ' ','+','-','*','/' };void InitComplex(Complex *c, double real, double  imag)
{c->Real = real, c->Imag = imag;c->exist_r = true, c->exist_i = true;puts("Init Successfully");
}void DestroyComplex(Complex *c)
{if (c->exist_r || c->exist_i){c->exist_r = c->exist_i = false;puts("Destroyed Successfully");}else{puts("ERROR ! Invalid Destroy !");exit(0);}
}double GetReal(Complex c)
{if (c.exist_r) return c.Real;else{puts("ERROR ! Invalid Get Real !");exit(0);}
}
double GetImag(Complex c)
{if (c.exist_i) return c.Imag;else{puts("ERROR ! Invalid Get Imag !");exit(0);}
}// +
Complex Add(Complex c1,Complex c2)
{if (c1.exist_r && c1.exist_i && c2.exist_r && c2.exist_i){Complex c3;c3.Real = c1.Real + c2.Real;c3.Imag = c1.Imag + c2.Imag;return c3;}else{puts("ERROR ! Complex Has Been Destroyed !");exit(0);}
}
// -
Complex Sub(Complex c1,Complex c2)
{if (c1.exist_r && c1.exist_i && c2.exist_r && c2.exist_i){Complex c3;c3.Real = c1.Real - c2.Real;c3.Imag = c1.Imag - c2.Imag;return c3;}else{puts("ERROR ! Complex Has Been Destroyed !");exit(0);}
}// *
Complex Mul(Complex c1,Complex c2)
{if (c1.exist_r && c1.exist_i && c2.exist_r && c2.exist_i){Complex c3;c3.Real = c1.Real * c2.Real - c1.Imag * c2.Imag;c3.Imag = c1.Real * c2.Imag + c1.Imag * c2.Real;return c3;}else{puts("ERROR ! Complex Has Been Destroyed !");exit(0);}
}//  /
Complex Div(Complex c1,Complex c2)
{if (c1.exist_r && c1.exist_i && c2.exist_r && c2.exist_i){double t = c2.Real * c2.Real + c2.Imag * c2.Imag;if (t){Complex c3;double r = (c1.Real * c2.Real + c1.Imag * c2.Imag) / t;double i = (c1.Imag * c2.Real - c1.Real * c2.Imag) / t;c3.Real = r;c3.Imag = i;return c3;}else{puts("The Divisor Is Zero !");exit(0);}}else{puts("ERROR ! Complex Has Been Destroyed !");exit(0);}
}void PrintComplex(Complex c)
{if (c.exist_r || c.exist_i){//存在实部if (c.exist_r){//实部为0if (!c.Real){//虚部存在if (c.exist_i && c.Imag)printf("%.1lfi", c.Imag);else //虚部不存在 或者 虚部为0printf("0");}else //实部不为0{//虚部存在if (c.exist_i && c.Imag){//正负号处理if(c.Imag > 0)printf("%.1lf+%.1lfi", c.Real, c.Imag);elseprintf("%.1lf%.1lfi", c.Real, c.Imag);}else  //虚部不存在 或者 虚部为0printf("%.1lf", c.Real);}}}else  //实部、虚部均不存在puts("ERROR ! Invalid Print !");
}
void PrintRes(Complex c1, Complex c2, Complex c3,char op)
{PrintComplex(c1);printf(" %c ", op);PrintComplex(c2);printf(" = ");PrintComplex(c3);puts("");
}int main()
{//InitComplex c1,c2,c3;puts("请输入复数c1的实部和虚部:");double r1, i1;scanf("%lf%lf", &r1, &i1);InitComplex(&c1, r1, i1);puts("请输入复数c2的实部和虚部:");double r2, i2;scanf("%lf%lf", &r2, &i2);InitComplex(&c2, r2, i2);//Choose Operationprintf("请选择运算方式:\n1. +  2. - \n3. *  4. /\n");int cs;scanf("%d", &cs);while (cs < 1 || cs >4){puts("Invalid Operation ! Please reinput :");scanf("%d", &cs);}switch (cs){case 1: {//Operation: Addc3 = Add(c1, c2);break;}case 2:{//Operation: Subc3 = Sub(c1, c2);break;}case 3:{//Operation: Mulc3 = Mul(c1, c2);break;}case 4:{//Operation: Divc3 = Div(c1, c2);break;}}//OutputPrintRes(c1, c2, c3,op[cs]);return 0;
}

3.总结及思路提示

1.初始化

运用指针,修改结构体复数的实部、虚部,并且将exist_r 、exist_i 赋为true,表示实部、虚部未被销毁

2.销毁

由于C语言中无引用,则不利于销毁操作,则取巧,用两个bool类型的变量记录复数的实部、虚部是否被销毁

3.四则运算

// +
(a+bi) + (c+di) = (a+c) + (b+d)i
// -
(a+bi) - (c+di) = (a-c) + (b-d)i;
// *
(a+bi) * (c+di) = ac + adi +bci - bd = (ac-bd) + (ad+bc)
// /
(a+bi) / (c+di) = (a+bi)(c-di)/(c+di)(c-di) = ( (ac+bd) + (bc-ad)i ) / (c^2 + d^2)

4.输出格式注意点

1. 已经销毁的部分不输出
2. 负数 、 零  的特判输出
3. 连接实部、虚部的符号

4.更新日志

2022.9.8 整理

欢迎评论留言、指正~~

C语言实现复数的几个基本操作(四则运算,初始化,销毁...)相关推荐

  1. 用C语言实现复数和相量的四则运算和相互转化

    在电子电路学科领域中,相量法是分析研究正弦电流电路稳定状态的一种简单易行的方法.相量法与复数有直接的联系.而在普通计算器中,一般不能对复数和相量进行直接的四则运算和相互转化,本文将介绍使用C语言编写程 ...

  2. c语言快速复数的比较大小,c语言中的复数操作

    c语言中的复数操作 发布时间:2020-06-17 14:23:06 来源:亿速云 阅读:391 作者:鸽子 复数在数学运算中十分重要,在编写数值运算或者算法的时候,我们会用到复数这种概念. 那么,复 ...

  3. C语言中声明复数用什么字母,用c语言定义复数-20210407134457.docx-原创力文档

    标准化管理处编码[BBX968T-XBB8968-NNJ668-MM9N] 标准化管理处编码[BBX968T-XBB8968-NNJ668-MM9N] 用c语言定义复数 实验0 预备实验 实验题目: ...

  4. 使用c语言实现复数运算的程序,用C语言实现的复数运算程序设计

    用C语言实现的复数运算程序设计 电大理工 2009年3月 Study of Science and Engineering at RTVU. 第1期 总第238期 用C语言实现的复数运算程序设计 王彦 ...

  5. c语言进行复数的四则运算

    c语言进行复数的四则运算 额..好像没什么好说的直接上代码吧,注意下结构体的用法 #include<stdio.h> struct complex {double re;double im ...

  6. R语言数据处理——基础篇 data.frame基本操作

    文章目录 R语言数据处理--基础篇 data.frame基本操作 data.frame的创建 数据访问.条件筛选与删除 数据访问 数据筛选 删除 使用`gather()`进行data.frame数据格 ...

  7. C语言之复数的加减乘除

    C语言之复数的加减乘除 1 源代码 2 结果 1 源代码 #include<stdio.h> #include<stdlib.h>// 定义一个结构体 typedef stru ...

  8. C语言函数——复数四则运算

    C语言函数--复数四则运算 本题要求编写程序,计算2个复数的和.差.积.商. 输入格式: 输入在一行中按照a1 b1 a2 b2的格式给出2个复数C1=a1+b1i和C2=a2+b2i的实部和虚部.题 ...

  9. 使用Go语言进行复数计算优选complex128复数类型

    使用Go语言进行复数计算优选complex128复数类型 如下文例子,如果使用 complex64 类型的话,就会由于精度不足而出错:改用 complex128 复数类型就可以了. //jxs @ 2 ...

最新文章

  1. 北电PBX资料_LD 17 系統結構指令設定
  2. 文件上传——选择文件之后自动上传||文件上传的后端代码
  3. Linux centos7安装Git及 Jenkins配置Git
  4. 五行中的土在哪个方位_土命人适合往哪个方向发展
  5. 深度学习(Deep Learning)读书思考三:正则化
  6. leetcode 1442. 形成两个异或相等数组的三元组数目(位运算)
  7. python 字符串replace函数_01-Python里字符串的常用操作方法--replace()函数
  8. freebsd linux性能,为什么有人会选择FreeBSD而不是Linux?[关闭]
  9. android开发框架 xui,简介 - 正确使用XUI的姿势 - 《XUI - Android 原生 UI 框架》 - 书栈网 · BookStack...
  10. 实现1.1、1.1.1的多级编号文档排版
  11. 什么是智能家电?消费者不知判定标准
  12. WINRAR诊断信息:不可预料的压缩文件末端
  13. 宏观经济学-大题资源整理
  14. iPad上用code-server运行VS Code
  15. 一种全国产化军用计算机设计大赛,北科大新闻网-我校多支团队在中国大学生计算机设计大赛全国总决赛中斩获佳绩...
  16. Excel 条件格式查重问题
  17. 中国市场 Android App 兼容性报告
  18. Sql有条件的插入语句
  19. 01-治疗脱发从MarkDown语法开始
  20. 输入一个华氏温度,要求输出摄氏温度。公式为 c=5(F-32)/9 输出要求有文字说明,取位2小数。...

热门文章

  1. Hspice学习笔记一
  2. 跨境电商系统_商城自营系统_自营店铺系统_功能业务逻辑_OctShop免费开源商城系统
  3. 电脑桌面上什么东西都没有了,要怎么设置才能恢复??
  4. ireader android 源码,仿ireader书架 - androidCode的个人空间 - OSCHINA - 中文开源技术交流社区...
  5. MacBook苹果笔记本M芯片功耗测试软件Asitop
  6. M3DGIS三维电子沙盘数字沙盘大数据人工智能模拟对抗推演系统开发教程视频第一课
  7. 检测下你的显示器是否有问题
  8. 高等数学 · 空间解析几何与向量代数理论笔记小结
  9. 基于物理的渲染—HDR Tone Mapping
  10. cucumber框架使用解析