📄 8.cpp
字号:
#include<iostream.h>
#include<stdlib.h>
class Matrix;
class Vector
{
public:
Vector(int);
~Vector(){delete[]v;}//将堆中空间返还
Vector(Vector&);
//int Size(){return sz;}不需要
void Display();
int& Elem(int);//返回向量元素
friend Vector Multiply(Matrix& m,Vector& v);
protected:
int* v;//指向一个数组
int sz;//元素个数
};
Vector::Vector(int s)
{
if(s<=0)
{
cerr<<"bad Vector size.\n";
exit(1);
}
sz=s;
v=new int[s];//从堆中分配一个数组存放向量元素
}
int& Vector::Elem(int i)//引用返回的目的是返回值可以作左值
{
if(i<0||sz<=i)
{
cerr<<"Vector index out of range.\n";
exit(1);
}
return v[i];
}
Vector::Vector(Vector& vec)
{
v=new int[sz=vec.sz];
for(int i=0;i<sz;i++)
*(v+i)=*(vec.v+i);
}
void Vector::Display()
{
for(int i=0;i<sz;i++)
cout<<v[i]<<" ";
cout<<endl;
}
class Matrix
{
public:
Matrix(int,int);
~Matrix(){delete []m;}
//int SizeL(){return szl;}不需要
//int SizeR(){return szr;}不需要
int& Elem(int,int);
friend Vector Multiply(Matrix& m,Vector& v);
protected:
int *m;
int szl;
int szr;
};
Matrix::Matrix(int i,int j)
{
if(i<=0||j<=0)
{
cerr<<"bad Matrix size.\n";
exit(1);
}
szl=i;
szr=j;
m=new int[i*j];
}
int& Matrix::Elem(int i,int j)//引用返回的目的是返回值可以作左值
{
if(i<0||szl<=i||j<0||szr<=j)
{
cerr<<"Matrix index out of range.\n";
exit(1);
}
return m[i*szr+j];
}
Vector Multiply(Matrix& m, Vector& v)//友元定义
{
if(m.szr!=v.sz)
{
cerr<<"bad multiplying Matrix with vector.\n";
exit(1);
}
Vector r(m.szl);//创建一个存放结果的空向量
for(int i=0;i<m.szl;i++)
{
r.v[i]=0;
for(int j=0;j<m.szr;j++)
r.v[i]+=m.m[i*m.szr+j]*v.v[j];
}
return r;
}
void main()
{
Matrix ma(4,3);
ma.Elem(0,0)=1;ma.Elem(0,1)=2;ma.Elem(0,2)=3;
ma.Elem(1,0)=0;ma.Elem(1,1)=1;ma.Elem(1,2)=2;
ma.Elem(2,0)=1;ma.Elem(2,1)=1;ma.Elem(2,2)=3;
ma.Elem(3,0)=1;ma.Elem(3,1)=2;ma.Elem(3,2)=1;
Vector ve(3);
ve.Elem(0)=2;ve.Elem(1)=1;ve.Elem(2)=0;
Vector va=Multiply(ma,ve);
va.Display();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -