第六周项目六--复数模板类

问题及代码:

/* 
 * Copyright (c) 2014, 烟台大学计算机学院 
 * All rights reserved. 
 * 文件名称:test.cpp 
 * 作    者:尚 月 
 * 完成日期:2015年 4 月 14 日 
 * 版 本 号:v1.0 
 * 
 * 问题描述:阅读教材实例,该例实现了一个复数类,但美中不足的是,复数类的实部和虚部都固定只能是double型的。可以通过模板类的技术手段,设计Complex,使实部和虚部的类型为定义对象时指定的实际类型。
           (1)要求类成员函数在类外定义
           (2)在此基础上,再实现减法、乘法和除法
 * 程序输出:按要求输出
*/  
#include<iostream>
using namespace std;
template<class T>    //类声明前加模板声明
class Complex
{
public:
    Complex()
    {
        real=0;
        imag=0;
    }
    Complex(T r,T i)
    {
        real=r;    //类声明每一个T,将被对象定义时提供的实际类型代替
        imag=i;
    }
    Complex complex_add(Complex &c2);
    Complex complex_minus(Complex &c2);
    Complex complex_multiply(Complex &c2);
    Complex complex_divide(Complex &c2);
    void display();
private:
    T real;//数据成员的类型,也将被对象定义时提供的实际类型代替
    T imag;
};
//复数相加:(a+bi)+(c+di)=(a+c)+(b+d)i.
template<class T>    //每一个成员函数的定义前,必须要声明类模板
Complex<T> Complex<T>::complex_add(Complex <T> &c2)
{
    Complex <T> c;   //凡用到类名处也用“类模板名<虚拟类型参数>”形式,本题中要求两个复数的和,自然要产生一个新的复数对象
    c.real=real+c2.real;
    c.imag=imag+c2.imag;
    return c;
}
//复数相减:(a+bi)-(c+di)=(a-c)-(b-d)i.
template <class T>
Complex<T> Complex<T>::complex_minus(Complex <T> &c2)
{
    Complex <T> c;
    c.real=real-c2.real;
    c.imag=imag-c2.imag;
    return c;
}
//复数相乘:(a+bi)*(c+di)=(ac-bd)+(bc+ad)i.
template <class T>
Complex<T> Complex<T>::complex_multiply(Complex<T> &c2)
{
    Complex <T> c;
    c.real=real*c2.real-imag*c2.imag;
    c.imag=imag*c2.real+real*c2.imag;
    return c;
}
//复数相除:(a+bi)/(c+di)=(ac+bd)/(c^2+d^2)+(bc-ad)/(c^2+d^2)i
template <class T>
Complex<T> Complex<T>::complex_divide(Complex <T> &c2)
{
    Complex <T> c;
    T d=c2.real*c2.real+c2.imag*c2.imag;
    c.real=(real*c2.real+imag*c2.imag)/d;
    c.imag=(imag*c2.real-real*c2.imag)/d;
    return c;
}
template <class T>
void Complex <T>::display()
{
    cout<<"("<<real<<","<<imag<<")"<<endl;
}
int main()
{
    Complex<int> c1(3,4),c2(5,-10),c3;   //定义对象时,用“类模板名<实际类型名>”形式
    cout<<"c1=";
    c1.display();
    cout<<"c2=";
    c2.display();

    c3=c1.complex_add(c2);
    cout<<"c1+c2=";
    c3.display();

    c3=c1.complex_minus(c2);
    cout<<"c1-c2=";
    c3.display();

    c3=c1.complex_multiply(c2);
    cout<<"c1*c2=";
    c3.display();

    c3=c1.complex_divide(c2);
    cout<<"c1/c2=";
    c3.display();

    cout<<endl;

    Complex<double> c4(3.1,4.4),c5(5.34,-10.21),c6;   //定义对象时,用“类模板名<实际类型名>"形式
    cout<<"c4=";
    c4.display();
    cout<<"c5=";
    c5.display();

    c6=c4.complex_add(c5);
    cout<<"c4+c5=";
    c6.display();

    c6=c4.complex_minus(c5);
    cout<<"c4-c5=";
    c6.display();

    c6=c4.complex_multiply(c5);
    cout<<"c4*c5=";
    c6.display();

    c6=c4.complex_divide(c5);
    cout<<"c4/c5=";
    c6.display();

    return 0;
}




运行结果:

学习总结:初体验模板类,有的地方还是有点儿乱,希望经过多练习后会有效果,加油。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
复数类的操作主要包括以下内容: 1. 实部和虚部的获取和设置 2. 模长的计算 3. 复数加、减、乘、除运算 4. 复数的共轭和相反数 下面是一个简单的复数类实现: ```python class ComplexNumber: def __init__(self, real=0, imag=0): self.real = real self.imag = imag def get_real(self): return self.real def set_real(self, real): self.real = real def get_imag(self): return self.imag def set_imag(self, imag): self.imag = imag def modulus(self): return (self.real ** 2 + self.imag ** 2) ** 0.5 def __add__(self, other): return ComplexNumber(self.real + other.real, self.imag + other.imag) def __sub__(self, other): return ComplexNumber(self.real - other.real, self.imag - other.imag) def __mul__(self, other): return ComplexNumber(self.real * other.real - self.imag * other.imag, self.real * other.imag + self.imag * other.real) def __truediv__(self, other): denominator = other.real ** 2 + other.imag ** 2 return ComplexNumber((self.real * other.real + self.imag * other.imag) / denominator, (self.imag * other.real - self.real * other.imag) / denominator) def conjugate(self): return ComplexNumber(self.real, -self.imag) def opposite(self): return ComplexNumber(-self.real, -self.imag) ``` 这里我们用到了 Python 中的魔术方法,即以双下划线开头和结尾的方法,例如 `__add__`、`__sub__`、`__mul__` 和 `__truediv__` 分别表示复数的加、减、乘、除运算。这些方法可以让我们像使用内置类型一样使用自定义类型。 下面是一些使用示例: ```python # 创建复数对象 z1 = ComplexNumber(1, 2) z2 = ComplexNumber(3, 4) # 获取实部和虚部 print(z1.get_real(), z1.get_imag()) # 1 2 # 设置实部和虚部 z1.set_real(5) z1.set_imag(6) print(z1.get_real(), z1.get_imag()) # 5 6 # 计算模长 print(z1.modulus()) # 7.810249675906654 # 复数加、减、乘、除运算 print(z1 + z2) # (8+10j) print(z1 - z2) # (-2-2j) print(z1 * z2) # (-7+36j) print(z1 / z2) # (0.44+0.08j) # 复数的共轭和相反数 print(z1.conjugate()) # (5-6j) print(z1.opposite()) # (-5-6j) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值