《数据结构、算法与应用C++语言描述》使用C++语言实现二维数组下三角矩阵
下三角矩阵定义
如下图所示:
代码实现
_11lowerTriangularMatrix.h
模板类
/*
Project name : allAlgorithmsTest
Last modified Date: 2022年8月13日17点38分
Last Version: V1.0
Descriptions: 数组存储的下三角矩阵类头文件
*/
#pragma once
#ifndef _LOWERTRIANGULARMATRIX_H_
#define _LOWERTRIANGULARMATRIX_H_
#include "_1myExceptions.h"
using namespace std;
void lowerTriangularMatrixTest();//测试函数template<class T>
class lowerTriangularMatrix
{public:lowerTriangularMatrix(int theN = 10);~lowerTriangularMatrix() {delete [] element;}T get(int, int) const;void set(int, int, const T&);private:int n; // matrix dimensionT *element; // 1D array for lower triangle
};template<class T>
lowerTriangularMatrix<T>::lowerTriangularMatrix(int theN)
{// Constructor.// validate theNif (theN < 1)throw illegalParameterValue("Matrix size must be > 0");n = theN;element = new T [n * (n + 1) / 2];
}template <class T>
T lowerTriangularMatrix<T>::get(int i, int j) const
{// Return (i,j)th element of matrix.// validate i and jif ( i < 1 || j < 1 || i > n || j > n)throw matrixIndexOutOfBounds();// (i,j) in lower triangle if i >= jif (i >= j)return element[i * (i - 1) / 2 + j - 1];elsereturn 0;
}template<class T>
void lowerTriangularMatrix<T>::set(int i, int j, const T& newValue)
{// Store newValue as (i,j)th element.// validate i and jif ( i < 1 || j < 1 || i > n || j > n)throw matrixIndexOutOfBounds();// (i,j) in lower triangle iff i >= jif (i >= j)element[i * (i - 1) / 2 + j - 1] = newValue;elseif (newValue != 0)throw illegalParameterValue("elements not in lower triangle must be zero");
}#endif
_11lowerTriangularMatrix.cpp
/*
Project name : allAlgorithmsTest
Last modified Date: 2022年8月13日17点38分
Last Version: V1.0
Descriptions: 测试_11lowerTriangularMatrix.h头文件中的所有函数(下三角矩阵)
*/
#include <iostream>
#include "_11lowerTriangularMatrix.h"
using namespace std;void lowerTriangularMatrixTest()
{cout << endl << "****************************lowerTriangularMatrixTest()函数开始*******************************" << endl;lowerTriangularMatrix<int> x(20);x.set(1, 1, 22);x.set(5, 3, 44);x.set(8, 5, 0);x.set(10, 2, 55);x.set(8, 5, 0);cout << x.get(10, 2) << endl;cout << x.get(5, 3) << endl;cout << x.get(1, 1) << endl;cout << x.get(10, 14) << endl;cout << x.get(8, 5) << endl;cout << "*******************************diagonalMatrixTest()函数结束***********************************" << endl;
}
_1main.cpp
主函数
/*
Project name : allAlgorithmsTest
Last modified Date: 2022年8月13日17点38分
Last Version: V1.0
Descriptions: main()函数,控制运行所有的测试函数
*/
#include <iostream>
#include "_11lowerTriangularMatrix.h"int main()
{lowerTriangularMatrixTest(); return 0;
}
_1myExceptions.h
异常类汇总
/*
Project name : allAlgorithmsTest
Last modified Date: 2022年8月13日17点38分
Last Version: V1.0
Descriptions: 综合各种异常
*/
#pragma once
#ifndef _MYEXCEPTIONS_H_
#define _MYEXCEPTIONS_H_
#include <string>
#include<iostream>using namespace std;// illegal parameter value
class illegalParameterValue
{public:illegalParameterValue(string theMessage = "Illegal parameter value"){message = theMessage;}void outputMessage() {cout << message << endl;}private:string message;
};// illegal input data
class illegalInputData
{public:illegalInputData(string theMessage = "Illegal data input"){message = theMessage;}void outputMessage() {cout << message << endl;}private:string message;
};// illegal index
class illegalIndex
{public:illegalIndex(string theMessage = "Illegal index"){message = theMessage;}void outputMessage() {cout << message << endl;}private:string message;
};// matrix index out of bounds
class matrixIndexOutOfBounds
{public:matrixIndexOutOfBounds(string theMessage = "Matrix index out of bounds"){message = theMessage;}void outputMessage() {cout << message << endl;}private:string message;
};// matrix size mismatch
class matrixSizeMismatch
{public:matrixSizeMismatch(string theMessage = "The size of the two matrics doesn't match"){message = theMessage;}void outputMessage() {cout << message << endl;}private:string message;
};// stack is empty
class stackEmpty
{public:stackEmpty(string theMessage = "Invalid operation on empty stack"){message = theMessage;}void outputMessage() {cout << message << endl;}private:string message;
};// queue is empty
class queueEmpty
{public:queueEmpty(string theMessage = "Invalid operation on empty queue"){message = theMessage;}void outputMessage() {cout << message << endl;}private:string message;
};// hash table is full
class hashTableFull
{public:hashTableFull(string theMessage = "The hash table is full"){message = theMessage;}void outputMessage() {cout << message << endl;}private:string message;
};// edge weight undefined
class undefinedEdgeWeight
{public:undefinedEdgeWeight(string theMessage = "No edge weights defined"){message = theMessage;}void outputMessage() {cout << message << endl;}private:string message;
};// method undefined
class undefinedMethod
{public:undefinedMethod(string theMessage = "This method is undefined"){message = theMessage;}void outputMessage() {cout << message << endl;}private:string message;
};
#endif