⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 trimat.h

📁 在目录“上三角矩阵类的实现”中给定了文件triMat.cpp、triMat.h
💻 H
字号:
// TriMat.cpp : Defines the entry point for the console application.
//
//上三角矩阵的类的实现

#include "stdafx.h"
#include "iostream"
#include "iomanip"
#include "stdlib.h"

const int RowLimit=50; //最大行数,即最大维数
const int EleLimit=1275; //最大元素个数

template<class T>class TriMat  //上三角矩阵
{
	private:
		T arr[EleLimit];  //一维数组存放矩阵元素
		int rowTable[RowLimit];  // 矩阵第一个非零元素在arr中的下标
		int n;  //矩阵的阶数
	public:
		TriMat(int matsize);  // 构造函数,矩阵的阶数为matsize
		~TriMat(void){};   

		void PutEle(T item,int i,int j);  // 存储元素item到i行j列
		T GetEle(int i,int j)const;    // 提取i行j列元素
		TriMat<T> operator+(const TriMat<T>&a)const;  // 矩阵加
		TriMat<T> operator-(const TriMat<T>&a)const;  //矩阵减
		TriMat<T> operator*(const TriMat<T>&a)const;  // 矩阵乘

		void ReadMat(void); //矩阵元素输入
		void WriteMat(void)const;  // 矩阵元素屏幕输出

		int GetDim(void)const  // 返回矩阵的阶数
		{ return n;};
};

template <class T>
TriMat<T>::TriMat(int matSize)
{
	int storedEles=0;    // 第0行第一个非0元素在arr中的下标为0
	if (matSize>RowLimit)
	{
		cerr<<"矩阵的阶数超过了上限!"<<RowLimit<<endl;
		exit(1);
	}
	n=matSize;

	//递推求出第i行第一个非0元素在arr数组中的下标,并存于rowTable[i]中
	for (int i=0;i<n;i++) 
	{
		rowTable[i]=storedEles;
		storedEles+= 1;																	/*填空1*/
	}
}

template <class T>
void TriMat<T>::PutEle(T item,int i,int j)   // 存储元素item到i行j列
{
	if((i<0)||(i>=n)||(j<0)||(j>=n))
	{
		cerr<<"数组下标越界超过了范围:0-"<<n-1<<endl;
		exit(1);
	}
	if (j>=i)arr[(i*n)+j]=item;															/*填空2*/
}

template <class T>
T TriMat<T>::GetEle(int i,int j)const
{
	if((i<0)||(i>=n)||(j<0)||(j>=n))
	{
		cerr<<"数组下标越界超过了范围:0-"<<n-1<<endl;
		exit(1);
	}
	if (j>=i) return arr[(i*n)+j];														/*填空3*/
	else return 0;  // 对角线以下的元素为0
}

template <class T>
TriMat<T> TriMat<T>::operator+(const TriMat<T>& a)const
{
	T itemCurr,itemA;
	TriMat<T> b(a.n);
	for (int i=0;i<n;i++)
	{
		for (int j=i;j<n;j++)
		{
			itemCurr=GetEle(i,j);
			itemA=a.GetEle(i,j);														/*填空4*/
			b.PutEle(itemCurr+itemA,i,j);
		}
	}
	return b;
}

template <class T>
TriMat<T> TriMat<T>::operator-(const TriMat<T>& a)const
{
	T itemCurr,itemA;
	TriMat<T> b(a.n);
	for (int i=0;i<n;i++)
	{
		for (int j=i;j<n;j++)
		{
			itemCurr=GetEle(i,j);
			itemA=a.GetEle(i,j);														/*填空5*/
			b.PutEle(itemCurr-itemA,i,j);												/*填空6*/
		}
	}
	return b;
}

template <class T>
TriMat<T> TriMat<T>::operator*(const TriMat<T>& a)const
{
	T itemCurr,itemA,itemB;
	TriMat<T> b(a.n);
	for (int i=0;i<n;i++)
	{
		for (int j=i;j<n;j++)														//j为原矩阵的第i行第j个元素
		{
			itemB=0;
			for(int k=i;k<=j;k++)													//k为a矩阵的列
			{
				itemCurr=GetEle(i,k);
				itemA=a.GetEle(k,j);													/*填空7*/
				itemB+=(itemCurr*itemA);												/*填空8*/
			}
			b.PutEle(itemB,i,j);														/*填空9*/
		}
	}
	return b;
}

template <class T>
void TriMat<T>::ReadMat(void)
{
	T item;
	for (int i=0;i<n;i++)
		for (int j=0;j<n;j++)
		{
			cin>>item;
			PutEle(item,i,j);
		}
}

template <class T>
void TriMat<T>::WriteMat(void)const
{
	for(int i=0;i<n;i++)
	{
		for (int j=0;j<n;j++)
			cout<<setw(7)<<GetEle(i,j);
		cout<<endl;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -