📄 array.h
字号:
//array.h
//二维数组一维动态化+矩阵
//x[m][n] to x[long],return m*h+n
#define NULL 0
template <class T>
class Array
{
public :
Array()
{
IsEmpty=1;
}
Array(int m,int n); //二维数组定义(构造函数)
//基本操作
void Initalize(int m,int n); //array()后使用,二维数组构造 Initalize(2,2)=构造一个2x2的二维数组
void InsertDataEX(int m,int n,T data); //二维化赋值 如InsertDataEX(0,2,10)=array[0][2]=10
void InsertDataNormal(int m,T data); //一维化赋值 如InsertDataNormal(2,10)=array[2]=10
T& GetDataEX(int m,int n); //得到数据(二维方式)
T& GetDataNormal(int m); //得到数据(一维方式)
int IsArrayEmpty()
{
return IsEmpty;
}
//矩阵运算
//得到二维数组指定列中行范围的最大值
//vpos指定列,hstartpos指定行开始,hstartpos指定行结束
//&pos返回为最大值的行数
//列主消元时取主用
T GetMaxVertical(int vpos,int hstartpos,int hendpos,int &pos);
void HSwap(int m,int n);//行交换
void HAdd(int m,int n,double dataflag);//行相加 n行加m行*dataflag放入n行
void GaussMethod(int HValue,int VValue); //高斯消元函数
//计算高斯消元后的x值,result为列为1的矩阵
//放x值用,可以使用Array<int(double...)> 数组名(行数(x的数量),1);来定义
void GetGaussResult(Array<T> result,int HValue,int VValue);
private:
T *array;
long h;
int IsEmpty;
};
template <class T>
Array <T>::Array(int m,int n)
{
if (m>=0 && n>=0)
{
array=new T[m*n];
h=n;
IsEmpty=1;
}
}
template <class T>
T& Array <T>::GetDataEX(int m,int n)
{
return array[m*h+n];
}
template <class T>
T& Array <T>::GetDataNormal(int m)
{
return array[m];
}
template <class T>
void Array <T>::InsertDataEX(int m,int n,T data)
{
if (m>=0 && n>=0 && array!=NULL)
{
array[h*m+n]=data;
IsEmpty=0;
}
}
template <class T>
void Array <T>::InsertDataNormal(int m,T data)
{
if (m>=0 && array!=NULL)
{
array[m]=data;
IsEmpty=0;
}
}
template <class T>
void Array<T>::Initalize(int m,int n)
{
if (m>=0 && n>=0)
{
array=new T[m*n];
h=n;
IsEmpty=1;
}
}
template <class T>
T Array<T>::GetMaxVertical(int vpos,int hstartpos,int hendpos,int &pos) //得到二维数组列中指定地方的最大值,hpos指定列,vstartpos指定行开始,,vstartpos指定行结束,i返回为最大值的行数
{
int n;//行数
T temp;
temp=GetDataEX(hstartpos,vpos);
pos=hstartpos;
for (n=hstartpos;n<=hendpos;n++)
{
if(GetDataEX(n,vpos)>=temp)
{
temp=GetDataEX(n,vpos);
pos=n;
}
}
return temp;
}
template <class T>
void Array<T>::HSwap(int m,int n)//行交换
{
int i;
T temp;
for(i=0;i<=h-1;i++)
{
temp=GetDataEX(m,i);
GetDataEX(m,i)=GetDataEX(n,i);
GetDataEX(n,i)=temp;
}
}
template <class T>
void Array<T>::HAdd(int m,int n,double dataflag)//行相加 n行加m行*dataflag放入n行
{
int i;
for(i=0;i<=h-1;i++)
GetDataEX(n,i)=GetDataEX(m,i)*dataflag+GetDataEX(n,i);
}
template <class T>
void Array<T>::GaussMethod(int HValue,int VValue) //高斯消元函数
{
//vvalue 列数,hvalue行数 0.....n-1
int i,j,pos;
T temp,mainelement;
for (i=0;i<=VValue;i++)
{
//选取主元
mainelement=GetMaxVertical(i,i,HValue,pos);
//行交换
HSwap(i,pos);
//减法运算
for (j=i+1;j<=HValue;j++)
{
temp=(-1.0)*GetDataEX(j,i)/mainelement;
HAdd(i,j,temp);//行相加 j行加i行*比例系数放入j行
}
}
}
template <class T>
void Array<T>::GetGaussResult(Array<T> result,int HValue,int VValue)
{
//vvalue 列数,hvalue行数 0.....n-1
int i,j;
T temp;
temp=GetDataEX(HValue,VValue)/GetDataEX(HValue,VValue-1);
result.InsertDataNormal(HValue,temp);
for(i=HValue-1;i>=0;i--)
{
temp=0;
for (j=i+1;j<=VValue-1;j++)
temp=temp+GetDataEX(i,j)*result.GetDataNormal(j);
temp=(GetDataEX(i,VValue)-temp)/GetDataEX(i,i);
if (i>=0) result.InsertDataNormal(i,temp);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -