C++复数运算

2023-10-29

C++复数运算探究

题目说明
  抽象数据类型(ADT)的定义与实现: 复数a+bi,a为实部,b为虚部,请用C或C++语言定义和实现复数抽象数据类型。
  要求能够输入两个实数作为实部和虚部,用于初始化(创建)一个复数,对任意的两个复数,能够按照复数运算规则进行加、减、乘运算,定义求复数的模,求共轭复数的算法,并实现两个复数相除,并输出对应的计算结果。

Author:Lee X;
Operating environment:Microsoft Visual Studio 2019

  对于此次的题目,首先让我疑惑的是ADT,在计算机工作中,有些数字是比较难以表示的。例如有理数(可以 a/b 格式表示的数,且 a 和 b 都是整数)本来是不能在电脑中表示出来。不过可以合理的抽象数据类型来定义,如下。构造:使用两个整数 a 与 b 创建实体,其中 a 为分子,b 为分母。运算:加法、减法、乘法、除法、乘幕、比较、约分,转成实数(浮点数)。要完成整个规格,就要根据数据来定义所有的运算。例如,当两个有理数 a/b 和 c/d 相乘时,相乘的结果就要定义为 ( a c ) / ( b d )。还有输入、输出、先决条件、后置条件,以及对抽象数据类型的各种假定。
  抽象数据类型(ADT)是纯粹理论实体,用于简化描述抽象算法,分类与评价数据结构,形式描述程序设计语言的类型系统。一个ADT可以用特定数据类型或数据结构实现,在许多程序设计语言中有许多种实现方式;或者用形式规范语言描述。ADT常实现为模块(module):模块的接口声明了对应于ADT操作的例程(procedure),有时用注释描述了约束。[来自维基百科]
  看过题目后,对于C++熟悉的同学很容易能想到其中的complex库。为了日后的学习,现整理汇总如下的功能:

#include <complex> //complex头文件引用
  std::complex<double> c{3,4}//表示3+4i,所以得知,complex<类型> 变量名(实部,虚部)
  std::complex<double> c1,a;//初始化
  d = real(a);// 返回复数a的实部,当然也可以写成a.real()下面不再赘述
  a.real();
  d = imag(a);// 返回复数a的虚部
  d = abs(a);// 返回复数a的模值/幅值
  d = norm(a);// 返回复数a的模值平方
  d = arg(a);// 返回复数a的幅角
  z = conj(a);// 返回复数a的共轭复数
  c*c1,c/c1...;//符号运算

  所以可见,使用complex头文件是比较方便的,但是我们也需要理解其中的意义。于是,使用C++面向对象的特性进行简易的复数运算,仅包含上述题目所要求的。(以下环境均为VS2019 enterprise版)
  “Complex.h”

#pragma once
#ifndef COMPLEX_H
#define  COMPLEX_H

#include <iostream>
#include <cmath>
using namespace std;

class Complex {
private:
    float Real, Imag;
public:
    Complex(float r = 0, float i = 0) {
        Real = r;
        Imag = i;
    }
    //显示输出复数
    void show() {
        cout << Real << "+" << Imag << "i";
    }
    Complex operator +(Complex& c);//"+"运算符重载完成复数间的加法运算
    Complex operator +(float s);//"+"完成实部与实数的加法运算
    Complex operator -(Complex& c);
    Complex operator -(float s);
    Complex operator *(Complex& c);
    Complex operator *(float s);
    Complex operator /(Complex& c);
    Complex operator / (float s);
    Complex conj(void);
    float  modu(void);

};

#endif

  对于头文件,建立Complex类模板,同时数据类型为float,私有数据为实部与虚部,在公有操作中,进行了方法(成员函数)的编写,例如show,modu等,同时使用C++特性运算符重载(自定义运算),进行加减乘除的运算。
  方法实现"Complex.cpp"

#include "Complex.h"

Complex Complex::operator +(Complex& c) {
    Complex t;
    t.Real = Real + c.Real;//以下均省略this->Real
    t.Imag = Imag + c.Imag;
    return t;
}

Complex Complex::operator +(float s) {
    Complex t;
    t.Real = Real + s;
    t.Imag = Imag;
    return t;
}

Complex Complex::operator-(Complex& c) {
    Complex t;
    t.Real = Real - c.Real;
    t.Imag = Imag - c.Imag;
    return t;
}

Complex Complex::operator-(float s) {
    Complex t;
    t.Real = Real + s;
    t.Imag = Imag - s;
    return t;
}

Complex Complex::operator *(Complex& c) {
    Complex t;
    t.Real = Real * c.Real - Imag * c.Imag;
    t.Imag = Real * c.Imag + Imag * c.Real;
    return t;
}

Complex Complex::operator *(float s) {
    Complex t;
    t.Real = Real * s;
    t.Imag = Imag * s;
    return t;
}

Complex Complex::operator /(Complex& c) {
    Complex t;
    if (c.Real != 0 && c.Imag != 0) {
        t.Real = (Real * c.Real + Imag * c.Imag) / (c.Real * c.Real + c.Imag * c.Imag); //实部除积
        t.Imag = (Imag * c.Real - Real * c.Imag) / (c.Real * c.Real + c.Imag * c.Imag); //虚部除积
        return t;
    }
    else {
        cout << "分母为0,不能执行命令";
        return -1;
    }
}

Complex Complex::operator /(float s) {
    Complex t;
    if (s != 0.0) {
        t.Real = Real / s;
        t.Imag = Imag / s;
        return t;
    }
    else {
        cout << "分母为0,不能执行命令";
        return -1;
    }
}

Complex Complex::conj(void) {
    Complex t;
    t.Real = Real;
    t.Imag = -Imag;
    return t;
}

float  Complex::modu(void) {
    return sqrt(Real * Real + Imag * Imag);
}

  测试文件"Main.cpp"

#include <iostream>
#include "Complex.h"

using namespace std;

int main() {
    float a, b, c, d;
    cout << "请输入第一个复数的实部与虚部:";
    cin >> a >> b;
    cout << "请输入第二个复数的实部与虚部:";
    cin >> c >> d;
    Complex A(a, b), B(c, d), C, D, E, F, G, H;
    C = A + B, D = A - B, E = A * B, F = A / B, G = A.conj(), H = B.conj();
    cout << "加法:"; A.show(); cout << "+"; B.show(); cout << "="; C.show(); cout << endl;
    cout << "减法:"; A.show(); cout << "-"; B.show(); cout << "="; D.show(); cout << endl;
    cout << "乘法:("; A.show(); cout << ")*("; B.show(); cout << ")="; E.show(); cout << endl;
    cout << "除法:("; A.show(); cout << ")/("; B.show(); cout << ")="; F.show(); cout << endl;
    cout << "共轭复数:"; A.show(); cout << ":"; G.show(); cout << "  "; B.show(); cout << ":"; H.show(); cout << endl;
    cout << "复数的模:"; A.show(); cout << ":" << A.modu(); cout << "  "; B.show(); cout << ":" << B.modu() << endl;
    return 0;
}

  以上为C++的代码书写,采取了头文件测试文件等的运用,也比较直观,同时也起到了函数功能封装的作用。以上附完整代码(Main.cpp)

#include <iostream>
#include <cmath>
using namespace std;

class Complex{
    private:
       float Real,Imag;
    public:
        Complex(float r=0,float i=0){
            Real=r;
            Imag=i;
        }
        //显示输出复数
        void show(){
            cout<<Real<<"+"<<Imag<<"i";
        }    
        Complex operator +(Complex &c);//"+"运算符重载完成复数间的加法运算
        Complex operator +(float s);//"+"完成实部与实数的加法运算
        Complex operator -(Complex &c);
        Complex operator -(float s);
        Complex operator *(Complex &c);
        Complex operator *(float s);
        Complex operator /(Complex &c);
        Complex operator / (float s);
        Complex conj(void);
        float  modu(void);
        
};

Complex Complex::operator +(Complex &c){
    Complex t;
    t.Real=Real+c.Real;
    t.Imag=Imag+c.Imag;
    return t;
}

Complex Complex::operator +(float s){
    Complex t;
    t.Real=Real+s;
    t.Imag=Imag;
    return t;
}

Complex Complex::operator-(Complex &c){
    Complex t;
    t.Real=Real-c.Real;
    t.Imag=Imag-c.Imag;
    return t;
}

Complex Complex::operator-(float s){
    Complex t;
    t.Real=Real+s;
    t.Imag=Imag-s;
    return t;
}

Complex Complex::operator *(Complex &c){
    Complex t;
    t.Real=Real*c.Real-Imag*c.Imag;
    t.Imag=Real*c.Imag+Imag*c.Real;
    return t;
}

Complex Complex::operator *(float s){
    Complex t;
    t.Real=Real*s;
    t.Imag=Imag*s;
    return t;
}

Complex Complex::operator /(Complex &c){
    Complex t;
    if(c.Real!=0&&c.Imag!=0){
        t.Real=(Real*c.Real+Imag*c.Imag)/(c.Real*c.Real+c.Imag*c.Imag); //实部除积
        t.Imag=(Imag*c.Real-Real*c.Imag)/(c.Real*c.Real+c.Imag*c.Imag); //虚部除积
        return t;
    }
    else{
        cout<<"分母为0,不能执行命令";
        return -1;
    }
}

Complex Complex::operator /(float s){
    Complex t;
    if(s!=0.0){
        t.Real=Real/s;
        t.Imag=Imag/s;
        return t;
    }
    else{
        cout<<"分母为0,不能执行命令";
        return -1;
    }
}

Complex Complex::conj(void){
    Complex t;
    t.Real=Real;
    t.Imag=-Imag;
    return t;
}

float  Complex::modu(void){
    return sqrt(Real*Real+Imag*Imag);
}

int main(){
    float a,b,c,d;
    cout<<"请输入第一个复数的实部与虚部:";
    cin>>a>>b;
    cout<<"请输入第二个复数的实部与虚部:";
    cin>>c>>d;
    Complex A(a,b),B(c,d),C,D,E,F,G,H;
    C=A+B,D=A-B,E=A*B,F=A/B,G=A.conj(),H=B.conj();
    cout<<"加法:";A.show();cout<<"+";B.show();C.show();cout<<endl;
    cout<<"减法:";A.show();cout<<"-";B.show();D.show();cout<<endl;
    cout<<"乘法:";A.show();cout<<"*";B.show();E.show();cout<<endl;
    cout<<"除法:";A.show();cout<<"/";B.show();F.show();cout<<endl;
    cout<<"共轭复数:";A.show();cout<<":";G.show();cout<<"  ";B.show();cout<<":";H.show();cout<<endl;
    cout<<"复数的模:";A.show();cout<<":"<<A.modu();cout<<"  ";B.show();cout<<":"<<B.modu()<<endl;
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++复数运算 的相关文章

随机推荐

  • UOS桌面版配置远程访问

    UOS桌面版配置远程访问 一 SSH SFTP 二 VNC 三 x11vnc service 一 SSH SFTP 安装SSH sudo apt update sudo apt install ssh 开启SFTP vi etc ssh s
  • 单次交换找字典序最小字符串

    题目要求 给一个字符串s 你可以至多选择两个不同位置的字符进行交换 可以不交换 问所有可能中字典序最小的串 输入 aaazbcdeadcd 输出 aaaabcdezdcd 题目解析 字典序最小 即与当前字符串相比最小的字符串 那么只需要找到
  • 【数据压缩】Exp01.彩色空间转换——YUV2RGB

    一 基本原理 这次的实验是将yuv格式的图像转换为rgb格式 两种彩色空间互相转换的公式如下 1 RGB转YUV Y 0 2990 R 0 5870 G 0 1140 B U 0 1684 R 0 3316 G 0 5 B V 0 5 R
  • css复习中常见的问题

    1 如果想让图片位于文字之后显示 即文字占前边 如下代码所示 img src dog jpg alt p 保护动物 人人有责 p 注意 由于在上述例子img标签元素设置了z index属性 即显示元素相对应的优先级 值 1即表示优先级滞后一
  • 虚拟机服务器的好处,vmware虚拟机的作用

    虚拟机不仅仅应用于学习与实验中 还可以直接应用于现实 使用VMware GSX Server或VMware ESX Server Microsoft Virtual Server 可以在一台高性能的服务器上同时运行多台虚拟机服务器 每台虚拟
  • kind & kubernetes 集群内如何通过 helm 部署定制化 Prometheus-Operator?

    文章目录 1 Prometheus 简介 2 Prometheus 优势 3 Prometheus 架构图 4 Prometheus Operator 简介 5 Prometheus Operator 架构图 6 环境准备 7 Kind 部
  • 优雅演进:探索低代码与全栈的完美结合

    前情提要 本章节是番外篇的低代码平台的相关知识 接下来我们即将进入一个全新的空间 对代码有一个全新的视角 以下的内容一定会让你对低代码平台有一个颠覆性的认识哦 以下内容干货满满 跟上步伐吧 作者介绍 作者 热爱编程不起眼的小人物 作者的Gi
  • sbt配置国内镜像

    操作环境 win10 从官网下载sbt的windows安装包 安装成功后 进入安装目录的 conf 文件夹 编辑sbtconfig txt 增加下面两行代码 Dsbt global base C Sbt sbt Dsbt repositor
  • 智能安全 - 学习资源

    Security Data Science Learning Resources
  • 【Spring源码系列】Bean生命周期-实例化前

    这里写目录标题 前言 一 实例化前 InstantiationAwareBeanPostProcessor介绍 InstantiationAwareBeanPostProcessor实例化前作用 InstantiationAwareBean
  • iphonex黑屏开不了机_手机死机开不了机怎么办

    大多数手机用户在使用手机过程中或多或少都遇到过死机的问题 如同电脑的操作系统也会出现死机一样 那么 当手机死机开不了机怎么办 下面介绍一下手机死机后开不了机解决办法 手机死机开不了机怎么办 苹果手机的死机解决方法 步骤1 按住你手机 开机键
  • 初探STM32F4(6)--系统时钟配置

    时钟配置 概述 时钟系统框图 时钟系统初始化代码架构分析 概述 经过前文对GPIO USART外设的初步学习 发现有两个基本知识需要补充学习 一个是系统时钟的相关配置 另一个是中断事件的相关配置 本文先学习系统时钟 阅读完本文 要能回答以下
  • C++ 防 陷阱2 重复包含头文件

    multiple definition of 错误 1 为了避免重复包含头文件 建议在声明每个都文件时采用 头文件卫士 采用google建议H 具体形式如下 ifndef PROJECT PATH FILE H define PROJECT
  • 十五)Stable Diffusion使用教程:其他

    A still life scene with the theme of small and delicate jewelry crystal clear gemstones Product positioning is conspicuo
  • ARM Linux Oops使用小结

    内核Oops小结 出现Oops消息的大部分错误时因为对NULL指针取值或者因为用了其他不正确的指针值 Oops如何产生的解释如下 由于处理器使用的地址几乎都是虚拟地址 这些地址通过一个被称为 页表 的结构被映射为物理地址 当引入一个非法指针
  • 【opencv4.3.0教程】01之opencv介绍与配置(win10+VS2015+OpenCV4.3.0)

    目录 一 前言 二 OpenCV介绍 1 介绍 2 OpenCV版本简介 3 OpenCV4 3 0下载 三 OpenCV安装与配置 1 安装 2 环境变量配置 四 配置VS2015 1 包含目录与库目录 2 链接器配置 五 测试及效果 一
  • Ajax vs Willem II,Feyenoord on top after beating Ajax 2-1

    Feyenoord on top after beating Ajax 2 1 Soccer Updated 2005 08 29 11 07 AMSTERDAM Netherlands Dirk Kuijt and Salomon Kal
  • 【概率论与数理统计】猴博士 笔记 p3-4 事件的概率、事件的独立性

    事件的概率 引入 画图 假设方块面积为1 那么P A 的数值就是点落在A上的概率 我们可以通过画图求出很多概率 如 P A B 0 25 P B A 0 23 P A B 0 58 一些概念 例1 解 0 3 画个图就行 例2 解 5 12
  • Windows平台下安装与配置MySQL ,配置环境变量,详细图解,

    1 安装检查 下载之前要看一下Windows版本 如果是专业版我们在安装之前需要多一步检查操作 如果是专业版我们需要在计算机管理中检查管理员属性中是否添加网络服务的属性 红框部分 计算机管理 gt 本地用户和组 gt 组 gt 双击Admi
  • C++复数运算

    C 复数运算探究 题目说明 抽象数据类型 ADT 的定义与实现 复数a bi a为实部 b为虚部 请用C或C 语言定义和实现复数抽象数据类型 要求能够输入两个实数作为实部和虚部 用于初始化 创建 一个复数 对任意的两个复数 能够按照复数运算