【大一程序设计基础作业】P216Ex3重载运算符实现Vector类+、-、*运算(完整代码已附文末)

假设有向量X=(x1,x2,...,xn)和Y=(y1,y2,...,yn),他们之间的加、减、乘运算分别定义为:

X+Y=(x1+y1,x2+y2,...,xn+yn)

X-Y=(x1-y1,x2-y2,...,xn-yn)

X*Y=(x1*y1,x2*y2,...,xn*yn)

编写程序定义向量类Vector,重载运算符+,-,*和=,实现向量之间的加,减,乘和赋值运算;重载运算符>>、<<实现向量的输入输出功能。注意检测运算的合法性。

依题意得,Vector类应该用动态数组实现,所以首先写出构造函数对Vector类进行初始化;写出析构函数进行使用后空间释放

Vector(int);
Vector(double*,int); 
~Vector();
{/*…*/}
Vector::Vector(int n)
 { v = new double[n];
 len = n; 
for (int i = 0; i < n; i++)
v[i] = 0; }
Vector::Vector(double* p, int n)
{
    v = new double[n];
    len = n;
    for (int i = 0; i < n; i++)
        v[i] = p[i];
}
Vector::~Vector { delete v; v = NULL; len = 0; }

之后便是老生常谈的运算符重载了,还是要注意拷贝构造函数和赋值运算符重载的配合使用

Vector& Vector::operator=(Vector a)
{
    for (int i = 0; i < len; i++)
        v[i] = a[i];
    return *this;
}
Vector::Vector(const Vector& a)
{
    v = new double [a.len];
    for (int i = 0; i < 3; i++)
        v[i] = a.v[3];
}

结合上一篇博客,可以对比一下拷贝构造函数和赋值运算符重载在不同情况下的使用

提一嘴[]运算符的重载。[]的重载目的在于可以直接 对象[整形] 的方式来访问对象中的成员,而无需使用 对象.成员[] 的格式。[]运算符的重载只能使用成员函数进行重载,参考代码:

double& operator[](int i)const { return this->v[i]; }

剩下的运算符重载与之前的无太大差别,这边不再赘述,直接给出完整代码:

#include <iostream>
using namespace std;
class Vector
{
private: double* v; int len;
public:
    Vector(int);
    Vector(double*,int);
    Vector(const Vector& a);
    ~Vector() { delete v; v = NULL; len = 0; }
    friend ostream& operator<<(ostream&, Vector&);
    friend istream& operator>>(istream&, Vector&); 
    double& operator[](int i)const { return this->v[i]; }
    Vector& operator=(Vector);
    friend Vector operator+(Vector&, Vector&);
    friend Vector operator-(Vector&, Vector&);
    friend Vector operator*(Vector&, Vector&); 
};
Vector::Vector(int n) { v = new double[n]; len = n; for (int i = 0; i < n; i++)v[i] = 0; }
Vector::Vector(double* p, int n)
{
    v = new double[n];
    len = n;
    for (int i = 0; i < n; i++)
        v[i] = p[i];
}
Vector::Vector(const Vector& a)
{
    v = new double [a.len];
    for (int i = 0; i < 3; i++)
        v[i] = a.v[3];
}
ostream& operator<<(ostream& out, Vector& a)
{
    out << '(';
    for (int i = 0; i < a.len-1; i++)
        out << a[i]<<',';
    out << a[a.len - 1] << ')';
    return out;
}
istream& operator>>(istream& in, Vector& a)
{
    for (int i = 0; i < a.len; i++)
        in >> a[i] ;
    return in;
}
Vector& Vector::operator=(Vector a)
{
    for (int i = 0; i < len; i++)
        v[i] = a[i];
    return *this;
}
Vector operator+(Vector& a, Vector& b)
{
    int size;
    size = a.len;
    double*p= new double[a.len];
        for (int i = 0; i < a.len; i++)
            p[i] = a[i] + b[i];
    return Vector(p,size);
}
Vector operator*(Vector& a, Vector& b)
{
    int size;
    size = a.len;
    double* p = new double[a.len];
    for (int i = 0; i < a.len; i++)
        p[i] = a[i] * b[i];
    return Vector(p, size);
}
Vector operator-(Vector& a, Vector& b)
{
    int size;
    size = a.len;
    double* p = new double[a.len];
    for (int i = 0; i < a.len; i++)
        p[i] = a[i] - b[i];
    return Vector(p, size);
}
int main()
{
    int size1, size2;
    cout << "请输入两个向量的元素个数:\n";
    IN:cin >> size1 >> size2;
    if (size1 != size2)
    {
        cout << "向量维度不同,无法进行计算,请重新输入!\n";
        goto IN;
    }Vector a(size1), b(size2);
    cout << "请输入第一个向量a:";
    cin >> a;
    cout << "请输入第二个向量b:";
    cin >> b;
    Vector c(size1);
    cout << "a=" << a;
    cout << "\nb=" << b;
    c = a+b;
    cout << "\na+b="<<c;
    c = a - b;
    cout << "\na-b=" << c;
    c = a * b;
    cout << "\na*b=" << c;
}

向量(综合型题目) (1)创建C# 控制台应用程序L4_2。 (2)在程序中创建一个向量CzVector,在其中定义一个double []型的私有字段_values,用于维护向量的各个元素值。 (3)为CzVector定义三个公有属性Length、Sum和Prod,分别用于返回向量的长度、向量所有元素的和以及向量所有元素的积。 (4)在CzVector定义一个索引函数,用于获取或设置各个元素的值。 (5)为CzVector定义两个构造函数,一个根据指定长度对向量进行初始化(向量各元素取默认值0),另一个由指定的数组来构造向量并设置各元素的值。 (6)利用操作符重载来实现向量加法、减法和乘法。这三种运算均要求两个向量的长度相等。设向量α=(a1,a2,…an) ,β=(b1,b2,…bn),那么α+β=(a1+b1,a2+b2,….,an+bn),减法与之似,而α*β=a1*b1+a2*b2+….+an*bn)。另外,一个向量还可以单独乘以一个系数(向量加法的重载形式),此时,λ*α=(λ*a1, λ*a2,…λ*an) 。以加法操作符重载为例,参考源代码如下: public static CzVector operator +(CzVector v1,CzVector v2) { if(v1.Length!=v2.Length) return null; CzVector result=new CzVector(v1.Length); for(int i=0;i<v1.Length;i++) result [i]=v1[i]+v2[i]; return result; } (7)似的,利用操作符重载来判断两个向量是否相等。向量相等的条件是:两个向量的长度相等,且各个位置上的对应元素值也相等。 (8)为CzVector定义一个ConsoleOutput方法,用于在控制台一行输出向量的所有元素,其之间以空格分割。 (9)在程序主方法中随机定义几个向量对象,并测试其运算结果。参考源代码如下: static void Main() { CzVector v1=new CzVector(1,-5,9,6); CzVector v2=new CzVector(0,1,2,3); Console.Write(“v1= “); v1.ConsoleOutput(); Console.Write(“v2= “); v2.ConsoleOutput(); CzVector v3=v1+v2; Console.Write(“v1+v2= “); v3.ConsoleOutput(); CzVector v4=v1-v2; Console.Write(“v1-v2= “); v4.ConsoleOutput(); Console.Write(“3*(v1+v2)= “); (v3*3).ConsoleOutput(); Console.Write(“v1*v2= “{0}”,v1*v2); }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值